From 32e054f4769fbd20cd9608b4a1b397be1ec8bb33 Mon Sep 17 00:00:00 2001
From: wxw <Administrator@DESKTOP-5BIMHQ3>
Date: 星期日, 21 九月 2025 11:05:03 +0800
Subject: [PATCH] 开发PDA成品拣货功能

---
 Pda/View/SoSetting/productOutCode.html         |   63 ++++-
 Wms/Model/ModelDto/PdaDto/PdaSoDto.cs          |    1 
 Wms/Model/ModelDto/BllSoDto/ExportNoticeDto.cs |    5 
 Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs  |    1 
 Wms/Wms/Controllers/PdaSoController.cs         |   10 
 Wms/Model/ModelVm/PdaVm/PdaSoVm.cs             |    7 
 Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs        |  507 ++++++++++++++++++++++++++++++++++++++++++++-
 Wms/WMS.IBLL/IPdaServer/IPdaSoServer.cs        |   11 +
 HTML/views/SOSetting/ExportNotice.html         |    1 
 9 files changed, 572 insertions(+), 34 deletions(-)

diff --git a/HTML/views/SOSetting/ExportNotice.html b/HTML/views/SOSetting/ExportNotice.html
index 778fcfb..4256c93 100644
--- a/HTML/views/SOSetting/ExportNotice.html
+++ b/HTML/views/SOSetting/ExportNotice.html
@@ -490,6 +490,7 @@
 				{ field: 'SONo', title: '鍑哄簱鍗曞彿', align: 'center', fixed: 'left', width: 165, "disabled": true },
 				{ field: 'Type', title: '鍗曟嵁绫诲瀷', align: 'center', templet: '#templetType' , width: 120,},
 				{ field: 'Status', title: '鎵ц鐘舵��', align: 'center', templet: '#templetStatus', width: 90, },
+				{ field: 'OrderCode', title: '涓嬪彂鍗曞彿', align: 'center', width: 180 },
 				{ field: 'LogisticsName', title: '鎵胯繍鍟�', align: 'center', width: 120, },
 				{ field: 'CustomerName', title: '瀹㈡埛鍚嶇О', align: 'center', width: 120, },
 				{ field: 'WareHouseName', title: '浠撳簱', align: 'center', width: 90, },
diff --git a/Pda/View/SoSetting/productOutCode.html b/Pda/View/SoSetting/productOutCode.html
index 6f6bbee..8f41278 100644
--- a/Pda/View/SoSetting/productOutCode.html
+++ b/Pda/View/SoSetting/productOutCode.html
@@ -197,7 +197,7 @@
 								<tr>
 									<td colspan="3">
 										<div class="layui-form-item">
-											<label class="layui-form-label" style="width: 17%;">SAP鍗曞彿锛�</label>
+											<label class="layui-form-label" style="width: 17%;">涓嬪彂鍗曞彿锛�</label>
 											<div class="layui-input-block" style="width: 83%;margin-left:17%;">
 												<input id="OrderCode" type="text" lay-verify="" disabled placeholder=""
 													class="layui-input">
@@ -374,6 +374,7 @@
 			$("#palletNo").focus();//鍏夋爣榛樿閫変腑		
 
 			function clear1() {
+				$("#OrderCode").val("");//涓嬪彂鍗曞彿
 				$('#outModel').val("");//鍑哄簱鍙�
 				$('#standard').val("");//瑙勬牸
 
@@ -407,11 +408,31 @@
 
 			form.on('switch(IsZhengTuo)', function (obj) {
 				if (obj.elem.checked) {
+					var boxNum=0;
+					var param = {
+						"PalletNo": $("#palletNo").val()
+					}
+					synData(IP + "/PdaSo/CheckBoxForPick", param, 'get', function (res) {
+						if (res.code == 0) { //鎴愬姛 
+							boxNum=res.data
+							$('#scanQty').val(boxNum);
+
+						} else { //涓嶆垚鍔�
+							layer.msg(res.msg, {
+								icon: 2,
+								time: 2000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級
+							}, function () { });
+							return;
+						}
+					});
 					$('#BoxDIv').attr("style", "display:none")
 					isContinue = "1";
+					refreshTable();
+					boxes = [];
 				} else {
 					$('#BoxDIv').attr("style", "display:block")
 					isContinue = "0";
+					$('#scanQty').val(0);
 				}
 				$('#boxNo').val("");
 			});
@@ -619,6 +640,7 @@
 						console.log(res.data);
 						$("#planQty").val(res.data.PlanQty)
 						$("#finishQty").val(res.data.FinishQty)
+						$("#OrderCode").val(res.data.OrderCode)
 					} else { //涓嶆垚鍔�
 						layer.msg(res.msg, {
 							icon: 2,
@@ -686,10 +708,10 @@
 					canPickBox = true
 
 				} else { //涓嶆垚鍔�
-					layer.msg("鏃犳暟鎹�", {
-						icon: 2,
-						time: 2000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級
-					}, function () { });
+					// layer.msg("鏃犳暟鎹�", {
+					// 	icon: 2,
+					// 	time: 2000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級
+					// }, function () { });
 					// $("#boxNum").val(0)
 				}
 			}
@@ -714,20 +736,19 @@
 						time: 2000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級
 					}); return;
 				}
