dengjunjie
2025-02-24 cde56aae50adc11ff8db84e424d873843c566bfd
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ShuttleCarJob/ShuttleCarExtend/PartialTaskService.cs
@@ -22,22 +22,25 @@
        private object _CarTaskObject = new object();
        #region å †åž›æœºç§»è½¦å®Œæˆ
        /// <summary>
        /// èŽ·å–å †åž›æœºç§»è½¦å®Œæˆä»»åŠ¡
        /// èŽ·å–å †åž›æœºç§»è½¦/移库完成任务
        /// </summary>
        public void GetSC_CarFinish()
        {
            Dt_Task dt_Task = GetTask((int)TaskCarStatusEnum.SC_CarFinish, (int)TaskOtherTypeEnum.RelocationCar);//移车任务
            Dt_Task dt_Task = GetTask(TaskCarStatusEnum.SC_CarFinish.ObjToInt(), TaskOtherTypeEnum.RelocationCar.ObjToInt());//移车任务
            if (dt_Task != null)
            {
                UpdateShuttleCar(dt_Task.ShuttleCarCode, dt_Task.CurrentAddress);
                _taskService.AddTask_Hty(dt_Task, TaskOperateTypeEnum.AutoComplete);
            }
            dt_Task = GetTask((int)CarChargingTask.SC_CarFinish, (int)TaskOtherTypeEnum.RelocationCarCharging);//移车充电任务
            dt_Task = GetTask(CarChargingTaskEnum.SC_CarFinish.ObjToInt(), TaskOtherTypeEnum.RelocationCarCharging.ObjToInt());//移车充电任务
            if (dt_Task != null)
            {
                UpdateShuttleCar(dt_Task.ShuttleCarCode, dt_Task.CurrentAddress);
                SendTask(dt_Task);//下发充电任务
            }
            dt_Task = GetTask(TaskRelocationStatusEnum.SC_RelocationFinish.ObjToInt(), TaskRelocationTypeEnum.Relocation.ObjToInt());//移库任务
            if (dt_Task != null)
                SendTask(dt_Task);
        }
        #endregion
        /// <summary>
