wankeda
2026-01-19 e83c793bebdb1b9ecdcd79fab8d83fd167baa817
WMS/WIDESEA_WMSServer/WIDESEA_InboundService/Base/InboundOrderService.cs
@@ -213,6 +213,7 @@
                        Wlstatus = (int)InventoryMaterialStatus.合格,
                        Mgeneratetime = DateTime.Now,
                        WarehouseId = warehouse.WarehouseId,
                        System = inboundOrder.System,
                        Details = new List<Dt_StockInfoDetail>()
                    };
                }
@@ -332,6 +333,205 @@
                    _stockRepository.StockInfoRepository.Db.UpdateNav(stockInfo).Include(x => x.Details, new UpdateNavOptions() { OneToManyInsertOrUpdate = true }).ExecuteCommand();
                }
                _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetails);
                _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
                _unitOfWorkManage.CommitTran();
                content.OK();
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            finally
            {
            }
            return content;
        }
        //药水,低温仓组盘
        public WebResponseContent NewMaterielGroup(SaveModel saveModel)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                var orderNo = saveModel.MainData["orderNo"].ToString();
                var palletCode = saveModel.MainData["palletCode"].ToString();
                var warehouseId = saveModel.MainData["warehouseId"].ObjToInt();
                var Initiallife = saveModel.MainData["initiallife"].ObjToInt();
                List<string> serialNumbers = new List<string>();
                List<decimal> quantitys = new List<decimal>();
                foreach (var item in saveModel.DelKeys)
                {
                    string json = JsonConvert.SerializeObject(item);
                    Dictionary<string, object> delKeyDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
                    if (delKeyDict.TryGetValue("serialNumber", out object serialNumberObj))
                    {
                        string serialNumber = serialNumberObj?.ToString();
                        if (!string.IsNullOrEmpty(serialNumber))
                        {
                            serialNumbers.Add(serialNumber);
                        }
                        else
                        {
                            return WebResponseContent.Instance.Error("serialNumber的值为空");
                        }
                    }
                    if (delKeyDict.TryGetValue("quantity", out object quantityObj))
                    {
                        if (quantityObj == null)
                        {
                            return WebResponseContent.Instance.Error("物料数量的值为空");
                        }
                        decimal quantity;
                        try
                        {
                            quantity = Convert.ToDecimal(quantityObj);
                        }
                        catch
                        {
                            return WebResponseContent.Instance.Error($"物料数量{quantityObj}无法转换为数字");
                        }
                        if (quantity <= 0)
                        {
                            return WebResponseContent.Instance.Error("物料数量必须大于0");
                        }
                        quantitys.Add(quantity);
                    }
                    else
                    {
                        return WebResponseContent.Instance.Error("缺少物料数量字段");
                    }
                }
                Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == warehouseId);
                if (warehouse == null)
                {
                    return WebResponseContent.Instance.Error($"未找到该仓库信息");
                }
                Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.OrderNo == orderNo && x.WarehouseId == warehouse.WarehouseId).Includes(x => x.Details).First();
                if (inboundOrder == null)
                {
                    return WebResponseContent.Instance.Error($"未找到入库单信息");
                }
                if (inboundOrder.Details == null || inboundOrder.Details.Count <= 0)
                {
                    return WebResponseContent.Instance.Error($"未找到入库单明细信息");
                }
                List<MatSerNumAnalysisModel> models = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serialNumbers);
                //验证判断时间格式
                WebResponseContent IsValidContent = IsValidMCDates(models);
                if (!IsValidContent.Status)
                {
                    return content.Error(IsValidContent.Message);
                }
                string materielCode = models.FirstOrDefault()?.MaterielCode ?? "";
                Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode);
                if (materielInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到该物料的信息");
                }
                decimal beforeQuantity = 0;
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
                if (stockInfo == null)
                {
                    stockInfo = new Dt_StockInfo()
                    {
                        BatchNo ="",
                        PalletCode = palletCode,
                        PalletType = GetPalletType(warehouse, palletCode),//GetPalletType(warehouse, palletCode)
                        IsFull = true,
                        StockStatus = (int)StockStatusEmun.组盘暂存,
                        Creater = "WMS",
                        CreateDate = DateTime.Now,
                        MaterialType = (int)InventoryMaterialType.原材料,
                        Materialweight = 0,
                        Wlstatus = (int)InventoryMaterialStatus.合格,
                        Mgeneratetime = DateTime.Now,
                        WarehouseId = warehouse.WarehouseId,
                        System = inboundOrder.System,
                        Details = new List<Dt_StockInfoDetail>()
                    };
                }
                else
                {
                    return WebResponseContent.Instance.Error($"托盘号重复,该托盘已组过物料");
                }
                List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
                foreach (var model in models)
                {
                    Dt_InboundOrderDetail notGroupDetail = new Dt_InboundOrderDetail();
                    notGroupDetail = inboundOrder.Details.Where(x => x.OrderDetailStatus <= OrderDetailStatusEnum.Inbounding.ObjToInt() && x.MaterielCode == model.MaterielCode && x.BatchNo == model.LotNo).FirstOrDefault();
                    if (notGroupDetail == null)
                    {
                        return WebResponseContent.Instance.Error($"该物料在该入库单中已全部组盘完成");
                    }
                    Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
                    {
                        MaterielCode = notGroupDetail.MaterielCode,
                        MaterielName = notGroupDetail.MaterielName,
                        OrderNo = inboundOrder.OrderNo,
                        BatchNo = notGroupDetail.BatchNo,
                        LinId = notGroupDetail.LinId,
                        StockQuantity = model.Quantity,
                        Status = (int)StockStatusEmun.组盘暂存,
                        Creater = "WMS",
                        CreateDate = DateTime.Now,
                        Id = notGroupDetail.LinId.ObjToInt(),
                        DeliveryNote = model.DeliveryNote,
                        SupplierBatch = notGroupDetail.SupplierBatch,
                        MaterieSpec = notGroupDetail.MaterieSpec,
                        OrinalLocation = notGroupDetail.OrinalLocation
                    };
                    if (stockInfo.Id > 0)
                    {
                        stockInfoDetail.StockId = stockInfo.Id;
                    }
                    stockInfo.Details.Add(stockInfoDetail);
                    stockInfoDetails.Add(stockInfoDetail);
                    decimal decimalReceiptQuantity = Convert.ToDecimal(notGroupDetail.ReceiptQuantity);
                    decimal decimalModelQuantity = Convert.ToDecimal(notGroupDetail.OrderQuantity);
                    decimal decimalOrderQuantity = Convert.ToDecimal(notGroupDetail.OrderQuantity);
                    decimalReceiptQuantity += model.Quantity;
                    // 检查是否超出订单数量
                    if (decimalReceiptQuantity > decimalOrderQuantity)
                    {
                        return WebResponseContent.Instance.Error($"组盘数量溢出{decimalReceiptQuantity - decimalOrderQuantity}");
                    }
                    // 转回float类型存储,但比较和计算都使用decimal完成
                    notGroupDetail.ReceiptQuantity = Convert.ToDecimal(decimalReceiptQuantity);
                    if (notGroupDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
                    {
                        notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
                    }
                }
                decimal totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
                inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt();
                _unitOfWorkManage.BeginTran();
                if (stockInfo.Id == 0)
                {
                    _stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand();
                }
                else
                {
                    _stockRepository.StockInfoRepository.Db.UpdateNav(stockInfo).Include(x => x.Details, new UpdateNavOptions() { OneToManyInsertOrUpdate = true }).ExecuteCommand();
                }
                _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrder.Details);
                _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
                _unitOfWorkManage.CommitTran();
                content.OK();
