renmingwang
2026-03-25 6d56bf4daf08c4c7c6d193d98ed0b547dc473451
添加历史任务删除,大屏布局修改
已添加7个文件
已删除15个文件
已修改25个文件
6675 ■■■■ 文件已修改
.vs/VSWorkspaceState.json 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/.trae/documents/修复路由匹配问题.md 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskHtyService.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskHtyService.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs 121 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task_HtyJob.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSClient/.vs/VSWorkspaceState.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSClient/.vs/WIDESEA_WMSClient/v17/.wsuo 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSClient/.vs/WIDESEA_WMSClient/v17/DocumentLayout.json 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSClient/.vs/slnx.sqlite 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSClient/config/buttons.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSClient/package-lock.json 896 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task_hty.js 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/.wsuo 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/.vs/slnx.sqlite 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/WIDESEAWCS_Tasks/WIDESEAWMS_Tasks.csproj 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/WIDESEA_HomeService/HomeService.cs 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITask_HtyService.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/PartialTaskService_Inbound.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/Task_HtyService.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/Task_HtyController.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/ToMes.cs 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/api/api.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/store/modules/setting.js 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/center-bottom.vue 314 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/center-map.vue 454 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/index.vue 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/inventory-stats.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/left-bottom.vue 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/left-center-right.vue 257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/left-center.vue 256 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/left-top.vue 250 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/pass-two.vue 295 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/right-bottom.vue 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/right-center.vue 485 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/right-top.vue 299 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/sc01-location-status.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/sc01-task-info.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/sc02-location-status.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/sc02-task-info.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/station-four.vue 461 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/station-one.vue 229 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/station-three.vue 725 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/indexs/station-two.vue 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/大屏/src/views/setting.vue 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vs/VSWorkspaceState.json
@@ -1,7 +1,10 @@
{
  "ExpandedNodes": [
    ""
    "",
    "\\\u9879\u76EE\u4EE3\u7801",
    "\\\u9879\u76EE\u4EE3\u7801\\WMS",
    "\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer"
  ],
  "SelectedNode": "\\WIDESEA_WMSServer.sln (项目代码备份\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer\\WIDESEA_WMSServer.sln)",
  "SelectedNode": "\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSServer\\WIDESEA_WMSServer.sln",
  "PreviewInSolutionExplorer": false
}
ÏîÄ¿´úÂë/.trae/documents/ÐÞ¸´Â·ÓÉÆ¥ÅäÎÊÌâ.md
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/ITaskHtyService.cs
@@ -43,5 +43,14 @@
        /// <param name="taskNum">任务号</param>
        /// <returns>历史记录列表</returns>
        List<Dt_Task_Hty> GetHistoryByTaskNum(int taskNum);
        /// <summary>
        /// åˆ é™¤æŒ‡å®šæ—¥æœŸä¹‹å‰çš„历史任务数据
        /// </summary>
        /// <param name="keepMonths">保留的月数,默认为3个月(本月+后两个月)</param>
        /// <returns>删除的记录数</returns>
        int DeleteOldTaskHistory(int keepMonths = 3);
        public void Task_Hty_Job();
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskHtyService.cs
@@ -116,5 +116,47 @@
        {
            return BaseDal.QueryData(x => x.TaskNum == taskNum).OrderByDescending(x => x.CreateDate).ToList();
        }
        /// <summary>
        /// åˆ é™¤æŒ‡å®šæ—¥æœŸä¹‹å‰çš„历史任务数据
        /// </summary>
        /// <param name="keepMonths">保留的月数,默认为3个月(本月+后两个月)</param>
        /// <returns>删除的记录数</returns>
        public int DeleteOldTaskHistory(int keepMonths = 3)
        {
            try
            {
                // è®¡ç®—保留日期:当前日期减去keepMonths个月
                DateTime keepDate = DateTime.Now.AddMonths(-keepMonths);
                // å…ˆæŸ¥è¯¢å‡ºè¦åˆ é™¤çš„æ•°æ®
                List<Dt_Task_Hty> tasksToDelete = BaseDal.QueryData().Where(x => x.CreateDate < keepDate).ToList();
                // å¦‚果没有要删除的数据,直接返回0
                if (tasksToDelete.Count == 0)
                {
                    return 0;
                }
                // åˆ é™¤æŸ¥è¯¢å‡ºçš„历史记录
                bool result = BaseDal.DeleteData(tasksToDelete);
                return result ? tasksToDelete.Count : 0;
            }
            catch (Exception ex)
            {
                // è®°å½•异常日志
                //Console.WriteLine($"删除历史任务记录失败: {ex.Message}");
                return 0;
            }
        }
        /// <summary>
        /// å®šæ—¶ä»»åŠ¡è°ƒç”¨çš„åŽ†å²ä»»åŠ¡åˆ é™¤æ–¹æ³•
        /// </summary>
        public void Task_Hty_Job()
        {
            // åˆ é™¤3个月之前的历史任务数据,保留本月和后两个月的数据
            DeleteOldTaskHistory(3);
        }
    }
}
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -955,19 +955,42 @@
        /// <returns></returns>
        public WebResponseContent GetRoadwayTaskProgress(string roadway)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                var tasks = BaseDal.QueryData(x => x.Roadway == roadway);
                var progressInfo = new
                // 1. å…¥å‚校验
                if (string.IsNullOrWhiteSpace(roadway))
                {
                    roadway = roadway,
                    totalTasks = tasks.Count,
                    inProgressTasks = tasks.Count(t => t.TaskState < (int)TaskStatusEnum.Finish && t.TaskState != (int)TaskStatusEnum.Cancel && t.TaskState != (int)TaskStatusEnum.Exception),
                    completedTasks = tasks.Count(t => t.TaskState == (int)TaskStatusEnum.Finish),
                    cancelledTasks = tasks.Count(t => t.TaskState == (int)TaskStatusEnum.Cancel),
                    exceptionTasks = tasks.Count(t => t.TaskState == (int)TaskStatusEnum.Exception),
                    tasks = tasks.Select(t => new
                    return WebResponseContent.Instance.Error("巷道编号不能为空");
                }
                // 2. ä¸€æ¬¡æŸ¥è¯¢ï¼Œé¿å…å¤šæ¬¡æ•°æ®åº“/内存遍历
                List<Dt_Task> taskList = BaseDal.QueryData(x => x.Roadway == roadway).ToList();
                int totalTasks = taskList.Count;
                int inProgressTasks = 0;
                int completedTasks = 0;
                int cancelledTasks = 0;
                int exceptionTasks = 0;
                foreach (var task in taskList)
                {
                    switch ((TaskStatusEnum)task.TaskState)
                    {
                        case TaskStatusEnum.Finish:
                            completedTasks++;
                            break;
                        case TaskStatusEnum.Cancel:
                            cancelledTasks++;
                            break;
                        case TaskStatusEnum.Exception:
                            exceptionTasks++;
                            break;
                        default:
                            inProgressTasks++;
                            break;
                    }
                }
                var taskDetails = taskList.Select(t => new
                    {
                        taskNum = t.TaskNum,
                        taskType = t.TaskType,
@@ -977,15 +1000,26 @@
                        modifyDate = t.ModifyDate,
                        sourceAddress = t.SourceAddress,
                        targetAddress = t.TargetAddress
                    }).ToList()
                }).ToList();
                // 5. ç»Ÿä¸€è¿”回结果
                var progressInfo = new
                {
                    roadway = roadway,
                    totalTasks,
                    inProgressTasks,
                    completedTasks,
                    cancelledTasks,
                    exceptionTasks,
                    tasks = taskDetails
                };
                content = WebResponseContent.Instance.OK(data: progressInfo);
                return WebResponseContent.Instance.OK(data: progressInfo);
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
                return WebResponseContent.Instance.Error($"获取巷道任务进度失败:{ex.Message}");
            }
            return content;
        }
        /// <summary>
@@ -994,34 +1028,56 @@
        /// <returns></returns>
        public WebResponseContent GetAllRoadwayTaskProgress()
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                var allTasks = BaseDal.QueryData();
                var roadways = allTasks.Select(t => t.Roadway).Distinct().ToList();
                var progressList = new List<object>();
                // 1. ä¸€æ¬¡æ€§æŸ¥è¯¢æ‰€æœ‰æ•°æ®ï¼ˆé¿å…å¤šæ¬¡æŸ¥è¯¢ï¼‰
                List<Dt_Task> allTasks = BaseDal.QueryData().ToList();
                foreach (var roadway in roadways)
                // 2. æŒ‰å··é“分组 + ä¸€æ¬¡éåŽ†ç»Ÿè®¡æ‰€æœ‰çŠ¶æ€ï¼ˆæ€§èƒ½æå‡å·¨å¤§ï¼‰
                var progressList = allTasks
                    .GroupBy(t => t.Roadway)
                    .Select(group =>
                {
                    var roadwayTasks = allTasks.Where(t => t.Roadway == roadway).ToList();
                    progressList.Add(new
                        var roadway = group.Key;
                        var tasks = group.ToList();
                        var totalTasks = tasks.Count;
                        int inProgress = 0, completed = 0, cancelled = 0, exception = 0;
                        foreach (var task in tasks)
                        {
                            switch ((TaskStatusEnum)task.TaskState)
                            {
                                case TaskStatusEnum.Finish:
                                    completed++;
                                    break;
                                case TaskStatusEnum.Cancel:
                                    cancelled++;
                                    break;
                                case TaskStatusEnum.Exception:
                                    exception++;
                                    break;
                                default:
                                    inProgress++;
                                    break;
                            }
                        }
                        return new
                    {
                        roadway = roadway,
                        totalTasks = roadwayTasks.Count,
                        inProgressTasks = roadwayTasks.Count(t => t.TaskState < (int)TaskStatusEnum.Finish && t.TaskState != (int)TaskStatusEnum.Cancel && t.TaskState != (int)TaskStatusEnum.Exception),
                        completedTasks = roadwayTasks.Count(t => t.TaskState == (int)TaskStatusEnum.Finish),
                        cancelledTasks = roadwayTasks.Count(t => t.TaskState == (int)TaskStatusEnum.Cancel),
                        exceptionTasks = roadwayTasks.Count(t => t.TaskState == (int)TaskStatusEnum.Exception)
                    });
                }
                content = WebResponseContent.Instance.OK(data: progressList);
                            totalTasks = totalTasks,
                            inProgressTasks = inProgress,
                            completedTasks = completed,
                            cancelledTasks = cancelled,
                            exceptionTasks = exception
                        };
                    })
                    .ToList();
                return WebResponseContent.Instance.OK(data: progressList);
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
                return WebResponseContent.Instance.Error($"获取巷道任务进度失败:{ex.Message}");
            }
            return content;
        }
        /// <summary>
