using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Core.Enums; using WIDESEA_Core; using WIDESEA_DTO.Stock; using WIDESEA_Model.Models; using WIDESEA_Core.Helper; using WIDESEA_Common.OtherEnum; using WIDESEA_Common.TaskEnum; using WIDESEA_Common.OrderEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Common.CommonEnum; using WIDESEA_Common.LocationEnum; using MailKit.Search; using WIDESEA_External.Model; using WIDESEA_Core.CodeConfigEnum; using Microsoft.AspNetCore.Mvc; using WIDESEA_DTO.ERP; using WIDESEA_Common.MaterielEnum; using WIDESEA_Common.WareHouseEnum; namespace WIDESEA_TaskInfoService { public partial class TaskService { /// /// 选择库存生成出库任务 /// /// /// public WebResponseContent Outbound(int id) { WebResponseContent content = new WebResponseContent(); try { Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable().Where(x => x.Id == id).First(); if (stockInfo == null) { return content.Error($"未找到库存"); } Dt_LocationInfo locationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode); if (locationInfo != null && (locationInfo.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || locationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt() && stockInfo.StockStatus == StockStatusEmun.入库完成.ObjToInt()) { List tasks = GetTasks(new List() { stockInfo }, TaskTypeEnum.Outbound); if (tasks == null || tasks.Count <= 0) { return content.Error($"生成任务失败"); } //处理库存数据 stockInfo.StockStatus = (int)StockStatusEmun.出库锁定; LocationStatusEnum locationStatus = (LocationStatusEnum)locationInfo.LocationStatus; locationInfo.LocationStatus = (int)LocationStatusEnum.Lock; //判断是否有出库单信息 _unitOfWorkManage.BeginTran(); //更新库存状态 _stockRepository.StockInfoRepository.UpdateData(stockInfo); //更新货位状态 _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.Lock, stockInfo.WarehouseId); //新建任务 BaseDal.AddData(tasks); //加入货位变动记录 _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, locationStatus, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, stockInfo.OrderNo ?? "", tasks[0].TaskNum); _unitOfWorkManage.CommitTran(); PushTasksToWCS(tasks); content.OK(); } else { content.Error($"货位出库条件不满足"); } } catch (Exception ex) { content.Error(ex.Message); } return content; } /// /// 出库任务完成 /// public WebResponseContent OutboundTaskCompleted(Dt_Task task) { try { Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == task.WarehouseId); if (warehouse.WarehouseCode == WarehouseEnum.LLDCP.ToString()) //成品完成 { Dt_LocationInfo locationInfoStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress); if (locationInfoStart == null) { return WebResponseContent.Instance.Error($"未找到对应的起点货位信息"); } Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.QueryFirst(x => x.PalletCode == task.PalletCode); if (proStockInfo != null && proStockInfo.StockStatus==StockStatusEmun.出库锁定.ObjToInt()) { task.TaskStatus = TaskStatusEnum.Finish.ObjToInt(); _unitOfWorkManage.BeginTran(); proStockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt(); _stockRepository.ProStockInfoRepository.DeleteAndMoveIntoHty(proStockInfo,App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成); _basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, proStockInfo.PalletType, LocationStatusEnum.Free, proStockInfo.WarehouseId); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成); _unitOfWorkManage.CommitTran(); } else { return WebResponseContent.Instance.Error($"未找到对应库存信息"); } } else//原料库完成 { Dt_LocationInfo locationInfoStart = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress); if (locationInfoStart == null) { return WebResponseContent.Instance.Error($"未找到对应的起点货位信息"); } Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.QueryFirst(x => x.PalletCode == task.PalletCode); if (stockInfo != null && stockInfo.StockStatus == StockStatusEmun.出库锁定.ObjToInt()) { task.TaskStatus = TaskStatusEnum.Finish.ObjToInt(); _unitOfWorkManage.BeginTran(); stockInfo.StockStatus = StockStatusEmun.出库完成.ObjToInt(); _stockRepository.StockInfoRepository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成); _basicService.LocationInfoService.UpdateLocationStatus(locationInfoStart, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? WIDESEA_Core.Enums.OperateTypeEnum.人工完成 : WIDESEA_Core.Enums.OperateTypeEnum.自动完成); _unitOfWorkManage.CommitTran(); } else { return WebResponseContent.Instance.Error($"未找到对应库存信息"); } } return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } /// /// 库存数据转出库任务 /// /// /// public List GetTasks(List stockInfos, TaskTypeEnum taskType) { List tasks = new List(); for (int i = 0; i < stockInfos.Count; i++) { Dt_StockInfo stockInfo = stockInfos[i]; if (stockInfo != null) { Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode); if (!tasks.Exists(x => x.PalletCode == stockInfo.PalletCode)) { Dt_Task task = new() { CurrentAddress = stockInfo.LocationCode, Grade = 0, PalletCode = stockInfo.PalletCode, NextAddress = "", Roadway = locationInfo.RoadwayNo, SourceAddress = stockInfo.LocationCode, TargetAddress = "", TaskStatus = TaskStatusEnum.New.ObjToInt(), TaskType = taskType.ObjToInt(), TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), PalletType = stockInfo.PalletType, WarehouseId = stockInfo.WarehouseId, MaterielCode = stockInfo.MaterielCode, Quantity = 0, }; if (stockInfo.MaterielWide>0) { task.TaskLength = (int)stockInfo.MaterielWide; } tasks.Add(task); } } } return tasks; } public List GetTasks(List stockInfos, TaskTypeEnum taskType) { List tasks = new List(); for (int i = 0; i < stockInfos.Count; i++) { Dt_ProStockInfo stockInfo = stockInfos[i]; if (stockInfo != null) { Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode); if (!tasks.Exists(x => x.PalletCode == stockInfo.PalletCode)) { Dt_Task task = new() { CurrentAddress = stockInfo.LocationCode, Grade = 0, PalletCode = stockInfo.PalletCode, NextAddress = "", Roadway = locationInfo.RoadwayNo, SourceAddress = stockInfo.LocationCode, TargetAddress = "", TaskStatus = TaskStatusEnum.New.ObjToInt(), TaskType = taskType.ObjToInt(), TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), PalletType = stockInfo.PalletType, WarehouseId = stockInfo.WarehouseId, Quantity = 0, }; tasks.Add(task); } } } return tasks; } /// /// 成品出库 /// /// /// public WebResponseContent RequestCPWMSTaskOut(int Count) { WebResponseContent content = new WebResponseContent(); try { List aGVStationInfos = _agvStationInfoRepository.QueryData(x=>x.StationArea==AGVStationAreaEnum.AreaA.ObjToInt() && x.IsOccupied==WhetherEnum.False.ObjToInt()); if (aGVStationInfos.Count< Count) { return content.Error($"可用缓存数不足"); } List stockInfos = _stockRepository.ProStockInfoRepository.QueryData(x => x.ProStockAttribute == ProStockAttributeEnum.空托.ObjToInt() && x.StockStatus == StockStatusEmun.入库完成.ObjToInt()).OrderBy(x=>x.CreateDate).Take(Count).ToList(); List locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => stockInfos.Select(x => x.LocationCode).Contains(x.LocationCode)); if (stockInfos.Count < Count) { return content.Error($"库存数量不足"); } foreach (var item in stockInfos) { Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == item.LocationCode); if (locationInfo != null && (locationInfo.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || locationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt()) { item.StockStatus = StockStatusEmun.出库锁定.ObjToInt(); } else { return content.Error($"货位状态不正确"); } } List tasks = GetTasks(stockInfos, TaskTypeEnum.OutProduct); if (tasks == null || tasks.Count <= 0) { return content.Error($"生成任务失败"); } for (int i = 0; i < tasks.Count; i++) { aGVStationInfos[i].IsOccupied = WhetherEnum.True.ObjToInt(); tasks[i].TargetAddress = aGVStationInfos[i].AGVStationCode; } //判断是否有出库单信息 _unitOfWorkManage.BeginTran(); //更新库存状态 _stockRepository.ProStockInfoRepository.UpdateData(stockInfos); _agvStationInfoRepository.UpdateData(aGVStationInfos); //更新货位状态 _basicRepository.LocationInfoRepository.UpdateLocationStatus(locationInfos, LocationStatusEnum.Lock); //加入货位变动记录 _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, taskNums: tasks.Select(x => x.TaskNum).ToList()); //新建任务 BaseDal.AddData(tasks); _unitOfWorkManage.CommitTran(); PushTasksToWCS(tasks); content.OK(); } catch (Exception ex) { content.Error(ex.Message); } return content; } /// /// 原料出库任务 /// /// 物料代码 /// 物料幅宽 /// 卷数 /// public WebResponseContent RequestYLWMSTaskOut(string materielCode, int materielWide, int Count) { WebResponseContent content = new WebResponseContent(); try { //获取对应库存 List stockInfos = _stockRepository.StockInfoRepository.QueryData(x=>x.MaterielCode==materielCode && x.MaterielWide== materielWide && x.StockStatus==StockStatusEmun.入库完成.ObjToInt()).OrderBy(x=>x.CreateDate).Take(Count).ToList(); if (stockInfos.Count< Count) { return content.Error($"库存{materielCode}数量不足"); } //获取货位 List locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => stockInfos.Select(x => x.LocationCode).Contains(x.LocationCode)); foreach (var item in stockInfos) { Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x=>x.LocationCode==item.LocationCode); if (locationInfo!=null && (locationInfo.EnableStatus == EnableStatusEnum.OnlyOut.ObjToInt() || locationInfo.EnableStatus == EnableStatusEnum.Normal.ObjToInt()) && locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt()) { item.StockStatus = StockStatusEmun.出库锁定.ObjToInt(); } else { return content.Error($"货位状态不正确"); } } TaskTypeEnum taskTypeEnum = new(); if (stockInfos.FirstOrDefault()?.MaterielInvOrgId==MaterielInvOrgEnum.老厂.ObjToInt()) { taskTypeEnum = TaskTypeEnum.OldOutbound; } else { taskTypeEnum = TaskTypeEnum.Outbound; } List tasks = GetTasks(stockInfos, taskTypeEnum); if (tasks == null || tasks.Count <= 0) { return content.Error($"生成任务失败"); } //判断是否有出库单信息 _unitOfWorkManage.BeginTran(); //更新库存状态 _stockRepository.StockInfoRepository.UpdateData(stockInfos); //更新货位状态 _basicRepository.LocationInfoRepository.UpdateLocationStatus(locationInfos, LocationStatusEnum.Lock); //加入货位变动记录 _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfos, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation,taskNums:tasks.Select(x=>x.TaskNum).ToList()); //新建任务 BaseDal.AddData(tasks); _unitOfWorkManage.CommitTran(); PushTasksToWCS(tasks); content.OK(); } catch (Exception ex) { content.Error(ex.Message); } return content; } } }