duyongjia
2024-11-22 a89f1faab22c204627d49d6731be9c94d8160184
优化修改提交
已修改10个文件
已添加1个文件
460 ■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Client/src/views/basic/locationInfo.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/LocationEnum/LocationTypeEnum.cs 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/QuartzJob/SchedulerController.cs 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/System/Sys_DictionaryController.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskExecuteDetailService.cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/DoubleStackerCraneJob.cs 154 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/views/basic/locationInfo.vue
@@ -75,6 +75,7 @@
          required: true,
          field: "areaId",
          type: "string",
          hidden:true,
        },
        {
          title: "巷道编号",
@@ -110,6 +111,7 @@
        title: "区域主键",
        type: "string",
        width: 90,
        hidden:true,
        align: "left",
        bind: {
          key: "areainfo",
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue
@@ -138,6 +138,7 @@
        type: "string",
        width: 120,
        align: "left",
        hidden: true,
      },
      {
        field: "nextAddress",
@@ -145,6 +146,7 @@
        type: "string",
        width: 120,
        align: "left",
        hidden: true,
      },
      {
        field: "exceptionMessage",
@@ -167,6 +169,7 @@
        type: "datetime",
        width: 150,
        align: "left",
        hidden: true,
      },
      {
        field: "wMSId",
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/LocationEnum/LocationTypeEnum.cs
@@ -16,27 +16,27 @@
        Normal = 1,
        /// <summary>
        /// ä¸Šæ–™è´§ä½
        /// æš‚存位
        /// </summary>
        [Description("上料货位")]
        [Description("暂存位")]
        Feeding= 2,
        /// <summary>
        /// å…¥åº“口货位
        /// </summary>
        [Description("入库口货位")]
        [Description("提升机")]
        In = 3,
        /// <summary>
        /// ç©ºè½¦å‡ºåº“口货位
        /// ç©ºè½¦å‡ºåº“口
        /// </summary>
        [Description("空车出库口货位")]
        [Description("输送线")]
        OutEmpty = 4,
        /// <summary>
        /// çª‘炉上料机货位
        /// ç»„立机位置
        /// </summary>
        [Description("窑炉上料机货位")]
        [Description("组立机")]
        OutWorkUnit = 5
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskService.cs
@@ -214,6 +214,9 @@
        /// <returns>返回处理结果</returns>
        WebResponseContent StackCraneTaskCompleted(int taskNum);
        /// <summary>
        /// æ¢å¤æŒ‚起任务
        /// </summary>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/QuartzJob/SchedulerController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WIDESEAWCS_Core;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.QuartzNet;
namespace WIDESEAWCS_Server.Controllers.QuartzJob
{
    [Route("api/Scheduler")]
    [ApiController]
    public class SchedulerController : ControllerBase
    {
        private readonly ISchedulerCenter _scheduler;
        private readonly QuartzNetExtension _quartzNetExtension;
        public SchedulerController(ISchedulerCenter scheduler, QuartzNetExtension quartzNetExtension)
        {
            _scheduler = scheduler;
            _quartzNetExtension = quartzNetExtension;
        }
        [HttpGet, Route("StartSchedule"), AllowAnonymous]
        public async Task<WebResponseContent> StartSchedule()
        {
            try
            {
                await _quartzNetExtension.StartAsync();
                return WebResponseContent.Instance.OK("启动成功");
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error("启动错误:" + ex.Message);
            }
        }
        [HttpGet, Route("StopSchedule"), AllowAnonymous]
        public Task<WebResponseContent> StopSchedule()
        {
            return _scheduler.StopScheduleAsync();
        }
        /// <summary>
        /// æš‚停指定的计划任务
        /// </summary>
        /// <param name="sysSchedule"></param>
        /// <returns></returns>
        [HttpPost, Route("PauseJob"), AllowAnonymous]
        public Task<WebResponseContent> PauseJob([FromBody] DispatchInfoDTO sysSchedule)
        {
            return _scheduler.PauseJob(sysSchedule);
        }
        /// <summary>
        /// æ¢å¤æŒ‡å®šçš„计划任务
        /// </summary>
        /// <param name="sysSchedule"></param>
        /// <returns></returns>
        [HttpPost, Route("ResumeJob"), AllowAnonymous]
        public Task<WebResponseContent> ResumeJob([FromBody] DispatchInfoDTO sysSchedule)
        {
            return _scheduler.ResumeJob(sysSchedule);
        }
        /// <summary>
        /// æ·»åŠ ä¸€ä¸ªè®¡åˆ’ä»»åŠ¡ï¼ˆæ˜ å°„ç¨‹åºé›†æŒ‡å®šIJob实现类)
        /// </summary>
        /// <param name="sysSchedule"></param>
        /// <returns></returns>
        [HttpPost, Route("AddScheduleJob"), AllowAnonymous]
        public Task<WebResponseContent> AddScheduleJob([FromBody] DispatchInfoDTO sysSchedule)
        {
            return _scheduler.AddScheduleJobAsync(sysSchedule);
        }
        /// <summary>
        /// ç«‹å³æ‰§è¡Œ ä¸€ä¸ªä»»åŠ¡ æ‰§è¡Œä¸€æ¬¡
        /// </summary>
        /// <param name="sysSchedule"></param>
        /// <returns></returns>
        [HttpPost, Route("ExecuteJob"), AllowAnonymous]
        public Task<WebResponseContent> ExecuteJob([FromBody] DispatchInfoDTO sysSchedule)
        {
            return _scheduler.ExecuteJobAsync(sysSchedule);
        }
        /// <summary>
        /// æš‚停所有计划任务
        /// </summary>
        /// <returns></returns>
        [HttpPost, Route("PauseAllJob"), AllowAnonymous]
        public Task<WebResponseContent> PauseAllJob()
        {
            //return _scheduler.PauseAllJobAsync();
            return null;
        }
        /// <summary>
        /// æ¢å¤æ‰€æœ‰è®¡åˆ’任务
        /// </summary>
        /// <returns></returns>
        [HttpPost, Route("ResumeAllJob"), AllowAnonymous]
        public Task<WebResponseContent> ResumeAllJob()
        {
            //return _scheduler.ResumeAllJobAsync();
            return null;
        }
        [HttpPost, Route("DeleteScheduleJob"), AllowAnonymous]
        public Task<WebResponseContent> DeleteScheduleJob([FromBody] DispatchInfoDTO sysSchedule)
        {
            return _scheduler.StopScheduleJobAsync(sysSchedule);
        }
    }
}
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/System/Sys_DictionaryController.cs
@@ -528,6 +528,33 @@
                            result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data };
                        }
                        break;
                    case "locationTypeEnum":
                        {
                            List<object> data = new List<object>();
                            {
                                Type type = typeof(LocationTypeEnum);
                                List<int> enums = Enum.GetValues(typeof(LocationTypeEnum)).Cast<int>().ToList();
                                int index = 0;
                                foreach (var item in enums)
                                {
                                    FieldInfo? fieldInfo = typeof(LocationTypeEnum).GetField(((LocationTypeEnum)item).ToString());
                                    DescriptionAttribute? description = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                                    if (description != null)
                                    {
                                        data.Add(new { key = item.ToString(), value = description.Description });
                                    }
                                    else
                                    {
                                        data.Add(new { key = item.ToString(), value = item.ToString() });
                                    }
                                    index++;
                                }
                            }
                            result = new VueDictionaryDTO { DicNo = key, Config = "", Data = data };
                        }
                        break;
                    case "stockStatusEmun":
                        {
                            List<object> data = new List<object>();
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/appsettings.json
@@ -6,7 +6,7 @@
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "dics": "deviceType,devicePlcType,jobAssembly,jobClassName,deviceStatus,taskType,taskState,inOutType,orderDetailStatusEnum,enableEnum,enableStatusEnum,locationStatusEnum,stockStatusEmun",
  "dics": "deviceType,devicePlcType,jobAssembly,jobClassName,deviceStatus,taskType,taskState,inOutType,orderDetailStatusEnum,enableEnum,enableStatusEnum,locationStatusEnum,stockStatusEmun,locationTypeEnum",
  "AllowedHosts": "*",
  "ConnectionStringsEncryption": false,
  "MainDB": "DB_WIDESEA", //当前项目的主库,所对应的连接字符串的Enabled必须为true
@@ -24,6 +24,7 @@
  "ApiName": "WIDESEA",
  "ExpMinutes": 120,
  "QuartzJobAutoStart": true,
  "LogDeubgEnable": true,
  "MESApi": "http://10.0.250.12:8888/agv/v1/CMD",
  "ConveyorLineApi": "http://10.0.250.12:8888/wcs/goBack" //空车出库任务信息获取地址
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskExecuteDetailService.cs
@@ -182,6 +182,23 @@
                    }
                    else if (!int.TryParse(Enum.Parse<TaskOtherTypeEnum>(task.TaskType.ToString()).ToString(), out result))
                    {
                        steps = Enum.GetValues(typeof(TaskOutStatusEnum)).Cast<int>().Where(x => x <= (int)TaskOutStatusEnum.OutFinish).ToList();
                        foreach (var item in steps)
                        {
                            object obj;
                            FieldInfo? fieldInfo = typeof(TaskOutStatusEnum).GetField(((TaskOutStatusEnum)item).ToString());
                            DescriptionAttribute? descriptionAttribute = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
                            if (descriptionAttribute != null)
                            {
                                obj = new { title = item, description = descriptionAttribute.Description };
                            }
                            else
                            {
                                obj = new { title = item, description = ((TaskOutStatusEnum)item).ToString() };
                            }
                            list.Add(obj);
                        }
                    }
                    else
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -468,7 +468,7 @@
            }
            catch (Exception ex)
            {
                ServiceLogger.WriteDebug("ReceiveTask", $"任务接收错误,错误信息:{ex.Message}");
                ServiceLogger.WriteDebug("ReceiveTask", $"任务接收错误,错误信息:{ex.StackTrace}");
                content = WebResponseContent.Instance.Error($"任务接收错误,错误信息:{ex.Message}");
            }
            return content;
