| | |
| | | using WIDESEA_DTO.MES; |
| | | using WIDESEA_DTO.Stock; |
| | | using WIDESEA_DTO.Task; |
| | | using Newtonsoft.Json; |
| | | using System.Diagnostics; |
| | | using WIDESEA_IBasicService; |
| | | using WIDESEA_IRecordService; |
| | | using WIDESEA_IStockService; |
| | |
| | | private readonly IStockInfo_HtyService _stockInfo_HtyService; |
| | | private readonly IUnitOfWorkManage _unitOfWorkManage; |
| | | private readonly IRecordService _recordService; |
| | | private readonly IMESDeviceConfigService _mesDeviceConfigService; |
| | | private readonly IMesLogService _mesLogService; |
| | | |
| | | public IRepository<Dt_Task> Repository => BaseDal; |
| | | |
| | |
| | | ITask_HtyService task_HtyService, |
| | | IStockInfo_HtyService stockInfo_HtyService, |
| | | IUnitOfWorkManage unitOfWorkManage, |
| | | IRecordService recordService) : base(BaseDal) |
| | | IRecordService recordService, |
| | | IMESDeviceConfigService mesDeviceConfigService, |
| | | IMesLogService mesLogService) : base(BaseDal) |
| | | { |
| | | _mapper = mapper; |
| | | _stockInfoService = stockInfoService; |
| | |
| | | _stockInfo_HtyService = stockInfo_HtyService; |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _recordService = recordService; |
| | | _mesDeviceConfigService = mesDeviceConfigService; |
| | | _mesLogService = mesLogService; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | // Remark 为空时,回退到巷道配置 |
| | | return DetermineTargetAddress(roadway, addressMap); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 异步执行MES上传 - 不阻塞主业务逻辑 |
| | | /// </summary> |
| | | /// <param name="palletCode">托盘号</param> |
| | | /// <param name="successStatus">成功时的状态枚举值(奇数)</param> |
| | | /// <param name="uploadFunc">具体的MES调用函数</param> |
| | | private async Task MesUploadAsync(string palletCode, MesUploadStatusEnum successStatus, Func<Task<HttpResponseResult<MesResponse>>> uploadFunc) |
| | | { |
| | | var stopwatch = Stopwatch.StartNew(); |
| | | string requestJson = ""; |
| | | string responseJson = ""; |
| | | bool isSuccess = false; |
| | | string errorMessage = ""; |
| | | |
| | | try |
| | | { |
| | | // 调用MES |
| | | var result = await uploadFunc(); |
| | | |
| | | stopwatch.Stop(); |
| | | isSuccess = result?.Data?.IsSuccess ?? false; |
| | | errorMessage = result?.Data?.Msg ?? result?.ErrorMessage ?? "未知错误"; |
| | | responseJson = JsonConvert.SerializeObject(result); |
| | | |
| | | // 根据成功/失败决定状态值:奇数=成功,偶数=失败 |
| | | var uploadStatus = isSuccess ? (int)successStatus : (int)successStatus + 1; |
| | | |
| | | // 更新库存表状态(不等待) |
| | | _ = _stockInfoService.UpdateMesUploadStatusAsync(palletCode, uploadStatus); |
| | | |
| | | // 记录MES日志 |
| | | await LogMesCallAsync(palletCode, successStatus.ToString(), requestJson, responseJson, |
| | | stopwatch.ElapsedMilliseconds, isSuccess ? "成功" : "失败", errorMessage); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | stopwatch.Stop(); |
| | | errorMessage = ex.Message; |
| | | |
| | | // 更新状态为失败(successStatus+1 即为失败状态) |
| | | var uploadStatus = (int)successStatus + 1; |
| | | _ = _stockInfoService.UpdateMesUploadStatusAsync(palletCode, uploadStatus); |
| | | |
| | | // 记录异常日志 |
| | | await LogMesCallAsync(palletCode, successStatus.ToString(), requestJson, responseJson, |
| | | stopwatch.ElapsedMilliseconds, "失败", errorMessage); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 记录MES接口调用日志 |
| | | /// </summary> |
| | | private async Task LogMesCallAsync(string palletCode, string apiType, string requestJson, |
| | | string responseJson, long durationMs, string status, string errorMessage) |
| | | { |
| | | try |
| | | { |
| | | var mesLog = new MesApiLogDto |
| | | { |
| | | PalletCode = palletCode, |
| | | ApiType = apiType, |
| | | RequestJson = requestJson, |
| | | ResponseJson = responseJson, |
| | | IsSuccess = status == "成功", |
| | | ErrorMessage = errorMessage, |
| | | ElapsedMs = (int)durationMs, |
| | | Creator = "System" |
| | | }; |
| | | await _mesLogService.LogAsync(mesLog); |
| | | } |
| | | catch |
| | | { |
| | | // 日志记录失败不影响主流程 |
| | | } |
| | | } |
| | | } |
| | | } |