|  |  | 
 |  |  | using Masuit.Tools; | 
 |  |  | using Mapster; | 
 |  |  | using Masuit.Tools; | 
 |  |  | using SqlSugar; | 
 |  |  | using WIDESEA_Common.CustomModels; | 
 |  |  | using WIDESEA_Core.Const; | 
 |  |  | 
 |  |  |  | 
 |  |  |     #region 直接出库任务完成 | 
 |  |  |  | 
 |  |  |     public async Task<WebResponseContent> CompleteInToOutTaskAsync(Dt_Task task) | 
 |  |  |     public async Task<WebResponseContent> CompleteInToOutTaskAsync(Dt_Task task, DtStockInfo stock) | 
 |  |  |     { | 
 |  |  |         WebResponseContent content = new WebResponseContent(); | 
 |  |  |         try | 
 |  |  |         { | 
 |  |  |             //添加历史 | 
 |  |  |             var taskHty = CreateHistoricalTask(task); | 
 |  |  |             // 添加历史任务 | 
 |  |  |             var isTaskHtyAdd = await _task_HtyRepository.AddDataAsync(taskHty) > 0; | 
 |  |  |             //删除任务 | 
 |  |  |             BaseDal.DeleteData(task); | 
 |  |  |             DtStockInfo_Hty stockInfo_Hty = null; | 
 |  |  |             if (stock != null) | 
 |  |  |             { | 
 |  |  |                 stockInfo_Hty = stock.Adapt<DtStockInfo_Hty>(); | 
 |  |  |                 stockInfo_Hty.ModifyDate = DateTime.Now; | 
 |  |  |             } | 
 |  |  |             var taskHty = task.Adapt<Dt_Task_Hty>(); | 
 |  |  |             taskHty.FinishTime = DateTime.Now; | 
 |  |  |             taskHty.OperateType = App.User.UserName != null ? (int)OperateTypeEnum.人工完成 : (int)OperateTypeEnum.自动完成; | 
 |  |  |             taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System"; | 
 |  |  |  | 
 |  |  |             var location = _locationRepository.QueryFirst(x => x.LocationCode == task.SourceAddress && x.RoadwayNo == task.Roadway); | 
 |  |  |             if (location != null) | 
 |  |  |             { | 
 |  |  |                 int lastStatus = location.LocationStatus; | 
 |  |  |                 location.LocationStatus = (int)LocationEnum.Free; | 
 |  |  |                 _locationStatusChangeRecordRepository.AddLocationStatusChangeRecord(location, lastStatus, (int)StatusChangeTypeEnum.AutomaticDelivery, task.TaskNum); | 
 |  |  |             } | 
 |  |  |             task.TaskState = (int)TaskOutStatusEnum.OutFinish; | 
 |  |  |  | 
 |  |  |             // 事务处理 | 
 |  |  |             await _unitOfWorkManage.UseTranAsync(async () => | 
 |  |  |             { | 
 |  |  |                 if (stockInfo_Hty != null) | 
 |  |  |                 { | 
 |  |  |                     await DeleteStockInfoAsync(stock.Id); | 
 |  |  |                     await DeleteStockInfoDetailsAsync(stock.StockInfoDetails); | 
 |  |  |                     await AddStockInfoHtyAsync(stockInfo_Hty); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 if (location != null) | 
 |  |  |                 { | 
 |  |  |                     await UpdateLocationAsync(location); | 
 |  |  |                 } | 
 |  |  |                 await DeleteTaskAsync(task.TaskId); | 
 |  |  |                 await AddTaskHtyAsync(taskHty); | 
 |  |  |             }); | 
 |  |  |  | 
 |  |  |             return content.OK(); | 
 |  |  |         } | 
 |  |  | 
 |  |  |             Dt_StationManager station = _stationManagerRepository.QueryFirst(x => x.stationChildCode == json.Position && x.stationType == 12 && x.stationArea == "Call"); | 
 |  |  |             if (station == null) { throw new Exception($"未找到包装站台信息,请检查传入参数{json.Position}"); } | 
 |  |  |  | 
 |  |  |             EqptRunDto basic = new EqptRunDto() | 
 |  |  |             { | 
 |  |  |                 EquipmentModel = "0", | 
 |  |  |                 Password = "", | 
 |  |  |                 EmployeeNo = "82412152", | 
 |  |  |                 SessionId = Guid.NewGuid().ToString(), | 
 |  |  |                 RequestTime = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now).ToString("yyyy-MM-ddTHH:mm:ss.fffZ"), | 
 |  |  |                 Software = "包装上料", | 
 |  |  |                 EquipmentCode = station.stationEquipMOM, | 
 |  |  |             }; | 
 |  |  |             var result = _agingInOrOutInputService.Change(basic).Result; | 
 |  |  |             var respone = JsonConvert.DeserializeObject<EqptRunDTO>(result.Data.ToString()); | 
 |  |  |             if (!result.Status || !respone.Success) | 
 |  |  |             { | 
 |  |  |                 throw new Exception($"{station.productLine}获取MOM换型数据异常,异常信息{respone.MOMMessage}"); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             var deviceCode = SqlSugarHelper.DbWCS.Queryable<Dt_DeviceInfo>() | 
 |  |  |                 .Where(x => x.DeviceStatus == "1") | 
 |  |  |                 .Where(x => x.DeviceCode.Contains("CWSC")) // 过滤条件 | 
 |  |  |                 .ToList().Select(x => x.DeviceCode).ToList(); | 
 |  |  |  | 
 |  |  |             // 修改后的查询代码 | 
 |  |  |             var stockInfo = await _stockInfoRepository.Db.Queryable<DtStockInfo>() | 
 |  |  |                                 .Includes(x => x.LocationInfo) | 
 |  |  |                                 .Includes(x => x.StockInfoDetails) | 
 |  |  |                                 .Where(x => x.ProductionLine == station.productLine) | 
 |  |  |                                 .Where(x => x.AreaCode == "CWSC3" && x.IsFull == true) | 
 |  |  |                                 // 增加对 LocationInfo 的空值检查 | 
 |  |  |                                 .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock) | 
 |  |  |                                 // 增加对 LocationInfo 的空值检查 | 
 |  |  |                                 .WhereIF(!deviceCode.IsNullOrEmpty(), x => deviceCode.Contains(x.LocationInfo.RoadwayNo)) | 
 |  |  |                                 .OrderBy(x => x.OutboundTime) | 
 |  |  |                                 .FirstAsync(); | 
 |  |  |             #region 旧的查询代码 | 
 |  |  |             //var outBoundMateriel = _dt_ChangeoversRepository.QueryData(x => x.Status == "1").ToList(); | 
 |  |  |             //List<string>? materielCodes = outBoundMateriel.Count != 0 | 
 |  |  |             //    ? outBoundMateriel.Where(x => x.ProductionLine == station.productLine && x.ProcessCode == "CWSC3") | 
 |  |  |             //                      .Select(x => x.MaterielCode) | 
 |  |  |             //                      .ToList() | 
 |  |  |             //    : null; | 
 |  |  |  | 
 |  |  |             if (stockInfo.IsNullOrEmpty()) throw new Exception($"CWSC3库内{station.productLine}无满足条件的库存可出库"); | 
 |  |  |             // 修改后的查询代码 | 
 |  |  |             //var stockInfo = await _stockInfoRepository.Db.Queryable<DtStockInfo>() | 
 |  |  |             //                    .Includes(x => x.LocationInfo) | 
 |  |  |             //                    .Includes(x => x.StockInfoDetails) | 
 |  |  |             //                    .Where(x => x.ProductionLine == station.productLine) | 
 |  |  |             //                    .Where(x => x.AreaCode == "CWSC3" && x.IsFull == true) | 
 |  |  |             //                    // 增加对 LocationInfo 的空值检查 | 
 |  |  |             //                    .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock) | 
 |  |  |             //                    // 增加对 LocationInfo 的空值检查 | 
 |  |  |             //                    .WhereIF(!deviceCode.IsNullOrEmpty(), x => deviceCode.Contains(x.LocationInfo.RoadwayNo)) | 
 |  |  |             //                    .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode))) | 
 |  |  |             //                    .OrderBy(x => x.OutboundTime) | 
 |  |  |             //                    .FirstAsync(); | 
 |  |  |             #endregion | 
 |  |  |  | 
 |  |  |             DtStockInfo stockInfo = null; | 
 |  |  |             var stockInfoList = await _stockInfoRepository.Db.Queryable<DtStockInfo>() | 
 |  |  |                 .Includes(x => x.LocationInfo) | 
 |  |  |                 .Where(x => x.ProductionLine == station.productLine | 
 |  |  |                         && x.AreaCode == "CWSC3" | 
 |  |  |                         && x.IsFull == true | 
 |  |  |                         && x.LocationInfo.LocationStatus == (int)LocationEnum.InStock) | 
 |  |  |                 .WhereIF(!deviceCode.IsNullOrEmpty(), x => deviceCode.Contains(x.LocationInfo.RoadwayNo)) | 
 |  |  |                 .OrderBy(x => x.OutboundTime) | 
 |  |  |                 .ToListAsync(); | 
 |  |  |  | 
 |  |  |             foreach (var stock in stockInfoList) | 
 |  |  |             { | 
 |  |  |                 var hasMatchingDetail = await _stockInfoRepository.Db.Queryable<DtStockInfoDetail>() | 
 |  |  |                     .Where(d => d.StockId == stock.Id && respone.PreProductNo.Contains(d.MaterielCode)) | 
 |  |  |                     .AnyAsync(); | 
 |  |  |  | 
 |  |  |                 if (hasMatchingDetail) | 
 |  |  |                 { | 
 |  |  |                     stockInfo = stock; | 
 |  |  |                     break; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if (stockInfo.IsNullOrEmpty()) throw new Exception($"CWSC3库内【{station.productLine}】,【物料编码{respone.PreProductNo}】无满足条件的库存可出库"); | 
 |  |  |  | 
 |  |  |             DtLocationInfo locationInfo = _locationRepository.QueryFirst(x => x.AreaId == 5 && x.LocationCode == stockInfo.LocationCode); | 
 |  |  |  | 
 |  |  | 
 |  |  |         catch (Exception ex) | 
 |  |  |         { | 
 |  |  |             Console.WriteLine($"CW3至包装出库异常:{ex.ToString()}"); | 
 |  |  |  | 
 |  |  |             LogFactory.GetLog($"包装请求出库任务").Info(true, $"【异常】:【{ex.Message}】{Environment.NewLine}【{ex.StackTrace}】{Environment.NewLine}{Environment.NewLine}"); | 
 |  |  |  | 
 |  |  |             return content.Error($"失败:{ex.Message}"); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | 
 |  |  |  | 
 |  |  |     #region 火警出库 | 
 |  |  |  | 
 |  |  |     public WebResponseContent EmergencyTask(object obj) | 
 |  |  |     public WebResponseContent EmergencyTask(Object obj) | 
 |  |  |     { | 
 |  |  |         WebResponseContent content = new WebResponseContent(); | 
 |  |  |         var emergencyTask = new DTSEmergencyTask(); | 
 |  |  |         try | 
 |  |  |         { | 
 |  |  |             Console.WriteLine($"火警参数:{obj.ToString()}"); | 
 |  |  |             emergencyTask = JsonConvert.DeserializeObject<DTSEmergencyTask>(obj.ToString()); | 
 |  |  |  | 
 |  |  |             if (emergencyTask == null) throw new Exception("火警参数为空"); | 
 |  |  |  | 
 |  |  |             string[] strings = emergencyTask.LocationCode.Split("-"); | 
 |  |  |  | 
 |  |  |             string[] Roadways = strings[0].Select(x => x.ToString()).ToArray(); | 
 |  |  |             string Roadway = string.Empty; | 
 |  |  |             switch (Roadways[0]) | 
 |  |  |             { | 
 |  |  |                 case "J": | 
 |  |  |                     Roadway = "JZSC" + Roadways[1]; | 
 |  |  |                     break; | 
 |  |  |                 case "G": | 
 |  |  |                     Roadway = "GWSC" + Roadways[1]; | 
 |  |  |                     break; | 
 |  |  |                 case "C": | 
 |  |  |                     Roadway = "CWSC" + Roadways[1]; | 
 |  |  |                     break; | 
 |  |  |                 default: throw new Exception("未识别库位编码"); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             string Roadway = strings[0]; | 
 |  |  |             //switch (Roadways[0]) | 
 |  |  |             //{ | 
 |  |  |             //    case "J": | 
 |  |  |             //        Roadway = "JZSC" + Roadways[1]; | 
 |  |  |             //        break; | 
 |  |  |             //    case "G": | 
 |  |  |             //        Roadway = "GWSC" + Roadways[1]; | 
 |  |  |             //        break; | 
 |  |  |             //    case "C": | 
 |  |  |             //        Roadway = "CWSC" + Roadways[1]; | 
 |  |  |             //        break; | 
 |  |  |             //    default: throw new Exception("未识别库位编码"); | 
 |  |  |             //} | 
 |  |  |             int Row = Convert.ToInt16(strings[1]); | 
 |  |  |             int Column = Convert.ToInt16(strings[2]); | 
 |  |  |             int Layer = Convert.ToInt16(strings[3]); | 
 |  |  |             if (!strings[0].Contains("SC")) throw new Exception("未知库区"); | 
 |  |  |             for (int i = 0; i < 2; i++) | 
 |  |  |             { | 
 |  |  |                 DtLocationInfo locationInfo = _locationRepository.QueryFirst(x => x.Row == Convert.ToInt16(strings[1]) && x.Column == Convert.ToInt16(strings[2]) && x.Layer == (i == 0 ? Convert.ToInt16(strings[3]) * 2 - 1 : Convert.ToInt16(strings[3]) * 2) && x.RoadwayNo == Roadway); | 
 |  |  |                 DtLocationInfo locationInfo = _locationRepository.QueryFirst(x => x.Row == Row && x.Column == Column && x.Layer == (i == 0 ? Layer - 1 : Layer) && x.RoadwayNo == Roadway); | 
 |  |  |                 if (locationInfo == null) | 
 |  |  |                 { | 
 |  |  |                     throw new Exception("未知库位"); | 
 |  |  | 
 |  |  |  | 
 |  |  |                 var configs = _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); | 
 |  |  |                 var ipAddress = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.WCSIPAddress)?.ConfigValue; | 
 |  |  |                 var ReceiveByWMSTask = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.ReceiveByWMSTask)?.ConfigValue; | 
 |  |  |                 if (ReceiveByWMSTask == null || ipAddress == null) | 
 |  |  |                 var ReceiveByWMSFireAlarmTask = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.ReceiveByWMSFireAlarmTask)?.ConfigValue; | 
 |  |  |                 if (ReceiveByWMSFireAlarmTask == null || ipAddress == null) | 
 |  |  |                 { | 
 |  |  |                     throw new Exception("WMS IP 未配置"); | 
 |  |  |                 } | 
 |  |  |                 var wmsIpAddrss = ipAddress + ReceiveByWMSTask; | 
 |  |  |  | 
 |  |  |                 var respon = HttpHelper.Post(wmsIpAddrss, JsonConvert.SerializeObject(taskDTO)); | 
 |  |  |                 var wmsIpAddrss = ipAddress + ReceiveByWMSFireAlarmTask; | 
 |  |  |                 List<WMSTaskDTO> taskDTOs = new List<WMSTaskDTO>(); | 
 |  |  |                 taskDTOs.Add(taskDTO); | 
 |  |  |                 var respon = HttpHelper.Post(wmsIpAddrss, JsonConvert.SerializeObject(taskDTOs)); | 
 |  |  |                 if (respon != null) | 
 |  |  |                 { | 
 |  |  |                     WebResponseContent respone = JsonConvert.DeserializeObject<WebResponseContent>(respon.ToString()); |