@@ -884,6 +884,7 @@
                    catch (Exception ex)
                    {
                        _unitOfWorkManage.RollbackTran();
                        //任务执行失败,货位状态还原
                        ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"大堆垛机执行出库任务失败!,任务号:【{taskNum}】,失败信息:【{ex.Message}】");
                        content = WebResponseContent.Instance.Error($"大堆垛机执行出库任务失败!,任务号:【{taskNum}】,失败信息:【{ex.Message}】");
                    }
@@ -982,7 +983,7 @@
                {
                    try
                    {
                        Dt_LocationInfo srcLocation = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                        //Dt_LocationInfo srcLocation = _locationInfoRepository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                        //srcLocation.LocationStatus = (int)LocationStatusEnum.Free;
                        
@@ -1002,44 +1003,45 @@
                        MESResponse res = ApiInvoke.SendTaskCMD(sendcmd);
                        if (res != null && res.code != 0)
                        {
                            ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"小堆垛机完成出库任务后回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                            content = WebResponseContent.Instance.Error($"小堆垛机完成出库任务后回传MES失败!,任务号:【{taskNum}】,失败信息:【{res.message}】");
                        }
                        else
                        {
                            //判断是否完成的最后一层,自动生成空车出库任务
                            string[] Levels = task.Remark.Split("-");
                            if (Levels.Length == 2)
                            {
                                if (!string.IsNullOrEmpty(Levels[0])&& !string.IsNullOrEmpty(Levels[1]))
                                {
                                    //如果当前提取层数等于总层料,则表示料车所有的层数取完
                                    if(Convert.ToInt16(Levels[0])== Convert.ToInt16(Levels[1]))
                                    {
                                        string[] SourceCodes = task.SourceAddress.Split("-");
                                        string startPlan = "";
                                        if (SourceCodes.Length == 4)
                                        {
                                            startPlan= "101"+ SourceCodes[2].Substring(1,2);
                                        }
                                        DeliveryPlan send = new DeliveryPlan { startPlan = startPlan, isQuit = false, CarId = task.PalletCode };
                                        string inparam2 = JsonConvert.SerializeObject(send);
                                        ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"小堆垛机执行出库任务回传MES入参{inparam2}");
                                        ApiInvoke.DeliveryPlanCMD(send);//回调MES接口生成空车出库任务
                                        //所有的层数都取完,需要把暂存位状态改为空闲状态
                                        srcLocation.LocationStatus = (int)LocationStatusEnum.Free;
                                        _locationInfoRepository.UpdateData(srcLocation);
                                    }
                        //else
                        //{
                        //    //判断是否完成的最后一层,自动生成空车出库任务
                        //    string[] Levels = task.Remark.Split("-");
                        //    if (Levels.Length == 2)
                        //    {
                        //        if (!string.IsNullOrEmpty(Levels[0])&& !string.IsNullOrEmpty(Levels[1]))
                        //        {
                        //            //如果当前提取层数等于总层料,则表示料车所有的层数取完
                        //            if(Convert.ToInt16(Levels[0])== Convert.ToInt16(Levels[1]))
                        //            {
                        //                string[] SourceCodes = task.SourceAddress.Split("-");
                        //                string startPlan = "";
                        //                if (SourceCodes.Length == 4)
                        //                {
                        //                    startPlan = "101" + SourceCodes[2].Substring(1, 2);
                        //                }
                        //                DeliveryPlan send = new DeliveryPlan { startPlan = startPlan, isQuit = false, CarId = task.PalletCode };
                        //                string inparam2 = JsonConvert.SerializeObject(send);
                        //                ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"小堆垛机执行出库任务回传MES入参{inparam2}");
                        //                ApiInvoke.DeliveryPlanCMD(send);//回调MES接口生成空车出库任务
                        //                æ‰€æœ‰çš„层数都取完,需要把暂存位状态改为空闲状态
                        //                srcLocation.LocationStatus = (int)LocationStatusEnum.Free;
                        //                _locationInfoRepository.UpdateData(srcLocation);
                        //            }
                                }
                        //        }
                              
                            }
                        }
                        //    }
                        //}
                    }
                    catch (Exception ex)
                    {
                        _unitOfWorkManage.RollbackTran();
                        ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"小堆垛机执行出库任务失败!,任务号:【{taskNum}】,失败信息:【{ex.Message}】");
                        ServiceLogger.WriteDebug("StackCraneTaskCompleted", $"小堆垛机执行出库任务失败!,任务号:【{taskNum}】,失败信息:【{ex.StackTrace}】");
                        content = WebResponseContent.Instance.Error($"小堆垛机执行出库任务失败!,任务号:【{taskNum}】,失败信息:【{ex.Message}】");
                    }
