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(t => t.LocationCode == location.LocationCode); 
 | 
  
 | 
            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处理失败"); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
} 
 |