| | |
| | | |
| | | |
| | | /// <summary> |
| | | /// è°æ¨å |
| | | /// è°æ¨å ä¿®æ¹äºåºåä¿¡æ¯ï¼ä»¥åä¸å¡æ°é |
| | | /// </summary> |
| | | /// <param name="saveModel"></param> |
| | | /// <returns></returns> |
| | |
| | | // try |
| | | // { |
| | | // string WareCode = WarehouseEnum.大件åº.ObjToInt().ToString("000"); |
| | | // var qty = saveModel.MainData["availableQuantity"].ObjToInt(); |
| | | // var id = saveModel.MainData["id"].ObjToInt(); |
| | | // var qty = saveModel.MainData["availableQuantity"].ObjToInt();//ç¨æ·è¾å
¥çæ°é |
| | | // var id = saveModel.MainData["id"].ObjToInt();//åºåæ¹æ¬¡çid |
| | | // var materielCode = saveModel.MainData["materielCode"].ToString(); |
| | | // var batchNo = saveModel.MainData["batchNo"].ToString(); |
| | | // //var Inventory_Batch = BaseDal.QueryFirst(x => x.Id == id); |
| | | // //if (qty > Inventory_Batch.AvailableQuantity) throw new Exception("è°æ¨æ°éä¸å¯å¤§äºå¯ç¨æ°é"); |
| | | |
| | | // var materielInfo = _materielInfoService.Repository.QueryFirst(x => x.MaterielCode == materielCode); |
| | | // if (materielInfo == null) return WebResponseContent.Instance.Error($"请维æ¤è¯åç¼å·ã{materielCode}ãçä¿¡æ¯"); |
| | | // if (!Enum.IsDefined(typeof(MaterielSourceTypeEnum), materielInfo.MaterielSourceType)) |
| | | // return WebResponseContent.Instance.Error($"请设置è¯åç¼å·ã{materielCode}ãç屿§åç±»"); |
| | | // if (materielInfo.MaterielSourceType == MaterielSourceTypeEnum.PurchasePart) |
| | | // return WebResponseContent.Instance.Error($"è¯åç¼å·ã{materielCode}ãç屿§å类为大件,ä¸å¯è°æ¨"); |
| | | |
| | | // List<Dt_InventoryInfo> dt_InventoryInfos = _inventoryInfoService.Repository.QueryData(x => x.MaterielCode == materielInfo.MaterielCode && x.BatchNo == batchNo && x.StockStatus == StockStatusEmun.å
¥åºå®æ.ObjToInt() && x.AvailableQuantity > 0 && x.WarehouseCode == WareCode).OrderBy(x => x.InDate).ToList(); |
| | | // if (dt_InventoryInfos.Count < 1) return WebResponseContent.Instance.Error($"ç©æç¼å·ã{materielInfo.MaterielCode}ãå¤§ä»¶åºæ åºåï¼è¯·åæ¶è¡¥å
åºåï¼"); |
| | | |
| | | // var StockQty = dt_InventoryInfos.Sum(x => x.AvailableQuantity); |
| | | // if (StockQty < qty) return WebResponseContent.Instance.Error($"è°æ¨æ°éä¸å¯å¤§äºå¤§ä»¶åºå¯ç¨æ°é,大件åºå¯ç¨æ°é为ã{StockQty}ã"); |
| | | // var zx = (qty / materielInfo.BoxQty).ObjToInt(); |
| | | // var ys = qty % materielInfo.BoxQty; |
| | | // if (ys > 0) zx++; |
| | | // decimal Qty = 0; |
| | | |
| | | // // æ£æ¥å¤§ä»¶åºä¸æ¯å¦å卿£ä»¶ |
| | | // decimal totalLooseQty = 0; |
| | | // foreach (var inventory in dt_InventoryInfos) |
| | | // { |
| | | // var looseQty = inventory.AvailableQuantity % materielInfo.BoxQty; |
| | | // if (looseQty > 0) |
| | | // { |
| | | // totalLooseQty += looseQty; |
| | | // } |
| | | // } |
| | | |
| | | // decimal Qty = 0; // å®é
è°æ¨æ»æ°é |
| | | // decimal businessQtyToAdd = 0; // éè¦æ·»å å°ä¸å¡æ°éçæ°é |
| | | // List<Dt_SupplyTask> supplyTasks = new List<Dt_SupplyTask>(); |
| | | // Dt_DeliveryOrder deliveryOrder = new Dt_DeliveryOrder() |
| | | // { |
| | |
| | | // OutStatus = "æ°å»º", |
| | | // Details = new List<Dt_DeliveryOrderDetail>() |
| | | // }; |
| | | |
| | | // // æ
åµ1ï¼å¤§ä»¶åºææ£ä»¶ï¼ä¸ç¨æ·è¾å
¥æ°éå°äºçäºæ£ä»¶æ»æ°ï¼ä¸æ¬¡æ§è°æ¨æææ£ä»¶ |
| | | // if (totalLooseQty > 0 && qty <= totalLooseQty) |
| | | // { |
| | | // decimal remainingLooseQty = totalLooseQty; |
| | | |
| | | // foreach (var item in dt_InventoryInfos) |
| | | // { |
| | | // decimal taskQty = 0; |
| | | // if (zx < 1) break; |
| | | // while (item.AvailableQuantity > 0 && zx > 0) |
| | | // if (remainingLooseQty <= 0) break; |
| | | |
| | | // var looseQty = item.AvailableQuantity % materielInfo.BoxQty; |
| | | // if (looseQty > 0) |
| | | // { |
| | | // zx--; |
| | | // Qty += materielInfo.BoxQty; |
| | | // taskQty += materielInfo.BoxQty; |
| | | // materielInfo.Business_qty += materielInfo.BoxQty; |
| | | // item.OutboundQuantity += materielInfo.BoxQty; |
| | | // item.AvailableQuantity -= materielInfo.BoxQty; |
| | | // } |
| | | // #region æ·»å è°æ¨åºåºä»»å¡ |
| | | // // 䏿¬¡æ§è°æ¨è¯¥åºåè®°å½ä¸çæææ£ä»¶ |
| | | // item.OutboundQuantity += looseQty; |
| | | // item.AvailableQuantity -= looseQty; |
| | | // Qty += looseQty; |
| | | // businessQtyToAdd += looseQty; |
| | | // remainingLooseQty -= looseQty; |
| | | |
| | | // // æ·»å ä¾åºä»»å¡ |
| | | // Dt_SupplyTask supplyTask = new Dt_SupplyTask() |
| | | // { |
| | | // WarehouseCode = item.WarehouseCode, |
| | |
| | | // Creater = App.User.UserName ?? "System", |
| | | // LocationCode = item.LocationCode, |
| | | // OrderNo = deliveryOrder.Out_no, |
| | | // StockQuantity = taskQty, |
| | | // Modifier = item.ValidityPeriod,//ææ |
| | | // StockQuantity = looseQty, |
| | | // SupplyQuantity = 0, |
| | | // Remark = "è°æ¨åºåº" |
| | | // Remark = "æ£ä»¶è°æ¨åºåºï¼ä¸æ¬¡æ§æ¸
çï¼" |
| | | // }; |
| | | // supplyTasks.Add(supplyTask); |
| | | // #endregion |
| | | // } |
| | | // } |
| | | // } |
| | | // // æ
åµ2ï¼å¤§ä»¶åºææ£ä»¶ï¼ä½ç¨æ·è¾å
¥æ°éå¤§äºæ£ä»¶æ»æ°ï¼æè
å¤§ä»¶åºæ²¡ææ£ä»¶ï¼æåæ¥æ´ç®±é»è¾ |
| | | // else |
| | | // { |
| | | // // å¦æå¤§ä»¶åºææ£ä»¶ä½ç¨æ·è¦è°æ¨æ´å¤ï¼å
æ¸
çæ£ä»¶ |
| | | // decimal allocatedLooseQty = 0; |
| | | // if (totalLooseQty > 0) |
| | | // { |
| | | // foreach (var item in dt_InventoryInfos) |
| | | // { |
| | | // var looseQty = item.AvailableQuantity % materielInfo.BoxQty; |
| | | // if (looseQty > 0) |
| | | // { |
| | | // // 䏿¬¡æ§è°æ¨è¯¥åºåè®°å½ä¸çæææ£ä»¶ |
| | | // item.OutboundQuantity += looseQty; |
| | | // item.AvailableQuantity -= looseQty; |
| | | // allocatedLooseQty += looseQty; |
| | | // Qty += looseQty; |
| | | // businessQtyToAdd += looseQty; |
| | | |
| | | // // æ·»å ä¾åºä»»å¡ |
| | | // Dt_SupplyTask supplyTask = new Dt_SupplyTask() |
| | | // { |
| | | // WarehouseCode = item.WarehouseCode, |
| | | // BatchNo = item.BatchNo, |
| | | // MaterielName = item.MaterielName, |
| | | // MaterielCode = item.MaterielCode, |
| | | // MaterielSpec = item.MaterielSpec, |
| | | // TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(), |
| | | // TaskType = TaskTypeEnum.AllocatOut.ObjToInt(), |
| | | // CreateDate = DateTime.Now, |
| | | // Creater = App.User.UserName ?? "System", |
| | | // LocationCode = item.LocationCode, |
| | | // OrderNo = deliveryOrder.Out_no, |
| | | // StockQuantity = looseQty, |
| | | // Modifier = item.ValidityPeriod,//ææ |
| | | // SupplyQuantity = 0, |
| | | // Remark = "æ£ä»¶è°æ¨åºåºï¼ä¸æ¬¡æ§æ¸
çï¼" |
| | | // }; |
| | | // supplyTasks.Add(supplyTask); |
| | | // } |
| | | // } |
| | | // } |
| | | |
| | | // // 计ç®è¿éè¦è°æ¨çæ´ç®±æ°é |
| | | // var remainingQty = qty - allocatedLooseQty; |
| | | // if (remainingQty > 0) |
| | | // { |
| | | // var zx = (int)Math.Ceiling((decimal)remainingQty / materielInfo.BoxQty); // éè¦çæ´ç®±æ° |
| | | |
| | | // foreach (var item in dt_InventoryInfos) |
| | | // { |
| | | // decimal taskQty = 0; |
| | | // if (zx < 1) break; |
| | | |
| | | // // 计ç®å½ååºå坿ä¾ç宿´ç®±æ° |
| | | // var availableFullBoxes = item.AvailableQuantity / materielInfo.BoxQty; |
| | | // var boxesToTransfer = Math.Min(availableFullBoxes, zx); |
| | | |
| | | // if (boxesToTransfer > 0) |
| | | // { |
| | | // var transferQty = boxesToTransfer * materielInfo.BoxQty; |
| | | // taskQty += transferQty; |
| | | // Qty += transferQty; |
| | | // businessQtyToAdd += transferQty; |
| | | // zx -= (int)boxesToTransfer; |
| | | |
| | | // item.OutboundQuantity += transferQty; |
| | | // item.AvailableQuantity -= transferQty; |
| | | |
| | | // // æ·»å ä¾åºä»»å¡ |
| | | // Dt_SupplyTask supplyTask = new Dt_SupplyTask() |
| | | // { |
| | | // WarehouseCode = item.WarehouseCode, |
| | | // BatchNo = item.BatchNo, |
| | | // MaterielName = item.MaterielName, |
| | | // MaterielCode = item.MaterielCode, |
| | | // MaterielSpec = item.MaterielSpec, |
| | | // TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(), |
| | | // TaskType = TaskTypeEnum.AllocatOut.ObjToInt(), |
| | | // CreateDate = DateTime.Now, |
| | | // Creater = App.User.UserName ?? "System", |
| | | // LocationCode = item.LocationCode, |
| | | // OrderNo = deliveryOrder.Out_no, |
| | | // Modifier = item.ValidityPeriod,//ææ |
| | | // StockQuantity = taskQty, |
| | | // SupplyQuantity = 0, |
| | | // Remark = "æ´ç®±è°æ¨åºåº" |
| | | // }; |
| | | // supplyTasks.Add(supplyTask); |
| | | // } |
| | | // } |
| | | |
| | | // // æ£æ¥æ´ç®±æ°éæ¯å¦è¶³å¤ |
| | | // if (zx > 0) |
| | | // { |
| | | // return WebResponseContent.Instance.Error($"æ´ç®±åºåä¸è¶³ï¼æ æ³å®æè°æ¨ãè¿éè¦{zx}ç®±"); |
| | | // } |
| | | // } |
| | | // } |
| | | |
| | | // // æ´æ°ä¸å¡æ°éï¼ä¸å¡æ°é = 忥çä¸å¡æ°é + å®é
è°æ¨æ»æ°é |
| | | // materielInfo.Business_qty += businessQtyToAdd; |
| | | |
| | | // // æ·»å åºåºåæç» |
| | | // Dt_DeliveryOrderDetail deliveryOrderDetail = new Dt_DeliveryOrderDetail() |
| | | // { |
| | | // Batch_num = batchNo, |
| | |
| | | // Reservoirarea = WareCode |
| | | // }; |
| | | // deliveryOrder.Details.Add(deliveryOrderDetail); |
| | | // #region æ·»å è°æ¨å
¥åºå |
| | | |
| | | // // æ·»å è°æ¨å
¥åºå |
| | | // Dt_CabinOrder cabinOrder = new Dt_CabinOrder() |
| | | // { |
| | | // Order_no = deliveryOrder.Out_no, |
| | |
| | | // }; |
| | | // cabinOrder.Details.Add(orderDetail); |
| | | // } |
| | | // #endregion |
| | | |
| | | // Db.Ado.BeginTran(); |
| | | // _materielInfoService.UpdateData(materielInfo); |
| | | // _inventoryInfoService.Repository.UpdateData(dt_InventoryInfos); |
| | |
| | | // if (deliveryOrder.Details.Count > 0) Db.InsertNav(deliveryOrder).Include(x => x.Details).ExecuteCommand(); |
| | | // if (cabinOrder.Details.Count > 0) Db.InsertNav(cabinOrder).Include(x => x.Details).ExecuteCommand(); |
| | | // Db.Ado.CommitTran(); |
| | | // return WebResponseContent.Instance.OK("è°æ¨åºå
¥åºåçææå,请æä½è°æ¨å"); |
| | | |
| | | // return WebResponseContent.Instance.OK($"è°æ¨åºå
¥åºåçææåï¼å®é
è°æ¨æ°éï¼{(int)Qty}"); |
| | | // } |
| | | // catch (Exception ex) |
| | | // { |
| | |
| | | // return WebResponseContent.Instance.Error(ex.Message); |
| | | // } |
| | | //} |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | |
| | | Details = new List<Dt_DeliveryOrderDetail>() |
| | | }; |
| | | |
| | | // æ
åµ1ï¼å¤§ä»¶åºææ£ä»¶ï¼ä¸ç¨æ·è¾å
¥æ°éå°äºçäºæ£ä»¶æ»æ°ï¼ä¸æ¬¡æ§è°æ¨æææ£ä»¶ |
| | | // æ
åµ1ï¼å¤§ä»¶åºææ£ä»¶ï¼ä¸ç¨æ·è¾å
¥æ°éå°äºçäºæ£ä»¶æ»æ°ï¼åªè°æ¨æææ£ä»¶ |
| | | if (totalLooseQty > 0 && qty <= totalLooseQty) |
| | | { |
| | | decimal remainingLooseQty = totalLooseQty; |
| | |
| | | } |
| | | } |
| | | } |
| | | // æ
åµ2ï¼å¤§ä»¶åºææ£ä»¶ï¼ä½ç¨æ·è¾å
¥æ°éå¤§äºæ£ä»¶æ»æ°ï¼æè
å¤§ä»¶åºæ²¡ææ£ä»¶ï¼æåæ¥æ´ç®±é»è¾ |
| | | // æ
åµ2ï¼å¤§ä»¶åºææ£ä»¶ï¼ä½ç¨æ·è¾å
¥æ°éå¤§äºæ£ä»¶æ»æ°ï¼æè
å¤§ä»¶åºæ²¡ææ£ä»¶ |
| | | else |
| | | { |
| | | // å¦æå¤§ä»¶åºææ£ä»¶ä½ç¨æ·è¦è°æ¨æ´å¤ï¼å
æ¸
çæ£ä»¶ |
| | | decimal allocatedLooseQty = 0; |
| | | // 计ç®è¡¥å
çæ´ç®±æ°é |
| | | decimal remainingAfterLoose = qty - totalLooseQty; |
| | | decimal additionalBoxesNeeded = 0; |
| | | |
| | | if (remainingAfterLoose > 0) |
| | | { |
| | | // åä¸åæ´è®¡ç®éè¦çé¢å¤æ´ç®±æ° |
| | | additionalBoxesNeeded = Math.Ceiling(remainingAfterLoose / materielInfo.BoxQty); //åä¸åæ´ï¼ |
| | | } |
| | | |
| | | // æ»è°æ¨é = æææ£ä»¶ + è¡¥å
çæ´ç®± |
| | | Qty = totalLooseQty + (additionalBoxesNeeded * materielInfo.BoxQty); |
| | | |
| | | // å¼å§å®é
è°æ¨ |
| | | decimal remainingQty = Qty; |
| | | |
| | | // å
è°æ¨æææ£ä»¶ |
| | | if (totalLooseQty > 0) |
| | | { |
| | | foreach (var item in dt_InventoryInfos) |
| | | { |
| | | if (remainingQty <= 0) break; |
| | | |
| | | var looseQty = item.AvailableQuantity % materielInfo.BoxQty; |
| | | if (looseQty > 0) |
| | | { |
| | | // 䏿¬¡æ§è°æ¨è¯¥åºåè®°å½ä¸çæææ£ä»¶ |
| | | item.OutboundQuantity += looseQty; |
| | | item.AvailableQuantity -= looseQty; |
| | | allocatedLooseQty += looseQty; |
| | | Qty += looseQty; |
| | | businessQtyToAdd += looseQty; |
| | | |
| | | // æ·»å ä¾åºä»»å¡ |
| | | Dt_SupplyTask supplyTask = new Dt_SupplyTask() |
| | | { |
| | | WarehouseCode = item.WarehouseCode, |
| | | BatchNo = item.BatchNo, |
| | | MaterielName = item.MaterielName, |
| | | MaterielCode = item.MaterielCode, |
| | | MaterielSpec = item.MaterielSpec, |
| | | TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(), |
| | | TaskType = TaskTypeEnum.AllocatOut.ObjToInt(), |
| | | CreateDate = DateTime.Now, |
| | | Creater = App.User.UserName ?? "System", |
| | | LocationCode = item.LocationCode, |
| | | OrderNo = deliveryOrder.Out_no, |
| | | StockQuantity = looseQty, |
| | | Modifier = item.ValidityPeriod,//ææ |
| | | SupplyQuantity = 0, |
| | | Remark = "æ£ä»¶è°æ¨åºåºï¼ä¸æ¬¡æ§æ¸
çï¼" |
| | | }; |
| | | supplyTasks.Add(supplyTask); |
| | | // è°æ¨è¯¥åºåè®°å½ä¸çæææ£ä»¶ |
| | | decimal transferLooseQty = Math.Min(looseQty, remainingQty); |
| | | item.OutboundQuantity += transferLooseQty; |
| | | item.AvailableQuantity -= transferLooseQty; |
| | | businessQtyToAdd += transferLooseQty; |
| | | remainingQty -= transferLooseQty; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 计ç®è¿éè¦è°æ¨çæ´ç®±æ°é |
| | | var remainingQty = qty - allocatedLooseQty; |
| | | // å¦æè¿æå©ä½éè¦è°æ¨çæ°éï¼è¡¥å
çæ´ç®±ï¼ï¼ä»æ´ç®±ä¸è°æ¨ |
| | | if (remainingQty > 0) |
| | | { |
| | | var zx = (int)Math.Ceiling((decimal)remainingQty / materielInfo.BoxQty); // éè¦çæ´ç®±æ° |
| | | |
| | | foreach (var item in dt_InventoryInfos) |
| | | { |
| | | decimal taskQty = 0; |
| | | if (zx < 1) break; |
| | | if (remainingQty <= 0) break; |
| | | |
| | | // 计ç®å½ååºå坿ä¾ç宿´ç®±æ° |
| | | var availableFullBoxes = item.AvailableQuantity / materielInfo.BoxQty; |
| | | var boxesToTransfer = Math.Min(availableFullBoxes, zx); |
| | | |
| | | if (boxesToTransfer > 0) |
| | | // 计ç®å½ååºåç宿´ç®±æ°éï¼å·²æ£é¤æ£ä»¶ï¼ |
| | | decimal availableFullBoxes = item.AvailableQuantity / materielInfo.BoxQty; |
| | | if (availableFullBoxes > 0) |
| | | { |
| | | var transferQty = boxesToTransfer * materielInfo.BoxQty; |
| | | taskQty += transferQty; |
| | | Qty += transferQty; |
| | | businessQtyToAdd += transferQty; |
| | | zx -= (int)boxesToTransfer; |
| | | // 计ç®éè¦ä»è¯¥åºåè°æ¨çç®±æ° |
| | | decimal boxesToTransfer = Math.Min(availableFullBoxes, remainingQty / materielInfo.BoxQty); |
| | | decimal transferQty = boxesToTransfer * materielInfo.BoxQty; |
| | | |
| | | item.OutboundQuantity += transferQty; |
| | | item.AvailableQuantity -= transferQty; |
| | | businessQtyToAdd += transferQty; |
| | | remainingQty -= transferQty; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // æ·»å ä¾åºä»»å¡ |
| | | // æ£æ¥æ¯å¦è°æ¨å®æ |
| | | if (remainingQty > 0) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åºåä¸è¶³ï¼æ æ³å®æè°æ¨ãè¿éè¦{remainingQty}个"); |
| | | } |
| | | |
| | | // å建ä¸ä¸ªæ»ä»»å¡ï¼è䏿¯å¤ä¸ªä»»å¡ |
| | | if (Qty > 0) |
| | | { |
| | | // 使ç¨ç¬¬ä¸ä¸ªåºåè®°å½çä¿¡æ¯åå»ºä»»å¡ |
| | | var firstInventory = dt_InventoryInfos.FirstOrDefault(x => x.OutboundQuantity > 0); |
| | | if (firstInventory != null) |
| | | { |
| | | Dt_SupplyTask supplyTask = new Dt_SupplyTask() |
| | | { |
| | | WarehouseCode = item.WarehouseCode, |
| | | BatchNo = item.BatchNo, |
| | | MaterielName = item.MaterielName, |
| | | MaterielCode = item.MaterielCode, |
| | | MaterielSpec = item.MaterielSpec, |
| | | WarehouseCode = firstInventory.WarehouseCode, |
| | | BatchNo = firstInventory.BatchNo, |
| | | MaterielName = firstInventory.MaterielName, |
| | | MaterielCode = firstInventory.MaterielCode, |
| | | MaterielSpec = firstInventory.MaterielSpec, |
| | | TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(), |
| | | TaskType = TaskTypeEnum.AllocatOut.ObjToInt(), |
| | | CreateDate = DateTime.Now, |
| | | Creater = App.User.UserName ?? "System", |
| | | LocationCode = item.LocationCode, |
| | | LocationCode = firstInventory.LocationCode, |
| | | OrderNo = deliveryOrder.Out_no, |
| | | Modifier = item.ValidityPeriod,//ææ |
| | | StockQuantity = taskQty, |
| | | Modifier = firstInventory.ValidityPeriod, // ææ |
| | | StockQuantity = Qty, // æ»è°æ¨æ°é |
| | | SupplyQuantity = 0, |
| | | Remark = "æ´ç®±è°æ¨åºåº" |
| | | Remark = additionalBoxesNeeded > 0 ? |
| | | $"è°æ¨åºåº {Qty}ä¸ªï¼æ£ä»¶{totalLooseQty}个 + æ´ç®±{additionalBoxesNeeded}ç®±ï¼ç¨æ·éæ±{qty}个ï¼" : |
| | | $"è°æ¨åºåº {Qty}ä¸ªï¼æ£ä»¶ï¼ç¨æ·éæ±{qty}个ï¼" |
| | | }; |
| | | supplyTasks.Add(supplyTask); |
| | | } |
| | | } |
| | | |
| | | // æ£æ¥æ´ç®±æ°éæ¯å¦è¶³å¤ |
| | | if (zx > 0) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æ´ç®±åºåä¸è¶³ï¼æ æ³å®æè°æ¨ãè¿éè¦{zx}ç®±"); |
| | | } |
| | | } |
| | | } |
| | |
| | | |
| | | |
| | | /// <summary> |
| | | /// ç§»åº/å°ä¸ä¸ªåºåºçåºä½ç§»å°å¦ä¸ä¸ªåºä½ |
| | | /// </summary> |
| | | /// <param name="id"></param> |
| | | /// <returns></returns> |
| | | public WebResponseContent TransferInventory(int[] keys) |
| | | { |
| | | try |
| | | { |
| | | List<Dt_DeliveryOrder> deliveryOrders = new List<Dt_DeliveryOrder>(); |
| | | Dt_CabinOrder cabinOrder = null; // åªæä¸ä¸ªå
¥åºå |
| | | List<Dt_SupplyTask> supplyTasks = new List<Dt_SupplyTask>(); |
| | | List<Dt_InventoryInfo> _InventoryInfos = new List<Dt_InventoryInfo>(); |
| | | List<Dt_MaterielInfo> materielInfos = new List<Dt_MaterielInfo>(); |
| | | List<Dt_Inventory_Batch> batchUpdates=new List<Dt_Inventory_Batch>(); |
| | | |
| | | // å
æ ¹æ®idæ¾å°å°è¿ä¸ªç©æä»¥åæ¹æ¬¡ |
| | | var inventory_Batches = BaseDal.QueryData(x => keys.Contains(x.Id)).ToList(); |
| | | |
| | | // æ¶éæææ¶åçåºä½ |
| | | var allWarehouses = new List<string>(); |
| | | foreach (var item in inventory_Batches) |
| | | { |
| | | var inventoryInfos = _inventoryInfoService.Repository.QueryData(x => |
| | | x.MaterielCode == item.MaterielCode && x.BatchNo == item.BatchNo).ToList(); |
| | | |
| | | if (inventoryInfos.Count > 0) |
| | | { |
| | | allWarehouses.AddRange(inventoryInfos.Select(x => x.WarehouseCode)); |
| | | } |
| | | } |
| | | |
| | | var distinctWarehouses = allWarehouses.Distinct().ToList(); |
| | | |
| | | // ç¡®å®ç§»ä½ç±»ååç®æ åºä½ |
| | | bool has001 = distinctWarehouses.Contains("001"); |
| | | bool has002 = distinctWarehouses.Contains("002"); |
| | | bool has003 = distinctWarehouses.Contains("003"); |
| | | bool has010 = distinctWarehouses.Contains("010"); |
| | | |
| | | string targetWarehouseCode; |
| | | bool isSameWarehouseShift = false; |
| | | |
| | | #region è§å |
| | | // è§å1ï¼å¦æåæ¶åå¨001å002ï¼å
¨é¨ç§»å°002 |
| | | if (has001 && has002) |
| | | { |
| | | targetWarehouseCode = "002"; |
| | | } |
| | | // è§å2ï¼å¦æåªæ001ï¼ç§»å°002 |
| | | else if (has001 && !has002) |
| | | { |
| | | targetWarehouseCode = "002"; |
| | | } |
| | | // è§å3ï¼å¦æåªæ002ï¼å¨002å
ç§»ä½ |
| | | else if (has002 && !has001) |
| | | { |
| | | targetWarehouseCode = "002"; |
| | | isSameWarehouseShift = true; |
| | | } |
| | | // è§å4ï¼å¦æåªæ003ï¼å¨003å
ç§»ä½ |
| | | else if (has003 && distinctWarehouses.Count == 1) |
| | | { |
| | | targetWarehouseCode = "003"; |
| | | isSameWarehouseShift = true; |
| | | } |
| | | // è§å5ï¼å¦æåªæ010ï¼å¨010å
ç§»ä½ |
| | | else if (has010 && distinctWarehouses.Count == 1) |
| | | { |
| | | targetWarehouseCode = "010"; |
| | | isSameWarehouseShift = true; |
| | | } |
| | | else |
| | | { |
| | | throw new Exception("æ æçåºåç»åæè·¨åºæ¿ç§»ä½ä¸å
许"); |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | // å
夿è¿ä¸ªæ¯å¦æå¾
åºåºæ°éï¼ä»¥åçç¹å·®å¼æ° |
| | | foreach (var item in inventory_Batches) |
| | | { |
| | | #region 夿æ¯å¦å建 |
| | | var supplyTask1 = _supplyTaskService.Repository.QueryData(x => x.MaterielCode == item.MaterielCode && x.BatchNo == item.BatchNo && x.TaskType == TaskTypeEnum.TransferOut.ObjToInt()).ToList(); |
| | | if (supplyTask1.Count>0) throw new Exception($"ç©æç¼å·ã{item.MaterielCode}ãæ¹æ¬¡å·ã{item.BatchNo}ãå·²åå¨ç§»åºä»»å¡ï¼è¯·å
宿å½åç§»åºä»»å¡"); |
| | | |
| | | // æ¥æ¾ä»»å¡ä¸æ¯å¦åå¨å¾
çç¹ä»»å¡ |
| | | supplyTask1 = _supplyTaskService.Repository.QueryData(x => x.MaterielCode == item.MaterielCode && x.BatchNo == item.BatchNo && x.TaskStatus == SupplyStatusEnum.NewCheck.ObjToInt()).ToList(); |
| | | if (supplyTask1.Count > 0) throw new Exception($"ç©æç¼å·ã{item.MaterielCode}ãæ¹æ¬¡å·ã{item.BatchNo}ãå·²åå¨çç¹ä»»å¡ï¼è¯·å
宿å½åçç¹ä»»å¡"); |
| | | |
| | | // æ¥æ¾ä»»å¡ä¸æ¯å¦åå¨åºåºä»»å¡ |
| | | supplyTask1 = _supplyTaskService.Repository.QueryData(x => x.MaterielCode == item.MaterielCode && x.BatchNo == item.BatchNo && x.TaskStatus == SupplyStatusEnum.NewOut.ObjToInt()).ToList(); |
| | | if (supplyTask1.Count > 0) throw new Exception($"ç©æç¼å·ã{item.MaterielCode}ãæ¹æ¬¡å·ã{item.BatchNo}ãå·²åå¨åºåºä»»å¡ï¼è¯·å
宿å½ååºåºä»»å¡"); |
| | | #endregion |
| | | |
| | | // æ¥æ¾åºåä¿¡æ¯ |
| | | var inventoryInfos = _inventoryInfoService.Repository.QueryData(x => x.MaterielCode == item.MaterielCode && x.BatchNo == item.BatchNo).ToList(); |
| | | if (inventoryInfos.Count > 0) |
| | | { |
| | | // 计ç®è¯¥ç©ææ¹æ¬¡çæ»åºåæ°éï¼ææåºä½ï¼ |
| | | decimal totalStockQuantity = inventoryInfos.Sum(x => x.StockQuantity); |
| | | |
| | | // ç´æ¥æ´æ°æ¹æ¬¡å¯¹è±¡çåæ®µ |
| | | item.OutboundQuantity += totalStockQuantity; |
| | | item.AvailableQuantity -= totalStockQuantity; |
| | | |
| | | // æ·»å å°æ´æ°å表ï¼å¦æè¿æ²¡æ·»å è¿ï¼ |
| | | if (!batchUpdates.Any(x => x.Id == item.Id)) |
| | | { |
| | | batchUpdates.Add(item); |
| | | } |
| | | |
| | | |
| | | |
| | | // å建å
¥åºåï¼åªæä¸ä¸ªï¼ |
| | | if (cabinOrder == null) |
| | | { |
| | | cabinOrder = new Dt_CabinOrder() |
| | | { |
| | | Order_no = $"RK{targetWarehouseCode}{DateTime.Now.ToString("yyMMddHHmmss")}", |
| | | Order_type = "40", // ç§»ä½å
¥åº |
| | | OdrderStatus = "æ°å»º", |
| | | Warehouse_no = targetWarehouseCode, |
| | | Details = new List<Dt_CabinOrderDetail>() |
| | | }; |
| | | } |
| | | |
| | | // æ·»å å
¥åºæç»ï¼æ»æ°éï¼ |
| | | Dt_CabinOrderDetail cabinOrderDetail = new Dt_CabinOrderDetail() |
| | | { |
| | | Batch_num = item.BatchNo, |
| | | Order_Inqty = 0, |
| | | Order_qty = totalStockQuantity, // ææåºä½çæ»æ°é |
| | | CreateDate = DateTime.Now, |
| | | Creater = App.User.UserName, |
| | | Goods_no = item.MaterielCode, |
| | | OrderDetailStatus = "æ°å»º", |
| | | Status = targetWarehouseCode == "001" ? 0 : 2, |
| | | Reservoirarea = targetWarehouseCode, |
| | | }; |
| | | |
| | | // æ£æ¥æ¯å¦å·²æç¸åç©ææ¹æ¬¡çå
¥åºæç» |
| | | var existingDetail = cabinOrder.Details.FirstOrDefault(x => |
| | | x.Goods_no == item.MaterielCode && x.Batch_num == item.BatchNo); |
| | | |
| | | if (existingDetail != null) |
| | | { |
| | | // 妿已åå¨ï¼åå¹¶æ°é |
| | | existingDetail.Order_qty += totalStockQuantity; |
| | | } |
| | | else |
| | | { |
| | | // æ·»å å
¥åº |
| | | cabinOrder.Details.Add(cabinOrderDetail); |
| | | } |
| | | |
| | | // æ ¹æ®åºæ¿å·æ¥è¿è¡åç»ï¼ä¸ºæ¯ä¸ªæºåºä½å建åºåºå |
| | | foreach (var items in inventoryInfos.GroupBy(x => x.WarehouseCode)) |
| | | { |
| | | string sourceWarehouseCode = items.Key; |
| | | |
| | | //// 妿æ¯ååºæ¿ç§»ä½ä¸æºåºä½å°±æ¯ç®æ åºä½ï¼è·³è¿ï¼ä¸ç§»å°èªèº«ï¼ |
| | | //if (isSameWarehouseShift && sourceWarehouseCode == targetWarehouseCode) |
| | | // continue; |
| | | |
| | | // æ¥æ¾å°è¯¥åºæ¿å·çåºåºå |
| | | var deliveryOrder = deliveryOrders.Where(x => x.Warehouse_no == sourceWarehouseCode).FirstOrDefault(); |
| | | bool isNull = false; |
| | | if (deliveryOrder == null) |
| | | { |
| | | isNull = true; |
| | | deliveryOrder = new Dt_DeliveryOrder() |
| | | { |
| | | Out_no = $"YK{sourceWarehouseCode}{DateTime.Now.ToString("yyMMddHHmmss")}{new Random().Next(1000, 9999)}", |
| | | Out_type = "30", // ç§»ä½åºåº |
| | | OutStatus = "æ°å»º", |
| | | Warehouse_no = sourceWarehouseCode, |
| | | Details = new List<Dt_DeliveryOrderDetail>() |
| | | }; |
| | | } |
| | | |
| | | var Status = sourceWarehouseCode == "001" ? 0 : 2; // 夿æ¯å¦ä¸ºç«åºåºå |
| | | Dt_DeliveryOrderDetail deliveryOrderDetail = new Dt_DeliveryOrderDetail() |
| | | { |
| | | Batch_num = item.BatchNo, |
| | | Order_Outqty = 0, |
| | | Order_qty = items.Select(x => x.StockQuantity).Sum(), // 该åºä½çæ°é |
| | | CreateDate = DateTime.Now, |
| | | Creater = App.User.UserName, |
| | | Goods_no = item.MaterielCode, |
| | | OotDetailStatus = "æ°å»º", |
| | | Status = Status, |
| | | Reservoirarea = sourceWarehouseCode, |
| | | }; |
| | | |
| | | deliveryOrder.Details.Add(deliveryOrderDetail); |
| | | if (isNull) deliveryOrders.Add(deliveryOrder); |
| | | |
| | | #region å建移åºåºåºä»»å¡ |
| | | foreach (var inventory in items) |
| | | { |
| | | // ä¿å忥çåºåæ°é |
| | | decimal originalStockQuantity = inventory.StockQuantity; |
| | | |
| | | // æ´æ°åºåä¿¡æ¯ï¼å¢å å¾
åºåºæ°éï¼åå°å¯ç¨åºå |
| | | inventory.OutboundQuantity += originalStockQuantity; |
| | | inventory.AvailableQuantity -= originalStockQuantity; |
| | | |
| | | Dt_SupplyTask supplyTask = new Dt_SupplyTask() |
| | | { |
| | | WarehouseCode = inventory.WarehouseCode, |
| | | TaskStatus = SupplyStatusEnum.NewOut.ObjToInt(), |
| | | BatchNo = inventory.BatchNo, |
| | | MaterielName = inventory.MaterielName, |
| | | MaterielCode = inventory.MaterielCode, |
| | | MaterielSpec = inventory.MaterielSpec, |
| | | TaskType = TaskTypeEnum.TransferOut.ObjToInt(), |
| | | CreateDate = DateTime.Now, |
| | | Creater = App.User.UserName, |
| | | LocationCode = inventory.LocationCode, |
| | | OrderNo = deliveryOrder.Out_no, |
| | | StockQuantity = inventory.StockQuantity, |
| | | Modifier = inventory.ValidityPeriod, // ææ |
| | | SupplyQuantity = 0, |
| | | Remark = isSameWarehouseShift ? |
| | | $"å¨{sourceWarehouseCode}åºæ¿å
ç§»ä½" : |
| | | $"ä»{sourceWarehouseCode}ç§»åºå°{targetWarehouseCode}", |
| | | }; |
| | | supplyTasks.Add(supplyTask); |
| | | _InventoryInfos.Add(inventory); |
| | | } |
| | | #endregion |
| | | } |
| | | } |
| | | } |
| | | |
| | | // æ£æ¥æ¯å¦æéè¦ç§»ä½çåºå |
| | | if (cabinOrder == null || cabinOrder.Details.Count == 0) |
| | | throw new Exception("没æéè¦ç§»ä½çåºå"); |
| | | |
| | | _InventoryInfos.ForEach(x => |
| | | { |
| | | x.StockStatus = StockStatusEmun.ç§»ä½ä¸.ObjToInt(); |
| | | }); |
| | | |
| | | Db.Ado.BeginTran(); |
| | | _materielInfoService.UpdateData(materielInfos); |
| | | _inventoryInfoService.UpdateData(_InventoryInfos); |
| | | _supplyTaskService.AddData(supplyTasks); |
| | | BaseDal.UpdateData(batchUpdates); |
| | | |
| | | // æ¹éæå
¥åºåºåï¼æ¯ä¸ªæºåºä½ä¸ä¸ªï¼ |
| | | foreach (var deliveryOrder in deliveryOrders) |
| | | { |
| | | if (deliveryOrder.Details.Count > 0) |
| | | Db.InsertNav(deliveryOrder).Include(x => x.Details).ExecuteCommand(); |
| | | } |
| | | |
| | | // æå
¥å
¥åºåï¼åªæä¸ä¸ªï¼ |
| | | if (cabinOrder != null && cabinOrder.Details.Count > 0) |
| | | Db.InsertNav(cabinOrder).Include(x => x.Details).ExecuteCommand(); |
| | | |
| | | Db.Ado.CommitTran(); |
| | | |
| | | string message = isSameWarehouseShift ? |
| | | "åºå
è´§ä½è°æ´åçææåï¼" : |
| | | "ç§»åºåºå
¥åºåçææåï¼"; |
| | | |
| | | return WebResponseContent.Instance.OK(message); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Db.Ado.RollbackTran(); |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// åºåè¿æé¢è¦ |
| | | /// </summary> |
| | | /// <returns></returns> |
| | |
| | | } |
| | | return content; |
| | | } |
| | | |
| | | |
| | | } |
| | | } |