@@ -1060,6 +1062,8 @@
            return content;
        }
        /// <summary>
        /// æ¢å¤æŒ‚起任务
        /// </summary>
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/CommonStackerCraneJob.cs
@@ -49,6 +49,8 @@
        public Task Execute(IJobExecutionContext context)
        {
            WriteDebug("大堆垛机运行日志", "开始时间" + DateTime.Now);
            WriteDebug("大堆垛机运行日志", $"大堆垛机任务执行中...");
            //CommonStackerCrane commonStackerCrane = (CommonStackerCrane)context.JobDetail.JobDataMap.Get("JobParams");
            CommonStackerCrane commonStackerCrane = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "SC01") as CommonStackerCrane;
            try
@@ -69,6 +71,7 @@
                            Dt_Task? task = GetTask(commonStackerCrane);
                            if (task != null)
                            {
                                WriteDebug("大堆垛机运行日志", $"大堆垛机任务号{task.TaskNum}");
                                StackerCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task);
                                if (stackerCraneTaskCommand != null)
                                {
@@ -105,13 +108,13 @@
            //查询提升机/组立机信号
            Task.Run(delegate
            {
            //Task.Run(delegate
            //{
                try
                {
                    if (commonStackerCrane != null)
                    {
                        Dt_Task? task1001 = _taskService.QueryStackerCraneTaskByAGVRequest("SC01");
                        if (task1001 != null)
                        {
@@ -143,12 +146,13 @@
                            int IsWriteTwo = 0;
                            if (task3001.SourceAddress == "SC01-002-000-001")//WMS 1001站点
                            {
                                //提升机是否处于就绪状态
                                int IsReady= commonStackerCrane.Communicator.Read<short>("DB2.0.0");
                                //写入提升信息
                                IsWriteOne = commonStackerCrane.Communicator.Read<short>("DB1.0.0");
                                if(IsWriteOne == 0)
                                if(IsWriteOne == 0&& IsReady == 1)
                                {
                                   var d= commonStackerCrane.Communicator.Write<short>("DB1.0.0", 1);
                                   commonStackerCrane.Communicator.Write<short>("DB1.0.0", 1);
                                }
                                //读取提升机信号,确定是否提升完成
                               
@@ -156,9 +160,11 @@
                            }
                            else if (task3001.SourceAddress == "SC01-002-000-002")//WMS 1002站点
                            {
                                //提升机是否处于就绪状态
                                int IsReady = commonStackerCrane.Communicator.Read<short>("DB2.0.0");
                                //写入提升信息
                                IsWriteTwo = commonStackerCrane.Communicator.Read<short>("DB1.6.0");
                                if (IsWriteTwo == 0)
                                if (IsWriteTwo == 0 && IsReady == 1)
                                {
                                    commonStackerCrane.Communicator.Write<short>("DB1.6.0", 1);
                                }    
@@ -176,8 +182,6 @@
                                {
                                    WriteDebug(nameof(CommonStackerCraneJob), $"提升机提升完成,回传WMS失败!任务号{task3001.TaskNum}");
                                }
                            }
                        }
@@ -195,8 +199,12 @@
                                    if (!string.IsNullOrEmpty(Levels[0]) && !string.IsNullOrEmpty(Levels[1]))
                                    {
                                        int level = Convert.ToInt16(Levels[0]) - Convert.ToInt16(Levels[1]);
                                        //剩余层数写入
                                        bool issuccess = commonStackerCrane.Communicator.Write<short>("DB28." + location.Depth + ".0", Convert.ToInt16(level));
                                        WriteDebug(nameof(CommonStackerCraneJob), $"剩余层数信号写入{level}-任务号{taskSmall.TaskNum}");
                                        //如果当前提取层数等于总层数,则表示料车所有的层数取完
                                        if (level == 0)
                                        {
@@ -205,8 +213,21 @@
                                            {
                                                //根据目标地址查询组立机站点信息,获取写入整车完成的DB块 Depth
                                                Dt_LocationInfo location2 = _locationInfoRepository.QueryFirst(x => x.LocationCode == location.Remark);
                                                //整车完成写入
                                                bool issuccess2 = commonStackerCrane.Communicator.Write<short>("DB28." + location.Depth+".0", 1);
                                            //整车完成写入层数
                                            int sn = 0;
                                            if(taskSmall.SourceAddress== "SC01-001-006-001"|| taskSmall.SourceAddress == "SC01-001-012-001"|| taskSmall.SourceAddress == "SC01-001-018-001" || taskSmall.SourceAddress == "SC01-001-022-001"|| taskSmall.SourceAddress == "SC01-001-026-001")
                                            {
                                                sn = 1;
                                            }
                                            else if(taskSmall.SourceAddress == "SC01-001-007-001" || taskSmall.SourceAddress == "SC01-001-013-001" || taskSmall.SourceAddress == "SC01-001-019-001" || taskSmall.SourceAddress == "SC01-001-023-001" || taskSmall.SourceAddress == "SC01-001-027-001")
                                            {
                                                sn = 2;
                                            }
                                            else
                                            {
                                                sn = 3;
                                            }
                                            bool issuccess2 = commonStackerCrane.Communicator.Write<short>("DB28." + location2.Depth+".0", Convert.ToInt16(sn));
                                                if (issuccess2&&issuccess)
                                                {
                                                    _taskService.UpdateTaskStatus(taskSmall.TaskId, (int)TaskOutStatusEnum.OutFinish);
@@ -238,20 +259,15 @@
                            }
                            
                        }
                    }
                }
                }
                catch (Exception ex)
                {
                    WriteError(nameof(CommonStackerCraneJob), "查询或写入PLC状态失败!", ex);
                }
            });
            WriteDebug("大堆垛机运行日志", "结束时间" + DateTime.Now);
            //});
            return Task.CompletedTask;
        }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/DoubleStackerCraneJob.cs
@@ -1,5 +1,6 @@
using HslCommunication;
using Microsoft.AspNetCore.Components.Routing;
using Newtonsoft.Json;
using Quartz;
using System;
using System.Collections.Generic;
@@ -49,29 +50,23 @@
            _locationInfoRepository = locationInfoRepository;
        }
        public Task Execute(IJobExecutionContext context)
        public  Task Execute(IJobExecutionContext context)
        {
            WriteDebug("小堆垛机运行日志", "开始时间" + DateTime.Now);
            CommonStackerCrane? stackerCraneOne = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "SC02") as CommonStackerCrane;
            CommonStackerCrane? stackerCraneTwo = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "SC03") as CommonStackerCrane;
            WriteDebug(nameof(DoubleStackerCraneJob), $"小堆垛机任务执行中...");
            try
            {
                CommonStackerCrane? stackerCraneOne = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "SC02") as CommonStackerCrane;
                CommonStackerCrane? stackerCraneTwo = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "SC03") as CommonStackerCrane;
                //Dt_DeviceInfo deviceSC02= _deviceInfoRepository.QueryFirst(x => x.DeviceCode == "SC02");
                //Dt_DeviceInfo deviceSC03 = _deviceInfoRepository.QueryFirst(x => x.DeviceCode == "SC03");
                //if(deviceSC02.DeviceStatus=="0")
                //{
                //    stackerCraneOne = null;
                //}
                //if(deviceSC03.DeviceStatus=="0")
                //{
                //    stackerCraneTwo = null;
                //}
                stackerCraneOne.CheckStackerCraneTaskCompleted();
                Dt_Task? task = GetTask();
                if (task != null)
                {
                    CommonStackerCrane? StackerCrane= GetStrackerCrane(task, stackerCraneOne, stackerCraneTwo);
                    if(StackerCrane != null)
                    WriteDebug("小堆垛机运行日志", $"小堆垛机任务号{task.TaskNum}");
                    CommonStackerCrane? StackerCrane = GetStrackerCrane(task, stackerCraneOne, stackerCraneTwo);
                    if (StackerCrane != null)
                    {
                        StackerCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task);
                        if (stackerCraneTaskCommand != null)
@@ -86,16 +81,16 @@
                            else
                            {
                                _taskService.UpdateTaskExceptionMessage(task.TaskNum, "堆垛机执行任务命令失败!");
                                WriteDebug(nameof(CommonStackerCraneJob), "堆垛机执行任务命令失败!");
                                WriteDebug(nameof(DoubleStackerCraneJob), "堆垛机执行任务命令失败!");
                            }
                        }
                    }
                    else
                    {
                        WriteDebug(nameof(CommonStackerCraneJob), "未查询到当前可以执行上料任务的小堆垛机!");
                        WriteDebug(nameof(DoubleStackerCraneJob), "未查询到当前可以执行上料任务的小堆垛机!");
                    }
                }
            }
