using Masuit.Tools; using WIDESEA_Core.Const; using WIDESEA_DTO.MOM; using WIDESEA_DTO.WMS; using WIDESEAWCS_Model.Models; namespace WIDESEA_StorageTaskServices; public partial class Dt_TaskService : ServiceBase, IDt_TaskService { #region 出库任务完成 //public async Task CompleteStackTaskAsync(Dt_Task task, DtStockInfo stock) //{ // WebResponseContent content = new WebResponseContent(); // try // { // if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound) // { // var process = await SqlSugarHelper.Db.Queryable() // .FirstAsync(x => x.EquipmentName == task.Roadway); // var info = JsonConvert.DeserializeObject(process.ProcessValue); // var agingOutputDto = MapToAgingOutputDto(stock, info); // content = await _agingInOrOutInputService.GetOCVOutputAsync(agingOutputDto); // ValidateResponse(content); // } // // 更新库存状态和任务状态 // (var loc, var tas) = UpdateStockAndTaskStatus(stock, task); // // 事务处理 // await _unitOfWorkManage.UseTranAsync(async () => // { // await UpdateLocationAsync(loc); // await DeleteStockInfoAsync(stock.Id); // await DeleteStockInfoDetailsAsync(stock.StockInfoDetails); // //await DeleteTaskAsync(task.TaskId); // }); // return content.OK("任务完成成功"); // } // catch (Exception err) // { // LogFactory.GetLog("任务完成").Error(true, $"系统异常,异常信息:{err.Message}"); // return content.Error(err.Message); // } //} //private AgingOutputDto MapToAgingOutputDto(DtStockInfo stock, ResponseEqptRunDto info) //{ // // TODO Value值根据MOM下发的静置时间到当前时间的分钟数 // return new AgingOutputDto // { // OpFlag = 1, // Software = "WMS", // EquipmentCode = "24MEJQ08-1091", // TrayBarcode = stock.PalletCode, // SerialNos = stock.StockInfoDetails.Select(x => new SerialNoOutDto // { // SlotNo = x.OrderNo.ToInt32(), // SerialNo = x.SerialNumber, // SerialNoResult = true, // ParameterInfo = info.ParameterInfo.Select(y => new ParameterInfo() // { // LowerLomit = y.LowerControlLimit, // UpperLimit = y.UpperControlLimit, // ParameterResult = y.EquipmentAvailabilityFlag, // ParameterCode = y.ParameterCode, // ParameterDesc = y.Description, // TargetValue = y.TargetValue, // Value = (DateTime.Parse(stock.LinedProcessFeedbackTime, null, System.Globalization.DateTimeStyles.RoundtripKind).ToLocalTime() - stock.CreateDate).TotalMinutes.ToString(), // DefectCode = y.UOMCode // }).ToList() // }).ToList() // }; //} //private void ValidateResponse(WebResponseContent content) //{ // var result = JsonConvert.DeserializeObject(content.Data.ToString()); // if (!result.Success) // { // throw new Exception(result.MOMMessage); // } //} //private (DtLocationInfo, Dt_Task) UpdateStockAndTaskStatus(DtStockInfo stock, Dt_Task task) //{ // var location = _locationRepository.QueryFirst(x => x.LocationCode == task.SourceAddress); // var details = _stockInfoDetailRepository.QueryData(x => x.StockId == stock.Id); // location.LocationStatus = (int)LocationEnum.Free; // task.TaskState = (int)TaskOutStatusEnum.OutFinish; // //task.CurrentAddress = task.NextAddress; // //task.NextAddress = task.TargetAddress; // LogFactory.GetLog("任务完成").Info(true, "更新库存状态与任务状态"); // return (location, task); //} //private async Task DeleteStockInfoAsync(int stockId) //{ // var isStockUpdated = await _stockInfoRepository.DeleteDataByIdAsync(stockId); // if (!isStockUpdated) // { // throw new Exception("库存信息更新失败"); // } //} //private async Task UpdateLocationAsync(DtLocationInfo info) //{ // var isStockUpdated = await _locationRepository.UpdateDataAsync(info); // if (!isStockUpdated) // { // throw new Exception("库存信息更新失败"); // } //} //private async Task DeleteStockInfoDetailsAsync(IEnumerable details) //{ // var ids = details.Select(x => (object)x.Id).ToArray(); // var isStockDetailUpdated = await _stockInfoDetailRepository.DeleteDataByIdsAsync(ids); // if (!isStockDetailUpdated) // { // throw new Exception("库存详情信息更新失败"); // } //} //private async Task DeleteTaskAsync(int taskId) //{ // var isTaskUpdated = await BaseDal.DeleteDataByIdAsync(taskId); // if (!isTaskUpdated) // { // throw new Exception("任务信息更新失败"); // } //} #endregion 出库任务完成 #region 移库任务完成 /// /// 移库任务完成 /// /// 任务数据合集 /// 返回结果集 //public async Task CompleteTransferTaskAsync(Dt_Task task, DtStockInfo stock) //{ // WebResponseContent content = new WebResponseContent(); // try // { // // 更新货位和库存信息 // (DtStockInfo updateStock, DtLocationInfo locationInf) = UpdateStockLocation(stock, task.NextAddress); // var taskHty = CreateHistoricalTask(task); // LogFactory.GetLog("任务完成").InfoFormat(true, "移库任务完成", $"货位地址:{task.TargetAddress},修改后库存数据:{JsonConvert.SerializeObject(updateStock)},原先货位数据:{locationInf}"); // // 执行数据库事务 // bool isResult = await ExecuteTransaction(updateStock, taskHty, locationInf, task.TaskId); // if (isResult) // content.OK("移库任务完成成功"); // else // content.Error("移库任务完成失败"); // } // catch (Exception err) // { // Console.WriteLine(err.Message.ToString()); // } // return content; //} #endregion 移库任务完成 #region 入库任务完成 /// /// 完成入库任务 /// /// 任务数据合集 /// 返回结果集 //public async Task CompleteInboundTaskAsync(Dt_Task task) //{ // // 初始化响应内容 // WebResponseContent content = new WebResponseContent(); // try // { // // 获取装箱信息和目标位置信息 // var boxing = await _boxingInfoRepository.QueryFirstNavAsync(x => x.PalletCode == task.PalletCode); // var locationInf = await _locationRepository.QueryFirstAsync(x => x.LocationCode == task.TargetAddress); // // 更新目标位置状态为库存中 // locationInf.LocationStatus = (int)LocationEnum.InStock; // // 创建历史任务实例模型 // var taskHty = CreateHistoricalTask(task); // // 根据是否有组盘信息创建库存实例模型 // DtStockInfo stock = boxing == null ? CreateEmptyPalletStock(task, locationInf) : CreateFullPalletStock(task, locationInf, boxing); // // 执行数据库事务 // bool isResult = await ExecuteTransaction(stock, taskHty, locationInf, task.TaskId); // if (isResult) // { // content.OK("入库任务完成成功"); // } // else // { // content.Error("入库任务完成失败"); // } // } // catch (Exception err) // { // // 记录异常信息到控制台和日志 // Console.WriteLine(err.Message.ToString()); // LogFactory.GetLog("任务完成").Error(true, err); // } // return content; //} /// /// 创建空托盘的库存实例模型 /// //private DtStockInfo CreateEmptyPalletStock(Dt_Task task, DtLocationInfo locationInf) //{ // var loation = _locationRepository.QueryFirst(x => x.RoadwayNo == task.Roadway && x.LocationCode == task.TargetAddress); // var area = _areaInfoRepository.QueryFirst(x => x.AreaID == loation.AreaId); // return new DtStockInfo() // { // PalletCode = task.PalletCode, // LocationCode = task.TargetAddress, // CreateDate = DateTime.Now, // Creater = "system", // IsFull = false, // AreaCode = area.AreaCode, // LocationId = loation.Id, // StockInfoDetails = new List() // { // new DtStockInfoDetail() // { // MaterielCode = "空托盘", // Id = 0, // Status = (int)StockStateEmun.已入库 // } // } // }; //} /// /// 创建实盘的库存实例模型并调用MOM入库 /// //private DtStockInfo CreateFullPalletStock(Dt_Task task, DtLocationInfo locationInf, DtBoxingInfo boxing) //{ // var loation = _locationRepository.QueryFirst(x => x.RoadwayNo == task.Roadway && x.LocationCode == task.TargetAddress); // var area = _areaInfoRepository.QueryFirst(x => x.AreaID == loation.AreaId); // var boxDetail = boxing.BoxingInfoDetails.Adapt>(); // boxDetail.ForEach(x => { x.Status = (int)StockStateEmun.已入库; }); // var stock = new DtStockInfo() // { // PalletCode = task.PalletCode, // LocationCode = task.TargetAddress, // CreateDate = DateTime.Now, // Creater = "system", // IsFull = boxing.IsFull, // AreaCode = area.AreaCode, // LocationId = loation.Id, // StockInfoDetails = boxDetail, // }; // // 处理请求参数 // AgingInputDto agingInputDto = new AgingInputDto() // { // SerialNos = boxing.BoxingInfoDetails // .Select(item => new SerialNoInDto { SerialNo = item.SerialNumber, PositionNo = item.OrderNo }) // .ToList(), // TrayBarcode = task.PalletCode, // OpFlag = 1, // EquipmentCode = "24MEJQ08-1091", // Software = "WMS" // }; // var result = _agingInOrOutInputService.GetOCVInputAsync(agingInputDto).Result; // var respone = JsonConvert.DeserializeObject(result.Data.ToString()); // stock.LinedProcessFeedbackTime = respone.LinedProcessFeedbackTime; // stock.SpecialParameterDuration = respone.SpecialParameterDuration; // //2024年11月16日:新增字段计算应出库时间 // stock.OutboundTime = Convert.ToDateTime(respone.LinedProcessFeedbackTime).AddHours(Convert.ToDouble(respone.SpecialParameterDuration)); // stock.ProductionLine = respone.ProductionLine; // // 记录日志 // LogFactory.GetLog("任务完成").InfoFormat(true, "入库任务完成", $"货位地址:{task.TargetAddress},修改后货位数据:{locationInf}"); // return stock; //} #endregion 入库任务完成 #region 任务完成 /// /// 完成任务 /// /// 任务编号 /// 返回结果集 //public async Task CompleteAsync(int taskNum) //{ // // 初始化响应内容 // WebResponseContent content = new WebResponseContent(); // // 提取任务数据 // LogFactory.GetLog("任务完成").InfoFormat(true, "提取任务数据", $"任务号:{taskNum}"); // // 验证任务是否存在 // var task = await GetByTaskNum(taskNum); // if (task == null) // { // return content.Error("任务不存在"); // } // LogFactory.GetLog("任务完成").InfoFormat(true, "验证任务是否存在", JsonConvert.SerializeObject(task)); // // 验证库存是否存在 // var stock = await _stockInfoRepository.QueryFirstNavAsync(x => x.PalletCode == task.PalletCode); // // 根据任务类型调用相应的完成任务方法 // switch (task.TaskType) // { // case (int)TaskInboundTypeEnum.Inbound: // case (int)TaskInboundTypeEnum.InTray: // LogFactory.GetLog("任务完成").InfoFormat(true, "入库任务", ""); // return await CompleteInboundTaskAsync(task); // case (int)TaskOutboundTypeEnum.OutTray: // case (int)TaskOutboundTypeEnum.Outbound: // LogFactory.GetLog("任务完成").InfoFormat(true, "出库任务", ""); // return await CompleteStackTaskAsync(task, stock); // default: // return content.Error("任务类型不存在"); // } //} #endregion 任务完成 #region 请求任务入库 /// /// 请求入库 /// /// 请求模型 /// 包含任务信息的响应内容 public async Task RequestInTask(RequestTaskDto input) { // 创建一个WebResponseContent对象 WebResponseContent content = new WebResponseContent(); try { // 调用BaseDal.QueryFirstAsync方法,查询任务 var task = await BaseDal.QueryFirstAsync(x => x.PalletCode == input.PalletCode); if (task != null) { //if (task.TaskState == (int)TaskInStatusEnum.InNew) { // 创建WMS任务 WMSTaskDTO taskDTO = new WMSTaskDTO() { TaskNum = task.TaskNum.Value, Grade = 1, PalletCode = task.PalletCode, RoadWay = task.Roadway, SourceAddress = task.SourceAddress, TargetAddress = task.TargetAddress, TaskState = task.TaskState.Value, Id = 0, TaskType = task.TaskType, }; return content.OK(data: taskDTO); } } // 调用CreateNewTask方法,创建新任务 content = await CreateNewTask(input); } catch (Exception err) { // 如果发生异常,则调用content.Error方法,记录错误信息,并输出错误信息 content.Error(err.Message); Console.WriteLine(err.Message); } // 返回content return content; } /// /// /// /// 请求参数 /// 实框空框标识 /// private async Task CreateNewTask(RequestTaskDto input) { WebResponseContent content = new WebResponseContent(); //DtLocationInfo locationInfo = await RequestLocation(input); //if (locationInfo == null) throw new Exception("库位已满"); var stationinfo = _stationManagerRepository.QueryFirst(x => x.stationChildCode == input.Position); if (stationinfo == null) throw new Exception("未知站台"); if (stationinfo.stationType != 7) { if (input.PalletCode == null || input.PalletCode.Trim() == "") return content.Error($"【{stationinfo.remark}】托盘条码为空"); } var task = await CreateNewTaskByStation(input, stationinfo); // 尝试添加新任务 if (task == null) return content.Error(); var taskId = await BaseDal.AddDataAsync(task); bool isResult = taskId > 0; if (isResult) { // 创建WMS任务 WMSTaskDTO taskDTO = new WMSTaskDTO() { TaskNum = task.TaskNum.Value, Grade = 1, PalletCode = task.PalletCode, RoadWay = task.Roadway, SourceAddress = task.SourceAddress, TargetAddress = task.TargetAddress, TaskState = task.TaskState.Value, Id = 0, TaskType = task.TaskType, }; content.OK(data: taskDTO); } else content.Error("添加任务失败"); return content; } /// /// 根据请求参数和站台 做不同任务处理 /// /// /// /// /// private async Task CreateNewTaskByStation(RequestTaskDto input, Dt_StationManager stationManager) { Dt_Task task = null; switch (stationManager.stationType) { case 6: case 1: task = await CreateInTaskAsync(input, stationManager); break; //case 2: case 3: //异常排出给WCS处理 //case 4: case 5: task = await CreateInToOutTaskAsync(input, stationManager); break; case 7: task = await CreateEmptyOutTaskAsync(input, stationManager); break; default: throw new Exception("未知站台类型"); } return task; } #region 直接出库任务 private async Task CreateInToOutTaskAsync(RequestTaskDto input, Dt_StationManager stationManager) { //if (stationManager.stationType != 5) throw new Exception("错误的调取"); input.EquiCodeMOM = "24MEJQ11-1006-1"; // 创建一个TrayCellsStatusDto对象,并赋值 TrayCellsStatusDto trayCells = new TrayCellsStatusDto() { Software = "WMS", TrayBarcode = input.PalletCode, //EquipmentCode = "EQ_CWJZ01" EquipmentCode = input.EquiCodeMOM }; // 调用GetTrayCellStatusAsync方法,获取整盘电芯 WebResponseContent content = await GetTrayCellStatusAsync(trayCells); // 如果状态为false,则返回content if (!content.Status) throw new Exception(content.Message); // 添加组盘信息 // 将content.Data转换为ResultTrayCellsStatus对象 var result = JsonConvert.DeserializeObject(content.Data.ToString()); if (result.SerialNos.Count <= 0) { ConsoleHelper.WriteErrorLine(result.MOMMessage); if (stationManager.stationType != 3) { var taskNG = new Dt_Task { CurrentAddress = input.Position, Grade = 1, Roadway = input.Roadways, TargetAddress = stationManager.stationNGLocation, Dispatchertime = DateTime.Now, MaterialNo = "", NextAddress = stationManager.stationNGChildCode, OrderNo = null, PalletCode = input.PalletCode, SourceAddress = stationManager.stationLocation, TaskState = (int)TaskInStatusEnum.Line_InFinish, TaskType = (int)TaskOutboundTypeEnum.InToOut, TaskNum = await BaseDal.GetTaskNo(), Creater = "Systeam" }; return taskNG; } else { return null; } } // 处理异常电芯情况 var serialNosError = result.SerialNos.Where(x => x.SerialNoStatus != 1).ToList(); if (serialNosError.Count > 0) { if (stationManager.stationType != 3) { var taskNG = new Dt_Task { CurrentAddress = input.Position, Grade = 1, Roadway = input.Roadways, TargetAddress = stationManager.stationNGLocation, Dispatchertime = DateTime.Now, MaterialNo = "", NextAddress = stationManager.stationNGChildCode, OrderNo = null, PalletCode = input.PalletCode, SourceAddress = stationManager.stationLocation, TaskState = (int)TaskInStatusEnum.Line_InFinish, TaskType = (int)TaskOutboundTypeEnum.OutNG, TaskNum = await BaseDal.GetTaskNo(), Creater = "Systeam" }; return taskNG; } } var targetStation = _stationManagerRepository.QueryFirst(x => x.stationPLC == stationManager.stationPLC && x.Roadway == stationManager.Roadway && x.stationType == 2); var task = new Dt_Task { CurrentAddress = input.Position, Grade = 1, Roadway = input.Roadways, TargetAddress = targetStation.stationLocation, Dispatchertime = DateTime.Now, MaterialNo = "", NextAddress = input.Roadways, OrderNo = null, PalletCode = input.PalletCode, SourceAddress = stationManager.stationLocation, TaskState = (int)TaskInStatusEnum.Line_InFinish, TaskType = (int)TaskOutboundTypeEnum.InToOut, TaskNum = await BaseDal.GetTaskNo(), Creater = "Systeam" }; return task; } #endregion 直接出库任务 #region 入库任务 private async Task CreateInTaskAsync(RequestTaskDto input, Dt_StationManager stationManager) { if (stationManager.stationType != 1 && stationManager.stationType != 6) throw new Exception("错误的调取"); DtLocationInfo locationInfo = null; if (stationManager.stationType == 1 && stationManager.Roadway.Contains("FR")) { locationInfo = await RequestLocation(input, true); } else { locationInfo = await RequestLocation(input); } //DtLocationInfo locationInfo = await RequestLocation(input); if (locationInfo == null) throw new Exception("库位已满"); if (stationManager.stationType == 1) { // 创建一个TrayCellsStatusDto对象,并赋值 TrayCellsStatusDto trayCells = new TrayCellsStatusDto() { Software = "WMS", TrayBarcode = input.PalletCode, //EquipmentCode = "EQ_CWJZ01" EquipmentCode = input.EquiCodeMOM }; // 调用GetTrayCellStatusAsync方法,获取整盘电芯 WebResponseContent content = await GetTrayCellStatusAsync(trayCells); // 如果状态为false,则返回content if (!content.Status) throw new Exception(content.Message); // 添加组盘信息 // 将content.Data转换为ResultTrayCellsStatus对象 var result = JsonConvert.DeserializeObject(content.Data.ToString()); if (result.SerialNos.Count <= 0) { ConsoleHelper.WriteErrorLine(result.MOMMessage); var taskNG = new Dt_Task { CurrentAddress = input.Position, Grade = 1, Roadway = input.Roadways, TargetAddress = stationManager.stationNGLocation, Dispatchertime = DateTime.Now, MaterialNo = "", NextAddress = stationManager.stationNGChildCode, OrderNo = null, PalletCode = input.PalletCode, SourceAddress = stationManager.stationLocation, TaskState = (int)TaskInStatusEnum.Line_InFinish, TaskType = (int)TaskOutboundTypeEnum.InToOut, TaskNum = await BaseDal.GetTaskNo(), Creater = "Systeam" }; return taskNG; } //Console.WriteLine(result); //// TODO 获取本地料框属性与整盘电芯属性获取的值进行对比,如果一致则继续,否则返回错误信息 ////var productions = await _productionRepository.QueryDataAsync(x => result.TrayBarcodePropertys.Select(x => x.TrayBarcodeProperty).ToList().Contains(x.TrayBarcodeProperty)); ////if (productions.Count <= 0) //// return content.Error("料框属性不存在"); //// 调用CreateBoxingInfo方法,创建组盘信息 var boxing = CreateBoxingInfo(result, input.PalletCode); if (boxing == null) throw new Exception("组盘失败"); //// 调用GetProcessApplyAsync方法,获取工艺路线 //ProcessApplyDto process = await GetProcessApplyAsync(input, result); //// 如果process为null,则返回content //if (process == null) return content; //// 调用_processApplyService.GetProcessApplyAsync方法,获取工艺申请 //content = await _processApplyService.GetProcessApplyAsync(process); //// 如果状态为false,则返回null //if (!content.Status) return content.Error("工艺申请失败"); ////// 调用GetProcessResponseAsync方法,获取工艺响应 ////var processResponse = await GetProcessResponseAsync(process, input.Position); var isBox = await _boxingInfoRepository.AddDataNavAsync(boxing); } var task = new Dt_Task { CurrentAddress = input.Position, Grade = 1, Roadway = input.Roadways, TargetAddress = locationInfo.LocationCode, Dispatchertime = DateTime.Now, MaterialNo = "", NextAddress = input.Roadways, OrderNo = null, PalletCode = input.PalletCode, SourceAddress = stationManager.stationLocation, TaskState = (int)TaskInStatusEnum.Line_InFinish, TaskType = stationManager.stationType == 1 ? (int)TaskInboundTypeEnum.Inbound : (int)TaskInboundTypeEnum.InTray, TaskNum = await BaseDal.GetTaskNo(), Creater = "Systeam" }; ConsoleHelper.WriteSuccessLine($"修改前:" + locationInfo.LocationStatus.ToString()); locationInfo.LocationStatus = (int)LocationEnum.FreeDisable; ConsoleHelper.WriteSuccessLine($"修改后:" + locationInfo.LocationStatus.ToString()); await UpdateLocationAsync(locationInfo); return task; } #endregion 入库任务 #region 库位分配 /// /// /// /// 请求参数 /// private async Task RequestLocation(RequestTaskDto requestTask, bool isCheckRequest = false) { #region 获取货位 try { List locations; if (isCheckRequest) { locations = await _locationRepository.QueryDataAsync(x => x.LocationStatus == (int)LocationEnum.Free && x.RoadwayNo == requestTask.Roadways && x.EnalbeStatus == 1 && x.LocationType == 2 && x.Remark == "1"); } else { locations = await _locationRepository.QueryDataAsync(x => x.LocationStatus == (int)LocationEnum.Distribute && x.RoadwayNo == requestTask.Roadways && x.EnalbeStatus == 1 && x.LocationType == 1); } if (locations == null) { return null; } return locations.OrderBy(x => x.Layer).ThenBy(x => x.Column).ThenBy(x => x.Row).FirstOrDefault(); } catch (Exception err) { Console.WriteLine(err.Message.ToString()); return null; } #endregion 获取货位 } #endregion 库位分配 // 获取工艺申请 private async Task GetProcessApplyAsync(RequestTaskDto input, ResultTrayCellsStatus content) { // 创建一个ProcessApplyDto对象,并赋值 return new ProcessApplyDto() { EquipmentCode = input.EquiCodeMOM, Software = "WMS", //WipOrderNo = result.BindCode," SerialNos = content.SerialNos.Select(item => new SerialNos { SerialNo = item.SerialNo }).ToList() }; } #endregion 请求任务入库 public async Task CreateEmptyOutTaskAsync(RequestTaskDto input, Dt_StationManager stationManager) { try { if (stationManager.stationType != 7) throw new Exception("错误的调取"); var stockinfo = await _stockInfoRepository.Db.Queryable() .Includes(x => x.LocationInfo) //.Includes(x=>x.StockInfoDetails) .Where(x => !x.IsFull && x.LocationInfo.RoadwayNo == stationManager.Roadway) .OrderBy(x => x.CreateDate) .FirstAsync(); if (stockinfo == null) return null; var task = new Dt_Task { CurrentAddress = input.Position, Grade = 1, Roadway = input.Roadways, TargetAddress = stationManager.stationLocation, Dispatchertime = DateTime.Now, MaterialNo = "", NextAddress = input.Roadways, OrderNo = null, PalletCode = stockinfo.PalletCode, SourceAddress = stockinfo.LocationCode, TaskState = (int)TaskOutStatusEnum.OutNew, TaskType = (int)TaskOutboundTypeEnum.OutTray, TaskNum = await BaseDal.GetTaskNo(), Creater = "Systeam" }; return task; } catch (Exception ex) { throw new Exception(ex.Message); } } #region 直接出库任务完成 public async Task CompleteInToOutTaskAsync(Dt_Task task) { WebResponseContent content = new WebResponseContent(); try { //添加历史 var taskHty = CreateHistoricalTask(task); //删除任务 BaseDal.DeleteData(task); return content.OK(); } catch (Exception ex) { return content.Error(ex.Message); } } #endregion 直接出库任务完成 #region MyRegion private async Task ExecuteTransaction(DtStockInfo stock, Dt_Task_Hty taskHty, DtLocationInfo fromLocation, DtLocationInfo toLocation, int taskId) { _unitOfWorkManage.BeginTran(); try { var isUpdateStock = true; // 添加历史任务 var isTaskHtyAdd = await _task_HtyRepository.AddDataAsync(taskHty) > 0; // 修改移库前货位状态 var isUpdateLocF = _locationRepository.UpdateData(fromLocation); var isUpdateLocT = _locationRepository.UpdateData(toLocation); // 删除任务数据 var isTaskDelete = await Delete(taskId); // 提交或回滚事务 if (isUpdateStock && isTaskHtyAdd && isTaskDelete && isUpdateLocF && isUpdateLocT) { LogFactory.GetLog("任务完成").InfoFormat(true, "任务完成", $"事务处理完成,提交事务。添加历史任务:{isTaskHtyAdd},删除任务数据:{isTaskDelete},更新或添加库存:{isUpdateStock},修改移库前货位状态:{isUpdateLocF}"); _unitOfWorkManage.CommitTran(); return true; } else { LogFactory.GetLog("任务完成").InfoFormat(true, "任务完成", $"数据处理失败,请检查数据是否正确,数据回滚。添加历史任务:{isTaskHtyAdd},删除任务数据:{isTaskDelete},更新库存:{isUpdateStock},修改移库前货位状态:{isUpdateLocF}"); _unitOfWorkManage.RollbackTran(); return false; } } catch (Exception err) { LogFactory.GetLog("任务完成").InfoFormat(true, $"任务完成,系统异常,异常信息:{err.Message}", "无参数"); _unitOfWorkManage.RollbackTran(); throw new Exception(err.Message); // 抛出异常以便外部捕获 } } #endregion MyRegion #region 检测高温库是否有可出库库存 public WebResponseContent StockCheckingAsync() { WebResponseContent webResponseContent = new WebResponseContent(); try { Task.Run(async () => { while (true) { try { Thread.Sleep(10000); var area = await _areaInfoRepository.QueryFirstAsync(x => x.AreaCode == "GWSC1"); var stockInfo = await _stockInfoRepository.Db.Queryable() .Includes(x => x.LocationInfo) // 预加载LocationInfo .Includes(x => x.StockInfoDetails) // 预加载StockInfoDetails .Where(x => x.AreaCode == area.AreaCode && x.OutboundTime < DateTime.Now && x.IsFull == true) // 过滤条件 .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.AreaId == area.AreaID) // 过滤条件 .OrderBy(x => x.OutboundTime) // 排序 .ToListAsync(); // 获取第一个元素 if (stockInfo.Count <= 0) continue; foreach (var item in stockInfo) { var hasTask = BaseDal.QueryFirst(x => x.PalletCode == item.PalletCode); if (hasTask != null) { Console.WriteLine("已存在出库任务"); continue; } string position = string.Empty; if (item.LocationInfo.RoadwayNo == "GWSC1") position = "1059"; else position = "1065"; var task = CreateTask(item, position, (int)TaskOutboundTypeEnum.Outbound); task.NextAddress = "002-000-002"; // 创建任务DTO WMSTaskDTO taskDTO = CreateTaskDTO(task); var configs = _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); var wmsBase = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.WCSIPAddress)?.ConfigValue; var ipAddress = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.ReceiveTask)?.ConfigValue; if (wmsBase == null || ipAddress == null) { throw new InvalidOperationException("WMS IP 未配置"); } var wmsIpAddress = wmsBase + ipAddress; var result = HttpHelper.PostAsync(wmsIpAddress, taskDTO.ToJsonString()).Result; var content = JsonConvert.DeserializeObject(result); if (content.Status) { await BaseDal.AddDataAsync(task); // 更新库存位置状态为不可用 item.LocationInfo.LocationStatus = (int)LocationEnum.InStockDisable; await _locationRepository.UpdateDataAsync(item.LocationInfo); } } } catch (Exception ex) { Console.WriteLine(ex.Message); } } }); return webResponseContent.OK(); } catch (Exception ex) { Console.WriteLine(ex.Message.ToString()); return webResponseContent.Error(ex.Message); } } #endregion 检测高温库是否有可出库库存 #region 常温补空托盘至分容 public async Task GetFROutTrayToCW(RequestTaskDto taskDTO) { WebResponseContent content = new WebResponseContent(); try { var station = _stationManagerRepository.QueryFirst(x => x.stationChildCode == taskDTO.Position); var locations = _locationRepository.QueryData(x => x.RoadwayNo == station.Roadway && x.LocationStatus == (int)LocationEnum.Free && x.LocationType == 1); if (locations.Count > 10) { ConsoleHelper.WriteColorLine(locations.Count.ToString(), ConsoleColor.Blue); var location = locations.OrderBy(x => x.Layer).ThenBy(x => x.Column).ThenBy(x => x.Row).FirstOrDefault(); var stockInfo = await QueryStockInfoForEmptyTrayAsync("CWSC1"); if (stockInfo != null) { var task = CreateTask(stockInfo, taskDTO.Position, (int)TaskOutboundTypeEnum.OutTray); // 创建任务DTO WMSTaskDTO wmsTask = CreateTaskDTO(task); // 更新库存位置状态为不可用 stockInfo.LocationInfo.LocationStatus = (int)LocationEnum.InStockDisable; location.LocationStatus = (int)LocationEnum.Distribute; await _unitOfWorkManage.UseTranAsync(async () => { await BaseDal.AddDataAsync(task); await _locationRepository.UpdateDataAsync(stockInfo.LocationInfo); await _locationRepository.UpdateDataAsync(location); }); // 返回成功响应 return content.OK(data: wmsTask); } else content.Error("常温空托盘数量不足"); } } catch (Exception ex) { content.Error(ex.Message); } return content; } #endregion 常温补空托盘至分容 }