wangxinhui
2026-01-12 ded9c653b4bd5f45cb23124068687135c29e6915
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Inbound.cs
@@ -41,29 +41,24 @@
        /// <param name="stationCode"></param>
        /// <param name="palletCode"></param>
        /// <returns></returns>
        public WebResponseContent DeviceRequestInboundTaskSimple(string stationCode, string palletCode)
        public WebResponseContent DeviceRequestInboundTaskSimple(string stationCode)
        {
            try
            {
                Dt_Task task = Repository.QueryFirst(x => x.PalletCode == palletCode);
                Dt_Task task = Repository.QueryFirst(x => x.PalletCode == stationCode);
                if (task != null)
                {
                    PushTasksToWCS(new List<Dt_Task> { task });
                    return WebResponseContent.Instance.OK($"该托盘已生成任务", _mapper.Map<WMSTaskDTO>(task));
                }
                Dt_ProStockInfo stockInfo = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == palletCode);
                Dt_ProStockInfo stockInfo = BaseDal.Db.Queryable<Dt_ProStockInfo>().Where(x => x.PalletCode == stationCode).Includes(x => x.proStockInfoDetails).First(); ;
                if (stockInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到组盘信息");
                }
                if (stockInfo.StockStatus != StockStatusEmun.MES余料退库.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.MES空托退库.ObjToInt())
                if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"该托盘状态不正确,不可申请入库");
                }
                if (!string.IsNullOrEmpty(stockInfo.LocationCode))
                {
                    return WebResponseContent.Instance.Error($"该托盘已绑定货位");
                }
                Dt_Task newTask = new Dt_Task()
@@ -71,35 +66,28 @@
                    CurrentAddress = stationCode,
                    Grade = 0,
                    NextAddress = "",
                    PalletCode = palletCode,
                    PalletCode = stationCode,
                    Roadway = "",
                    SourceAddress = stationCode,
                    TargetAddress = "",
                    TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                    TaskType = TaskTypeEnum.InProduct.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = stockInfo.WarehouseId,
                    PalletType = stockInfo.PalletType,
                };
                if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt())
                stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
                stockInfo.proStockInfoDetails.ForEach(x =>
                {
                    stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt();
                }
                else
                {
                    stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
                }
                    x.ProStockDetailStatus = StockStatusEmun.入库确认.ObjToInt();
                });
                _unitOfWorkManage.BeginTran();
                int taskId = BaseDal.AddData(newTask);
                newTask.TaskId = taskId;
                _stockRepository.ProStockInfoRepository.UpdateData(stockInfo);
                _stockRepository.ProStockInfoDetailRepository.UpdateData(stockInfo.proStockInfoDetails);
                _unitOfWorkManage.CommitTran();
                WMSTaskDTO wMSTaskDTO = _mapper.Map<WMSTaskDTO>(newTask);
                PushTasksToWCS(new List<Dt_Task> { newTask });
                if (newTask.WarehouseId == 5) PutFinish(stationCode, newTask.PalletCode, newTask.TaskNum.ToString());
                return WebResponseContent.Instance.OK(data: wMSTaskDTO);
            }
            catch (Exception ex)
@@ -372,7 +360,7 @@
                    stockInfoOld.IsPick = WhetherEnum.False.ObjToInt();
                }
                decimal stockLength = bSTStockInfoDTO.StockMeter;
                if (weight != bSTStockInfoDTO.Qty)
                if (weight != bSTStockInfoDTO.Qty && weight < stockInfoOld.InitialWeight)
                {
                    Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterialSourceId == stockInfoOld.MaterielId);
                    int gramWeight = (int)(materielInfo.MaterielWeight * 1000);
@@ -393,13 +381,13 @@
                        throw new Exception($"上报称重失败");
                    }
                    stockLength = weight / bSTStockInfoDTO.W / gramWeight * 1000000;
                    stockInfoOld.IsFull = WhetherEnum.True.ObjToInt();
                    stockInfoOld.MaterielWeight = weight;
                }
                stockInfoOld.StockStatus = StockStatusEmun.老厂退库.ObjToInt();
                stockInfoOld.MaterielThickness = bSTStockInfoDTO.Thick;
                stockInfoOld.MaterielWeight = weight;
                stockInfoOld.MaterielWide = bSTStockInfoDTO.W;
                stockInfoOld.StockLength = stockLength;
                stockInfoOld.IsFull = WhetherEnum.True.ObjToInt();
                stockInfoOld.StockOutLength = 0;
                stockInfoOld.WarehouseId = WarehouseEnum.LLDYL.ObjToInt();
                if (thickness < 400)