@@ -103,6 +98,53 @@
            {
                WriteError(nameof(CommonStackerCraneJob), "小堆垛机执行任务异常!", ex);
            }
            //读取堆垛机任务号和任务完成确认状态
            //Task.Run(delegate
            //{
                try
                {
                    if (stackerCraneOne != null)
                    {
                        byte IsFinish = stackerCraneOne.Communicator.Read<byte>("DB106.22");
                        int tasknum = stackerCraneOne.Communicator.Read<int>("DB106.18");
                        if (IsFinish == 6)
                        {
                            if (stackerCraneOne.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType) != 5)
                            {
                                //暂时 å…ˆå†™5:完成确认 ä¿¡å·
                                _taskService.StackCraneTaskCompleted(tasknum);
                                stackerCraneOne.SetValue(StackerCraneDBName.WorkType, 5);
                            }
                        }
                    }
                    if (stackerCraneTwo != null)
                    {
                        //读取堆垛机任务号和任务完成确认状态
                        byte IsFinish = stackerCraneTwo.Communicator.Read<byte>("DB106.22");
                        int tasknum = stackerCraneTwo.Communicator.Read<int>("DB106.18");
                        if (IsFinish == 6)
                        {
                            if (stackerCraneTwo.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType) != 5)
                            {
                                _taskService.StackCraneTaskCompleted(tasknum);
                                stackerCraneTwo.SetValue(StackerCraneDBName.WorkType, 5);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    WriteError(nameof(DoubleStackerCraneJob), "查询或写入PLC状态失败!", ex);
                }
            //});
            WriteDebug("小堆垛机运行日志", "结束时间" + DateTime.Now);
            return Task.CompletedTask;
        }
