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; 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 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)); #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) 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(); var qty = inventoryInfo.SupplyQuantity - inventoryInfo.StockQuantity; if (orderQty != qty) throw new Exception($"盘亏出库数量不一致,上传数量【{orderQty}】,库存盘亏数量【{qty}】"); inventoryInfo.StockQuantity = inventoryInfo.SupplyQuantity; inventoryInfo.SupplyQuantity = 0; inventoryInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt(); 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.SupplyQuantity = 0; batchesUp.Add(inventory_Batch); orderDetail.OotDetailStatus = "已完成"; 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); _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) throw new Exception($"未找到订单号【{request.externalOrderNo}】物料编号【{detail.productCode}】的出库任务"); if (supplyTask.StockQuantity != orderQty) 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; } } }