| | |
| | | public partial class TaskService |
| | | { |
| | | |
| | | /// <summary> |
| | | /// 仅申请任务,让WCS根据路由确定下一地址 |
| | | /// </summary> |
| | | /// <param name="stationCode"></param> |
| | | /// <param name="palletCode"></param> |
| | | /// <returns></returns> |
| | | public WebResponseContent DeviceRequestInboundTaskSimple(string stationCode, string palletCode) |
| | | { |
| | | try |
| | | { |
| | | Dt_Task task = Repository.QueryFirst(x => x.PalletCode == palletCode); |
| | | if (task != null) |
| | | { |
| | | PushTasksToWCS(new List<Dt_Task> { task }); |
| | | return WebResponseContent.Instance.OK($"该托盘已生成任务", _mapper.Map<WMSTaskDTO>(task)); |
| | | } |
| | | |
| | | if (Repository.QueryFirst(x => x.SourceAddress == stationCode && x.TaskStatus == TaskStatusEnum.New.ObjToInt()) != null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"该站点已有未执行的任务"); |
| | | } |
| | | Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First(); |
| | | var details = stockInfo.Details.FirstOrDefault(); |
| | | if (stockInfo == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"未找到组盘信息"); |
| | | } |
| | | if (!string.IsNullOrEmpty(stockInfo.LocationCode)) |
| | | { |
| | | return WebResponseContent.Instance.Error($"该托盘已绑定货位"); |
| | | } |
| | | Dt_RoadwayInfo roadwayInfo = _basicRepository.RoadwayInfoRepository.QueryFirst(x => x.InStationCode == stationCode); |
| | | if (roadwayInfo == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"未找到刚入库站台地址"); |
| | | } |
| | | Dt_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(roadwayInfo.RoadwayNo, stockInfo.PalletType, stockInfo.WarehouseId); |
| | | if (locationInfo == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位"); |
| | | } |
| | | |
| | | Dt_Task newTask = new Dt_Task() |
| | | { |
| | | CurrentAddress = "", |
| | | Grade = 0, |
| | | NextAddress = stationCode, |
| | | PalletCode = palletCode, |
| | | OrderNo = details.OrderNo, |
| | | Roadway = roadwayInfo.RoadwayNo, |
| | | SourceAddress = "", |
| | | TargetAddress = locationInfo.LocationCode, |
| | | TaskType = TaskTypeEnum.Inbound.ObjToInt(), |
| | | TaskStatus = TaskStatusEnum.New.ObjToInt(), |
| | | WarehouseId = stockInfo.WarehouseId, |
| | | PalletType = stockInfo.PalletType, |
| | | Creater = "WCS", |
| | | CreateDate = DateTime.Now |
| | | }; |
| | | string MaterielCode = stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).FirstOrDefault()?.MaterielCode; |
| | | float Quantity = (float)stockInfo.Details?.Where(x => x.StockId == stockInfo.Id).Sum(x => x.StockQuantity); |
| | | if (MaterielCode != null && Quantity != null) |
| | | { |
| | | newTask.MaterielCode = MaterielCode; |
| | | newTask.Quantity = (float)Quantity; |
| | | } |
| | | |
| | | //if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt()) |
| | | //{ |
| | | // stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt(); |
| | | //} |
| | | //else if (stockInfo.StockStatus == StockStatusEmun.MES退库.ObjToInt()) |
| | | //{ |
| | | // newTask.TaskType = TaskTypeEnum.MesMatReturn.ObjToInt(); |
| | | //} |
| | | //else if (stockInfo.StockStatus == StockStatusEmun.MES空托退库.ObjToInt()) |
| | | //{ |
| | | // Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => x.WarehouseId == stockInfo.WarehouseId && x.PalletType == stockInfo.PalletType); |
| | | // //todo 小托盘暂时未启用 |
| | | // if (palletTypeInfo.LocaitonCount == 2) |
| | | // { |
| | | // newTask.TaskType = TaskTypeEnum.MesPalletLargeReturn.ObjToInt(); |
| | | // } |
| | | // else |
| | | // { |
| | | // newTask.TaskType = TaskTypeEnum.MesPalletSmallReturn.ObjToInt(); |
| | | // } |
| | | //} |
| | | //else |
| | | //{ |
| | | stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt(); |
| | | locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt(); |
| | | //} |
| | | |
| | | _unitOfWorkManage.BeginTran(); |
| | | int taskId = BaseDal.AddData(newTask); |
| | | newTask.TaskId = taskId; |
| | | _stockRepository.StockInfoRepository.UpdateData(stockInfo); |
| | | _unitOfWorkManage.CommitTran(); |
| | | WMSTaskDTO wMSTaskDTO = _mapper.Map<WMSTaskDTO>(newTask); |
| | | |
| | | PushTasksToWCS(new List<Dt_Task> { newTask }); |
| | | return WebResponseContent.Instance.OK(data: wMSTaskDTO); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// 入库任务申请分配货位 |
| | | /// </summary> |
| | | /// <param name="taskNum">任务号</param> |
| | | /// <param name="roadwayNo">巷道号</param> |
| | | /// <returns></returns> |
| | | public WebResponseContent AssignInboundTaskLocation(int taskNum, string roadwayNo) |
| | | { |
| | | try |
| | | { |
| | | Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); |
| | | if (task == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"未找到该入库任务"); |
| | | } |
| | | |
| | | if (_basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == task.TargetAddress) != null) |
| | | { |
| | | return WebResponseContent.Instance.OK(data: task.TargetAddress); |
| | | } |
| | | |
| | | Dt_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(roadwayNo, task.PalletType, task.WarehouseId); |
| | | if (locationInfo == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位"); |
| | | } |
| | | |
| | | task.Roadway = roadwayNo; |
| | | task.TargetAddress = locationInfo.LocationCode; |
| | | |
| | | task.TaskStatus = TaskStatusEnum.SC_Execute.ObjToInt(); |
| | | |
| | | |
| | | |
| | | LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus; |
| | | |
| | | _unitOfWorkManage.BeginTran(); |
| | | //_recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, lastStatus, LocationStatusEnum.Lock, LocationChangeType.InboundAssignLocation); |
| | | //_basicService.LocationInfoService.UpdateLocationStatus(locationInfo, task.PalletType, LocationStatusEnum.Lock, task.WarehouseId); |
| | | BaseDal.UpdateData(task); |
| | | _unitOfWorkManage.CommitTran(); |
| | | return WebResponseContent.Instance.OK(data: locationInfo.LocationCode); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 立库入库指令上传 |
| | |
| | | var warehouse = GetWarehouse(inboundOrder.WarehouseId); |
| | | var roadwayInfo = GetRoadwayInfo(warehouse.WarehouseCode); |
| | | |
| | | // 处理库存信息 |
| | | //var stockInfo = GetOrCreateStockInfo(palletCode, inboundOrder, inboundOrderDet, 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 } |
| | | }; |
| | | |
| | | var dt_Stock = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == palletCode); |
| | | // 检查入库请求 |
| | | var checkResult = CheckRequestInbound(roadwayInfo.InSCStationCode, palletCode, true, dt_Stock); |
| | | if (!checkResult.Item1) |
| | |
| | | |
| | | Dt_Task newTask = new Dt_Task() |
| | | { |
| | | CurrentAddress = stationCode, |
| | | CurrentAddress = "", |
| | | Grade = 0, |
| | | NextAddress = locationInfo.LocationCode, |
| | | NextAddress = stationCode, |
| | | PalletCode = palletCode, |
| | | Roadway = roadwayNo, |
| | | SourceAddress = stationCode, |
| | | SourceAddress = "", |
| | | TargetAddress = locationInfo.LocationCode, |
| | | TaskType = TaskTypeEnum.Inbound.ObjToInt(), |
| | | TaskStatus = TaskStatusEnum.New.ObjToInt(), |