From 2cafdd83b5173ca7e78dffcde63897b4be251179 Mon Sep 17 00:00:00 2001
From: wxw <Administrator@DESKTOP-5BIMHQ3>
Date: 星期五, 11 七月 2025 08:38:29 +0800
Subject: [PATCH] PDA增加AGV转运空托盘页面

---
 Wms/Wms/Controllers/PdaCrController.cs       |   16 ++
 Pda/View/HouseDataSetting/AgvNullPallet.html |  232 +++++++++++++++++++++++++++++
 Wms/Model/ModelVm/PdaVm/PdaCrVm.cs           |    4 
 Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs      |  160 ++++++++++++++++++++
 Wms/WMS.IBLL/IPdaServer/IPdaCrServer.cs      |   11 +
 5 files changed, 423 insertions(+), 0 deletions(-)

diff --git a/Pda/View/HouseDataSetting/AgvNullPallet.html b/Pda/View/HouseDataSetting/AgvNullPallet.html
new file mode 100644
index 0000000..a8a2a28
--- /dev/null
+++ b/Pda/View/HouseDataSetting/AgvNullPallet.html
@@ -0,0 +1,232 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta name="viewport" content="user-scalable=0,width=device-width,initial-scale=1.0" />
+    <meta charset="UTF-8" />
+    <!-- <meta name="viewport" content="width=device-width, initial-scale=0.665, minimum-scale=0.5, maximum-scale=1, user-scalable=no" /> -->
+    <!-- <meta name="viewport" content="width=device-width, initial-scale=0.665" /> -->
+    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
+    <title>Boxline PDA</title>
+
+    <link rel="stylesheet" href="/layui/css/layui.css" />
+    <link rel="stylesheet" href="/css/style.css" />
+    <script src="/js/adaptive.js"></script>
+    <link rel="stylesheet" href="/css/my.css" />
+    <style type="text/css">
+        td {
+            word-break: break-all;
+            word-wrap: break-word;
+        }
+
+        .layui-form-switch {
+            margin-top: 0;
+        }
+
+        /* 鏍囩鏍峰紡 */
+        .tableyang-this a {
+            margin: 10px 10px 0px 0px;
+            line-height: 30px;
+            width: 100px;
+            color: #999;
+            text-align: center;
+            float: left;
+            background: #f7f7f7;
+            user-select: none;
+            position: relative;
+            z-index: 1;
+            cursor: pointer;
+            border-radius: 5px;
+            border: 1px solid #ccc;
+            transition: all 0.3s ease;
+        }
+
+        .tableyang-this a.hover {
+            color: #5298ff;
+            background-color: #eff2ff;
+            border: 1px solid #5298ff;
+        }
+
+        /* 鍐呭灞呬腑 */
+        .tableyang-tab {
+            display: flex;
+            /* justify-content: center; */
+            /* align-items: center; */
+            flex-direction: column;
+            height: 90vh;
+        }
+
+        /* 蹇呯敤鏍峰紡 */
+        .tableyang-2,
+        .tableyang-3 {
+            display: none;
+        }
+
+        ul {
+            list-style-type: none;
+            padding: 0;
+        }
+
+        li {
+            cursor: pointer;
+            background-color: lightgray;
+            padding: 10px;
+            margin-bottom: 5px;
+        }
+    </style>
+    <link rel="stylesheet" href="/css/adapter.css" />
+    <script src="../../js/jquery.js"></script>
+    <script src="../../js/jquery-3.5.1.min.js"></script>
+</head>
+
+<body>
+    <div id="" class="main-content">
+
+        <div id="" class="layout-title">
+            <table border="" cellspacing="" cellpadding="">
+                <tr>
+                    <td class="img-back"><a href="../index.html"><img src="/assets/back.jpg"></a></td>
+                    <td class="title-text" lang>AGV绌烘墭杞繍</td>
+                    <td class="title-menu-icon"><img id="menuImg" src="/assets/menu.jpg"></td>
+                </tr>
+            </table>
+        </div>
+
+        <div id="" class="layout-sub-content">
+            <div id="menuList" class="menu">
+                <ul class="" style="text-align: center;">
+                    <li><a href="../index.html" lang>涓婚〉</a></li>
+                    <!-- <li><a href="productEnterConfirm.html">鍏ュ簱淇℃伅纭</a></li> -->
+                    <li><a href="../login.html" lang>閲嶆柊鐧诲綍</a></li>
+                </ul>
+            </div>
+
+            <!-- 鏈夌爜 -->
+            <div id="content1">
+                <div id="zongDiv" class="layout-bill-info" style="height: 170px;">
+                    <form class="layui-form" action="">
+                        <div id="" class="layui-form-item layout-input">
+                            <label class="layui-form-label" lang>鎵樼洏鏉$爜锛�</label>
+                            <div class="layui-input-block">
+                                <input id="STOCKCODE" type="text" lay-verify="stock" lang langholder
+                                    placeholder="璇锋壂鎻忔墭鐩樻潯鐮�" autocomplete="off" class="layui-input">
+                            </div>
+                        </div>
+                        <div id="" class="layui-form-item layout-input">
+                            <label class="layui-form-label" lang>璧峰鍦扮爜锛�</label>
+                            <div class="layui-input-block">
+                                <input id="LocatNo" type="text" lay-verify="stock" lang langholder placeholder="璧峰鍦扮爜"
+                                    autocomplete="off" class="layui-input" readonly>
+                            </div>
+                        </div>
+                        <div id="" class="layui-form-item layout-dropdownlist">
+                            <label class="layui-form-label" lang>鐩爣鍖哄煙锛�</label>
+                            <div class="layui-input-block" id="selectQuyu">
+                                <select id="Quyu" lay-filter="getQuyu" lay-search>
+                                    <option value="B08" selected>B08-搴撳墠绌烘墭瀛樻斁鍖�</option>
+                                </select>
+                                <img src="/assets/down_arraw.png">
+                            </div>
+                        </div>
+                        
+
+                        <table class="layout-tbl-submit" border="" cellspacing="" cellpadding="">
+                            <tr>
+                                <td style="width: 23%;"></td>
+                                <td>
+                                    <button class="layout-btn layout-btn-red" lang type="button" lay-submit
+                                        lay-filter="formCall">鍙皬杞�</button>
+                                </td>
+                                <td style="width: 33%;"></td>
+
+                            </tr>
+                        </table>
+                    </form>
+                </div>
+
+                <br>
+
+              
+
+            </div>
+        </div>
+    </div>
+    <script src="/js/jquery-3.5.1.min.js"></script>
+    <script src="/layui/layui.js"></script>
+    <script src="/js/public.js"></script>
+    <script src="/js/language.js"></script>
+    <script src="/js/jquery.cookie.js"></script>
+    <script>
+        layui.use(['form', 'jquery'], function () {
+            var form = layui.form
+        
+
+            //鍛煎彨灏忚溅浜嬩欢
+            form.on('submit(formCall)', function (data) {
+                if ($("#STOCKCODE").val() == "") {
+                    layer.msg('璇锋壂鎻忔墭鐩樻潯鐮�', {
+                        icon: 2,
+                        time: 2000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級
+                    });
+                    return;
+                }
+                if ($("#LocatNo").val() == "") {
+                    layer.msg('璇锋壂鎻忚捣濮嬪湴鐮�', {
+                        icon: 2,
+                        time: 2000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級
+                    });
+                    return;
+                }
+                
+                var param = {
+                    PalletNo: $("#STOCKCODE").val(),
+                    AreaNo: $("#Quyu").val(),
+                    LocatNo: $("#LocatNo").val()
+                }
+                //鍛煎彨灏忚溅
+                sendData(IP + "/PdaCr/AgvNullPallet", param, 'post', function (res) {
+                    if (res.code == 0) { //鎴愬姛 
+                        layer.msg(res.msg, {
+                            icon: 1,
+                            time: 1000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級
+                        }, function () {
+                            
+                        });
+                    } else { //涓嶆垚鍔�
+                        layer.msg(res.msg, {
+                            icon: 2,
+                            time: 2000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級
+                        }, function () {
+                            //鍥炶皟
+                        });
+                    }
+                });
+
+                return false; //闃绘琛ㄥ崟璺宠浆銆傚鏋滈渶瑕佽〃鍗曡烦杞紝鍘绘帀杩欐鍗冲彲銆�
+            });
+
+
+
+
+            /*鈥斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺�斺��*/
+
+
+            $("#menuImg").click(function (e) {
+                //console.log("menuImg")
+                e.stopPropagation()
+
+                if ($("#menuList").is(":hidden")) {
+                    $("#menuList").show()
+                } else {
+                    $("#menuList").hide()
+                }
+            })
+            $('body').click(function () {
+                // //console.log("body")
+                $("#menuList").hide()
+            })
+        })
+    </script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/Wms/Model/ModelVm/PdaVm/PdaCrVm.cs b/Wms/Model/ModelVm/PdaVm/PdaCrVm.cs
index ca186de..13e05ca 100644
--- a/Wms/Model/ModelVm/PdaVm/PdaCrVm.cs
+++ b/Wms/Model/ModelVm/PdaVm/PdaCrVm.cs
@@ -68,6 +68,10 @@
         /// 鍏ュ簱鍙�
         /// </summary>
         public string Ruku { get; set; }
