duyongjia
2024-12-23 430404d69be9b5d420ad12b9ac087508f1fa2aca
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/Service/InboundOrderService.cs
@@ -46,65 +46,104 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                List<MatSerialNumberDTO> matSerialNumberDTOs = CodeAnalysisHelper.CodeAnalysis<MatSerialNumberDTO>(AnalysisCode.InnerCode, materielGroupDTO.SerialNumbers);
                (bool, string, object?) result2 = ModelValidate.ValidateModelData(matSerialNumberDTOs);
                if (!result2.Item1) return content = WebResponseContent.Instance.Error(result2.Item2);
                List<string> materielCodes = matSerialNumberDTOs.GroupBy(x => x.MaterielCode).Select(x => x.Key).ToList();
                List<Dt_MaterielInfo> materielInfos = _basicService.MaterielInfoService.GetMaterielInfos(materielCodes);
                Dt_InboundOrder inboundOrder = GetInboundOrder(materielGroupDTO.OrderNo);
                Dt_StockInfo? stockInfo = _stockService.StockInfoService.GetStockByPalletCode(materielGroupDTO.PalletCode);
                (bool, string, object?) result = CheckMaterielGroupParam(materielGroupDTO, matSerialNumberDTOs, materielInfos, materielCodes, inboundOrder, stockInfo);
                (bool, string, object?) result = CheckMaterielGroupParam(materielGroupDTO, stockInfo);
                if (!result.Item1) return content = WebResponseContent.Instance.Error(result.Item2);
                if (stockInfo == null)
                {
                    stockInfo = new Dt_StockInfo();
                    stockInfo.Details = new List<Dt_StockInfoDetail>();
                }
                List<Dt_StockInfoDetail> stockInfoDetails = _mapper.Map<List<Dt_StockInfoDetail>>(matSerialNumberDTOs);
                stockInfoDetails.ForEach(x =>
                {
                    x.Status = 0;
                    x.OrderNo = inboundOrder.OrderNo;
                    x.MaterielName = materielInfos.FirstOrDefault(v => v.MaterielCode == x.MaterielCode)?.MaterielName ?? "";
                    x.StockId = stockInfo.Id != 0 ? stockInfo.Id : 0;
                });
                if (stockInfo.Id == 0)
                {
                    stockInfo.PalletCode = materielGroupDTO.PalletCode;
                    stockInfo.StockStatus = StockStatusEmun.组盘暂存.ObjToInt();
                    stockInfo.Creater = "System";
                    stockInfo.Details = new List<Dt_StockInfoDetail>();
                }
                List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
                List<Dt_LabelMaster> notExistLabels = new List<Dt_LabelMaster>();
                foreach (var lablel in materielGroupDTO.SerialNumbers)
                {
                    Dt_LabelMaster labmaster = _labelMasterRepository.QueryFirst(x => x.LABEL_NO == lablel);
                    if(labmaster == null)
                    {
                        //通过条码接口同步条码主数据
                        _sys_JobService.GetLabMaster(lablel);
                        labmaster = _labelMasterRepository.QueryFirst(x => x.LABEL_NO == lablel);
                        if (labmaster == null)
                        {
                            notExistLabels.Add(labmaster);
                        }
                    }
                }
                if (notExistLabels.Count == 0)
                {
                    foreach (var item in materielGroupDTO.SerialNumbers)
                    {
                        Dt_LabelMaster labmaster = _labelMasterRepository.QueryFirst(x => x.LABEL_NO == item);
                        Dt_StockInfoDetail dt_StockInfoDetail = new Dt_StockInfoDetail();
                        dt_StockInfoDetail.Status = 0;
                        dt_StockInfoDetail.OrderNo = materielGroupDTO.OrderNo;
                        dt_StockInfoDetail.StockId = stockInfo.Id != 0 ? stockInfo.Id : 0;
                        dt_StockInfoDetail.MaterielCode = labmaster.MATNR;
                        dt_StockInfoDetail.MaterielName = labmaster.MAKTX;
                        dt_StockInfoDetail.BatchNo = labmaster.BATCH;
                        dt_StockInfoDetail.SerialNumber = labmaster.LABEL_NO;
                        dt_StockInfoDetail.StockQuantity = int.Parse(labmaster.BOX_QTY);
                        dt_StockInfoDetail.OutboundQuantity = 0;
                        dt_StockInfoDetail.Creater = "System";
                        stockInfoDetails.Add(dt_StockInfoDetail);
                stockInfo.Details.AddRange(stockInfoDetails);
                    }
                    content = MaterielGroupUpdateData(stockInfo);
                List<Dt_InboundOrderDetail> inboundOrderDetails = new List<Dt_InboundOrderDetail>();
                for (int i = 0; i < materielCodes.Count; i++)
                {
                    decimal stockQuantity = stockInfoDetails.Where(x => x.MaterielCode == materielCodes[i]).Sum(x => x.StockQuantity);
                    inboundOrderDetails.AddRange(_inboundOrderDetailService.UpdateReceiptQuantity(inboundOrder.Details.Where(x => x.MaterielCode == materielCodes[i]).ToList(), stockQuantity));
                }
                List<int> updateDetailIds = inboundOrderDetails.Select(x => x.Id).ToList();
                if (inboundOrderDetails.FirstOrDefault(x => x.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()) == null && inboundOrder.Details.FirstOrDefault(x => !updateDetailIds.Contains(x.Id) && x.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()) == null)
                {
                    inboundOrder.OrderStatus = InboundStatusEnum.入库完成.ObjToInt();
                    BaseDal.DeleteAndMoveIntoHty(inboundOrder, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成);
                    for (int i = 0; i < inboundOrderDetails.Count; i++)
                    {
                        _inboundOrderDetailService.Repository.DeleteAndMoveIntoHty(inboundOrderDetails[i], App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成);
                    }
                }
                else if (inboundOrder.OrderStatus == InboundStatusEnum.未开始.ObjToInt())
                {
                    inboundOrder.OrderStatus = InboundStatusEnum.入库中.ObjToInt();
                }
                content = MaterielGroupUpdateData(inboundOrder, inboundOrderDetails, stockInfo);
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            }
            finally
            {
            }
            return content;
        }
        /// <summary>
        /// æ’¤é”€ç»„盘
        /// </summary>
        /// <param name="materielGroupDTO"></param>
        /// <returns></returns>
        public WebResponseContent MaterielGroupRevoke(string PalletCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_StockInfo? stockInfo = _stockService.StockInfoService.GetStockByPalletCode(PalletCode);
                if(stockInfo != null)
                {
                    if(stockInfo.StockStatus!= (int)StockStatusEmun.组盘暂存)
                    {
                        return content = WebResponseContent.Instance.Error("组盘暂存状态才可以撤销组盘!");
                    }
                    else
                    {
                        stockInfo.StockStatus = (int)StockStatusEmun.组盘撤销;
                        foreach (var item in stockInfo.Details)
                        {
                            item.Status = (int)OutStockStatus.撤销;
                        }
                    }
                    content = MaterielGroupUpdateData(stockInfo);
                }
                else
                {
                    return content = WebResponseContent.Instance.Error("组盘信息不存在!");
                }
            }
            catch (Exception ex)
            {
@@ -141,6 +180,30 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// ç»„盘数据更新
        /// </summary>
        /// <param name="inboundOrder">入库单</param>
        /// <param name="inboundOrderDetails">入库单明细</param>
        /// <param name="stockInfo">组盘数据</param>
        /// <returns></returns>
        public WebResponseContent MaterielGroupUpdateData(Dt_StockInfo stockInfo)
        {
            try
            {
                _unitOfWorkManage.BeginTran();
                _stockService.StockInfoService.AddMaterielGroup(stockInfo);
                _unitOfWorkManage.CommitTran();
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        /// <summary>
        /// éªŒè¯ç»„盘数据
@@ -219,6 +282,38 @@
            return (true, "成功", materielGroupDTO);
        }
        /// <summary>
        /// éªŒè¯ç»„盘数据
        /// </summary>
        /// <param name="materielGroupDTO">物料组盘DTO</param>
        /// <param name="stockInfo">组盘信息</param>
        /// <returns></returns>
        public (bool, string, object?) CheckMaterielGroupParam(MaterielGroupDTO materielGroupDTO, Dt_StockInfo stockInfo)
        {
            (bool, string, object?) result = ModelValidate.ValidateModelData(materielGroupDTO);
            if (!result.Item1) return result;
            if (_taskRepository.QueryFirst(x => x.PalletCode == materielGroupDTO.PalletCode) != null)
            {
                return (false, "该托盘号已有任务", materielGroupDTO);
            }
            if (stockInfo != null && !string.IsNullOrEmpty(stockInfo.LocationCode) && stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt())
            {
                return (false, "已上架的托盘不能再次组盘", materielGroupDTO);
            }
            if (_stockService.StockInfoDetailService.ExistSerialNumbers(materielGroupDTO.SerialNumbers))
            {
                return (false, "有序列号在库存中已存在", materielGroupDTO);
            }
            return (true, "成功", materielGroupDTO);
        }
        /// <summary>
        /// PDA分页查询数据
        /// </summary>