@@ -524,6 +724,7 @@
                        Wlstatus = (int)InventoryMaterialStatus.合格,
                        Mgeneratetime = DateTime.Now,
                        WarehouseId = warehouse.WarehouseId,
                        System = inboundOrder.System,
                        Details = new List<Dt_StockInfoDetail>()
                    };
                }
@@ -671,10 +872,46 @@
                {
                    throw new Exception("库存未找到托盘号");
                }
                var sameItems = from sourceItem in stockInfo.Details
                                join targetItem in targetstockInfo.Details
                                on new
                                {
                                    sourceItem.BatchNo,
                                    sourceItem.MaterielName,
                                    sourceItem.MaterielCode
                                }
                                equals new
                                {
                                    targetItem.BatchNo,
                                    targetItem.MaterielName,
                                    targetItem.MaterielCode
                                }
                                select new
                                {
                                    SourceItem = sourceItem,
                                    TargetItem = targetItem,
                                    BatchNo = sourceItem.BatchNo,
                                    MaterialCode = sourceItem.MaterielCode,
                                    MaterialType = sourceItem.MaterielName
                                };
                var matchedSourceItemIds = sameItems.Select(x => x.SourceItem.Id).ToList();
                foreach (var item in stockInfo.Details)
                {
                    item.StockId = targetstockInfo.Id;
                    if (!matchedSourceItemIds.Contains(item.Id))
                    {
                        item.StockId = targetstockInfo.Id;
                    }
                }
                var differentItems = stockInfo.Details
      .Where(x => !matchedSourceItemIds.Contains(x.Id))
      .ToList();
                targetstockInfo.Details = targetstockInfo.Details
      .Where(x => !matchedSourceItemIds.Contains(x.Id))
      .Concat(differentItems)
      .ToList();
                if (warehouse.WarehouseCode == "SC02_CP")
                {
                    warehouse.WarehouseCode = "SC01_CP";
@@ -707,21 +944,6 @@
                        }).ToList()
                            }
                    }
                    //    Parameters = stockInfo.Details.Select(g => new HouseSyncretism.data
                    //    {
                    //        Lpn = stockInfo.PalletCode,
                    //        MoveType = 0,
                    //        WareHouseCode = warehouse.WarehouseCode,
                    //        ItemCode = g.MaterielCode,
                    //        MoveNumber = g.StockQuantity,
                    //        //LotNo = g.,
                    //        WipBatch = g.BatchNo,
                    //        LocationName = stockInfo.PalletCode,
                    //        TargetLocName = targetstockInfo.PalletCode,
                    //        TargetLpn = targetstockInfo.PalletCode,
                    //    }).ToList()
                    //};
                };
                var authResult = AuthenticateWithWMS();
                if (authResult.IsSuccess)
