From 695571c6009ecbc12e7d4a4fb147df7967a1260e Mon Sep 17 00:00:00 2001
From: wangxinhui <wangxinhui@hnkhzn.com>
Date: 星期一, 07 七月 2025 20:21:19 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/MeiRuiAn/HuaiAn
---
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderDetailService.cs | 230 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 228 insertions(+), 2 deletions(-)
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderDetailService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderDetailService.cs"
index dd8108e..2acec89 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderDetailService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_OutboundService/ProOutOrderDetailService.cs"
@@ -3,11 +3,20 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using WIDESEA_Common.LocationEnum;
+using WIDESEA_Common.OrderEnum;
+using WIDESEA_Common.StockEnum;
+using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
+using WIDESEA_Core.Helper;
+using WIDESEA_IBasicService;
using WIDESEA_IOutboundRepository;
using WIDESEA_IOutboundService;
+using WIDESEA_IRecordService;
+using WIDESEA_IStockService;
using WIDESEA_Model.Models;
+using WIDESEA_OutboundRepository;
namespace WIDESEA_OutboundService
{
@@ -16,10 +25,227 @@
private readonly IUnitOfWorkManage _unitOfWorkManage;
public IProOutOrderDetailRepository Repository => BaseDal;
-
- public ProOutOrderDetailService(IProOutOrderDetailRepository BaseDal, IUnitOfWorkManage unitOfWorkManage) : base(BaseDal)
+ private readonly IStockService _stockInfoService;
+ private readonly IBasicService _basicService;
+ private readonly IOutProStockInfoService _outProStockInfoService;
+ private readonly IProOutOrderRepository _proOutOrderRepository;
+ private readonly IRecordService _recordService;
+ public ProOutOrderDetailService(IProOutOrderDetailRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockService stockInfoService, IBasicService basicService,IOutProStockInfoService outProStockInfoService, IRecordService recordService, IProOutOrderRepository proOutOrderRepository) : base(BaseDal)
{
_unitOfWorkManage = unitOfWorkManage;
+ _stockInfoService = stockInfoService;
+ _basicService = basicService;
+ _outProStockInfoService = outProStockInfoService;
+ _recordService = recordService;
+ _proOutOrderRepository=proOutOrderRepository;
+ }
+ /// <summary>
+ /// 鍑哄簱搴撳瓨鍒嗛厤鍚庯紝鏇存柊鏁版嵁搴撴暟鎹�
+ /// </summary>
+ public WebResponseContent LockOutboundStockDataUpdate(List<Dt_ProStockInfo> proStockInfos, List<Dt_ProOutOrderDetail> proOutOrderDetails, List<Dt_OutProStockInfo> outProStockInfos, List<Dt_LocationInfo> locationInfos, LocationStatusEnum locationStatus = LocationStatusEnum.Lock, List<Dt_Task>? tasks = null)
+ {
+ try
+ {
+ //鏇存柊搴撳瓨灞炴��
+ _stockInfoService.ProStockInfoService.Repository.UpdateData(proStockInfos);
+ List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>();
+ foreach (var item in proStockInfos)
+ {
+ proStockInfoDetails.AddRange(item.proStockInfoDetails);
+ }
+ //鏇存柊搴撳瓨鏄庣粏
+ proStockInfoDetails.ForEach(x => x.ProOutDetailStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt());
+ _stockInfoService.ProStockInfoDetailService.Repository.UpdateData(proStockInfoDetails);
+ Dt_ProOutOrder proOutOrder = _proOutOrderRepository.QueryFirst(x => x.Id == proOutOrderDetails.FirstOrDefault().ProOrderId);
+ if (proOutOrder.ProOrderStatus == OutOrderStatusEnum.鏈紑濮�.ObjToInt())
+ {
+ proOutOrder.ProOrderStatus = OutOrderStatusEnum.鍑哄簱涓�.ObjToInt();
+ _proOutOrderRepository.UpdateData(proOutOrder);
+ }
+ BaseDal.UpdateData(proOutOrderDetails);
+
+ List<Dt_OutProStockInfo> addOutStockLockInfos = outProStockInfos.Where(x => x.Id == 0).ToList();
+ if (addOutStockLockInfos != null && addOutStockLockInfos.Any())
+ {
+ if (tasks != null)
+ {
+ addOutStockLockInfos.ForEach(x =>
+ {
+ x.TaskNum = tasks.FirstOrDefault(v => v.PalletCode == x.PalletCode)?.TaskNum;
+ });
+ }
+
+ _outProStockInfoService.Repository.AddData(addOutStockLockInfos);
+ }
+ List<Dt_OutProStockInfo> updateOutStockLockInfos = outProStockInfos.Where(x => x.Id > 0).ToList();
+ if (updateOutStockLockInfos != null && updateOutStockLockInfos.Any())
+ {
+ _outProStockInfoService.Repository.UpdateData(updateOutStockLockInfos);
+ }
+
+ _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, locationStatus, LocationChangeType.OutboundAssignLocation, "", tasks?.Select(x => x.TaskNum).ToList());
+ _basicService.LocationInfoService.Repository.UpdateLocationStatus(locationInfos, locationStatus);
+ return WebResponseContent.Instance.OK();
+ }
+ catch (Exception ex)
+ {
+ return WebResponseContent.Instance.Error(ex.Message);
+ }
+ }
+ /// <summary>
+ /// 鍒嗛厤搴撳瓨澶勭悊璐т綅鏁版嵁
+ /// </summary>
+ public (List<Dt_ProStockInfo>, List<Dt_ProOutOrderDetail>, List<Dt_OutProStockInfo>, List<Dt_LocationInfo>) AssignProStockOut(List<Dt_ProOutOrderDetail> proOutOrderDetails)
+ {
+ List<Dt_ProStockInfo> outStocks = new List<Dt_ProStockInfo>();
+ List<Dt_OutProStockInfo> outProStockInfos = new List<Dt_OutProStockInfo>();
+ List<Dt_LocationInfo> locationInfos = new List<Dt_LocationInfo>();
+ //鑾峰彇鎴愬搧璁㈠崟
+ Dt_ProOutOrder proOutOrder = _proOutOrderRepository.QueryFirst(x=>x.Id==proOutOrderDetails.FirstOrDefault().ProOrderId);
+ if (proOutOrder==null)
+ {
+ throw new Exception("鏈壘鍒版垚鍝佽鍗�");
+ }
+ //List<Dt_ProOutOrderDetail> groupDetails = proOutOrderDetails.GroupBy(x => new { x.SaleOrder, x.PCode, x.PVer, x.PLot, x.DateCode }).Select(x => new Dt_ProOutOrderDetail()
+ //{
+ // QtyPcs = x.Sum(x => x.QtyPcs) - x.Sum(x => x.OverQtyPcs),
+ // SaleOrder = x.Key.SaleOrder,
+ // PCode = x.Key.PCode,
+ // PVer = x.Key.PVer,
+ // PLot = x.Key.PLot,
+ // DateCode = x.Key.DateCode,
+ //}).ToList();
+ //foreach (var item in groupDetails)
+ //{
+ // float needQty = item.QtyPcs;
+ // //鏌ユ壘鍙敤搴撳瓨
+ // List<Dt_ProStockInfo> stockInfoss = _stockInfoService.ProStockInfoService.GetUseableStocks(proOutOrder.WarehouseId, item);
+ // if (!stockInfoss.Any())
+ // {
+ // throw new Exception("鏈壘鍒板彲鍒嗛厤搴撳瓨");
+ // }
+ // //鑾峰彇鍑哄簱搴撳瓨
+ // List<Dt_ProStockInfo> assignOutStocks = _stockInfoService.ProStockInfoService.GetOutboundStocks(stockInfoss, item, needQty, out float residueQuantity);
+ // item.LockQtyPcs += needQty - residueQuantity;
+ // if (item.QtyPcs> item.LockQtyPcs)
+ // {
+ // throw new Exception($"浜у搧缂栫爜{item.PCode}鍙垎閰嶆暟閲忎笉瓒�,鍙敤鏁伴噺{item.LockQtyPcs}");
+ // }
+ // outStocks.AddRange(assignOutStocks);
+ // float assignQuantity = needQty - residueQuantity;
+ // bool isCanLot = string.IsNullOrEmpty(item.PLot);
+ // bool isCanDate = string.IsNullOrEmpty(item.DateCode);
+ // List<Dt_ProOutOrderDetail> details = proOutOrderDetails
+ // .Where(x =>x.PCode == item.PCode && x.PVer == item.PVer
+ // && (isCanLot ? isCanLot : x.PLot == item.PLot)
+ // && (isCanDate ? isCanDate : x.DateCode == item.DateCode))
+ // .ToList();
+
+ // for (int i = 0; i < details.Count; i++)
+ // {
+ // float orderQuantity = details[i].QtyPcs;
+ // for (int j = 0; j < assignOutStocks.Count; j++)
+ // {
+ // //鍑哄簱璁㈠崟鏄庣粏宸插垎閰嶆暟閲�
+ // float detailAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
+ // && (isCanLot ? isCanLot : x.PLot == item.PLot)
+ // && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
+ // && x.OrderDetailId == details[i].Id).Sum(x => x.AssignQuantity);
+
+ // float palletAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
+ // && (isCanLot ? isCanLot : x.PLot == item.PLot)
+ // && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
+ // && x.PalletCode == assignOutStocks[j].PalletCode).Sum(x => x.AssignQuantity);
+ // //鍑哄簱璇︽儏宸插垎閰嶆暟閲�
+ // palletAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
+ // && (isCanLot ? isCanLot : x.PLot == item.PLot)
+ // && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
+ // && x.PalletCode == assignOutStocks[j].PalletCode).Sum(x => x.AssignQuantity);//鍑哄簱璇︽儏宸插垎閰嶆暟閲�
+ // float palletOutboundQuantity = assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
+ // if (palletAssignQuantity < palletOutboundQuantity)//濡傛灉鍑哄簱璇︽儏宸插垎閰嶆暟閲忓皬浜庢墭鐩樺凡鍒嗛厤鏁伴噺锛屽垯鍙互缁х画娣诲姞璇ユ墭鐩樺嚭搴撲俊鎭�
+ // {
+ // float orderDetailNeedQuantity = details[i].QtyPcs - detailAssignQuantity;
+ // if (orderDetailNeedQuantity > assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity)
+ // {
+ // details[i].LockQtyPcs += assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity;
+ // Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, details[i], assignOutStocks[j], assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity) - palletAssignQuantity);
+ // outProStockInfos.Add(outStockLockInfo);
+ // }
+ // else
+ // {
+ // Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, details[i], assignOutStocks[j], details[i].QtyPcs - details[i].LockQtyPcs);
+ // outProStockInfos.Add(outStockLockInfo);
+ // details[i].LockQtyPcs = details[i].QtyPcs;
+ // break;
+ // }
+
+ // }
+ // }
+ // }
+ // List<string> locationArr = outStocks.Select(x => x.LocationCode).ToList();
+
+ // locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(locationArr));
+
+ //}
+ foreach (var item in proOutOrderDetails)
+ {
+ float needQty = item.QtyPcs;
+ //鏌ユ壘鍙敤搴撳瓨
+ List<Dt_ProStockInfo> stockInfoss = _stockInfoService.ProStockInfoService.GetUseableStocks(proOutOrder.WarehouseId, item);
+ if (!stockInfoss.Any())
+ {
+ throw new Exception("鏈壘鍒板彲鍒嗛厤搴撳瓨");
+ }
+ //鑾峰彇鍑哄簱搴撳瓨
+ List<Dt_ProStockInfo> assignOutStocks = _stockInfoService.ProStockInfoService.GetOutboundStocks(stockInfoss, item, needQty, out float residueQuantity);
+ item.LockQtyPcs += needQty - residueQuantity;
+ if (item.QtyPcs > item.LockQtyPcs)
+ {
+ throw new Exception($"浜у搧缂栫爜{item.PCode},鐗堟湰{item.PVer.Substring(0, 1)}鍙垎閰嶆暟閲忎笉瓒�,鍙敤鏁伴噺{item.LockQtyPcs}");
+ }
+ outStocks.AddRange(assignOutStocks);
+ //鍒嗛厤鍑哄簱鐨凱CS鏁伴噺
+ float assignQuantity = needQty;
+ bool isCanLot = string.IsNullOrEmpty(item.PLot);
+ bool isCanDate = string.IsNullOrEmpty(item.DateCode);
+ //璁㈠崟鏄庣粏鐨勫嚭搴揚CS鏁伴噺
+ float orderQuantity = item.QtyPcs;
+ for (int j = 0; j < assignOutStocks.Count; j++)
+ {
+ //鍑哄簱璁㈠崟鏄庣粏宸插垎閰嶆暟閲�
+ float detailAssignQuantity = outProStockInfos.Where(x => x.OrderDetailId == item.Id).Sum(x => x.AssignQuantity);
+ ////鍑哄簱璇︽儏宸插垎閰嶆暟閲�
+ //float palletAssignQuantity = outProStockInfos.Where(x => x.PCode == item.PCode && x.PVer == item.PVer
+ // && (isCanLot ? isCanLot : x.PLot == item.PLot)
+ // && (isCanDate ? isCanDate : x.DateCode == item.DateCode)
+ // && x.PalletCode == assignOutStocks[j].PalletCode).Sum(x => x.AssignQuantity);
+ ////鍑哄簱璇︽儏宸插垎閰嶆暟閲�
+ //float palletOutboundQuantity = assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
+ //if (palletAssignQuantity < palletOutboundQuantity)//濡傛灉鍑哄簱璇︽儏宸插垎閰嶆暟閲忓皬浜庢墭鐩樺凡鍒嗛厤鏁伴噺锛屽垯鍙互缁х画娣诲姞璇ユ墭鐩樺嚭搴撲俊鎭�
+ //{
+ float orderDetailNeedQuantity = item.QtyPcs - detailAssignQuantity;
+ if (orderDetailNeedQuantity > assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity))
+ {
+ item.LockQtyPcs += assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity);
+ Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, item, assignOutStocks[j], assignOutStocks[j].proStockInfoDetails.Sum(x => x.OutboundQuantity));
+ outProStockInfos.Add(outStockLockInfo);
+ }
+ else
+ {
+ Dt_OutProStockInfo outStockLockInfo = _outProStockInfoService.GetOutStockLockInfo(proOutOrder, item, assignOutStocks[j], item.QtyPcs - detailAssignQuantity);
+ outProStockInfos.Add(outStockLockInfo);
+ item.LockQtyPcs = item.QtyPcs;
+ break;
+ }
+
+ //}
+ }
+ List<string> locationArr = outStocks.Select(x => x.LocationCode).ToList();
+
+ locationInfos.AddRange(_basicService.LocationInfoService.Repository.GetLocationInfos(locationArr));
+
+ }
+ return (outStocks, proOutOrderDetails, outProStockInfos, locationInfos);
}
}
}
--
Gitblit v1.9.3