@@ -71,21 +74,17 @@
        {
            lock (_CarTaskObject)
            {
                Dt_Task dt_Task = GetTask((int)TaskCarStatusEnum.CarNew, (int)TaskOtherTypeEnum.RelocationCar);//获取新建移车任务
                #region èŽ·å–æ–°å»ºç§»è½¦ä»»åŠ¡
                Dt_Task dt_Task = GetTask((int)TaskCarStatusEnum.CarNew, (int)TaskOtherTypeEnum.RelocationCar);
                if (dt_Task != null)
                {
                    if (string.IsNullOrEmpty(dt_Task.SourceAddress))
                    {
                        if (command.Status == (short)ShuttleCarStatus.Standby && command.TaskTypeComplete == (short)ShuttleCarTaskComplete.Standby && command.Err_Status == (short)ShuttleCarErr.Normal)
                        {
                            UpdateSource(ref dt_Task, shuttleCar);
                        }
                        (bool, Dt_ShuttleCar) result = GetSourceTask(shuttleCar, command);
                        if (result.Item1)
                            UpdateSource(ref dt_Task, result.Item2);
                        else
                        {//需优化
                            #region åˆ¤æ–­æ˜¯å¦å­˜åœ¨ç©ºé—²ç©¿æ¢­è½¦,如都在充电(选择电量高的并超过50%电量的穿梭车退出充电)
                            QuitCharging(dt_Task, shuttleCar, command);
                            #endregion
                        }
                            GetShuttleCar(ref dt_Task, shuttleCar);//获取另外一个穿梭车信息
                    }
                    else if (string.IsNullOrEmpty(dt_Task.TargetAddress))
                    {
@@ -111,27 +110,31 @@
                        SendTask(dt_Task);
                    }
                }
                #region ç©¿æ¢­è½¦å‡ºå…¥åº“任务
                #endregion
                #region ç©¿æ¢­è½¦ä»»åŠ¡
                else
                {
                    var task1 = _taskService.ShuttleCarRelocationTask(shuttleCar.DeviceCode);//获取穿梭车移库任务
                    var task = _taskService.QueryShuttleCarTask(shuttleCar.DeviceCode);
                    var task = _taskService.ShuttleCarRelocationTask(shuttleCar.DeviceCode);//获取穿梭车移库任务
                    if (task != null)
                    {
                        if (task.TaskType == (int)TaskRelocationTypeEnum.Relocation && task.TaskState == (int)TaskRelocationStatusEnum.RelocationNew && !task.SourceIsPickPlace)//移库任务判断起点是否有穿梭车
                        {
                            var ShuttleCar = _shuttleCarService.QueryShuttleCar(task.SourceAddress);
                            if (ShuttleCar != null) SendTask(task);
                            else _taskService.AddRelocationCarTask("", task.SourceAddress);
                        }
                        else if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound && !task.SourceIsPickPlace)
                        {
                            var ShuttleCar = _shuttleCarService.QueryShuttleCar(task.SourceAddress);//出库任务判断起点是否有穿梭车
                            if (ShuttleCar != null) SendTask(task);
                            else _taskService.AddRelocationCarTask("", task.SourceAddress);
                        }
                        else
                        if (!task.SourceIsPickPlace)
                            SendTask(task);
                    }
                    else
                    {
                        task = _taskService.QueryShuttleCarTask(shuttleCar.DeviceCode);
                        if (task != null)
                        {
                            if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound && !task.SourceIsPickPlace)
                            {
                                var ShuttleCar = _shuttleCarService.QueryShuttleCar(task.SourceAddress);//出库任务判断起点是否有穿梭车
                                if (ShuttleCar != null) SendTask(task);
                                else _taskService.AddRelocationCarTask("", task.SourceAddress);
                            }
                            else
                                SendTask(task);
                        }
                    }
                }
                #endregion
