From 7281004dc3854ed59e9164dcd27a59c8c2cf6667 Mon Sep 17 00:00:00 2001 From: qinchulong <qinchulong@hnkhzn.com> Date: 星期六, 12 十月 2024 15:16:55 +0800 Subject: [PATCH] 初始化 --- 项目代码/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderServices/OutboundOrder/Dt_OutOrderService.cs | 670 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 670 insertions(+), 0 deletions(-) diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderServices/OutboundOrder/Dt_OutOrderService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderServices/OutboundOrder/Dt_OutOrderService.cs" new file mode 100644 index 0000000..258aa0d --- /dev/null +++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderServices/OutboundOrder/Dt_OutOrderService.cs" @@ -0,0 +1,670 @@ +锘縩amespace WIDESEA_StorageOutOrderServices; + +public class Dt_OutOrderService : ServiceBase<Dt_OutOrder, IDt_OutOrderRepository>, IDt_OutOrderService +{ + private readonly LogFactory LogFactory = new LogFactory(); + private readonly IUnitOfWorkManage _unitOfWorkManage; + private readonly IDt_OutOrderProductionService _outOrderProductionService; + private readonly IDt_OutOrderProductionDetailService _outOrderProductionDetailService; + private readonly IDt_OutOrderDtailService _outOrderDtailService; + private readonly IDt_OutOrderTransferRepository _OutOrderTransferRepository; + private readonly IDt_OutOrderTransferDetailRepository _OutOrderTransferDetailRepository; + private readonly IDt_MaterielInfoRepository _materielInfoRepository; + private readonly IDt_BillGroupStockRepository _billGroupStockRepository; + private readonly IDt_OutOrderAndStockRepository _outOrderAndStockRepository; + private readonly IDt_TaskRepository _taskRepository; + + public Dt_OutOrderService(IDt_OutOrderRepository BaseDal, + IUnitOfWorkManage unitOfWorkManage, + IDt_OutOrderProductionService outOrderProductionService, + IDt_OutOrderProductionDetailService outOrderProductionDetailService, + IDt_OutOrderDtailService outOrderDtailService, + IDt_OutOrderTransferDetailRepository outOrderTransferDetailRepository, + IDt_OutOrderTransferRepository outOrderTransferRepository, + IDt_MaterielInfoRepository materielInfoRepository, + IDt_BillGroupStockRepository billGroupStockRepository, + IDt_OutOrderAndStockRepository outOrderAndStockRepository, + IDt_TaskRepository taskRepository) : base(BaseDal) + { + _unitOfWorkManage = unitOfWorkManage; + _outOrderProductionService = outOrderProductionService; + _outOrderProductionDetailService = outOrderProductionDetailService; + _outOrderDtailService = outOrderDtailService; + _OutOrderTransferDetailRepository = outOrderTransferDetailRepository; + _OutOrderTransferRepository = outOrderTransferRepository; + _materielInfoRepository = materielInfoRepository; + _billGroupStockRepository = billGroupStockRepository; + _outOrderAndStockRepository = outOrderAndStockRepository; + _taskRepository = taskRepository; + } + + /// <summary> + /// 娣诲姞鐢熶骇鍑哄簱鍗� + /// </summary> + /// <param name="model">鍑哄簱鏁版嵁</param> + /// <returns>鎴愬姛鎴栧け璐�</returns> + public WebResponseContent AddOutOrderProduction(SaveModel model) + { + WebResponseContent content = new WebResponseContent(); + try + { + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "璇锋眰", JsonConvert.SerializeObject(model)); + // 1. 鏋勫缓鐢熶骇鍑哄簱鍗曞璞� + var production = CreateProductionOrder(model.MainData); + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "鏋勫缓鐢熶骇鍑哄簱鍗曞璞�", JsonConvert.SerializeObject(production)); + + // 2. 鏋勫缓鐢熶骇鍑哄簱鍗曟槑缁嗗垪琛� + var productionDetails = CreateProductionDetails(model.DetailData); + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "鏋勫缓鐢熶骇鍑哄簱鍗曟槑缁嗗璞�", JsonConvert.SerializeObject(productionDetails)); + + // 3. 鏋勫缓绯荤粺鍑哄簱鍗曞璞� + var order = CreateSystemOrder(production); + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "鏋勫缓绯荤粺鍑哄簱鍗曞璞�", JsonConvert.SerializeObject(order)); + + // 4. 鏋勫缓绯荤粺鍑哄簱鍗曟槑缁嗗垪琛� + var orderDetails = CreateSystemOrderDetails(productionDetails); + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "鏋勫缓绯荤粺鍑哄簱鍗曟槑缁嗗璞�", JsonConvert.SerializeObject(orderDetails)); + + // 寮�鍚簨鍔� + _unitOfWorkManage.BeginTran(); + + // 5. 娣诲姞鐢熶骇鍑哄簱鍗曞苟鑾峰彇涓婚敭ID + var productionId = _outOrderProductionService.AddOrderProduction(production); + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "娣诲姞鐢熶骇鍑哄簱鍗曞苟鑾峰彇涓婚敭ID", productionId); + + // 6. 鐢熶骇鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D + productionDetails.ForEach(item => { item.ProductionOutOrderId = productionId; }); + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "鐢熶骇鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D", productionId); + + // 7. 娣诲姞鐢熶骇鍑哄簱鍗曟槑缁� + var detailAddResult = _outOrderProductionDetailService.AddData(productionDetails); + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "娣诲姞鐢熶骇鍑哄簱鍗曟槑缁�", detailAddResult.Status); + + // 8. 绯荤粺鍑哄簱鍗曠粦瀹氱敓浜у嚭搴撳崟ID + order.UpperOutOrderId = productionId; + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "绯荤粺鍑哄簱鍗曠粦瀹氱敓浜у嚭搴撳崟ID", productionId); + + // 9. 娣诲姞绯荤粺鍑哄簱鍗曞苟鑾峰彇涓婚敭ID + var orderId = BaseDal.AddData(order); + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "娣诲姞绯荤粺鍑哄簱鍗曞苟鑾峰彇涓婚敭ID", orderId); + + // 10 . 绯荤粺鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D + orderDetails.ForEach(item => { item.OutOrderId = orderId; }); + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "绯荤粺鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D", orderId); + + // 11. 娣诲姞绯荤粺鍑哄簱鍗曟槑缁嗗苟杩斿洖缁撴灉 + content = _outOrderDtailService.AddData(orderDetails); + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "娣诲姞绯荤粺鍑哄簱鍗曟槑缁嗗苟杩斿洖缁撴灉", content.Status); + + if (content.Status && productionId > 0 && detailAddResult.Status && orderId > 0) + { + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "鎵�鏈夋搷浣滄墽琛屽畬鎴愭彁浜や簨鍔�", "鏃犲弬鏁�"); + _unitOfWorkManage.CommitTran(); // 鎻愪氦浜嬪姟 + } + else + { + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "娣诲姞鏁版嵁搴撳け璐�,璇锋鏌ユ暟鎹槸鍚︽纭�", $"绯荤粺鍑哄簱鍗曟槑缁�:{content.Status},娣诲姞绯荤粺鍑哄簱鍗�:{orderId > 0},鐢熶骇鍑哄簱鍗�:{productionId > 0},鐢熶骇鍑哄簱鍗曟槑缁�:{detailAddResult.Status}"); + throw new Exception("鍑哄簱鍗曟坊鍔犲け璐�" + $"绯荤粺鍑哄簱鍗曟槑缁�:{content.Status},娣诲姞绯荤粺鍑哄簱鍗�:{orderId > 0},鐢熶骇鍑哄簱鍗�:{productionId > 0},鐢熶骇鍑哄簱鍗曟槑缁�:{detailAddResult.Status}"); + } + + return content; + } + catch (Exception ex) + { + _unitOfWorkManage.RollbackTran(); // 鍥炴粴浜嬪姟 + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, $"绯荤粺寮傚父锛屽紓甯镐俊鎭細{ex.Message}", "鏃犲弬鏁�"); + return content.Error(ex.Message); + } + finally + { + LogFactory.GetLog("娣诲姞鐢熶骇鍑哄簱鍗�").InfoFormat(true, "鍝嶅簲", JsonConvert.SerializeObject(content)); + } + } + + /// <summary> + /// 娣诲姞璋冩嫧鍑哄簱鍗� + /// </summary> + /// <param name="model">鍑哄簱鏁版嵁</param> + /// <returns>鎴愬姛鎴栧け璐�</returns> + public WebResponseContent AddOutOrderTransfer(SaveModel model) + { + WebResponseContent content = new WebResponseContent(); + try + { + // 1. 鏋勫缓璋冩嫧鍑哄簱鍗曞璞� + var transfer = CreateTransferOrder(model.MainData); + LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "鏋勫缓璋冩嫧鍑哄簱鍗曞璞�", JsonConvert.SerializeObject(transfer)); + + // 2. 鏋勫缓璋冩嫧鍑哄簱鍗曟槑缁嗗垪琛� + var transferDetail = CreateTransferDetails(model.DetailData); + LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "鏋勫缓璋冩嫧鍑哄簱鍗曟槑缁嗗璞�", JsonConvert.SerializeObject(transferDetail)); + + // 3. 鏋勫缓绯荤粺鍑哄簱鍗曞璞� + var order = CreateSystemOrder(transfer); + LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "鏋勫缓绯荤粺鍑哄簱鍗曞璞�", JsonConvert.SerializeObject(order)); + + // 4. 鏋勫缓绯荤粺鍑哄簱鍗曟槑缁嗗垪琛� + var orderDetails = CreateSystemOrderDetails(transferDetail); + LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "鏋勫缓绯荤粺鍑哄簱鍗曟槑缁嗗璞�", JsonConvert.SerializeObject(orderDetails)); + + // 娣诲姞浜嬪姟 + _unitOfWorkManage.BeginTran(); + + // 5. 娣诲姞璋冩嫧鍑哄簱鍗曞苟鑾峰彇涓婚敭ID + var transferId = _OutOrderTransferRepository.AddData(transfer); + LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "娣诲姞璋冩嫧鍑哄簱鍗曞苟鑾峰彇涓婚敭ID", transferId); + + // 6. 璋冩嫧鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D + transferDetail.ForEach(item => { item.TransferOutOrderId = transferId; }); + LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "璋冩嫧鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D", transferId); + + // 7. 娣诲姞鐢熶骇鍑哄簱鍗曟槑缁� + var detailAddResult = _OutOrderTransferDetailRepository.AddData(transferDetail); + LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "娣诲姞鐢熶骇鍑哄簱鍗曟槑缁�", detailAddResult); + + // 8. 绯荤粺鍑哄簱鍗曠粦瀹氳皟鎷ㄥ嚭搴撳崟ID + order.UpperOutOrderId = transferId; + LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "绯荤粺鍑哄簱鍗曠粦瀹氳皟鎷ㄥ嚭搴撳崟ID", transferId); + + // 9. 娣诲姞绯荤粺鍑哄簱鍗曞苟鑾峰彇涓婚敭ID + var orderId = BaseDal.AddData(order); + LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "娣诲姞绯荤粺鍑哄簱鍗曞苟鑾峰彇涓婚敭ID", orderId); + + // 10 . 绯荤粺鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D + orderDetails.ForEach(item => { item.OutOrderId = orderId; }); + LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "绯荤粺鍑哄簱鍗曟槑缁嗙粦瀹氫富琛↖D", orderId); + + // 11. 娣诲姞绯荤粺鍑哄簱鍗曟槑缁嗗苟杩斿洖缁撴灉 + content = _outOrderDtailService.AddData(orderDetails); + LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "娣诲姞绯荤粺鍑哄簱鍗曟槑缁嗗苟杩斿洖缁撴灉", content.Status); + + if (content.Status && transferId > 0 && detailAddResult > 0 && orderId > 0) + { + LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "鎵�鏈夋搷浣滄墽琛屽畬鎴愭彁浜や簨鍔�", "鏃犲弬鏁�"); + _unitOfWorkManage.CommitTran(); // 鎻愪氦浜嬪姟 + } + else + { + LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, "娣诲姞鏁版嵁搴撳け璐�,璇锋鏌ユ暟鎹槸鍚︽纭�", $"绯荤粺鍑哄簱鍗曟槑缁�:{content.Status},娣诲姞绯荤粺鍑哄簱鍗�:{orderId > 0},鐢熶骇鍑哄簱鍗�:{transferId > 0},鐢熶骇鍑哄簱鍗曟槑缁�:{detailAddResult > 0}"); + throw new Exception("娣诲姞璋冩嫧鍑哄簱鍗�"); + } + return content; + } + catch (Exception ex) + { + _unitOfWorkManage.RollbackTran(); // 鍥炴粴浜嬪姟 + LogFactory.GetLog("娣诲姞璋冩嫧鍑哄簱鍗�").InfoFormat(true, $"绯荤粺寮傚父锛屽紓甯镐俊鎭細{ex.Message}", "鏃犲弬鏁�"); + return content.Error(ex.Message); + } + } + + /// <summary> + /// 鏍规嵁鍑哄簱鍗曞彿鏌ヨ鍑哄簱璁㈠崟 + /// </summary> + /// <param name="orderNumber">鍑哄簱鍗曞彿</param> + /// <returns>鍑哄簱璁㈠崟</returns> + public WebResponseContent GetOutOrderByNumber(string orderNumber) + { + WebResponseContent content = new WebResponseContent(); + var order = Db.Queryable<Dt_OutOrder>() + .Includes(x => x.OrderDetailList) + .Where(x => x.OrderNumber == orderNumber).First(); + if (order == null) + content.Error($"璁㈠崟缂栧彿{orderNumber}鏌ヨ涓虹┖"); + else + content.OK("鏌ヨ鎴愬姛", order); + return content; + } + + /// <summary> + /// 鏍规嵁璁㈠崟鍒嗛厤鍑哄簱搴撳瓨 + /// </summary> + /// <param name="orderNo">璁㈠崟缂栧彿</param> + /// <returns></returns> + public async Task<WebResponseContent> GetOutboundStockAsync(string orderNo) + { + WebResponseContent content = new WebResponseContent(); + try + { + // 鑾峰彇璁㈠崟 + var order = await BaseDal.GetOutOrderByNumberAsync(orderNo); + LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "鏍规嵁璁㈠崟缂栧彿鑾峰彇璁㈠崟鏁版嵁", JsonConvert.SerializeObject(order)); + + // 妫�鏌ヨ鍗曟槸鍚﹁幏鍙栨垚鍔� + if (order == null) + { + return content.Error("鑾峰彇璁㈠崟澶辫触"); + } + + // 鑾峰彇璁㈠崟涓殑绗竴涓墿鏂欑紪鍙� + var materielInfo = await _materielInfoRepository.QueryFirstAsync(x => x.MaterielID == order.OrderDetailList.MaterialId); + LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "鑾峰彇璁㈠崟鐗╂枡缂栧彿", JsonConvert.SerializeObject(materielInfo)); + + #region 鍏堝叆鍏堝嚭 + + // 鑾峰彇璇ョ墿鏂欐墍鏈夊彲鍑哄簱搴撳瓨 + var filteredStocks = _billGroupStockRepository.GetOutboundStockList(materielInfo.MaterielCode) + .OrderBy(x => x.CreateDate).ToList(); + LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "鑾峰彇璇ョ墿鏂欐墍鏈夊彲鍑哄簱搴撳瓨", JsonConvert.SerializeObject(filteredStocks)); + + #endregion 鍏堝叆鍏堝嚭 + + #region 鏌ユ壘闈犺繎鍑哄簱鍙e簱瀛� + + // 榛樿鍒楄秺澶ц秺闈犺繎鍑哄簱鍙� + filteredStocks = filteredStocks.OrderByDescending(x => x.LocationInfo.Column).OrderBy(x => x.CreateDate).ToList(); + + #endregion 鏌ユ壘闈犺繎鍑哄簱鍙e簱瀛� + + #region 涓�娣变綅浼樺厛鏌ユ壘锛屽啀鏌ユ壘鍚屽垪浜屾繁浣� + + filteredStocks = PickStocks(filteredStocks); + + #endregion 涓�娣变綅浼樺厛鏌ユ壘锛屽啀鏌ユ壘鍚屽垪浜屾繁浣� + + // 鍒涘缓浠诲姟鍒楄〃 + var (tasks, updateOrder, stock) = CreateTasks(order, filteredStocks); + LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "鍒涘缓浠诲姟鍒楄〃锛屼慨鏀硅鍗曞垎閰嶆暟閲忥紝鑾峰彇鍑哄簱鍒嗛厤搴撳瓨", + $"浠诲姟鍒楄〃:{JsonConvert.SerializeObject(tasks)},璁㈠崟鍒楄〃锛歿JsonConvert.SerializeObject(updateOrder)},宸插垎閰嶅簱瀛橈細{JsonConvert.SerializeObject(stock)}"); + + // 鏇存柊搴撳瓨鐘舵�� + var stockList = UpdateStocks(stock); + LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "鏇存柊搴撳瓨鐘舵��", JsonConvert.SerializeObject(stockList)); + + // 鍒涘缓璁㈠崟搴撳瓨鍒楄〃 + List<Dt_OutOrderAndStock>? orderStocks = CreateOrderStock(stock, updateOrder); + LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "鍒涘缓璁㈠崟搴撳瓨鍒楄〃", JsonConvert.SerializeObject(orderStocks)); + + // 寮�濮嬩簨鍔� + _unitOfWorkManage.BeginTran(); + + // 鏇存柊搴撳瓨 + var isStockUpdated = _billGroupStockRepository.UpdateNavStock(stockList); + LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "浜嬪姟鏇存柊搴撳瓨", isStockUpdated); + + // 鏇存柊璁㈠崟 + var isOrderUpdated = await BaseDal.OutOrderUpdatedAsync(updateOrder); + LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "浜嬪姟鏇存柊璁㈠崟", isOrderUpdated); + + //娣诲姞璁㈠崟搴撳瓨 + var isOrderStockCread = await _outOrderAndStockRepository.AddDataAsync(orderStocks) > 0; + LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "浜嬪姟娣诲姞璁㈠崟搴撳瓨", isOrderStockCread); + + // 鍒涘缓浠诲姟 + var isTaskCreated = await _taskRepository.Create(tasks); + LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "浜嬪姟鍒涘缓浠诲姟", isTaskCreated); + + // 鎻愪氦鎴栧洖婊氫簨鍔� + if (isStockUpdated && isTaskCreated && isOrderUpdated && isOrderStockCread) + { + LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "鏁版嵁澶勭悊瀹屾垚锛屾彁浜や簨鍔�", "鏃犲弬鏁�"); + _unitOfWorkManage.CommitTran(); + } + else + { + LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, "娣诲姞鏁版嵁搴撳け璐�,璇锋鏌ユ暟鎹槸鍚︽纭�,鏁版嵁鍥炴粴", $"鏇存柊搴撳瓨:{isStockUpdated},鏇存柊璁㈠崟:{isOrderUpdated},娣诲姞璁㈠崟搴撳瓨:{isOrderStockCread},鍒涘缓浠诲姟:{isTaskCreated}"); + _unitOfWorkManage.RollbackTran(); + throw new Exception("娣诲姞鏁版嵁搴撳け璐�,璇锋鏌ユ暟鎹槸鍚︽纭�,鏁版嵁鍥炴粴"); + } + + return content.OK(data: orderStocks); + } + catch (Exception ex) + { + _unitOfWorkManage.RollbackTran(); + LogFactory.GetLog("鍑哄簱鍒嗛厤骞跺垱寤轰换鍔�").InfoFormat(true, $"绯荤粺寮傚父锛屽紓甯镐俊鎭細{ex.Message}", "鏃犲弬鏁�"); + return content.Error(ex.Message); + } + } + + /// <summary> + /// 淇敼鍑哄簱璁㈠崟锛堝鑸慨鏀癸級 + /// </summary> + /// <param name="outOrder"></param> + /// <returns>鏄惁鎴愬姛</returns> + public async Task<bool> OutOrderUpdatedAsync(Dt_OutOrder outOrder) + { + return await BaseDal.OutOrderUpdatedAsync(outOrder); + } + + #region 鍐呴儴璋冪敤 + + /// <summary> + /// 涓�娣变綅浼樺厛鏌ユ壘 + /// </summary> + /// <param name="filteredStocks">鍙嚭搴撳簱瀛�</param> + /// <returns>鎺掑簭濂界殑鍑哄簱搴撳瓨</returns> + public List<Dt_BillGroupStock> PickStocks(List<Dt_BillGroupStock> filteredStocks) + { + var oneDepthList = filteredStocks.Where(x => x.LocationInfo.Depth == "涓�娣变綅").ToList(); + var twoDepthList = filteredStocks.Where(x => x.LocationInfo.Depth == "浜屾繁浣�").ToList(); + + var results = new List<Dt_BillGroupStock>(); + foreach (var oneDepth in oneDepthList) + { + // 灏� Line 瀛楃涓茶浆鎹负鏁存暟 + if (!int.TryParse(oneDepth.LocationInfo.Line, out int oneDepthLine)) + { + continue; // 濡傛灉杞崲澶辫触锛岃烦杩囪繖涓褰� + } + + // 璁$畻鐩稿琛� + int relativeLine = oneDepthLine % 2 == 1 ? oneDepthLine + 1 : oneDepthLine - 1; + + // 鏌ユ壘鏈�鎺ヨ繎鐨勪簩娣变綅璁板綍 + var closestTwoDepth = twoDepthList + .Where(t => t.LocationInfo.Line == relativeLine.ToString()) + .Where(x => x.LocationInfo.Column == oneDepth.LocationInfo.Column) + .Where(x => x.LocationInfo.Layer == oneDepth.LocationInfo.Layer) + .FirstOrDefault(); + + // 濡傛灉鎵惧埌浜嗘渶鎺ヨ繎鐨勪簩娣变綅璁板綍锛屽皢鍏朵笌涓�娣变綅涓�璧锋坊鍔犲埌缁撴灉鍒楄〃 + if (closestTwoDepth != null) + { + results.Add(oneDepth); + results.Add(closestTwoDepth); + } + else + { + // 濡傛灉娌℃湁鎵惧埌鏈�鎺ヨ繎鐨勪簩娣变綅璁板綍锛屽皢涓�娣变綅娣诲姞鍒扮粨鏋滃垪琛� + results.Add(oneDepth); + } + } + return results; + } + + #endregion 鍐呴儴璋冪敤 + + #region 绉佹湁鏂规硶 + + #region 鐢熶骇鍑哄簱鍗� + + /// <summary> + /// 鏍规嵁涓绘暟鎹瀯寤虹敓浜у嚭搴撳崟瀵硅薄銆� + /// </summary> + private Dt_OutOrderProduction CreateProductionOrder(Dictionary<string, object> mainData) + { + return new Dt_OutOrderProduction + { + OrderNumber = mainData.GetValueOrDefault("OrderNumber")?.ToString(), + WarehouseId = mainData.GetValueOrDefault("WarehouseId")?.ObjToInt() ?? 0, + Status = (int)OutOrderTypeEnum.Issue, + Remarks = mainData.GetValueOrDefault("Remarks")?.ToString(), + CreateID = 1, + Creater = mainData.GetValueOrDefault("Creater")?.ToString(), + CreateDate = mainData.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now, + OrderDate = mainData.GetValueOrDefault("OrderDate")?.ObjToDate() ?? DateTime.Now, + }; + } + + /// <summary> + /// 鏍规嵁鏄庣粏鏁版嵁鍜岀敓浜у嚭搴撳崟ID鏋勫缓鐢熶骇鍑哄簱鍗曟槑缁嗗垪琛ㄣ�� + /// </summary> + private List<Dt_OutOrderProductionDetail> CreateProductionDetails(List<Dictionary<string, object>> detailData) + { + var details = new List<Dt_OutOrderProductionDetail>(); + foreach (var item in detailData) + { + var detail = new Dt_OutOrderProductionDetail + { + MaterialId = item.GetValueOrDefault("MaterialId")?.ObjToInt() ?? 0, + Quantity = item.GetValueOrDefault("Quantity")?.ObjToInt() ?? 0, + Remarks = item.GetValueOrDefault("Remarks")?.ToString(), + CreateDate = item.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now, + Creater = item.GetValueOrDefault("Creater")?.ToString(), + CreateID = 1, + BatchNumber = item.GetValueOrDefault("BatchNumber")?.ToString(), + }; + details.Add(detail); + } + return details; + } + + /// <summary> + /// 鏍规嵁鐢熶骇鍑哄簱鍗曞璞″拰鐢熶骇鍑哄簱鍗旾D鏋勫缓绯荤粺鍑哄簱鍗曞璞°�� + /// </summary> + private Dt_OutOrder CreateSystemOrder(Dt_OutOrderProduction production) + { + return new Dt_OutOrder + { + Status = production.Status, + CreateDate = DateTime.Now, + Creater = production.Creater, + OrderDate = DateTime.Now, + OrderNumber = production.OrderNumber, + Remarks = production.Remarks, + CreateID = 1, + WarehouseId = production.WarehouseId, + }; + } + + /// <summary> + /// 鏍规嵁鐢熶骇鍑哄簱鍗曟槑缁嗗垪琛ㄥ拰绯荤粺鍑哄簱鍗旾D鏋勫缓绯荤粺鍑哄簱鍗曟槑缁嗗垪琛ㄣ�� + /// </summary> + private List<Dt_OutOrderDetail> CreateSystemOrderDetails(List<Dt_OutOrderProductionDetail> productionDetails) + { + var orderDetails = new List<Dt_OutOrderDetail>(); + foreach (var item in productionDetails) + { + var detail = new Dt_OutOrderDetail + { + AllocatedQuantity = 0, + BatchNumber = item.BatchNumber, + CompletedQuantity = 0, + CreateDate = item.CreateDate, + Creater = item.Creater, + MaterialId = item.MaterialId, + OutboundQuantity = item.Quantity, + Remarks = item.Remarks, + CreateID = 1, + MaterialName = item.Remarks // 鐗╂枡鍚嶇О + }; + orderDetails.Add(detail); + } + return orderDetails; + } + + #endregion 鐢熶骇鍑哄簱鍗� + + #region 璋冩嫧鍑哄簱鍗� + + /// <summary> + /// 鏍规嵁涓绘暟鎹瀯寤鸿皟鎷ㄥ嚭搴撳崟瀵硅薄銆� + /// </summary> + private Dt_OutOrderTransfer CreateTransferOrder(Dictionary<string, object> mainData) + { + return new Dt_OutOrderTransfer + { + OrderNumber = mainData.GetValueOrDefault("OrderNumber")?.ToString(), + SourceWarehouseId = mainData.GetValueOrDefault("SourceWarehouseId")?.ObjToInt() ?? 0, + DestinationWarehouseId = mainData.GetValueOrDefault("WarehouseId")?.ObjToInt() ?? 0, + Status = (int)OutOrderTypeEnum.Allocate, + CreateID = 1, + Remarks = mainData.GetValueOrDefault("Remarks")?.ToString(), + Creater = mainData.GetValueOrDefault("Creater")?.ToString(), + CreateDate = mainData.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now, + OrderDate = mainData.GetValueOrDefault("OrderDate")?.ObjToDate() ?? DateTime.Now, + }; + } + + /// <summary> + /// 鏍规嵁鏄庣粏鏁版嵁鍜岃皟鎷ㄥ嚭搴撳崟ID鏋勫缓璋冩嫧鍑哄簱鍗曟槑缁嗗垪琛ㄣ�� + /// </summary> + private List<Dt_OutOrderTransferDetail> CreateTransferDetails(List<Dictionary<string, object>> detailData) + { + var details = new List<Dt_OutOrderTransferDetail>(); + foreach (var item in detailData) + { + var detail = new Dt_OutOrderTransferDetail + { + MaterialId = item.GetValueOrDefault("MaterialId")?.ObjToInt() ?? 0, + Quantity = item.GetValueOrDefault("Quantity")?.ObjToInt() ?? 0, + Remarks = item.GetValueOrDefault("Remarks")?.ToString(), + CreateDate = item.GetValueOrDefault("CreateDate")?.ObjToDate() ?? DateTime.Now, + Creater = item.GetValueOrDefault("Creater")?.ToString(), + CreateID = 1, + BatchNumber = item.GetValueOrDefault("BatchNumber")?.ToString(), + }; + details.Add(detail); + } + return details; + } + + /// <summary> + /// 鏍规嵁鐢熶骇鍑哄簱鍗曞璞″拰鐢熶骇鍑哄簱鍗旾D鏋勫缓绯荤粺鍑哄簱鍗曞璞°�� + /// </summary> + private Dt_OutOrder CreateSystemOrder(Dt_OutOrderTransfer transfer) + { + return new Dt_OutOrder + { + Status = transfer.Status, + CreateDate = DateTime.Now, + Creater = transfer.Creater, + CreateID = 1, + OrderDate = DateTime.Now, + OrderNumber = transfer.OrderNumber, + Remarks = transfer.Remarks, + WarehouseId = transfer.SourceWarehouseId, + }; + } + + /// <summary> + /// 鏍规嵁鐢熶骇鍑哄簱鍗曟槑缁嗗垪琛ㄥ拰绯荤粺鍑哄簱鍗旾D鏋勫缓绯荤粺鍑哄簱鍗曟槑缁嗗垪琛ㄣ�� + /// </summary> + private List<Dt_OutOrderDetail> CreateSystemOrderDetails(List<Dt_OutOrderTransferDetail> transferDetails) + { + var orderDetails = new List<Dt_OutOrderDetail>(); + foreach (var item in transferDetails) + { + var detail = new Dt_OutOrderDetail + { + AllocatedQuantity = 0, + BatchNumber = item.BatchNumber, + CompletedQuantity = 0, + CreateDate = item.CreateDate, + Creater = item.Creater, + CreateID = 1, + MaterialId = item.MaterialId, + OutboundQuantity = item.Quantity, + Remarks = item.Remarks, + MaterialName = item.Remarks // 鐗╂枡鍚嶇О + }; + orderDetails.Add(detail); + } + return orderDetails; + } + + #endregion 璋冩嫧鍑哄簱鍗� + + #region 鍑哄簱鍒嗛厤 + + /// <summary> + /// 鍒涘缓浠诲姟鍒楄〃 + /// </summary> + /// <param name="order">璁㈠崟瀵硅薄</param> + /// <param name="filteredStocks">绛涢�夊悗鐨勫簱瀛樺垪琛�</param> + /// <returns>銆愪换鍔″垪琛�,鏇存柊鍒嗛厤鏁伴噺璁㈠崟,鍒涘缓浠诲姟鐨勫簱瀛樸��</returns> + private (List<Dt_Task>, Dt_OutOrder, List<Dt_BillGroupStock>) CreateTasks(Dt_OutOrder order, List<Dt_BillGroupStock> filteredStocks) + { + var tasks = new List<Dt_Task>(); + var stocks = new List<Dt_BillGroupStock>(); + + foreach (var stock in filteredStocks) + { + // 濡傛灉宸插垎閰嶆暟閲忚揪鍒板嚭搴撴暟閲忥紝鍋滄鍒嗛厤 + if (order.OrderDetailList.AllocatedQuantity >= order.OrderDetailList.OutboundQuantity) + break; + + // 濡傛灉鎵樼洏浠诲姟宸插瓨鍦紝璺宠繃 + if (_taskRepository.QueryFirst(x => x.PalletCode == stock.PalletCode) != null) + continue; + + // 鍒涘缓浠诲姟 + tasks.Add(new Dt_Task + { + CreateDate = DateTime.Now, // 鍒涘缓鏃堕棿 + Creater = App.User.UserName, // 鍒涘缓浜� + CurrentAddress = stock.LocationCode, //褰撳墠浣嶇疆 + Dispatchertime = DateTime.Now, //璋冨害鏃堕棿锛堜换鍔′笅鍙戞椂闂达級 + Grade = 1, // 绛夌骇 + InboundNo = stock.OrderNo, //鍗曟嵁缂栧彿 + MaterialNo = stock.MaterialNo, // 鐗╂枡鍙� + NextAddress = stock.LocationCode, // 涓嬩竴浣嶇疆 + PalletCode = stock.PalletCode, //鎵樼洏鍙� + Remark = stock.Remark, //澶囨敞 + Roadway = stock.LocationInfo.Roadway, //宸烽亾 + SourceAddress = stock.LocationCode, //鏉ユ簮浣嶇疆 + TargetAddress = order.OrderDetailList.Remarks, //鐩爣鍦板潃 + TaskNum = _taskRepository.GetTaskNo().Result, //浠诲姟鍙� + TaskState = (int)OutTaskStatusEnum.OutNew, //浠诲姟鐘舵�� + TaskType = (int)TaskTypeEnum.Outbound, //浠诲姟绫诲瀷 + }); + + // 鏇存柊宸插垎閰嶆暟閲� + order.OrderDetailList.AllocatedQuantity += stock.Dt_BillGroupStockDetailList.Sum(x => x.PalletQuantity).Value; + stocks.Add(stock); + } + + return (tasks, order, stocks); + } + + /// <summary> + /// 鏇存柊搴撳瓨鐘舵�� + /// </summary> + /// <param name="filteredStocks">绛涢�夊悗鐨勫簱瀛樺垪琛�</param> + /// <returns>鏇存柊鍚庣殑搴撳瓨鍒楄〃</returns> + private List<Dt_BillGroupStock> UpdateStocks(List<Dt_BillGroupStock> filteredStocks) + { + var updatedStocks = new List<Dt_BillGroupStock>(); + + foreach (var stock in filteredStocks) + { + // 鏇存柊搴撳瓨鐘舵�� + stock.LocationInfo.IsLocked = true; + stock.LocationInfo.Status = (int)LocationEnum.Lock; + stock.State = (int)StockStateEmun.鍑哄簱閿佸畾; + updatedStocks.Add(stock); + } + + return updatedStocks; + } + + /// <summary> + /// 鍒涘缓璁㈠崟搴撳瓨鍒楄〃 + /// </summary> + /// <param name="stock">绛涢�夊悗鐨勫簱瀛樺垪琛�</param> + /// <param name="order">璁㈠崟瀵硅薄</param> + /// <returns>璁㈠崟搴撳瓨鍒楄〃</returns> + private List<Dt_OutOrderAndStock> CreateOrderStock(List<Dt_BillGroupStock> stock, Dt_OutOrder order) + { + var orderStocks = new List<Dt_OutOrderAndStock>(); + foreach (var item in stock) + { + orderStocks.Add(new Dt_OutOrderAndStock() + { + AllocatedQuantity = order.OrderDetailList.AllocatedQuantity, + MaterialNo = item.MaterialNo, + MaterialName = order.OrderDetailList.MaterialName, + OrderNumber = order.OrderNumber, + OutboundQuantity = order.OrderDetailList.OutboundQuantity, + PalletCode = item.PalletCode, + PalletQuantity = item.Dt_BillGroupStockDetailList.Sum(x => x.PalletQuantity), + State = item.State, + BatchNumber = order.OrderDetailList.BatchNumber, + CompletedQuantity = order.OrderDetailList.CompletedQuantity, + Creater = App.User.UserName, + CreateDate = DateTime.Now, + CreateID = App.User.UserId, + GroupId = item.GroupId, + LocationCode = item.LocationInfo.LocationCode, + OutOrderId = order.Id, + }); + } + + return orderStocks; + } + + #endregion 鍑哄簱鍒嗛厤 + + #endregion 绉佹湁鏂规硶 +} \ No newline at end of file -- Gitblit v1.9.3