1
wankeda
3 天以前 be438dd071400936c44a1425ec8d886f63c83329
WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/PartialTaskService_Inbound.cs
@@ -15,6 +15,9 @@
using static WIDESEA_Common.HouseInventoryIn;
using WIDESEA_Common;
using Parameter = WIDESEA_Common.Parameter;
using WIDESEA_Core.LogHelper;
using WIDESEA_DTO.Task;
using WIDESEA_Core.TaskEnum;
namespace WIDESEA_TaskInfoService
{
@@ -28,34 +31,60 @@
        /// <param name="stationCode">起始地址</param>
        /// <param name="palletCode">托盘编号</param>
        /// <returns>返回处理结果</returns>
        public WebResponseContent InboundRequest(SaveModel saveModel)
        public WebResponseContent InboundRequest(string stationCode, string roadwayNo, string palletCode)
        {
            string palletCode = saveModel.palletCode;
            if (saveModel.palletCode == null) return WebResponseContent.Instance.Error($"请输入正确托盘号");
            WebResponseContent content = new WebResponseContent();
            // 输入验证
            if (string.IsNullOrWhiteSpace(palletCode))
                return WebResponseContent.Instance.Error("请输入正确托盘号");
            try
            {
                Dt_InboundOrderDetail inboundOrderDet = BaseDal.Db.Queryable<Dt_InboundOrderDetail>().Where(x => x.LPNNo == palletCode).First();
                Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.Id == inboundOrderDet.OrderId).Includes(x => x.Details).First();
                if (inboundOrder == null)
                Dt_Task task = Repository.QueryFirst(x => x.PalletCode == palletCode);
                if (task != null)
                {
                    return WebResponseContent.Instance.Error($"未找到入库单信息");
                    PushTasksToWCS(new List<Dt_Task> { task });
                    return WebResponseContent.Instance.OK($"该托盘已生成任务", _mapper.Map<WMSTaskDTO>(task));
                }
                Dt_Warehouse warehouse = _basicService.WarehouseService.Repository.QueryFirst(x => x.WarehouseId == inboundOrder.WarehouseId);
                Dt_RoadwayInfo roadwayInfo = _basicService.RoadwayInfoService.Repository.QueryFirst(x => x.RoadwayNo == warehouse.WarehouseCode);
                if (roadwayInfo != null) { }
                // 获取入库单明细
                var inboundOrderDet = GetInboundOrderDetail(palletCode);
                if (inboundOrderDet == null)
                    return WebResponseContent.Instance.Error($"未找到托盘号 {palletCode} 对应的入库单明细");
                if (inboundOrder.Details == null || inboundOrder.Details.Count <= 0)
                // 获取入库单
                var inboundOrder = GetInboundOrder(inboundOrderDet.OrderId);
                if (inboundOrder == null)
                    return WebResponseContent.Instance.Error($"未找到入库单信息");
                // 验证入库单明细
                if (inboundOrder.Details == null || inboundOrder.Details.Count == 0)
                    return WebResponseContent.Instance.Error($"入库单 {inboundOrder.OrderNo} 没有明细信息");
                // 获取仓库和巷道信息
                var warehouse = GetWarehouse(inboundOrder.WarehouseId);
                var roadwayInfo = GetRoadwayInfo(warehouse.WarehouseCode);
                // 处理库存信息
                //var stockInfo = GetOrCreateStockInfo(palletCode, inboundOrder, inboundOrderDet, warehouse);
                var dt_StockInfoDetail = new Dt_StockInfoDetail
                {
                    return WebResponseContent.Instance.Error($"未找到入库单明细信息");
                }
                Dt_StockInfo stockInfo1 = BaseDal.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
                if (stockInfo1 == null)
                {
                    Dt_StockInfo dt_Stock = new()
                    //StockId = stockInfo.Id,
                    MaterielCode = inboundOrderDet.MaterielCode,
                    MaterielName = inboundOrderDet.MaterielName,
                    OrderNo = inboundOrder.OrderNo,
                    BatchNo = inboundOrderDet.BatchNo,
                    LinId = inboundOrderDet.LinId,
                    StockQuantity = inboundOrderDet.OrderQuantity,
                    Status = (int)StockStatusEmun.组盘暂存,
                    Creater = "WMS",
                    CreateDate = DateTime.Now,
                    Id = inboundOrderDet.LinId.ObjToInt(),
                };
                var dt_Stock = new Dt_StockInfo
                    {
                        BatchNo = inboundOrderDet.BatchNo,
                        PalletCode = palletCode,
                    PalletType = GetPalletType(warehouse, palletCode),
                        IsFull = true,
                        StockStatus = (int)StockStatusEmun.组盘暂存,
                        Creater = "WMS",
@@ -64,39 +93,290 @@
                        Materialweight = 0,
                        Wlstatus = (int)InventoryMaterialStatus.合格,
                        Mgeneratetime = DateTime.Now,
                    WarehouseId = warehouse.WarehouseId,
                    Details = new List<Dt_StockInfoDetail> { dt_StockInfoDetail }
                    };
                    _stockService.StockInfoService.Repository.AddData(dt_Stock);
                    Dt_StockInfo dt_StockInfo = _stockService.StockInfoService.Repository.GetStockInfo(palletCode);
                    Dt_StockInfoDetail dt_StockInfoDetail = new()
                // 检查入库请求
                var checkResult = CheckRequestInbound(roadwayInfo.InSCStationCode, palletCode, true, dt_Stock);
                if (!checkResult.Item1)
                    return WebResponseContent.Instance.Error(checkResult.Item2);
                // 分配库位并更新数据
                Dt_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(roadwayNo, dt_Stock.PalletType, dt_Stock.WarehouseId);
                //Dt_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(stationCode, TaskTypeEnum.Inbound.ObjToInt());
                if (locationInfo == null)
                    {
                        StockId = dt_StockInfo.Id,
                        MaterielCode = inboundOrderDet.MaterielCode,    //物料号
                        MaterielName = inboundOrderDet.MaterielName,    //物料名称
                        OrderNo = inboundOrder.OrderNo,        //物料详情
                        BatchNo = inboundOrderDet.BatchNo,         //物料批次
                        LinId = inboundOrderDet.LinId,                    //SerialNumber = targetCodes[2].ToString(),    //包号
                                                                          //BatchNoName = dt_Int.OrderNo,
                        StockQuantity = inboundOrderDet.OrderQuantity,    //重量
                                                                          //OutboundQuantity = 1,    //序列号
                    return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位");
                }
                Dt_Task newTask = new Dt_Task()
                {
                    CurrentAddress = stationCode,
                    Grade = 0,
                    NextAddress = locationInfo.LocationCode,
                    PalletCode = palletCode,
                    Roadway = roadwayNo,
                    SourceAddress = stationCode,
                    TargetAddress = locationInfo.LocationCode,
                    TaskType = TaskTypeEnum.Inbound.ObjToInt(),
                    TaskStatus = TaskStatusEnum.New.ObjToInt(),
                    WarehouseId = dt_Stock.WarehouseId,
                    PalletType = dt_Stock.PalletType,
                    Creater = "WMS",
                    CreateDate = DateTime.Now,
                };
                LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
                _unitOfWorkManage.BeginTran();
                Db.InsertNav(dt_Stock).Include(x => x.Details).ExecuteCommand();
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus.ObjToInt(), LocationStatusEnum.Lock.ObjToInt(), LocationChangeType.InboundAssignLocation.ObjToInt());
                //_basicService.LocationInfoService.UpdateLocationStatus(locationInfo, newTask.PalletType, LocationStatusEnum.Lock, newTask.WarehouseId);
                int taskId = BaseDal.AddData(newTask);
                newTask.TaskId = taskId;
                _stockRepository.StockInfoRepository.UpdateData(dt_Stock);
                _unitOfWorkManage.CommitTran();
                WMSTaskDTO wMSTaskDTO = _mapper.Map<WMSTaskDTO>(newTask);
                PushTasksToWCS(new List<Dt_Task> { newTask });
                if (newTask.WarehouseId == 5) PutFinish(stationCode);
                return WebResponseContent.Instance.OK(data: wMSTaskDTO);
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        private Dt_InboundOrderDetail GetInboundOrderDetail(string palletCode)
        {
            return BaseDal.Db.Queryable<Dt_InboundOrderDetail>()
                .Where(x => x.LPNNo == palletCode)
                .First();
        }
        private Dt_InboundOrder GetInboundOrder(int orderId)
        {
            return BaseDal.Db.Queryable<Dt_InboundOrder>()
                .Where(x => x.Id == orderId)
                .Includes(x => x.Details)
                .First();
        }
        private Dt_Warehouse GetWarehouse(int warehouseId)
        {
            return _basicService.WarehouseService.Repository
                .QueryFirst(x => x.WarehouseId == warehouseId);
        }
        private Dt_RoadwayInfo GetRoadwayInfo(string warehouseCode)
        {
            return _basicService.RoadwayInfoService.Repository
                .QueryFirst(x => x.RoadwayNo == warehouseCode);
        }
        private Dt_StockInfo GetOrCreateStockInfo(string palletCode, Dt_InboundOrder inboundOrder, Dt_InboundOrderDetail inboundOrderDet, Dt_Warehouse warehouse)
        {
            var stockInfo = BaseDal.Db.Queryable<Dt_StockInfo>()
                .Where(x => x.PalletCode == palletCode)
                .Includes(x => x.Details)
                .First();
            decimal beforeQuantity = 0;
            if (stockInfo == null)
            {
                stockInfo = CreateNewStockInfo(palletCode, inboundOrder, inboundOrderDet, warehouse);
                //CreateStockInfoDetail(stockInfo, inboundOrder, inboundOrderDet);
            }
            else
            {
                if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt())
                {
                    return null;
                }
                beforeQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
            }
            return stockInfo;
        }
        private Dt_StockInfo CreateNewStockInfo(string palletCode, Dt_InboundOrder inboundOrder, Dt_InboundOrderDetail inboundOrderDet, Dt_Warehouse warehouse)
        {
            var dt_StockInfoDetail = new Dt_StockInfoDetail
            {
                //StockId = stockInfo.Id,
                MaterielCode = inboundOrderDet.MaterielCode,
                MaterielName = inboundOrderDet.MaterielName,
                OrderNo = inboundOrder.OrderNo,
                BatchNo = inboundOrderDet.BatchNo,
                LinId = inboundOrderDet.LinId,
                StockQuantity = inboundOrderDet.OrderQuantity,
                        Status = (int)StockStatusEmun.组盘暂存,
                        Creater = "WMS",
                        CreateDate = DateTime.Now,
                        Id = inboundOrderDet.LinId.ObjToInt(),
                    };
            var dt_Stock = new Dt_StockInfo
            {
                BatchNo = inboundOrderDet.BatchNo,
                PalletCode = palletCode,
                PalletType = 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,
                Details = new List<Dt_StockInfoDetail> { dt_StockInfoDetail }
            };
            //_stockService.StockInfoService.Repository.AddData(dt_Stock);
            Db.InsertNav(dt_Stock).Include(x => x.Details).ExecuteCommand();
            return _stockService.StockInfoService.Repository.GetStockInfo(palletCode);
        }
        private void CreateStockInfoDetail(Dt_StockInfo stockInfo, Dt_InboundOrder inboundOrder, Dt_InboundOrderDetail inboundOrderDet)
        {
            var dt_StockInfoDetail = new Dt_StockInfoDetail
            {
                StockId = stockInfo.Id,
                MaterielCode = inboundOrderDet.MaterielCode,
                MaterielName = inboundOrderDet.MaterielName,
                OrderNo = inboundOrder.OrderNo,
                BatchNo = inboundOrderDet.BatchNo,
                LinId = inboundOrderDet.LinId,
                StockQuantity = inboundOrderDet.OrderQuantity,
                Status = (int)StockStatusEmun.组盘暂存,
                Creater = "WMS",
                CreateDate = DateTime.Now,
                Id = inboundOrderDet.LinId.ObjToInt(),
            };
                    _stockService.StockInfoDetailService.Repository.AddData(dt_StockInfoDetail);
                }
                Dt_StockInfo stockInfo = BaseDal.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
                (bool, string) result = CheckRequestInbound(roadwayInfo.InSCStationCode, palletCode, true, stockInfo);
                if (!result.Item1) return content = WebResponseContent.Instance.Error(result.Item2);
                content = AssignLocUpdateData(roadwayInfo.InSCStationCode, TaskTypeEnum.Inbound.ObjToInt(), palletCode, true, stockInfo, inboundOrder.OrderNo);
            }
            catch (Exception ex)
        //查询仓库托盘货物类型
        public int GetPalletType(Dt_Warehouse warehouse, string palletCode)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
            if (warehouse.WarehouseCode == WarehouseEnum.SC01_BC.ToString())
            {
                if (palletCode.Substring(0, 1) == "6")
                {
                    return PalletTypeEnum.MediumPallet.ObjToInt();
            }
            return content;
                else
                {
                    return PalletTypeEnum.LargestPallet.ObjToInt();
        }
            }
            else if (warehouse.WarehouseCode == WarehouseEnum.SC01_BC.ObjToString())
            {
                Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => x.CodeStartStr == palletCode.Substring(0, 1));
                if (palletTypeInfo == null)
                {
                    throw new Exception($"托盘号错误");
                }
                return palletTypeInfo.PalletType;
            }
            //else if (warehouse.WarehouseCode == WarehouseEnum.HA152.ObjToString())
            //{
            //    Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => x.CodeStartStr == palletCode.Substring(0, 2));
            //    if (palletTypeInfo == null)
            //    {
            //        throw new Exception($"托盘号错误");
            //    }
            //    return palletTypeInfo.PalletType;
            //}
            //else if (warehouse.WarehouseCode == WarehouseEnum.HA57.ObjToString())
            //{
            //    Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => x.CodeStartStr == palletCode.Substring(0, 3));
            //    if (palletTypeInfo == null)
            //    {
            //        throw new Exception($"托盘号错误");
            //    }
            //    return palletTypeInfo.PalletType;
            //}
            return -1;
        }
        #region
        //public WebResponseContent InboundRequest(SaveModel saveModel)
        //{
        //    string palletCode = saveModel.palletCode;
        //    if (saveModel.palletCode == null) return WebResponseContent.Instance.Error($"请输入正确托盘号");
        //    WebResponseContent content = new WebResponseContent();
        //    try
        //    {
        //        Dt_InboundOrderDetail inboundOrderDet = BaseDal.Db.Queryable<Dt_InboundOrderDetail>().Where(x => x.LPNNo == palletCode).First();
        //        Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.Id == inboundOrderDet.OrderId).Includes(x => x.Details).First();
        //        if (inboundOrder == null)
        //        {
        //            return WebResponseContent.Instance.Error($"未找到入库单信息");
        //        }
        //        Dt_Warehouse warehouse = _basicService.WarehouseService.Repository.QueryFirst(x => x.WarehouseId == inboundOrder.WarehouseId);
        //        Dt_RoadwayInfo roadwayInfo = _basicService.RoadwayInfoService.Repository.QueryFirst(x => x.RoadwayNo == warehouse.WarehouseCode);
        //        if (roadwayInfo != null) { }
        //        if (inboundOrder.Details == null || inboundOrder.Details.Count <= 0)
        //        {
        //            return WebResponseContent.Instance.Error($"未找到入库单明细信息");
        //        }
        //        Dt_StockInfo stockInfo1 = BaseDal.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
        //        if (stockInfo1 == null)
        //        {
        //            Dt_StockInfo dt_Stock = new()
        //            {
        //                BatchNo = inboundOrderDet.BatchNo,
        //                PalletCode = palletCode,
        //                IsFull = true,
        //                StockStatus = (int)StockStatusEmun.组盘暂存,
        //                Creater = "WMS",
        //                CreateDate = DateTime.Now,
        //                MaterialType = (int)InventoryMaterialType.成品,
        //                Materialweight = 0,
        //                Wlstatus = (int)InventoryMaterialStatus.合格,
        //                Mgeneratetime = DateTime.Now,
        //            };
        //            _stockService.StockInfoService.Repository.AddData(dt_Stock);
        //            Dt_StockInfo dt_StockInfo = _stockService.StockInfoService.Repository.GetStockInfo(palletCode);
        //            Dt_StockInfoDetail dt_StockInfoDetail = new()
        //            {
        //                StockId = dt_StockInfo.Id,
        //                MaterielCode = inboundOrderDet.MaterielCode,    //物料号
        //                MaterielName = inboundOrderDet.MaterielName,    //物料名称
        //                OrderNo = inboundOrder.OrderNo,        //物料详情
        //                BatchNo = inboundOrderDet.BatchNo,         //物料批次
        //                LinId = inboundOrderDet.LinId,                    //SerialNumber = targetCodes[2].ToString(),    //包号
        //                                                                  //BatchNoName = dt_Int.OrderNo,
        //                StockQuantity = inboundOrderDet.OrderQuantity,    //重量
        //                                                                  //OutboundQuantity = 1,    //序列号
        //                Status = (int)StockStatusEmun.组盘暂存,
        //                Creater = "WMS",
        //                CreateDate = DateTime.Now,
        //                Id = inboundOrderDet.LinId.ObjToInt(),
        //            };
        //            _stockService.StockInfoDetailService.Repository.AddData(dt_StockInfoDetail);
        //        }
        //        Dt_StockInfo stockInfo = BaseDal.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
        //        (bool, string) result = CheckRequestInbound(roadwayInfo.InSCStationCode, palletCode, true, stockInfo);
        //        if (!result.Item1) return content = WebResponseContent.Instance.Error(result.Item2);
        //        content = AssignLocUpdateData(roadwayInfo.InSCStationCode, TaskTypeEnum.Inbound.ObjToInt(), palletCode, true, stockInfo, inboundOrder.OrderNo);
        //    }
        //    catch (Exception ex)
        //    {
        //        content = WebResponseContent.Instance.Error(ex.Message);
        //    }
        //    return content;
        //}
        #endregion
        public string ReceiveWMSInventoryIn = WIDESEA_Core.Helper.AppSettings.Configuration["ReceiveWMSInventoryIn"];
        /// <summary>
        /// 盘点差异数量回传
@@ -290,6 +570,7 @@
            return (true, "成功");
        }
        /// <summary>
        /// 根据托盘条码,起点位置,生成入库信息
        /// </summary>