@@ -146,53 +149,57 @@
        /// <param name="dt_Task"></param>
        /// <param name="shuttleCar"></param>
        /// <param name="command"></param>
        public void UpdateSource(ref Dt_Task dt_Task, ShuttleCar shuttleCar)
        public void UpdateSource(ref Dt_Task dt_Task, Dt_ShuttleCar _ShuttleCar)
        {
            dt_Task.SourceAddress = QueryCode(shuttleCar._deviceCode).ShuttleCarPosition;
            dt_Task.SourceAddress = _ShuttleCar.ShuttleCarPosition;
            dt_Task.CurrentAddress = dt_Task.SourceAddress;
            dt_Task.ShuttleCarCode = shuttleCar._deviceCode;
            dt_Task.ShuttleCarCode = _ShuttleCar.ShuttleCarCode;
            _taskService.UpdateData(dt_Task);
            _taskExecuteDetailService.AddTaskExecuteDetail(dt_Task.TaskNum, "更新移车任务起始地址");
        }
        #endregion
        #region é€€å‡ºå……电任务
        public void QuitCharging(Dt_Task dt_Task, ShuttleCar shuttleCar, ShuttleCarTaskCommandR command)
        /// <summary>
        /// åˆ¤æ–­å½“前穿梭车是否可以执行移库
        /// </summary>
        /// <param name="shuttleCar"></param>
        /// <param name="command"></param>
        /// <returns></returns>
        public (bool, Dt_ShuttleCar) GetSourceTask(ShuttleCar shuttleCar, ShuttleCarTaskCommandR command)
        {
            List<string> shuttleCarCodes = new List<string>() { "RGV01", "RGV02" };
            string CarCode = shuttleCarCodes.Where(x => !x.Contains(shuttleCar.DeviceCode)).First();
            ShuttleCar shuttleCar1 = Storage.Devices.Where(x => x.DeviceCode.Equals(CarCode)).FirstOrDefault() as ShuttleCar;
            if (shuttleCar1 != null)
            Dt_ShuttleCar _ShuttleCar = QueryCode(shuttleCar.DeviceCode);
            bool ok = false;
            if (command.Status == (short)ShuttleCarStatus.Standby && command.TaskTypeComplete == (short)ShuttleCarTaskComplete.Standby && command.Err_Status == (short)ShuttleCarErr.Normal)
            {
                var command1 = ReadCustomer<ShuttleCarTaskCommandR>(shuttleCar1, shuttleCar1.DeviceCode);//读取穿梭车信息
                if (command1.Status == (short)ShuttleCarStatus.Standby && command1.TaskTypeComplete == (short)ShuttleCarTaskComplete.Standby && command1.Err_Status == (short)ShuttleCarErr.Normal)
                #region åˆ¤æ–­å½“前穿梭车是否存在任务
                Dt_Task? _Task = _taskRepository.QueryFirst(x =>
                x.SourceAddress == _ShuttleCar.ShuttleCarPosition ||
                x.TargetAddress == _ShuttleCar.ShuttleCarPosition ||
                x.SourceAddress == _ShuttleCar.ShuttleCarPosition1 ||
                x.TargetAddress == _ShuttleCar.ShuttleCarPosition1);
                #endregion
                ok = _Task == null;
            }
            if (!ok)
            {
                if (command.Status == (short)ShuttleCarStatus.Charging && command.ElectricQuantity >= 50)//退出充电
                {
                    UpdateSource(ref dt_Task, shuttleCar1);
                }
                else
                {
                    //选择电量高的并超过50%电量的穿梭车退出充电
                    command = command.ElectricQuantity > command1.ElectricQuantity ? command : command1;
                    shuttleCar = command.ElectricQuantity > command1.ElectricQuantity ? shuttleCar : shuttleCar1;
                    ok = shuttleCar.SetValue(ShuttleCarDBName.TaskType, (short)ShuttleCarStatus.QuitCharging);
                }
            }
            if (string.IsNullOrEmpty(dt_Task.SourceAddress))
            {
                if (command.ElectricQuantity > 50)
                {
                    ShuttleCarTaskCommandW shuttleCarTaskCommand = new ShuttleCarTaskCommandW();
                    shuttleCarTaskCommand.Direction = command.Position;
                    shuttleCarTaskCommand.TaskNum = dt_Task.TaskNum;
                    shuttleCarTaskCommand.TaskType = (short)ShuttleCarTaskType.ExitCharge;
                    if (shuttleCar.SendCommand(shuttleCarTaskCommand, shuttleCar.DeviceCode))
                    {
                        dt_Task.Remark = "退出充电已下发";
                        UpdateSource(ref dt_Task, shuttleCar);
                    }
                }
            }
            return (ok, _ShuttleCar);
        }
        #endregion
        /// <summary>
        /// èŽ·å–å¦å¤–ä¸€ä¸ªç©¿æ¢­è½¦ä¿¡æ¯
        /// </summary>
        public void GetShuttleCar(ref Dt_Task dt_Task, ShuttleCar shuttleCar)
        {
            Dt_ShuttleCar _ShuttleCar = _shuttleCarService.QueryNoCode(shuttleCar.DeviceCode);
            ShuttleCar shuttleCar1 = Storage.Devices.Where(x => x.DeviceCode.Equals(_ShuttleCar.ShuttleCarCode)).FirstOrDefault() as ShuttleCar;
            ShuttleCarTaskCommandR command = ReadCustomer<ShuttleCarTaskCommandR>(shuttleCar1, shuttleCar1.DeviceCode);//读取穿梭车信息
            (bool, Dt_ShuttleCar) result = GetSourceTask(shuttleCar1, command);
            if (result.Item1) UpdateSource(ref dt_Task, result.Item2);
        }
        #region ä¸‹å‘穿梭车任务
        /// <summary>