| using LogLibrary.Log; | 
| using Masuit.Tools; | 
| using Newtonsoft.Json; | 
| using WIDESEA_Common; | 
| using WIDESEA_Core; | 
| using WIDESEA_Core.Const; | 
| using WIDESEA_Core.Helper; | 
| using WIDESEA_DTO; | 
| using WIDESEA_DTO.MOM; | 
| using WIDESEA_IBusinessesRepository; | 
| using WIDESEA_IServices; | 
| using WIDESEA_IStorageBasicRepository; | 
| using WIDESEA_IStorageTaskRepository; | 
| using WIDESEA_IStoragIntegrationServices; | 
| using WIDESEA_Model.Models; | 
|   | 
| namespace WIDESEA_StoragIntegrationServices; | 
|   | 
| public class ProcessApplyService : IProcessApplyService | 
| { | 
|     private readonly LogFactory LogFactory = new LogFactory(); | 
|     private readonly ISys_ConfigService _configService; | 
|     private readonly IDt_AreaInfoRepository _areaInfoRepository; | 
|     private readonly ICellStateService _cellStateService; | 
|     private readonly IStockInfoRepository _stockInfoRepository; | 
|     private readonly IAgingInOrOutInputService _gingInOrOutInputService; | 
|   | 
|     public ProcessApplyService(ISys_ConfigService configRepository, IDt_AreaInfoRepository areaInfoRepository, ICellStateService cellStateService, IDt_TaskRepository taskRepository, IStockInfoRepository stockInfoRepository, IAgingInOrOutInputService gingInOrOutInputService) | 
|     { | 
|         _configService = configRepository; | 
|         _areaInfoRepository = areaInfoRepository; | 
|         _cellStateService = cellStateService; | 
|         _stockInfoRepository = stockInfoRepository; | 
|         _gingInOrOutInputService = gingInOrOutInputService; | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 工艺路线申请 | 
|     /// </summary> | 
|     /// <param name="input"></param> | 
|     /// <returns></returns> | 
|     public async Task<WebResponseContent> GetProcessApplyAsync(ProcessApplyDto input) | 
|     { | 
|         WebResponseContent content = new WebResponseContent(); | 
|         try | 
|         { | 
|             input.SessionId = Guid.NewGuid().ToString(); | 
|             input.EmployeeNo = "MITest"; | 
|             input.RequestTime = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now).ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); | 
|             var inputJson = Masuit.Tools.ObjectExtensions.ToDictionary(input); | 
|             var configs = _configService.GetConfigsByCategory(CateGoryConst.SYS_MOMIPAddress); | 
|             var wmsBase = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.MOMBaseIP)?.ConfigValue; | 
|             var ipAddress = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.ProcessApply)?.ConfigValue; | 
|             if (wmsBase == null || ipAddress == null) | 
|             { | 
|                 throw new InvalidOperationException("WMS IP 未配置"); | 
|             } | 
|             var wmsIpAddress = wmsBase + ipAddress; | 
|   | 
|             var result = HttpsClient.PostAsync(wmsIpAddress, inputJson).Result; | 
|   | 
|             if (result != null) | 
|             { | 
|                 content.OK(data: result); | 
|   | 
|                 //var respone = JsonConvert.DeserializeObject<ResultProcessApply>(result.ToString()); | 
|                 //if (!respone.Success) | 
|                 //{ | 
|                 //    MoMErrorMsg.AddMoMErrorMsg(0, input.WipOrderNo, respone.MOMMessage, SysConfigConst.TrayCellsStatus); | 
|                 //} | 
|                 //else | 
|                 //{ | 
|                 //    MoMErrorMsg.DeleteMoMErrorMsg(0, input.WipOrderNo); | 
|                 //} | 
|             } | 
|             LogFactory.GetLog("工艺路线申请").Info(true, $"\r\r--------------------------------------"); | 
|             LogFactory.GetLog("工艺路线申请").Info(true, result); | 
|         } | 
|         catch (Exception ex) | 
|         { | 
|             //Console.WriteLine(ex.Message); | 
|             LogFactory.GetLog("工艺路线申请").Error(true, $"\r\r--------------------------------------"); | 
|             LogFactory.GetLog("工艺路线申请").Error(true, ex.StackTrace); | 
|         } | 
|         return content; | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 补录出库数据 | 
|     /// </summary> | 
|     /// <param name="palletCode"></param> | 
|     /// <returns></returns> | 
|     public async Task<WebResponseContent> StockOutDataBackfillInterfaceAsync(string palletCode, int areaID) | 
|     { | 
|         WebResponseContent content = new WebResponseContent(); | 
|         try | 
|         { | 
|             var area = _areaInfoRepository.QueryFirst(x => x.AreaID == areaID); | 
|             var trayCells = new TrayCellsStatusDto() | 
|             { | 
|                 Software = area.Spare3, | 
|                 TrayBarcode = palletCode, | 
|                 EquipmentCode = area.Spare2, | 
|                 SceneType = area.Spare4 | 
|             }; | 
|             content = await _cellStateService.GetTrayCellStatusAsync(trayCells); | 
|             if (!content.Status) return content; | 
|   | 
|             var result = JsonConvert.DeserializeObject<ResultTrayCellsStatus>(content.Data.ToString()); | 
|             if (result.SerialNos.Count > 0) | 
|             { | 
|                 var stock = await SqlSugarHelper.DbWMS.Queryable<DtStockInfo>().FirstAsync(x => x.PalletCode == palletCode); | 
|                 if (stock != null) | 
|                 { | 
|                     var parameterInfo = JsonConvert.DeserializeObject<List<ParameterInfo>>(stock.ParameterInfos).FirstOrDefault(y => y.Description.Contains("时间")); | 
|                     if (parameterInfo == null) throw new Exception(""); | 
|   | 
|                     var outHours = (DateTime.Now - (stock.LinedProcessFeedbackTime == null ? stock.ModifyDate.Value : stock.LinedProcessFeedbackTime.ToDateTime())).TotalHours; | 
|                     var isNG = outHours > parameterInfo.LowerSpecificationsLimit.ToDouble() && outHours < parameterInfo.UpperSpecificationsLimit.ToDouble(); | 
|   | 
|                     var defectCode = string.Empty; | 
|                     if (!isNG) defectCode = "TQCK"; | 
|                     var outputDto = new AgingOutputDto | 
|                     { | 
|                         OpFlag = 1, | 
|                         Software = area.Spare3, | 
|                         EquipmentCode = area.Spare2, | 
|                         TrayBarcode = palletCode, | 
|                         SerialNos = result.SerialNos.Select(x => new SerialNoOutDto | 
|                         { | 
|                             SlotNo = x.PositionNo, | 
|                             SerialNo = x.SerialNo, | 
|                             SerialNoResult = true, //isNG, | 
|                             ParameterInfo = new List<ParameterInfoOutput> { | 
|                                 new ParameterInfoOutput() { | 
|                                     Value = outHours.ToString(), | 
|                                     ParameterCode =parameterInfo.ParameterCode, | 
|                                     ParameterDesc = parameterInfo.Description, | 
|                                     ParameterResult  = "OK", //isNG.ToString(), | 
|                                     TargetValue = parameterInfo.TargetValue, | 
|                                     LowerLimit = parameterInfo.LowerSpecificationsLimit, | 
|                                     UpperLimit = parameterInfo.UpperSpecificationsLimit, | 
|                                     DefectCode = defectCode, | 
|                                     UOMCode = parameterInfo.UOMCode, | 
|                                 } | 
|                             } | 
|                         }).ToList() | 
|                     }; | 
|                     content = await _gingInOrOutInputService.GetOCVOutputAsync(outputDto); | 
|                 } | 
|                 else | 
|                 { | 
|                     var stockHty = await SqlSugarHelper.DbWMS.Queryable<DtStockInfo_Hty>().Where(x => x.PalletCode == palletCode).OrderByDescending(x => x.CreateDate).FirstAsync(); | 
|                     if (stockHty != null) | 
|                     { | 
|                         var parameterInfo = JsonConvert.DeserializeObject<List<ParameterInfo>>(stockHty.ParameterInfos).FirstOrDefault(y => y.Description.Contains("时间")); | 
|                         if (parameterInfo == null) throw new Exception(""); | 
|   | 
|                         var outHours = (DateTime.Now - (stockHty.LinedProcessFeedbackTime == null ? "2025-01-08 15:59:34.310".ToDateTime() : stockHty.LinedProcessFeedbackTime.ToDateTime())).TotalHours; | 
|                         var isNG = outHours > parameterInfo.LowerSpecificationsLimit.ToDouble() && outHours < parameterInfo.UpperSpecificationsLimit.ToDouble(); | 
|   | 
|                         var defectCode = string.Empty; | 
|                         if (!isNG) defectCode = "TQCK"; | 
|                         var outputDto = new AgingOutputDto | 
|                         { | 
|                             OpFlag = 1, | 
|                             Software = area.Spare3, | 
|                             EquipmentCode = area.Spare2, | 
|                             TrayBarcode = palletCode, | 
|                             SerialNos = result.SerialNos.Select(x => new SerialNoOutDto | 
|                             { | 
|                                 SlotNo = x.PositionNo, | 
|                                 SerialNo = x.SerialNo, | 
|                                 SerialNoResult = true, //isNG, | 
|                                 ParameterInfo = new List<ParameterInfoOutput> { | 
|                                 new ParameterInfoOutput() { | 
|                                     Value = outHours.ToString(), | 
|                                     ParameterCode =parameterInfo.ParameterCode, | 
|                                     ParameterDesc = parameterInfo.Description, | 
|                                     ParameterResult  = "OK", //isNG.ToString(), | 
|                                     TargetValue = parameterInfo.TargetValue, | 
|                                     LowerLimit = parameterInfo.LowerSpecificationsLimit, | 
|                                     UpperLimit = parameterInfo.UpperSpecificationsLimit, | 
|                                     DefectCode = defectCode, | 
|                                     UOMCode = parameterInfo.UOMCode, | 
|                                 } | 
|                             } | 
|                             }).ToList() | 
|                         }; | 
|                         content = await _gingInOrOutInputService.GetOCVOutputAsync(outputDto); | 
|                     } | 
|                     else | 
|                     { | 
|                         content.Error("杀杀杀"); | 
|                     } | 
|                 } | 
|             } | 
|             else | 
|             { | 
|                 content.Error("电芯数据为空"); | 
|             } | 
|         } | 
|         catch (Exception ex) | 
|         { | 
|         } | 
|         return content; | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 补录入库数据 | 
|     /// </summary> | 
|     /// <param name="palletCode"></param> | 
|     /// <param name="areaID"></param> | 
|     /// <returns></returns> | 
|     public async Task<WebResponseContent> StockInDataBackfillInterfaceAsync(string palletCode, int areaID) | 
|     { | 
|         WebResponseContent content = new WebResponseContent(); | 
|         try | 
|         { | 
|             var area = _areaInfoRepository.QueryFirst(x => x.AreaID == areaID); | 
|             var trayCells = new TrayCellsStatusDto() | 
|             { | 
|                 Software = area.Spare3, | 
|                 TrayBarcode = palletCode, | 
|                 EquipmentCode = area.Spare2, | 
|                 SceneType = area.Spare4 | 
|             }; | 
|             content = await _cellStateService.GetTrayCellStatusAsync(trayCells); | 
|             if (!content.Status) return content; | 
|   | 
|             var result = JsonConvert.DeserializeObject<ResultTrayCellsStatus>(content.Data.ToString()); | 
|             if (result.SerialNos.Count > 0 && result.Success) | 
|             { | 
|                 var stockInfo = await _stockInfoRepository.QueryFirstNavAsync(x => x.PalletCode == palletCode); | 
|                 if (stockInfo != null) | 
|                 { | 
|                     stockInfo.IsFull = true; | 
|                     stockInfo.StockInfoDetails = result.SerialNos.Select(serialNoObj => new DtStockInfoDetail | 
|                     { | 
|                         SerialNumber = serialNoObj.SerialNo, | 
|                         OrderNo = serialNoObj.PositionNo.ToString(), | 
|                         Status = serialNoObj.SerialNoStatus, | 
|                         MaterielCode = result.BindCode, | 
|                         Remark = result.TrayBarcodePropertys.ToJsonString(), | 
|                     }).ToList(); | 
|                     stockInfo.Remark = stockInfo.StockInfoDetails.Count().ToString(); | 
|   | 
|                     // 处理请求参数 | 
|                     AgingInputDto agingInputDto = new AgingInputDto() | 
|                     { | 
|                         SerialNos = stockInfo.StockInfoDetails | 
|                             .Select(item => new SerialNoInDto { SerialNo = item.SerialNumber, PositionNo = item.OrderNo }) | 
|                             .ToList(), | 
|                         TrayBarcode = palletCode, | 
|                         OpFlag = 1, | 
|                         EquipmentCode = area.Spare2, | 
|                         Software = area.Spare3 | 
|                     }; | 
|   | 
|                     content = _gingInOrOutInputService.GetOCVInputAsync(agingInputDto).Result; | 
|                     var respone = JsonConvert.DeserializeObject<ResponeAgingInputDto>(content.Data.ToString()); | 
|   | 
|                     stockInfo.LinedProcessFeedbackTime = respone.LinedProcessFeedbackTime; | 
|                     stockInfo.SpecialParameterDuration = respone.SpecialParameterDuration; | 
|                     //2024年11月16日:新增字段计算应出库时间 | 
|                     stockInfo.OutboundTime = Convert.ToDateTime(respone.LinedProcessFeedbackTime == null ? DateTime.Now : respone.LinedProcessFeedbackTime).AddHours(Convert.ToDouble(respone.SpecialParameterDuration)); | 
|                     stockInfo.ProductionLine = respone.ProductionLine; | 
|                     stockInfo.ParameterInfos = respone.ParameterInfos.ToJsonString(); | 
|                     stockInfo.StockStatus = 1; | 
|   | 
|                     var isResult = await _stockInfoRepository.UpdateDataNavAsync(stockInfo); | 
|                     if (isResult) | 
|                         content.OK("更新数据成功"); | 
|                     else | 
|                         content.Error("更新数据失败"); | 
|                 } | 
|                 else | 
|                 { | 
|                     content.Error("未找到库存"); | 
|                 } | 
|             } | 
|             else | 
|             { | 
|                 return content; | 
|             } | 
|         } | 
|         catch (Exception ex) | 
|         { | 
|             content.Error(ex.Message); | 
|         } | 
|         return content; | 
|     } | 
| } |