using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static WIDESEA_DTO.SquareCabin.TowcsDto; using WIDESEA_Core; using WIDESEA_Model.Models; using WIDESEA_Common.StockEnum; using WIDESEA_Common.TaskEnum; using WIDESEA_Core.Enums; using WIDESEA_ISquareCabinServices; using WIDESEA_Core.Helper; using WIDESEA_Common; using static WIDESEA_DTO.SquareCabin.OrderDto; namespace WIDESEA_SquareCabinServices { public partial class DeliveryOrderServices { public WebResponseContent CompleteLKOutOrder(Dt_DeliveryOrder deliveryOrder, EdiOrderCallbackRequest request) { WebResponseContent content = new WebResponseContent(); try { List cabinOrderDetailsUp = new List(); List supplyTask_Hties = new List(); List infosUp = new List(); List batchesUp = new List(); List infosDel = new List();//添加删除 List batchesDel = new List(); List materielInfos = _materielInfoService.Repository.QueryData(x => deliveryOrder.Details.Select(x => x.Goods_no).ToList().Contains(x.MaterielCode)); List inventoryInfos = _inventoryInfoService.Repository.QueryData(x => deliveryOrder.Warehouse_no == x.WarehouseCode && deliveryOrder.Details.Select(x => x.Goods_no).ToList().Contains(x.MaterielCode)); List inventory_Batches = _inventory_BatchServices.Repository.QueryData(x => deliveryOrder.Details.Select(x => x.Goods_no).ToList().Contains(x.MaterielCode)); List MaterieInfoBusiness =new List(); #region 盘亏出库单 if (deliveryOrder.Out_type == "6") { try { foreach (var detail in request.details) { Dt_DeliveryOrderDetail? orderDetail = deliveryOrder.Details.FirstOrDefault(x => x.Goods_no == detail.productCode && x.Batch_num == detail.batchNo); if (orderDetail == null) { _messageInfoService.AddMessageInfo(MessageGroupByEnum.OutOrderAlarm, "盘亏出库单", $"未找到盘点单【{deliveryOrder.Out_no}】物料编号【{detail.productCode}】物料批次【{detail.batchNo}】的明细信息"); throw new Exception($"未找到盘点单【{deliveryOrder.Out_no}】物料编号【{detail.productCode}】物料批次【{detail.batchNo}】的明细信息"); } decimal orderQty = detail.orderDetails?.Sum(x => decimal.TryParse(x.quantity, out var q) ? Math.Abs(q) : 0) ?? 0; Dt_InventoryInfo inventoryInfo = inventoryInfos.Where(x => x.MaterielCode == detail.productCode && x.BatchNo == detail.batchNo).First(); if (orderQty != Math.Abs(inventoryInfo.SupplyQuantity)) { _messageInfoService.AddMessageInfo(MessageGroupByEnum.OutOrderAlarm, "盘亏出库单", $"盘亏出库数量不一致,上传数量【{orderQty}】,库存盘亏数量【{Math.Abs(inventoryInfo.SupplyQuantity)}】"); throw new Exception($"盘亏出库数量不一致,上传数量【{orderQty}】,库存盘亏数量【{Math.Abs(inventoryInfo.SupplyQuantity)}】"); } //添加物料信息中的立库业务库存信息 var mater = materielInfos.FirstOrDefault(x => x.MaterielCode == detail.productCode); if (mater != null) { mater.Business_qty += inventoryInfo.SupplyQuantity; MaterieInfoBusiness.Add(mater); } inventoryInfo.StockQuantity += inventoryInfo.SupplyQuantity; inventoryInfo.AvailableQuantity = inventoryInfo.StockQuantity; inventoryInfo.SupplyQuantity = 0; inventoryInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt(); // 检查库存是否为0,如果是则标记为删除 if (inventoryInfo.StockQuantity <= 0) infosDel.Add(inventoryInfo); else infosUp.Add(inventoryInfo); //infosUp.Add(inventoryInfo); //库存批次 Dt_Inventory_Batch inventory_Batch = inventory_Batches.First(x => x.MaterielCode == inventoryInfo.MaterielCode && x.BatchNo == inventoryInfo.BatchNo); inventory_Batch.StockQuantity += inventory_Batch.SupplyQuantity; inventory_Batch.AvailableQuantity = inventory_Batch.StockQuantity; inventory_Batch.SupplyQuantity = 0; batchesUp.Add(inventory_Batch); orderDetail.OotDetailStatus = "已完成"; orderDetail.Order_Outqty = orderQty; //完成数量 if (inventory_Batch.StockQuantity<=0) batchesDel.Add(inventory_Batch); else batchesUp.Add(inventory_Batch); cabinOrderDetailsUp.Add(orderDetail); #region 添加盘亏出库任务 Dt_SupplyTask_Hty supplyTask_Hty = new Dt_SupplyTask_Hty() { WarehouseCode = inventoryInfo.WarehouseCode, OperateType = OperateTypeEnum.自动完成.ToString(), InsertTime = DateTime.Now, TaskStatus = SupplyStatusEnum.OutFinish.ObjToInt(), BatchNo = inventoryInfo.BatchNo, MaterielName = inventoryInfo.MaterielName, MaterielCode = inventoryInfo.MaterielCode, MaterielSpec = inventoryInfo.MaterielSpec, TaskType = TaskTypeEnum.ChenckOut.ObjToInt(), CreateDate = DateTime.Now, Creater = App.User.UserName, LocationCode = inventoryInfo.LocationCode, OrderNo = deliveryOrder.Out_no, StockQuantity = orderQty, SupplyQuantity = 0, Remark = "盘亏出库" }; supplyTask_Hties.Add(supplyTask_Hty); #endregion } deliveryOrder.OutStatus = "已完成"; //从所有出库明细中,筛选出那些不在已完成列表中的明细项 if (deliveryOrder.Details.Where(x => !cabinOrderDetailsUp.Select(x => x.Id).Contains(x.Id)).Any()) deliveryOrder.OutStatus = "开始"; _unitOfWorkManage.BeginTran(); _supplyTaskHtyService.AddData(supplyTask_Hties); _inventoryInfoService.UpdateData(infosUp); _inventory_BatchServices.UpdateData(batchesUp); _deliveryOrderDetailServices.UpdateData(cabinOrderDetailsUp); BaseDal.UpdateData(deliveryOrder); //添加物料信息中的立库业务库存信息 _materielInfoService.UpdateData(MaterieInfoBusiness); _unitOfWorkManage.CommitTran(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); throw new Exception(ex.Message); } } #endregion else { List supplyTasks = _supplyTaskService.Repository.QueryData(x => deliveryOrder.Details.Select(x => x.Goods_no).ToList().Contains(x.MaterielCode) && x.OrderNo == request.externalOrderNo && x.WarehouseCode == deliveryOrder.Warehouse_no && x.TaskStatus == SupplyStatusEnum.NewOut.ObjToInt()); foreach (var detail in request.details) { decimal orderQty = detail.orderDetails?.Sum(x => decimal.TryParse(x.quantity, out var q) ? Math.Abs(q) : 0) ?? 0; Dt_SupplyTask? supplyTask = supplyTasks.FirstOrDefault(x => x.MaterielCode == detail.productCode && x.BatchNo == detail.batchNo); if (supplyTask == null) { _messageInfoService.AddMessageInfo(MessageGroupByEnum.OutOrderAlarm, "出库单", $"未找到订单号【{request.externalOrderNo}】物料编号【{detail.productCode}】的出库任务"); throw new Exception($"未找到订单号【{request.externalOrderNo}】物料编号【{detail.productCode}】的出库任务"); } if (supplyTask.StockQuantity != orderQty) { _messageInfoService.AddMessageInfo(MessageGroupByEnum.OutOrderAlarm, "出库单", $"订单号【{request.orderNo}】物料编号【{detail.productCode}】的出库数量与出库任务数量不相等"); throw new Exception($"订单号【{request.orderNo}】物料编号【{detail.productCode}】的出库数量与出库任务数量不相等"); } //处理出库单、库存信息、出库任务、调拨任务 content = OutTaskFinish(supplyTask, deliveryOrder); if (!content.Status) throw new Exception(content.Message); } } content.OK(); } catch (Exception ex) { content.Error(ex.Message); } return content; } } }