using log4net.Core; using Mapster; using Masuit.Tools; using Masuit.Tools.Models; using WIDESEA_DTO.MOM; using WIDESEA_DTO.WMS; using WIDESEA_IStorageBasicRepository; using WIDESEA_IStoragIntegrationServices; using WIDESEA_Model.Models; using WIDESEA_StorageBasicRepository; using WIDESEA_StorageTaskRepository; using WIDESEA_StoragIntegrationServices; namespace WIDESEA_StorageOutTaskServices; 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.Roadway, TaskState = task.TaskState.Value, Id = 0, TaskType = task.TaskType, }; return content.OK(data: taskDTO); } } // 创建一个TrayCellsStatusDto对象,并赋值 TrayCellsStatusDto trayCells = new TrayCellsStatusDto() { Software = "WMS", TrayBarcode = input.PalletCode, //EquipmentCode = "EQ_CWJZ01" EquipmentCode = input.EquiCodeMOM }; // 调用GetTrayCellStatusAsync方法,获取整盘电芯 content = await GetTrayCellStatusAsync(trayCells); // 如果状态为false,则返回content if (!content.Status) return content; // 添加组盘信息 // 将content.Data转换为ResultTrayCellsStatus对象 var result = JsonConvert.DeserializeObject(content.Data.ToString()); if (result.SerialNos.Count <= 0) return content.Error(result.MOMMessage); 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 = await CreateBoxingInfo(result, input.PalletCode); if (boxing == null) return content.Error("组盘失败"); // 调用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); List strings = input.Position == "1088" ? new List() { "CHSC01" } : new List() { "JZSC01" }; // 调用CreateNewTask方法,创建新任务 content = await CreateNewTask(input, strings); if (content.Status) { var isBox = await _boxingInfoRepository.AddDataNavAsync(boxing); } } catch (Exception err) { // 如果发生异常,则调用content.Error方法,记录错误信息,并输出错误信息 content.Error(err.Message); Console.WriteLine(err.Message); } // 返回content return content; } // 获取工艺申请 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 请求任务入库 #region 任务状态更改 /// /// 更新任务状态&出库解盘 /// /// /// /// //public async Task UpdateTaskStatus(int taskNum, int taskState) //{ // WebResponseContent content = new WebResponseContent(); // try // { // var task = await BaseDal.QueryFirstAsync(x => x.TaskNum == taskNum); // if (task == null) // return content.Error("未找到任务"); // if (taskState == (int)TaskOutStatusEnum.Line_OutFinish || taskState == (int)TaskOutStatusEnum.SC_OutFinish) // { // var taskHty = CreateHistoricalTask(task); // await _unitOfWorkManage.UseTranAsync(async () => // { // var asb = await BaseDal.DeleteDataByIdAsync(task.TaskId); // var asbHty = await _task_HtyRepository.AddDataAsync(taskHty) > 0; // if (asb && asbHty) // content.OK(); // else // throw new Exception(); // }); // content.OK(); // } // else // { // task.TaskState = taskState; // var asb = await BaseDal.UpdateDataAsync(task); // if (asb) // content.OK(); // else // content.Error(); // } // } // catch (Exception ex) // { // content.Error(ex.Message); // } // return content; //} #endregion //private WebResponseContent CheckInTask() }