-				if (isContinue == "0") {
-					if ($('#boxNo').val() == "") {
-						layer.msg("璇疯緭鍏ョ鐮�", {
+				if($("#planQty").val()!=$("#scanQty").val()){
+					layer.msg("宸叉壂鏁伴噺鍜岃鍒掓暟閲忎笉涓�鑷达紒", {
+						icon: 2,
+						time: 2000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級
+					}); return;
+				}
+				if (isContinue == "0") {					
+					if (boxes == null || boxes.length<=0) {
+						layer.msg("璇锋壂鎻忔爣绛剧爜", {
 							icon: 2,
 							time: 2000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級
 						}); return;
-					}
-					if ($('#boxQty').val() == "") {
-						layer.msg("绠卞唴鏁伴噺涓虹┖锛屼笉鑳芥嫞璐�", {
-							icon: 2,
-							time: 2000 //2绉掑叧闂紙濡傛灉涓嶉厤缃紝榛樿鏄�3绉掞級
-						});
-						return;
-					}				
+					}		
 				}
 				if (canPickBox == false) {
 
@@ -745,13 +766,17 @@
 
 			//纭鎷h揣 
 			function reqPickScatter() {
+				var boxList=[];
+				for(var i=0;i<boxes.length;i++){
+					boxList.push(boxes[i].BoxNo)
+				}
 				var param = {
 					"SoNo": $("#bar").val(),
 					"SoDetailId": $("#skuLotNo").val(),
 					"PalletNo": $('#palletNo').val(),
-					"BoxNo": $('#boxNo').val()
+					"BoxNoList": boxList
 				}
-				sendData(IP + "/PdaSo/SoSetPick", param, 'post', function (res) {
+				sendData(IP + "/PdaSo/SoSetPickCode", param, 'post', function (res) {
 					//console.log(res);
 
 					if (res.code == 0) { //鎴愬姛
@@ -763,6 +788,8 @@
 							$("#boxNo").val('');
 							updateQtyList();
 							getBar();
+							refreshTable();
+							boxes = [];
 						});
 					} else { //涓嶆垚鍔�
 						layer.msg(res.msg, {
diff --git a/Wms/Model/ModelDto/BllSoDto/ExportNoticeDto.cs b/Wms/Model/ModelDto/BllSoDto/ExportNoticeDto.cs
index 3cc96d0..2bc1498 100644
--- a/Wms/Model/ModelDto/BllSoDto/ExportNoticeDto.cs
+++ b/Wms/Model/ModelDto/BllSoDto/ExportNoticeDto.cs
@@ -66,7 +66,10 @@
         /// Desc:鎵胯繍鍟嗙墿娴�
         /// </summary>           
         public string LogisticsName { get; set; }
-
+        /// <summary>
+        /// 涓婃父绯荤粺鍗曞彿
+        /// </summary>
+        public string OrderCode { get; set; }
 
         /// <summary>
         /// 鏀惰揣鍦板潃
diff --git a/Wms/Model/ModelDto/PdaDto/PdaSoDto.cs b/Wms/Model/ModelDto/PdaDto/PdaSoDto.cs
index 00dab95..c5300b1 100644
--- a/Wms/Model/ModelDto/PdaDto/PdaSoDto.cs
+++ b/Wms/Model/ModelDto/PdaDto/PdaSoDto.cs
@@ -13,6 +13,7 @@
         public decimal? PickQty { get; set; }                       // 鎵樼洏寰呮嫞鏁伴噺--
         public decimal? PickedQty { get; set; }                       // 鎵樼洏宸叉嫞鏁伴噺
         public string SkuNo { get; set; }                           // 鐗╂枡缂栧彿
+        public string OrderCode { get; set; } //涓婃父绯荤粺鍗曞彿
     }
     public class BoxInfo
     {
diff --git a/Wms/Model/ModelVm/PdaVm/PdaSoVm.cs b/Wms/Model/ModelVm/PdaVm/PdaSoVm.cs
index 18f1ee8..5706974 100644
--- a/Wms/Model/ModelVm/PdaVm/PdaSoVm.cs
+++ b/Wms/Model/ModelVm/PdaVm/PdaSoVm.cs
@@ -42,7 +42,7 @@
         /// 鍑哄簱鍗曟槑缁咺d
         /// </summary>
         public string SoDetailId { get; set; }
-        
+
         /// <summary>
         /// 鏄惁鏁寸 0鏁寸 1鏁g洅
         /// </summary>
@@ -59,6 +59,11 @@
         public string BoxNo { get; set; }
 
         /// <summary>
+        /// 绠辩爜闆嗗悎
+        /// </summary>
+        public List<string> BoxNoList{ get; set; }
+
+        /// <summary>
         /// 鐩掔爜
         /// </summary>
         public string BoxNo2 { get; set; }
diff --git a/Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs b/Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs
index 79fec1e..a559ce4 100644
--- a/Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs
+++ b/Wms/WMS.BLL/BllPdaServer/PdaSoServer.cs
@@ -1852,8 +1852,9 @@
                 var allotList = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.Status == "1" && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
                 return allotList;
             }
+            var noticeList = Db.Queryable<BllExportNotice>().Where(w => w.IsDel == "0" && (w.Status == "3" || w.Status == "4")).Select(s => s.SONo).ToList();
             //鑾峰彇鐘舵�佷负寰呮嫞璐ф垨鑰呴儴鍒嗘嫞璐х殑鍑哄簱鍗�
-            var allotList2 = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3" || m.Status == "5") && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
+            var allotList2 = await Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && (m.Status == "2" || m.Status == "3" || m.Status == "5") && m.PalletNo == palletNo && noticeList.Contains(m.SONo)).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToListAsync();
 
             //var allotList = Db.Queryable<BllExportAllot>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo).Select(m => m.SONo).Distinct().Where(m => !string.IsNullOrWhiteSpace(m)).ToList();
             //鑾峰彇鍑哄簱鍗曟嵁涓嶄负寰呮嫞璐� 鎵ц瀹屾瘯 璁㈠崟鍏抽棴 绛夊緟鎵ц鐨勫崟鎹�
@@ -1964,7 +1965,7 @@
             {
                 OutModel = data.OutMode,
                 Standard = data.Standard,
-                PickQty = data.Qty,
+                PickQty = data.Qty - data.CompleteQty,
                 PickedQty = data.CompleteQty
             };
             return data2;
@@ -1978,10 +1979,16 @@
             {
                 throw Oops.Bah("鏈煡璇㈠埌鍑哄簱鍗曠殑鏄庣粏");
             }
+            var notice = await Db.Queryable<BllExportNotice>().FirstAsync(m => m.SONo == detail.SONo && m.IsDel == "0");
+            if (notice == null)
+            {
+                throw Oops.Bah("鏈煡璇㈠埌鍑哄簱鍗曚俊鎭�");
+            }
             var data = new OutPdaInfo()
             {
                 PlanQty = detail.Qty,
-                FinishQty = detail.CompleteQty
+                FinishQty = detail.CompleteQty,
+                OrderCode = notice.OrderCode,
             };
             return data;
         }
@@ -2112,23 +2119,26 @@
                 }
                 if (string.IsNullOrEmpty(boxNo))
                 {
-                    throw new Exception("鏍囩鏉$爜涓嶅彲涓虹┖!");
+                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.PalletNo == palletNo).ToList();
+                    boxNum = boxInfo.Sum(s => s.Qty);
                 }
-                var boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo == boxNo && w.PalletNo == palletNo).ToList();
-                if (boxInfo.Count <= 0)
+                else
                 {
-                    boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo2 == boxNo && w.PalletNo == palletNo).ToList();
+                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo == boxNo && w.PalletNo == palletNo).ToList();
                     if (boxInfo.Count <= 0)
                     {
-                        boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo3 == boxNo && w.PalletNo == palletNo).ToList();
+                        boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo2 == boxNo && w.PalletNo == palletNo).ToList();
+                        if (boxInfo.Count <= 0)
+                        {
+                            boxInfo = Db.Queryable<DataBoxInfo>().Where(w => w.IsDel == "0" && w.BoxNo3 == boxNo && w.PalletNo == palletNo).ToList();
+                        }
                     }
+                    if (boxInfo == null || boxInfo.Count <= 0)
+                    {
+                        throw new Exception("鏍囩鏉$爜鏈湪璇ユ墭鐩樺唴!");
+                    }
+                    boxNum = boxInfo.Sum(s => s.Qty);
                 }