+        /// <summary>
+        /// 璧峰鍦扮爜
+        /// </summary>
+        public string LocatNo { get; set; }
     }
 
     public class PdaPalletUnBindVm
diff --git a/Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs b/Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs
index 3e14ce4..89f6e78 100644
--- a/Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs
+++ b/Wms/WMS.BLL/BllPdaServer/PdaCrServer.cs
@@ -947,6 +947,166 @@
             }
         }
         /// <summary>
+        /// 鍛煎彨agv杞繍绌烘墭鐩�
+        /// </summary>
+        /// <param name="palletNo"></param>
+        /// <param name="areaNo"></param>
+        /// <param name="locatNo"></param>
+        /// <param name="url"></param>
+        /// <param name="userId"></param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        public async Task AgvNullPallet(string palletNo, string areaNo, string locatNo, string url, int userId)
+        {
+            try
+            {
+                if (string.IsNullOrEmpty(palletNo))
+                {
+                    throw Oops.Bah("璇锋壂鎻忔墭鐩樻潯鐮侊紒");
+                }
+                if (string.IsNullOrEmpty(locatNo))
+                {
+                    throw Oops.Bah("璇锋壂鎻忚捣濮嬪湴鐮侊紒");
+                }
+                if (string.IsNullOrEmpty(areaNo))
+                {
+                    throw Oops.Bah("璇烽�夋嫨鐩爣鍖哄煙锛�");
+                }
+                string EndLocat = string.Empty;//鐩爣浣嶇疆                
+
+                var log = await Db.Queryable<LogTask>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo && (w.Status == "0" || w.Status == "1"));
+                if (log != null)
+                {
+                    throw Oops.Bah("璇ユ墭鐩樺凡鏈夌瓑寰呮墽琛屾垨姝e湪鎵ц鐨勪换鍔�!");
+                }
+                var stockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo);
+                if (stockDetail != null)
+                {
+                    throw Oops.Bah("鎵樼洏涓婄墿鏂欏瓨鍦ㄥ簱瀛樻槑缁嗕俊鎭�,璇锋鏌�!");
+                }
+
+                var storageArea = await Db.Queryable<SysStorageArea>().FirstAsync(w => w.IsDel == "0" && w.AreaNo == areaNo);
+                if (storageArea == null)
+                {
+                    throw Oops.Bah("鎵�閫夊尯鍩熶俊鎭笉瀛樺湪,璇锋鏌�!");
+                }
+                var palletInfo = await Db.Queryable<SysPallets>().FirstAsync(w => w.IsDel == "0" && w.PalletNo == palletNo);
+                if (palletInfo == null)
+                {
+                    throw Oops.Bah("璇ユ墭鐩樹俊鎭笉瀛樺湪!");
+                }
+                if (palletInfo.Status!="0")
+                {
+                    throw Oops.Bah("璇ユ墭鐩樹笉鏄┖鎵樼洏!");
+                }
+                //鏍规嵁鐩爣鍖哄煙鑾峰彇鐩爣鍌ㄤ綅鍦板潃
+                EndLocat = await GetLocat(areaNo);
+                
+                //璧峰鍌ㄤ綅淇℃伅
+                var storageLocat = await Db.Queryable<SysStorageLocat>().FirstAsync(w => w.IsDel == "0" && w.LocatNo == stockDetail.LocatNo);
+                if (storageLocat == null)
+                {
+                    throw Oops.Bah("鍌ㄤ綅淇℃伅涓嶅瓨鍦�,璇锋鏌�!");
+                }
+                //鐩爣鍌ㄤ綅淇℃伅
+                //var storageLocatEnd = new SysStorageLocat();
+
+                var storageLocatEnd = await Db.Queryable<SysStorageLocat>().FirstAsync(w => w.IsDel == "0" && w.LocatNo == EndLocat && w.Flag == "0");
+                if (storageLocatEnd == null)
+                {
+                    throw Oops.Bah("鐩爣鍌ㄤ綅淇℃伅涓嶅瓨鍦�,璇锋鏌�!");
+                }
+
+                //娣诲姞鍑哄簱浠诲姟
+                var taskNo = new Common().GetMaxNo("TK");
+                var moveTask = new LogTask
+                {
+                    TaskNo = taskNo,
+                    Sender = "WMS",
+                    Receiver = "WCS",
+                    IsSuccess = 0, //鏄惁涓嬪彂鎴愬姛 0澶辫触 1鎴愬姛
+
+                    StartLocat = stockDetail.LocatNo,//璧峰浣嶇疆
+                    EndLocat = EndLocat,//鐩爣浣嶇疆
+                    PalletNo = palletNo,//鎵樼洏鐮�
+                    Msg = string.Format("杞繍浠诲姟锛歿0}=>>{1}", stockDetail.LocatNo, EndLocat),
+                    IsSend = 1,//鏄惁鍙啀娆′笅鍙�
+                    IsCancel = 1,//鏄惁鍙彇娑�
+                    IsFinish = 1,//鏄惁鍙畬鎴�
+                    Type = "2",//浠诲姟绫诲瀷 0 鍏ュ簱浠诲姟 1 鍑哄簱浠诲姟  2 绉诲簱浠诲姟
+                    Status = "0",//浠诲姟鐘舵��0锛氱瓑寰呮墽琛�1姝e湪鎵ц2鎵ц瀹屾垚
+                    OrderType = "3",//0 鍏ュ簱鍗� 1 鍑哄簱鍗�  2 鐩樼偣鍗�  3 绉诲簱鍗�
+
+                    CreateTime = DateTime.Now
+                };
+                await Db.Insertable(moveTask).ExecuteCommandAsync();
+
+                //淇敼璧峰鍌ㄤ綅鍦板潃鐘舵��
+                storageLocat.Status = "5";//0锛氱┖鍌ㄤ綅 1锛氭湁鐗╁搧 2锛氬叆搴撲腑 3锛氬嚭搴撲腑 4锛氱Щ鍏ヤ腑 5锛氱Щ鍑轰腑 
+                await Db.Updateable(storageLocat).ExecuteCommandAsync();
+
+                //淇敼鐩爣鍌ㄤ綅鍦板潃鐘舵��
+                if (storageLocatEnd != null)
+                {
+                    storageLocatEnd.Status = "4";//0锛氱┖鍌ㄤ綅 1锛氭湁鐗╁搧 2锛氬叆搴撲腑 3锛氬嚭搴撲腑 4锛氱Щ鍏ヤ腑 5锛氱Щ鍑轰腑 
+                    await Db.Updateable(storageLocatEnd).ExecuteCommandAsync();
+                }
+                //娣诲姞鎿嶄綔鏃ュ織璁板綍
+                var k = new OperationCrServer().AddLogOperationCr("PDA妯″潡", "AGV绌烘墭杞繍", palletNo, "绉诲簱", $"PDA鍛煎彨灏忚溅瀵规墭鐩樺彿锛歿palletNo}鍙戣捣杞繍", userId);
+
+                var outDto = new List<OutCommandDto>
+                {
+                    new OutCommandDto()
+                    {
+                        TaskNo = moveTask.TaskNo, // 浠诲姟鍙�
+                        TaskType = "2",// 浠诲姟绫诲瀷 0鍏� 1鍑� 2绉� 
+                        PalletNo = moveTask.PalletNo,//鎵樼洏鍙�
+
+                        StartLocate = moveTask.StartLocat, // 璧峰浣嶇疆
+                        EndLocate = EndLocat, // 鐩爣浣嶇疆 
+
+                        Order = 999,
+                        Type = PLCTypeEnum.AGV
+
+                    }
+                };
+
+                // 姝e紡杩愯绋嬪簭鏀惧紑
+                var list2 = outDto.Select(m => m.TaskNo).ToList();
+                var jsonData = JsonConvert.SerializeObject(outDto);
+                string response = "";
+
+                try
+                {
+                    var time1 = DateTime.Now;//鍙戦�佹椂闂� .ToString("yyyy-MM-dd HH:mm:ss")
+                    response = HttpHelper.DoPost(url, jsonData, "涓嬪彂缁橶CS鍑哄簱鍛戒护", "WCS");
+                    var time2 = DateTime.Now;//杩斿洖鏃堕棿 .ToString("yyyy-MM-dd HH:mm:ss")
+
+                    //瑙f瀽杩斿洖鏁版嵁 
+                    var wcsModel = JsonConvert.DeserializeObject<WcsModel2>(response);
+                    if (wcsModel.code == 200)
+                    {
+                        // 鏇存敼浠诲姟鐨勫彂閫佽繑鍥炴椂闂�//
+                        new TaskServer().EditTaskIssueOk(list2, time1, time2);
+                    }
+                    else
+                    {
+                        new TaskServer().EditTaskIssueNo(list2, time1, time2, wcsModel.message);
+                        throw new Exception(wcsModel.message);
+                    }
+                }
+                catch (Exception ex)
+                {
+                    throw new Exception(ex.Message);
+                }
+
+            }
+            catch (Exception e)
+            {
+                throw new Exception(e.Message);
+            }
+        }
+        /// <summary>
         /// agv杞繍鍛煎彨灏忚溅鍙栬揣
         /// </summary>
         /// <param name="soNo"></param>