@@ -672,6 +660,7 @@
                            MaterielThickness = bSTStockInfoDTO.Thick,
                            MaterielWide = bSTStockInfoDTO.W,
                            MaterielWeight = bSTStockInfoDTO.Qty,
                            InitialWeight = bSTStockInfoDTO.Qty,
                            MaterielCode = materielInfo.MaterielCode,
                            MaterielName = materielInfo.MaterielName,
                            StockLength = bSTStockInfoDTO.StockMeter,
@@ -757,6 +746,7 @@
                                MaterielThickness = purchaseBSTOrderDetail.MaterialThick,
                                MaterielWide = purchaseBSTOrderDetail.MaterialWide,
                                MaterielWeight = purchaseBSTOrderDetail.DeliveryQty,
                                InitialWeight=purchaseBSTOrderDetail.DeliveryQty,
                                MaterielCode = materielInfo.MaterielCode,
                                MaterielName = materielInfo.MaterielName,
                                StockLength = purchaseBSTOrderDetail.ProcurementLength,
@@ -1004,6 +994,28 @@
                        _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfo.proStockInfoDetails);
                        _basicService.LocationInfoService.UpdateLocationStatus(locationInfoEnd, proStockInfo.PalletType, LocationStatusEnum.InStock, proStockInfo.WarehouseId);
                        BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成);
                        if (task.TaskType==TaskTypeEnum.InProduct.ObjToInt())
                        {
                            ERPProInUpModel proInUpModel = new ERPProInUpModel();
                            List<PB_INV_PRODUCT_INItem> pRODUCT_INItems = new List<PB_INV_PRODUCT_INItem>();
                            foreach (var item in proStockInfo.proStockInfoDetails)
                            {
                                PB_INV_PRODUCT_INItem pB_INV_PRODUCT_INItem = new PB_INV_PRODUCT_INItem()
                                {
                                    WP_ID=item.LotNumber.ObjToInt(),
                                    INV_BARCODE=item.ProductNo,
                                    QTY=(int)item.StockQty,
                                    REMARK="成品入库"
                                };
                                pRODUCT_INItems.Add(pB_INV_PRODUCT_INItem);
                            }
                            proInUpModel.PB_INV_PRODUCT_IN= pRODUCT_INItems;
                            string request = _invokeERPService.ERPProInUp(proInUpModel) ?? throw new Exception("成品入库接口请求失败");
                            if (!request.Contains("Success"))
                            {
                                throw new Exception($"成品入库失败");
                            }
                        }
                        _unitOfWorkManage.CommitTran();
                        _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(proStockInfo, 0, proStockInfo.proStockInfoDetails.Sum(x => x.StockQty), StockChangeTypeEnum.Inbound);
                    }
@@ -1022,7 +1034,7 @@
                    }
                    //获取货位信息
                    Dt_LocationInfo locationInfoEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                    if (locationInfoEnd == null && task.TaskType!=TaskTypeEnum.WFBLMYLBackInbound.ObjToInt() && task.TaskType != TaskTypeEnum.WFBYLInbound.ObjToInt())
                    if (locationInfoEnd == null && task.TaskType!=TaskTypeEnum.WFBBackInbound.ObjToInt() && task.TaskType != TaskTypeEnum.WFBLMYLBackInbound.ObjToInt() && task.TaskType != TaskTypeEnum.WFBYLInbound.ObjToInt())
                    {
                        return content.Error($"未找到对应的终点货位信息");
                    }
@@ -1034,7 +1046,7 @@
                        Dt_LocationInfo locationInfoStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                        _basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
                    }
                    if (task.TaskType != TaskTypeEnum.WFBLMYLBackInbound.ObjToInt() && task.TaskType != TaskTypeEnum.WFBYLInbound.ObjToInt())
                    if (task.TaskType != TaskTypeEnum.WFBLMYLBackInbound.ObjToInt() && task.TaskType != TaskTypeEnum.WFBBackInbound.ObjToInt() && task.TaskType != TaskTypeEnum.WFBYLInbound.ObjToInt())
                    {
                        stockInfo.LocationCode = locationInfoEnd.LocationCode;
                    }