-                if (boxInfo == null || boxInfo.Count <= 0)
-                {
-                    throw new Exception("鏍囩鏉$爜鏈湪璇ユ墭鐩樺唴!");
-                }
-                boxNum = boxInfo.Sum(s => s.Qty);
-
                 return boxNum;
             }
             catch (Exception ex)
@@ -3156,6 +3166,475 @@
                 throw new Exception(e.Message);
             }
         }
+        /// <summary>
+        /// 鎴愬搧鍑哄簱pda鎷h揣-JC34
+        /// </summary>
+        /// <param name="soNo"></param>
+        /// <param name="soDetailId"></param>
+        /// <param name="palletNo"></param>
+        /// <param name="boxNoList"></param>
+        /// <param name="userId"></param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        public async Task SoSetPickCode34(string soNo, string soDetailId, string palletNo, List<string> boxNoList, int userId)
+        {            
+            try
+            {
+                #region 鍒ゆ柇
+
+                if (string.IsNullOrWhiteSpace(soNo))
+                {
+                    throw Oops.Bah("鍑哄簱鍗曟嵁涓嶈兘涓虹┖");
+                }
+                if (string.IsNullOrWhiteSpace(soDetailId))
+                {
+                    throw Oops.Bah("鍑哄簱鐗╂枡-鎵规涓嶈兘涓虹┖");
+                }
+                if (string.IsNullOrWhiteSpace(palletNo))
+                {
+                    throw Oops.Bah("鎵樼洏鐮佷笉鑳戒负绌�");
+                }
+                //寮�鍚簨鍔�
+                Db.BeginTran();
+
+                //鍑哄簱鍗�
+                var notice = await Db.Queryable<BllExportNotice>().FirstAsync(m => m.IsDel == "0" && m.SONo == soNo);
+                if (notice == null)
+                {
+                    throw Oops.Bah("鏈煡璇㈠埌璇ュ嚭搴撳崟鐨勪俊鎭�");
+                }
+                if (notice.Status != "3")
+                {
+                    throw Oops.Bah("鍑哄簱鍗曠殑鐘舵�佷笉鏄鍦ㄦ墽琛岋紝涓嶈兘鎷h揣");
+                }
+                //鍑哄簱鍗曟槑缁�
+                var noticeDetail = await Db.Queryable<BllExportNoticeDetail>()
+                    .FirstAsync(m => m.IsDel == "0" && m.Id == int.Parse(soDetailId));
+                if (noticeDetail == null)
+                {
+                    throw Oops.Bah("鏈煡璇㈠埌璇ュ嚭搴撳崟鏄庣粏鐨勪俊鎭�");
+                }
+                //鍑哄簱鍒嗛厤淇℃伅
+                var allot = await Db.Queryable<BllExportAllot>().FirstAsync(m =>
+                    m.IsDel == "0" && (m.Status == "2" || m.Status == "3") && m.SONo == soNo &&
+                    m.SODetailNo == int.Parse(soDetailId) && m.PalletNo == palletNo);
+                if (allot == null)
+                {
+                    throw Oops.Bah("鏈煡璇㈠埌璇ユ墭鐩樼殑鍒嗛厤淇℃伅");
+                }
+                //鍓╀綑鎷h揣鏁伴噺锛堝緟鎷e噺鍘诲凡鎷o級
+                var needQty = allot.Qty - allot.CompleteQty;
+
+                //搴撳瓨鏄庣粏
+                var stockDetail = await Db.Queryable<DataStockDetail>().FirstAsync(m => m.IsDel == "0" && m.Id == allot.StockId);
+                if (stockDetail == null)
+                {
+                    throw Oops.Bah("鏈煡璇㈠埌璇ユ墭鐩樺垎閰嶇殑搴撳瓨鏄庣粏淇℃伅锛�");
+                }
+                //搴撳瓨鎬昏〃
+                var stock = await Db.Queryable<DataStock>().FirstAsync(a => a.IsDel == "0" && a.SkuNo == stockDetail.SkuNo && a.LotNo == stockDetail.LotNo);
+                if (stock == null)
+                {
+                    throw Oops.Bah("鏈煡璇㈠埌璇ユ墭鐩樺垎閰嶇殑搴撳瓨淇℃伅锛�");
+                }
+                #endregion
+
+                if (boxNoList == null || boxNoList.Count <= 0)//鏁存墭鎷h揣
+                {
+                    List<DataBoxInfo> boxInfos;
+                    var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && m.SkuNo == stockDetail.SkuNo && m.LotNo == stockDetail.LotNo);//鎵惧埌鎵樼洏涓婃墍鏈夌鐮�
+                    boxInfos = await boxInfo.ToListAsync();
+                    if (boxInfo.Count() <= 0)
+                    {
+                        throw Oops.Bah("璇ユ墭鐩樹笂娌℃湁鍙嫞璐х殑绠卞瓙");
+                    }
+                    var boxQty = await boxInfo.GroupBy(m => m.PalletNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToListAsync();
+                    if (boxQty[0] > needQty)
+                    {
+                        throw Oops.Bah("鎷h揣鏁伴噺涓嶈兘澶т簬绠卞唴鍓╀綑寰呮嫞鏁伴噺");
+                    }
+                    decimal pickQty = 0;//鎷h揣鐨勬暟閲�
+                    var comDetailList = await Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToListAsync();
+                    var comList = new List<BllCompleteDetail>();
+                    foreach (var item in boxInfos)
+                    {
+                        if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3) && item.BoxNo3 != null)
+                        {
+                            throw Oops.Bah($"褰撳墠{item.BoxNo}涓瓄item.BoxNo3}宸叉嫞璐у畬鎴愶紝璇峰嬁閲嶅鎷h揣");
+                        }
+                        if (item.SkuNo != allot.SkuNo || item.LotNo != allot.LotNo)
+                        {
+                            throw Oops.Bah("褰撳墠鎵樼洏涓婃湁鍏朵粬涓嶅悓鐗╂枡鎵规锛屾嫞璐уけ璐�");
+                        }
+                        //娣诲姞鎷h揣鏄庣粏
+                        var completeDetail = new BllCompleteDetail()
+                        {
+                            SONo = soNo,
+                            SODetailNo = int.Parse(soDetailId),
+                            ExportAllotId = allot.Id,
+                            StockId = allot.StockId,
+                            BoxNo = item.BoxNo,
+                            BoxNo2 = item.BoxNo2,
+                            BoxNo3 = item.BoxNo3,
+
+                            LotNo = allot.LotNo,
+                            LotText = allot.LotText,
+                            SupplierLot = allot.SupplierLot,
+                            SkuNo = allot.SkuNo,
+                            SkuName = allot.SkuName,
+                            Standard = allot.Standard,
+                            PalletNo = palletNo,
+                            CompleteQty = item.Qty,
+
+                            CreateUser = userId
+                        };
+                        comList.Add(completeDetail);
+
+                        //鍒犻櫎搴撳瓨绠辩爜鏄庣粏
+                        await Db.Deleteable(item).ExecuteCommandAsync();
+                        pickQty += item.Qty;
+                    }
+                    //娣诲姞鎷h揣鏄庣粏
+                    await Db.Insertable(comList).ExecuteCommandAsync();
+                    //淇敼鍑哄簱鍒嗛厤淇℃伅
+                    allot.CompleteQty += pickQty;
+                    allot.Status = allot.Qty <= allot.CompleteQty ? "5" : "3";
+                    allot.UpdateTime = DateTime.Now;
+                    await Db.Updateable(allot).ExecuteCommandAsync();
+                    //鍒犻櫎搴撳瓨鏄庣粏
+                    await Db.Deleteable(stockDetail).ExecuteCommandAsync();
+                    //鍒犻櫎鎴栦慨鏀瑰簱瀛�
+                    stock.Qty -= pickQty;
+                    stock.LockQty -= pickQty;
+                    if (stock.LockQty < 0)
+                    {
+                        stock.LockQty = 0;
+                    }
+                    if (stock.Qty <= 0)
+                    {
+                        await Db.Deleteable(stock).ExecuteCommandAsync();
+                    }
+                    else
+                    {
+                        await Db.Updateable(stock).ExecuteCommandAsync();
+                    }
+                    //鍒ゆ柇鎵樼洏涓婅繕鏈夋病鏈夊叾浠栫墿鏂�
+                    var palletData = Db.Queryable<DataStockDetail>().First(w => w.IsDel == "0" && w.PalletNo == palletNo && w.Id != stockDetail.Id);
+                    if (palletData == null)
+                    {
+                        //鏀瑰彉鎵樼洏鐘舵�佷负锛氭湭浣跨敤
+                        var pallet = Db.Queryable<SysPallets>().First(m => m.PalletNo == palletNo && m.IsDel == "0");
+                        if (pallet == null)
+                        {
+                            throw Oops.Bah("鏈湪鎵樼洏琛ㄤ腑鏌ヨ鍒版墭鐩樹俊鎭�");
+                        }
+                        pallet.Status = "0";
+                        await Db.Updateable(pallet).ExecuteCommandAsync();
+                    }
+
+                    //淇敼鍑哄簱鍗曟槑缁嗘嫞璐ф暟閲�
+                    noticeDetail.CompleteQty += pickQty;
+                    await Db.Updateable(noticeDetail).ExecuteCommandAsync();
+
+                    var num = await Db.Queryable<BllExportNoticeDetail>()
+                        .CountAsync(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty);
+                    if (num <= 0)
+                    {
+                        notice.Status = "4"; //鏇存敼涓烘墽琛屽畬鎴�
+                        //淇敼鍑哄簱鍗曚俊鎭�
+                        await Db.Updateable(notice).ExecuteCommandAsync();
+                        if (notice.IsWave == "1")
+                        {
+                            var waveNum = await Db.Queryable<BllExportNotice>().CountAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo && m.Status != "4");
+                            if (waveNum == 0)
+                            {
+                                var wave = await Db.Queryable<BllWaveMage>().FirstAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo);
+                                if (wave != null)
+                                {
+                                    wave.Status = "4";
+                                    wave.UpdateUser = userId;
+                                    wave.UpdateTime = DateTime.Now;
+                                    await Db.Updateable(wave).ExecuteCommandAsync();
+                                }
+                            }
+                        }
+                    }
+
+                }
+                else
+                {
+                    foreach (var boxNo in boxNoList)
+                    {
+                        var biaoShi = "0";//0锛氭暣绠辨嫞璐с��1锛氭暣鐩掓嫞璐с�� 2锛氭暎鏀嫞璐�
+                        List<DataBoxInfo> boxInfos;
+                        var boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo == boxNo);
+                        if (await boxInfo.CountAsync() == 0)
+                        {
+                            biaoShi = "1";
+                            boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo2 == boxNo);
+                            if (await boxInfo.CountAsync() == 0)
+                            {
+                                biaoShi = "2";
+                                boxInfo = Db.Queryable<DataBoxInfo>().Where(m => m.IsDel == "0" && m.BoxNo3 == boxNo);
+                                if (await boxInfo.CountAsync() == 0)
+                                {
+                                    throw Oops.Bah("鏈煡璇㈠埌璇ョ鐮佸強杩芥函鐮佺殑淇℃伅");
+                                }
+                            }
+                        }
+                        boxInfos = await boxInfo.ToListAsync();
+
+                        if (boxInfos[0].SkuNo != allot.SkuNo || boxInfos[0].LotNo != allot.LotNo)
+                        {
+                            throw Oops.Bah("绠辩爜鐗╂枡鎵规鍜岄�夋嫨鐗╂枡鎵规涓嶄竴鑷达紒");
+                        }
+
+                        var comDetailList = Db.Queryable<BllCompleteDetail>().Where(m => m.IsDel == "0" && m.ExportAllotId == allot.Id && m.PalletNo == palletNo).ToList();
+                        if (biaoShi == "2") //鏁f敮鎷h揣
+                        {
+                            boxInfos = boxInfos.Where(m => m.BoxNo3 == boxNo).ToList();
+
+                            if (boxInfos.Count() == 0)
+                            {
+                                throw Oops.Bah("鏈煡璇㈠埌璇ョ鐮佸強杩芥函鐮佺殑淇℃伅");
+                            }
+                            if (boxInfos.Count() > 1)
+                            {
+                                throw Oops.Bah("璇ヨ拷婧敮鐮佺殑淇℃伅澶т簬1鏉★紝淇℃伅閿欒锛岃鏍稿疄锛�");
+                            }
+
+                            if (boxInfos.Any(m => m.PalletNo != palletNo))
+                            {
+                                throw Oops.Bah("璇ユ墭鐩樹笌绠辩爜娌℃湁缁戝畾鍏崇郴");
+                            }
+                            var boxQty = boxInfos.First().Qty;
+                            //if (boxQty > needQty)
+                            //{
+                            //    throw Oops.Bah("鎷h揣鏁伴噺涓嶈兘澶т簬鍓╀綑寰呮嫞鏁伴噺");
+                            //}
+
+                            foreach (var item in boxInfos)
+                            {
+                                if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3))
+                                {
+                                    throw Oops.Bah($"褰撳墠{item.BoxNo}涓瓄item.BoxNo3}宸叉嫞璐у畬鎴愶紝璇峰嬁閲嶅鎷h揣");
+                                }
+                            }
+                        }
+                        else if (biaoShi == "1")//鏁寸洅鎷h揣
+                        {
+                            if (boxInfo.Count() == 0)
+                            {
+                                throw Oops.Bah("鏈煡璇㈠埌璇ョ洅鐮佺殑淇℃伅");
+                            }
+                            if (boxInfo.Any(m => m.PalletNo != palletNo))
+                            {
+                                throw Oops.Bah("璇ユ墭鐩樹笌鐩掔爜娌℃湁缁戝畾鍏崇郴");
+                            }
+                            var boxQty = await boxInfo.GroupBy(m => m.BoxNo2).Select(m => SqlFunc.AggregateSum(m.Qty)).ToListAsync();
+                            //if (boxQty[0] > needQty)
+                            //{
+                            //    throw Oops.Bah("鎷h揣鏁伴噺涓嶈兘澶т簬绠卞唴鍓╀綑寰呮嫞鏁伴噺");
+                            //}
+
+                            foreach (var item in boxInfos)
+                            {
+                                if (comDetailList.Any(m => m.BoxNo3 == item.BoxNo3))
+                                {
+                                    throw Oops.Bah($"褰撳墠{item.BoxNo}涓瓄item.BoxNo3}宸叉嫞璐у畬鎴愶紝璇峰嬁閲嶅鎷h揣");
+                                }
+                            }
+                        }
+                        else //鏁寸鎷h揣
+                        {
+                            if (boxInfo.Count() == 0)
+                            {
+                                throw Oops.Bah("鏈煡璇㈠埌璇ョ鐮佺殑淇℃伅");
+                            }
+                            if (boxInfo.Any(m => m.PalletNo != palletNo))
+                            {
+                                throw Oops.Bah("璇ユ墭鐩樹笌绠辩爜娌℃湁缁戝畾鍏崇郴");
+                            }
+                            var boxQty = await boxInfo.GroupBy(m => m.BoxNo).Select(m => SqlFunc.AggregateSum(m.Qty)).ToListAsync();
+                            //if (boxQty[0] > needQty)
+                            //{
+                            //    throw Oops.Bah("鎷h揣鏁伴噺涓嶈兘澶т簬绠卞唴鍓╀綑寰呮嫞鏁伴噺");
+                            //}
+
+                            foreach (var item in boxInfos)
+                            {
+                                if (comDetailList.Any(m => m.BoxNo == item.BoxNo))
+                                {
+                                    throw Oops.Bah($"褰撳墠{item.BoxNo}宸叉嫞璐у畬鎴愶紝璇峰嬁閲嶅鎷h揣");
+                                }
+                            }
+                        }
+                        decimal pickQty = 0;//鎷h揣鐨勬暟閲�
+
+                        var comList = new List<BllCompleteDetail>();
+                        foreach (var item in boxInfos)
+                        {
+                            //娣诲姞鎷h揣鏄庣粏
+                            var completeDetail = new BllCompleteDetail()
+                            {
+                                SONo = soNo,
+                                SODetailNo = int.Parse(soDetailId),
+                                ExportAllotId = allot.Id,
+                                StockId = allot.StockId,
+                                BoxNo = item.BoxNo,
+                                BoxNo2 = item.BoxNo2,
+                                BoxNo3 = item.BoxNo3,
+
+                                LotNo = allot.LotNo,
+                                LotText = allot.LotText,
+                                SupplierLot = allot.SupplierLot,
+                                SkuNo = allot.SkuNo,
+                                SkuName = allot.SkuName,
+                                Standard = allot.Standard,
+                                PalletNo = palletNo,
+                                CompleteQty = item.Qty,
+
+                                CreateUser = userId
+                            };
+                            comList.Add(completeDetail);
+
+                            if (biaoShi != "3")
+                            {
+                                //鍒犻櫎搴撳瓨绠辩爜鏄庣粏
+                                await Db.Deleteable(item).ExecuteCommandAsync();
+
+                                pickQty += item.Qty;
+                            }
+                        }
+                        //鏀瑰彉搴撳唴绠辩爜鏄惁闆剁淇℃伅
+                        if (biaoShi == "1" || biaoShi == "2")
+                        {
+                            var boxSurplusList = new List<DataBoxInfo>();
+                            if (biaoShi == "1")
+                            {
+                                boxSurplusList = boxInfo.Where(m => m.BoxNo2 != boxNo).ToList();
+                            }
+                            else
+                            {
+                                boxSurplusList = boxInfo.Where(m => m.BoxNo3 != boxNo).ToList();
+                            }
+                            foreach (var item in boxSurplusList)
+                            {
+                                item.BitBoxMark = "1";
+                                await Db.Updateable(item).ExecuteCommandAsync();
+                            }
+                        }
+
+                        await Db.Insertable(comList).ExecuteCommandAsync();
+                        //淇敼鍑哄簱鍒嗛厤淇℃伅
+                        allot.CompleteQty += pickQty;
+                        allot.Status = allot.Qty <= allot.CompleteQty ? "5" : "3";
+                        allot.UpdateTime = DateTime.Now;
+                        if (allot.Status == "5")
+                        {
+                            //鍒ゆ柇璇ユ墭鐩樻槸鍚﹁繕瀛樺湪鐗╂枡 瀛樺湪鏀逛负寰呭洖搴� 寰呭洖搴撳畬鎴愬悗鏀逛负宸插畬鎴�
+                        }
+                        await Db.Updateable(allot).ExecuteCommandAsync();
+
+                        //鍒犻櫎鎴栦慨鏀瑰簱瀛樻槑缁�
+                        stockDetail.BitPalletMark = "1";//淇敼涓洪浂鎵樻爣璇�
+                        stockDetail.Qty -= pickQty;
+                        stockDetail.LockQty -= pickQty;
+                        if (stockDetail.LockQty < 0)
+                        {
+                            stockDetail.LockQty = 0;
+                        }
+                        if (stockDetail.Qty == stockDetail.LockQty)
+                        {
+                            stockDetail.Status = "2";
+                        }
+                        else if (stockDetail.Qty > stockDetail.LockQty && stockDetail.LockQty > 0)
+                        {
+                            stockDetail.Status = "1";
+                        }
+                        else
+                        {
+                            stockDetail.Status = "0";
+                        }
+
+                        if (stockDetail.Qty <= 0)
+                        {
+                            await Db.Deleteable(stockDetail).ExecuteCommandAsync();
+                        }
+                        else
+                        {
+                            await Db.Updateable(stockDetail).ExecuteCommandAsync();
+                        }
+                        stock.Qty -= pickQty;
+                        stock.LockQty -= pickQty;
+                        if (stock.LockQty < 0)
+                        {
+                            stock.LockQty = 0;
+                        }
+                        if (stock.Qty <= 0)
+                        {
+                            await Db.Deleteable(stock).ExecuteCommandAsync();
+                        }
+                        else
+                        {
+                            await Db.Updateable(stock).ExecuteCommandAsync();
+                        }
+                        var num2 = await Db.Queryable<DataStockDetail>().CountAsync(m => m.IsDel == "0" && m.PalletNo == palletNo);
+                        if (num2 <= 0)
+                        {
+                            //鏀瑰彉鎵樼洏鐘舵��
+                            var pallet = await Db.Queryable<SysPallets>().FirstAsync(m => m.PalletNo == palletNo && m.IsDel == "0");
+                            if (pallet == null)
+                            {
+                                throw Oops.Bah("鏈湪鎵樼洏琛ㄤ腑鏌ヨ鍒版墭鐩樹俊鎭�");
+                            }
+                            pallet.Status = "0";
+                            await Db.Updateable(pallet).ExecuteCommandAsync();
+                        }
+                        //淇敼鍑哄簱鍗曟槑缁嗘嫞璐ф暟閲�
+                        noticeDetail.CompleteQty += pickQty;
+                        await Db.Updateable(noticeDetail).ExecuteCommandAsync();
+
+                        var num = await Db.Queryable<BllExportNoticeDetail>()
+                            .CountAsync(m => m.IsDel == "0" && m.SONo == soNo && m.CompleteQty < m.Qty);
+                        if (num <= 0)
+                        {
+                            notice.Status = "4"; //鏇存敼涓烘墽琛屽畬鎴�
+                                                 //淇敼鍑哄簱鍗曚俊鎭�
+                            await Db.Updateable(notice).ExecuteCommandAsync();
+                            if (notice.IsWave == "1")
+                            {
+                                var waveNum = await Db.Queryable<BllExportNotice>()
+                                    .CountAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo && m.Status != "4");
+                                if (waveNum == 0)
+                                {
+                                    var wave = await Db.Queryable<BllWaveMage>().FirstAsync(m => m.IsDel == "0" && m.WaveNo == notice.WaveNo);
+                                    if (wave != null)
+                                    {
+                                        wave.Status = "4";
+                                        wave.UpdateUser = userId;
+                                        wave.UpdateTime = DateTime.Now;
+                                        await Db.Updateable(wave).ExecuteCommandAsync();
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                //娣诲姞鎿嶄綔鏃ュ織璁板綍
+                var k = new OperationSOServer().AddLogOperationSo("PDA妯″潡", "鎷h揣鍑哄簱", soNo, "鎷h揣", $"鍦≒DA涓婂鍑哄簱鍗曞彿涓猴細{soNo}鐨勬墭鐩樼爜涓猴細{palletNo}鐨勬嫞璐ф搷浣�", userId);
+                Db.CommitTran();
+            }
+            //catch (AppFriendlyException e)
+            //{
+            //    Db.RollbackTran();
+            //}
+            catch (Exception e)
+            {
+                Db.RollbackTran();
+                throw new Exception(e.Message);
+            }
+        }
         //鍑哄簱pda鎷h揣
         public async Task SoSetQtyPick(string soNo, string soDetailId, string palletNo, string PickQty, int userId)
         {
diff --git a/Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs b/Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
index 706d873..6b66674 100644
--- a/Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
+++ b/Wms/WMS.BLL/BllSoServer/ExportNoticeServer.cs
@@ -948,6 +948,7 @@
                     WaveNo = a.WaveNo,
                     IsDespatch = a.IsDespatch,
                     Demo = a.Demo,
+                    OrderCode = a.OrderCode,
 
                     CreateUserName = c.RealName,
                     UpdateUserName = c.RealName,
diff --git a/Wms/WMS.IBLL/IPdaServer/IPdaSoServer.cs b/Wms/WMS.IBLL/IPdaServer/IPdaSoServer.cs
index c4f6de7..c1eba45 100644
--- a/Wms/WMS.IBLL/IPdaServer/IPdaSoServer.cs
+++ b/Wms/WMS.IBLL/IPdaServer/IPdaSoServer.cs
@@ -161,6 +161,17 @@
         /// <returns></returns>
         /// <exception cref="Exception"></exception>
         Task SoSetPick34(string soNo, string soDetailId, string palletNo, string boxNo, string pickQty1, int userId);
+        /// <summary>
+        /// 鎴愬搧鍑哄簱pda鎷h揣-JC34
+        /// </summary>
+        /// <param name="soNo"></param>
+        /// <param name="soDetailId"></param>
+        /// <param name="palletNo"></param>
+        /// <param name="boxNoList"></param>
+        /// <param name="userId"></param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        Task SoSetPickCode34(string soNo, string soDetailId, string palletNo, List<string> boxNoList, int userId);
 
         /// <summary>
         /// 鍑哄簱pda鎷h揣
diff --git a/Wms/Wms/Controllers/PdaSoController.cs b/Wms/Wms/Controllers/PdaSoController.cs
index 7842726..61eb828 100644
--- a/Wms/Wms/Controllers/PdaSoController.cs
+++ b/Wms/Wms/Controllers/PdaSoController.cs
@@ -184,6 +184,16 @@
             //await _pdaSoSvc.SoSetPick(model.SoNo, model.SoDetailId, model.PalletNo, model.BoxNo, model.BoxNo3, model.PickQty, _userManager.UserId);
             await _pdaSoSvc.SoSetPick34(model.SoNo, model.SoDetailId, model.PalletNo, model.BoxNo, model.PickQty, _userManager.UserId);
         }
+        /// <summary>
+        /// 鎴愬搧鍑哄簱pda鎷h揣-JC34
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        [HttpPost]
+        public async Task SoSetPickCode(PdaSoVm model)
+        {
+            await _pdaSoSvc.SoSetPickCode34(model.SoNo, model.SoDetailId, model.PalletNo, model.BoxNoList, _userManager.UserId);
+        }
 
         /// <summary>
         /// 鍑哄簱pda鎷h揣

--
Gitblit v1.8.0