diff --git a/Wms/WMS.IBLL/IPdaServer/IPdaCrServer.cs b/Wms/WMS.IBLL/IPdaServer/IPdaCrServer.cs
index 32610f4..541550c 100644
--- a/Wms/WMS.IBLL/IPdaServer/IPdaCrServer.cs
+++ b/Wms/WMS.IBLL/IPdaServer/IPdaCrServer.cs
@@ -134,6 +134,17 @@
         /// <param name="url"></param>
         Task AgvTransport(string palletNo, string areaNo, string ruku, string url, int userId);
         /// <summary>
+        /// 鍛煎彨agv杞繍绌烘墭鐩�
+        /// </summary>
+        /// <param name="palletNo"></param>
+        /// <param name="areaNo"></param>
+        /// <param name="locatNo"></param>
+        /// <param name="url"></param>
+        /// <param name="userId"></param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        Task AgvNullPallet(string palletNo, string areaNo, string locatNo, string url, int userId);
+        /// <summary>
         ///  agv杞繍鍛煎彨灏忚溅鍙栬揣
         /// </summary>
         /// <param name="soNo"></param>
diff --git a/Wms/Wms/Controllers/PdaCrController.cs b/Wms/Wms/Controllers/PdaCrController.cs
index fbd3020..552d088 100644
--- a/Wms/Wms/Controllers/PdaCrController.cs
+++ b/Wms/Wms/Controllers/PdaCrController.cs
@@ -238,6 +238,18 @@
             await _pdaCrSvc.AgvTransport(model.PalletNo, model.AreaNo, model.Ruku, _config.WcsHost+ _config.IssueComApiUrl, _userManager.UserId);
         }
         /// <summary>
+        /// 鍛煎彨agv杞繍绌烘墭鐩�
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        [ServiceFilter(typeof(ApiResponseActionFilter))]
+        [UnitOfWork]
+        public async Task AgvNullPallet(PdaAgvTransportVm model)
+        {
+            await _pdaCrSvc.AgvNullPallet(model.PalletNo, model.AreaNo, model.LocatNo, _config.WcsHost + _config.IssueComApiUrl, _userManager.UserId);
+        }
+        /// <summary>
         /// agv杞繍鍛煎彨灏忚溅鍙栬揣
         /// </summary>
         /// <param name="model"></param>
@@ -252,6 +264,10 @@
 
         #endregion
 
+        #region AGV绌烘墭鐩樿浆杩�
+
+        #endregion
+
         #region 闆剁瑙g粦
         /// <summary>
         /// 闆剁瑙g粦

--
Gitblit v1.8.0