@@ -1838,16 +1850,24 @@
                if (AddMESProInOrders.Where(x => x.MESProOrderType == MaterielTypeEnum.半成品.ObjToInt()).Count() > 0)
                {
                    //生成半成品入库
                    WebResponseContent webResponse = PrintInbound(AddMESProInOrders.Where(x => x.MESProOrderType == MaterielTypeEnum.半成品.ObjToInt()).ToList());
                    WebResponseContent webResponse = SemiProInbound(AddMESProInOrders.Where(x => x.MESProOrderType == MaterielTypeEnum.半成品.ObjToInt()).ToList());
                    if (!webResponse.Status)
                    {
                        throw new Exception(webResponse.Message);
                    }
                    tasks = webResponse.Data as List<Dt_Task>;
                    WebResponseContent taskResponse = PushTasksToWCS(tasks);
                    if (taskResponse.Status)
                    if (!taskResponse.Status)
                    {
                        throw new Exception(taskResponse.Message);
                    }
                }
                if (AddMESProInOrders.Where(x => x.MESProOrderType == MaterielTypeEnum.成品.ObjToInt()).Count() > 0)
                {
                    WebResponseContent webResponse = PushPackaxisTaskToWCS(AddMESProInOrders.Where(x => x.MESProOrderType == MaterielTypeEnum.成品.ObjToInt()).ToList());
                    if (!webResponse.Status)
                    {
                        throw new Exception(webResponse.Message);
                    }
                }
                _unitOfWorkManage.CommitTran();