@@ -147,13 +189,9 @@
            {
                if (stackerCraneOne != null)
                {
                    if (!stackerCraneOne.IsEventSubscribed)
                    {
                        stackerCraneOne.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件
                    }
                    if (stackerCraneOne.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && stackerCraneOne.StackerCraneStatusValue == StackerCraneStatus.Normal)
                    {
                        stackerCraneOne.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次
                        if (stackerCraneOne.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)
                        {
                            return stackerCraneOne;
@@ -166,15 +204,17 @@
                        if (deviceSC02.DeviceStatus=="0"&& stackerCraneTwo != null)
                        {
                            if (!stackerCraneTwo.IsEventSubscribed)
                            {
                                stackerCraneTwo.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件
                            }
                            //if (!stackerCraneTwo.IsEventSubscribed)
                            //{
                            //    stackerCraneTwo.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件
                            //}
                            if (stackerCraneTwo.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && stackerCraneTwo.StackerCraneStatusValue == StackerCraneStatus.Normal)
                            {
                                stackerCraneTwo.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次
                                //stackerCraneTwo.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次
                                if (stackerCraneTwo.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)
                                {
                                    //todo:任务表中的RoadWay切换为SC03
                                    return stackerCraneTwo;
                                }
                            }
@@ -184,18 +224,34 @@
                    }
                }
                else
                {
                    if(stackerCraneTwo != null)
                    {
                        if (stackerCraneTwo.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && stackerCraneTwo.StackerCraneStatusValue == StackerCraneStatus.Normal)
                        {
                            if (stackerCraneTwo.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)
                            {
                                //todo:任务表中的RoadWay切换为SC03
                                return stackerCraneTwo;
                            }
                        }
                    }
                }
            }
            else if (task.Roadway=="SC03")
            {
                if (stackerCraneTwo != null)
                {
                    if (!stackerCraneTwo.IsEventSubscribed)
                    {
                        stackerCraneTwo.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件
                    }
                 {
                //    if (!stackerCraneTwo.IsEventSubscribed)
                //    {
                //        stackerCraneTwo.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件
                //    }
                    if (stackerCraneTwo.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && stackerCraneOne.StackerCraneStatusValue == StackerCraneStatus.Normal)
                    {
                        stackerCraneTwo.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次
                        //stackerCraneTwo.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次
                        if (stackerCraneTwo.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)
                        {
                            return stackerCraneTwo;
@@ -206,15 +262,16 @@
                        Dt_DeviceInfo deviceSC03 = _deviceInfoRepository.QueryFirst(x => x.DeviceCode == "SC03");
                        if (deviceSC03.DeviceStatus=="0"&&stackerCraneOne != null)
                        {
                            if (!stackerCraneOne.IsEventSubscribed)
                            {
                                stackerCraneOne.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件
                            }
                            //if (!stackerCraneOne.IsEventSubscribed)
                            //{
                            //    stackerCraneOne.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件
                            //}
                            if (stackerCraneOne.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && stackerCraneTwo.StackerCraneStatusValue == StackerCraneStatus.Normal)
                            {
                                stackerCraneOne.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次
                                //stackerCraneOne.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次
                                if (stackerCraneOne.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)
                                {
                                    //todo:任务表中的RoadWay切换为SC03
                                    return stackerCraneOne;
                                }
                            }
@@ -222,6 +279,21 @@
                    }
                }
                else
                {
                    if(stackerCraneOne != null)
                    {
                        if (stackerCraneOne.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && stackerCraneOne.StackerCraneStatusValue == StackerCraneStatus.Normal)
                        {
                            if (stackerCraneOne.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)
                            {
                                return stackerCraneOne;
                            }
                        }
                    }
                }
            }
            return null;