@@ -1031,7 +1087,6 @@
        /// <returns></returns>
        private string GetTaskStateName(int taskState)
        {
            // ç›´æŽ¥æ ¹æ®çŠ¶æ€å€¼è¿”å›žçŠ¶æ€åç§°
            switch (taskState)
            {
                case (int)TaskStatusEnum.New:
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Task_HtyJob.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
using Quartz;
using System;
using System.Threading.Tasks;
using WIDESEAWCS_ITaskInfoService;
namespace WIDESEAWCS_Tasks
{
    /// <summary>
    /// ä»»åŠ¡åŽ†å²åˆ é™¤
    /// </summary>
    [DisallowConcurrentExecution]
    public class Task_HtyJob : IJob
    {
        private readonly ITaskHtyService _taskHtyService;
        public Task_HtyJob(ITaskHtyService taskHtyService)
        {
            _taskHtyService = taskHtyService;
        }
        public Task Execute(IJobExecutionContext context)
        {
            try
            {
                // åˆ é™¤3个月之前的所有历史任务数据,保留本月和后两个月的数据
                //int deletedCount = _taskHtyService.DeleteOldTaskHistory(3);
                //Console.WriteLine($"{DateTime.Now}: æˆåŠŸåˆ é™¤{deletedCount}条历史任务记录");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"{DateTime.Now}: {nameof(Task_HtyJob)}删除历史任务记录失败: {ex.Message}");
            }
            return Task.CompletedTask;
        }
    }
}
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSClient/.vs/VSWorkspaceState.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
{
  "ExpandedNodes": [
    ""
  ],
  "PreviewInSolutionExplorer": false
}
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSClient/.vs/WIDESEA_WMSClient/v17/.wsuo
Binary files differ
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSClient/.vs/WIDESEA_WMSClient/v17/DocumentLayout.json
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,129 @@
{
  "Version": 1,
  "WorkspaceRootPath": "D:\\ShenYangLiku\\\u9879\u76EE\u4EE3\u7801\\WMS\\WIDESEA_WMSClient\\",
  "Documents": [],
  "DocumentGroupContainers": [
    {
      "Orientation": 0,
      "VerticalTabListWidth": 256,
      "DocumentGroups": [
        {
          "DockedWidth": 200,
          "SelectedChildIndex": -1,
          "Children": [
            {
              "$type": "Bookmark",
              "Name": "ST:128:0:{1fc202d4-d401-403c-9834-5b218574bb67}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:130:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:128:0:{13b12e3e-c1b4-4539-9371-4fe9a0d523fc}"
            }
          ]
        },
        {
          "DockedWidth": 422,
          "SelectedChildIndex": -1,
          "Children": [
            {
              "$type": "Bookmark",
              "Name": "ST:47:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:32:0:{d212f56b-c48a-434c-a121-1c5d80b59b9f}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:33:0:{d212f56b-c48a-434c-a121-1c5d80b59b9f}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:68:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:70:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:79:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:81:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:83:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:85:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:87:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:90:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:95:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:104:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:124:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:125:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:131:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:132:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            },
            {
              "$type": "Bookmark",
              "Name": "ST:133:0:{e8034f19-ab72-4f06-83fd-f6832b41aa63}"
            }
          ]
        },
        {
          "DockedWidth": 602,
          "SelectedChildIndex": -1,
          "Children": [
            {
              "$type": "Bookmark",
              "Name": "ST:0:0:{34e76e81-ee4a-11d0-ae2e-00a0c90fffc3}"
            }
          ]
        },
        {
          "DockedWidth": 1237,
          "SelectedChildIndex": -1,
          "Children": [
            {
              "$type": "Bookmark",
              "Name": "ST:0:0:{d78612c7-9962-4b83-95d9-268046dad23a}"
            }
          ]
        }
      ]
    }
  ]
}
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSClient/.vs/slnx.sqlite
Binary files differ
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSClient/config/buttons.js
@@ -122,6 +122,13 @@
        onClick: function() {}
    },
    {
        name: "删除历史任务信息",
        icon: '',
        class: '',
        value: 'DeleteOldTaskHistory',
        onClick: function() {}
    },
    {
        name: "ä»» åŠ¡ å– æ¶ˆ",
        icon: 'el-icon-delete',
        class: '',
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSClient/package-lock.json
@@ -3654,6 +3654,16 @@
        "acorn-walk": "^6.0.1"
      }
    },
    "node_modules/acorn-jsx": {
      "version": "5.3.2",
      "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
      "dev": true,
      "peer": true,
      "peerDependencies": {
        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
      }
    },
    "node_modules/acorn-walk": {
      "version": "6.2.0",
      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
@@ -4100,6 +4110,16 @@
        "node": ">=0.10.0"
      }
    },
    "node_modules/astral-regex": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-1.0.0.tgz",
      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
      "dev": true,
      "peer": true,
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/async": {
      "version": "3.2.6",
      "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
@@ -4466,6 +4486,16 @@
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/bindings": {
      "version": "1.5.0",
      "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz",
      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
      "dev": true,
      "optional": true,
      "dependencies": {
        "file-uri-to-path": "1.0.0"
      }
    },
    "node_modules/bluebird": {
@@ -7472,6 +7502,19 @@
        "buffer-indexof": "^1.0.0"
      }
    },
    "node_modules/doctrine": {
      "version": "3.0.0",
      "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz",
      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "esutils": "^2.0.2"
      },
      "engines": {
        "node": ">=6.0.0"
      }
    },
    "node_modules/dom-converter": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