@@ -1862,9 +1882,9 @@
            return content;
        }
        /// <summary>
        /// å°åˆ·ä¸‹æ–™MES任务
        /// åŠæˆå“ä¸‹æ–™MES任务
        /// </summary>
        public WebResponseContent PrintInbound(List<Dt_MESProInOrderInfo> mESProInOrderInfos)
        public WebResponseContent SemiProInbound(List<Dt_MESProInOrderInfo> mESProInOrderInfos)
        {
            WebResponseContent content = new WebResponseContent();
            try
@@ -1879,11 +1899,16 @@
                List<Dt_Task> tasks = new List<Dt_Task>();
                //获取所有AGV点位
                List<Dt_AGVStationInfo> aGVStationInfos = _basicRepository.AGVStationInfoRepository.QueryData(x => !string.IsNullOrEmpty(x.MESPointCode));
                List<Dt_AGVStationInfo> _AGVStationInfos = new List<Dt_AGVStationInfo>();
                //根据半成品信息呼叫对应任务
                foreach (var item in mESProInOrderInfos)
                {
                    Dt_AGVStationInfo? CheckPointCode = aGVStationInfos.FirstOrDefault(x => x.MESPointCode == item?.PointCode);
                    Dt_MaterielInfo? materielInfo = materielInfos.FirstOrDefault(x => x.MaterielCode == item.MaterialCode);
                    if (CheckPointCode==null)
                    {
                        return content.Error($"未找到{item?.PointCode}点位");
                    }
                    if (materielInfo == null)
                    {
                        return content.Error("未找到物料信息");
@@ -1924,7 +1949,7 @@
                    //半成品入库任务
                    Dt_Task newTask = new Dt_Task()
                    {
                        CurrentAddress = CheckPointCode.AGVStationCode,
                        CurrentAddress = item.PointCode.StartsWith("YS") ? CheckPointCode.AGVStationCode : CheckPointCode.MESPointCode,
                        Grade = 0,
                        NextAddress = "",
                        PalletCode = item.BarCode,
@@ -1940,17 +1965,54 @@
                    TaskTypeEnum taskTypeEnum = CheckPointCode.StationArea switch
                    {
                        nameof(StationAreaEnum.一楼印刷) => TaskTypeEnum.PrintYLInbound,
                        nameof(StationAreaEnum.一楼分切) => TaskTypeEnum.PartOffInbound,
                        nameof(StationAreaEnum.一楼纸张淋膜) => TaskTypeEnum.PaperFilmInbound,
                        nameof(StationAreaEnum.一楼无纺淋膜) => TaskTypeEnum.WFBYLInbound,
                        _ => throw new Exception("未找到对应任务")
                    };
                    if (taskTypeEnum == TaskTypeEnum.WFBYLInbound)
                    {
                        Dt_AGVStationInfo? stationInfo = AssignWFBStation(_AGVStationInfos?.Select(x => x.AGVStationCode).ToList()) ?? throw new Exception("未找到可用无纺布暂存架");
                        newTask.NextAddress = stationInfo.AGVStationCode;
                        newTask.TargetAddress = stationInfo.AGVStationCode;
                        newTask.Roadway = "AGV";
                        stationInfo.IsOccupied = 1;
                        _AGVStationInfos.Add(stationInfo);
                    }
                    newTask.TaskType = taskTypeEnum.ObjToInt();
                    stockInfos.Add(stockInfo);
                    tasks.Add(newTask);
                }
                //操作入库数据
                BaseDal.AddData(tasks);
                _basicRepository.AGVStationInfoRepository.UpdateData(_AGVStationInfos);
                _stockRepository.StockInfoRepository.AddData(stockInfos);
                //推送任务
                content.OK("发送成功",data:tasks);
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// æŽ¨é€ç åž›æ•°æ®è‡³WCS
        /// </summary>
        /// <returns></returns>
        public WebResponseContent PushPackaxisTaskToWCS(List<Dt_MESProInOrderInfo> mESProInOrderInfos)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string url = AppSettings.Get("WCS");
                if (string.IsNullOrEmpty(url))
                {
                    throw new Exception($"未找到WCSAApi地址,请检查配置文件");
                }
                string response = HttpHelper.Post($"{url}/api/Packinfo/ReceivePackaxisTask", mESProInOrderInfos.Serialize());
                return JsonConvert.DeserializeObject<WebResponseContent>(response) ?? WebResponseContent.Instance.Error("返回错误");
            }
            catch (Exception ex)
            {
@@ -1974,5 +2036,56 @@
                throw new Exception(ex.Message);
            }
        }
        public WebResponseContent BoxingInBound(string stationCode,List<string> barCodes)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取成品库存
                Dt_ProStockInfo proStockInfoOld = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == stationCode);
                if (proStockInfoOld != null)
                {
                    return content.Error($"托盘{stationCode}已存在");
                }
                //获取条码信息
                List<Dt_MESProInOrderInfo> proInOrderInfos = _inboundRepository.MESProInOrderInfoRepository.QueryData(x=> barCodes.Contains(x.BarCode));
                Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x=>x.MaterielCode== proInOrderInfos.FirstOrDefault().MaterialCode);
                List<Dt_ProStockInfoDetail> proStockInfoDetails = new List<Dt_ProStockInfoDetail>();
                foreach (var item in proInOrderInfos)
                {
                    Dt_ProStockInfoDetail proStockInfoDetail = new Dt_ProStockInfoDetail()
                    {
                        ProductCode = materielInfo.MaterielCode,
                        ProductNo = item.BarCode,
                        ProductName = materielInfo.MaterielName,
                        ProductSpec = materielInfo.MaterielSpec,
                        LotNumber = item.ProcessNum.ToString(),
                        ProductUnit = materielInfo.MaterielUnit,
                        StockQty = item.ProQuantity,
                        ProStockDetailStatus = StockStatusEmun.组盘暂存.ObjToInt()
                    };
                    proStockInfoDetails.Add(proStockInfoDetail);
                }
                Dt_ProStockInfo proStockInfo = new Dt_ProStockInfo()
                {
                    PalletCode = stationCode,
                    ProInOrderNo = proInOrderInfos.FirstOrDefault().ProductOrderNo,
                    ProStockAttribute = materielInfo.MaterielSourceType,
                    PalletType = 1,
                    LocationCode = "",
                    WarehouseId = materielInfo.WarehouseId,
                    StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
                    proStockInfoDetails = proStockInfoDetails
                };
                BaseDal.Db.InsertNav(proStockInfo).Include(x => x.proStockInfoDetails).ExecuteCommand();
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}