| using AngleSharp.Dom; | 
| using log4net.Core; | 
| using Masuit.Tools; | 
| using Newtonsoft.Json; | 
| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using System.Text; | 
| using System.Threading.Tasks; | 
| using WIDESEA_Common; | 
| using WIDESEA_Core; | 
| using WIDESEA_Core.Const; | 
| using WIDESEA_Core.Enums; | 
| using WIDESEA_Core.Helper; | 
| using WIDESEA_DTO; | 
| using WIDESEA_DTO.WMS; | 
| using WIDESEA_Model.Models; | 
|   | 
| namespace WIDESEA_StoragIntegrationServices | 
| { | 
|     public partial class MCSService | 
|     { | 
|         /// <summary> | 
|         /// 请求移库 | 
|         /// </summary> | 
|         /// <param name="json"></param> | 
|         /// <returns></returns> | 
|         public WebResponseContent RequestChangeLocation(object json) | 
|         { | 
|             WebResponseContent content = new WebResponseContent(); | 
|             try | 
|             { | 
|                 if (string.IsNullOrEmpty(json.ToString())) throw new Exception("请求参数为空"); | 
|   | 
|                 var result = JsonConvert.DeserializeObject<RequestReMove>(json.ToString()); | 
|   | 
|                 var location = _locationRepository.QueryFirst(x => x.AreaId == result.LocationArea && x.LocationCode == result.LocationID); | 
|   | 
|                 if (location == null) throw new Exception("未知库位"); | 
|   | 
|                 if (_taskRepository.QueryFirst(x => x.SourceAddress == result.LocationID && x.Roadway == location.RoadwayNo) != null) | 
|                 { | 
|                     throw new Exception("当前库位已存在任务"); | 
|                 } | 
|   | 
|                 switch (result.MoveType) | 
|                 { | 
|                     case 1: | 
|                         CreateMoveTask(location); | 
|                         break; | 
|                     case 5: | 
|                         CreateFireTask(location); | 
|                         break; | 
|                     default: | 
|                         throw new Exception("无效的移库申请类型"); | 
|                 } | 
|   | 
|                 #region 火警出库 | 
|                 //if (result.MoveType == 5) | 
|                 //{ | 
|                 //    Console.WriteLine($"分容检测柜火警触发:库位{result.LocationID}"); | 
|   | 
|                 //    //查找消防站台 | 
|                 //    var station = _stationManagerRepository.QueryFirst(t => t.Roadway == location.RoadwayNo | 
|                 //         && t.stationType == (int)StationManager.FireStation | 
|                 //         /*&& t. == "Enable"*/); | 
|                 //    if (station == null) | 
|                 //    { | 
|                 //        throw new Exception("消防站台未配置!"); | 
|                 //    } | 
|                 //    //查找库存信息 | 
|                 //    var barcodeData = _stockInfoRepository.QueryFirst(t => t.LocationCode == location.LocationCode); | 
|                 //    //托盘码 | 
|                 //    string barcode = string.Empty; | 
|                 //    if (barcodeData != null) | 
|                 //    { | 
|                 //        barcode = barcodeData.PalletCode; | 
|                 //    } | 
|                 //    else | 
|                 //    { | 
|                 //        //无库存信息,生成随机托盘码 | 
|                 //        barcode = "M" + DateTime.Now.ToString("MMddHHmmss") + "-" + new Random().Next(100, 1000); | 
|                 //    } | 
|                 //    int taskNum = _taskRepository.GetTaskNo().Result; | 
|                 //    Dt_Task task = new Dt_Task | 
|                 //    { | 
|                 //        CreateDate = DateTime.Now, | 
|                 //        Creater = "HK", | 
|                 //        CurrentAddress = result.LocationID, | 
|                 //        Grade = 1, | 
|                 //        Dispatchertime = DateTime.Now, | 
|                 //        PalletCode = barcode, | 
|                 //        Roadway = location.RoadwayNo, | 
|                 //        SourceAddress = result.LocationID, | 
|                 //        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, | 
|                 //    }; | 
|                 //}  | 
|                 #endregion | 
|   | 
|                 LogFactory.GetLog("分容移库申请").Info(true, $"\r\r--------------------------------------"); | 
|                 LogFactory.GetLog("分容移库申请").Info(true, result.ToJsonString()); | 
|                 return content.OK(); | 
|             } | 
|             catch (Exception ex) | 
|             { | 
|                 LogFactory.GetLog("分容移库申请").Info(true, $"\r\r--------------------------------------"); | 
|                 LogFactory.GetLog("分容移库申请").Info(true, ex.Message); | 
|                 return content.Error(ex.Message); | 
|             } | 
|         } | 
|   | 
|         private void CreateMoveTask(DtLocationInfo location) | 
|         { | 
|             Console.WriteLine($"分容申请移库:库位{location.LocationCode}"); | 
|   | 
|             //查找可用库位 | 
|             DtLocationInfo CanRelocation = _locationRepository.QueryFirst(x => x.LocationStatus == (int)LocationEnum.Free && x.RoadwayNo == location.RoadwayNo && x.EnalbeStatus == 1 && x.LocationType == 2 && x.Remark == "1"); | 
|   | 
|             if (CanRelocation == null) throw new Exception("申请移库失败:无可用库位"); | 
|   | 
|             //查找库存信息 | 
|             var stockInfo = _stockInfoRepository.QueryFirst(x => x.LocationCode == location.LocationCode && x.LocationInfo.RoadwayNo == location.RoadwayNo); | 
|   | 
|             if (stockInfo == null) throw new Exception("申请移库失败:无库存记录"); | 
|   | 
|             //修改移库目标库位状态 | 
|             CanRelocation.LocationStatus = (int)LocationEnum.FreeDisable; | 
|   | 
|             int taskNum = _taskRepository.GetTaskNo().Result; | 
|             Dt_Task task = new Dt_Task | 
|             { | 
|                 CreateDate = DateTime.Now, | 
|                 Creater = "HK", | 
|                 CurrentAddress = location.LocationCode, | 
|                 Grade = 1, | 
|                 Dispatchertime = DateTime.Now, | 
|                 PalletCode = stockInfo.PalletCode, | 
|                 Roadway = location.RoadwayNo, | 
|                 SourceAddress = location.LocationCode, | 
|                 TaskState = (int)TaskStatus.Created, | 
|                 TaskType = (int)TaskRelocationTypeEnum.Relocation, | 
|                 TargetAddress = CanRelocation.LocationCode, | 
|                 NextAddress = CanRelocation.LocationCode, | 
|                 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 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));   //http://localhost:9291/api/Task/ReceiveTask, | 
|             if (respon != null) | 
|             { | 
|                 WebResponseContent respone = JsonConvert.DeserializeObject<WebResponseContent>(respon.ToString()); | 
|                 if (respone.Status) | 
|                 { | 
|                     //添加WMS任务 并修改库位状态 | 
|                     var taskId = _taskRepository.AddData(task); | 
|                     _locationRepository.UpdateData(CanRelocation); | 
|                 } | 
|                 else | 
|                 { | 
|                     throw new Exception("WCS处理失败:" + respone.Message); | 
|                 } | 
|             } | 
|             else | 
|             { | 
|                 throw new Exception("WCS处理失败"); | 
|             } | 
|         } | 
|   | 
|   | 
|         private void CreateFireTask(DtLocationInfo location) | 
|         { | 
|             Console.WriteLine($"分容检测柜火警触发:库位{location.LocationCode}"); | 
|   | 
|             //查找消防站台 | 
|             var station = _stationManagerRepository.QueryFirst(t => t.Roadway == location.RoadwayNo | 
|                  && t.stationType == (int)StationManager.FireStation | 
|                  /*&& t. == "Enable"*/); | 
|             if (station == null) | 
|             { | 
|                 throw new Exception("消防站台未配置!"); | 
|             } | 
|             //查找库存信息 | 
|             var barcodeData = _stockInfoRepository.QueryFirst(t => t.LocationCode == location.LocationCode); | 
|             //托盘码 | 
|             string barcode = string.Empty; | 
|             if (barcodeData != null) | 
|             { | 
|                 barcode = barcodeData.PalletCode; | 
|             } | 
|             else | 
|             { | 
|                 //无库存信息,生成随机托盘码 | 
|                 barcode = "M" + DateTime.Now.ToString("MMddHHmmss") + "-" + new Random().Next(100, 1000); | 
|             } | 
|             int taskNum = _taskRepository.GetTaskNo().Result; | 
|             Dt_Task task = new Dt_Task | 
|             { | 
|                 CreateDate = DateTime.Now, | 
|                 Creater = "HK", | 
|                 CurrentAddress = location.LocationCode, | 
|                 Grade = 1, | 
|                 Dispatchertime = DateTime.Now, | 
|                 PalletCode = barcode, | 
|                 Roadway = location.RoadwayNo, | 
|                 SourceAddress = location.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));   //http://localhost:9291/api/Task/ReceiveTask, | 
|             if (respon != null) | 
|             { | 
|                 WebResponseContent respone = JsonConvert.DeserializeObject<WebResponseContent>(respon.ToString()); | 
|                 if (respone.Status) | 
|                 { | 
|                     var taskId = _taskRepository.AddData(task); | 
|                 } | 
|   | 
|                 else | 
|                 { | 
|                     throw new Exception("WCS处理失败:" + respone.Message); | 
|                 } | 
|             } | 
|             else | 
|             { | 
|                 throw new Exception("WCS处理失败"); | 
|             } | 
|         } | 
|     } | 
| } |