@@ -8028,6 +8071,62 @@
        "node": ">=0.10.0"
      }
    },
    "node_modules/eslint": {
      "version": "6.8.0",
      "resolved": "https://registry.npmmirror.com/eslint/-/eslint-6.8.0.tgz",
      "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
      "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
      "dev": true,
      "peer": true,
      "dependencies": {
        "@babel/code-frame": "^7.0.0",
        "ajv": "^6.10.0",
        "chalk": "^2.1.0",
        "cross-spawn": "^6.0.5",
        "debug": "^4.0.1",
        "doctrine": "^3.0.0",
        "eslint-scope": "^5.0.0",
        "eslint-utils": "^1.4.3",
        "eslint-visitor-keys": "^1.1.0",
        "espree": "^6.1.2",
        "esquery": "^1.0.1",
        "esutils": "^2.0.2",
        "file-entry-cache": "^5.0.1",
        "functional-red-black-tree": "^1.0.1",
        "glob-parent": "^5.0.0",
        "globals": "^12.1.0",
        "ignore": "^4.0.6",
        "import-fresh": "^3.0.0",
        "imurmurhash": "^0.1.4",
        "inquirer": "^7.0.0",
        "is-glob": "^4.0.0",
        "js-yaml": "^3.13.1",
        "json-stable-stringify-without-jsonify": "^1.0.1",
        "levn": "^0.3.0",
        "lodash": "^4.17.14",
        "minimatch": "^3.0.4",
        "mkdirp": "^0.5.1",
        "natural-compare": "^1.4.0",
        "optionator": "^0.8.3",
        "progress": "^2.0.0",
        "regexpp": "^2.0.1",
        "semver": "^6.1.2",
        "strip-ansi": "^5.2.0",
        "strip-json-comments": "^3.0.1",
        "table": "^5.2.3",
        "text-table": "^0.2.0",
        "v8-compile-cache": "^2.0.3"
      },
      "bin": {
        "eslint": "bin/eslint.js"
      },
      "engines": {
        "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
      },
      "funding": {
        "url": "https://opencollective.com/eslint"
      }
    },
    "node_modules/eslint-loader": {
      "version": "2.2.1",
      "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz",
@@ -8072,6 +8171,33 @@
        "node": ">=4.0.0"
      }
    },
    "node_modules/eslint-scope": {
      "version": "5.1.1",
      "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz",
      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "esrecurse": "^4.3.0",
        "estraverse": "^4.1.1"
      },
      "engines": {
        "node": ">=8.0.0"
      }
    },
    "node_modules/eslint-utils": {
      "version": "1.4.3",
      "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-1.4.3.tgz",
      "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "eslint-visitor-keys": "^1.1.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/eslint-visitor-keys": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
@@ -8079,6 +8205,74 @@
      "dev": true,
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/eslint/node_modules/import-fresh": {
      "version": "3.3.1",
      "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz",
      "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "parent-module": "^1.0.0",
        "resolve-from": "^4.0.0"
      },
      "engines": {
        "node": ">=6"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/eslint/node_modules/resolve-from": {
      "version": "4.0.0",
      "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz",
      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
      "dev": true,
      "peer": true,
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/eslint/node_modules/strip-ansi": {
      "version": "5.2.0",
      "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "ansi-regex": "^4.1.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/espree": {
      "version": "6.2.1",
      "resolved": "https://registry.npmmirror.com/espree/-/espree-6.2.1.tgz",
      "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "acorn": "^7.1.1",
        "acorn-jsx": "^5.2.0",
        "eslint-visitor-keys": "^1.1.0"
      },
      "engines": {
        "node": ">=6.0.0"
      }
    },
    "node_modules/espree/node_modules/acorn": {
      "version": "7.4.1",
      "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz",
      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
      "dev": true,
      "peer": true,
      "bin": {
        "acorn": "bin/acorn"
      },
      "engines": {
        "node": ">=0.4.0"
      }
    },
    "node_modules/esprima": {
@@ -8092,6 +8286,29 @@
      },
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/esquery": {
      "version": "1.7.0",
      "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.7.0.tgz",
      "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "estraverse": "^5.1.0"
      },
      "engines": {
        "node": ">=0.10"
      }
    },
    "node_modules/esquery/node_modules/estraverse": {
      "version": "5.3.0",
      "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
      "dev": true,
      "peer": true,
      "engines": {
        "node": ">=4.0"
      }
    },
    "node_modules/esrecurse": {
@@ -8610,6 +8827,19 @@
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/file-entry-cache": {
      "version": "5.0.1",
      "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "flat-cache": "^2.0.1"
      },
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/file-loader": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz",
@@ -8651,6 +8881,13 @@
      "engines": {
        "node": ">=4.0.0"
      }
    },
    "node_modules/file-uri-to-path": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
      "dev": true,
      "optional": true
    },
    "node_modules/filesize": {
      "version": "3.6.1",
@@ -8772,6 +9009,35 @@
        "flat": "cli.js"
      }
    },
    "node_modules/flat-cache": {
      "version": "2.0.1",
      "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-2.0.1.tgz",
      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "flatted": "^2.0.0",
        "rimraf": "2.6.3",
        "write": "1.0.3"
      },
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/flat-cache/node_modules/rimraf": {
      "version": "2.6.3",
      "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.6.3.tgz",
      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
      "deprecated": "Rimraf versions prior to v4 are no longer supported",
      "dev": true,
      "peer": true,
      "dependencies": {
        "glob": "^7.1.3"
      },
      "bin": {
        "rimraf": "bin.js"
      }
    },
    "node_modules/flat/node_modules/is-buffer": {
      "version": "2.0.5",
      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
@@ -8794,6 +9060,13 @@
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/flatted": {
      "version": "2.0.2",
      "resolved": "https://registry.npmmirror.com/flatted/-/flatted-2.0.2.tgz",
      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
      "dev": true,
      "peer": true
    },
    "node_modules/flush-write-stream": {
      "version": "1.1.1",
@@ -8997,6 +9270,13 @@
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/functional-red-black-tree": {
      "version": "1.0.1",
      "resolved": "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
      "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
      "dev": true,
      "peer": true
    },
    "node_modules/functions-have-names": {
      "version": "1.2.3",
      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
@@ -9155,7 +9435,6 @@
      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
      "dev": true,
      "optional": true,
      "dependencies": {
        "is-glob": "^4.0.1"
      },
@@ -9168,6 +9447,32 @@
      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
      "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==",
      "dev": true
    },
    "node_modules/globals": {
      "version": "12.4.0",
      "resolved": "https://registry.npmmirror.com/globals/-/globals-12.4.0.tgz",
      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "type-fest": "^0.8.1"
      },
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/globals/node_modules/type-fest": {
      "version": "0.8.1",
      "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.8.1.tgz",
      "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
      "dev": true,
      "peer": true,
      "engines": {
        "node": ">=8"
      }
    },
    "node_modules/globalthis": {
      "version": "1.0.4",
@@ -11221,6 +11526,13 @@
      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
      "dev": true
    },
    "node_modules/json-stable-stringify-without-jsonify": {
      "version": "1.0.1",
      "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
      "dev": true,
      "peer": true
    },
    "node_modules/json-stringify-safe": {
      "version": "5.0.1",
      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
@@ -12788,6 +13100,13 @@
        "node": ">=6.0.0"
      }
    },
    "node_modules/nan": {
      "version": "2.25.0",
      "resolved": "https://registry.npmmirror.com/nan/-/nan-2.25.0.tgz",
      "integrity": "sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==",
      "dev": true,
      "optional": true
    },
    "node_modules/nanoid": {
      "version": "3.3.11",
      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
@@ -12826,6 +13145,13 @@
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/natural-compare": {
      "version": "1.4.0",
      "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
      "dev": true,
      "peer": true
    },
    "node_modules/needle": {
      "version": "2.9.1",
@@ -13569,6 +13895,29 @@
      "dev": true,
      "dependencies": {
        "no-case": "^2.2.0"
      }
    },
    "node_modules/parent-module": {
      "version": "1.0.1",
      "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "callsites": "^3.0.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/parent-module/node_modules/callsites": {
      "version": "3.1.0",
      "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
      "dev": true,
      "peer": true,
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/parse-asn1": {
@@ -16156,6 +16505,16 @@
        "url": "https://github.com/sponsors/ljharb"
      }
    },
    "node_modules/regexpp": {
      "version": "2.0.1",
      "resolved": "https://registry.npmmirror.com/regexpp/-/regexpp-2.0.1.tgz",
      "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
      "dev": true,
      "peer": true,
      "engines": {
        "node": ">=6.5.0"
      }
    },
    "node_modules/regexpu-core": {
      "version": "6.4.0",
      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz",
@@ -17342,6 +17701,31 @@
        "node": ">=6"
      }
    },
    "node_modules/slice-ansi": {
      "version": "2.1.0",
      "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-2.1.0.tgz",
      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "ansi-styles": "^3.2.0",
        "astral-regex": "^1.0.0",
        "is-fullwidth-code-point": "^2.0.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": {
      "version": "2.0.0",
      "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
      "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
      "dev": true,
      "peer": true,
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/snapdragon": {
      "version": "0.8.2",
      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
@@ -17550,6 +17934,12 @@
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/sortablejs": {
      "version": "1.15.7",
      "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.7.tgz",
      "integrity": "sha512-Kk8wLQPlS+yi1ZEf48a4+fzHa4yxjC30M/Sr2AnQu+f/MPwvvX9XjZ6OWejiz8crBsLwSq8GHqaxaET7u6ux0A==",
      "peer": true
    },
    "node_modules/source-list-map": {
      "version": "2.0.1",
@@ -17998,6 +18388,19 @@
        "node": ">=4"
      }
    },
    "node_modules/strip-json-comments": {
      "version": "3.1.1",
      "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
      "dev": true,
      "peer": true,
      "engines": {
        "node": ">=8"
      },
      "funding": {
        "url": "https://github.com/sponsors/sindresorhus"
      }
    },
    "node_modules/stylehacks": {
      "version": "4.0.3",
      "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
@@ -18220,6 +18623,67 @@
      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
      "dev": true
    },
    "node_modules/table": {
      "version": "5.4.6",
      "resolved": "https://registry.npmmirror.com/table/-/table-5.4.6.tgz",
      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "ajv": "^6.10.2",
        "lodash": "^4.17.14",
        "slice-ansi": "^2.1.0",
        "string-width": "^3.0.0"
      },
      "engines": {
        "node": ">=6.0.0"
      }
    },
    "node_modules/table/node_modules/emoji-regex": {
      "version": "7.0.3",
      "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-7.0.3.tgz",
      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
      "dev": true,
      "peer": true
    },
    "node_modules/table/node_modules/is-fullwidth-code-point": {
      "version": "2.0.0",
      "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
      "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
      "dev": true,
      "peer": true,
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/table/node_modules/string-width": {
      "version": "3.1.0",
      "resolved": "https://registry.npmmirror.com/string-width/-/string-width-3.1.0.tgz",
      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "emoji-regex": "^7.0.1",
        "is-fullwidth-code-point": "^2.0.0",
        "strip-ansi": "^5.1.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/table/node_modules/strip-ansi": {
      "version": "5.2.0",
      "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "ansi-regex": "^4.1.0"
      },
      "engines": {
        "node": ">=6"
      }
    },
    "node_modules/tapable": {
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
@@ -18394,6 +18858,13 @@
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/text-table": {
      "version": "0.2.0",
      "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz",
      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
      "dev": true,
      "peer": true
    },
    "node_modules/thenify": {
      "version": "3.3.1",
@@ -19333,6 +19804,13 @@
      "bin": {
        "uuid": "bin/uuid"
      }
    },
    "node_modules/v8-compile-cache": {
      "version": "2.4.0",
      "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
      "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==",
      "dev": true,
      "peer": true
    },
    "node_modules/validate-npm-package-license": {
      "version": "3.0.4",
@@ -20698,6 +21176,19 @@
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
    },
    "node_modules/write": {
      "version": "1.0.3",
      "resolved": "https://registry.npmmirror.com/write/-/write-1.0.3.tgz",
      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
      "dev": true,
      "peer": true,
      "dependencies": {
        "mkdirp": "^0.5.1"
      },
      "engines": {
        "node": ">=4"
      }
    },
    "node_modules/ws": {
      "version": "7.5.3",
@@ -23656,6 +24147,14 @@
        "acorn-walk": "^6.0.1"
      }
    },
    "acorn-jsx": {
      "version": "5.3.2",
      "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
      "dev": true,
      "peer": true,
      "requires": {}
    },
    "acorn-walk": {
      "version": "6.2.0",
      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
@@ -23998,6 +24497,13 @@
      "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==",
      "dev": true
    },
    "astral-regex": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-1.0.0.tgz",
      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
      "dev": true,
      "peer": true
    },
    "async": {
      "version": "3.2.6",
      "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
@@ -24264,6 +24770,16 @@
      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
      "dev": true,
      "optional": true
    },
    "bindings": {
      "version": "1.5.0",
      "resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz",
      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
      "dev": true,
      "optional": true,
      "requires": {
        "file-uri-to-path": "1.0.0"
      }
    },
    "bluebird": {
      "version": "3.7.2",
@@ -26604,6 +27120,16 @@
        "buffer-indexof": "^1.0.0"
      }
    },
    "doctrine": {
      "version": "3.0.0",
      "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz",
      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
      "dev": true,
      "peer": true,
      "requires": {
        "esutils": "^2.0.2"
      }
    },
    "dom-converter": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