@@ -734,7 +956,6 @@
                                            };
                    var response = HttpHelper.Post<MomRequestContent>(ReceiveWMSTaskin, houseSyncretism, "立库入库数量回传WMS");
                    // 判断Success的值
                    if (!response.Success)
                    {
                        throw new Exception($"操作失败: {response.Message ?? "未提供错误信息"}");
@@ -742,10 +963,16 @@
                }
                _unitOfWorkManage.BeginTran();
                targetstockInfo.Details.AddRange(stockInfo.Details);
                foreach (var sameItem in sameItems)
                {
                    sameItem.TargetItem.StockQuantity += sameItem.SourceItem.StockQuantity;
                    _stockRepository.StockInfoDetailRepository.UpdateData(sameItem.TargetItem);
                    _stockRepository.StockInfoDetailRepository.DeleteData(sameItem.SourceItem);
                }
                _stockRepository.StockInfoRepository.UpdateData(targetstockInfo);
                _stockRepository.StockInfoDetailRepository.UpdateData(stockInfo.Details);
                _stockRepository.StockInfoDetailRepository.UpdateData(targetstockInfo.Details);
                _stockRepository.StockInfoRepository.DeleteData(stockInfo);
                _unitOfWorkManage.CommitTran();
                webResponseContent = WebResponseContent.Instance.OK("合托成功");
            }
@@ -1049,6 +1276,7 @@
                            if (inboundOrderDetailOld != null)
                            {
                                inboundOrderDetailOld.OrderQuantity += item.OrderQuantity;
                                inboundOrderDetailOld.OrderDetailStatus = OrderDetailStatusEnum.Inbounding.ObjToInt();
                                _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetailOld);
                            }
                            else