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