@@ -27059,6 +27585,82 @@
        }
      }
    },
    "eslint": {
      "version": "6.8.0",
      "resolved": "https://registry.npmmirror.com/eslint/-/eslint-6.8.0.tgz",
      "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
      "dev": true,
      "peer": true,
      "requires": {
        "@babel/code-frame": "^7.0.0",
        "ajv": "^6.10.0",
        "chalk": "^2.1.0",
        "cross-spawn": "^6.0.5",
        "debug": "^4.0.1",
        "doctrine": "^3.0.0",
        "eslint-scope": "^5.0.0",
        "eslint-utils": "^1.4.3",
        "eslint-visitor-keys": "^1.1.0",
        "espree": "^6.1.2",
        "esquery": "^1.0.1",
        "esutils": "^2.0.2",
        "file-entry-cache": "^5.0.1",
        "functional-red-black-tree": "^1.0.1",
        "glob-parent": "^5.0.0",
        "globals": "^12.1.0",
        "ignore": "^4.0.6",
        "import-fresh": "^3.0.0",
        "imurmurhash": "^0.1.4",
        "inquirer": "^7.0.0",
        "is-glob": "^4.0.0",
        "js-yaml": "^3.13.1",
        "json-stable-stringify-without-jsonify": "^1.0.1",
        "levn": "^0.3.0",
        "lodash": "^4.17.14",
        "minimatch": "^3.0.4",
        "mkdirp": "^0.5.1",
        "natural-compare": "^1.4.0",
        "optionator": "^0.8.3",
        "progress": "^2.0.0",
        "regexpp": "^2.0.1",
        "semver": "^6.1.2",
        "strip-ansi": "^5.2.0",
        "strip-json-comments": "^3.0.1",
        "table": "^5.2.3",
        "text-table": "^0.2.0",
        "v8-compile-cache": "^2.0.3"
      },
      "dependencies": {
        "import-fresh": {
          "version": "3.3.1",
          "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz",
          "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
          "dev": true,
          "peer": true,
          "requires": {
            "parent-module": "^1.0.0",
            "resolve-from": "^4.0.0"
          }
        },
        "resolve-from": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz",
          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
          "dev": true,
          "peer": true
        },
        "strip-ansi": {
          "version": "5.2.0",
          "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
          "dev": true,
          "peer": true,
          "requires": {
            "ansi-regex": "^4.1.0"
          }
        }
      }
    },
    "eslint-loader": {
      "version": "2.2.1",
      "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz",
@@ -27094,17 +27696,78 @@
        }
      }
    },
    "eslint-scope": {
      "version": "5.1.1",
      "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz",
      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
      "dev": true,
      "peer": true,
      "requires": {
        "esrecurse": "^4.3.0",
        "estraverse": "^4.1.1"
      }
    },
    "eslint-utils": {
      "version": "1.4.3",
      "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-1.4.3.tgz",
      "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
      "dev": true,
      "peer": true,
      "requires": {
        "eslint-visitor-keys": "^1.1.0"
      }
    },
    "eslint-visitor-keys": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
      "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
      "dev": true
    },
    "espree": {
      "version": "6.2.1",
      "resolved": "https://registry.npmmirror.com/espree/-/espree-6.2.1.tgz",
      "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
      "dev": true,
      "peer": true,
      "requires": {
        "acorn": "^7.1.1",
        "acorn-jsx": "^5.2.0",
        "eslint-visitor-keys": "^1.1.0"
      },
      "dependencies": {
        "acorn": {
          "version": "7.4.1",
          "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz",
          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
          "dev": true,
          "peer": true
        }
      }
    },
    "esprima": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
      "dev": true
    },
    "esquery": {
      "version": "1.7.0",
      "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.7.0.tgz",
      "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
      "dev": true,
      "peer": true,
      "requires": {
        "estraverse": "^5.1.0"
      },
      "dependencies": {
        "estraverse": {
          "version": "5.3.0",
          "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
          "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
          "dev": true,
          "peer": true
        }
      }
    },
    "esrecurse": {
      "version": "4.3.0",
@@ -27521,6 +28184,16 @@
        "escape-string-regexp": "^1.0.5"
      }
    },
    "file-entry-cache": {
      "version": "5.0.1",
      "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
      "dev": true,
      "peer": true,
      "requires": {
        "flat-cache": "^2.0.1"
      }
    },
    "file-loader": {
      "version": "4.3.0",
      "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz",
@@ -27552,6 +28225,13 @@
          }
        }
      }
    },
    "file-uri-to-path": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
      "dev": true,
      "optional": true
    },
    "filesize": {
      "version": "3.6.1",
@@ -27657,6 +28337,37 @@
          "dev": true
        }
      }
    },
    "flat-cache": {
      "version": "2.0.1",
      "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-2.0.1.tgz",
      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
      "dev": true,
      "peer": true,
      "requires": {
        "flatted": "^2.0.0",
        "rimraf": "2.6.3",
        "write": "1.0.3"
      },
      "dependencies": {
        "rimraf": {
          "version": "2.6.3",
          "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.6.3.tgz",
          "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
          "dev": true,
          "peer": true,
          "requires": {
            "glob": "^7.1.3"
          }
        }
      }
    },
    "flatted": {
      "version": "2.0.2",
      "resolved": "https://registry.npmmirror.com/flatted/-/flatted-2.0.2.tgz",
      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
      "dev": true,
      "peer": true
    },
    "flush-write-stream": {
      "version": "1.1.1",
@@ -27802,6 +28513,13 @@
        "is-callable": "^1.2.7"
      }
    },
    "functional-red-black-tree": {
      "version": "1.0.1",
      "resolved": "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
      "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
      "dev": true,
      "peer": true
    },
    "functions-have-names": {
      "version": "1.2.3",
      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
@@ -27917,7 +28635,6 @@
      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
      "dev": true,
      "optional": true,
      "requires": {
        "is-glob": "^4.0.1"
      }
@@ -27927,6 +28644,25 @@
      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
      "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==",
      "dev": true
    },
    "globals": {
      "version": "12.4.0",
      "resolved": "https://registry.npmmirror.com/globals/-/globals-12.4.0.tgz",
      "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
      "dev": true,
      "peer": true,
      "requires": {
        "type-fest": "^0.8.1"
      },
      "dependencies": {
        "type-fest": {
          "version": "0.8.1",
          "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.8.1.tgz",
          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
          "dev": true,
          "peer": true
        }
      }
    },
    "globalthis": {
      "version": "1.0.4",
@@ -29439,6 +30175,13 @@
      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
      "dev": true
    },
    "json-stable-stringify-without-jsonify": {
      "version": "1.0.1",
      "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
      "dev": true,
      "peer": true
    },
    "json-stringify-safe": {
      "version": "5.0.1",
      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
@@ -30705,6 +31448,13 @@
        "rimraf": "^2.6.1"
      }
    },
    "nan": {
      "version": "2.25.0",
      "resolved": "https://registry.npmmirror.com/nan/-/nan-2.25.0.tgz",
      "integrity": "sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==",
      "dev": true,
      "optional": true
    },
    "nanoid": {
      "version": "3.3.11",
      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
@@ -30728,6 +31478,13 @@
        "snapdragon": "^0.8.1",
        "to-regex": "^3.0.1"
      }
    },
    "natural-compare": {
      "version": "1.4.0",
      "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
      "dev": true,
      "peer": true
    },
    "needle": {
      "version": "2.9.1",
@@ -31314,6 +32071,25 @@
      "dev": true,
      "requires": {
        "no-case": "^2.2.0"
      }
    },
    "parent-module": {
      "version": "1.0.1",
      "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
      "dev": true,
      "peer": true,
      "requires": {
        "callsites": "^3.0.0"
      },
      "dependencies": {
        "callsites": {
          "version": "3.1.0",
          "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
          "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
          "dev": true,
          "peer": true
        }
      }
    },
    "parse-asn1": {
@@ -33303,6 +34079,13 @@
        "set-function-name": "^2.0.2"
      }
    },
    "regexpp": {
      "version": "2.0.1",
      "resolved": "https://registry.npmmirror.com/regexpp/-/regexpp-2.0.1.tgz",
      "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
      "dev": true,
      "peer": true
    },
    "regexpu-core": {
      "version": "6.4.0",
      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz",
@@ -34176,6 +34959,27 @@
      "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
      "dev": true
    },
    "slice-ansi": {
      "version": "2.1.0",
      "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-2.1.0.tgz",
      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
      "dev": true,
      "peer": true,
      "requires": {
        "ansi-styles": "^3.2.0",
        "astral-regex": "^1.0.0",
        "is-fullwidth-code-point": "^2.0.0"
      },
      "dependencies": {
        "is-fullwidth-code-point": {
          "version": "2.0.0",
          "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
          "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
          "dev": true,
          "peer": true
        }
      }
    },
    "snapdragon": {
      "version": "0.8.2",
      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
@@ -34354,6 +35158,12 @@
          "dev": true
        }
      }
    },
    "sortablejs": {
      "version": "1.15.7",
      "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.7.tgz",
      "integrity": "sha512-Kk8wLQPlS+yi1ZEf48a4+fzHa4yxjC30M/Sr2AnQu+f/MPwvvX9XjZ6OWejiz8crBsLwSq8GHqaxaET7u6ux0A==",
      "peer": true
    },
    "source-list-map": {
      "version": "2.0.1",
@@ -34723,6 +35533,13 @@
      "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==",
      "dev": true
    },
    "strip-json-comments": {
      "version": "3.1.1",
      "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
      "dev": true,
      "peer": true
    },
    "stylehacks": {
      "version": "4.0.3",
      "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
@@ -34895,6 +35712,57 @@
      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
      "dev": true
    },
    "table": {
      "version": "5.4.6",
      "resolved": "https://registry.npmmirror.com/table/-/table-5.4.6.tgz",
      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
      "dev": true,
      "peer": true,
      "requires": {
        "ajv": "^6.10.2",
        "lodash": "^4.17.14",
        "slice-ansi": "^2.1.0",
        "string-width": "^3.0.0"
      },
      "dependencies": {
        "emoji-regex": {
          "version": "7.0.3",
          "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-7.0.3.tgz",
          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
          "dev": true,
          "peer": true
        },
        "is-fullwidth-code-point": {
          "version": "2.0.0",
          "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
          "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
          "dev": true,
          "peer": true
        },
        "string-width": {
          "version": "3.1.0",
          "resolved": "https://registry.npmmirror.com/string-width/-/string-width-3.1.0.tgz",
          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
          "dev": true,
          "peer": true,
          "requires": {
            "emoji-regex": "^7.0.1",
            "is-fullwidth-code-point": "^2.0.0",
            "strip-ansi": "^5.1.0"
          }
        },
        "strip-ansi": {
          "version": "5.2.0",
          "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
          "dev": true,
          "peer": true,
          "requires": {
            "ansi-regex": "^4.1.0"
          }
        }
      }
    },
    "tapable": {
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
@@ -35025,6 +35893,13 @@
          "dev": true
        }
      }
    },
    "text-table": {
      "version": "0.2.0",
      "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz",
      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
      "dev": true,
      "peer": true
    },
    "thenify": {
      "version": "3.3.1",
@@ -35747,6 +36622,13 @@
      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
      "dev": true
    },
    "v8-compile-cache": {
      "version": "2.4.0",
      "resolved": "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
      "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==",
      "dev": true,
      "peer": true
    },
    "validate-npm-package-license": {
      "version": "3.0.4",
@@ -36829,6 +37711,16 @@
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
    },
    "write": {
      "version": "1.0.3",
      "resolved": "https://registry.npmmirror.com/write/-/write-1.0.3.tgz",
      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
      "dev": true,
      "peer": true,
      "requires": {
        "mkdirp": "^0.5.1"
      }
    },
    "ws": {
      "version": "7.5.3",
      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz",
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task.js
@@ -76,7 +76,7 @@
                        //     PalletCode: param
                        // }
                        this.http
                            .get(`api/Task/WCSTask?task=${task}`)
                            .get("api/Task/WCSTask?task=${task}")
                            .then((x) => {
                                if (x.status) {
                                    this.$Message.success('任务手动下发成功.');
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSClient/src/extension/taskinfo/task_hty.js
@@ -1,6 +1,4 @@
//此js文件是用来自定义扩展业务代码,可以扩展一些自定义页面或者重新配置生成的代码
let extension = {
    components: {
      //查询界面扩展组件
@@ -17,6 +15,39 @@
    methods: {
       //下面这些方法可以保留也可以删除
      onInit() {  
      // åŽŸæœ‰æŒ‰é’®é€»è¾‘ï¼šTaskHandCancel
      let TaskHandCancelBtn = this.buttons.find(x => x.value == 'TaskHandCancel');
      if (TaskHandCancelBtn) {
          TaskHandCancelBtn.onClick = function() {
              this.$message.success('自定义按钮点击事件');
          }
      }
      // ========== æ–°å¢žï¼šåˆ é™¤æ—§åŽ†å²æ•°æ®æŒ‰é’®é€»è¾‘ï¼ˆæ— éœ€é€‰æ‹©æ•°æ®ï¼‰ ==========
      let DeleteOldTaskHistoryBtn = this.buttons.find(x => x.value == 'DeleteOldTaskHistory');
      if (DeleteOldTaskHistoryBtn) {
          DeleteOldTaskHistoryBtn.onClick = function() {
              // ç§»é™¤é€‰æ‹©æ•°æ®æ ¡éªŒï¼Œç›´æŽ¥å¼¹å‡ºç¡®è®¤å¼¹çª—(匹配你的弹窗风格)
              this.$confirm(`是否确定删除3个月前的所有历史任务数据?此操作不可恢复!`, "提示", {
                  confirmButtonText: "确认", // å’Œä½ çš„æ‰‹åŠ¨å‘é€æŒ‰é’®æ–‡å­—ä¸€è‡´
                  cancelButtonText: "取消",
                  showClose: true,
                  type: "warning"
              }).then(() => {
                  this.http
                      .get(`api/Task_Hty/DeleteOldHistory`)
                      .then((x) => {
                          if (x.status) {
                              this.$Message.success('历史数据删除成功.');
                              this.refresh();
                          } else {
                              return this.$error(x.message);
                          }
                      });
              })
          }
      }
      },
      onInited() {
        //框架初始化配置后
@@ -55,4 +86,3 @@
    }
  };
  export default extension;
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/.wsuo
Binary files differ
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/.vs/slnx.sqlite
Binary files differ
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEAWCS_Tasks/WIDESEAWMS_Tasks.csproj
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\WIDESEA_ITaskInfoService\WIDESEA_ITaskInfoService.csproj" />
    <ProjectReference Include="..\WIDESEA_TaskInfoService\WIDESEA_TaskInfoService.csproj" />
  </ItemGroup>
</Project>
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_HomeService/HomeService.cs
@@ -26,29 +26,29 @@
        /// <returns></returns>
        public WebResponseContent GetDt_TaskHty()
        {
            var response = new WebResponseContent();
            WebResponseContent response = new WebResponseContent();
            try
            {
                // èŽ·å–å½“å‰æ—¥æœŸæ—¶é—´
                var now = DateTime.Now;
                DateTime now = DateTime.Now;
                // èŽ·å–ä»Šæ—¥æ—¥æœŸèŒƒå›´
                var todayStart = now.Date;
                var todayEnd = now.Date.AddDays(1);
                DateTime todayStart = now.Date;
                DateTime todayEnd = now.Date.AddDays(1);
                // èŽ·å–æœ¬å‘¨æ—¥æœŸèŒƒå›´
                // è®¡ç®—本周一的日期:如果今天是周日(0),减去6天;否则减去当前星期几减1天
                var daysToSubtract = (int)now.DayOfWeek == 0 ? 6 : (int)now.DayOfWeek - 1;
                var weekStart = now.Date.AddDays(-daysToSubtract);
                var weekEnd = weekStart.AddDays(7);
                int daysToSubtract = (int)now.DayOfWeek == 0 ? 6 : (int)now.DayOfWeek - 1;
                DateTime weekStart = now.Date.AddDays(-daysToSubtract);
                DateTime weekEnd = weekStart.AddDays(7);
                // èŽ·å–æœ¬æœˆæ—¥æœŸèŒƒå›´
                var monthStart = new DateTime(now.Year, now.Month, 1);
                var monthEnd = monthStart.AddMonths(1);
                DateTime monthStart = new DateTime(now.Year, now.Month, 1);
                DateTime monthEnd = monthStart.AddMonths(1);
                // èŽ·å–æ‰€æœ‰åº“å­˜æ•°æ®ï¼Œç”¨äºŽåŽç»­ç»Ÿè®¡
                var allStockData = Repository.Db.Queryable<Dt_StockInfo>().ToList();
                var allTask_HtyData = Repository.Db.Queryable<Dt_Task_Hty>().ToList();
                List<Dt_StockInfo> allStockData = Repository.Db.Queryable<Dt_StockInfo>().ToList();
                List<Dt_Task_Hty> allTask_HtyData = BaseDal.QueryData();
                // è°ƒè¯•信息:打印日期范围和库存数据总数
                var debugInfo = new
                {
@@ -62,40 +62,40 @@
                };
                
                var toDt_task_hty_in = allTask_HtyData.Count(it => it.TaskStatus == (int)TaskInStatusEnum.InFinish);//获取出入库存历史任务记录
                var toDt_task_hty_on = allTask_HtyData.Count(it => it.TaskStatus == (int)TaskOutStatusEnum.OutFinish);
                int toDt_task_hty_in = allTask_HtyData.Count(it => it.TaskStatus == (int)TaskInStatusEnum.InFinish);//获取出入库存历史任务记录
                int toDt_task_hty_on = allTask_HtyData.Count(it => it.TaskStatus == (int)TaskOutStatusEnum.OutFinish);
                // ä»Šæ—¥å…¥åº“数量:今天创建且库存状态为入库完成的记录数量
                var todayInbound = allTask_HtyData.Count(it =>
                int todayInbound = allTask_HtyData.Count(it =>
                    it.CreateDate >= todayStart && it.CreateDate < todayEnd &&
                    it.TaskStatus == (int)TaskInStatusEnum.InFinish);
                // ä»Šæ—¥å‡ºåº“数量:今天创建且库存状态为出库完成的记录数量
                var todayOutbound = allTask_HtyData.Count(it =>
                int todayOutbound = allTask_HtyData.Count(it =>
                    it.CreateDate >= todayStart && it.CreateDate < todayEnd &&
                    it.TaskStatus == (int)TaskOutStatusEnum.OutFinish);
                // æœ¬å‘¨å…¥åº“数量:本周创建且库存状态为入库完成的记录数量
                var weekInbound = allTask_HtyData.Count(it =>
                int weekInbound = allTask_HtyData.Count(it =>
                    it.CreateDate >= weekStart && it.CreateDate < weekEnd &&
                    it.TaskStatus == (int)TaskInStatusEnum.InFinish);
                // æœ¬å‘¨å‡ºåº“数量:本周创建且任务状态为出库完成的记录数量
                var weekOutbound = allTask_HtyData.Count(it =>
                int weekOutbound = allTask_HtyData.Count(it =>
                    it.CreateDate >= weekStart && it.CreateDate < weekEnd &&
                    it.TaskStatus == (int)TaskOutStatusEnum.OutFinish);
                // æœ¬æœˆå…¥åº“数量:本月创建且库存状态为入库完成的记录数量
                var monthInbound = allTask_HtyData.Count(it =>
                int monthInbound = allTask_HtyData.Count(it =>
                    it.CreateDate >= monthStart && it.CreateDate < monthEnd &&
                    it.TaskStatus == (int)TaskInStatusEnum.InFinish);
                // æœ¬æœˆå‡ºåº“数量:本月创建且任务状态为出库完成的记录数量
                var monthOutbound = allTask_HtyData.Count(it =>
                int monthOutbound = allTask_HtyData.Count(it =>
                    it.CreateDate >= monthStart && it.CreateDate < monthEnd &&
                    it.TaskStatus == (int)TaskOutStatusEnum.OutFinish);
                // å¾…处理订单数量:由于只有Dt_StockInfo表,暂时返回0
                var pendingOrders = 0;
                int pendingOrders = 0;
                // åº“存状态分布:统计不同库存状态的数量
                var stockStatusDistribution = allTask_HtyData
@@ -114,22 +114,22 @@
                // è´§ä½åˆ©ç”¨çŽ‡ï¼šä»Žæ•°æ®åº“èŽ·å–è´§ä½ä¿¡æ¯
                // èŽ·å–æ‰€æœ‰è´§ä½
                var allLocations = Repository.Db.Queryable<Dt_LocationInfo>().ToList();
                var totalLocations = allLocations.Count;
                List<Dt_LocationInfo> allLocations = Repository.Db.Queryable<Dt_LocationInfo>().ToList();
                int totalLocations = allLocations.Count;
                // ç»Ÿè®¡ä¸åŒçŠ¶æ€çš„è´§ä½æ•°
                var freeLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.Free);
                var inStockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.InStock);
                var inStockLockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.InStockLock);
                var lockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.Lock);
                var freeLockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.FreeLock);
                var palletLockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.PalletLock);
                int freeLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.Free);
                int inStockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.InStock);
                int inStockLockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.InStockLock);
                int lockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.Lock);
                int freeLockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.FreeLock);
                int palletLockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.PalletLock);
                // è®¡ç®—已使用和未使用的货位数
                // å·²ä½¿ç”¨ï¼šæœ‰è´§ã€æœ‰è´§é”å®š
                var usedLocations = inStockLocations + inStockLockLocations;
                int usedLocations = inStockLocations + inStockLockLocations;
                // æœªä½¿ç”¨ï¼šç©ºé—²ã€ç©ºé—²é”å®š
                var unusedLocations = freeLocations + freeLockLocations;
                int unusedLocations = freeLocations + freeLockLocations;
                // åº“存变化趋势:模拟最近7天的数据
                // å®žé™…应根据数据库中的历史记录生成
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_ITaskInfoService/ITask_HtyService.cs
@@ -1,4 +1,4 @@
using SqlSugar;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
@@ -15,4 +15,16 @@
public interface ITask_HtyService : IService<Dt_Task_Hty>
{
    /// <summary>
    /// åˆ é™¤æŒ‡å®šæ—¥æœŸä¹‹å‰çš„历史任务数据
    /// </summary>
    /// <param name="keepMonths">保留的月数,默认为3个月(本月+后两个月)</param>
    /// <returns>删除的记录数</returns>
    int DeleteOldTaskHistory(int keepMonths = 3);
    /// <summary>
    /// è¾“出30天前数据
    /// </summary>
    /// <param name="task"></param>
    public void Task_Hty_Job();
}
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/PartialTaskService_Inbound.cs
@@ -227,7 +227,7 @@
                        location.LocationStatus = (int)LocationStatusEnum.InStockLock;
                        //生成移动任务
                        //生成任务
                        Dt_Task dt_Task = new()
                        {
                            PalletCode = palletInfo.palletCode,
@@ -271,7 +271,7 @@
                        else
                        {
                            _unitOfWorkManage.RollbackTran();  //回滚事务
                            return MESresponse($"下发出库失败,原因:{respon.Message}!", false);
                            return MESresponse($"下发入库失败,原因:{respon.Message}!", false);
                        }
                    }
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/Task_HtyService.cs
@@ -10,4 +10,46 @@
    public Task_HtyService(IRepository<Dt_Task_Hty> BaseDal) : base(BaseDal)
    {
    }
    /// <summary>
    /// åˆ é™¤æŒ‡å®šæ—¥æœŸä¹‹å‰çš„历史任务数据
    /// </summary>
    /// <param name="keepMonths">保留的月数,默认为3个月(本月+后两个月)</param>
    /// <returns>删除的记录数</returns>
    public int DeleteOldTaskHistory(int keepMonths = 3)
    {
        try
        {
            // è®¡ç®—保留日期:当前日期减去keepMonths个月
            DateTime keepDate = DateTime.Now.AddMonths(-keepMonths);
            // å…ˆæŸ¥è¯¢å‡ºè¦åˆ é™¤çš„æ•°æ®
            List<Dt_Task_Hty> tasksToDelete = BaseDal.QueryData().Where(x => x.CreateDate < keepDate).ToList();
            // å¦‚果没有要删除的数据,直接返回0
            if (tasksToDelete.Count == 0)
            {
                return 0;
            }
            // åˆ é™¤æŸ¥è¯¢å‡ºçš„历史记录
            bool result = BaseDal.DeleteData(tasksToDelete);
            return result ? tasksToDelete.Count : 0;
        }
        catch (Exception ex)
        {
            // è®°å½•异常日志
            //Console.WriteLine($"删除历史任务记录失败: {ex.Message}");
            return 0;
        }
    }
    /// <summary>
    /// å®šæ—¶ä»»åŠ¡è°ƒç”¨çš„åŽ†å²ä»»åŠ¡åˆ é™¤æ–¹æ³•
    /// </summary>
    public void Task_Hty_Job()
    {
        // åˆ é™¤3个月之前的历史任务数据,保留本月和后两个月的数据
        DeleteOldTaskHistory(3);
    }
}
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/TaskInfo/Task_HtyController.cs
@@ -1,4 +1,4 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WIDESEA_Core;
@@ -19,5 +19,25 @@
        public Task_HtyController(ITask_HtyService service) : base(service)
        {
        }
        /// <summary>
        /// åˆ é™¤æ—§çš„历史任务数据
        /// </summary>
        /// <param name="keepMonths">保留的月数,默认为3个月(本月+后两个月)</param>
        /// <returns>删除的记录数</returns>
        [HttpGet, Route("DeleteOldHistory")]
        [AllowAnonymous]
        public IActionResult DeleteOldHistory(int keepMonths = 3)
        {
            try
            {
                int result = Service.DeleteOldTaskHistory(keepMonths);
                return Ok(new { Success = true, Message = "历史任务删除成功", DeletedCount = result });
            }
            catch (Exception ex)
            {
                return Ok(new { Success = false, Message = "历史任务删除失败: " + ex.Message });
            }
        }
    }
}
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/ToMes.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,168 @@
using Autofac.Core;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using WIDESEA_Common.Log;
using WIDESEA_Core;
using WIDESEA_Core.BaseController;
using WIDESEA_DTO.ToMes;
using WIDESEA_ITaskInfoService;
using WIDESEA_Model.Models;
namespace WIDESEA_WMSServer.Controllers
{
    /// <summary>
    /// ä¸Šæ¸¸æŽ¥å£
    /// </summary>
    [Route("v1/pallet/rmsPalletTask")]
    [ApiController]
    public class ToMes : ApiBaseController<ITaskService, Dt_Task>
    {
        public ToMes(ITaskService service) : base(service)
        {
        }
        /// <summary>
        /// MES下发出库任务
        /// </summary>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("sendExTask"), AllowAnonymous]
        public ApiResponse<object> sendExTask([FromBody] InOutboundTaskReceived outbound)
        {
            ApiResponse<object> api = Service.sendExTask(outbound);
            if (api.Success == false)
            {
                WriteLog.Write_Log("MES下发任务", "MES下发出库任务", $"任务生成失败原因{api.Message}", outbound);
            }
            else
            {
                WriteLog.Write_Log("MES下发任务", "MES下发出库任务", $"任务生成成功", outbound);
            }
            return api;
        }
        /// <summary>
        /// MES下发入库任务
        /// </summary>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        [HttpPost, HttpGet, Route("sendEnTask"), AllowAnonymous]
        public ApiResponse<object> sendEnTask([FromBody] InOutboundTaskReceived outbound)
        {
            ApiResponse<object> api = Service.sendEnTask(outbound);
            if (api.Success == false)
            {
                WriteLog.Write_Log("MES下发任务", "MES下发入库任务", $"任务生成失败原因{api.Message}", outbound);
            }
            else
            {
                WriteLog.Write_Log("MES下发任务", "MES下发入库任务", $"任务生成成功", outbound);
            }
            return api;
        }
        /// <summary>
        /// æ–°å»ºè´§ä½
        /// </summary>
        [HttpPost, HttpGet, Route("createLocation"), AllowAnonymous]
        public ApiResponse<object> createLocation([FromBody] List<LocationInfoDto> locationInfo)
        {
            return Service.createLocation(locationInfo);
        }
        /// <summary>
        /// ä¿®æ”¹è´§ä½
        /// </summary>
        [HttpPost, HttpGet, Route("updateLocation"), AllowAnonymous]
        public ApiResponse<object> updateLocation([FromBody] LocationInfoDto locationInfo)
        {
            return Service.updateLocation(locationInfo);
        }
        /// <summary>
        /// åˆ é™¤è´§ä½
        /// </summary>
        [HttpPost, HttpGet, Route("deleteLocation"), AllowAnonymous]
        public ApiResponse<object> deleteLocation([FromBody] List<string> locationCode)
        {
            return Service.deleteLocation(locationCode);
        }
        /// <summary>
        /// MES下发库位调拨任务
        /// </summary>
        /// <param name="allocationTask">库位调拨任务信息</param>
        /// <returns></returns>
        [HttpPost, Route("onHandMove"), AllowAnonymous]
        public ApiResponse<object> sendAllocationTask([FromBody] AllocationTaskReceived allocationTask)
        {
            return Service.sendAllocationTask(allocationTask);
        }
        /// <summary>
        /// æ‰˜ç›˜ä»»åŠ¡æ•°æ®ä¼ è¾“å¯¹è±¡
        /// ç”¨äºŽå†…部业务数据传输
        /// </summary>
        public class PalletTaskDTO
        {
            /// <summary>
            /// ä¸šåŠ¡ID
            /// </summary>
            public string BusinessId { get; set; }
            /// <summary>
            /// ä»»åŠ¡ID
            /// </summary>
            public string TaskId { get; set; }
            /// <summary>
            /// æ‰˜ç›˜ç¼–码
            /// </summary>
            public string PalletCode { get; set; }
        }
        /// <summary>
        /// MES取消任务接口
        /// </summary>
        /// <param name="taskNum">任务号</param>
        /// <returns></returns>
        [HttpPost, Route("cancelTask"), AllowAnonymous]
        public ApiResponse<object> Cancelinventory([FromBody] PalletTaskDTO palletTaskDTO)
        {
            return Service.Cancelinventory(palletTaskDTO.PalletCode);
        }
        /// <summary>
        /// MES手动任务完成
        /// </summary>
        /// <param name="taskNum"></param>
        /// <returns></returns>
        [HttpPost, Route("mockComplete"), AllowAnonymous]
        public WebResponseContent ManualTaskCompleted([FromBody] PalletTaskDTO palletTaskDTO)
        {
            return Service.ManualTaskCompleted(palletTaskDTO.PalletCode);
        }
        /// <summary>
        /// MES任务结果反馈接口
        /// </summary>
        /// <param name="taskFeedback"></param>
        /// <returns></returns>
        [HttpPost, Route("resultReport"), AllowAnonymous]
        public ApiResponse<object> TaskFeedback([FromBody] TaskNotification taskFeedback)
        {
            return Service.TaskFeedback(taskFeedback);
        }
    }
}
ÏîÄ¿´úÂë/´óÆÁ/src/api/api.js
@@ -8,7 +8,8 @@
import router from '@/router'
let baseUrl = UtilVar.baseUrl
// let wcsBaseUrl = 'http://10.6.100.16:9291'
//本地测试127,项目生产10
// let wcsBaseUrl = 'http://10.6.100.116:9291'
// let wmsBaseUrl = 'http://10.6.100.116:9290'
let wmsBaseUrl = 'http://127.0.0.1:9290'
let wcsBaseUrl= 'http://127.0.0.1:9291'
ÏîÄ¿´úÂë/´óÆÁ/src/store/modules/setting.js
@@ -12,6 +12,8 @@
        ssyjSwiper:true,//实时预警轮播
        isScale:true,//是否进行全局适配
        fullscreen: false, // æ·»åŠ ï¼šå…¨å±çŠ¶æ€
        currentTask: 'sc02', // å½“前任务:sc01/sc02
        currentLocation: 'sc01', // å½“前货位状态:sc01/sc02
        defaultOption: {
            step: 4.4, // æ•°å€¼è¶Šå¤§é€Ÿåº¦æ»šåŠ¨è¶Šå¿«
            hoverStop: true, // æ˜¯å¦å¼€å¯é¼ æ ‡æ‚¬åœstop
@@ -43,12 +45,48 @@
        updateSwiper(state, {val,type}) {
            state[type] = val
            
            // åˆ›å»ºå®Œæ•´çš„设置对象,包含全屏状态
            // åˆ›å»ºå®Œæ•´çš„设置对象,包含全屏状态和切换状态
            const settingData = {
                sbtxSwiper: state.sbtxSwiper,
                ssyjSwiper: state.ssyjSwiper,
                isScale: state.isScale,
                fullscreen: state.fullscreen || false, // ç¡®ä¿åŒ…含全屏状态
                currentTask: state.currentTask,
                currentLocation: state.currentLocation
            }
            localStorage.setItem('settingData', JSON.stringify(settingData))
        },
        // æ›´æ–°å½“前任务
        updateCurrentTask(state, val) {
            state.currentTask = val;
            // åˆ›å»ºå®Œæ•´çš„设置对象,包含全屏状态和切换状态
            const settingData = {
                sbtxSwiper: state.sbtxSwiper,
                ssyjSwiper: state.ssyjSwiper,
                isScale: state.isScale,
                fullscreen: state.fullscreen || false,
                currentTask: state.currentTask,
                currentLocation: state.currentLocation
            }
            localStorage.setItem('settingData', JSON.stringify(settingData))
        },
        // æ›´æ–°å½“前货位状态
        updateCurrentLocation(state, val) {
            state.currentLocation = val;
            // åˆ›å»ºå®Œæ•´çš„设置对象,包含全屏状态和切换状态
            const settingData = {
                sbtxSwiper: state.sbtxSwiper,
                ssyjSwiper: state.ssyjSwiper,
                isScale: state.isScale,
                fullscreen: state.fullscreen || false,
                currentTask: state.currentTask,
                currentLocation: state.currentLocation
            }
            
            localStorage.setItem('settingData', JSON.stringify(settingData))
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/center-bottom.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/center-map.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/index.vue
@@ -11,13 +11,12 @@
      <div class="pagetab">
        <div class="item">实时监测</div>
      </div>
      <!-- SC01巷道任务信息 -->
      <ItemWrap class="contetn_left-bottom contetn_lr-item" title="SC01巷道任务信息" style="padding: 0 10px 16px 0px">
        <sc01-task-info />
      </ItemWrap>
      <!-- SC02巷道任务信息 -->
      <ItemWrap class="contetn_left-bottom contetn_lr-item" title="SC02巷道任务信息">
        <sc02-task-info />
      <!-- å··é“任务信息 -->
      <ItemWrap class="contetn_left-bottom contetn_lr-item" title="巷道任务信息" style="padding: 0 10px 16px 0px; height: 92%;">
        <div class="task-content">
          <sc01-task-info v-if="currentTask === 'sc01'" />
          <sc02-task-info v-else-if="currentTask === 'sc02'" />
        </div>
      </ItemWrap>
    </div>
    <div class="contetn_center">
@@ -26,24 +25,24 @@
        <inventory-stats />
      </ItemWrap>
      <!-- æ—¥å‡ºå…¥åº“柱形图对比 -->
      <ItemWrap class="contetn_left-bottom contetn_lr-item" title="日出入库对比" style="padding: 0 10px 16px 10px">
      <ItemWrap class="contetn_left-bottom contetn_lr-item" title="报警信息" style="padding: 0 10px 16px 10px">
        <daily-inout-chart />
      </ItemWrap>
    </div>
    <div class="contetn_right">
      <!-- SC01货位状态 -->
      <ItemWrap class="contetn_left-bottom contetn_lr-item" title="SC01货位状态">
        <sc01-location-status />
      </ItemWrap>
      <!-- SC02货位状态 -->
      <ItemWrap class="contetn_left-bottom contetn_lr-item" title="SC02货位状态">
        <sc02-location-status />
      <!-- è´§ä½çŠ¶æ€ -->
      <ItemWrap class="contetn_left-bottom contetn_lr-item" title="货位状态" style="padding: 0 10px 16px 0px; height: 92%;">
        <div class="task-content">
          <sc01-location-status v-if="currentLocation === 'sc01'" />
          <sc02-location-status v-else-if="currentLocation === 'sc02'" />
        </div>
      </ItemWrap>
    </div>
  </div>
</template>
<script>
import { mapState, mapMutations } from 'vuex'
import sc01TaskInfo from './sc01-task-info.vue'
import sc02TaskInfo from './sc02-task-info.vue'
import inventoryStats from './inventory-stats.vue'
@@ -59,10 +58,8 @@
    sc01LocationStatus,
    sc02LocationStatus
  },
  data() {
    return {
    };
  computed: {
    ...mapState('setting', ['currentTask', 'currentLocation'])
  },
  filters: {
    numsFilter(msg) {
@@ -73,9 +70,8 @@
  },
  mounted() { },
  methods: {
  methods: {},
  },
};
</script>
<style lang="scss" scoped>
@@ -84,25 +80,34 @@
  display: flex;
  justify-content: center;
  gap: 10px;
  height: 100%;
  .contetn_left,
  .contetn_right {
    width: 600px;
    // height: 100%;
    box-sizing: border-box;
    gap: 10px;
    // padding: 16px 0;
    display: flex;
    flex-direction: column;
  }
  .contetn_center {
    width: 660px;
    gap: 10px;
    display: flex;
    flex-direction: column;
  }
  // å·¦ä¾§SC01任务信息 - ä¿æŒä¸Žå…¶ä»–区域相同的高度
  .contetn_left-item {
    height: px; // æ¢å¤åŽŸæ¥çš„å›ºå®šé«˜åº¦ï¼Œå’Œå³ä¾§å•ä¸ªå—çš„é«˜åº¦ä¸€è‡´
    flex-shrink: 0; // é˜²æ­¢åŽ‹ç¼©
  }
  //左右两侧 ä¸‰ä¸ªå—
  .contetn_lr-item {
    gap: 10px;
    height: 480px;
    height: 480px; // æ¢å¤åŽŸæ¥çš„å›ºå®šé«˜åº¦
  }
  .contetn_center_top {
@@ -114,7 +119,6 @@
    display: flex;
    flex-direction: column;
    gap: 10px;
    // justify-content: space-around;
  }
  .contetn_center-bottom {
@@ -126,7 +130,6 @@
  .contetn_right {
    display: flex;
    flex-direction: column;
    // justify-content: space-around;
    gap: 10px;
    position: relative;
  }
@@ -164,4 +167,11 @@
    transform: rotate(360deg) scale(1);
  }
}
// ä»»åŠ¡å†…å®¹åŒºåŸŸ
.task-content {
  width: 100%;
  height: 100%;
  overflow: hidden;
}
</style>
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/inventory-stats.vue
@@ -83,7 +83,7 @@
    // æ¯10秒刷新一次数据
    this.refreshInterval = setInterval(() => {
      this.getData();
    }, 10000);
    }, 30000);
  },
  beforeDestroy() {
    if (this.refreshInterval) {
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/left-bottom.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/left-center-right.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/left-center.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/left-top.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/pass-two.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/right-bottom.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/right-center.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/right-top.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/sc01-location-status.vue
@@ -25,7 +25,7 @@
    // æ¯10秒刷新一次数据
    this.refreshInterval = setInterval(() => {
      this.getData();
    }, 10000);
    }, 30000);
  },
  beforeDestroy() {
    if (this.chart) {
@@ -61,21 +61,33 @@
          }
        },
        legend: {
          orient: 'vertical',
          right: '10%',
          top: 'center',
          orient: 'horizontal',
          bottom: '10%',
          left: 'center',
          textStyle: {
            color: '#fff',
            fontSize: 14
            fontSize: 20
          },
          data: ['空闲', '有货', '有货锁定']
          data: ['空闲', '有货', '有货锁定'],
          width: '80%',
          itemWidth: 20,
          itemHeight: 14,
          itemGap: 30,
          formatter: function(name) {
            let value = 0;
            if (name === '空闲') value = this.locationData.free;
            if (name === '有货') value = this.locationData.occupied;
            if (name === '有货锁定') value = this.locationData.locked;
            return `${name}\n${value}`;
          }.bind(this),
          selectedMode: 'multiple'
        },
        series: [
          {
            name: 'SC01货位状态',
            type: 'pie',
            radius: ['50%', '70%'],
            center: ['40%', '50%'],
            radius: ['40%', '75%'],
            center: ['50%', '45%'],
            avoidLabelOverlap: true,
            itemStyle: {
              borderRadius: 4,
@@ -86,12 +98,12 @@
              show: true,
              formatter: '{b}: {c}',
              color: '#fff',
              fontSize: 14
              fontSize: 20
            },
            emphasis: {
              label: {
                show: true,
                fontSize: 16,
                fontSize: 20,
                fontWeight: 'bold'
              },
              itemStyle: {
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/sc01-task-info.vue
@@ -28,7 +28,7 @@
    // èŽ·å–ä»»åŠ¡æ•°æ®
    getTaskData() {
      import('@/api/api').then(({ WCS_GET }) => {
        WCS_GET('/api/Task/GetRoadwayTaskProgress', { roadway: 'SC01' })
        WCS_GET("/api/Task/GetRoadwayTaskProgress", { roadway: 'SC01' })
          .then((response) => {
            console.log("SC01任务数据响应:", response);
@@ -202,7 +202,7 @@
    startAutoRefresh() {
      this.refreshInterval = setInterval(() => {
        this.getTaskData();
      }, 10000);
      }, 30000);
    },
    // åœæ­¢è‡ªåŠ¨åˆ·æ–°
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/sc02-location-status.vue
@@ -25,7 +25,7 @@
    // æ¯10秒刷新一次数据
    this.refreshInterval = setInterval(() => {
      this.getData();
    }, 10000);
    }, 30000);
  },
  beforeDestroy() {
    if (this.chart) {
@@ -61,21 +61,33 @@
          }
        },
        legend: {
          orient: 'vertical',
          right: '10%',
          top: 'center',
          orient: 'horizontal',
          bottom: '10%',
          left: 'center',
          textStyle: {
            color: '#fff',
            fontSize: 14
            fontSize: 20
          },
          data: ['空闲', '有货', '有货锁定']
          data: ['空闲', '有货', '有货锁定'],
          width: '80%',
          itemWidth: 20,
          itemHeight: 14,
          itemGap: 30,
          formatter: function(name) {
            let value = 0;
            if (name === '空闲') value = this.locationData.free;
            if (name === '有货') value = this.locationData.occupied;
            if (name === '有货锁定') value = this.locationData.locked;
            return `${name}\n${value}`;
          }.bind(this),
          selectedMode: 'multiple'
        },
        series: [
          {
            name: 'SC02货位状态',
            type: 'pie',
            radius: ['50%', '70%'],
            center: ['40%', '50%'],
            radius: ['40%', '75%'],
            center: ['50%', '45%'],
            avoidLabelOverlap: true,
            itemStyle: {
              borderRadius: 4,
@@ -86,12 +98,12 @@
              show: true,
              formatter: '{b}: {c}',
              color: '#fff',
              fontSize: 14
              fontSize: 20
            },
            emphasis: {
              label: {
                show: true,
                fontSize: 16,
                fontSize: 20,
                fontWeight: 'bold'
              },
              itemStyle: {
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/sc02-task-info.vue
@@ -202,7 +202,7 @@
    startAutoRefresh() {
      this.refreshInterval = setInterval(() => {
        this.getTaskData();
      }, 10000);
      }, 30000);
    },
    // åœæ­¢è‡ªåŠ¨åˆ·æ–°
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/station-four.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/station-one.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/station-three.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/´óÆÁ/src/views/indexs/station-two.vue
ÎļþÒÑɾ³ý
ÏîÄ¿´úÂë/´óÆÁ/src/views/setting.vue
@@ -61,6 +61,32 @@
                            </el-radio-group>
                        </div>
                    </div>
                    <!-- å··é“任务信息默认显示 -->
                    <div class="setting_item">
                        <span class="setting_label">
                            å··é“任务信息默认显示:
                        </span>
                        <div class="setting_content">
                            <el-radio-group v-model="currentTaskRadio" @change="(val) => updateCurrentTask(val)">
                                <el-radio :label="'sc01'">SC01</el-radio>
                                <el-radio :label="'sc02'">SC02</el-radio>
                            </el-radio-group>
                        </div>
                    </div>
                    <!-- è´§ä½çŠ¶æ€é»˜è®¤æ˜¾ç¤º -->
                    <div class="setting_item">
                        <span class="setting_label">
                            è´§ä½çŠ¶æ€é»˜è®¤æ˜¾ç¤º:
                        </span>
                        <div class="setting_content">
                            <el-radio-group v-model="currentLocationRadio" @change="(val) => updateCurrentLocation(val)">
                                <el-radio :label="'sc01'">SC01</el-radio>
                                <el-radio :label="'sc02'">SC02</el-radio>
                            </el-radio-group>
                        </div>
                    </div>
                    <div class="flex justify-center">
                        <!-- <el-button type="primary" round size="mini">确定</el-button> -->
                    </div>
@@ -82,6 +108,8 @@
            isScaleradio:true,
            fullscreenRadio: false, // å…¨å±çŠ¶æ€
            fullscreenElement: null, // å…¨å±å…ƒç´ 
            currentTaskRadio: 'sc02', // é»˜è®¤ä»»åŠ¡æ˜¾ç¤ºï¼šsc01/sc02
            currentLocationRadio: 'sc01' // é»˜è®¤è´§ä½çŠ¶æ€æ˜¾ç¤ºï¼šsc01/sc02
        };
    },
    computed: {},
@@ -196,6 +224,16 @@
                    this.bindFullscreenEvents();
                }
            }
        },
        // æ›´æ–°å½“前任务
        updateCurrentTask(val) {
            this.$store.commit('setting/updateCurrentTask', val);
        },
        // æ›´æ–°å½“前货位状态
        updateCurrentLocation(val) {
            this.$store.commit('setting/updateCurrentLocation', val);
        }
    },
    created() {
@@ -204,6 +242,8 @@
        this.ssyjradio = this.$store.state.setting.ssyjSwiper,
        this.isScaleradio = this.$store.state.setting.isScale;
        this.fullscreenRadio = this.$store.state.setting.fullscreen || false;
        this.currentTaskRadio = this.$store.state.setting.currentTask;
        this.currentLocationRadio = this.$store.state.setting.currentLocation;
        
        // åˆå§‹åŒ–时检查全屏状态
        if (this.fullscreenRadio) {