| | |
| | | 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 |
| | | { |
| | |
| | | /// <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", |
| | |
| | | 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> |
| | | /// 盘点差异数量回传 |
| | |
| | | return (true, "成功"); |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 根据托盘条码,起点位置,生成入库信息 |
| | | /// </summary> |