|  |  | 
 |  |  | 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("火警参数为空"); | 
 |  |  |  | 
 |  |  |             DtLocationInfo locationInfo = _locationRepository.QueryFirst(x => x.Row == emergencyTask.row && x.Column == emergencyTask.column && x.Layer == emergencyTask.layer && x.AreaId == emergencyTask.zone); | 
 |  |  |             if (locationInfo == null) | 
 |  |  |             string[] strings = emergencyTask.LocationCode.Split("-"); | 
 |  |  |             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++) | 
 |  |  |             { | 
 |  |  |                 throw new Exception("未知库位"); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             //查找消防站台 | 
 |  |  |             var station = _stationManagerRepository.QueryFirst(t => t.Roadway == locationInfo.RoadwayNo | 
 |  |  |                  && t.stationType == (int)StationManager.FireStation | 
 |  |  |                  /*&& t. == "Enable"*/); | 
 |  |  |             if (station == null) | 
 |  |  |             { | 
 |  |  |                 throw new Exception("消防站台未配置!"); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             //查找库存信息 | 
 |  |  |             var stockInfo = _stockInfoRepository.QueryFirst(x => x.LocationCode == locationInfo.LocationCode && x.LocationInfo.RoadwayNo == locationInfo.RoadwayNo); | 
 |  |  |             //托盘码 | 
 |  |  |             string barcode = string.Empty; | 
 |  |  |             if (stockInfo != null) | 
 |  |  |             { | 
 |  |  |                 barcode = stockInfo.PalletCode; | 
 |  |  |             } | 
 |  |  |             else | 
 |  |  |             { | 
 |  |  |                 //无库存信息,生成随机托盘码 | 
 |  |  |                 barcode = "M" + DateTime.Now.ToString("MMddHHmmss") + "-" + new Random().Next(100, 1000); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             Dt_Task fireTask = BaseDal.QueryFirst(x => x.TaskType == 500 && x.SourceAddress == locationInfo.LocationCode && x.Roadway == station.Roadway); | 
 |  |  |  | 
 |  |  |             if (fireTask != null) | 
 |  |  |             { | 
 |  |  |                 throw new Exception("已添加火警出库任务"); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             int taskNum = BaseDal.GetTaskNo().Result; | 
 |  |  |             Dt_Task task = new Dt_Task | 
 |  |  |             { | 
 |  |  |                 CreateDate = DateTime.Now, | 
 |  |  |                 Creater = "DTS", | 
 |  |  |                 CurrentAddress = locationInfo.LocationCode, | 
 |  |  |                 Grade = 1, | 
 |  |  |                 Dispatchertime = DateTime.Now, | 
 |  |  |                 PalletCode = barcode, | 
 |  |  |                 Roadway = station.Roadway, | 
 |  |  |                 SourceAddress = locationInfo.LocationCode, | 
 |  |  |                 TaskState = (int)TaskOutStatusEnum.OutNew, | 
 |  |  |                 TaskType = 500, | 
 |  |  |                 TargetAddress = station.stationLocation, | 
 |  |  |                 NextAddress = station.stationChildCode, | 
 |  |  |                 TaskNum = taskNum, //_taskRepository.GetTaskNo().Result, | 
 |  |  |                 TaskId = 0, | 
 |  |  |             }; | 
 |  |  |  | 
 |  |  |             // 尝试添加新任务 | 
 |  |  |             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 = 500, | 
 |  |  |             }; | 
 |  |  |  | 
 |  |  |             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) | 
 |  |  |             { | 
 |  |  |                 throw new Exception("WMS IP 未配置"); | 
 |  |  |             } | 
 |  |  |             var wmsIpAddrss = ipAddress + ReceiveByWMSTask; | 
 |  |  |  | 
 |  |  |             var respon = HttpHelper.Post(wmsIpAddrss, JsonConvert.SerializeObject(taskDTO)); | 
 |  |  |             if (respon != null) | 
 |  |  |             { | 
 |  |  |                 WebResponseContent respone = JsonConvert.DeserializeObject<WebResponseContent>(respon.ToString()); | 
 |  |  |                 if (respone.Status) | 
 |  |  |                 DtLocationInfo locationInfo = _locationRepository.QueryFirst(x => x.Row == Row && x.Column == Column && x.Layer == (i == 0 ? Layer - 1 : Layer) && x.RoadwayNo == Roadway); | 
 |  |  |                 if (locationInfo == null) | 
 |  |  |                 { | 
 |  |  |                     var taskId = BaseDal.AddData(task); | 
 |  |  |                     throw new Exception("未知库位"); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 //查找消防站台 | 
 |  |  |                 var station = _stationManagerRepository.QueryFirst(t => t.Roadway == locationInfo.RoadwayNo && t.stationType == (int)StationManager.FireStation); | 
 |  |  |                 if (station == null) | 
 |  |  |                 { | 
 |  |  |                     throw new Exception("消防站台未配置!"); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 //查找库存信息 | 
 |  |  |                 var stockInfo = _stockInfoRepository.QueryFirst(x => x.LocationCode == locationInfo.LocationCode && x.LocationInfo.RoadwayNo == locationInfo.RoadwayNo); | 
 |  |  |                 //托盘码 | 
 |  |  |                 string barcode = string.Empty; | 
 |  |  |                 if (stockInfo != null) | 
 |  |  |                 { | 
 |  |  |                     barcode = stockInfo.PalletCode; | 
 |  |  |                 } | 
 |  |  |                 else | 
 |  |  |                 { | 
 |  |  |                     throw new Exception("WCS处理失败:" + respone.Message); | 
 |  |  |                     //无库存信息,生成随机托盘码 | 
 |  |  |                     barcode = "M" + DateTime.Now.ToString("MMddHHmmss") + "-" + new Random().Next(100, 1000); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             else | 
 |  |  |             { | 
 |  |  |                 throw new Exception("请求处理失败"); | 
 |  |  |  | 
 |  |  |                 Dt_Task fireTask = BaseDal.QueryFirst(x => x.TaskType == (int)TaskOutboundTypeEnum.OutFireAlarm && x.SourceAddress == locationInfo.LocationCode && x.Roadway == station.Roadway); | 
 |  |  |  | 
 |  |  |                 if (fireTask != null) | 
 |  |  |                 { | 
 |  |  |                     throw new Exception("已添加火警出库任务"); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 int taskNum = BaseDal.GetTaskNo().Result; | 
 |  |  |                 Dt_Task task = new Dt_Task | 
 |  |  |                 { | 
 |  |  |                     CreateDate = DateTime.Now, | 
 |  |  |                     Creater = "DTS", | 
 |  |  |                     CurrentAddress = locationInfo.LocationCode, | 
 |  |  |                     Grade = i == 0 ? 5 : 3, | 
 |  |  |                     Dispatchertime = DateTime.Now, | 
 |  |  |                     PalletCode = barcode, | 
 |  |  |                     Roadway = station.Roadway, | 
 |  |  |                     SourceAddress = locationInfo.LocationCode, | 
 |  |  |                     TaskState = (int)TaskOutStatusEnum.OutNew, | 
 |  |  |                     TaskType = (int)TaskOutboundTypeEnum.OutFireAlarm, | 
 |  |  |                     TargetAddress = station.stationLocation, | 
 |  |  |                     NextAddress = station.stationLocation, | 
 |  |  |                     TaskNum = taskNum, //_taskRepository.GetTaskNo().Result, | 
 |  |  |                     TaskId = 0, | 
 |  |  |                 }; | 
 |  |  |  | 
 |  |  |                 // 尝试添加新任务 | 
 |  |  |                 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, | 
 |  |  |                 }; | 
 |  |  |  | 
 |  |  |                 var configs = _configService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); | 
 |  |  |                 var ipAddress = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.WCSIPAddress)?.ConfigValue; | 
 |  |  |                 var ReceiveByWMSFireAlarmTask = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.ReceiveByWMSFireAlarmTask)?.ConfigValue; | 
 |  |  |                 if (ReceiveByWMSFireAlarmTask == null || ipAddress == null) | 
 |  |  |                 { | 
 |  |  |                     throw new Exception("WMS IP 未配置"); | 
 |  |  |                 } | 
 |  |  |                 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()); | 
 |  |  |                     if (respone.Status) | 
 |  |  |                     { | 
 |  |  |                         var taskId = BaseDal.AddData(task); | 
 |  |  |                     } | 
 |  |  |                     else | 
 |  |  |                     { | 
 |  |  |                         throw new Exception("WCS处理失败:" + respone.Message); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |                 else | 
 |  |  |                 { | 
 |  |  |                     throw new Exception("请求处理失败"); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             LogFactory.GetLog("DTS火警出库").Info(true, $"\r\r--------------------------------------"); | 
 |  |  |             LogFactory.GetLog("DTS火警出库").Info(true, obj.ToJsonString()); |