From 5bc6d819399409a429093a6001c553d6fa2d2e15 Mon Sep 17 00:00:00 2001
From: huangxiaoqiang <huangxiaoqiang@hnkhzn.com>
Date: 星期三, 19 二月 2025 14:34:06 +0800
Subject: [PATCH] 上传三楼代码

---
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/basicinfo/demo_Product/LocationChange.vue                                    |  142 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Dictionary.jsx                                                                |   75 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_DictionaryList.jsx                                                            |   22 
 3F/Code Management/WCS/WIDESEAWCS_Client/.gitignore                                                                                             |   23 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/401.vue                                                                        |   19 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Services/WIDESEA_Services.csproj                                                               |   24 
 3F/Code Management/WMS/WIDESEA_WMSClient/.browserslistrc                                                                                        |    3 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/RedirectError.vue                                                              |   59 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IBusinessesRepository/WIDESEA_IBusinessesRepository.csproj                                     |   14 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/Empty.vue                                                                         |    3 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/WIDESEAWCS_ISystemServices.csproj                                           |   13 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/stock/extend/SupplementationData.vue                                         |  104 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_LocationInfo.vue                                                    |   85 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node_filter.vue                                                                |  201 
 3F/Code Management/WMS/WIDESEA_WMSServer/LogLibrary/LogLibrary.csproj                                                                           |   47 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/element-icon/fonts/element-icons.woff                                                       |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/default_header.png                                                                     |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/editor/KindEditor.vue                                                                   |   13 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/taskinfo/task_Hty.vue                                                                        |  246 
 3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/DesignTimeBuild/.dtbcache.v2                                                     |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/element-icon/fonts/element-icons.ttf                                                        |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/css/common.less                                                                             |   75 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGridCustomColumn.vue                                                 |   95 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGridCustomColumn.vue                                                 |   95 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/system/Sys_User/Sys_UserGridHeader.vue                                                   |   85 
 3F/Code Management/WMS/WIDESEA_WMSClient/build.bat                                                                                              |    1 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/formChart.vue                                                                         |  118 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/log.png                                                                                |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolTable.vue                                                                      | 1873 ++
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/AsyncLoading.vue                                                                  |   10 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node_form.vue                                                                  |  351 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/wms_x.png                                                                              |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Permission/RoleTree.vue                                                               |  152 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj.user                                                        |    6 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/system/Sys_Department.jsx                                                         |  153 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/Audit.vue                                                                         |   59 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/material/Dt_MaterielAttribute.vue                                                |   86 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderTransferDetail.vue                                           |   82 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolTable.vue                                                                      | 1793 ++
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata/head_bg.png                                                                   |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/system/Sys_Department.vue                                                             |   71 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User/Sys_UserGridHeader.vue                                                   |   85 
 3F/Code Management/WMS/WIDESEA_WMSClient/public/static/el.png                                                                                   |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/roomtemperature.vue                                                |   61 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolElementMenuChild.vue                                                           |   56 
 3F/Code Management/WMS/WIDESEA_WMSClient/env.d.ts                                                                                               |    1 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Index.vue                                                                                    |  720 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/UserInfo.vue                                                                          |  281 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_DictionaryList.vue                                                                |   65 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/index/Message.vue                                                                            |   45 
 3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/fileList.bin                                                                 |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/element-icon/fonts/element-icons.ttf                                                        |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon3.png                                                                           |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User.jsx                                                                      |   86 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/QuickSearch.vue                                                                   |  126 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/editor/VolWangEditor.vue                                                                |  154 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Properties/PublishProfiles/FolderProfile.pubxml.user                                 |   11 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGridAudit.vue                                                        |  427 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/logo.png                                                                                    |    0 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/bin/Debug/net6.0/ExcelExport/库存信息.xlsx                                               |    0 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageBasicRepository/WIDESEA_IStorageBasicRepository.csproj                                 |   13 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Permission.vue                                                                        |  359 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Core/WIDESEA_Core.csproj                                                                       |   41 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj                                                       |   20 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/error.png                                                                              |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/dispatchInfo.vue                                                                   |  247 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceInfo.vue                                                                     |  365 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/test.vue                                                                              |   18 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_RoadWayInfo.vue                                                     |   85 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/AuditHis.vue                                                             |   46 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Dictionary.vue                                                                    |   80 
 3F/Code Management/WMS/WIDESEA_WMSClient/.gitignore                                                                                             |   23 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/DeviceLine.vue                                                                          |   84 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Communicator/WIDESEAWCS_Communicator.csproj                                                 |   15 
 3F/Code Management/WCS/WIDESEAWCS_Client/public/wcslogo.png                                                                                     |    0 
 Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/dt_needBarcode.cs                                                       |   31 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server.sln                                                                                  |  231 
 3F/Code Management/WMS/WIDESEA_WMSClient/public/static/qq.png                                                                                   |    0 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoRepository/WIDESEAWCS_IBasicInfoRepository.csproj                                 |   13 
 3F/Code Management/WMS/WIDESEA_WMSClient/Dt_BillGroupStock.jsx                                                                                  |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/PointStackerRelation.vue                                               |   81 
 3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.suo                                                                         |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_needBarcode.vue                                                     |   90 
 3F/Code Management/WMS/WIDESEA_WMSClient/.eslintrc.cjs                                                                                          |   19 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_DictionaryList.vue                                                                |   65 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj                                                             |    9 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderProduction.vue                                               |  104 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGridDetail.vue                                                       |  283 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/Message.vue                                                                    |   39 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/methodsDetail.jsx                                                        |   43 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node.vue                                                                       |  100 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/WIDESEAWCS_IBasicInfoService.csproj                                       |   14 
 3F/Code Management/.vs/Code Management/v17/workspaceFileList.bin                                                                                |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role.vue                                                                          |  217 
 3F/Code Management/WMS/WIDESEA_WMSClient/install.bat                                                                                            |    1 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IServices/WIDESEA_IServices.csproj                                                             |   13 
 3F/Code Management/WCS/WIDESEAWCS_Client/public/static/login_bg.png                                                                             |    0 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/WIDESEAWCS_ITaskInfoService.csproj                                         |   13 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ErrorMsg.vue                                                                      |    3 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageBasicService/WIDESEA_IStorageBasicServices.csproj                                      |   13 
 3F/Code Management/WMS/WIDESEA_WMSClient/vite.config.ts                                                                                         |   82 
 项目资料/项目图纸/电芯3楼图纸与电气编号对照(08项目电芯3楼从注液开始)/电芯3F布局图0805.dwl2                                                                                         |    6 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/log.png                                                                                |    0 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/WIDESEAWCS_Model.csproj                                                               |   18 
 3F/Code Management/WMS/WIDESEA_WMSClient/run.bat                                                                                                |    1 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfo_HtyService/obj/Release/net6.0/WIDESEAWCS_ITaskInfo_HtyService.csproj.CopyComplete |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/public/wms_d.png                                                                                       |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/README.md                                                                                              |   41 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/Staticlibrary.vue                                                  |   96 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IRepository/WIDESEA_IRepository.csproj                                                         |   13 
 Code Management/WMS/WIDESEA_WMSClient/src/api/http.js                                                                                           |    2 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node.vue                                                                       |   99 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role.jsx                                                                      |   61 
 3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/fileList.bin                                                                 |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/RouterLoading.vue                                                                 |  105 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfo_HtyService/WIDESEAWCS_ITaskInfo_HtyService.csproj                                 |   13 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/Volume.vue                                                         |   58 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/material/Dt_MaterielInfo.vue                                                     |   95 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskRepository/WIDESEA_StorageTaskRepository.csproj                                     |   13 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Common/WIDESEA_Common.csproj                                                                   |   23 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/css/common.less                                                                             |   75 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/taskinfo/Dt_Task.jsx                                                         |  150 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/taskinfo/extend/taskExecuteDetail.vue                                                    |  259 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/basicinfo/Dt_LocationInfo.jsx                                                |  168 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemRepository/WIDESEAWCS_ISystemRepository.csproj                                       |   13 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_SignalR/WIDESEAWCS_SignalR.csproj                                                           |   13 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderSorting.vue                                                  |   99 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/Extend/Add.vue                                                               |   76 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue                                                                            |  262 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Repository/WIDESEA_Repository.csproj                                                           |   17 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfo_HtyRepository/WIDESEAWCS_TaskInfo_HtyRepository.csproj                             |   13 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/Index.vue                                                                                    |  717 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Tasks/WIDESEA_Tasks.csproj                                                                     |    9 
 3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon2.png                                                                           |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/index/Message.vue                                                                            |   45 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node_filter.vue                                                                |  201 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/logo.png                                                                               |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/UploadExcel.vue                                                                   |  215 
 3F/Code Management/WMS/WIDESEA_WMSServer/.vs/ProjectEvaluation/widesea_wmsserver.metadata.v7.bin                                                |    0 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicServices/WIDESEA_StorageBasicServices.csproj                                       |   26 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolImageViewer.vue                                                                |   34 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/LocationStatusChange.vue                                               |   71 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/signalR/Index.vue                                                                            |  113 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageOutOrderRepository/WIDESEA_IStorageOutOrderRepository.csproj                           |   13 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj                                                               |   17 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ProcessParameters/WIDESEAWCS_IProcessRepository.csproj                                      |   13 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/error-img.png                                                                          |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/yarn.lock                                                                                              | 4710 +++++
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrder.vue                                                         |  116 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_AreaInfo.vue                                                        |   92 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node_form.vue                                                                  |  350 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/Icons.vue                                                                         |  345 
 3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/.futdcache.v2                                                                |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Menu.vue                                                                          |  618 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/invoices/extension/Dt_InboundOrderDetail.vue                                 |  102 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/methods.jsx                                                              | 1721 ++
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolHeader.vue                                                                     |   67 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata/IviewCircle.vue                                                               |  102 
 3F/Code Management/WMS/WIDESEA_WMSServer/.vs/ProjectEvaluation/widesea_wmsserver.projects.v7.bin                                                |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Home.vue                                                                                     |   51 
 3F/Code Management/WMS/WIDESEA_WMSClient/public/static/login_bg.png                                                                             |    0 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderServices/WIDESEA_StorageOutOrderServices.csproj                                 |   25 
 3F/Code Management/.vs/slnx.sqlite                                                                                                              |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/FormationLibrary.vue                                               |   49 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/wms_d.png                                                                              |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/.vs/slnx.sqlite                                                                                        |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/editor/KindEditor.vue                                                                   |   13 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/indexLibrary.vue                                                                |   48 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/logo.png                                                                               |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderProductionDetail.vue                                         |   83 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/AgingLibrary.vue                                                   |  102 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemRepository/WIDESEAWCS_SystemRepository.csproj                                         |   13 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolUpload.vue                                                                     |  880 +
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGrid.vue                                                             |  806 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/error-img.png                                                                          |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/builder/coder.vue                                                                            |  658 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderTransfer.vue                                                 |  104 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/taskinfo/Dt_Task.vue                                                             |  102 
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json                                                                        |    4 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolFormDraggable/VolFormPreview.vue                                               |  206 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/Home.vue                                                                                     |  219 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGrid.less                                                            |  193 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/ProductionModel.vue                                                          |   68 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/editor/VolWangEditor.vue                                                                |  231 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/WIDESEA_StoragIntegrationServices.csproj                             |   17 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/App.vue                                                                                            |   63 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_User.vue                                                                          |   89 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_BusinessServices/WIDESEA_BusinessServices.csproj                                               |   20 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/chart.vue                                                                             |  101 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/Message.vue                                                                    |   39 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/zzzz.vue                                                                     |  364 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/AuditHis.vue                                                             |   46 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/DeviceStacker.vue                                                                       |   57 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/QuickSearch.vue                                                                   |  152 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata.vue                                                                           |  258 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicRepository/WIDESEA_StorageBasicRepository.csproj                                   |   13 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/panel.vue                                                                      |  612 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/404.vue                                                                        |   21 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/UploadExcel.vue                                                                   |  221 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/system/Sys_Department.vue                                                             |   71 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Login.vue                                                                                    |  386 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_User.vue                                                                          |  369 
 3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon1.png                                                                           |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Permission.vue                                                                        |  382 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/taskinfo/demo_Product/Dt_TaskExecuteDetail.vue                               |   88 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolForm.vue                                                                       | 1487 +
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfo_HtyService/WIDESEAWCS_TaskInfo_HtyService.csproj                                   |   13 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_WareAreaInfo.vue                                                    |   86 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj.user                                                        |    6 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_Strategy.vue                                                        |   86 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/error.png                                                                              |    0 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderRepository/WIDESEA_StorageOutOrderRepository.csproj                             |   13 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/obj/Debug/net6.0/WIDESEA_WMSServer.csproj.CopyComplete                               |    0 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/WIDESEA_StorageTaskServices.csproj                                         |   26 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/Audit.vue                                                                         |   59 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/401.vue                                                                        |   19 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/baozhuang.vue                                                      |   42 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolFormDraggable/VolFormPreview.vue                                               |  206 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IBusinessServices/WIDESEA_IBusinessServices.csproj                                             |   13 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Model/WIDESEA_Model.csproj                                                                     |   22 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/panel.vue                                                                      |  612 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_UnitInfo.vue                                                        |   84 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/coding.vue                                                                     |   25 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role1.vue                                                                         |   72 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj                                                             |   44 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolForm.vue                                                                       | 1551 +
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/flex.vue                                                                              |  386 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoRepository/WIDESEAWCS_BasicInfoRepository.csproj                                   |   13 
 Code Management/WCS/WIDESEAWCS_Client/src/views/basicinfo/Dt_needBarcode.vue                                                                    |   19 
 Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/BaseServices/ServiceBase.cs                                                               |    5 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/RouterLoading.vue                                                                 |  105 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolHeader.vue                                                                     |   67 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_StationManager.vue                                                  |   88 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/WIDESEAWCS_DTO.csproj                                                                   |   17 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/taskinfo/Dt_Task_Hty.vue                                                         |  114 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Properties/PublishProfiles/FolderProfile.pubxml.user                                 |   11 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/logo.png                                                                                    |    0 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Properties/PublishProfiles/FolderProfile.pubxml                                      |   17 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/AsyncLoading.vue                                                                  |   10 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node_menu.vue                                                                  |  126 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/stock/Dt_BillGroupStock.jsx                                                  |  190 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Properties/PublishProfiles/FolderProfile.pubxml                                      |   17 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/basicinfo/extend/addrouters.vue                                                          |  351 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfo_HtyRepository/WIDESEAWCS_ITaskInfo_HtyRepository.csproj                           |   14 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/DeviceLineVo.vue                                                                        |   67 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolElementMenuChild.vue                                                           |   56 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolUpload.vue                                                                     |  917 +
 Code Management/WCS/WIDESEAWCS_Client/src/api/http.js                                                                                           |    2 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_BusinessesRepository/WIDESEA_BusinessesRepository.csproj                                       |   14 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolFormDraggable/VolFormDraggable.vue                                             | 1157 +
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/index/index.less                                                                             |  644 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Log.vue                                                                           |   70 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/WIDESEAWCS_BasicInfoService.csproj                                         |   14 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Log.vue                                                                           |   70 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/hightemperature.vue                                                |   60 
 3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon4.png                                                                           |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/basicinfo/router.vue                                                                         |  265 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolFormDraggable/VolFormDraggable.vue                                             | 1159 +
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStoragIntegrationServices/WIDESEA_IStoragIntegrationServices.csproj                           |   13 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj                                                             |   99 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoRepository/WIDESEAWCS_ITaskInfoRepository.csproj                                   |   13 
 3F/Code Management/.vs/Code Management/v17/.wsuo                                                                                                |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/test.vue                                                                              |   18 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj                                                                 |   42 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/WIDESEAWCS_TaskInfoService.csproj                                           |   16 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Menu.vue                                                                          |  630 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderAndStock.vue                                                 |   85 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/stock/demo_Product/Dt_BillGroupStockDetail.vue                               |  106 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderDetail.vue                                                   |   90 
 3F/Code Management/WCS/WIDESEAWCS_Server/.vs/ProjectEvaluation/wideseawcs_server.metadata.v7.bin                                                |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/.vs/WIDESEA_WMSClient/v17/.wsuo                                                                        |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Permission/RoleTree.vue                                                               |  152 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageOutOrderService/WIDESEA_IStorageOutOrderServices.csproj                                |   13 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/wcs_logo.png                                                                           |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/index/index.less                                                                             |  644 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/basicinfo/Dt_needBarcode.vue                                                                 |   93 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocolDetail.vue                                                           |  207 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolElementMenu.vue                                                                |  198 
 3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/DesignTimeBuild/.dtbcache.v2                                                     |    0 
 项目资料/项目图纸/电芯3楼图纸与电气编号对照(08项目电芯3楼从注液开始)/电芯3F布局图0805.dwl                                                                                          |    3 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGrid.vue                                                             |  536 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_InboundOrder.vue                                                     |  113 
 3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/.suo                                                                         |    0 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/Icons.vue                                                                         |  345 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core - Backup.csproj                                                        |   38 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGrid.less                                                            |  178 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_InboundOrderDetail.vue                                               |   94 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/App.vue                                                                                            |   63 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node_menu.vue                                                                  |  129 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Dictionary.vue                                                                    |  325 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ProcessRepository/WIDESEAWCS_ProcessRepository.csproj                                       |   13 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/WIDESEAWCS_SystemServices.csproj                                             |   13 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/404.vue                                                                        |   21 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocol.vue                                                                 |  229 
 Code Management/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue                                                                               |    1 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageTaskService/WIDESEA_IStorageTaskServices.csproj                                        |   13 
 3F/Code Management/WCS/WIDESEAWCS_Server/.vs/ProjectEvaluation/wideseawcs_server.projects.v7.bin                                                |    0 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer.sln                                                                                  |  474 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/Login.vue                                                                                    |  408 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/coding.vue                                                                     |   25 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Log.jsx                                                                       |   26 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/Twoletters.vue                                                     |   48 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/quartzJob/extend/importDevicePro.vue                                                     |  116 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ErrorMsg.vue                                                                      |    3 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/RedirectError.vue                                                              |   59 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/stock/Dt_BillGroupStock.vue                                                      |   93 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/UserInfo.vue                                                                          |  317 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageTaskRepository/WIDESEA_IStorageTaskRepository.csproj                                   |   13 
 Code Management/WMS/WIDESEA_WMSClient/vite.config.ts                                                                                            |    2 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/momTest.vue                                                                  |  364 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolBox.vue                                                                        |  200 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolBox.vue                                                                        |  200 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Role.vue                                                                          |   72 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/basicinfo/extend/routerview.vue                                                          |   96 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGridAudit.vue                                                        |  427 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/Empty.vue                                                                         |    3 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata/layout.less                                                                   |  197 
 3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.futdcache.v2                                                                |    0 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/stock/DtBoxingInfo.vue                                                           |   82 
 Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Utilities/EntityProperties.cs                                                             |    2 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolElementMenu.vue                                                                |  236 
 3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/taskinfo/Dt_Task_Hty.jsx                                                     |  148 
 3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/WIDESEA_DTO.csproj                                                                         |   13 
 3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/element-icon/fonts/element-icons.woff                                                       |    0 
 3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoRepository/WIDESEAWCS_TaskInfoRepository.csproj                                     |   15 
 3F/Code Management/WMS/WIDESEA_WMSClient/README.md                                                                                              |   29 
 326 files changed, 48,575 insertions(+), 23 deletions(-)

diff --git a/3F/Code Management/.vs/Code Management/v17/.wsuo b/3F/Code Management/.vs/Code Management/v17/.wsuo
new file mode 100644
index 0000000..348c03f
--- /dev/null
+++ b/3F/Code Management/.vs/Code Management/v17/.wsuo
Binary files differ
diff --git a/3F/Code Management/.vs/Code Management/v17/workspaceFileList.bin b/3F/Code Management/.vs/Code Management/v17/workspaceFileList.bin
new file mode 100644
index 0000000..cb707a5
--- /dev/null
+++ b/3F/Code Management/.vs/Code Management/v17/workspaceFileList.bin
Binary files differ
diff --git a/3F/Code Management/.vs/slnx.sqlite b/3F/Code Management/.vs/slnx.sqlite
new file mode 100644
index 0000000..ea89955
--- /dev/null
+++ b/3F/Code Management/.vs/slnx.sqlite
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/.gitignore b/3F/Code Management/WCS/WIDESEAWCS_Client/.gitignore
new file mode 100644
index 0000000..403adbc
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/.gitignore
@@ -0,0 +1,23 @@
+.DS_Store
+node_modules
+/dist
+
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/README.md b/3F/Code Management/WCS/WIDESEAWCS_Client/README.md
new file mode 100644
index 0000000..1d81700
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/README.md
@@ -0,0 +1,41 @@
+# vol.vue3
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Run your unit tests
+```
+npm run test:unit
+```
+
+### Lints and fixes files
+```
+npm run lint
+```
+
+### Customize configuration
+See [Configuration Reference](https://cli.vuejs.org/config/).
+
+
+### npm run serve鍚姩寮傚父锛�
+    浣跨敤cmd杈撳叆node -v鏌ョ湅鐗堟湰锛屽鏋滄槸18.+鐗堟湰,璇峰皢package.json涓浜旇scripts涓殑鍐呭鏇挎崲涓猴細
+
+"scripts": {
+    "serve": " SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
+    "build": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build",
+    "test:unit": "vue-cli-service test:unit",
+    "lint": "vue-cli-service lint"
+}
+
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/public/static/login_bg.png b/3F/Code Management/WCS/WIDESEAWCS_Client/public/static/login_bg.png
new file mode 100644
index 0000000..925a5da
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/public/static/login_bg.png
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/public/wcslogo.png b/3F/Code Management/WCS/WIDESEAWCS_Client/public/wcslogo.png
new file mode 100644
index 0000000..2ef8e9b
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/public/wcslogo.png
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/public/wms_d.png b/3F/Code Management/WCS/WIDESEAWCS_Client/public/wms_d.png
new file mode 100644
index 0000000..1e198e9
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/public/wms_d.png
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/App.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/App.vue
new file mode 100644
index 0000000..1645abf
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/App.vue
@@ -0,0 +1,63 @@
+<template>
+  <div id="nav"></div>
+  <el-config-provider :locale="locale">
+    <router-view />
+  </el-config-provider>
+</template>
+<script>
+import { ElConfigProvider } from "element-plus";
+import zhCn from "element-plus/lib/locale/lang/zh-cn";
+export default {
+  name: "vol_app",
+  components: {
+    [ElConfigProvider.name]: ElConfigProvider, //娣诲姞缁勪欢
+  },
+  data() {
+    return {
+      locale: zhCn,
+    };
+  },
+};
+</script>
+<style lang="stylus">
+#app {
+  font-family: Avenir, Helvetica, Arial, sans-serif;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  height: 100%;
+  width: 100%;
+}
+
+.el-alert--error.is-light {
+  border: 1px solid #ffe0e0;
+}
+
+.el-alert--error.is-light {
+  color: #f74444 !important;
+}
+
+.el-alert--warning.is-light {
+  border: 1px solid #ffe6c1;
+}
+
+.el-alert--info.is-light {
+  border: 1px solid #e6e5e5;
+}
+
+.el-alert--info .el-alert__description {
+  color: #6b6b6b !important;
+}
+
+.el-alert--warning.is-light {
+  background-color: #fdf6ec;
+  color: #d68409 !important;
+}
+
+.el-alert--success.is-light {
+  border: 1px solid #cdf7b8;
+}
+
+.el-alert--success.is-light .el-alert__description {
+  color: #3baf02 !important;
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/css/common.less b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/css/common.less
new file mode 100644
index 0000000..ac7a179
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/css/common.less
@@ -0,0 +1,75 @@
+*{
+    box-sizing:border-box;
+    -moz-box-sizing:border-box; /* Firefox */
+    -webkit-box-sizing:border-box; /* Safari */
+}
+.el-pager li{
+    font-weight: 100;
+    margin-right: 9px;
+    border: 1px solid #eee;
+    border-radius: 3px;
+    min-width: 28px;
+}
+.el-pager li.active,.el-pager li:hover{
+    background: #ed4014;
+    color: white;
+}
+.el-pagination__editor.el-input .el-input__inner{
+    height: 23px;
+}
+
+
+.animated {
+    -webkit-animation-duration: 0.5s;
+    animation-duration: 0.5s;
+    -webkit-animation-fill-mode: both;
+    animation-fill-mode: both;
+  }
+  
+  @media (print), (prefers-reduced-motion) {
+    .animated {
+      -webkit-animation: unset !important;
+      animation: unset !important;
+      -webkit-transition: none !important;
+      transition: none !important;
+    }
+  }
+  
+  @-webkit-keyframes fadeInDown {
+    from {
+      opacity: 1;
+      -webkit-transform: translate3d(0, -100%, 0);
+      transform: translate3d(0, -100%, 0);
+    }
+  
+    to {
+      opacity: 1;
+      -webkit-transform: translate3d(0, 0, 0);
+      transform: translate3d(0, 0, 0);
+    }
+  }
+  
+  @keyframes fadeInDown {
+    from {
+      opacity: 0;
+      -webkit-transform: translate3d(0, -100%, 0);
+      transform: translate3d(0, -100%, 0);
+    }
+  
+    to {
+      opacity: 1;
+      -webkit-transform: translate3d(0, 0, 0);
+      transform: translate3d(0, 0, 0);
+    }
+  }
+  
+  .fadeInDown {
+    -webkit-animation-name: fadeInDown;
+    animation-name: fadeInDown;
+  }
+  .ivu-message{
+    z-index: 999999999 !important;
+  }
+  .ivu-form-item-content{
+    text-align: left;
+  }
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/element-icon/fonts/element-icons.ttf b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/element-icon/fonts/element-icons.ttf
new file mode 100644
index 0000000..91b74de
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/element-icon/fonts/element-icons.ttf
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/element-icon/fonts/element-icons.woff b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/element-icon/fonts/element-icons.woff
new file mode 100644
index 0000000..02b9a25
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/element-icon/fonts/element-icons.woff
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/error-img.png b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/error-img.png
new file mode 100644
index 0000000..d479f96
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/error-img.png
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/error.png b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/error.png
new file mode 100644
index 0000000..d479f96
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/error.png
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/log.png b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/log.png
new file mode 100644
index 0000000..8397330
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/log.png
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/logo.png b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/logo.png
new file mode 100644
index 0000000..165d86a
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/logo.png
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/wcs_logo.png b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/wcs_logo.png
new file mode 100644
index 0000000..bb7c9f9
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/wcs_logo.png
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/wms_d.png b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/wms_d.png
new file mode 100644
index 0000000..1e198e9
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/wms_d.png
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/wms_x.png b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/wms_x.png
new file mode 100644
index 0000000..a6a28ca
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/imgs/wms_x.png
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/logo.png b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/logo.png
new file mode 100644
index 0000000..f3d2503
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/assets/logo.png
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/DeviceLine.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/DeviceLine.vue
new file mode 100644
index 0000000..8824922
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/DeviceLine.vue
@@ -0,0 +1,84 @@
+<template>
+    <div class="Linebox" >
+        <div class="card">
+            <div class="card-header">
+                <div id="lines2">
+                    <div class="card-body">{{ device.deviceName }}<br />
+                        -{{ device.childDeviceCode }}-
+                    </div>
+                </div>
+            </div>
+            <div class="card-body">
+                <ul class="list-group lis">
+                    <li class="list-group-item list-group-item-dark">璇诲彇淇″彿</li>
+                    <li class="list-group-item list-group-item-secondary">浠诲姟鍙凤細{{
+                        device.data.command.taskNum }}</li>
+                    <li class="list-group-item list-group-item-secondary">鎵樼洏鍙凤細{{
+                        device.data.command.barcode }}</li>
+                    <li class="list-group-item list-group-item-secondary">缁堢偣鍦板潃锛歿{
+                        device.data.command.targetAddress }}</li>
+                    <li :class="getSignalClass(device.data.writeInteractiveSignal[6])">鎵爜绔欏彴鍏ュ簱璇锋眰</li>
+                    <li :class="getSignalClass(device.data.writeInteractiveSignal[4])">鍫嗗灈鏈哄嚭搴撶珯鍙拌姹�</li>
+                    <li :class="getSignalClass(device.data.writeInteractiveSignal[2])">鍫嗗灈鏈哄叆搴撶珯鍙拌姹�</li>
+                    <li :class="getSignalClass(device.data.writeInteractiveSignal[0])">绾夸綋鍑哄簱鍙h姹�</li>
+                </ul>
+                <ul class="list-group lis">
+                    <li class="list-group-item list-group-item-dark">鍐欏叆淇″彿</li>
+                    <li class="list-group-item list-group-item-secondary">浠诲姟鍙凤細{{
+                        device.data.commandWrite.taskNum }}</li>
+                    <li class="list-group-item list-group-item-secondary">鎵樼洏鍙凤細{{
+                        device.data.commandWrite.barcode }}</li>
+                    <li class="list-group-item list-group-item-secondary">缁堢偣鍦板潃锛歿{
+                        device.data.commandWrite.targetAddress }}</li>
+                    <li :class="getSignalClass(device.data.writeInteractiveSignal[7])">鎵爜绔欏彴鍏ュ簱璇锋眰</li>
+                    <li :class="getSignalClass(device.data.writeInteractiveSignal[5])">鍫嗗灈鏈哄嚭搴撶珯鍙拌姹�</li>
+                    <li :class="getSignalClass(device.data.writeInteractiveSignal[3])">鍫嗗灈鏈哄叆搴撶珯鍙拌姹�</li>
+                    <li :class="getSignalClass(device.data.writeInteractiveSignal[1])">绾夸綋鍑哄簱鍙h姹�</li>
+                </ul>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script setup>
+import { defineProps } from "vue";
+
+// 瀹氫箟缁勪欢灞炴��
+const props = defineProps({
+    device: {
+        type: Object,
+        required: true
+    }
+});
+
+// 鑾峰彇淇″彿绫诲悕
+const getSignalClass = (signal) => {
+    // console.log("馃殌 ~ getSignalClass ~ signal:", signal)
+    return signal !== true ? 'list-group-item list-group-item-danger' : 'list-group-item list-group-item-success';
+};
+</script>
+
+<style scoped>
+/* .Stackerbox{
+    width: 220px;
+    float: left;
+} */
+.Linebox{
+  width: 500px;
+  float: left;
+}
+.box1{
+  float: left;
+}
+.card-body{
+  text-align: center;
+  border-radius: 6% ;
+}
+.Stacker{
+  background-color: burlywood;
+}
+.lis{
+  float: left;
+  width: 233px;
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/DeviceLineVo.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/DeviceLineVo.vue
new file mode 100644
index 0000000..6419f9c
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/DeviceLineVo.vue
@@ -0,0 +1,67 @@
+<template>
+     <div class="Linebox">
+    <div class="card">
+      <div class="card-header">
+        <div id="lines2" >
+          <div class="card-body">{{device.deviceName}}<br/>
+            -{{ device.data.childDeviceCode }}-
+          </div>
+        </div>
+      </div>
+      <div class="card-body">
+        <ul class="list-group lis">
+          <li class="list-group-item list-group-item-dark">璇诲彇淇″彿</li>
+          <li class="list-group-item list-group-item-secondary">浠诲姟鍙凤細{{ device.data.commandAfter.conveyorLineTaskNum }}</li>
+          <li class="list-group-item list-group-item-secondary">鎵樼洏鍙凤細{{ device.data.commandAfter.conveyorLineBarcode }}</li>
+          <li class="list-group-item list-group-item-secondary">缁堢偣鍦板潃锛歿{ device.data.commandAfter.conveyorLineTargetAddress }}</li>
+          <li class="list-group-item list-group-item-secondary">鏄惁鏈夌洏锛歿{ device.data.commandAfter.hasPallet }}</li>
+          <li class="list-group-item list-group-item-secondary">鎶ヨ浠g爜锛歿{ device.data.commandAfter.conveyorLineAlarm }}</li>
+          <li class="list-group-item list-group-item-secondary">璇锋眰鍙嶉锛歿{ device.data.commandAfter.responState }}</li>
+          <li  :class="device.data.commandAfter.interactiveSignal !=0 ? 'list-group-item list-group-item-success'  :'list-group-item list-group-item-danger'">浜や簰淇″彿</li>
+        </ul> 
+      </div>
+    </div>
+</div>
+</template>
+<script setup>
+import { defineProps } from "vue";
+
+// 瀹氫箟缁勪欢灞炴��
+const props = defineProps({
+    device: {
+        type: Object,
+        required: true
+    }
+});
+
+// 鑾峰彇淇″彿绫诲悕
+const getSignalClass = (signal) => {
+    // console.log("馃殌 ~ getSignalClass ~ signal:", signal)
+    return signal !== true ? 'list-group-item list-group-item-danger' : 'list-group-item list-group-item-success';
+};
+</script>
+
+<style scoped>
+.Stackerbox {
+  width: 220px;
+  float: left;
+}
+.Linebox {
+  width: 300px;
+  float: left;
+}
+.box1 {
+  float: left;
+}
+.card-body {
+  text-align: center;
+  border-radius: 6%;
+}
+.Stacker {
+  background-color: burlywood;
+}
+.lis {
+  float: left;
+  width: 266px;
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/DeviceStacker.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/DeviceStacker.vue
new file mode 100644
index 0000000..e519d9c
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/DeviceStacker.vue
@@ -0,0 +1,57 @@
+<template>
+    <div class="Stackerbox">
+        <div class="card">
+          <div class="card-header">
+            <div>
+              <div class="card-body Stacker">
+                {{ Stacker.deviceName }}
+              </div>
+            </div>
+          </div>
+          <div class="card-body">
+            <ul class="list-group">
+              <li class="list-group-item list-group-item-secondary">
+                浠诲姟鍙凤細{{ Stacker.data.currentTaskNum || '鏆傛棤浠诲姟鍙�' }}
+              </li>
+              <li :class="getStatusClass(Stacker.data.stackerCraneAutoStatusDes)">
+                宸ヤ綔妯″紡锛歿{ Stacker.data.stackerCraneAutoStatusDes }}
+              </li>
+              <li :class="getStatusClass(Stacker.data.stackerCraneStatusDes)">
+                璁惧鐘舵�侊細{{ Stacker.data.stackerCraneStatusDes }}
+              </li>
+              <li :class="getStatusClass(Stacker.data.stackerCraneWorkStatusDes)">
+                宸ヤ綔鐘舵�侊細{{ Stacker.data.stackerCraneWorkStatusDes }}
+              </li>
+            </ul>
+          </div>
+        </div>
+      </div>
+</template>
+
+<script setup>
+import { defineProps } from "vue";
+
+// 瀹氫箟缁勪欢灞炴��
+const props = defineProps({
+    Stacker: {
+        type: Object,
+        required: true
+    }
+});
+
+// 鑾峰彇鐘舵�佺被鍚嶏紙浼樺寲鐘舵�佸垽鏂級
+const getStatusClass = (status) => {
+  if (status === '姝e父' || status === '鑷姩' || status === '寰呮満') {
+    return 'list-group-item list-group-item-success';
+  }
+  if (status === '鏁呴殰' || status === '鍋滄満') {
+    return 'list-group-item list-group-item-danger';
+  }
+  return 'list-group-item list-group-item-warning'; // 榛樿璀﹀憡鐘舵��
+};
+
+</script>
+
+<style lang="scss" scoped>
+
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/AsyncLoading.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/AsyncLoading.vue
new file mode 100644
index 0000000..1ccf5c7
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/AsyncLoading.vue
@@ -0,0 +1,10 @@
+<template>
+  <div style="text-align: center;font-size: 16px;padding: 20px;">姝e湪鍔犺浇璧勬簮...</div>
+</template>
+<script>
+export default {
+  created() {
+    //  console.log('loading')
+  }
+};
+</script>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/Audit.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/Audit.vue
new file mode 100644
index 0000000..431d6c5
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/Audit.vue
@@ -0,0 +1,59 @@
+<template>
+  <el-alert
+    :title="'褰撳墠閫変腑' + auditParam.rows + '鏉¤褰曞緟瀹℃牳..'"
+    type="success"
+    :closable="false"
+  >
+  </el-alert>
+  <div class="item">
+    <label>瀹℃牳缁撴灉锛�</label>
+    <el-radio-group v-model="auditParam.status">
+      <el-radio
+        v-for="item in auditParam.data"
+        :key="item.status"
+        :label="item.status"
+      >
+        <span>{{ item.text }}</span>
+      </el-radio>
+    </el-radio-group>
+  </div>
+  <div class="item">
+    <label style="margin-right: 13px;">澶�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 娉細</label>
+    <el-input
+      v-model="auditParam.reason"
+      type="textarea"
+      style="margin-right: 13px;"
+      :autosize="{ minRows: 4, maxRows: 10 }"
+      placeholder="瀹℃牳澶囨敞..."
+    ></el-input>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    auditParam: {
+      type: Object,
+      default: () => {
+        return {
+          auditParam: {
+            rows: 0,
+            model: false,
+            status: -1,
+            reason: "",
+            data: [], //[{ text: "閫氳繃", status: 1 }, { text: "鎷掔粷", status: 2 }]
+          },
+        };
+      },
+    },
+  },
+};
+</script>
+<style lang="less" scoped>
+.item{
+  margin-top: 20px;
+  display: flex;
+  > label{
+    width: 86px;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/Empty.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/Empty.vue
new file mode 100644
index 0000000..e5e6a79
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/Empty.vue
@@ -0,0 +1,3 @@
+<template>
+  <div></div>
+</template>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ErrorMsg.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ErrorMsg.vue
new file mode 100644
index 0000000..3885ed5
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ErrorMsg.vue
@@ -0,0 +1,3 @@
+<template>
+    <div id="test"></div>
+</template>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/Icons.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/Icons.vue
new file mode 100644
index 0000000..afd4250
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/Icons.vue
@@ -0,0 +1,345 @@
+<template>
+  <div data-v-394040b0 class="icons">
+    <div
+      @click="select(index)"
+      v-for="(item, index) in icons"
+      :key="index"
+      class="icons-item"
+    >
+      <i
+        :class="[item, selectIndex == index ? 'active' : '']"
+        style="font-size: 32px"
+      ></i>
+      <p>{{ item }}</p>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    onSelect: {
+      type: Function,
+      default: () => {
+        return "";
+      },
+    },
+  },
+  methods: {
+    select(index) {
+      this.selectIndex = index;
+      this.onSelect(index < 0 ? "" : this.icons[index]);
+    },
+  },
+  data() {
+    return {
+      selectIndex: -1,
+      icons: [
+        //ivu-icon ivu-icon-ios-add
+        "el-icon-platform-eleme",
+        "el-icon-eleme",
+        "el-icon-delete-solid",
+        "el-icon-delete",
+        "el-icon-s-tools",
+        "el-icon-setting",
+        "el-icon-user-solid",
+        "el-icon-user",
+        "el-icon-phone",
+        "el-icon-phone-outline",
+        "el-icon-more",
+        "el-icon-more-outline",
+        "el-icon-star-on",
+        "el-icon-star-off",
+        "el-icon-s-goods",
+        "el-icon-goods",
+        "el-icon-warning",
+        "el-icon-warning-outline",
+        "el-icon-question",
+        "el-icon-info",
+        "el-icon-remove",
+        "el-icon-circle-plus",
+        "el-icon-success",
+        "el-icon-error",
+        "el-icon-zoom-in",
+        "el-icon-zoom-out",
+        "el-icon-remove-outline",
+        "el-icon-circle-plus-outline",
+        "el-icon-circle-check",
+        "el-icon-circle-close",
+        "el-icon-s-help",
+        "el-icon-help",
+        "el-icon-minus",
+        "el-icon-plus",
+        "el-icon-check",
+        "el-icon-close",
+        "el-icon-picture",
+        "el-icon-picture-outline",
+        "el-icon-picture-outline-round",
+        "el-icon-upload",
+        "el-icon-upload2",
+        "el-icon-download",
+        "el-icon-camera-solid",
+        "el-icon-camera",
+        "el-icon-video-camera-solid",
+        "el-icon-video-camera",
+        "el-icon-message-solid",
+        "el-icon-bell",
+        "el-icon-s-cooperation",
+        "el-icon-s-order",
+        "el-icon-s-platform",
+        "el-icon-s-fold",
+        "el-icon-s-unfold",
+        "el-icon-s-operation",
+        "el-icon-s-promotion",
+        "el-icon-s-home",
+        "el-icon-s-release",
+        "el-icon-s-ticket",
+        "el-icon-s-management",
+        "el-icon-s-open",
+        "el-icon-s-shop",
+        "el-icon-s-marketing",
+        "el-icon-s-flag",
+        "el-icon-s-comment",
+        "el-icon-s-finance",
+        "el-icon-s-claim",
+        "el-icon-s-custom",
+        "el-icon-s-opportunity",
+        "el-icon-s-data",
+        "el-icon-s-check",
+        "el-icon-s-grid",
+        "el-icon-menu",
+        "el-icon-share",
+        "el-icon-d-caret",
+        "el-icon-caret-left",
+        "el-icon-caret-right",
+        "el-icon-caret-bottom",
+        "el-icon-caret-top",
+        "el-icon-bottom-left",
+        "el-icon-bottom-right",
+        "el-icon-back",
+        "el-icon-right",
+        "el-icon-bottom",
+        "el-icon-top",
+        "el-icon-top-left",
+        "el-icon-top-right",
+        "el-icon-arrow-left",
+        "el-icon-arrow-right",
+        "el-icon-arrow-down",
+        "el-icon-arrow-up",
+        "el-icon-d-arrow-left",
+        "el-icon-d-arrow-right",
+        "el-icon-video-pause",
+        "el-icon-video-play",
+        "el-icon-refresh",
+        "el-icon-refresh-right",
+        "el-icon-refresh-left",
+        "el-icon-finished",
+        "el-icon-sort",
+        "el-icon-sort-up",
+        "el-icon-sort-down",
+        "el-icon-rank",
+        "el-icon-loading",
+        "el-icon-view",
+        "el-icon-c-scale-to-original",
+        "el-icon-date",
+        "el-icon-edit",
+        "el-icon-edit-outline",
+        "el-icon-folder",
+        "el-icon-folder-opened",
+        "el-icon-folder-add",
+        "el-icon-folder-remove",
+        "el-icon-folder-delete",
+        "el-icon-folder-checked",
+        "el-icon-tickets",
+        "el-icon-document-remove",
+        "el-icon-document-delete",
+        "el-icon-document-copy",
+        "el-icon-document-checked",
+        "el-icon-document",
+        "el-icon-document-add",
+        "el-icon-printer",
+        "el-icon-paperclip",
+        "el-icon-takeaway-box",
+        "el-icon-search",
+        "el-icon-monitor",
+        "el-icon-attract",
+        "el-icon-mobile",
+        "el-icon-scissors",
+        "el-icon-umbrella",
+        "el-icon-headset",
+        "el-icon-brush",
+        "el-icon-mouse",
+        "el-icon-coordinate",
+        "el-icon-magic-stick",
+        "el-icon-reading",
+        "el-icon-data-line",
+        "el-icon-data-board",
+        "el-icon-pie-chart",
+        "el-icon-data-analysis",
+        "el-icon-collection-tag",
+        "el-icon-film",
+        "el-icon-suitcase",
+        "el-icon-suitcase-1",
+        "el-icon-receiving",
+        "el-icon-collection",
+        "el-icon-files",
+        "el-icon-notebook-1",
+        "el-icon-notebook-2",
+        "el-icon-toilet-paper",
+        "el-icon-office-building",
+        "el-icon-school",
+        "el-icon-table-lamp",
+        "el-icon-house",
+        "el-icon-no-smoking",
+        "el-icon-smoking",
+        "el-icon-shopping-cart-full",
+        "el-icon-shopping-cart-1",
+        "el-icon-shopping-cart-2",
+        "el-icon-shopping-bag-1",
+        "el-icon-shopping-bag-2",
+        "el-icon-sold-out",
+        "el-icon-sell",
+        "el-icon-present",
+        "el-icon-box",
+        "el-icon-bank-card",
+        "el-icon-money",
+        "el-icon-coin",
+        "el-icon-wallet",
+        "el-icon-discount",
+        "el-icon-price-tag",
+        "el-icon-news",
+        "el-icon-guide",
+        "el-icon-male",
+        "el-icon-female",
+        "el-icon-thumb",
+        "el-icon-cpu",
+        "el-icon-link",
+        "el-icon-connection",
+        "el-icon-open",
+        "el-icon-turn-off",
+        "el-icon-set-up",
+        "el-icon-chat-round",
+        "el-icon-chat-line-round",
+        "el-icon-chat-square",
+        "el-icon-chat-dot-round",
+        "el-icon-chat-dot-square",
+        "el-icon-chat-line-square",
+        "el-icon-message",
+        "el-icon-postcard",
+        "el-icon-position",
+        "el-icon-turn-off-microphone",
+        "el-icon-microphone",
+        "el-icon-close-notification",
+        "el-icon-bangzhu",
+        "el-icon-time",
+        "el-icon-odometer",
+        "el-icon-crop",
+        "el-icon-aim",
+        "el-icon-switch-button",
+        "el-icon-full-screen",
+        "el-icon-copy-document",
+        "el-icon-mic",
+        "el-icon-stopwatch",
+        "el-icon-medal-1",
+        "el-icon-medal",
+        "el-icon-trophy",
+        "el-icon-trophy-1",
+        "el-icon-first-aid-kit",
+        "el-icon-discover",
+        "el-icon-place",
+        "el-icon-location",
+        "el-icon-location-outline",
+        "el-icon-location-information",
+        "el-icon-add-location",
+        "el-icon-delete-location",
+        "el-icon-map-location",
+        "el-icon-alarm-clock",
+        "el-icon-timer",
+        "el-icon-watch-1",
+        "el-icon-watch",
+        "el-icon-lock",
+        "el-icon-unlock",
+        "el-icon-key",
+        "el-icon-service",
+        "el-icon-mobile-phone",
+        "el-icon-bicycle",
+        "el-icon-truck",
+        "el-icon-ship",
+        "el-icon-basketball",
+        "el-icon-football",
+        "el-icon-soccer",
+        "el-icon-baseball",
+        "el-icon-wind-power",
+        "el-icon-light-rain",
+        "el-icon-lightning",
+        "el-icon-heavy-rain",
+        "el-icon-sunrise",
+        "el-icon-sunrise-1",
+        "el-icon-sunset",
+        "el-icon-sunny",
+        "el-icon-cloudy",
+        "el-icon-partly-cloudy",
+        "el-icon-cloudy-and-sunny",
+        "el-icon-moon",
+        "el-icon-moon-night",
+        "el-icon-dish",
+        "el-icon-dish-1",
+        "el-icon-food",
+        "el-icon-chicken",
+        "el-icon-fork-spoon",
+        "el-icon-knife-fork",
+        "el-icon-burger",
+        "el-icon-tableware",
+        "el-icon-sugar",
+        "el-icon-dessert",
+        "el-icon-ice-cream",
+        "el-icon-hot-water",
+        "el-icon-water-cup",
+        "el-icon-coffee-cup",
+        "el-icon-cold-drink",
+        "el-icon-goblet",
+        "el-icon-goblet-full",
+        "el-icon-goblet-square",
+        "el-icon-goblet-square-full",
+        "el-icon-refrigerator",
+        "el-icon-grape",
+        "el-icon-watermelon",
+        "el-icon-cherry",
+        "el-icon-apple",
+        "el-icon-pear",
+        "el-icon-orange",
+        "el-icon-coffee",
+        "el-icon-ice-tea",
+        "el-icon-ice-drink",
+        "el-icon-milk-tea",
+        "el-icon-potato-strips",
+        "el-icon-lollipop",
+        "el-icon-ice-cream-square",
+        "el-icon-ice-cream-round",
+      ],
+    };
+  },
+};
+</script>
+
+
+<style lang="less" scoped>
+.icons-item {
+  float: left;
+  margin: 6px 6px 6px 0;
+  width: 115px;
+  text-align: center;
+  list-style: none;
+  cursor: pointer;
+  height: 100px;
+  color: #5c6b77;
+  transition: all 0.2s ease;
+  position: relative;
+  padding-top: 10px;
+}
+.active {
+  border: 1px solid;
+  background: #f44336;
+  color: white;
+  font-size: 32px;
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/QuickSearch.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/QuickSearch.vue
new file mode 100644
index 0000000..185cbf2
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/QuickSearch.vue
@@ -0,0 +1,152 @@
+<template>
+  <div>
+    <el-select
+      style="width: 150px"
+      v-if="['select', 'selectList'].indexOf(singleSearch.type) != -1"
+      v-model="searchFormFields[singleSearch.field]"
+      :filterable="
+        singleSearch.filter || singleSearch.data.length > 10 ? true : false
+      "
+      :placeholder="'璇烽�夋嫨' + singleSearch.title"
+      clearable
+    >
+      <el-option
+        v-for="item in singleSearch.data"
+        :key="item.key"
+        :label="item.value"
+        :value="item.key"
+      >
+      </el-option>
+    </el-select>
+    <div
+      class="date-range"
+      v-else-if="['date', 'datetime'].indexOf(singleSearch.type) != -1"
+    >
+      <el-date-picker
+        style="width: 210px"
+        :clearable="false"
+        unlink-panels
+        v-model="searchFormFields[singleSearch.field]"
+        type="daterange"
+        :value-format="getDateFormat(singleSearch)"
+        :placeholder="singleSearch.title"
+      >
+      </el-date-picker>
+      <i
+        class="el-icon-circle-close"
+        @click="dateRangeClear(singleSearch.field)"
+      ></i>
+    </div>
+    <el-cascader
+      style="width: 210px"
+      clearable
+      v-model="searchFormFields[singleSearch.field]"
+      v-else-if="singleSearch.type == 'cascader'"
+      :options="singleSearch.data"
+      :props="{ checkStrictly: true }"
+    >
+    </el-cascader>
+    <el-input
+      clearable
+      v-else
+      style="width: 150px"
+      size="default"
+      v-model="searchFormFields[singleSearch.field]"
+      :placeholder="singleSearch.title"
+      @keypress="tiggerPress"
+    />
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    singleSearch: {
+      type: Object,
+      default: {},
+    },
+    searchFormFields: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
+    tiggerPress: {
+      type: Function,
+      default: () => {},
+    },
+  },
+  methods: {
+    compareDate(date1, date2) {
+      if (!date2) {
+        return true;
+      }
+      return (
+        date1.valueOf() <
+        (typeof date2 == "number" ? date2 : new Date(date2).valueOf())
+      );
+    },
+    getDateFormat(item) {
+      //瑙乭ttps://day.js.org/docs/zh-CN/display/format
+      return item.type == "date" ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm:ss";
+    },
+    getDateOptions(date, item) {
+      if ((!item.min && !item.max) || !date) {
+        return false;
+      }
+      if (item.min && item.min.indexOf(" ") == -1) {
+        //涓嶈缃椂鍒嗙锛屽悗闈細鑷姩鍔犱笂 08:00
+        item.min = item.min + " 00:00:000";
+      }
+      return (
+        this.compareDate(date, item.min) || !this.compareDate(date, item.max)
+      );
+    },
+    dateRangeClear(field) {
+      this.searchFormFields[field]=[undefined,undefined];
+    },
+  },
+  created() {
+    this.singleSearch.dateType = this.singleSearch.type + "range";
+    if (
+      this.singleSearch.type == "date" ||
+      this.singleSearch.type == "datetime"
+    ) {
+      var _dateVal = this.searchFormFields[this.singleSearch.field];
+      if (
+        typeof this.singleSearch.range == "boolean" &&
+        !this.singleSearch.range
+      ) {
+        this.searchFormFields[this.singleSearch.field] = "";
+        this.singleSearch.dateType = this.singleSearch.type;
+        return this.singleSearch.dateType;
+      } else if (!(_dateVal instanceof Array)) {
+        this.searchFormFields[this.singleSearch.field] = ["", ""];
+      } else if (_dateVal.length != 2) {
+        _dateVal.splice(0);
+        _dateVal.push(...["", ""]);
+      }
+    }
+  },
+};
+</script>
+<style lang="less" scoped>
+.date-range{
+  position: relative;
+  > i{
+    display: none;
+    height: 27px;
+    line-height: 27px;
+    right: 1px;
+    top: 3px;
+    font-size: 13px;
+    color: #b4adad;
+    position: absolute;
+    padding: 0 6px 0 3px;
+    background: #ffff;
+    cursor: pointer;
+  }
+}
+.date-range:hover > i{
+  display: inline-block;
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/RouterLoading.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/RouterLoading.vue
new file mode 100644
index 0000000..134a454
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/RouterLoading.vue
@@ -0,0 +1,105 @@
+<template>
+  <div class="router-loading" style="background: #eeeeee5c;">
+    <div class="spanner">
+      <span></span>
+      <span></span>
+      <span></span>
+      <span></span>
+      <span></span>
+      <span></span>
+      <span></span>
+      <span></span>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  }
+};
+</script>
+<style scoped>
+.router-loading {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  font-size: 100px;
+  text-align: center;
+  padding-top: 200px;
+  color: #808080;
+  z-index: 9999;
+}
+.spanner {
+  width: 100px;
+  height: 100px;
+  position: relative;
+  margin: 0 auto;
+}
+.router-loading span {
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  border-radius: 50%;
+  background: #66b1ff;
+  position: absolute;
+  animation: r_load 1.04s ease infinite;
+}
+@keyframes r_load {
+  0% {
+    transform: scale(1.2);
+    opacity: 1;
+  }
+  100% {
+    transform: scale(0.3);
+    opacity: 0.5;
+  }
+}
+.router-loading span:nth-child(1) {
+  left: 0;
+  top: 50%;
+  margin-top: -10px;
+  animation-delay: 0.13s;
+}
+.router-loading span:nth-child(2) {
+  left: 14px;
+  top: 14px;
+  animation-delay: 0.26s;
+}
+.router-loading span:nth-child(3) {
+  left: 50%;
+  top: 0;
+  margin-left: -10px;
+  animation-delay: 0.39s;
+}
+.router-loading span:nth-child(4) {
+  top: 14px;
+  right: 14px;
+  animation-delay: 0.52s;
+}
+.router-loading span:nth-child(5) {
+  right: 0;
+  top: 50%;
+  margin-top: -10px;
+  animation-delay: 0.65s;
+}
+.router-loading span:nth-child(6) {
+  right: 14px;
+  bottom: 14px;
+  animation-delay: 0.78s;
+}
+.router-loading span:nth-child(7) {
+  bottom: 0;
+  left: 50%;
+  margin-left: -10px;
+  animation-delay: 0.91s;
+}
+.router-loading span:nth-child(8) {
+  bottom: 14px;
+  left: 14px;
+  animation-delay: 1.04s;
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/UploadExcel.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/UploadExcel.vue
new file mode 100644
index 0000000..230fdad
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/UploadExcel.vue
@@ -0,0 +1,221 @@
+<template>
+  <div class="upload-container">
+    <a :href="template.url" ref="template"></a>
+    <div class="button-group">
+      <el-upload
+        style="float: left"
+        ref="uploadFile"
+        :max-size="maxSize"
+        :on-change="clearMsg"
+        :before-upload="beforeUpload"
+        :action="url"
+      >
+        <el-button size="small"
+          ><i class="el-icon-folder-opened"></i>閫夋嫨鏂囦欢</el-button
+        >
+      </el-upload>
+      <el-button
+        v-if="template.url"
+        style="margin-left: 10px"
+        type="primary"
+        size="small"
+        @click="dowloadTemplate"
+        :loading="loadingStatus"
+      >
+     <i class="el-icon-bottom"></i>
+        涓嬭浇妯℃澘</el-button
+      >
+      <el-button
+        type="success"
+        size="small"
+        @click="upload"
+        :loading="loadingStatus"
+      >
+          <i class="el-icon-top"></i>
+        涓婁紶鏂囦欢</el-button
+      >
+    </div>
+    <div class="alert">
+      <el-alert title="涓婁紶璇存槑" type="warning" :closable="false" show-icon
+        >鍙兘涓婁紶excel鏂囦欢,鏂囦欢澶у皬涓嶈秴杩噞{ maxSize }}M</el-alert
+      >
+    </div>
+
+    <div v-if="file">
+      <h3>鏂囦欢鍒楄〃</h3>
+      <div class="file-info">
+        <span>鏂囦欢鍚嶏細{{ file.name }}</span>
+        <span>澶у皬{{ (file.size / 1024).toFixed(2) }}KB</span>
+      </div>
+    </div>
+    <div v-show="message" class="v-r-message">
+      <h3 class="title">涓婁紶缁撴灉</h3>
+      <div class="text" :class="resultClass" v-html="message"></div>
+    </div>
+    <slot></slot>
+  </div>
+</template>
+<script>
+//鐩墠鍙敮鎸佸崟涓狤xcel涓婁紶锛屽叾浠栧姛鑳藉紑鍙戜腑...
+export default {
+  components: {},
+  props: {
+    url: {
+      type: String,
+      default: ''
+    },
+    template: {
+      //涓嬭浇妯℃澘閰嶇疆
+      type: Object,
+      default: () => {
+        return {
+          url: '', //妯℃澘涓嬭浇璺緞锛屽鏋滄病鏈夋ā鏉胯矾寰勶紝鍒欎笉鏄剧ず涓嬭浇妯℃澘鍔熻兘
+          fileName: '鏈畾涔夋枃浠跺悕' //涓嬭浇妯℃澘鐨勬枃浠跺悕
+        };
+      }
+    },
+    importExcelBefore: {
+      type: Function,
+      default: (file) => {
+        return true;
+      }
+    }
+  },
+  data() {
+    return {
+      maxSize: 100,
+      model: true,
+      file: null,
+      loadingStatus: false,
+      message: '',
+      resultClass: ''
+    };
+  },
+  methods: {
+    clearMsg() {
+      this.message = '';
+    },
+    reset() {
+      this.file = null;
+      this.message = '';
+      this.resultClass = '';
+    },
+    getFileType() {
+      let fileName =
+        this.file.name
+          .split('.')
+          .pop()
+          .toLocaleLowerCase() || '';
+      if (['numbers', 'csv', 'xls', 'xlsx'].indexOf(fileName) == -1) {
+        this.$Message.error('鍙兘閫夋嫨excel鏂囦欢');
+        return false;
+      }
+      return true;
+    },
+    beforeUpload(file) {
+      this.file = file;
+      if (!this.getFileType()) {
+        return false;
+      }
+      return false;
+    },
+    upload() {
+      let _url = this.url;
+      if (!_url) {
+        return this.$Message.error('娌℃湁閰嶇疆濂経rl');
+      }
+
+      if (!this.file) {
+        return this.$Message.error('璇烽�夋嫨鏂囦欢');
+      }
+      var formData = new FormData();
+      formData.append('fileInput', this.file);
+      if (!this.importExcelBefore(formData)) {
+        return;
+      }
+      this.loadingStatus = true;
+      this.http.post(_url, formData).then(
+        (x) => {
+          // this.$refs.uploadFile.clearFiles();
+          this.loadingStatus = false;
+          this.file = null;
+          if (x.status) {
+            this.$emit('importExcelAfter', x);
+          }
+
+          this.message = x.message;
+          this.resultClass = x.status ? 'v-r-success' : 'v-r-error';
+        },
+        (error) => {
+          this.loadingStatus = false;
+        }
+      );
+    },
+    dowloadTemplate() {
+      let url = this.template.url;
+      let xmlResquest = new XMLHttpRequest();
+      xmlResquest.open('GET', url, true);
+      xmlResquest.setRequestHeader('Content-type', 'application/json');
+      xmlResquest.setRequestHeader(
+        'Authorization',
+        this.$store.getters.getToken()
+      );
+      let fileName = this.template.fileName + '.xlsx';
+      let elink = this.$refs.template;
+      xmlResquest.responseType = 'blob';
+      let $_vue = this;
+      this.loadingStatus = true;
+      xmlResquest.onload = function(oEvent) {
+        $_vue.loadingStatus = false;
+        if (xmlResquest.response.type == 'application/json') {
+          return $_vue.message.error('鏈壘鍒颁笅杞芥枃浠�');
+        }
+        let content = xmlResquest.response;
+        elink.download = fileName;
+        let blob = new Blob([content]);
+        elink.href = URL.createObjectURL(blob);
+        elink.click();
+      };
+      xmlResquest.send();
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+.upload-container {
+  min-height: 270px !important;
+  display: inline-block;
+  width: 100%;
+  padding: 10px;
+  border: 1px dashed #989898;
+  min-height: 250px;
+  border-radius: 5px;
+  .alert {
+    margin-top: 12px;
+  }
+  .el-button-group > * {
+    display: flex;
+  }
+  h3 {
+    margin: 9px 0px;
+  }
+  .file-info > span {
+    margin-right: 20px;
+  }
+  .v-r-message {
+    margin-top: 10px;
+    .title {
+      margin-bottom: 2px;
+    }
+    > .text {
+      font-size: 13px;
+    }
+    .v-r-success {
+      color: #02b702;
+    }
+    .v-r-error {
+      color: #dc0909;
+    }
+  }
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/AuditHis.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/AuditHis.vue
new file mode 100644
index 0000000..d1fcb48
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/AuditHis.vue
@@ -0,0 +1,46 @@
+<template>
+  <vol-table
+    :tableData="tableData"
+    :columns="columns"
+    :height="411"
+    :pagination-hide="true"
+    :load-key="false"
+    :text-inline="false"
+    :ck="false"
+  ></vol-table>
+</template>
+<script>
+import VolTable from '@/components/basic/VolTable.vue';
+import {
+  defineComponent,
+  ref,
+  reactive,
+  toRefs,
+  getCurrentInstance
+} from 'vue';
+export default defineComponent({
+  components: {
+    VolTable
+  },
+  props: {
+    tableData: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    }
+  },
+  setup() {
+    const columns = reactive([
+      { title: '鑺傜偣', field: 'stepName' },
+      { title: '瀹℃壒浜�', field: 'auditor' },
+      { title: '瀹℃壒缁撴灉', field: 'auditStatus' },
+      { title: '瀹℃壒鏃堕棿', field: 'auditDate',width:150 },
+      { title: '澶囨敞', field: 'remark' }
+    ]);
+    return {
+        columns
+    }
+  }
+});
+</script>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGrid.less b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGrid.less
new file mode 100644
index 0000000..adc13c3
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGrid.less
@@ -0,0 +1,178 @@
+.view-container {
+  // padding: 15px;
+  background: white;
+  .grid-search {
+    padding-top: 15px;
+    //padding: 15px 15px 0 15px;
+  }
+  .grid-container,
+  .grid-body {
+    padding: 0 15px;
+  }
+  .view-header {
+    padding-left: 15px;
+    padding-right: 15px;
+  }
+  .fs-line {
+    height: 9px;
+    background: #f1f1f1;
+    margin-top: -10px;
+    margin-bottom: 10px;
+  }
+}
+.view-header {
+  height: 45px;
+  position: relative;
+  padding-bottom: 11px;
+  display: flex;
+  .search-line {
+    min-width: 150px;
+  }
+  .search-line > div {
+    margin-left: 5px;
+    margin-right: 10px;
+  }
+  .search-line > div > div {
+    width: 200px;
+    text-align: left;
+  }
+  .search-line > div:first-child {
+    flex: 1;
+  }
+  .search-line > div .ivu-select-dropdown {
+    max-height: 300px;
+  }
+  .btn-group {
+    white-space: nowrap;
+    button {
+      margin-left: 10px;
+      // padding: 5px 16px;
+    }
+  }
+  .btn-group .ivu-dropdown-item {
+    text-align: left !important;
+  }
+  .btn-group .ivu-dropdown-item:not(:last-child) {
+    border-bottom: 1px dotted #eee;
+  }
+  .desc-text {
+    margin-top: 5px;
+    font-weight: bold;
+    margin-bottom: 3px;
+    font-size: 14px;
+    color: #313131;
+    white-space: nowrap;
+    border-bottom: 2px solid #646565;
+    i {
+      font-size: 16px;
+      position: relative;
+      top: 1px;
+      margin-right: 2px;
+    }
+  }
+  .search-box {
+    background: #fefefe;
+    margin-top: 45px;
+    border: 1px solid #ececec;
+    position: absolute;
+    z-index: 999;
+    left: 0;
+    right: 0;
+    padding: 25px 40px;
+    padding-bottom: 0;
+    box-shadow: 0px 7px 18px -12px #bdc0bb;
+  }
+  .notice {
+    font-size: 13px;
+    color: #6b6b6b;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    position: relative;
+    top: 12px;
+    flex: 1;
+    left: 10px;
+    margin-right: 20px;
+  }
+}
+
+.table-info-cell-title {
+  background-color: #f5f5f5 !important;
+}
+.box-com {
+  > div.item {
+    // margin-bottom: 10px;
+    padding: 15px 17px 0 8px;
+    margin-bottom: 12px;
+    background: white;
+  }
+  > div.form-item {
+    padding: 19px 16px 0px 5px;
+    //box-shadow: 0 1px 7px rgb(199, 199, 199);
+  }
+  > div.table-item {
+    padding: 0 10px;
+    border-top: 1.5px solid #eaeaea;
+  }
+  .v-text {
+    line-height: 27px;
+  }
+  .form-text {
+    position: relative;
+    border-bottom: 1px solid #eee;
+    font-size: 14px;
+    margin-bottom: 14px;
+  }
+}
+
+.form-closex {
+  text-align: right;
+  padding-bottom: 24px;
+}
+.form-closex button {
+  margin-left: 10px;
+  padding: 4px 13px;
+}
+.toolbar {
+  padding: 3px 0px;
+  width: 100%;
+  display: flex;
+  .title {
+    line-height: 29px;
+    border-bottom: none;
+    font-size: 13px;
+    font-weight: bolder;
+    margin-bottom: 0;
+    color: #5d5c5c;
+    .icon {
+      color: #009688;
+      font-size: 18px;
+    }
+
+    i {
+      line-height: 29px;
+      border-bottom: none;
+      font-weight: bolder;
+      margin-bottom: 0;
+      color: #5d5c5c;
+      position: relative;
+      margin-top: -4px;
+      font-size: 14px;
+    }
+  }
+  .btns {
+    line-height: 28px;
+    flex: 1;
+    text-align: right;
+    button {
+      // border: none;
+      // margin-left:15px;
+      border: 0px;
+      padding: 0px 9px;
+      color: #292929;
+    }
+    button:hover{
+      color: #0089f6;
+    }
+  }
+}
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGrid.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGrid.vue
new file mode 100644
index 0000000..e4bbcd3
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGrid.vue
@@ -0,0 +1,806 @@
+<template>
+  <div class="layout-container">
+    <a :href="exportHref" ref="export"></a>
+    <!--寮�鍚噿鍔犺浇2020.12.06 -->
+    <vol-box
+      :on-model-close="closeCustomModel"
+      v-model="viewModel"
+      :height="520"
+      :width="500"
+      :padding="0"
+      :lazy="true"
+      title="璁剧疆"
+    >
+      <template #content>
+        <custom-column :view-columns="viewColumns"></custom-column>
+      </template>
+      <template #footer>
+        <div style="text-align: center">
+          <el-button type="default" size="small" @click="closeCustomModel"
+            ><i class="el-icon-close"></i>鍙栨秷</el-button
+          >
+          <el-button type="success" size="small" @click="initViewColumns(true)"
+            ><i class="el-icon-refresh"></i>閲嶇疆</el-button
+          >
+          <el-button type="primary" size="small" @click="saveColumnConfig"
+            ><i class="el-icon-check"></i>纭畾</el-button
+          >
+        </div>
+      </template>
+    </vol-box>
+    <ViewGridAudit @auditClick="saveAudit" :option="table" ref="audit">
+
+    </ViewGridAudit>
+    <!--寮�鍚噿鍔犺浇2020.12.06 -->
+    <!--瀹℃牳(寮傛鐐瑰嚮鎸夐挳鏃舵墠鍔犺浇寰呭畬)-->
+    <!-- <vol-box
+      v-model="auditParam.model"
+      :height="auditParam.height"
+      :width="750"
+      :lazy="true"
+      :padding="0"
+      title="瀹℃壒"
+    >
+      <template #content>
+        <el-tabs type="card">
+          <el-tab-pane label="褰撳墠瀹℃壒">
+            <div class="v-steps">
+              <div
+                :class="{ 'step-current': item.isCurrent }"
+                class="step-item"
+                v-for="(item, index) in workFlowSteps"
+                :key="index"
+              >
+                <div class="left-item">
+                  <div>瀹℃壒鏃堕棿</div>
+                  <div class="left-date">{{ item.auditDate || '寰呭鎵�' }}</div>
+                </div>
+                <div class="right-item">
+                  <div class="step-line"></div>
+                  <i class="step-circle"></i>
+                  <div class="step-title">
+                    {{ item.stepName }}
+                  </div>
+                  <div class="step-text">瀹℃壒浜猴細{{ item.auditor }}</div>
+                  <div class="step-text">
+                    鐘� 鎬侊細 {{ getAuditStatus(item.auditStatus) }}
+                  </div>
+                  <div class="step-text">澶� 娉細 {{ item.remark || '-' }}</div>
+                </div>
+              </div>
+              <div
+                :style="{
+                  'margin-top': workFlowSteps.length ? '20px' : '-17px'
+                }"
+                class="audit-content"
+                v-show="auditParam.showAction"
+              >
+                <div style="margin-bottom:10px;">
+                  瀹℃壒锛�
+                  <el-radio-group
+                    style="margin-left:15px"
+                    v-model="auditParam.value"
+                  >
+                    <el-radio
+                      v-for="item in auditParam.data"
+                      :key="item.value"
+                      :label="item.value"
+                    >
+                      <span>{{ item.text }}</span>
+                    </el-radio>
+                  </el-radio-group>
+                </div>
+
+                <el-input
+                  v-model="auditParam.reason"
+                  type="textarea"
+                  style="margin-right: 13px;"
+                  :autosize="{ minRows: 4, maxRows: 10 }"
+                  placeholder="璇疯緭鍏ュ娉�..."
+                ></el-input>
+              </div>
+            </div>
+          </el-tab-pane>
+          <el-tab-pane v-if="workFlowSteps.length" label="瀹℃壒璁板綍">
+            <audit-his :table-data="auditParam.auditHis"></audit-his>
+          </el-tab-pane>
+        </el-tabs>
+      </template>
+      <template #footer>
+        <div style="text-align: center;">
+          <el-button size="small" @click="auditParam.model = false"
+            ><i class="el-icon-close"></i>鍏抽棴</el-button
+          >
+          <el-button
+            type="primary"
+            v-show="auditParam.showAction"
+            size="small"
+            @click="saveAudit"
+            ><i class="el-icon-check"></i>瀹℃牳</el-button
+          >
+        </div>
+      </template>
+    </vol-box> -->
+
+    <!--瀵煎叆excel鍔熻兘-->
+    <!--2020.10.31娣诲姞瀵煎叆鍓嶇殑鏂规硶-->
+    <!--寮�鍚噿鍔犺浇2020.12.06 -->
+    <!-- 2022.01.08澧炲姞鏄庣粏琛ㄥ鍏ュ垽鏂� -->
+    <vol-box
+      v-if="upload.url"
+      v-model="upload.excel"
+      :height="350"
+      :width="600"
+      :lazy="true"
+      :title="(boxModel ? detailOptions.cnName : table.cnName) + '-瀵煎叆'"
+    >
+      <UploadExcel
+        ref="upload_excel"
+        @importExcelAfter="importExcelAfter"
+        :importExcelBefore="importExcelBefore"
+        :url="upload.url"
+        :template="upload.template"
+      ></UploadExcel>
+    </vol-box>
+    <!--澶撮儴鑷畾涔夌粍浠�-->
+    <component
+      :is="dynamicComponent.gridHeader"
+      ref="gridHeader"
+      @parentCall="parentCall"
+    ></component>
+    <!--涓荤晫闈㈡煡璇笌table琛ㄥ崟甯冨眬-->
+    <div class="view-container">
+      <!-- 2020.09.11澧炲姞鍥哄畾鏌ヨ琛ㄥ崟 -->
+      <!--鏌ヨ鏉′欢-->
+      <div class="grid-search">
+        <div
+          :class="[fiexdSearchForm ? 'fiexd-search-box' : 'search-box']"
+          v-show="searchBoxShow"
+        >
+          <!-- 2020.09.13澧炲姞formFileds鎷煎啓閿欒鍏煎澶勭悊 -->
+          <vol-form
+            ref="searchForm"
+            :load-key="false"
+            style="padding: 0 15px"
+            :label-width="labelWidth"
+            :formRules="searchFormOptions"
+            :formFields="searchFormFields"
+            :select2Count="select2Count"
+          >
+            <template #footer>
+              <div v-if="!fiexdSearchForm" class="form-closex">
+                <el-button size="small" type="primary" plain @click="search">
+                  <i class="el-icon-search" />鏌ヨ
+                </el-button>
+
+                <el-button
+                  size="small"
+                  type="success"
+                  plain
+                  @click="resetSearch"
+                >
+                  <i class="el-icon-refresh-right" />閲嶇疆
+                </el-button>
+                <el-button
+                  size="small"
+                  plain
+                  @click="searchBoxShow = !searchBoxShow"
+                >
+                  <i class="el-icon-switch-button" />鍏抽棴
+                </el-button>
+              </div>
+            </template>
+          </vol-form>
+          <div v-if="fiexdSearchForm" class="fs-line"></div>
+        </div>
+        <div class="view-header">
+          <div class="desc-text">
+            <i class="el-icon-s-grid" />
+            <span>{{ table.cnName }}</span>
+          </div>
+          <div class="notice">
+            <a class="text" :title="extend.text">{{ extend.text }}</a>
+          </div>
+          <!--蹇�熸煡璇㈠瓧娈�-->
+          <div class="search-line" v-if="!fiexdSearchForm">
+            <QuickSearch
+              v-if="singleSearch"
+              :singleSearch="singleSearch"
+              :searchFormFields="searchFormFields"
+              :tiggerPress="quickSearchKeyPress"
+            ></QuickSearch>
+          </div>
+          <!--鎿嶄綔鎸夐挳缁�-->
+          <!-- 2020.11.29澧炲姞鏌ヨ鐣岄潰hidden灞炴�� -->
+
+          <div class="btn-group">
+            <template
+              :key="bIndex"
+              v-for="(btn, bIndex) in buttons.slice(0, maxBtnLength)"
+            >
+              <el-dropdown size="small" v-if="btn.data" :split-button="false">
+                <el-button
+                  :color="btn.color"
+                  :dark="false"
+                  :type="btn.type"
+                  :plain="btn.plain"
+                >
+                  {{ btn.name }}<i class="el-icon-arrow-down el-icon--right"></i
+                ></el-button>
+                <template #dropdown>
+                  <el-dropdown-menu>
+                    <el-dropdown-item
+                      v-for="(item, index) in btn.data"
+                      :key="index"
+                    >
+                      <div @click="onClick(item.onClick)">
+                        <i :class="item.icon"></i>
+                        {{ item.name }}
+                      </div>
+                    </el-dropdown-item>
+                  </el-dropdown-menu>
+                </template>
+              </el-dropdown>
+              <el-button
+                v-else
+                :type="btn.type"
+                size="small"
+                :color="btn.color"
+                :dark="false"
+                :class="btn.class"
+                :plain="btn.plain"
+                v-show="!btn.hidden"
+                @click="onClick(btn.onClick)"
+              >
+                <i :class="btn.icon"></i> {{ btn.name }}
+              </el-button>
+            </template>
+            <!-- 璁剧疆鍒楁寜閽� -->
+            <el-button
+              type="default"
+              style="padding: 0px 10px"
+              size="small"
+              :plain="true"
+              v-if="showCustom"
+              @click="showCustomModel"
+            >
+              <i class="el-icon-s-grid"></i>
+            </el-button>
+            <el-dropdown
+              size="small"
+              @click="changeDropdown"
+              v-if="buttons.length > maxBtnLength"
+            >
+              <el-button type="primary" plain size="small">
+                鏇村<i class="el-icon-arrow-down el-icon--right"></i>
+              </el-button>
+              <template #dropdown>
+                <el-dropdown-menu>
+                  <el-dropdown-item
+                    @click="changeDropdown(item.name)"
+                    :name="item.name"
+                    v-show="!item.hidden"
+                    v-for="(item, dIndex) in buttons.slice(
+                      maxBtnLength,
+                      buttons.length
+                    )"
+                    :key="dIndex"
+                  >
+                    <i :class="item.icon"></i> {{ item.name }}</el-dropdown-item
+                  >
+                </el-dropdown-menu>
+              </template>
+            </el-dropdown>
+          </div>
+        </div>
+
+        <!-- 鍒嗗壊浣嶇疆 -->
+        <vol-box
+          v-if="boxInit"
+          v-model="boxModel"
+          :title="boxOptions.title"
+          :width="boxOptions.width"
+          :height="boxOptions.height"
+          :modal="boxOptions.modal"
+          :draggable="boxOptions.draggable"
+          :padding="0"
+          :on-model-close="onGridModelClose"
+          @fullscreen="fullscreen"
+        >
+          <!--鏄庣粏澶撮儴鑷畾涔夌粍浠�-->
+          <template #content>
+            <div class="box-com">
+              <component
+                :is="dynamicComponent.modelHeader"
+                ref="modelHeader"
+                @parentCall="parentCall"
+              ></component>
+              <!-- <div v-show="isBoxAudit" class="flow-step">
+                <div v-for="(item, index) in workFlowSteps" :key="index">
+                  {{ item.stepName }}
+                </div>
+              </div> -->
+              <div class="item form-item">
+                <vol-form
+                  ref="form"
+                  :editor="editor"
+                  :load-key="false"
+                  :label-width="boxOptions.labelWidth"
+                  :formRules="editFormOptions"
+                  :formFields="editFormFields"
+                  :select2Count="select2Count"
+                ></vol-form>
+              </div>
+              <!--鏄庣粏body鑷畾涔夌粍浠�-->
+              <component
+                :is="dynamicComponent.modelBody"
+                ref="modelBody"
+                @parentCall="parentCall"
+              ></component>
+              <div
+                v-show="hasDetail"
+                v-if="detail.columns && detail.columns.length > 0"
+                class="grid-detail table-item item"
+              >
+                <div class="toolbar">
+                  <div class="title form-text">
+                    <span>
+                      <i class="el-icon-menu" />
+                      {{ detail.cnName }}
+                    </span>
+                  </div>
+                  <!--鏄庣粏琛ㄦ牸鎸夐挳-->
+                  <div class="btns" v-show="!isBoxAudit">
+                    <el-button
+                      v-for="(btn, bIndex) in detailOptions.buttons"
+                      :key="bIndex"
+                      :plain="btn.plain"
+                      v-show="!(typeof btn.hidden == 'boolean' && btn.hidden)"
+                      @click="onClick(btn.onClick)"
+                      size="small"
+                      ><i :class="btn.icon"></i>{{ btn.name }}</el-button
+                    >
+                  </div>
+                </div>
+                <vol-table
+                  ref="detail"
+                  @loadBefore="loadInternalDetailTableBefore"
+                  @loadAfter="loadDetailTableAfter"
+                  @rowChange="detailRowOnChange"
+                  @rowClick="detailRowOnClick"
+                  :url="detailOptions.url"
+                  :load-key="false"
+                  :index="true"
+                  :tableData="detailOptions.data"
+                  :columns="detailOptions.columns"
+                  :pagination="detailOptions.pagination"
+                  :height="detailOptions.height"
+                  :single="detailOptions.single"
+                  :pagination-hide="false"
+                  :defaultLoadPage="detailOptions.load"
+                  :beginEdit="detailOptions.beginEdit"
+                  :endEditBefore="detailOptions.endEditBefore"
+                  :endEditAfter="detailOptions.endEditAfter"
+                  :summary="detailOptions.summary"
+                  :click-edit="detailOptions.clickEdit"
+                  :double-edit="detailOptions.doubleEdit"
+                  :column-index="detailOptions.columnIndex"
+                  :ck="detailOptions.ck"
+                  :text-inline="detailOptions.textInline"
+                  :select2Count="select2Count"
+                  :selectable="detailSelectable"
+                ></vol-table>
+              </div>
+              <!--鏄庣粏footer鑷畾涔夌粍浠�-->
+              <component
+                :is="dynamicComponent.modelFooter"
+                ref="modelFooter"
+                @parentCall="parentCall"
+              ></component>
+            </div>
+          </template>
+          <template #footer>
+            <div style="text-align: center;" v-show="isBoxAudit">
+              <el-button
+                size="small"
+                type="primary"
+                plain
+                @click="onGridModelClose(false)"
+              >
+                <i class="el-icon-close">鍏抽棴</i>
+              </el-button>
+              <el-button
+                size="small"
+                type="primary"
+                v-show="auditParam.showViewButton"
+                @click="auditParam.model = true"
+              >
+                <i class="el-icon-view">瀹℃壒</i>
+              </el-button>
+            </div>
+            <div v-show="!isBoxAudit">
+              <el-button
+                v-for="(btn, bIndex) in boxButtons"
+                :key="bIndex"
+                :type="btn.type"
+                size="small"
+                :plain="btn.plain"
+                v-show="!(typeof btn.hidden == 'boolean' && btn.hidden)"
+                :disabled="btn.hasOwnProperty('disabled') && !!btn.disabled"
+                @click="onClick(btn.onClick)"
+              >
+                <i :class="btn.icon"> {{ btn.name }}</i>
+              </el-button>
+              <el-button
+                size="small"
+                type="primary"
+                plain
+                @click="onGridModelClose(false)"
+              >
+                <i class="el-icon-close">鍏抽棴</i>
+              </el-button>
+            </div>
+          </template>
+        </vol-box>
+      </div>
+      <!--body鑷畾涔夌粍浠�-->
+      <div class="grid-body">
+        <component
+          :is="dynamicComponent.gridBody"
+          ref="gridBody"
+          @parentCall="parentCall"
+        ></component>
+      </div>
+
+      <!--table琛ㄦ牸-->
+      <div class="grid-container">
+        <!-- 2021.05.02澧炲姞鏍戝舰缁撴瀯 rowKey -->
+        <vol-table
+          ref="table"
+          :single="single"
+          :rowKey="rowKey"
+          :loadTreeChildren="loadTreeTableChildren"
+          @loadBefore="loadTableBefore"
+          @loadAfter="loadTableAfter"
+          @rowChange="rowOnChange"
+          @rowClick="rowOnClick"
+          @rowDbClick="rowOnDbClick"
+          :tableData="[]"
+          :linkView="linkData"
+          :columns="columns"
+          :pagination="pagination"
+          :height="height"
+          :max-height="tableMaxHeight"
+          :pagination-hide="false"
+          :url="url"
+          :load-key="false"
+          :defaultLoadPage="load"
+          :summary="summary"
+          :double-edit="doubleEdit"
+          :index="doubleEdit"
+          :beginEdit="tableBeginEdit"
+          :endEditBefore="tableEndEditBefore"
+          :click-edit="true"
+          :column-index="columnIndex"
+          :text-inline="textInline"
+          :ck="ck"
+          :select2Count="select2Count"
+          :selectable="selectable"
+        ></vol-table>
+      </div>
+    </div>
+
+    <!--footer鑷畾涔夌粍浠�-->
+    <component
+      :is="dynamicComponent.gridFooter"
+      ref="gridFooter"
+      @parentCall="parentCall"
+    ></component>
+  </div>
+</template>
+
+<script>
+const _const = {
+  EDIT: 'update',
+  ADD: 'Add',
+  VIEW: 'view',
+  PAGE: 'getPageData',
+  AUDIT: 'audit',
+  DEL: 'del',
+  EXPORT: 'Export', //瀵煎嚭鎿嶄綔杩斿洖鍔犲瘑鍚庣殑璺緞
+  DOWNLOAD: 'DownLoadFile', //瀵煎嚭鏂囦欢
+  DOWNLOADTEMPLATE: 'DownLoadTemplate', //涓嬭浇瀵煎叆妯℃澘
+  IMPORT: 'Import', //瀵煎叆(瀵煎叆琛ㄧ殑Excel鍔熻兘)
+  UPLOAD: 'Upload' //涓婁紶鏂囦欢
+};
+import Empty from '@/components/basic/Empty.vue';
+
+import VolTable from '@/components/basic/VolTable.vue';
+import VolForm from '@/components/basic/VolForm.vue';
+import {
+  defineAsyncComponent,
+  defineComponent,
+  ref,
+  shallowRef,
+  toRaw
+} from 'vue';
+var vueParam = {
+  components: {
+    'vol-form': VolForm,
+    'vol-table': VolTable,
+    VolBox: defineAsyncComponent(() => import('@/components/basic/VolBox.vue')),
+    QuickSearch: defineAsyncComponent(() =>
+      import('@/components/basic/QuickSearch.vue')
+    ),
+    Audit: defineAsyncComponent(() => import('@/components/basic/Audit.vue')),
+    UploadExcel: defineAsyncComponent(() =>
+      import('@/components/basic/UploadExcel.vue')
+    ),
+    'custom-column': defineAsyncComponent(() =>
+      import('./ViewGridCustomColumn.vue')
+    ),
+    'vol-header': defineAsyncComponent(() => import('./../VolHeader.vue')),
+     ViewGridAudit: defineAsyncComponent(() => import('./ViewGridAudit.vue'))
+  },
+  props: {},
+  setup(props) {
+    //2021.07.17璋冩暣鎵╁睍缁勪欢缁勪欢
+    const dynamicCom = {
+      gridHeader: Empty,
+      gridBody: Empty,
+      gridFooter: Empty,
+      modelHeader: Empty,
+      modelBody: Empty,
+      modelFooter: Empty
+    };
+    //鍚堝苟鎵╁睍缁勪欢
+    if (props.extend.components) {
+      for (const key in props.extend.components) {
+        if (props.extend.components[key]) {
+          dynamicCom[key] = toRaw(props.extend.components[key]);
+        }
+      }
+    }
+    const dynamicComponent = shallowRef(dynamicCom);
+    return { dynamicComponent };
+  },
+  data() {
+    return {
+      isBoxAudit: false,
+      formFieldsType: [],
+      workFlowSteps: [],
+      //鏍戝舰缁撴瀯鐨勪富閿瓧娈碉紝濡傛灉璁剧疆鍊奸粯璁や細寮�鍚爲褰able锛涙敞鎰弐owKey瀛楁鐨勫�煎繀椤绘槸鍞竴锛�2021.05.02锛�
+      rowKey: undefined,
+      fiexdSearchForm: false, //2020.09.011鏄惁鍥哄畾鏌ヨ琛ㄥ崟锛宼rue鏌ヨ琛ㄥ崟灏嗗浐瀹氭樉绀哄湪琛ㄥ崟鐨勬渶涓婇潰
+      _inited: false,
+      doubleEdit: false, //2021.03.19鏄惁寮�鍚煡璇㈢晫闈㈣〃鏍煎弻鍑荤紪杈�
+      single: false, //琛ㄦ槸鍚﹀崟閫�
+      const: _const, //澧炲垹鏀规煡瀵煎叆瀵煎嚭绛夊搴旂殑action
+      boxInit: false, //鏂板缓鎴栫紪杈戠殑寮瑰嚭妗嗗垵鍖栫姸鎬侊紝榛樿涓嶅仛鍒濆鍖栵紝鐐瑰嚮鏂板缓鎴栫紪杈戞墠鍒濆鍖栧脊鍑烘
+      searchBoxShow: false, //楂樼骇鏌ヨ(鐣岄潰鏌ヨ鍚庣殑涓嬫媺妗嗙偣鍑昏Е鍙�)
+      singleSearch: {}, //蹇�熸煡璇㈠瓧娈�
+      exportHref: '',
+      currentAction: _const.ADD, //褰撴柊寤烘垨缂栬緫鏃讹紝璁板綍褰撳墠鐨勭姸鎬�:濡傚綋鍓嶆搷浣滄槸鏂板缓
+      currentRow: {}, //褰撳墠缂栬緫鎴栨煡鐪嬫暟鎹殑琛�
+      closable: false,
+      boxModel: false, //寮瑰嚭鏂板缓銆佺紪杈戞
+      width: 700, //寮瑰嚭妗嗘煡鐪嬭〃鏁版嵁缁撴瀯
+      labelWidth: 100, //楂樼骇鏌ヨ鐨勬爣绛惧搴�
+      viewModel: false, //鏌ョ湅琛ㄧ粨鏋勭殑寮瑰嚭妗�
+      viewColumns: [], //鏌ョ湅琛ㄧ粨鏋勭殑鍒楁暟鎹�
+      viewColumnsClone: [],
+      showCustom: true, //鏄惁鏄剧ず鑷畾涔夐厤缃垪鎸夐挳2022.05.27
+      // viewData: [], //鏌ョ湅琛ㄧ粨鏋勪俊鎭�
+      maxBtnLength: 8, //鐣岄潰鎸夐挳鏈�澶氭樉绀虹殑涓暟锛岃秴杩囩殑鏁伴噺閮芥樉绀哄湪鏇村涓�
+      buttons: [], //鏌ヨ鐣岄潰鎸夐挳  濡傞渶瑕佸叾浠栨搷浣滄寜閽紝鍙湪琛ㄥ搴旂殑.js涓坊鍔�(濡�:Sys_User.js涓璪uttons娣诲姞鍏朵粬鎸夐挳)
+      splitButtons: [],
+      uploadfiled: [], //涓婁紶鏂囦欢鍥剧墖鐨勫瓧娈�
+      boxButtons: [], //寮瑰嚭妗嗘寜閽� 濡傞渶瑕佸叾浠栨搷浣滄寜閽紝鍙湪琛ㄥ搴旂殑.js涓坊鍔�
+      dicKeys: [], //褰撳墠鐣岄潰鎵�鏈夌殑涓嬫媺妗嗗瓧鍏哥紪鍙峰強鏁版嵁婧�
+      hasKeyField: [], //鏈夊瓧鍏告暟鎹簮鐨勫瓧娈�
+      keyValueType: { _dinit: false },
+      url: '', //鐣岄潰琛ㄦ煡璇㈢殑鏁版嵁婧愮殑url
+      hasDetail: false, //鏄惁鏈変粠琛�(鏄庣粏)琛ㄦ牸鏁版嵁
+      initActivated: false,
+      load: true, //鏄惁榛樿鍔犺浇琛ㄦ暟鎹�
+      activatedLoad: false, //椤甸潰瑙﹀彂actived鏃舵槸鍚﹀埛鏂伴〉闈㈡暟鎹�
+      summary: false, //鏌ヨ鐣岄潰table鏄惁鏄剧ず鍚堣
+      //闇�瑕佷粠杩滅▼缁戝畾鏁版嵁婧愮殑瀛楀吀缂栧彿,濡傛灉瀛楀吀鏁版嵁婧愮殑鏌ヨ缁撴灉杈冨锛岃鍦╫nInit涓皢瀛楀吀缂栧彿娣诲姞杩涙潵
+      //鍙鑷畾sql鏈夋晥
+      remoteKeys: [],
+      columnIndex: true, //2020.11.01鏄惁鏄剧ず琛屽彿
+      ck: true, //2020.11.01鏄惁鏄剧ずcheckbox
+      continueAdd: false, //2021.04.11鏂板缓鏃舵槸鍚﹀彲浠ヨ繛缁柊寤烘搷浣�
+      continueAddName: '淇濆瓨鍚庣户缁坊鍔�', //2021.04.11鎸夐挳鍚嶇О
+      // detailUrl: "",
+      detailOptions: {
+        //寮瑰嚭妗嗕粠琛�(鏄庣粏)瀵硅薄
+        //浠庤〃閰嶇疆
+        buttons: [], //寮瑰嚭妗嗕粠琛ㄨ〃鏍兼搷浣滄寜閽�,鐩墠鏈夊垹闄よ锛屾坊鍔犺锛屽埛鏂版搷浣滐紝濡傞渶瑕佸叾浠栨搷浣滄寜閽紝鍙湪琛ㄥ搴旂殑.js涓坊鍔�
+        cnName: '', //浠庤〃鍚嶇О
+        key: '', //浠庤〃涓婚敭鍚�
+        data: [], //鏁版嵁婧�
+        columns: [], //浠庤〃鍒椾俊鎭�
+        edit: true, //鏄庣粏鏄惁鍙互缂栬緫
+        single: false, //鏄庣粏琛ㄦ槸鍚﹀崟閫�
+        load: false, //
+        delKeys: [], //褰撶紪杈戞椂鍒犻櫎褰撳墠鏄庣粏鐨勮涓婚敭鍊�
+        url: '', //浠庤〃鍔犺浇鏁版嵁鐨剈rl
+        pagination: { total: 0, size: 100, sortName: '' }, //浠庤〃鍒嗛〉閰嶇疆鏁版嵁
+        height: 0, //榛樿浠庤〃楂樺害
+        textInline: true, //鏄庣粏琛ㄨ鍐呭鏄剧ず鍦ㄤ竴琛屼笂锛屽鏋滈渶瑕佹崲琛屾樉绀猴紝璇疯缃负false
+        doubleEdit: true, //浣跨敤鍙屽嚮缂栬緫
+        clickEdit: false, //鏄惁寮�鍚偣鍑诲崟鍏冩牸缂栬緫锛岀偣鍑诲叾浠栬鏃剁粨鏉熺紪杈�
+        currentReadonly: false, //褰撳墠鐢ㄦ埛娌℃湁缂栬緫鎴栨柊寤烘潈闄愭椂锛岃〃鍗曞彧璇�(鍙敤浜庡垽鏂敤鎴锋槸鍚︽湁缂栬緫鎴栨柊寤烘潈闄�)
+        //寮�鍚紪杈戞椂
+        beginEdit: (row, column, index) => {
+          return true;
+        },
+        //缁撴潫缂栬緫鍓�
+        endEditBefore: (row, column, index) => {
+          return true;
+        },
+        //缁撴潫缂栬緫鍚�
+        endEditAfter: (row, column, index) => {
+          return true;
+        },
+        columnIndex: false, //2020.11.01鏄庣粏鏄惁鏄剧ず琛屽彿
+        ck: true //2020.11.01鏄庣粏鏄惁鏄剧ずcheckbox
+      },
+      auditParam: {
+        //瀹℃牳瀵硅薄
+        rows: 0, //褰撳墠閫変腑瀹℃牳鐨勮鏁�
+        model: false, //瀹℃牳寮瑰嚭妗�
+        value: -1, //瀹℃牳缁撴灉
+        status: -1,
+        reason: '', //瀹℃牳鍘熷洜
+        height: 500,
+        showViewButton: true,
+        auditHis: [],
+        showAction: false, //鏄惁鏄剧ず瀹℃壒鎿嶄綔(褰撳墠鑺傜偣涓虹敤鎴峰鎵规椂鏄剧ず)
+        //瀹℃牳閫夐」(鍙嚜琛屽啀娣诲姞)
+        data: [
+          { text: '閫氳繃', value: 1 },
+          { text: '鎷掔粷', value: 2 },
+          { text: '椹冲洖', value: 3 }
+        ]
+      },
+      upload: {
+        //瀵煎叆涓婁紶excel瀵硅薄
+        excel: false, //瀵煎叆鐨勫脊鍑烘鏄惁鏄剧ず
+        url: '', //瀵煎叆鐨勮矾寰�,濡傛灉娌℃湁鍊硷紝鍒欎笉娓叉煋瀵煎叆鍔熻兘
+        template: {
+          //涓嬭浇妯℃澘瀵硅薄
+          url: '', //涓嬭浇妯℃澘璺緞
+          fileName: '' //妯℃澘涓嬭浇鐨勪腑鏂囧悕
+        },
+        init: false //鏄惁鏈夊鍏ユ潈闄愶紝鏈夋墠娓叉煋瀵煎叆缁勪欢
+      },
+      height: 0, //琛ㄩ珮搴�
+      tableHeight: 0, //鏌ヨ椤甸潰table鐨勯珮搴�
+      tableMaxHeight: 0, //鏌ヨ椤甸潰table鐨勬渶澶ч珮搴�
+      textInline: true, //table鍐呭瓒呭嚭鍚庢槸鍚︿笉鎹㈣2020.01.16
+      pagination: { total: 0, size: 30, sortName: '' }, //浠庡垎椤甸厤缃暟鎹�
+      boxOptions: {
+        title: '', //寮瑰嚭妗嗘樉绀虹殑鏍囬2022.08.01
+        saveClose: true,
+        labelWidth: 100,
+        height: 0,
+        width: 0,
+        summary: false, //寮瑰嚭妗嗘槑缁唗able鏄惁鏄剧ず鍚堣
+        draggable: false, //2022.09.12寮瑰嚭妗嗘嫋鍔ㄥ姛鑳�
+        modal: true //2022.09.12寮瑰嚭妗嗚儗鏅伄缃╁眰
+      }, //saveClose鏂板缓鎴栫紪杈戞垚鍔熷悗鏄惁鍏抽棴寮瑰嚭妗�//寮瑰嚭妗嗙殑鏍囩瀹藉害labelWidth
+      editor: {
+        uploadImgUrl: '', //涓婁紶璺緞
+        upload: null //涓婁紶鏂规硶
+      },
+      numberFields: [],
+      //2022.09.26澧炲姞鑷畾涔夊鍑烘枃浠跺悕
+      downloadFileName: null,
+      select2Count: 500 //瓒呭嚭500鏁伴噺鏄剧ずselect2缁勪欢
+    };
+  },
+  methods: {},
+  activated() {
+     this.initFlowQuery();
+    //2020.06.25澧炲姞activated鏂规硶
+    this.onActivated && this.onActivated();
+    if (!this._inited) {
+      this._inited = true;
+      return;
+    }
+    if (this.activatedLoad) {
+      this.refresh();
+    }
+  },
+  mounted() {
+    this.mounted();
+    // this.$refs.searchForm.forEach()
+  },
+  unmounted() {
+    this.destroyed();
+  },
+  created: function() {
+    //鍚堝苟鑷畾涔変笟鍔℃墿灞曟柟娉�
+    Object.assign(this, this.extend.methods);
+    //濡傛灉娌℃湁鎸囧畾鎺掑簭瀛楁锛屽垯鐢ㄤ富閿綔涓洪粯璁ゆ帓搴忓瓧娈�
+    this.pagination.sortName = this.table.sortName || this.table.key;
+    this.initBoxButtons(); //鍒濆鍖栧脊鍑烘涓庢槑缁嗚〃鏍兼寜閽�
+    this.initAuditColumn();
+    this.onInit(); //鍒濆鍖栧墠锛屽鏋滈渶瑕佸仛鍏朵粬澶勭悊鍦ㄦ墿灞曟柟娉曚腑瑕嗙洊姝ゆ柟娉�
+    this.getButtons();
+    //鍒濆鍖栬嚜瀹氫箟琛ㄦ牸鍒�
+    this.initViewColumns();
+    //鍒濆缂栬緫妗嗙瓑鏁版嵁
+    this.initBoxHeightWidth();
+    this.initDicKeys(); //鍒濆涓嬫鏁版嵁婧�
+    this.onInited(); //鍒濆鍖栧悗锛屽鏋滈渶瑕佸仛鍏朵粬澶勭悊鍦ㄦ墿灞曟柟娉曚腑瑕嗙洊姝ゆ柟娉�
+  },
+  beforeUpdate: function() {},
+  updated: function() {}
+};
+
+import props from './props.js';
+import methods from './methods.js';
+
+//鍚堝苟灞炴��
+vueParam.props = Object.assign(vueParam.props, props);
+//鍚堝苟鏂规硶
+vueParam.methods = Object.assign(
+  vueParam.methods,
+  methods,
+  props.extend.methods
+);
+export default defineComponent(vueParam);
+</script>
+<style lang="less" scoped>
+@import './ViewGrid.less';
+</style>
+<style lang="less" scoped>
+.btn-group ::v-deep(.ivu-select-dropdown) {
+  padding: 0px !important;
+  right: 3px;
+}
+
+.btn-group ::v-deep(.ivu-select-dropdown .ivu-dropdown-menu) {
+  min-width: 100px;
+  right: -2px;
+  position: absolute;
+  background: white;
+  width: 130px;
+  border-radius: 5px;
+  border: 1px solid #e7e5e5;
+}
+
+.vertical-center-modal ::v-deep(.srcoll-content) {
+  padding: 0;
+}
+
+.view-model-content {
+  background: #eee;
+}
+
+.grid-detail ::v-deep(.v-table .el-table__header th) {
+  height: 44px;
+}
+</style>
+<style lang="less" scoped>
+.grid-search {
+  position: relative;
+
+  .search-box {
+    background: #fefefe;
+    margin-top: 33px;
+    border: 1px solid #eae8e8;
+    position: absolute;
+    z-index: 999;
+    left: 15px;
+    right: 15px;
+    padding: 25px 20px;
+    padding-bottom: 0;
+    border-top: 0;
+    box-shadow: 0 7px 18px -12px #bdc0bb;
+  }
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGridAudit.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGridAudit.vue
new file mode 100644
index 0000000..24cddc7
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGridAudit.vue
@@ -0,0 +1,427 @@
+<template>
+  <vol-box :footer="false" v-model="model" :height="height" :width="width" :padding="0" :lazy="true" title="瀹℃牳">
+
+    <div class="audit-model-content" :style="{ height: height - 100 + 'px' }">
+      <el-descriptions class="desc-top" :column="3" size="default" :border="true">
+        <el-descriptions-item v-for="(item, index) in formData" :key="index">
+          <template #label>
+            <div class="cell-item">
+              {{ item.name }}
+            </div>
+          </template>
+          {{ item.value }}
+        </el-descriptions-item>
+      </el-descriptions>
+      <el-radio-group v-show="hasFlow" style="padding-left: 15px;" v-model="activeName" class="ml-4">
+        <el-radio label="audit" size="large">瀹℃牳</el-radio>
+        <el-radio label="log" size="large">瀹℃牳璁板綍</el-radio>
+      </el-radio-group>
+      <div v-show="activeName == 'audit' || !hasFlow" class="audit-content">
+        <div class="fx-left" v-if="hasFlow">
+          <div class="v-steps">
+            <div v-for="(item, index) in workFlowSteps" :key="index">
+              <div class="step-item" :class="{'step-item-ad':item.auditId||item.stepAttrType=='start'}" v-if="item.stepAttrType == 'start'">
+                <div class="left-item">
+                  <div>娴佺▼寮�濮�</div>
+                  <div class="left-date">{{ item.createDate }}</div>
+                </div>
+                <div class="right-item">
+                  <div class="step-line"></div>
+                  <i class="step-circle"></i>
+                  <div class="step-title">
+                    {{ item.stepName }}
+                  </div>
+                  <div class="step-text">鍙戣捣浜猴細{{ item.creator }}</div>
+                </div>
+              </div>
+              <div class="step-item" v-else-if="item.stepAttrType == 'end'">
+                <div class="left-item">
+                  <div>娴佺▼缁撴潫</div>
+                </div>
+                <div class="right-item">
+                  <div class="step-line"></div>
+                  <i class="step-circle"></i>
+                  <div class="step-title">
+                    {{ item.stepName }}
+                  </div>
+                </div>
+              </div>
+              <div v-else :class="{ 'step-current': item.isCurrent }" class="step-item">
+                <div class="left-item">
+                  <div>瀹℃壒鏃堕棿</div>
+                  <div class="left-date">{{ item.auditDate || '寰呭鎵�' }}</div>
+                </div>
+                <div class="right-item">
+                  <div class="step-line"></div>
+                  <i class="step-circle"></i>
+                  <div class="step-title">
+                    {{ item.stepName }}
+                  </div>
+                  <div class="step-text">瀹℃壒浜猴細{{ item.auditor }}</div>
+                  <div class="step-text">
+                    鐘� 鎬侊細 {{ getAuditStatus(item.auditStatus) }}
+                  </div>
+                  <div class="step-text">澶� 娉細 {{ item.remark || '-' }}</div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="fx-right" :style="{ width: !hasFlow ? '100%' : '400px' }" v-if="isCurrentUser || !hasFlow">
+
+          <div v-if="!hasFlow">
+            <el-alert :title="'褰撳墠閫変腑銆�' + rowLen + '銆戞潯璁板綍寰呭鏍�..'" type="success" :closable="false" />
+          </div>
+          <div class="rd">
+            <span>瀹℃壒锛�</span>
+            <el-radio-group style="margin-left:15px" v-model="auditParam.value">
+              <el-radio v-for="item in auditParam.data" :key="item.value" :label="item.value">
+                <span>{{ item.text }}</span>
+              </el-radio>
+            </el-radio-group>
+          </div>
+          <el-input style="padding-top: 10px;" v-model="auditParam.reason" type="textarea"
+            :autosize="{ minRows: 4, maxRows: 10 }" placeholder="璇疯緭鍏ュ娉�..."></el-input>
+          <div class="btn">
+            <el-button type="primary" @click="auditClick" icon="Check">瀹℃壒</el-button>
+          </div>
+        </div>
+      </div>
+      <div v-show="activeName == 'log'">
+        <vol-table :tableData="tableData" :columns="columns" :height="height - 250" :pagination-hide="true"
+          :load-key="false" :text-inline="false" :ck="false"></vol-table>
+      </div>
+    </div>
+  </vol-box>
+</template>
+<script>
+import VolTable from '@/components/basic/VolTable.vue';
+import VolBox from '@/components/basic/VolBox.vue';
+import http from '@/../src/api/http.js';
+import { defineComponent, ref, reactive, getCurrentInstance } from 'vue';
+export default defineComponent({
+  components: {
+    VolTable,
+    VolBox
+  },
+  props: {
+    option: { //鐢熸垚vue鏂囦欢鐨則able鍙傛暟
+      type: Object,
+      default: {
+        key: '',
+        cnName: '',
+        name: '',
+        url: ""
+      }
+    }
+  },
+  setup(props, { emit }) {
+    const height = ref(500);
+    const width = ref(820);
+    const model = ref(false)
+    const workFlowSteps = reactive([]);
+
+    const hasFlow = ref(false)
+    const formData = reactive([]);
+
+    const auditParam = reactive({
+      //瀹℃牳瀵硅薄
+      rows: 0, //褰撳墠閫変腑瀹℃牳鐨勮鏁�
+      model: false, //瀹℃牳寮瑰嚭妗�
+      value: -1, //瀹℃牳缁撴灉
+      reason: '', //瀹℃牳鍘熷洜
+      //瀹℃牳閫夐」(main.js閲岄潰鍙互娣诲姞鍏朵粬閫夐」)
+      data: []
+    })
+    const { proxy } = getCurrentInstance();
+    auditParam.data = proxy.$global.audit.data;
+    const tableData = reactive([]);
+    const columns = reactive([
+      { title: '鑺傜偣', field: 'stepName', width: 100 },
+      { title: '瀹℃壒浜�', field: 'auditor', width: 80 },
+      { title: '瀹℃壒缁撴灉', field: 'auditStatus', width: 70, bind: { data: [] } },
+      { title: '瀹℃壒鏃堕棿', field: 'auditDate', width: 145 },
+      { title: '澶囨敞', field: 'remark', width: 120 }
+    ]);
+
+    const isCurrentUser = ref(null);
+    const activeName = ref('audit')
+
+    const auditDic = reactive([]);
+    const getAuditStatus = (key) => {
+      return (auditDic.find(x => { return x.key === key + '' }) || { value: key }).value;
+    }
+    const rowLen = ref(0)
+    let currentRows = []
+    const getAuditInfo = (option) => {
+      const table = option.table; //props.option.url.replaceAll('/', '');
+      const url = `api/Sys_WorkFlow/getSteps?tableName=${table}`
+      //  let ids = currentRows.map(x => { return x[props.option.key] });
+      let ids = currentRows.map(x => { return x[option.key] });
+      // ['498043c1-fbd0-4a35-a870-523823912a9b']
+      http.post(url, ids, true).then(result => {
+        if (!result.status) {
+          proxy.$message.error(result.message);
+          return;
+        }
+
+        hasFlow.value = !!(result.list || []).length;
+        if (!hasFlow.value) {
+
+          let auditStatus = Object.keys(currentRows[0]).find(x => { return x.toLowerCase() === 'auditstatus' });
+
+          let checkStatus = currentRows.every((x) => {
+            return proxy.$global.audit.status.some(c => { return c === x[auditStatus] || !x[auditStatus] })
+          });
+          if (!checkStatus) {
+            proxy.$message.error('鍙兘閫夋嫨寰呭鎵规垨瀹℃牳涓殑鏁版嵁');
+            return;
+          }
+          rowLen.value = currentRows.length;
+          model.value = true;
+          width.value = 430;
+          height.value = 330;
+          isCurrentUser.value = true;
+          //娌℃湁瀹℃壒娴佺▼鐨勬暟鎹彧鏄剧ず
+          return;
+        }
+        model.value = true;
+        height.value = document.body.clientHeight * 0.95;
+        width.value = 820;
+        if (!auditDic.length) {
+          auditDic.push(...(result.auditDic || []))
+          columns.forEach(item => {
+            if (item.field == 'auditStatus') {
+              item.bind.data = auditDic;
+            }
+          })
+        }
+        isCurrentUser.value = result.list.some(x => { return x.isCurrentUser })
+        workFlowSteps.length = 0;
+        workFlowSteps.push(...result.list);
+        tableData.length = 0;
+        tableData.push(...result.log)
+        formData.length = 0;
+        formData.push(...(result.form || []))
+      })
+    }
+    //
+
+    const auditClick = () => {
+      if (auditParam.value == -1) {
+        proxy.$message.error('璇烽�夋嫨瀹℃壒椤�');
+        return;
+      }
+
+      if (!isFlow.value) {
+        emit("auditClick", auditParam, currentRows, (result) => {
+          if (result.status) {
+            model.value = false;
+            tableData.length = 0;
+          }
+        });
+        return;
+      }
+      //鎴戠殑娴佺▼涓偣鍑诲鎵�
+      //淇濆瓨瀹℃牳
+      let keys = currentRows.map(x => { return x[currentOption.key] });
+      let url = `api/${currentOption.table}/audit?auditReason=${auditParam.reason}&auditStatus=${auditParam.value}`
+      http.post(url, keys, '瀹℃牳涓�....').then((x) => {
+        if (!x.status) {
+          proxy.$message.error(x.message);
+          return;
+        }
+        model.value = false;
+        proxy.$parent.search()
+        proxy.$message.success(x.message)
+      });
+    }
+    const isFlow = ref(false);
+    let currentOption = {};
+    const open = (rows, flow) => {
+      isFlow.value = !!flow;
+      currentRows = rows;
+      activeName.value = 'audit'
+      auditParam.reason = '';
+      auditParam.value = -1;
+
+      if (flow) {
+        currentOption = {
+          table: rows[0].WorkTable,
+          key: "WorkTableKey"// rows[0].WorkTableKey
+        }
+      } else {
+        currentOption = {
+          table: props.option.url.replaceAll('/', ''),
+          key: props.option.key
+        }
+      }
+      getAuditInfo(currentOption);
+
+    }
+
+    return {
+      columns,
+      height,
+      width,
+      model,
+      workFlowSteps,
+      getAuditInfo,
+      getAuditStatus,
+      activeName,
+      reactive,
+      tableData,
+      auditParam,
+      auditClick,
+      open,
+      isCurrentUser,
+      hasFlow,
+      rowLen,
+      formData,
+      isFlow
+    }
+  }
+});
+</script>
+  
+<style lang="less" scoped>
+.audit-model-content {
+  padding: 10px;
+}
+
+.step-item {
+  background: #fff;
+  display: flex;
+}
+
+.left-item {
+  min-width: 180px;
+  text-align: right;
+  padding-right: 25px;
+  padding-top: 8px;
+
+  .left-date {
+    font-size: 13px;
+    padding-top: 7px;
+    color: #6c6c6c;
+  }
+}
+
+.right-item {
+  cursor: pointer;
+  position: relative;
+  border-bottom: 1px solid #f3f3f3;
+  padding: 5px 0 5px 5px;
+}
+
+.left-item,
+.right-item {
+  padding-bottom: 10px;
+}
+
+.right-item:last-child {
+  border-bottom: 0;
+}
+
+.step-line {
+  top: 16px;
+  left: -10px;
+  width: 1px;
+  height: 100%;
+  position: absolute;
+  background-color: #ebedf0;
+}
+
+.step-circle {
+  position: absolute;
+  top: 17px;
+  left: -9px;
+  z-index: 2;
+  font-size: 12px;
+  line-height: 1;
+  transform: translate(-50%, -50%);
+  width: 7px;
+  height: 7px;
+  background-color: #a1a1a1;
+  border-radius: 50%;
+}
+
+.right-item::before {
+  content: '';
+}
+
+.step-content {
+  padding-top: 2px;
+  font-size: 14px;
+  color: #828282;
+  line-height: 1.5;
+}
+
+.step-title {
+  font-weight: bold;
+  padding-top: 3px;
+}
+
+.step-text {
+  font-size: 13px;
+  color: #999999;
+  padding-top: 6px;
+}
+
+.step-current {
+  * {
+    color: #2f95ff !important;
+  }
+
+  .step-circle {
+    background: #2f95ff !important;
+  }
+
+  // border-radius: 5px;
+  // border: 1px solid #d6eaff;
+  font-size: 13px;
+  padding-top: 6px;
+  // background-color: #eff7ffd9;
+  color: black;
+}
+
+.audit-content {
+  // background: #f9f9f9;
+  padding: 10px;
+  border-radius: 4px;
+  display: flex;
+
+  .fx-left {
+    flex: 1;
+    width: 0;
+
+    .rd {
+      display: flex;
+      align-items: baseline;
+    }
+  }
+
+  .fx-right {
+    // width: 400px;
+
+    .btn {
+      margin-top: 10px;
+      text-align: center;
+    }
+  }
+
+}
+
+.cell-item {
+  font-weight: 500;
+}
+
+.desc-top {
+  padding: 5px 10px 0 10px;
+}
+.step-item-ad{
+  *{
+    color: #9f9898 !important;
+  }
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGridCustomColumn.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGridCustomColumn.vue
new file mode 100644
index 0000000..97feb80
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/ViewGrid/ViewGridCustomColumn.vue
@@ -0,0 +1,95 @@
+<template>
+  <el-alert
+    title="鎷栧姩鍒楀悕鍙皟鏁磋〃鏍煎垪鏄剧ず椤哄簭"
+    type="success"
+    :show-icon="false"
+  >
+  </el-alert>
+  <div class="view-column view-column-title">
+    <div class="view-column-index">#</div>
+    <div class="view-column-left">鍒楀悕</div>
+    <div class="view-column-right">鏄惁鏄剧ず</div>
+  </div>
+  <draggable
+    class="list-group"
+    tag="transition-group"
+    :component-data="componentData"
+    :list="viewColumns"
+    v-bind="dragOptions"
+    item-key="order"
+  >
+    <transition-group class="drag-center-item">
+      <div
+        class="view-column"
+        v-for="(column, index) in viewColumns"
+        :key="index"
+      >
+        <div class="view-column-index">{{ index + 1 }}</div>
+        <div class="view-column-left">{{ column.title }}</div>
+        <div class="view-column-right">
+          <el-checkbox v-model="column.show">
+            <div style="height: 100%; width: 250px"></div
+          ></el-checkbox>
+        </div>
+      </div>
+    </transition-group>
+  </draggable>
+</template>
+<script>
+import { VueDraggableNext } from 'vue-draggable-next';
+import { defineComponent, ref, reactive } from 'vue';
+
+export default defineComponent({
+  props: {
+    viewColumns: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    }
+  },
+  components: {
+    draggable: VueDraggableNext
+  },
+  data() {
+    return {};
+  },
+  setup(props, context) {
+    const dragOptions = reactive({
+      animation: 200,
+      group: 'description',
+      disabled: false,
+      ghostClass: 'ghost'
+    });
+    const componentData = reactive({
+      tag: 'ul',
+      type: 'transition-group'
+    });
+    return { dragOptions, componentData };
+  }
+});
+</script>
+<style lang="less" scoped>
+.view-column {
+  cursor: pointer;
+  display: flex;
+  padding: 10px;
+  border-bottom: 1px solid #f3f3f3;
+  .view-column-index {
+    width: 50px;
+  }
+  .view-column-left {
+    width: 120px;
+    padding: 0 10px;
+  }
+  .view-column-right {
+    flex: 1;
+  }
+}
+.view-column-title {
+  font-weight: bold;
+}
+.view-column:last-child {
+  border-bottom: 0;
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolBox.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolBox.vue
new file mode 100644
index 0000000..8893643
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolBox.vue
@@ -0,0 +1,200 @@
+<template>
+  <div class="vol-dialog">
+
+    <el-dialog v-model="vmodel" :close-on-click-modal="false" :close-on-press-escape="false" :width="width"
+      :fullscreen="fullscreen" :draggable="draggable" :modal="modal" :before-close="handleClose">
+      <template #header>
+        <i :class="icon"></i> {{ title }}
+        <button class="el-dialog__headerbtn" type="button" style="right: 35px; color: var(--el-color-info)" @click="handleFullScreen">
+          <i class="el-icon el-icon-full-screen"></i>
+        </button>
+      </template>
+      <el-scrollbar :max-height="contentHeight">
+        <div v-if="inited" style="min-height: 50px;" class="srcoll-content" :style="{ padding: padding + 'px' }">
+          <slot name="content"></slot>
+          <slot></slot>
+        </div>
+      </el-scrollbar>
+      <template #footer>
+        <div class="dia-footer" v-if="footer">
+          <slot name="footer"></slot>
+          <el-button type="primary" v-if="!footer" size="mini" @click="handleClose()"><i
+              class="el-icon-close"></i>鍏抽棴</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { defineComponent, ref, watch, watchEffect } from 'vue';
+
+export default defineComponent({
+  props: {
+    modelValue: false,
+    lazy: {
+      //鏄惁寮�鍚噿鍔犺浇2020.12.06
+      type: Boolean,
+      default: false,
+    },
+    icon: {
+      type: String,
+      default: "el-icon-warning-outline",
+    },
+    title: {
+      type: String,
+      default: "鍩烘湰淇℃伅",
+    },
+    height: {
+      type: Number,
+      default: 200,
+    },
+    width: {
+      type: Number,
+      default: 650,
+    },
+    padding: {
+      type: Number,
+      default: 16,
+    },
+    modal: {
+      //鏄惁闇�瑕侀伄缃╁眰
+      type: Boolean,
+      default: true,
+    },
+    draggable: {
+      //鍚敤鍙嫋鎷藉姛鑳�
+      type: Boolean,
+      default: false,
+    },
+    mask: {
+      type: Boolean,
+      default: true,
+    },
+    onModelClose: {
+      //2021.07.11澧炲姞寮瑰嚭妗嗗叧闂簨浠�
+      type: Function,
+      default: (iconClick) => {
+        return true;        
+      }
+    },
+    footer:{ //鏄惁鏄剧ず搴曢儴鎸夐挳
+      type: Boolean,
+      default: true
+    }
+
+  },
+  setup(props, context) {
+    const clientHeight = document.body.clientHeight * 0.95 - 60;
+    const inited = ref(true);
+    const vmodel = ref(false);
+    const footer = ref(false);
+    const top = ref(100);
+    vmodel.value = props.modelValue;
+    footer.value = !!context.slots.footer;
+    const contentHeight = ref(200);
+    contentHeight.value = props.height;
+    const handleClose = (done, iconClose) => {
+      let result = props.onModelClose(!!iconClose);
+      if (result === false) return;
+      vmodel.value = false;
+      context.emit("update:modelValue", false);
+      done && done();
+    };
+    const calcHeight = (val) => {
+    //  if (props.height > clientHeight) {
+    //  if(true){
+        contentHeight.value = clientHeight - 30;
+        return clientHeight / -2 + 'px';
+    //  }
+      // contentHeight.value = val || props.height;
+      // return (props.height + 56) / -2 + 'px';
+    };
+    top.value = calcHeight();
+    watch(
+      () => props.modelValue,
+      (newVal, oldVal) => {
+        vmodel.value = newVal;
+      }
+    );
+    watch(
+      () => props.height,
+      (newVal, oldVal) => {
+        top.value = calcHeight();
+      }
+    );
+    const fullscreen=ref(false);
+    const handleFullScreen=()=> {
+      fullscreen.value = !fullscreen.value;
+      context.emit("fullscreen", fullscreen.value);
+    }
+    return {
+      handleClose,
+      inited,
+      vmodel,
+      footer,
+      top,
+      calcHeight,
+      contentHeight,
+      fullscreen,
+      handleFullScreen
+    };
+  }
+});
+</script>
+
+<style lang="less" scoped>
+.dia-footer {
+  text-align: right;
+  width: 100%;
+  border-top: 1px solid #e2e2e2;
+  text-align: right;
+  padding: 6px 8px;
+}
+</style>
+
+<style scoped lang="less">
+.vol-dialog ::v-deep(.el-overlay-dialog) {
+  display: flex !important;
+}
+
+.vol-dialog ::v-deep(.el-dialog) {
+  margin: auto;
+}
+
+.vol-dialog ::v-deep(.el-dialog) {
+  border-top-left-radius: 4px;
+  border-top-right-radius: 4px;
+}
+
+.vol-dialog ::v-deep(.el-dialog__header) {
+  border-top-left-radius: 4px;
+  border-top-right-radius: 4px;
+  padding: 0px 13px;
+  line-height: 53px;
+  border-bottom: 1px solid #e6e6e6;
+  height: 50px;
+  color: rgb(79, 79, 79);
+  font-weight: bold;
+  font-size: 14px;
+  margin: 0;
+  // background-image: linear-gradient(135deg, #0cd7bd 10%, #50c3f7);
+}
+
+.vol-dialog ::v-deep(.el-dialog__footer),
+.vol-dialog ::v-deep(.el-dialog__body) {
+  padding: 0;
+}
+
+.vol-dialog ::v-deep(.el-dialog__headerbtn) {
+  top: 0;
+  padding-top: 8px;
+  height: 50px;
+  width: 0;
+  padding-right: 30px;
+  padding-left: 5px;
+}
+// .vol-dialog ::v-deep(.el-dialog__headerbtn .el-dialog__close) {
+//   color: #fff;
+// }
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolElementMenu.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolElementMenu.vue
new file mode 100644
index 0000000..66a9779
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolElementMenu.vue
@@ -0,0 +1,198 @@
+<template>
+  <div class="vol-el-menu">
+    <el-menu
+      close="vol-el-menu--vertical"
+      :default-openeds="openedIds"
+      :default-active="defaultActive"
+      :unique-opened="true"
+      @select="select"
+      :collapse="isCollapse"
+      @open="handleOpen"
+      @close="handleClose"
+      @contextmenu.prevent="bindRightClickMenu"
+    >
+      <template v-for="item in convertTree(list)">
+        <el-sub-menu
+          :key="item.id"
+          :index="'' + item.id"
+          v-if="item.children.length && (!enable || item.enable == 1)"
+        >
+          <template #title>
+            <i class="menu-icon" :class="item.icon"></i>
+            <span> {{ item.name }}</span>
+          </template>
+          <vol-element-menu-child
+            :enable="enable"
+            :list="item.children"
+          ></vol-element-menu-child>
+        </el-sub-menu>
+        <template v-else>
+          <el-menu-item
+            class="menu-item-lv1"
+            v-if="!enable || item.enable == 1"
+            :key="item.id"
+            :index="'' + item.id"
+          >
+            <i :class="item.icon"></i>
+            <span> {{ item.name }}</span>
+          </el-menu-item>
+        </template>
+      </template>
+    </el-menu>
+  </div>
+</template>
+
+<script>
+import VolElementMenuChild from './VolElementMenuChild';
+import { useRouter } from 'vue-router';
+
+import {
+  defineComponent,
+  reactive,
+  watch,
+  ref,
+  toRef,
+  toRefs,
+  getCurrentInstance
+  // onMounted,
+} from 'vue';
+export default defineComponent({
+  components: {
+    'vol-element-menu-child': VolElementMenuChild
+  },
+  props: {
+    enable: {
+      type: Boolean,
+      default: false //鏄惁鍒ゆ柇enable=1
+    },
+    isCollapse: {
+      type: Boolean,
+      default: false
+    },
+    onSelect: {
+      type: Function,
+      default: (x) => {}
+    },
+    openSelect: {
+      //鎵撳紑鐨勬椂鍊欐槸鍚﹁Е鍙戦�変腑浜嬩欢
+      type: Boolean,
+      default: true
+    },
+    list: {
+      type: Array,
+      default: []
+    },
+    rootId: {
+      type: String,
+      default: '0'
+    },
+    currentMenuId: {
+      type: Number,
+      default: 0
+    }
+  },
+  setup(props) {
+    // const { list } = toRefs(props);
+    //  const treeList = ref([]);
+    const getTree = (id, node, data) => {
+      if (!node.children) {
+        node.children = [];
+      }
+      data.forEach((x) => {
+        if (x.parentId == id && !node.children.some((c) => c.id === x.id)) {
+          node.children.push(x);
+          getTree(x.id, x, data);
+        }
+      });
+    };
+    let rootTreeId = !isNaN(props.rootId) ? ~~props.rootId : props.rootId;
+    props.list.forEach((x) => {
+      if (!x.icon || x.icon.substring(0, 3) != 'el-') {
+        x.icon = 'el-icon-menu';
+      }
+      x.children = [];
+      x.isRoot = x.parentId === rootTreeId;
+    });
+    const convertTree = (data) => {
+      var root_data = [];
+      data.forEach((x) => {
+        if (x.parentId === rootTreeId) {
+          if (!x.hasOwnProperty('enable')) x.enable = 1;
+          root_data.push(x);
+          getTree(x.id, x, data);
+        }
+      });
+      return root_data;
+    };
+    const openedIds = reactive([props.currentMenuId]);
+    const defaultActive = ref(props.currentMenuId + '');
+    let _base = getCurrentInstance().appContext.config.globalProperties.base;
+    watch(
+      () => props.currentMenuId,
+      (newVal, oldVal) => {
+        defaultActive.value = newVal + '';
+        openedIds.splice(0);
+        openedIds.push(
+          ..._base.getTreeAllParent(newVal, props.list).map((c) => {
+            return c.id;
+          })
+        );
+      }
+    );
+    const router = useRouter();
+    let eventSelect = false;
+    const select = (index, path) => {
+      if (eventSelect) {
+        return;
+      }
+      eventSelect = true;
+      setTimeout(() => {
+        eventSelect = false;
+      }, 20);
+
+      let _item = props.list.find((x) => {
+        return x.id == index;
+      });
+      props.onSelect(index, _item);
+      router.push({ path: _item.path || '' });
+    };
+
+    const handleOpen = (index, path) => {
+      if (props.openSelect) {
+        select(index, path);
+      }
+    };
+    const handleClose = () => {};
+
+    /**
+     * 鑿滃崟瀵艰埅鍙抽敭浜嬩欢
+     * @param {*} enable 鏄惁鍚敤鍙抽敭浜嬩欢[true:鍚敤;false:绂佺敤;]
+     */
+    const bindRightClickMenu = (enable) => {
+      if (!enable) return;
+    };
+
+    return {
+      // treeList,
+      // list,
+      select,
+      convertTree,
+      handleOpen,
+      handleClose,
+      bindRightClickMenu,
+      openedIds,
+      defaultActive
+    };
+  }
+});
+</script>
+<style lang="less" scoped>
+.vol-el-menu {
+  box-sizing: content-box;
+  width: 100%;
+  .menu-icon {
+    font-size: 18px;
+    margin-right: 6px;
+  }
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolElementMenuChild.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolElementMenuChild.vue
new file mode 100644
index 0000000..ccea321
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolElementMenuChild.vue
@@ -0,0 +1,56 @@
+<template>
+  <div class="vol-el-menu-item">
+    <template v-for="(item) in list">
+      <template v-if="item.children&&item.children.length">
+        <el-menu-item :key="item.id"
+                      :index="'' + item.id"
+                      v-if="!item.children.length && (!enable || item.enable == 1)">
+          <template #title></template>
+          <span> {{ item.name }}</span>
+        </el-menu-item>
+        <el-sub-menu :key="item.id"
+                    :index="'' + item.id"
+                    v-if="item.children.length && (!enable || item.enable == 1)">
+          <template #title>
+            <span> {{ item.name }}</span>
+          </template>
+          <vol-element-menu-child :enable="enable" :list="item.children" />
+        </el-sub-menu>
+      </template>
+      <template v-else>
+        <el-menu-item :key="item.id"
+                      :index="'' + item.id"
+                      v-if="(!enable || item.enable == 1)">
+          <template #title></template>
+          <span> {{item.name }}</span>
+        </el-menu-item>
+      </template>
+    </template>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "vol-element-menu-child",
+  props: {
+    list: {
+      type: Array,
+      default: [],
+    },
+    enable: {
+      type: Boolean,
+      default: false, //鏄惁鍒ゆ柇enable=1
+    },
+  },
+};
+</script>
+
+<style scoped lang="less">
+.vol-el-menu-item ::v-deep(.el-menu-item) {
+  height: 42px !important;
+  line-height: 42px !important;
+}
+</style>
+
+
+
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolForm.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolForm.vue
new file mode 100644
index 0000000..3e6b9b1
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolForm.vue
@@ -0,0 +1,1487 @@
+<template>
+  <el-form
+    style="display: inline-block; width: 100%"
+    :inline="true"
+    ref="volform"
+    @submit.prevent
+    :model="formFields"
+    :label-width="labelWidth"
+    :rules="rules"
+  >
+    <template v-for="(row, findex) in formRules" :key="findex">
+      <div class="vol-form-item">
+        <el-form-item
+          :label="item.title ? item.title + '锛�' : ''"
+          v-show="!item.hidden"
+          v-for="(item, index) in row"
+          :prop="item.field"
+          :key="item.field + index"
+          :style="{ width: getColWidth(item) + '%' }"
+        >
+          <!-- render -->
+          <form-expand
+            v-if="item.render && typeof item.render == 'function'"
+            :render="item.render"
+            :par="12"
+          ></form-expand>
+          <!-- 2021.10.17澧炲姞琛ㄥ崟瀹炴椂鏂规硶璁$畻 -->
+          <span
+            v-else-if="
+              item.readonly && typeof formFields[item.field] == 'function'
+            "
+            >{{ formFields[item.field]() }}</span
+          >
+          <!-- 鍙鍥剧墖鎴栨枃浠�  -->
+          <div v-else-if="isReadonlyImgFile(item, formFields)">
+            <div v-if="item.type == 'img'" class="form-imgs">
+              <div
+                class="img-item"
+                v-for="(img, imgIndex) in formFields[item.field]"
+                :key="imgIndex"
+              >
+                <img
+                  :src="getSrc(img.path)"
+                  :onerror="errorImg"
+                  @click="previewImg(img.path)"
+                />
+              </div>
+            </div>
+            <div
+              v-else
+              class="form-file-list"
+              v-for="(file, fileIndex) in formFields[item.field]"
+              :key="fileIndex"
+            >
+              <a @click="dowloadFile(formFields[item.field][fileIndex])">{{
+                file.name
+              }}</a>
+            </div>
+          </div>
+
+          <div v-else :class="{ 'form-item-extra': item.extra }">
+            <!-- 鍙灞炴�� -->
+            <label
+              :style="item.inputStyle"
+              v-if="item.type == 'label'"
+              class="readonly-input"
+              >{{ getText(formFields, item) }}</label
+            >
+            <!-- 20223.05.13闆嗘垚el-tree-select -->
+            <!-- :filter-method="(value)=>{filterMethod(value,item.data)}" -->
+            <!-- :filterable="true" -->
+            <el-tree-select
+              style="width: 100%"
+              v-else-if="item.type == 'treeSelect'"
+              v-model="formFields[item.field]"
+              :data="item.data"
+              :multiple="item.multiple"
+              :render-after-expand="false"
+              :show-checkbox="false"
+              :check-strictly="true"
+              check-on-click-node
+              node-key="key"
+              :props="{ label: 'label' }"
+            >
+              <template #default="{data,node }">
+                <!-- <el-checkbox v-model="node.checked"></el-checkbox> -->
+               <!-- {{getNode(node, data)}} -->
+               <!-- {{node.checked}} -->
+               <!-- 杩欓噷杩樻湁鐐归棶棰橈紝鍚庨潰澶勭悊 -->
+                {{  data.label}}</template
+              >
+            </el-tree-select>
+            <template
+              v-else-if="['select', 'selectList'].indexOf(item.type) != -1"
+            >
+              <el-select-v2
+                :disabled="item.readonly || item.disabled"
+                v-show="!item.hidden"
+                style="width: 100%"
+                :size="size"
+                v-if="item.data.length > select2Count"
+                v-model="formFields[item.field]"
+                filterable
+                :multiple="item.type == 'select' ? false : true"
+                :placeholder="item.placeholder ? item.placeholder : item.title"
+                :allow-create="item.autocomplete"
+                :options="item.data"
+                @change="
+                  (val) => {
+                    item.onChange(val, item.data);
+                  }
+                "
+                clearable
+              >
+                <template #default="{ item }">
+                  {{ item.label }}
+                </template>
+              </el-select-v2>
+              <el-select
+                :disabled="item.readonly || item.disabled"
+                v-show="!item.hidden"
+                style="width: 100%"
+                :size="size"
+                v-else-if="item.remote || item.url"
+                v-model="formFields[item.field]"
+                filterable
+                :multiple="item.type == 'select' ? false : true"
+                :placeholder="item.placeholder ? item.placeholder : item.title"
+                clearable
+                :remote-method="
+                  (val) => {
+                    remoteSearch(item, formFields, val);
+                  }
+                "
+              >
+                <el-option
+                  v-for="item in item.data"
+                  :key="item.key"
+                  :label="item.value"
+                  :value="item.key"
+                >
+                </el-option>
+              </el-select>
+              <el-select
+                :disabled="item.readonly || item.disabled"
+                v-show="!item.hidden"
+                style="width: 100%"
+                :size="size"
+                v-else
+                v-model="formFields[item.field]"
+                filterable
+                :multiple="item.type == 'select' ? false : true"
+                :placeholder="item.placeholder ? item.placeholder : item.title"
+                :allow-create="item.autocomplete"
+                @change="
+                  (val) => {
+                    item.onChange(val, item.data);
+                  }
+                "
+                clearable
+              >
+                <el-option
+                  v-show="!item.hidden"
+                  :disabled="item.disabled"
+                  v-for="item in item.data"
+                  :key="item.key"
+                  :label="item.value"
+                  :value="item.key"
+                >
+                </el-option>
+              </el-select>
+            </template>
+
+            <el-switch
+              v-show="!item.hidden"
+              v-else-if="item.type == 'switch'"
+              v-model="formFields[item.field]"
+              :disabled="item.readonly || item.disabled"
+              active-color="#0f84ff"
+              @change="item.onChange"
+              inactive-color="rgb(194 194 194)"
+              :active-value="
+                typeof formFields[item.field] == 'boolean'
+                  ? true
+                  : typeof formFields[item.field] == 'string'
+                  ? '1'
+                  : 1
+              "
+              :inactive-value="
+                typeof formFields[item.field] == 'boolean'
+                  ? false
+                  : typeof formFields[item.field] == 'string'
+                  ? '0'
+                  : 0
+              "
+            >
+            </el-switch>
+
+            <el-radio-group
+              :disabled="item.readonly || item.disabled"
+              v-show="!item.hidden"
+              v-model="formFields[item.field]"
+              v-else-if="item.type == 'radio'"
+              @change="item.onChange"
+            >
+              <el-radio
+                v-for="kv in item.data"
+                :disabled="item.readonly || item.disabled"
+                :key="kv.key"
+                :label="kv.key"
+                >{{ kv.value }}</el-radio
+              >
+            </el-radio-group>
+
+            <el-checkbox-group
+              :disabled="item.readonly || item.disabled"
+              v-show="!item.hidden"
+              v-model="formFields[item.field]"
+              v-else-if="item.type == 'checkbox'"
+              @change="item.onChange"
+            >
+              <el-checkbox
+                v-for="kv in item.data"
+                :key="kv.key"
+                :disabled="item.readonly || item.disabled"
+                :label="kv.key"
+                >{{ kv.value }}</el-checkbox
+              >
+            </el-checkbox-group>
+            <div
+              class="v-date-range"
+              style="display: flex"
+              v-else-if="
+                ['date', 'datetime'].indexOf(item.type) != -1 && item.range
+              "
+            >
+              <el-date-picker
+                :size="size"
+                :disabled="item.readonly || item.disabled"
+                style="flex: 1; width: auto"
+                v-model="formFields[item.field][0]"
+                :type="item.type == 'date' ? 'date' : 'datetime'"
+                :disabledDate="(val) => getDateOptions(val, item)"
+                placeholder="寮�濮嬫椂闂�"
+                @change="
+                  (val) => {
+                    dateRangeChange(val, item);
+                  }
+                "
+                :value-format="getDateFormat(item)"
+              >
+              </el-date-picker>
+              <span style="margin: 0px 5px; font-size: 13px; color: #6f6b6b"
+                >鑷�</span
+              >
+              <el-date-picker
+                :size="size"
+                :disabled="item.readonly || item.disabled"
+                style="flex: 1; width: auto"
+                v-model="formFields[item.field][1]"
+                placeholder="缁撴潫鏃堕棿"
+                :type="item.type == 'date' ? 'date' : 'datetime'"
+                :disabledDate="(val) => getDateOptions(val, item)"
+                @change="
+                  (val) => {
+                    dateRangeChange(val, item);
+                  }
+                "
+                :value-format="getDateFormat(item)"
+              >
+              </el-date-picker>
+            </div>
+            <!-- v-show涓嶆坊鍔犳牴鑺傜偣灏变細鎶ラ敊娌℃湁鏍圭偣鑺� -->
+            <div
+              v-show="!item.hidden"
+              style="width: 100%"
+              v-else-if="['date', 'datetime', 'month'].indexOf(item.type) != -1"
+            >
+              <el-date-picker
+                :size="size"
+                clearable
+                :disabled="item.readonly || item.disabled"
+                style="width: 100%"
+                v-model="formFields[item.field]"
+                @change="item.onChange"
+                :type="item.type"
+                :placeholder="
+                  item.placeholder ? item.placeholder : '璇烽�夋嫨' + item.title
+                "
+                :disabledDate="(val) => getDateOptions(val, item)"
+                :value-format="getDateFormat(item)"
+              >
+              </el-date-picker>
+            </div>
+
+            <el-time-picker
+              :size="size"
+              v-else-if="item.type == 'time'"
+              v-model="formFields[item.field]"
+              :disabled="item.readonly || item.disabled"
+              placeholder="璇烽�夋嫨鏃堕棿"
+              :value-format="item.format || 'HH:mm:ss'"
+              :format="item.format"
+              style="width: 100%"
+            >
+            </el-time-picker>
+
+            <el-scrollbar
+              style="border: 1px solid #c7d8db; border-radius: 5px"
+              :height="item.height || 150"
+              v-else-if="
+                item.type == 'editor' && (item.readonly || item.disabled)
+              "
+            >
+              <div ref="editor" v-html="formFields[item.field]"></div>
+            </el-scrollbar>
+
+            <vol-wang-editor
+              ref="editor"
+              v-else-if="item.type == 'editor'"
+              :url="item.url || editor.uploadImgUrl"
+              :upload="item.upload || editor.upload"
+              v-model="formFields[item.field]"
+              :height="item.height || 350"
+            ></vol-wang-editor>
+
+            <vol-upload
+              v-show="!item.hidden"
+              v-else-if="isFile(item, formFields)"
+              :desc="item.desc"
+              :multiple="item.multiple"
+              :max-file="item.maxFile"
+              :max-size="item.maxSize"
+              :autoUpload="item.autoUpload"
+              :fileInfo="formFields[item.field]"
+              :url="item.url"
+              :img="item.type == 'img' || item.columnType == 'img'"
+              :excel="item.type == 'excel'"
+              :fileTypes="item.fileTypes ? item.fileTypes : []"
+              :upload-before="item.uploadBefore"
+              :upload-after="item.uploadAfter"
+              :append="item.multiple"
+              :on-change="
+                (files) => {
+                  return fileOnChange(files, item);
+                }
+              "
+              :file-click="item.fileClick"
+              :remove-before="item.removeBefore"
+              :downLoad="item.downLoad ? true : false"
+            ></vol-upload>
+            <el-cascader
+              :size="size"
+              clearable
+              style="width: 100%; margin-top: -3px"
+              v-model="formFields[item.field]"
+              :disabled="item.readonly || item.disabled"
+              v-else-if="item.type == 'cascader'"
+              :options="item.data"
+              :props="{
+                checkStrictly: item.changeOnSelect || item.checkStrictly
+              }"
+              @change="item.onChange"
+            >
+            </el-cascader>
+            <el-rate
+              v-else-if="item.type == 'rate'"
+              @change="
+                (val) => {
+                  item.onChange && item.onChange(val);
+                }
+              "
+              :max="item.max"
+              v-model="formFields[item.field]"
+            />
+            <div
+              style="display: flex"
+              v-else-if="item.type == 'range' || item.range"
+            >
+              <el-input
+                :size="size"
+                :disabled="item.readonly || item.disabled"
+                style="flex: 1"
+                v-model="formFields[item.field][0]"
+                clearable
+              />
+              <span style="margin: 0 5px">-</span>
+              <el-input
+                :size="size"
+                :disabled="item.readonly || item.disabled"
+                style="flex: 1"
+                v-model="formFields[item.field][1]"
+                clearable
+              />
+            </div>
+            <el-input
+              :size="size"
+              clearable
+              :ref="item.field"
+              :input-style="item.inputStyle"
+              :disabled="item.readonly || item.disabled"
+              v-else-if="item.type == 'textarea'"
+              v-model="formFields[item.field]"
+              type="textarea"
+              :autosize="{
+                minRows: item.minRows || 2,
+                maxRows: item.maxRows || 10
+              }"
+              :placeholder="item.placeholder ? item.placeholder : item.title"
+            />
+            <el-input-number
+              :size="size"
+              style="width: 100%"
+              :ref="item.field"
+              :input-style="item.inputStyle"
+              v-else-if="item.type == 'number'"
+              v-model="formFields[item.field]"
+              :min="item.min"
+              :disabled="item.readonly || item.disabled"
+              :max="item.max"
+              controls-position="right"
+            />
+            <el-input
+              :size="size"
+              clearable
+              :input-style="item.inputStyle"
+              v-else-if="item.type == 'password'"
+              type="password"
+              v-model="formFields[item.field]"
+              :disabled="item.readonly || item.disabled"
+              v-show="!item.hidden"
+              :placeholder="item.placeholder ? item.placeholder : item.title"
+            />
+            <!-- 2021.11.18淇el-input娌℃湁榛樿enter浜嬩欢鏃跺洖杞﹀紓甯� -->
+            <el-input
+              :size="size"
+              clearable
+              :ref="item.field"
+              :input-style="item.inputStyle"
+              v-else-if="item.onKeyPress"
+              :placeholder="item.placeholder ? item.placeholder : item.title"
+              :disabled="item.readonly || item.disabled"
+              v-show="!item.hidden"
+              v-model="formFields[item.field]"
+              @keypress="
+                ($event) => {
+                  onKeyPress($event, item);
+                }
+              "
+              @change="item.onKeyPress"
+              @keyup.enter="item.onKeyPress"
+            ></el-input>
+            <el-input
+              :size="size"
+              clearable
+              v-else
+              :ref="item.field"
+              :input-style="item.inputStyle"
+              :placeholder="item.placeholder ? item.placeholder : item.title"
+              :disabled="item.readonly || item.disabled"
+              v-show="!item.hidden"
+              v-model="formFields[item.field]"
+            ></el-input>
+
+            <div class="form-extra" v-if="item.extra">
+              <form-expand
+                v-if="item.extra.render"
+                :render="item.extra.render"
+              ></form-expand>
+              <a
+                v-else-if="item.extra.click"
+                :style="item.extra.style"
+                @click="item.extra.click(item, formFields[item.field])"
+              >
+                <i v-if="item.extra.icon" :class="item.extra.icon" />
+                {{ item.extra.text }}
+              </a>
+              <a v-else :style="item.extra.style">
+                <i v-if="item.extra.icon" :class="item.extra.icon" />
+                {{ item.extra.text }}
+              </a>
+            </div>
+          </div>
+        </el-form-item>
+      </div>
+    </template>
+    <slot></slot>
+    <div style="width: 100%">
+      <slot name="footer"></slot>
+    </div>
+  </el-form>
+</template>
+<script>
+const rule = {
+  change: [
+    'checkbox',
+    'select',
+    'date',
+    'datetime',
+    'drop',
+    'radio',
+    'cascader'
+  ], // 2020.05.31澧炲姞绾ц仈绫诲瀷
+  phone: /^[1][3,4,5,6,7,8,9][0-9]{9}$/,
+  decimal: /(^[\-0-9][0-9]*(.[0-9]+)?)$/,
+  number: /(^[\-0-9][0-9]*([0-9]+)?)$/
+};
+const inputTypeArr = ['text', 'string', 'mail', 'textarea', 'password'];
+const types = {
+  int: 'number',
+  byte: 'number',
+  decimal: 'number', // "float",
+  string: 'string',
+  bool: 'boolean',
+  date: 'datetime',
+  date: 'date',
+  mail: 'email'
+};
+//琛ㄥ崟楠岃瘉娉ㄦ剰锛氭瘡娆¢獙璇侀兘蹇呴』鎵цcallback,鍚﹀垯楠岃瘉涓嶆墽琛屽洖璋冩柟娉�
+const colPow = Math.pow(10, 3);
+import FormExpand from './VolForm/VolFormRender';
+import {
+  defineAsyncComponent,
+  defineComponent,
+  ref,
+  reactive,
+  toRefs,
+  getCurrentInstance,
+  onMounted,
+  watch
+} from 'vue';
+export default defineComponent({
+  components: {
+    FormExpand,
+    'vol-upload': defineAsyncComponent(() =>
+      import('@/components/basic/VolUpload.vue')
+    ),
+    'vol-wang-editor': defineAsyncComponent(() =>
+      import('@/components/editor/VolWangEditor.vue')
+    )
+  },
+  props: {
+    loadKey: {
+      // 鏄惁鍔犺浇formRules瀛楁閰嶇疆鐨勬暟鎹簮
+      type: Boolean,
+      default: true
+    },
+    width: {
+      // 琛ㄥ崟瀹藉害
+      type: Number,
+      default: 0
+    },
+    labelWidth: {
+      // 琛ㄥ崟宸﹁竟label鏂囧瓧鏍囩鐨勫搴�
+      type: Number,
+      default: 100
+    },
+    formRules: {
+      // 琛ㄥ崟閰嶇疆瑙勫垯锛屽瀛楁绫诲瀷锛屾槸鍚﹀繀濉�
+      type: Array,
+      default: []
+    },
+    formFields: {
+      type: Object,
+      default: () => {
+        return {};
+      }
+    },
+    editor: {
+      // 2021.01.16缂栬緫鍣ㄤ俊鎭� {uploadImgUrl:"",upload:null//涓婁紶鏂规硶}
+      type: Object,
+      default: () => {
+        return {};
+      }
+    },
+    size: {
+      type: String, //large / default / small
+      default: 'large'
+    },
+    select2Count: {
+      //瓒呭嚭鏁伴噺鏄剧ずselect2缁勪欢
+      type: Number,
+      default: 500
+    }
+  },
+  computed: {
+    rules() {
+      let ruleResult = {};
+      this.formRules.forEach((option, xIndex) => {
+        option.forEach((item) => {
+          ruleResult[item.field] = [this.getRule(item, this.formFields)];
+        });
+      });
+      if (this.$refs.volform) {
+        setTimeout(() => {
+          this.$refs.volform.clearValidate();
+        }, 100);
+      }
+      return ruleResult;
+    }
+  },
+  setup(props, context) {
+    const { appContext, proxy } = getCurrentInstance();
+    const remoteCall = ref(true);
+    const span = ref(1);
+    const rangeFields = toRefs([]);
+    const volform = ref(null);
+    const numberFields = toRefs([]);
+    onMounted(() => {});
+    const initFormRules = (init) => {
+      if (props.loadKey) {
+        initSource();
+      }
+      props.formRules.forEach((row, xIndex) => {
+        if (row.length > span.value) span.value = row.length;
+        let _count = 0,
+          _size = 0;
+        row.forEach((x) => {
+          if (x.colSize > 0) {
+            _size = _size + x.colSize;
+            _count++;
+          }
+        });
+        if (_count > 0 && row.length - _count > 0) {
+          let _cellSize = (12 - _size) / (row.length - _count);
+          row.forEach((x) => {
+            if (!x.colSize) {
+              x.colSize = _cellSize;
+            }
+          });
+        }
+        row.forEach((item, yIndex) => {
+          if (item.type == 'number') {
+            numberFields.push(item.field);
+          }
+          // 鐩墠鍙敮鎸乻elect鍗曢�夎繙绋嬫悳绱紝remote杩滅▼浠庡悗鍙板瓧鍏告暟鎹簮杩涜鎼滅储锛寀rl浠庢寚瀹氱殑url鎼滅储
+          if (item.remote || item.url) {
+            // item.remoteData = [];
+            item.loading = false;
+            item.point = { x: xIndex, y: yIndex };
+          }
+          // 鍒濆鍖栦笂浼犳枃浠朵俊鎭�
+          initUpload(item, init);
+          // 鍒濆鍖栨暟鎹簮绌哄璞�
+          if (item.dataKey) {
+            // 涓嬫媺妗嗛兘寮哄埗璁剧疆涓哄瓧绗︿覆绫诲瀷
+            item.columnType = 'string';
+            if (!item.data) {
+              item.data = [];
+            }
+          }
+
+          if (item.range || item.type == 'range') {
+            if (
+              !(props.formFields[item.field] instanceof Array) ||
+              props.formFields[item.field].length != 2
+            ) {
+              props.formFields[item.field] = ['', ''];
+            }
+            rangeFields.push(item.field);
+          }
+        });
+      });
+    };
+
+    const initSource = () => {
+      let keys = [],
+        binds = [];
+      // 鍒濆鍖栧瓧鍏告暟鎹簮
+      props.formRules.forEach((item) => {
+        item.forEach((x) => {
+          if (x.dataKey && (!x.data || x.data.length == 0) && !x.remote) {
+            x.data = [];
+            binds.push({ key: x.dataKey, data: x.data, type: x.type });
+            if (keys.indexOf(x.dataKey) == -1) {
+              keys.push(x.dataKey);
+            }
+          }
+        });
+      });
+
+      if (keys.length == 0) return;
+      appContext.config.globalProperties.http
+        .post('/api/Sys_Dictionary/GetVueDictionary', keys)
+        .then((dic) => {
+          bindOptions(dic, binds);
+          proxy.$emit('dicInited', dic);
+        });
+    };
+    const bindOptions = (dic, binds) => {
+      dic.forEach((d) => {
+        if (d.data.length > props.select2Count) {
+          if (
+            !binds.some((x) => {
+              return x.key == d.dicNo && x.type == 'cascader';
+            })
+          ) {
+            d.data.forEach((item) => {
+              item.label = item.value;
+              item.value = item.key;
+            });
+          }
+        }
+        binds.forEach((x) => {
+          if (x.key != d.dicNo) return true;
+          // 濡傛灉鏈夋暟鎹殑鍒欎笉鏌ヨ
+          if (x.data.length > 0) return true;
+          //2022.03.13澧炲姞绾ц仈鏁版嵁婧愯嚜鍔ㄨ浆鎹�
+          if (x.type == 'cascader' || x.type == 'treeSelect') {
+            let _data = JSON.parse(JSON.stringify(d.data));
+            let cascaderArr = appContext.config.globalProperties.base.convertTree(
+              _data,
+              (node, data, isRoot) => {
+                if (!node.inited) {
+                  node.inited = true;
+                  node.label = node.value;
+                  node.value = node.key;
+                }
+              }
+            );
+            props.formRules.forEach((option) => {
+              option.forEach((item) => {
+                if (item.dataKey == x.key) {
+                  item.orginData = x.data;
+                  item.data = cascaderArr;
+                }
+              });
+            });
+          } else if (d.data.length > 0 && !d.data[0].hasOwnProperty('key')) {
+            let source = d.data,
+              newSource = new Array(source.length);
+            for (let index = 0; index < source.length; index++) {
+              newSource[index] = {
+                key: source['key'] + '',
+                value: source['value']
+              };
+            }
+            x.data.push(...newSource);
+          } else {
+            x.data.push(...d.data);
+          }
+        });
+      });
+    };
+
+    const initUpload = (item, init) => {
+      if (!init) return;
+      if (
+        ['img', 'excel', 'file'].indexOf(item.type != -1) ||
+        item.columnType == 'img'
+      ) {
+        // 鍙槸娌¤缃槸鍚﹁嚜鍔ㄤ笂浼犵殑锛岄粯璁ら兘鏄�夋嫨鏂囦欢鍚庤嚜鍔ㄤ笂浼�
+        if (!item.hasOwnProperty('autoUpload')) {
+          item.autoUpload = true;
+        }
+        if (!item.hasOwnProperty('fileList')) {
+          item.fileList = true;
+        }
+        if (!item.hasOwnProperty('downLoad')) {
+          item.downLoad = true;
+        }
+        if (!item.removeBefore) {
+          item.removeBefore = (index, file, files) => {
+            return true;
+          };
+        }
+        if (!item.fileClick) {
+          item.fileClick = (index, file, files) => {
+            return true;
+          };
+        }
+        if (!item.onChange) {
+          item.onChange = (files) => {
+            return true;
+          };
+        }
+        if (!item.uploadAfter) {
+          item.uploadAfter = (result, files) => {
+            return true;
+          };
+        }
+        if (!item.uploadBefore) {
+          item.uploadBefore = (files) => {
+            return true;
+          };
+        }
+      }
+    };
+    const validate = (callback) => {
+      let result = true;
+      volform.value.validate((valid) => {
+        if (!valid) {
+          appContext.config.globalProperties.$message.error('鏁版嵁楠岃瘉鏈�氳繃!');
+          result = false;
+        } else if (typeof callback === 'function') {
+          try {
+            callback(valid);
+          } catch (error) {
+            let msg = `琛ㄥ崟楠岃瘉鍥炶皟鏂规硶寮傚父锛�${error.message}`;
+            appContext.config.globalProperties.$message.error(msg);
+            console.log(msg);
+          }
+        }
+      });
+      return result;
+    };
+
+    initFormRules(true);
+    return {
+      remoteCall,
+      span,
+      rangeFields,
+      numberFields,
+      validate,
+      volform
+      //  initFormRules,
+      // initSource
+    };
+  },
+  created() {
+    this.formRules.forEach((rules) => {
+      rules.forEach((option) => {
+        if (option.type == 'treeSelect' && option.multiple === undefined) {
+          option.multiple = true;
+        }
+      });
+    });
+  },
+
+  data() {
+    return {
+      // remoteCall: true,
+      errorImg: 'this.src="' + require('@/assets/imgs/error-img.png') + '"'
+      // span: 1,
+      // rangeFields: [],
+    };
+  },
+  methods: {
+    getColWidth(item) {
+      //2021.08.30 澧炲姞鍔ㄦ�佽绠楄〃鍗曞搴�
+      let _span = 0;
+      this.formRules.forEach((row, xIndex) => {
+        //2022.05.06 杩藉姞琛ㄥ崟涓殣钘忕殑鍏冪礌涓嶅弬涓庡姩鎬佽绠楄〃鍗曞搴�
+        let rowLength = row.filter((item) => {
+          return !item.hidden;
+        }).length;
+        if (rowLength > _span) _span = rowLength;
+      });
+      let rete =
+        Math.round(((item.colSize || 12 / _span) / 0.12) * colPow, 10.0) /
+        colPow;
+      if (item.colSize) return rete.toFixed(3);
+      return rete.toFixed(3);
+      // return (100 - rete).toFixed(3);
+    },
+    previewImg(url) {
+      this.base.previewImg(url, this.http.ipAddress);
+    },
+    getSrc(path) {
+      if (!path) return;
+      if (!this.base.isUrl(path) && path.indexOf('.') != -1) {
+        return this.http.ipAddress + path;
+      }
+      return path;
+    },
+    // 鏄惁涓哄浘鐗囨枃浠剁瓑鏍煎紡骞跺瀛楁鐨勮浆鎹㈡垚鏁扮粍锛歔{name:'1.jpg',path:'127.0.0.1/ff/1.jpg'}]
+    isFile(item, formFields) {
+      if (
+        item.type == 'img' ||
+        item.columnType == 'img' ||
+        item.type == 'excel' ||
+        item.type == 'file'
+      ) {
+        this.convertFileToArray(item, formFields);
+        return true;
+      }
+      return false;
+    },
+    isReadonlyImgFile(item, formFields) {
+      if ((item.disabled || item.readonly) && this.isFile(item, formFields)) {
+        return true;
+      }
+      return false;
+    },
+    convertFileToArray(item, formFields) {
+      if (!item.maxFile) {
+        item.maxFile = 1; // 榛樿鍙兘涓婁紶涓�涓枃浠讹紝鍙互鍦╫nInit涓缃�
+      }
+
+      let fileInfo = formFields[item.field];
+      if (fileInfo instanceof Array) {
+        return;
+      }
+      if (fileInfo === null || fileInfo === undefined) {
+        formFields[item.field] = [];
+        return;
+      }
+      // 灏嗕互閫楀彿闅斿紑鐨勬枃浠跺垎鍓叉垚鏁扮粍127.0.0.1/aa/1.jpg,灏�127.0.0.1/aa/2.jpg
+      if (typeof fileInfo === 'string') {
+        if (fileInfo.trim() === '') {
+          formFields[item.field] = [];
+          return;
+        }
+        // 濡傛灉鏂囦欢璺緞鏄瓧绗︿覆锛屽垯浣跨敤锛屾媶鍒�
+        fileInfo = fileInfo.replace(/\\/g, '/');
+        let files = fileInfo.split(',');
+        formFields[item.field] = [];
+        for (let index = 0; index < files.length; index++) {
+          let file = files[index];
+          let splitFile = file.split('/');
+          formFields[item.field].push({
+            name: splitFile.length > 0 ? splitFile[splitFile.length - 1] : file,
+            path: file // this.base.isUrl(file) ? file : this.http.ipAddress + file,
+          });
+        }
+      }
+    },
+    dowloadFile(file) {
+      this.base.dowloadFile(
+        file.path,
+        file.name,
+        {
+          Authorization: this.$store.getters.getToken()
+        },
+        this.http.ipAddress
+      );
+    },
+    validatorPhone(ruleOption, value, callback) {
+      if (!ruleOption.required && !value && value != '0') {
+        return callback();
+      }
+      if (!rule.phone.test((value || '').trim())) {
+        return callback(new Error('璇疯緭鍏ユ纭殑鎵嬫満鍙�'));
+      }
+      callback();
+    },
+    validatorPwd(ruleOption, value, callback) {
+      if (!ruleOption.required && !value && value != '0') {
+        return callback();
+      }
+      if ((value + '').trim().length < 6) {
+        return callback(new Error('瀵嗙爜闀垮害涓嶈兘灏忎簬6浣�'));
+      }
+      callback();
+    },
+    convertArrayValue(data, val) {
+      // 2020.12.13澧炲姞琛ㄥ崟澶氶�夊彧杞崲瀛楀吀
+      // 缂栬緫澶氶�塼able鏄剧ず
+      //2023.04.20淇鍙涓簂abel鏃跺師鏁版嵁琚瓧鍏告浛鎹簡鐨勯棶棰�
+      let valArr = Array.isArray(val)
+        ? val.map((x) => {
+            return x;
+          })
+        : val.split(',');
+      for (let index = 0; index < valArr.length; index++) {
+        var _item = data.find((x) => {
+          return x.key && x.key != '0' && x.key + '' == valArr[index] + '';
+        });
+        if (_item) {
+          valArr[index] = _item.value;
+        }
+      }
+      return valArr.join(',');
+    },
+    getText(formFields, item) {
+      // 2019.10.24淇琛ㄥ崟select缁勪欢涓哄彧璇荤殑灞炴�ф椂娌℃湁缁戝畾鏁版嵁婧�
+      let text = formFields[item.field];
+      if (typeof text === 'function') return text(formFields);
+      if (text === 'null' || text === '' || text === null || text === undefined)
+        return '--';
+      //2021.03.02澧炲姞鍙鏃舵棩鏈熷鐞�
+      if (item.type == 'date') {
+        return text.replace('T', ' ').split(' ')[0];
+      }
+      //2021.03.31淇琛ㄥ崟switch鍙鏃舵病鏈夎浆鎹㈠�肩殑闂
+      if (item.type == 'switch') {
+        return text ? '鏄�' : '鍚�';
+      }
+      if (!item.data) return text;
+      if (item.type == 'selectList' || item.type == 'checkbox') {
+        return this.convertArrayValue(item.data, text);
+      }
+      var _item = item.data.find((x) => {
+        return x.key == text;
+      });
+      return _item ? _item.value : text;
+    },
+    onClear(item, formFields) {
+      // 杩滅▼select鏍囩娓呯┖閫夐」
+      item.data.splice(0);
+      // console.log(2);
+    },
+    onChange(item, value) {
+      if (item.onChange && typeof item.onChange === 'function') {
+        item.onChange(value, item);
+      }
+    },
+    onRemoteChange(item, value) {
+      // 绗簩娆℃墦寮�鏃讹紝榛樿鍊兼垚浜唘ndefined锛屽緟鏌iewgrid涓噸缃唬鐮�
+      if (value == undefined && item.data.length > 0) {
+        this.formFields[item.field] = item.data[0].key;
+        //  console.log('undefined');
+      }
+      this.remoteCall = false;
+      if (item.onChange && typeof item.onChange === 'function') {
+        item.onChange(value, item);
+      }
+    },
+    getData(item) {
+      return item.data;
+    },
+
+    // 杩滅▼鎼滅储(鎵撳紑寮瑰嚭妗嗘椂搴旇绂佹鎼滅储)
+    remoteSearch(item, formFields, val) {
+      if (!item.remote && !item.url) {
+        return;
+      }
+      if (
+        val == '' ||
+        (item.data.length == 1 &&
+          (val == item.data[0].key || val == item.data[0].value))
+      ) {
+        return;
+      }
+      // 寮瑰嚭妗嗘垨鍒濆鍖栬〃鍗曟椂缁檇ata璁剧疆鏁扮粍榛樿鍊�2
+      // 2020.09.26淇杩滅▼鎼滅储鑷畾涔塽rl涓嶈捣浣滅敤鐨勯棶棰�
+      let url;
+      if (typeof item.url === 'function') {
+        url = item.url(val, item.dataKey, item);
+      } else {
+        url =
+          (item.url || '/api/Sys_Dictionary/GetSearchDictionary') +
+          '?dicNo=' +
+          item.dataKey +
+          '&value=' +
+          val;
+      }
+      this.http.post(url).then((dicData) => {
+        //this.$set(item, "loading", false);
+        item.loading = false;
+        item.data = dicData;
+        this.formRules[item.point.x].splice(item.point.y, 1, item);
+      });
+    },
+    getObject(date) {
+      if (typeof date === 'object') {
+        return date;
+      }
+      return new Date(date);
+    },
+    reset(sourceObj) {
+      // 閲嶇疆琛ㄥ崟鏃讹紝绂佺敤杩滅▼鏌ヨ
+      this.$refs['volform'].resetFields();
+      if (this.rangeFields.length) {
+        this.rangeFields.forEach((key) => {
+          this.formFields[key].splice(0);
+          this.formFields[key] = [null, null];
+        });
+      }
+      if (!sourceObj) return;
+      for (const key in this.formFields) {
+        if (sourceObj.hasOwnProperty(key)) {
+          this.formFields[key] = sourceObj[key];
+          if (this.numberFields.indexOf(key) != -1) {
+            this.formFields[key] = sourceObj[key] * 1 || 0;
+          }
+        }
+      }
+      //  this.remoteCall = true;
+    },
+
+    fileOnChange(files, item) {
+      this.$refs.volform.clearValidate(item.field);
+      if (item.onChange) {
+        return item.onChange(files);
+      }
+      return true;
+    },
+    isReadonly(item) {
+      return item.readonly || item.disabled;
+    },
+    getRule(item, formFields) {
+      //2021.07.17澧炲姞鍙琛ㄥ崟涓嶉獙璇�
+      //range涓巗wtich鏆傛椂涓嶅仛鏍¢獙
+      if (
+        // item.readonly ||
+        // item.disabled ||
+        item.type == 'switch' ||
+        item.type == 'range'
+      )
+        return { required: false };
+      // 鐢ㄦ埛璁剧疆鐨勮嚜瀹氫箟鏂规硶
+      if (item.validator && typeof item.validator === 'function') {
+        return {
+          validator: (rule, val, callback) => {
+            // 鐢ㄦ埛鑷畾涔夌殑鏂规硶锛屽鏋滆繑鍥炰簡鍊硷紝鐩存帴鏄剧ず杩斿洖鐨勫�硷紝楠岃瘉涓嶉�氳繃
+            let message = item.validator(rule, val);
+            if (message) return callback(new Error(message + ''));
+            return callback();
+          },
+          required: item.required,
+          trigger: rule.change.indexOf(item.type) != -1 ? 'change' : 'blur'
+        };
+      }
+      if (['img', 'excel', 'file'].indexOf(item.type) != -1) {
+        return {
+          validator: (rule, val, callback) => {
+            //2021.09.05绉婚櫎鏂囦欢涓婁紶榛樿蹇呭~
+            if (
+              item.required &&
+              !this.isReadonly(item) &&
+              (!val || !val.length)
+            ) {
+              return callback(
+                new Error(item.type == 'img' ? '璇蜂笂浼犵収鐗�' : '璇蜂笂浼犳枃浠�')
+              );
+            }
+            return callback();
+          },
+          required: item.required,
+          trigger: 'change'
+        };
+      }
+      // 璁剧疆鏁板瓧鐨勬渶澶у�兼皯鏈�灏忓��
+      if (
+        item.type == 'number' ||
+        item.columnType == 'number' ||
+        item.columnType == 'int' ||
+        item.type == 'decimal'
+      ) {
+        // 濡傛灉鏄繀濉」鐨勬暟瀛楋紝璁剧疆涓�涓粯璁ゆ渶澶т笌鏈�鍊煎皬
+        if (item.required && typeof item.min !== 'number') {
+          item.min = 0; //item.type == "decimal" ? 0.1 : 1;
+        }
+
+        return {
+          required: item.required,
+          message: item.title + '鍙兘鏄暟瀛�',
+          title: item.title,
+          trigger: 'blur',
+          min: item.min,
+          max: item.max,
+          type: item.columnType || item.type,
+          validator: (ruleObj, value, callback) => {
+            if (!ruleObj.min && !ruleObj.max) {
+              if (ruleObj.required) {
+                if ((!value && value != '0') || !rule.decimal.test(value)) {
+                  return callback(new Error('鍙兘鏄暟瀛�'));
+                }
+              }
+              return callback();
+            }
+            if (this.isReadonly(item)) return callback();
+            if (ruleObj.type == 'number') {
+              if (!rule.number.test(value)) {
+                ruleObj.message = ruleObj.title + '鍙兘鏄暣鏁�';
+                return callback(new Error(ruleObj.message));
+              }
+            } else {
+              if (!rule.decimal.test(value)) {
+                ruleObj.message = ruleObj.title + '鍙兘鏄暟瀛�';
+                return callback(new Error(ruleObj.message));
+              }
+            }
+            if (
+              ruleObj.min !== undefined &&
+              typeof ruleObj.min === 'number' &&
+              value < ruleObj.min
+            ) {
+              ruleObj.message = ruleObj.title + '涓嶈兘灏忎簬' + ruleObj.min;
+              return callback(new Error(ruleObj.message));
+            }
+            if (
+              ruleObj.max !== undefined &&
+              typeof ruleObj.max === 'number' &&
+              value > ruleObj.max
+            ) {
+              ruleObj.message = ruleObj.title + '涓嶈兘澶т簬' + ruleObj.max;
+              return callback(new Error(ruleObj.message));
+            }
+            return callback();
+          }
+        };
+      }
+
+      // 鎵嬫満銆佸瘑鐮侀獙璇�
+      if (item.type == 'password' || item.type == 'phone') {
+        return {
+          validator:
+            item.type == 'phone' ? this.validatorPhone : this.validatorPwd,
+          required: item.required,
+          trigger: 'blur'
+        };
+      }
+
+      if (!item.required && item.type != 'mail') return { required: false };
+
+      if (!item.hasOwnProperty('type')) item.type = 'text';
+
+      if (inputTypeArr.indexOf(item.type) != -1) {
+        let message =
+          item.title +
+          (item.type == 'mail' ? '蹇呴』鏄竴涓偖绠卞湴鍧�' : '涓嶈兘涓虹┖');
+        let type = item.type == 'mail' ? 'email' : types[item.columnType];
+        let _rule = {
+          required: true,
+          message: message,
+          trigger: 'blur',
+          type: type,
+          validator: (ruleObj, value, callback) => {
+            if (
+              !this.isReadonly(item) &&
+              (value === '' || value === undefined || value === null)
+            ) {
+              return callback(new Error(ruleObj.message));
+            }
+            return callback();
+          }
+        };
+        if (item.type == 'mail') {
+          _rule.validator = undefined;
+          return _rule;
+        }
+        if (item.min) {
+          _rule.min = item.min;
+          _rule.message = item.title + '鑷冲皯' + item.min + '涓瓧绗�!';
+        }
+        if (item.max) {
+          return [
+            _rule,
+            {
+              max: item.max,
+              required: true,
+              message: item.title + '鏈�澶�' + item.max + '涓瓧绗�!',
+              trigger: 'blur'
+            }
+          ];
+        }
+        return _rule;
+      }
+
+      if (item.type == 'radio') {
+        return {
+          required: item.required,
+          message: '璇烽�夋嫨' + item.title,
+          trigger: 'change',
+          type: 'string'
+        };
+      }
+      if (
+        item.type == 'date' ||
+        item.type == 'datetime' ||
+        item.type == 'month' ||
+        item.type == 'time'
+      ) {
+        return {
+          required: true,
+          message: '璇烽�夋嫨' + item.title,
+          trigger: 'change',
+          type: item.range ? 'array' : 'string',
+          validator: (rule, val, callback) => {
+            if (this.isReadonly(item)) return callback();
+            // 鐢ㄦ埛鑷畾涔夌殑鏂规硶锛屽鏋滆繑鍥炰簡鍊硷紝鐩存帴鏄剧ず杩斿洖鐨勫�硷紝楠岃瘉涓嶉�氳繃
+            if (!val || (item.range && !val.length)) {
+              return callback(new Error('璇烽�夋嫨鏃ユ湡'));
+            }
+            return callback();
+          }
+        };
+      }
+
+      if (item.type == 'cascader') {
+        return {
+          type: 'array',
+          required: true,
+          min: item.min || 1,
+          // message: "璇烽�夋嫨" + item.title,
+          trigger: 'change',
+          validator: (rule, val, callback) => {
+            if (this.isReadonly(item)) return callback();
+            // 鐢ㄦ埛鑷畾涔夌殑鏂规硶锛屽鏋滆繑鍥炰簡鍊硷紝鐩存帴鏄剧ず杩斿洖鐨勫�硷紝楠岃瘉涓嶉�氳繃
+            let _arr = this.formFields[item.field];
+            if (!_arr || !_arr.length) {
+              return callback(new Error('璇烽�夋嫨' + item.title));
+            }
+            return callback();
+          }
+        };
+      }
+
+      if (
+        ['select', 'selectList', 'checkbox', 'cascader', 'treeSelect'].indexOf(
+          item.type
+        ) != -1
+      ) {
+        let _rule = {
+          type: item.type == 'select' ? 'string' : 'array',
+          required: true,
+          min: item.min || 1,
+          message: '璇烽�夋嫨' + item.title,
+          trigger: 'change',
+          validator: (rule, value, callback) => {
+            if (this.isReadonly(item)) return callback();
+            //2021.11.27淇澶氶�夋病鏈夋彁绀虹殑闂
+            if (value == undefined || value === '') {
+              return callback(new Error(rule.message));
+            } else if (
+              (item.type == 'checkbox' ||
+                item.type == 'selectList' ||
+                item.type == 'treeSelect') &&
+              (!(value instanceof Array) || !value.length)
+            ) {
+              return callback(new Error(rule.message));
+            }
+            return callback();
+          }
+        };
+
+        if (_rule.max) {
+          _rule.nax = item.max;
+          _rule.message = '鏈�澶氬彧鑳介�夋嫨' + item.max + '椤�';
+        }
+        return _rule;
+      }
+      return {};
+    },
+    compareDate(date1, date2) {
+      if (!date2) {
+        return true;
+      }
+      return (
+        date1.valueOf() <
+        (typeof date2 == 'number' ? date2 : new Date(date2).valueOf())
+      );
+    },
+    getDateOptions(date, item) {
+      //2021.07.17璁剧疆鏃堕棿鍙�夎寖鍥�
+      if ((!item.min && !item.max) || !date) {
+        return false;
+      }
+      if (item.min && item.min.indexOf(' ') == -1) {
+        //涓嶈缃椂鍒嗙锛屽悗闈細鑷姩鍔犱笂 08:00
+        item.min = item.min + ' 00:00:000';
+      }
+      return (
+        this.compareDate(date, item.min) || !this.compareDate(date, item.max)
+      );
+    },
+    getDateFormat(item) {
+      if (item.type == 'month') {
+        return 'YYYY-MM';
+      }
+      // if (item.type=='time') {
+      //     return 'HH:mm:ss'
+      // }
+      //瑙乭ttps://day.js.org/docs/zh-CN/display/format
+      return item.type == 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss';
+    },
+    dateRangeChange(val, item) {
+      if (!val) {
+        this.$emit('update:formFields');
+        return;
+      }
+      item.onChange && item.onChange(val);
+    },
+    onKeyPress($event, item) {
+      if ($event.keyCode == 13) {
+        return;
+      }
+      item.onKeyPress($event);
+    },
+    filterMethod(value, data) {
+      return data.label.includes(value);
+    },
+    getNode( label,node, data){
+      console.log(label)
+    }
+  }
+});
+</script>
+<style lang="less" scoped>
+.el-form-item {
+  margin-right: 0;
+}
+.el-form-item {
+  .form-imgs {
+    img {
+      float: left;
+      cursor: pointer;
+      object-fit: cover;
+      margin: 0 10px 10px 0;
+      width: 65px;
+      height: 65px;
+      border: 1px solid #c7c7c7;
+      overflow: hidden;
+      border-radius: 5px;
+      box-sizing: content-box;
+    }
+  }
+}
+.el-form-item ::v-deep(.el-form-item__label) {
+  padding: 0 0px 0 4px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.el-form-item ::v-deep(.el-range-separator) {
+  text-align: center;
+  width: 13px;
+  padding: 0px 1px;
+  font-size: 12px;
+}
+.el-form-item ::v-deep(.el-range__close-icon) {
+  margin-right: -10px;
+}
+.form-item-extra {
+  > *:first-child {
+    flex: 1;
+  }
+  display: flex;
+  .form-extra {
+    padding-left: 7px;
+    line-height: 36px;
+  }
+}
+.vol-form-item {
+  width: 100%;
+}
+.vol-form-item ::v-deep(.el-form-item__content) {
+  display: unset !important;
+}
+.vol-form-item ::v-deep(.el-input--large .el-input__inner) {
+  height: 34px !important;
+}
+.vol-form-item ::v-deep(.el-input-number--large .el-input-number__increase) {
+  border-top: 1px solid #d4d4d4;
+}
+.vol-form-item ::v-deep(.el-input-number--large .el-input-number__decrease) {
+  border-bottom: 1px solid #d4d4d4;
+}
+.vol-form-item ::v-deep(.el-input--large.el-date-editor) {
+  height: 36px;
+}
+.v-date-range ::v-deep(.el-input__prefix) {
+  display: none;
+}
+.v-date-range ::v-deep(.el-input__inner) {
+  padding: 0;
+}
+
+.el-form-item ::v-deep(.el-checkbox) {
+  margin-right: 8px;
+}
+.el-form-item ::v-deep(.el-checkbox .el-checkbox__label) {
+  padding-left: 5px;
+}
+.el-form-item ::v-deep(textarea) {
+  font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB',
+    'Microsoft YaHei', '寰蒋闆呴粦', Arial, sans-serif !important;
+}
+.el-form-item ::v-deep(.el-select .el-select__tags > span) {
+  display: flex;
+}
+.el-form-item ::v-deep(.el-select-v2__combobox-input) {
+  height: 30px;
+}
+.el-form-item ::v-deep(.el-select__tags) {
+  overflow: hidden;
+  height: 30px;
+}
+.el-form-item ::v-deep(.el-select-tags-wrapper) {
+  position: absolute;
+}
+
+.el-form-item {
+  vertical-align: top !important;
+}
+.form-file-list {
+  a {
+    color: #3ea9ff;
+  }
+  a:hover {
+    cursor: pointer;
+    color: #0281e7;
+  }
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolFormDraggable/VolFormDraggable.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolFormDraggable/VolFormDraggable.vue
new file mode 100644
index 0000000..de8b85f
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolFormDraggable/VolFormDraggable.vue
@@ -0,0 +1,1159 @@
+<template>
+  <div class="drag-container">
+    <!-- @start="onStart" -->
+    <div class="drag-left">
+      <div class="left-title">缁勪欢鍒楄〃</div>
+      <draggable
+        v-model="components"
+        @end="end1"
+        class="left-draggable-item"
+        :group="{ name: 'componentsGroup', pull: 'clone', put: false }"
+        animation="300"
+        @start="onStart"
+        :sort="false"
+        :move="onMove1"
+      >
+        <transition-group>
+          <div
+            :class="item.id == 1 ? 'item forbid' : 'item'"
+            v-for="item in components"
+            :key="item.id"
+          >
+            <i :class="item.icon"></i> {{ item.name }}
+          </div>
+        </transition-group>
+      </draggable>
+      <div class="example">
+        <div @click="example1">绀轰緥涓�<i class="el-icon-arrow-right"></i></div>
+        <div @click="example2">绀轰緥浜�<i class="el-icon-arrow-right"></i></div>
+        <div @click="example3">绀轰緥涓�<i class="el-icon-arrow-right"></i></div>
+      </div>
+    </div>
+
+    <div class="drag-center">
+      <div class="center-top">
+        <span>
+          <!-- <i class="el-icon-warning-outline"></i>楂樻晥鐨勮〃鍗曢厤缃� -->
+        </span>
+        <el-button type="primary" size="mini" plain @click="save"
+          ><i class="el-icon-check"> </i>淇濆瓨</el-button
+        >
+        <el-button type="primary" size="mini" plain @click="preview(true)"
+          ><i class="el-icon-view"> </i>棰勮</el-button
+        >
+        <el-button type="primary" size="mini" plain @click="download"
+          ><i class="el-icon-view"> </i>涓嬭浇</el-button
+        >
+        <el-button type="primary" @click="clearItems" size="mini" plain
+          ><i class="el-icon-delete"> </i>娓呯┖</el-button
+        >
+        <a
+          style="margin-left: 15px"
+          href="http://v2.volcore.xyz/document/api"
+          target="_blank"
+          >璁捐鍣ㄥ熀浜庢鏋秜olform銆乿oltable銆乿olupload銆乿olbox瀹氬埗寮�鍙�</a
+        >
+      </div>
+      <div>
+        <el-alert
+          title="鍏充簬琛ㄥ崟璁捐鍣�"
+          type="success"
+          :show-icon="true"
+          :closable="false"
+        >
+          <div>
+            1銆佽〃鍗曡璁″櫒鍩轰簬draggable寮�鍙�,涓烘湰妗嗘灦鑷畾涔夐〉闈㈠姛鑳界殑琛ュ厖,妗嗘灦浠嶄互鍙鍖栦唬鐮佺敓鎴愬櫒涓烘牳蹇�
+          </div>
+          <div>
+            2銆佹敮鎸佸彲瑙嗗寲璁捐1瀵�1銆�1瀵瑰鍙婅〃鍗曚笅鎷夋鑷姩缁戝畾銆乼able鑷姩鍔犺浇鏁版嵁(鍒嗛〉銆佺紪杈�)銆佽嚜鍔ㄤ笂浼犳枃浠躲�佸瘜鏂囨湰缂栬緫
+          </div>
+        </el-alert>
+      </div>
+      <el-scrollbar style="flex: 1">
+        <div class="tips" key="empty" v-show="!currentComponents.length">
+          璇峰皢宸﹁竟缁勪欢鎷栧叆姝ゅ鍣ㄤ腑
+        </div>
+        <el-form label-position="top">
+          <draggable
+            class="draggable-container"
+            v-model="currentComponents"
+            @end="end2"
+            animation="300"
+            :move="onMove"
+            group="componentsGroup"
+          >
+            <transition-group class="drag-center-item">
+              <div
+                class="item2"
+                :class="{ actived: index === currentIndex }"
+                @click="itemClick(item, index)"
+                :style="{ width: item.width + '%' }"
+                v-for="(item, index) in currentComponents"
+                :key="index"
+              >
+                <i
+                  class="el-icon-document-copy"
+                  @click.stop="copyItem(item)"
+                ></i>
+                <i class="el-icon-delete" @click.stop="removeItem(index)"> </i>
+                <el-form-item
+                  :required="item.required"
+                  label-position="top"
+                  style="width: 100%"
+                  :label="item.type == 'line' ? '' : item.name"
+                >
+                  <el-col>
+                    <!-- <div></div> -->
+                    <!-- {{ item.name }} -->
+                    <el-input
+                      v-if="item.type == 'text'"
+                      placeholder="璇疯緭鍏ュ唴瀹�"
+                      v-model="item.value"
+                      :disabled="item.readonly"
+                      size="medium"
+                    ></el-input>
+                    <el-input
+                      v-else-if="item.type == 'textarea'"
+                      type="textarea"
+                      v-model="item.value"
+                      :disabled="item.readonly"
+                      placeholder="璇疯緭鍏ュ唴瀹�"
+                    ></el-input>
+                    <el-date-picker
+                      v-else-if="item.type == 'date'"
+                      align="right"
+                      v-model="item.value"
+                      type="date"
+                      :disabled="item.readonly"
+                      size="medium"
+                      placeholder="閫夋嫨鏃ユ湡"
+                    >
+                    </el-date-picker>
+                    <el-radio-group
+                      :disabled="item.readonly"
+                      v-else-if="item.type == 'radio'"
+                      v-model="item.value"
+                    >
+                      <el-radio
+                        v-for="item in item.data"
+                        :key="item.key"
+                        :label="item.value"
+                        :value="item.key"
+                      >
+                      </el-radio>
+                      <!-- <el-radio :label="1">鏄�</el-radio>
+                      <el-radio :label="0">鍚�</el-radio> -->
+                    </el-radio-group>
+
+                    <el-checkbox-group
+                      v-model="item.values"
+                      :disabled="item.readonly"
+                      style="width: 100%; display: inline-block"
+                      v-else-if="item.type == 'checkbox'"
+                    >
+                      <el-checkbox
+                        v-for="item in item.data"
+                        :key="item.key"
+                        :label="item.value"
+                        :value="item.key"
+                      >
+                      </el-checkbox>
+                      <!-- <el-checkbox label="澶嶉�夋 A"></el-checkbox>
+                      <el-checkbox label="澶嶉�夋 B"></el-checkbox>
+                      <el-checkbox label="澶嶉�夋 C"></el-checkbox> -->
+                    </el-checkbox-group>
+
+                    <el-select
+                      style="width: 100%"
+                      :disabled="item.readonly"
+                      v-model="item.value"
+                      size="medium"
+                      v-else-if="item.type == 'select'"
+                      placeholder="璇烽�夋嫨"
+                    >
+                      <el-option
+                        v-for="item in item.data"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                      >
+                      </el-option>
+                    </el-select>
+                    <el-select
+                      style="width: 100%"
+                      :disabled="item.readonly"
+                      v-model="item.values"
+                      size="medium"
+                      :multiple="true"
+                      v-else-if="item.type == 'selectList'"
+                      placeholder="璇烽�夋嫨"
+                    >
+                      <el-option
+                        v-for="item in item.data"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                      >
+                      </el-option>
+                    </el-select>
+                    <el-cascader
+                      :disabled="item.readonly"
+                      style="width: 100%"
+                      v-else-if="item.type == 'cascader'"
+                      v-model="item.values"
+                      :options="item.data"
+                      @change="() => {}"
+                    ></el-cascader>
+
+                    <el-switch
+                      :disabled="item.readonly"
+                      v-model="item.value"
+                      style="width: 100%"
+                      v-else-if="item.type == 'switch'"
+                      active-color="#13ce66"
+                      inactive-color="#0e7ef3"
+                      :active-value="1"
+                      :inactive-value="0"
+                    >
+                    </el-switch>
+                    <div class="col-line" v-else-if="item.type == 'line'">
+                      {{ item.name }}
+                    </div>
+
+                    <vol-upload
+                      v-else-if="
+                        item.type == 'img' ||
+                        item.type == 'excel' ||
+                        item.type == 'file'
+                      "
+                      :fileInfo="item.fileInfo"
+                      :url="item.url"
+                      :img="item.type == 'img'"
+                      :excel="item.type == 'excel'"
+                      :multiple="item.multiple"
+                      :max-size="item.maxSize"
+                      :max-file="item.maxFile"
+                      :autoUpload="item.autoUpload"
+                    >
+                    </vol-upload>
+                    <vol-wang-editor
+                      v-else-if="item.type == 'editor'"
+                      :url="item.url"
+                      v-model="item.value"
+                      :height="item.height"
+                    ></vol-wang-editor>
+
+                    <vol-table
+                      v-else-if="item.type == 'table'"
+                      :url="item.url"
+                      :load-key="true"
+                      :index="item.edit"
+                      :tableData="item.tableData"
+                      :columns="item.columns"
+                      :height="item.height"
+                      :pagination-hide="true"
+                      :column-index="item.columnIndex"
+                      :ck="item.ck"
+                    ></vol-table>
+                    <el-button
+                      @click="model = true"
+                      v-else-if="item.type == 'box'"
+                      type="primary"
+                      size="small"
+                      >{{ item.name }}</el-button
+                    >
+                  </el-col>
+                </el-form-item>
+              </div>
+            </transition-group>
+          </draggable>
+        </el-form>
+      </el-scrollbar>
+    </div>
+    <div class="drag-right">
+      <div class="left-title">缁勪欢灞炴��</div>
+      <div class="attr" v-show="currentIndex != -1">
+        <div class="attr-item">
+          <div class="text">瀛楁鍚嶇О</div>
+          <el-input size="medium" v-model="currentItem.name" />
+        </div>
+        <div class="attr-item">
+          <div class="text">瀛楁(鍞竴瀛楁)</div>
+          <el-input size="medium" v-model="currentItem.field" />
+        </div>
+        <div class="attr-item" v-show="currentItem.type == 'table'">
+          <div class="text">鍚庡彴杩斿洖鏁版嵁鎺ュ彛鍦板潃</div>
+          <el-input
+            size="medium"
+            placeholder="渚�:api/琛ㄥ悕/getPageData"
+            v-model="currentItem.url"
+          />
+        </div>
+        <div
+          class="attr-item"
+          v-show="
+            currentItem.type != 'table' && currentItem.hasOwnProperty('url')
+          "
+        >
+          <div class="text">涓婁紶鎺ュ彛鍦板潃(鍚庡彴鎺ュ彛)</div>
+          <el-input
+            size="medium"
+            placeholder="鍙敤妗嗘灦鍦板潃:api/琛ㄥ悕/upload"
+            v-model="currentItem.url"
+          />
+          <div class="text" style="margin-top: 10px">鏂囦欢澶у皬闄愬埗(M)</div>
+          <el-input size="medium" v-model="currentItem.maxSize" />
+          <div class="text" style="margin-top: 10px">鏄惁澶氭枃浠朵笂浼�</div>
+          <el-switch
+            v-model="currentItem.multiple"
+            style="width: 100%"
+            active-color="#13ce66"
+            inactive-color="rgb(165 165 165)"
+            :active-value="true"
+            :inactive-value="false"
+          >
+          </el-switch>
+          <div class="text" style="margin-top: 10px">鏄惁鑷姩涓婁紶</div>
+          <el-switch
+            v-model="currentItem.autoUpload"
+            style="width: 100%"
+            active-color="#13ce66"
+            inactive-color="rgb(165 165 165)"
+            :active-value="true"
+            :inactive-value="false"
+          >
+          </el-switch>
+        </div>
+        <div class="attr-item" v-show="currentItem.data">
+          <div class="text">鏁版嵁婧�(涓嬫媺妗嗙粦瀹氳缃腑缁存姢)</div>
+
+          <!-- dicList -->
+          <el-select
+            style="width: 100%"
+            v-model="currentItem.key"
+            size="medium"
+            @change="dicChange"
+            placeholder="璇烽�夋嫨鏁版嵁婧愬瓧鍏�"
+          >
+            <el-option
+              v-for="item in dicList"
+              :key="item.key"
+              :label="item.value"
+              :value="item.key"
+            >
+            </el-option>
+          </el-select>
+        </div>
+        <div class="attr-item" v-show="currentItem.type != 'table'">
+          <div class="text">鏍囩瀹藉害</div>
+          <el-slider
+            style="width: 90%"
+            :min="20"
+            v-model="colWidth"
+            :step="10"
+            show-stops
+          >
+          </el-slider>
+        </div>
+        <div class="attr-item attr2" v-show="currentItem.type != 'table'">
+          <div>
+            <div class="text">蹇呭~</div>
+            <el-switch
+              v-model="currentItem.required"
+              style="width: 100%"
+              active-color="#13ce66"
+              inactive-color="rgb(165 165 165)"
+              :active-value="true"
+              :inactive-value="false"
+            >
+            </el-switch>
+          </div>
+
+          <div>
+            <!-- active-text="鏄�"
+              inactive-text="鍚�" -->
+            <div class="text">鍙</div>
+            <el-switch
+              v-model="currentItem.readonly"
+              style="width: 100%"
+              active-color="#13ce66"
+              inactive-color="rgb(165 165 165)"
+              :active-value="true"
+              :inactive-value="false"
+            >
+            </el-switch>
+          </div>
+        </div>
+        <div v-show="currentItem.type == 'table'">
+          <div class="attr-item">
+            <div class="text">鏄惁浣跨敤閫夐」鍗�(tabs)</div>
+            <div>
+              <el-switch
+                v-model="currentItem.tabs"
+                style="width: 100%"
+                active-text="鏄�"
+                inactive-text="鍚�"
+                active-color="#13ce66"
+                inactive-color="rgb(165 165 165)"
+                :active-value="true"
+                :inactive-value="false"
+              >
+              </el-switch>
+            </div>
+          </div>
+          <div class="attr-item attr2">
+            <el-button
+              style="width: 100%"
+              @click="openTableModel"
+              type="primary"
+              size="medium"
+              >table閰嶇疆</el-button
+            >
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <vol-box
+    v-model="model"
+    :height="300"
+    :width="550"
+    :lazy="true"
+    title="寮瑰嚭妗�"
+  >
+    <template #content>
+      <div>寮瑰嚭妗嗗唴瀹�</div>
+    </template>
+    <template #footer>
+      <div>
+        <el-button type="primary" size="mini" @click="model = false"
+          ><i class="el-icon-close"></i>鐐瑰嚮鍏抽棴</el-button
+        >
+        <el-button size="mini" @click="model = false"
+          ><i class="el-icon-close"></i>鍏抽棴</el-button
+        >
+      </div>
+    </template>
+  </vol-box>
+
+  <vol-box
+    v-model="previewModel"
+    :height="600"
+    :width="1300"
+    :lazy="true"
+    :padding="1"
+    :close="false"
+    title="棰勮"
+  >
+    <preview style="height:600px" :options="viewFormData"></preview>
+  </vol-box>
+
+  <vol-box
+    v-model="tableModel"
+    :height="600"
+    :width="1300"
+    :lazy="true"
+    :padding="0"
+    :title="currentItem.name"
+  >
+    <template #content>
+      <div style="height:600px" >
+      <el-alert title="鍏充簬table閰嶇疆" type="info" :closable="false" show-icon>
+        姝ゅtable鏄妗嗘灦voltable鍩烘湰鎿嶄綔鐨勯厤缃�,濡傛灉闇�瑕佷簨浠惰Е鍙戙�佹暟鎹姞杞界瓑鏇村鍔熻兘锛岃鍦ㄧ敓鎴愬悗鐨勪唬鐮佹坊鍔犻渶瑕佺殑鍔熻兘锛屽畬鏁撮厤缃鏂囨。<a
+          href="http://v2.volcore.xyz/document/api"
+          style="color: #1e88e5; margin-left: 9px"
+          target="_blank"
+          >voltable</a
+        >
+      </el-alert>
+      <div class="btns">
+        <div class="btns-left">
+          琛ㄦ牸榛樿鍔熻兘鎸夐挳锛�
+          <el-checkbox
+            v-for="item in currentItem.buttons"
+            :label="item.name"
+            :key="item.name"
+            >{{ item.name }}</el-checkbox
+          >
+        </div>
+        <div class="btns-right">
+          <el-button type="primary" size="mini" @click="addRow"
+            ><i class="el-icon-plus"></i>娣诲姞瀛楁</el-button
+          >
+          <el-button type="primary" size="mini" @click="delRow"
+            ><i class="el-icon-delete"></i>鍒犻櫎瀛楁</el-button
+          >
+          <el-button type="primary" size="mini" @click="sortRow"
+            ><i class="el-icon-sort"></i>閲嶆柊鎺掑垪</el-button
+          >
+        </div>
+      </div>
+      <vol-table
+        :load-key="true"
+        :tableData="currnetTableData"
+        :columns="currentTableOption"
+        :height="448"
+        ref="table"
+        :index="true"
+        :pagination-hide="true"
+        :column-index="true"
+        :ck="true"
+      ></vol-table>
+    </div>
+    </template>
+    <template #footer>
+      <div style="text-align: center">
+        <el-button size="mini" @click="tableModel = false"
+          ><i class="el-icon-close"></i>鍏抽棴</el-button
+        >
+        <el-button type="primary" size="mini" @click="saveConfigOptions"
+          ><i class="el-icon-check"></i>淇濆瓨</el-button
+        >
+      </div>
+    </template>
+  </vol-box>
+</template>
+
+<script>
+import { h, resolveComponent } from "vue";
+// import draggable from "vuedraggable";
+import { VueDraggableNext } from "vue-draggable-next";
+import VolWangEditor from "@/components/editor/VolWangEditor.vue";
+import VolUpload from "./../VolUpload";
+import VolTable from "./../VolTable";
+import VolBox from "./../VolBox";
+import VolFormPreview from "./VolFormPreview";
+import { components, tableOption } from "./options";
+import { options1, options2, options3 } from "./formTemplate";
+import downloadForm from "./DownloadForm";
+export default {
+  props: {
+    userComponents: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+  },
+  components: {
+    draggable: VueDraggableNext,
+    "vol-upload": VolUpload,
+    "vol-wang-editor": VolWangEditor,
+    "vol-table": VolTable,
+    "vol-box": VolBox,
+    preview: VolFormPreview,
+  },
+  data() {
+    return {
+      options:{},
+      options1: options1,
+      options2: options2,
+      options3: options3,
+      colWidth: 100,
+      currentIndex: -1,
+      currentItem: {},
+      currnetTableData: [],
+      currentTableOption: tableOption,
+      //瀹氫箟瑕佽鎷栨嫿瀵硅薄鐨勬暟缁�
+      components: components,
+      currentComponents: [],
+      dicList: [],
+      model: false,
+      tableModel: false,
+      previewModel: false,
+      viewFormData: { fields: {}, formOptions: [], tables: [] },
+    };
+  },
+  watch: {
+    colWidth(newVal) {
+      if (this.currentIndex != -1) {
+        this.currentComponents[this.currentIndex].width = newVal;
+      }
+    },
+    userComponents: {
+      handler(newVal) {
+        this.currentComponents = newVal;
+      },
+      immediate: true,
+      deep: true,
+    },
+  },
+  created() {
+    this.currentComponents = this.userComponents;
+    this.http
+      .post("api/Sys_Dictionary/GetBuilderDictionary", {}, false)
+      .then((x) => {
+        this.dicList = x.map((c) => {
+          return { key: c, value: c };
+        });
+      });
+  },
+  methods: {
+    getFormOptions(item) {
+      let _option = {};
+      _option.field = item.field;
+      _option.title = item.name;
+      _option.type = item.type;
+      _option.required = item.required;
+      _option.readonly = item.readonly;
+      if (item.type == "line") {
+        _option.title = "";
+        let title = item.name;
+        _option.render = (h) => {
+          return h(
+            "div",
+            {
+              style: {
+                "line-height": "25px",
+                "font-weight": "bold",
+                "margin-left": "15px",
+                "border-bottom": "1px solid #dadada",
+              },
+            },
+            title
+            //涔熷彲浠ュ湪杩欓噷鏀句竴浜涚粍浠讹紝渚嬪锛�
+            // resolveComponent("el-tooltip"),
+            // {
+            //   content: "杩欓噷鏄彁绀虹殑鍐呭",
+            //   props: { effect: "dark", placement: "top-start" },
+            //   style: {},
+            // },
+            // [h("a", { style: { color: "#2a92ff" } }, "鎻愮ず淇℃伅")]
+          );
+        };
+      }
+      if (item.type == "editor") {
+        _option.height = item.height;
+      }
+      if (item.width == 100) {
+        _option.colSize = 12;
+      } else {
+        _option.colSize = (_option.width * 12) / 100;
+      }
+      if (["img", "excel", "file"].indexOf(item.type) != -1) {
+        _option.maxSize = item.maxSize;
+        _option.fileInfo = item.fileInfo;
+        _option.multiple = item.multiple;
+        _option.autoUpload = item.autoUpload;
+        _option.maxFile = item.maxFile;
+      }
+      if (
+        ["img", "excel", "file", "editor", "table"].indexOf(item.type) != -1
+      ) {
+        _option.url = item.url;
+      }
+      if (item.data) {
+        _option.data = item.data;
+        _option.dataKey = item.key;
+      }
+      return _option;
+    },
+    getLineFormOptions(index) {
+      let _index = index;
+      let endIndex = index;
+      let width = 0;
+      let _options = [];
+      for (index; index < this.filterCurrentComponents().length; index++) {
+        const item = this.currentComponents[index];
+        if (item.width + width <= 100) {
+          width = item.width + width;
+          endIndex = index;
+          _options.push(this.getFormOptions(item));
+        }
+      }
+      return { options: _options, index: _index, endIndex: endIndex };
+    },
+    filterCurrentComponents() {
+      return this.currentComponents.filter((x) => {
+        return x.type != "table";
+      });
+    },
+    setSpan() {},
+    preview(isPre) {
+      let _fields = {};
+      let _formOptions = [];
+      let endIndex = -1;
+      this.filterCurrentComponents().forEach((item, index) => {
+        if (item.hasOwnProperty("values")) {
+          _fields[item.field] = [];
+        } else {
+          _fields[item.field] = null;
+        }
+
+        if (item.width == 100) {
+          _formOptions.push([this.getFormOptions(item)]);
+        } else {
+          if (endIndex == -1) {
+            let lineOptions = this.getLineFormOptions(index);
+            endIndex = lineOptions.endIndex;
+            _formOptions.push(lineOptions.options);
+            endIndex--;
+          } else {
+            endIndex--;
+          }
+        }
+        // _fields[item.field] = null;xc
+        // let _option = {};
+        // _option.field = item.field;
+        // _option.title = item.name;
+        // _option.type = item.type;
+        // _option.required = item.required;
+        // _option.readonly = item.readonly;
+        // if (["img", "excel", "file"].indexOf(item.type) != -1) {
+        //   _option.maxSize = item.maxSize;
+        //   _option.fileInfo = item.fileInfo;
+        //   _option.multiple = item.multiple;
+        //   _option.autoUpload = item.autoUpload;
+        //   _option.maxFile = item.maxFile;
+        // }
+        // if (
+        //   ["img", "excel", "file", "editor", "table"].indexOf(item.type) != -1
+        // ) {
+        //   _option.url = item.url;
+        // }
+        // if (item.data) {
+        //   _option.data = item.data;
+        //   _option.dataKey = item.key;
+        // }
+        // _formOptions.push(_option);
+      });
+      this.viewFormData.fields = _fields;
+      // console.log(JSON.stringify(_formOptions))
+      this.viewFormData.formOptions = _formOptions;
+      if (isPre) {
+        this.previewModel = true;
+      }
+      let tableIndex = 0;
+      let keys = [];
+      let tables = this.currentComponents
+        .filter((x) => {
+          return x.type == "table";
+        })
+        .map((m) => {
+          m.pagination = !m.url;
+          if (m.name == "琛ㄦ牸") {
+            tableIndex++;
+          }
+          return {
+            name: m.name + (m.name == "琛ㄦ牸" ? tableIndex : ""),
+            url: m.url,
+            tabs: m.tabs,
+            pagination: m.pagination,
+            buttons: m.buttons,
+            columns: m.columns.map((c) => {
+              let obj = {
+                title: c.title,
+                field: c.field,
+                hidden: !c.show,
+                width: c.width,
+                required: c.required,
+              };
+
+              if (c.dataSource) {
+                obj.bind = { key: c.dataSource, data: [] };
+              }
+              if (c.dataSource) {
+                keys.push(c.dataSource);
+              }
+              if (c.edit) {
+                if (!obj.bind) {
+                  obj.bind = { key: "", data: [] };
+                }
+                obj.edit = { type: c.editType };
+              }
+              return obj;
+            }),
+            tableData: [{}, {}, {}],
+          };
+        });
+      this.viewFormData.tables = tables.filter((x) => {
+        return !x.tabs;
+      });
+      this.viewFormData.tabs = tables.filter((x) => {
+        return x.tabs;
+      });
+      this.getDicKeys(keys);
+          this.options = this.viewFormData;
+    },
+    getDicKeys(keys) {
+      if (!keys.length) {
+        return;
+      }
+      debugger
+      this.http
+        .post("api/Sys_Dictionary/GetVueDictionary", keys, true)
+        .then((result) => {
+          result.forEach((c) => {
+            this.viewFormData.tables.forEach((t) => {
+              let _option = t.columns.find((x) => {
+                return x.bind && x.bind.key == c.dicNo;
+              });
+              if (_option) {
+                _option.bind.data = c.data;
+              }
+            });
+            this.viewFormData.tabs.forEach((t) => {
+              let _option = t.columns.find((x) => {
+                return x.bind && x.bind.key == c.dicNo;
+              });
+              if (_option) {
+                _option.bind.data = c.data;
+              }
+            });
+          });
+        });
+    },
+    save() {
+      this.preview(false);
+      this.$emit("save", {
+        daraggeOptions: this.currentComponents,
+        formOptions: this.viewFormData,
+      });
+    },
+    download() {
+      this.preview(false);
+      downloadForm.call(this);
+    },
+    openTableModel() {
+      let dataSource = this.currentTableOption.find((x) => {
+        return x.field == "dataSource";
+      });
+      if (!dataSource.bind.data.length) {
+        dataSource.bind.data = this.dicList;
+      }
+      this.currnetTableData = JSON.parse(
+        JSON.stringify(this.currentItem.columns)
+      );
+      this.tableModel = true;
+    },
+    addRow() {
+      this.currnetTableData.push({ field: this.getField() });
+    },
+    delRow() {
+      this.$confirm("纭瑕佸垹闄ら�夋嫨鐨勬暟鎹悧?", "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+        center: true,
+      }).then(() => {
+        this.$refs.table.delRow();
+      });
+    },
+    sortRow() {
+      this.currnetTableData = this.currnetTableData.sort((a, b) => {
+        return a.orderNo - b.orderNo;
+      }); //.reverse();
+      this.$Message.success("鍒楁樉绀洪『搴忓凡閲嶆柊鎺掑垪,鐐瑰嚮棰勮鍙煡鐪�");
+    },
+    saveConfigOptions() {
+      this.currentItem.columns = JSON.parse(
+        JSON.stringify(this.currnetTableData)
+      );
+      this.tableModel = false;
+    },
+    copyItem(item) {
+      let itemClone = JSON.parse(JSON.stringify(item));
+      itemClone.field = "field" + new Date().valueOf();
+      this.currentComponents.push(itemClone);
+    },
+    removeItem(index) {
+      this.currentComponents.splice(index, 1);
+      this.colWidth = 100;
+      this.currentIndex = -1;
+      this.currentItem = {};
+    },
+    clearItems() {
+      this.currentComponents.length = 0;
+      this.colWidth = 100;
+      this.currentIndex = -1;
+      this.currentItem = {};
+    },
+    itemClick(item, index) {
+      this.currentIndex = index;
+      this.colWidth = this.currentComponents[this.currentIndex].width;
+      this.currentItem = this.currentComponents[this.currentIndex];
+    },
+    //寮�濮嬫嫋鎷戒簨浠�
+    onStart(e, e1) {
+      this.drag = true;
+    },
+    getField() {
+      return "field" + new Date().valueOf();
+    },
+    //宸﹁竟寰�鍙宠竟鎷栧姩鏃剁殑浜嬩欢
+    end1(e) {
+      if (1 == 1 && e.from !== e.to) {
+        let obj = JSON.parse(JSON.stringify(this.components[e.oldIndex]));
+        obj.field = this.getField();
+        obj.width = 100;
+        obj.readonly = false;
+        obj.required = false;
+        this.currentComponents.splice(e.newIndex, 1, obj);
+        this.userComponents.splice(0);
+        this.userComponents.push(...this.currentComponents);
+        // this.currentComponents = this.currentComponents.filter((x) => {
+        //   return x.hasOwnProperty("field");
+        // });
+        this.colWidth = 100;
+        this.currentIndex = e.newIndex; //this.currentComponents.length - 1;
+        this.currentItem = this.currentComponents[this.currentIndex];
+      }
+    },
+    //鍙宠竟寰�宸﹁竟鎷栧姩鏃剁殑浜嬩欢
+    end2(e) {},
+    onMove1(e, originalEvent) {
+      // this.moveId = e.relatedContext.element.id;
+      return true;
+    },
+    //move鍥炶皟鏂规硶
+    onMove(e, originalEvent) {
+      console.log(JSON.stringify(this.currentComponents));
+      return true;
+    },
+    dicChange(key) {
+      debugger
+      this.http
+        .post("api/Sys_Dictionary/GetVueDictionary", [key], true)
+        .then((result) => {
+          this.currentItem.data = result[0].data;
+          if (result[0].data.length) {
+            if (this.currentItem.type == "select") {
+              this.currentItem.value = result[0].data[0].value;
+            } else {
+              this.currentItem.values = [result[0].data[0].value];
+            }
+          }
+        });
+    },
+    example1() {
+      this.currentComponents = this.options1;
+    },
+    example2() {
+      this.currentComponents = this.options2;
+    },
+    example3() {
+      this.currentComponents = this.options3;
+    },
+  },
+  computed: {
+    tabsTable() {
+      return this.currentComponents.filter((x) => {
+        return x.type == "table" && x.tabs == true;
+      });
+    },
+  },
+};
+</script>
+<style lang="less" scoped>
+* {
+  box-sizing: border-box;
+}
+.drag-container {
+  /* padding: 20px; */
+  display: flex;
+  height: 100%;
+  position: absolute;
+  width: 100%;
+  box-sizing: border-box;
+}
+.drag-left {
+  width: 250px;
+  display: flex;
+  border-right: 1px solid #eee;
+  flex-direction: column;
+}
+.left-title {
+  height: 42px;
+  text-align: left;
+  border-right: 1px solid #eee;
+  padding: 10px 0 10px 11px;
+  border-bottom: 1px solid #eee;
+}
+.drag-center {
+  display: flex;
+  flex-direction: column;
+  flex: 1;
+}
+.left-draggable-item {
+  //   flex: 1;
+  display: inline-block;
+  padding: 5px;
+  //   border-right: 1px solid #eee;
+}
+
+.left-draggable-item .item {
+  cursor: move;
+  float: left;
+  width: 111px;
+  /* height: 20px; */
+  text-align: center;
+  border: 1px solid #eeeeee;
+  padding: 2px 13px;
+  text-align: left;
+  line-height: 28px;
+  margin: 4px;
+  border-radius: 3px;
+  background: #f0f9eb;
+  font-size: 13px;
+}
+// .drag-center-item {
+//   display: inline-block;
+//   width: 100%;
+//   height: calc(100vh - 122px);
+//   padding: 10px;
+// }
+.draggable-container {
+  display: inline-block;
+  width: 100%;
+  height: calc(100vh - 215px);
+  padding: 10px 0;
+}
+
+.item2 {
+  position: relative;
+  cursor: move;
+  padding: 18px 10px 10px 10px;
+  text-align: left;
+  float: left;
+  margin-bottom: 10px;
+}
+.item2 .el-icon-delete,
+.item2 .el-icon-document-copy {
+  position: absolute;
+  right: 10px;
+  top: 2px;
+  padding: 5px;
+  display: none;
+  color: red;
+  cursor: pointer;
+}
+.item2 .el-icon-document-copy {
+  right: 35px;
+}
+.item2:hover,
+.actived {
+  background: #f0f9eb;
+}
+.item:hover {
+  border: 1px dashed #787be8;
+  color: #787be8;
+}
+.item2:hover .el-icon-delete,
+.item2:hover .el-icon-document-copy {
+  display: block;
+}
+
+.drag-right {
+  background: #f7fbff3d;
+  width: 250px;
+  border-left: 1px solid #eee;
+}
+
+.center-top {
+  height: 42px;
+  line-height: 41px;
+  background: #f2f5fb;
+  border-bottom: 1px solid #eee;
+  text-align: left;
+  padding: 0 10px;
+  font-size: 12px;
+  color: #3391f3;
+}
+.center-top span {
+  margin-right: 10px;
+}
+.attr {
+  padding: 0px 15px 15px 15px;
+}
+.attr-item {
+  text-align: left;
+  margin-top: 12px;
+  font-size: 14px;
+}
+.attr-item .text {
+  padding: 0 0 5px 5px;
+}
+.attr2 {
+  display: flex;
+}
+.attr2 > div {
+  flex: 1;
+}
+.tips {
+  position: absolute;
+  font-size: 26px;
+  letter-spacing: 6px;
+  left: 0px;
+  right: 0px;
+  top: 150px;
+  width: 500px;
+  margin: auto;
+  color: #c5c5c5;
+}
+.col-line {
+  line-height: 25px;
+  font-weight: bold;
+  border-bottom: 1px solid rgb(218 218 218);
+}
+.drag-container ::v-deep(.el-col) {
+  width: 100%;
+}
+.drag-center ::v-deep(.el-form-item__label) {
+  line-height: 0 !important;
+}
+.drag-center ::v-deep(.el-scrollbar__wrap) {
+  overflow-x: hidden;
+}
+.drag-center ::v-deep(.el-form-item) {
+  margin-bottom: 10px;
+}
+.drag-center ::v-deep(.el-date-editor) {
+  width: 100%;
+}
+.drag-center ::v-deep(.el-checkbox) {
+  margin-right: 15px;
+}
+.drag-center ::v-deep(.el-checkbox__label) {
+  padding-left: 5px;
+}
+.drag-center ::v-deep(.hello > div) {
+  z-index: 500 !important;
+}
+.drag-center ::v-deep(th),
+.drag-center ::v-deep(td) {
+  padding: 6px 0;
+}
+.example {
+  margin-top: 8px;
+  > div {
+    cursor: pointer;
+    padding: 14px 20px;
+    border-top: 1px solid #eee;
+    font-size: 13px;
+    color: #646465;
+    position: relative;
+  }
+  > div:hover {
+    background: rgb(231, 231, 231);
+  }
+  i {
+    position: absolute;
+    right: 20px;
+  }
+}
+.btns {
+  padding: 8px 0;
+  display: flex;
+  > div {
+    flex: 1;
+  }
+  .btns-left {
+    padding-top: 8px;
+    color: black;
+    font-weight: bold;
+  }
+  .btns-right {
+    text-align: right;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolFormDraggable/VolFormPreview.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolFormDraggable/VolFormPreview.vue
new file mode 100644
index 0000000..7d8aa93
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolFormDraggable/VolFormPreview.vue
@@ -0,0 +1,206 @@
+<template>
+  <div style="padding: 15px 20px 15px 5px">
+    <div class="pre-text">{{ text }}</div>
+    <vol-form
+      ref="form"
+      :labelWidth="80"
+      :load-key="false"
+      :formFields="options.fields"
+      :formRules="options.formOptions"
+    >
+    </vol-form>
+    <div class="tables">
+      <div
+        class="table-item"
+        v-for="(item, index) in options.tables"
+        :key="index"
+      >
+        <div class="table-header">
+          <div class="header-text">
+            {{ item.name }}
+          </div>
+          <div class="header-btns">
+            <el-button
+              type="primary"
+              size="small"
+              :key="bindex"
+              plain
+              @click="tableBtnClick(item, bindex, index)"
+              :icon="btnItem.icon"
+              v-for="(btnItem, bindex) in item.buttons"
+            >
+              {{ btnItem.name }}
+            </el-button>
+          </div>
+        </div>
+        <vol-table
+          :url="item.url"
+          :load-key="false"
+          :index="true"
+          :ref="'table' + index"
+          :tableData="item.tableData"
+          :columns="item.columns"
+          :max-height="250"
+          :pagination-hide="item.pagination"
+          :column-index="true"
+          :ck="true"
+        ></vol-table>
+      </div>
+    </div>
+
+    <div class="tables" style="padding-bottom: 10px">
+      <el-tabs
+        v-model="tabsModel"
+        v-show="options.tabs.length"
+        @tab-click="() => {}"
+      >
+        <el-tab-pane
+          style="padding: 0"
+          class="table-item"
+          v-for="(item, index) in options.tabs"
+          :label="item.name"
+          :name="index"
+          :key="index"
+        >
+          <div class="table-header">
+            <div class="header-text">
+              {{ item.name }}
+            </div>
+            <div class="header-btns">
+              <el-button
+                type="primary"
+                size="small"
+                :key="bindex"
+                :icon="btnItem.icon"
+                plain
+                @click="tabsTableBtnClick(item, bindex, index)"
+                v-for="(btnItem, bindex) in item.buttons"
+              >
+                {{ btnItem.name }}
+              </el-button>
+            </div>
+          </div>
+          <vol-table
+            :url="item.url"
+            :load-key="false"
+            :index="true"
+            :ref="'tabsTable' + index"
+            :tableData="item.tableData"
+            :columns="item.columns"
+            :max-height="250"
+            :pagination-hide="item.pagination"
+            :column-index="true"
+            :ck="true"
+          ></vol-table>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+
+    <div class="form-btns">
+      <el-button type="primary" @click="submit" icon="el-icon-check" size="small"
+        >鎻愪氦</el-button
+      >
+      <el-button
+        type="primary"
+        @click="reset"
+        plain
+        icon="el-icon-refresh-right"
+        size="small"
+        >閲嶇疆</el-button
+      >
+      <el-button
+        type="primary"
+        @click="download"
+        plain
+        icon="el-icon-refresh-right"
+        size="small"
+        >涓嬭浇浠g爜</el-button
+      >
+    </div>
+  </div>
+</template>
+
+<script>
+import VolTable from "./../VolTable";
+import VolBox from "./../VolBox";
+import VolForm from "./../VolForm";
+import downloadForm from "./DownloadForm";
+export default {
+  props: {
+    options: {
+      type: Object,
+      default: () => {
+        return { fields: {}, formOptions: [], tables: [], tabs: [] };
+      },
+    },
+  },
+  data() {
+    return {
+      text: "",
+      tabsModel: 0,
+    };
+  },
+  created() {},
+  methods: {
+    tableBtnClick(item, btnIndex, index) {
+      if (item.buttons[btnIndex].value == "add") {
+        this.$refs["table" + index].addRow({});
+        return;
+      }
+      if (item.buttons[btnIndex].value == "del") {
+        this.$refs["table" + index].delRow();
+        return;
+      }
+    },
+    tabsTableBtnClick(item, btnIndex, index) {
+      if (item.buttons[btnIndex].value == "add") {
+        this.$refs["tabsTable" + index].addRow({});
+        return;
+      }
+      if (item.buttons[btnIndex].value == "del") {
+        this.$refs["tabsTable" + index].delRow();
+        return;
+      }
+    },
+    submit() {},
+    reset() {
+      this.$refs.form.reset();
+      this.$Message.success("琛ㄥ崟宸查噸缃�");
+    },
+    download() {
+      downloadForm.call(this);
+    },
+  },
+  components: {
+    "vol-table": VolTable,
+    "vol-box": VolBox,
+    "vol-form": VolForm,
+  },
+};
+
+VolForm;
+</script>
+<style lang="less" scoped>
+.form-btns {
+  text-align: center;
+}
+.tables {
+  padding-left: 15px;
+  .table-item {
+    padding: 10px;
+  }
+  .table-header {
+    display: flex;
+    margin-bottom: 8px;
+  }
+  .header-text {
+    position: relative;
+    bottom: -9px;
+    flex: 1;
+    font-weight: bold;
+  }
+  .header-btns {
+    text-align: right;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolHeader.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolHeader.vue
new file mode 100644
index 0000000..cbe64e7
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolHeader.vue
@@ -0,0 +1,67 @@
+<template>
+  <div class="v-header">
+    <div class="v-left-text">
+      <!-- <i size="20" :class="icon" class="h-icon"/> -->
+      <span>{{ title || text }}</span>
+    </div>
+    <div class="content">
+      <slot name="content"></slot>
+    </div>
+    <div class="v-right-content">
+      <slot></slot>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    icon: {
+      type: String,
+      default: ''
+    },
+    title: {
+      type: String,
+      default: ''
+    },
+    text: {
+      type: String,
+      default: '鏈畾涔夊悕绉�'
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+.v-header {
+  display: flex;
+  border-bottom: 1px solid #dcdee2;
+  .v-left-text {
+    margin-top: 3px;
+    padding-bottom: 6px;
+    font-weight: bold;
+    font-size: 15px;
+    color: #484848;
+    white-space: nowrap;
+    border-bottom: 2px solid #676767;
+    margin-bottom: -1px;
+    letter-spacing: 1px;
+    > span {
+      position: relative;
+      top: 2px;
+    }
+  }
+  .content {
+    line-height: 25px;
+    padding-left: 10px;
+    padding: 6px 0 0 10px;
+  }
+  .v-right-content {
+    flex: 1;
+    text-align: right;
+  }
+  .h-icon {
+    position: relative;
+    top: 2px;
+    margin-right: 3px;
+  }
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolTable.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolTable.vue
new file mode 100644
index 0000000..af51360
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolTable.vue
@@ -0,0 +1,1873 @@
+<template>
+  <!-- 2021.11.18绉婚櫎voltable鏂规硶@cell-mouse-leave="rowEndEdit" -->
+  <div
+    class="vol-table"
+    :class="[
+      textInline ? 'text-inline' : '',
+      fxRight ? 'fx-right' : '',
+      isChrome ? 'chrome' : '',
+    ]"
+  >
+    <div class="mask" v-show="loading"></div>
+    <div class="message" v-show="loading">鍔犺浇涓�.....</div>
+    <el-table
+      :show-summary="summary"
+      :summary-method="getSummaryData"
+      :row-key="rowKey"
+      :key="randomTableKey"
+      lazy
+      stripe
+      :load="loadTreeChildren"
+      @select="userSelect"
+      @select-all="userSelect"
+      @selection-change="selectionChange"
+      @row-dblclick="rowDbClick"
+      @row-click="rowClick"
+      @header-click="headerClick"
+      :highlight-current-row="highlightCurrentRow"
+      ref="table"
+      class="v-table"
+      @sort-change="sortChange"
+      tooltip-effect="dark"
+      :height="realHeight"
+      :max-height="realMaxHeight"
+      :data="url ? rowData : tableData"
+      border
+      :row-class-name="initIndex"
+      :cell-style="getCellStyle"
+      style="width: 100%"
+      :scrollbar-always-on="true"
+    >
+      <el-table-column
+        v-if="ck"
+        type="selection"
+        :fixed="fixed"
+        :selectable="selectable"
+        width="55"
+      ></el-table-column>
+      <el-table-column
+        v-if="columnIndex"
+        type="index"
+        :fixed="fixed"
+        width="55"
+      ></el-table-column>
+
+      <!-- 2020.10.10绉婚櫎table绗竴琛屽己鍒舵帓搴� -->
+      <el-table-column
+        v-for="(column, cindex) in filterColumns"
+        :prop="column.field"
+        :label="column.title"
+        :min-width="column.width"
+        :formatter="formatter"
+        :fixed="column.fixed"
+        :key="column.field + cindex"
+        :align="column.align"
+        :sortable="column.sort ? 'custom' : false"
+        :show-overflow-tooltip="true"
+      >
+        <template #header>
+          <span
+            v-if="(column.require || column.required) && column.edit"
+            class="column-required"
+            >*</span
+          >{{ column.title }}
+        </template>
+
+        <template #default="scope">
+          <!-- 2022.01.08澧炲姞澶氳〃澶达紝鐜板湪鍙敮鎸佸父鐢ㄥ姛鑳芥覆鏌擄紝涓嶆敮鎸佺紪杈戝姛鑳�(娑夊強鍒扮粍浠堕噸鍐�) -->
+          <el-table-column
+            style="border: none"
+            v-for="columnChildren in filterChildrenColumn(column.children)"
+            :key="columnChildren.field"
+            :min-width="columnChildren.width"
+            :class-name="columnChildren.class"
+            :prop="columnChildren.field"
+            :align="columnChildren.align"
+            :label="columnChildren.title"
+          >
+            <template #default="scopeChildren">
+              <a
+                href="javascript:void(0)"
+                style="text-decoration: none"
+                @click="link(scopeChildren.row, columnChildren, $event)"
+                v-if="column.link"
+                v-text="scopeChildren.row[columnChildren.field]"
+              ></a>
+              <div
+                v-else-if="columnChildren.formatter"
+                @click="
+                  columnChildren.click &&
+                    columnChildren.click(
+                      scopeChildren.row,
+                      columnChildren,
+                      scopeChildren.$index
+                    )
+                "
+                v-html="
+                  columnChildren.formatter(
+                    scopeChildren.row,
+                    columnChildren,
+                    scopeChildren.$index
+                  )
+                "
+              ></div>
+              <div v-else-if="column.bind">
+                {{ formatter(scopeChildren.row, columnChildren, true) }}
+              </div>
+              <span v-else-if="column.type == 'date'">{{
+                formatterDate(scopeChildren.row, columnChildren)
+              }}</span>
+              <template v-else>
+                {{ scopeChildren.row[columnChildren.field] }}
+              </template>
+            </template>
+          </el-table-column>
+          <!-- 2020.06.18澧炲姞render娓叉煋鑷畾涔夊唴瀹� -->
+          <table-render
+            v-if="column.render && typeof column.render == 'function'"
+            :row="scope.row"
+            key="rd-01"
+            :index="scope.$index"
+            :column="column"
+            :render="column.render"
+          ></table-render>
+          <!-- 鍚敤鍙屽嚮缂栬緫鍔熻兘锛屽甫缂栬緫鍔熻兘鐨勪笉浼氭覆鏌撲笅鎷夋鏂囨湰鑳屾櫙棰滆壊 -->
+          <!-- @click="rowBeginEdit(scope.$index,cindex)" -->
+          <!-- 2021.09.21澧炲姞缂栬緫鏃跺readonly灞炴�у垽鏂� -->
+          <template
+            v-else-if="
+              column.edit &&
+              !column.readonly &&
+              ['file', 'img', 'excel'].indexOf(column.edit.type) != -1
+            "
+          >
+            <div style="display: flex; align-items: center" @click.stop>
+              <i
+                style="
+                  padding: 3px;
+                  margin-right: 10px;
+                  color: #8f9293;
+                  cursor: pointer;
+                "
+                @click="showUpload(scope.row, column)"
+                class="el-icon-upload"
+              ></i>
+              <img
+                v-show="column.edit.type == 'img'"
+                v-for="(file, imgIndex) in getFilePath(
+                  scope.row[column.field],
+                  column
+                )"
+                :key="imgIndex"
+                :onerror="defaultImg"
+                @click="viewImg(scope.row, column, file.path, $event)"
+                class="table-img"
+                :src="file.path"
+              />
+              <a
+                style="margin-right: 8px"
+                v-show="column.edit.type != 'img'"
+                class="t-file"
+                v-for="(file, fIndex) in getFilePath(
+                  scope.row[column.field],
+                  column
+                )"
+                :key="fIndex"
+                @click="dowloadFile(file)"
+                >{{ file.name }}</a
+              >
+            </div>
+          </template>
+          <div
+            v-else-if="
+              column.edit &&
+              !column.readonly &&
+              (column.edit.keep || edit.rowIndex == scope.$index)
+            "
+            class="edit-el"
+          >
+            <div @click.stop class="e-item">
+              <div>
+                <!-- 2020.07.24澧炲姞鏃ユ湡onChange浜嬩欢 -->
+                <el-date-picker
+                  clearable
+                  size="default"
+                  style="width: 100%"
+                  v-if="['date', 'datetime'].indexOf(column.edit.type) != -1"
+                  v-model="scope.row[column.field]"
+                  @change="
+                    (val) => {
+                      column.onChange &&
+                        column.onChange(scope.row, column, val);
+                    }
+                  "
+                  :type="column.edit.type"
+                  :placeholder="column.placeholder || column.title"
+                  :disabledDate="(val) => getDateOptions(val, column)"
+                  :value-format="getDateFormat(column)"
+                  :disabled="initColumnDisabled(scope.row, column)"
+                >
+                </el-date-picker>
+                <el-time-picker
+                  clearable
+                  size="default"
+                  style="width: 100%"
+                  v-else-if="column.edit.type == 'time'"
+                  v-model="scope.row[column.field]"
+                  @change="
+                    (val) => {
+                      column.onChange &&
+                        column.onChange(scope.row, column, val);
+                    }
+                  "
+                  :placeholder="column.placeholder || column.title"
+                  :value-format="column.format || 'HH:mm:ss'"
+                  :disabled="initColumnDisabled(scope.row, column)"
+                >
+                </el-time-picker>
+                <el-switch
+                  v-else-if="column.edit.type == 'switch'"
+                  v-model="scope.row[column.field]"
+                  active-color="#0f84ff"
+                  inactive-color="rgb(194 194 194)"
+                  @change="
+                    (val) => {
+                      switchChange(val, scope.row, column);
+                    }
+                  "
+                  :active-value="
+                    typeof scope.row[column.field] == 'boolean'
+                      ? true
+                      : typeof scope.row[column.field] == 'string'
+                      ? '1'
+                      : 1
+                  "
+                  :inactive-value="
+                    typeof scope.row[column.field] == 'boolean'
+                      ? false
+                      : typeof scope.row[column.field] == 'string'
+                      ? '0'
+                      : 0
+                  "
+                  :disabled="initColumnDisabled(scope.row, column)"
+                >
+                </el-switch>
+                <template
+                  v-else-if="
+                    ['select', 'selectList'].indexOf(column.edit.type) != -1
+                  "
+                >
+                  <el-select-v2
+                    style="width: 100%"
+                    :size="size"
+                    v-if="column.bind.data.length >= select2Count"
+                    v-model="scope.row[column.field]"
+                    filterable
+                    :multiple="column.edit.type == 'select' ? false : true"
+                    :placeholder="column.placeholder || column.title"
+                    :autocomplete="column.autocomplete"
+                    :options="column.bind.data"
+                    @change="
+                      column.onChange && column.onChange(scope.row, column)
+                    "
+                    clearable
+                    :disabled="initColumnDisabled(scope.row, column)"
+                  >
+                    <template #default="{ item }">
+                      {{ item.label }}
+                    </template>
+                  </el-select-v2>
+
+                  <el-select
+                    size="default"
+                    style="width: 100%"
+                    v-else
+                    v-model="scope.row[column.field]"
+                    :filterable="
+                      column.filter || column.bind.data.length > 10
+                        ? true
+                        : false
+                    "
+                    :multiple="column.edit.type == 'select'"
+                    :placeholder="column.placeholder || column.title"
+                    :autocomplete="column.autocomplete"
+                    @change="
+                      column.onChange && column.onChange(scope.row, column)
+                    "
+                    clearable
+                    :disabled="initColumnDisabled(scope.row, column)"
+                  >
+                    <el-option
+                      v-for="item in column.bind.data"
+                      :key="item.key"
+                      v-show="!item.hidden"
+                      :disabled="item.disabled"
+                      :label="item.value"
+                      :value="item.key"
+                      >{{ item.value }}
+                    </el-option>
+                  </el-select>
+                </template>
+                <el-input
+                  v-else-if="column.edit.type == 'textarea'"
+                  type="textarea"
+                  :placeholder="column.placeholder || column.title"
+                  v-model="scope.row[column.field]"
+                  :disabled="initColumnDisabled(scope.row, column)"
+                >
+                </el-input>
+                <input
+                  class="table-input"
+                  v-else-if="!column.summary && !column.onKeyPress"
+                  v-model.lazy="scope.row[column.field]"
+                  :disabled="initColumnDisabled(scope.row, column)"
+                />
+                <el-input
+                  v-else
+                  @change="inputKeyPress(scope.row, column, $event)"
+                  @input="inputKeyPress(scope.row, column, $event)"
+                  @keyup.enter="inputKeyPress(scope.row, column, $event)"
+                  size="default"
+                  v-model="scope.row[column.field]"
+                  :placeholder="column.placeholder || column.title"
+                  :disabled="initColumnDisabled(scope.row, column)"
+                ></el-input>
+              </div>
+              <div
+                class="extra"
+                v-if="column.extra && edit.rowIndex == scope.$index"
+              >
+                <a
+                  :style="column.extra.style"
+                  style="text-decoration: none"
+                  @click="extraClick(scope.row, column)"
+                >
+                  <i v-if="column.extra.icon" :class="[column.extra.icon]" />
+                  {{ column.extra.text }}
+                </a>
+              </div>
+            </div>
+          </div>
+          <!--娌℃湁缂栬緫鍔熻兘鐨勭洿鎺ユ覆鏌撴爣绛�-->
+          <template v-else>
+            <a
+              href="javascript:void(0)"
+              style="text-decoration: none"
+              @click="link(scope.row, column, $event)"
+              v-if="column.link"
+              v-text="scope.row[column.field]"
+            ></a>
+            <img
+              v-else-if="column.type == 'img'"
+              v-for="(file, imgIndex) in getFilePath(
+                scope.row[column.field],
+                column
+              )"
+              :key="imgIndex"
+              :onerror="defaultImg"
+              @click="viewImg(scope.row, column, file.path, $event)"
+              class="table-img"
+              :src="file.path"
+            />
+            <a
+              style="margin-right: 8px"
+              v-else-if="column.type == 'file' || column.type == 'excel'"
+              class="t-file"
+              v-for="(file, fIndex) in getFilePath(
+                scope.row[column.field],
+                column
+              )"
+              :key="fIndex"
+              @click="dowloadFile(file)"
+              >{{ file.name }}</a
+            >
+            <span v-else-if="column.type == 'date'">{{
+              formatterDate(scope.row, column)
+            }}</span>
+            <div
+              v-else-if="column.formatter"
+              @click="formatterClick(scope.row, column, $event)"
+              v-html="column.formatter(scope.row, column)"
+            ></div>
+            <!-- 2021.11.18淇table鏁版嵁婧愯缃负normal鍚庣偣鍑昏$event缂哄け鐨勯棶棰� -->
+            <div
+              v-else-if="column.bind && (column.normal || column.edit)"
+              @click="formatterClick(scope.row, column, $event)"
+              :style="column.getStyle && column.getStyle(scope.row, column)"
+            >
+              {{ formatter(scope.row, column, true) }}
+            </div>
+            <div
+              v-else-if="column.click && !column.bind"
+              @click="formatterClick(scope.row, column)"
+            >
+              {{ scope.row[column.field] }}
+            </div>
+            <div
+              @click="
+                () => {
+                  column.click && formatterClick(scope.row, column);
+                }
+              "
+              v-else-if="column.bind"
+            >
+              <el-tag
+                v-if="useTag"
+                :class="[isEmptyTag(scope.row, column)]"
+                :type="getColor(scope.row, column)"
+                :effect="column.effect"
+                >{{ formatter(scope.row, column, true) }}</el-tag
+              >
+              <template v-else>{{
+                formatter(scope.row, column, true)
+              }}</template>
+            </div>
+
+            <span v-else>{{ formatter(scope.row, column, true) }}</span>
+          </template>
+        </template>
+      </el-table-column>
+    </el-table>
+    <template v-if="!paginationHide">
+      <div class="block pagination" key="pagination-01" style="display: flex">
+        <div style="flex: 1"></div>
+        <el-pagination
+          key="pagination-02"
+          @size-change="handleSizeChange"
+          @current-change="handleCurrentChange"
+          :current-page="paginations.page"
+          :page-sizes="paginations.sizes"
+          :page-size="paginations.size"
+          layout="total, sizes, prev, pager, next, jumper"
+          :total="paginations.total"
+        ></el-pagination>
+      </div>
+    </template>
+  </div>
+
+  <VolBox
+    v-model="uploadModel"
+    title="涓婁紶"
+    :height="228"
+    :width="500"
+    :padding="15"
+    lazy
+  >
+    <!-- 涓婁紶鍥剧墖銆乪xcel鎴栧叾浠栨枃浠躲�佹枃浠舵暟閲忋�佸ぇ灏忛檺鍒堕兘鍙互锛屽弬鐓olupload缁勪欢api -->
+    <div style="height: 200px; display: flex; align-items: center">
+      <VolUpload
+        style="text-align: center"
+        :autoUpload="currentColumn.edit.autoUpload"
+        :multiple="currentColumn.edit.multiple"
+        :url="uploadUrl"
+        :max-file="currentColumn.edit.maxFile"
+        :img="currentColumn.edit.type == 'img'"
+        :excel="currentColumn.edit.type == 'excel'"
+        :fileTypes="
+          currentColumn.edit.fileTypes ? currentColumn.edit.fileTypes : []
+        "
+        :fileInfo="fileInfo"
+        :upload-after="uploadAfter"
+      >
+        <div>{{ currentColumn.message }}</div>
+      </VolUpload>
+    </div>
+    <template #footer>
+      <div style="text-align: center">
+        <el-button type="default" size="small" @click="uploadModel = false"
+          >鍏抽棴</el-button
+        >
+        <el-button type="primary" size="small" @click="saveUpload"
+          >淇濆瓨</el-button
+        >
+      </div>
+    </template>
+  </VolBox>
+</template>
+<script>
+import VolTableRender from "./VolTable/VolTableRender";
+let _errMsg;
+import { defineComponent, defineAsyncComponent } from "vue";
+export default defineComponent({
+  //https://github.com/element-plus/element-plus/issues/1483
+  //娌℃湁鍘熷厛鐨剆election灞炴�т簡锛岀湅issue涓婁娇鐢╯elect/selectall鑾峰彇
+  //鐩戝惉鏁扮粍闀垮害锛屽鏋滃垹闄や簡鏁版嵁锛岀幇鍦ㄥ彧鑳借杩竻闄ゆ墍鏈夐�変腑鐨勮
+  watch: {
+    "tableData.length": {
+      handler(newLen, oldLen) {
+        this.watchRowSelectChange(newLen, oldLen);
+      },
+    },
+    "rowData.length": {
+      handler(newLen, oldLen) {
+        this.watchRowSelectChange(newLen, oldLen);
+      },
+    },
+  },
+  components: {
+    "table-render": VolTableRender,
+    VolUpload: defineAsyncComponent(() =>
+      import("@/components/basic/VolUpload.vue")
+    ),
+    VolBox: defineAsyncComponent(() => import("@/components/basic/VolBox.vue")),
+  },
+  props: {
+    rowKey: {
+      // 鏍戝舰缁撴瀯鐨勪富閿瓧娈碉紝濡傛灉璁剧疆鍊奸粯璁や細寮�鍚爲褰able锛涙敞鎰弐owKey瀛楁鐨勫�煎繀椤绘槸鍞竴锛�2021.05.02锛�
+      typeof: String,
+      default: undefined,
+    },
+    loadTreeChildren: {
+      // 鏍戝舰缁撴瀯鍔犺浇瀛愯妭鐐�
+      type: Function,
+      default: (tree, treeNode, resolve) => {
+        return resolve([]);
+      },
+    },
+    textInline: {
+      // 琛ㄦ牸鍐呭瓒呭嚭鍚庢槸鍚︽崲琛屾樉绀猴紙2020.01.16锛�
+      type: Boolean,
+      default: true,
+    },
+    tableData: {
+      // 琛ㄦ暟鎹簮,閰嶇疆浜唘rl灏变笉鐢ㄤ紶杩欎釜鍙傛暟浜�
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+    columns: {
+      type: Array,
+      default: [],
+    },
+    height: {
+      type: Number,
+      default: 0,
+    },
+    maxHeight: {
+      type: Number,
+      default: 0,
+    },
+    linkView: {
+      type: Function,
+      default: function () {
+        return 1;
+      },
+    },
+    pagination: {
+      type: Object,
+      default: function () {
+        return { total: 0, size: 30, sortName: "" };
+      },
+    },
+    url: {
+      type: String,
+      default: "",
+    },
+    paginationHide: {
+      type: Boolean,
+      default: true,
+    },
+    color: {
+      type: Boolean,
+      default: true,
+    },
+    index: {
+      // 鏄惁鍒涘缓绱㈠紩鍙�,濡傛灉闇�瑕佽〃鏍肩紪杈戝姛鑳斤紝杩欓噷闇�瑕佽缃负true
+      type: Boolean,
+      default: false,
+    },
+    allowEmpty: {
+      // 琛ㄦ牸鏁版嵁涓虹┖鏃舵槸鍚﹂粯璁や负--
+      type: Boolean,
+      default: true,
+    },
+    defaultLoadPage: {
+      // 浼犲叆浜唘rl锛屾槸鍚﹂粯璁ゅ姞杞借〃鏍兼暟鎹�
+      type: Boolean,
+      default: true,
+    },
+    loadKey: {
+      // 鏄惁鑷姩浠庡悗鍙板姞杞芥暟鎹簮
+      type: Boolean,
+      default: true,
+    },
+    single: {
+      type: Boolean, // 鏄惁鍗曢��
+      default: false,
+    },
+    doubleEdit: {
+      type: Boolean, // 鏄惁鍙屽嚮鍚敤缂栬緫鍔熻兘
+      default: true,
+    },
+    beginEdit: {
+      // 缂栬緫寮�濮�
+      type: Function,
+      default: function (row, column, index) {
+        return true;
+      },
+    },
+    endEditBefore: {
+      // 缁撴潫缂栬緫鍓�
+      type: Function,
+      default: function (row, column, index) {
+        return true;
+      },
+    },
+    endEditAfter: {
+      // 缁撴潫缂栬緫鍓�
+      type: Function,
+      default: function (row, column, index) {
+        return true;
+      },
+    },
+    ck: {
+      // 鏄惁鏄剧ずcheckbox
+      type: Boolean,
+      default: true,
+    },
+    columnIndex: {
+      // 鏄惁鏄剧ず琛屽彿(2020..11.1)
+      type: Boolean,
+      default: true,
+    },
+    highlightCurrentRow: {
+      //澧炲姞閫変腑琛岄珮浜樉绀�(2022.10.07)
+      type: Boolean,
+      default: true,
+    },
+    select2Count: {
+      //瓒呭嚭鏁伴噺鏄剧ずselect2缁勪欢
+      type: Number,
+      default: 500,
+    },
+    selectable: {
+      type: Function,
+      default: (row, index) => {
+        return true;
+      },
+    },
+  },
+  data() {
+    return {
+      fixed: false, //鏄浐瀹氳鍙蜂笌checkbox
+      clickEdit: true, //2021.07.17璁剧疆涓虹偣鍑昏缁撴潫缂栬緫
+      randomTableKey: 1,
+      visiblyColumns: [],
+      key: "",
+      realHeight: 0,
+      realMaxHeight: 0,
+      enableEdit: false, // 鏄惁鍚〃鏍肩敤缂栬緫鍔熻兘
+      empty: this.allowEmpty ? "" : "--",
+      defaultImg: 'this.src="' + require("@/assets/imgs/error.png") + '"',
+      loading: false,
+      footer: {},
+      total: 0,
+      formatConfig: {},
+      // defaultColor: "",
+      // 2020.09.06璋冩暣table鍒楁暟鎹簮鐨勮儗鏅鑹�
+      colors: ["", "warning", "success", "danger", "info"],
+      rule: {
+        phone: /^[1][3,4,5,6,7,8,9][0-9]{9}$/,
+        decimal: /(^[\-0-9][0-9]*(.[0-9]+)?)$/,
+        number: /(^[\-0-9][0-9]*([0-9]+)?)$/,
+      },
+      columnNames: [],
+      rowData: [],
+      paginations: {
+        sort: "",
+        order: "desc",
+        Foots: "",
+        total: 0,
+        // 2020.08.29澧炲姞鑷畾涔夊垎椤垫潯澶у皬
+        sizes: [30, 60, 100, 120],
+        size: 30, // 榛樿鍒嗛〉澶у皬
+        Wheres: [],
+        page: 1,
+        rows: 30,
+      },
+      errorFiled: "",
+      edit: { columnIndex: -1, rowIndex: -1 }, // 褰撳墠鍙屽嚮缂栬緫鐨勮涓庡垪鍧愭爣
+      editStatus: {},
+      summary: false, // 鏄惁鏄剧ず鍚堣
+      // 鐩墠鍙敮鎸佷粠鍚庡彴杩斿洖鐨剆ummaryData鏁版嵁
+      summaryData: [],
+      summaryIndex: {},
+      remoteColumns: [], // 闇�瑕佹瘡娆″埛鏂版垨鍒嗛〉鍚庝粠鍚庡彴鍔犺浇瀛楀吀鏁版嵁婧愮殑鍒楅厤缃�
+      cellStyleColumns: {}, // 鏈夎儗鏅鑹茬殑閰嶇疆
+      fxRight: false, //鏄惁鏈夊彸杈瑰浐瀹氳〃澶�
+      selectRows: [], //褰撳墠閫変腑鐨勮
+      isChrome: false,
+      //vol-table甯︽暟鎹簮鐨勫崟鍏冩牸鏄惁鍚敤tag鏍囩(涓嬫媺妗嗙瓑鍗曞厓鏍间互tag鏍囩鏄剧ず)
+      //2023.04.02鏇存柊voltable涓巑ain.js
+      useTag: true,
+      currentRow: {},
+      currentColumn: [],
+      fileInfo: [],
+      uploadUrl: "",
+      uploadModel: false,
+    };
+  },
+  created() {
+    try {
+      this.useTag = this.$global.table.useTag;
+    } catch (error) {
+      console.log(error.message);
+    }
+    //2021.06.19鍒ゆ柇璋锋瓕鍐呮牳娴忚閲嶆柊璁$畻table楂樺害
+    // if (
+    //   navigator.userAgent.indexOf('Chrome') != -1 ||
+    //   navigator.userAgent.indexOf('Edge') != -1
+    // ) {
+    //   this.isChrome = true;
+    // }
+    this.realHeight = this.getHeight();
+    this.realMaxHeight = this.getMaxHeight();
+    this.fxRight = this.columns.some((x) => {
+      return x.fixed == "right";
+    });
+    //2021.09.21绉婚櫎寮哄埗鍥哄畾琛屽彿涓巆heckbox鍒�
+    if (
+      this.columns.some((x) => {
+        return x.fixed && x.fixed != "right";
+      })
+    ) {
+      this.fixed = true;
+    }
+    //2022.04.06浼樺寲table鍚堣鍥哄畾鍒楁樉绀�
+    // if (
+    //   this.columns.some((x) => {
+    //     return x.summary;
+    //   })
+    // ) {
+    //   this.columns.forEach((x) => {
+    //     if (x.fixed && x.fixed != 'right') {
+    //       x.fixed = false;
+    //     }
+    //   });
+    //   this.fixed = false;
+    // }
+
+    // 浠庡悗鍙板姞涓嬫媺妗嗙殑[鏄惁鍚敤鐨刔鏁版嵁婧�
+    let keys = [];
+    let columnBind = [];
+    this.summaryData.push("鍚堣");
+    if (this.columnIndex) {
+      this.summaryData.push(" ");
+    }
+    this.columns.forEach((x, _index) => {
+      if (x.cellStyle) {
+        this.cellStyleColumns[x.field] = x.cellStyle;
+      }
+      if (!x.hidden) {
+        // this.summaryIndex[x.field] = _index;
+        // 2020.10.11淇姹傚拰鍒楅敊浣嶇殑闂
+        this.summaryData.push("");
+        this.summaryIndex[x.field] = this.summaryData.length - 1;
+      }
+      // 姹傚拰
+      if (x.summary && !this.summary) {
+        this.summary = true;
+      }
+      if (x.bind && x.bind.key && (!x.bind.data || x.bind.data.length == 0)) {
+        // 鍐欏叆杩滅▼
+        if (!x.bind.data) x.bind.data = [];
+        if (x.bind.remote) {
+          this.remoteColumns.push(x);
+        } else if (this.loadKey) {
+          keys.push(x.bind.key);
+          x.bind.valueTyoe = x.type;
+          columnBind.push(x.bind);
+        }
+      }
+    });
+    if (keys.length > 0) {
+      this.http
+        .post("/api/Sys_Dictionary/GetVueDictionary", keys)
+        .then((dic) => {
+          dic.forEach((x) => {
+            if (x.data.length > this.select2Count) {
+              x.data.forEach((item) => {
+                item.label = item.value;
+                item.value = item.key;
+              });
+            }
+            columnBind.forEach((c) => {
+              // 杞崲鏁版嵁婧愮殑绫诲瀷涓庡垪鐨勭被鍨嬩竴鑷�(2020.04.04)
+              if (
+                c.key == x.dicNo &&
+                (c.valueTyoe == "int" || c.valueTyoe == "sbyte")
+              ) {
+                x.data.forEach((d) => {
+                  // 2020.09.01澧炲姞瀵规暟瀛楃被鍨嬬殑浜屾鍒ゆ柇
+                  if (!isNaN(d.key)) {
+                    d.key = ~~d.key;
+                  }
+                });
+              }
+              if (c.key == x.dicNo) c.data.push(...x.data);
+            });
+          });
+        });
+    }
+
+    this.paginations.sort = this.pagination.sortName;
+    // 2020.08.29澧炲姞鑷畾涔夊垎椤垫潯澶у皬
+    Object.assign(this.paginations, this.pagination);
+    if (this.pagination.size) {
+      this.paginations.rows = this.pagination.size;
+    }
+    this.enableEdit = this.columns.some((x) => {
+      return x.hasOwnProperty("edit");
+    });
+    let keyColumn = this.columns.find((x) => {
+      return x.isKey;
+    });
+    if (keyColumn) {
+      this.key = keyColumn.field;
+    }
+    this.defaultLoadPage && this.load();
+  },
+  computed: {
+    filterColumns() {
+      return this.columns.filter((x, index) => {
+        if (!x.field) {
+          x.field = x.title + index;
+        }
+        return !x.hidden;
+      });
+    },
+  },
+  methods: {
+    watchRowSelectChange(newLen, oldLen) {
+      if (newLen < oldLen && this.selectRows.length) {
+        this.selectRows = [];
+        this.$refs.table.clearSelection();
+      }
+    },
+    switchChange(val, row, column) {
+      //杩欓噷鍦ㄥ垵濮嬪寲鐨勬椂鍊欎篃浼氳Е鍙慶hange浜嬩欢
+      if (Object.keys(row).length <= 1) {
+        return;
+      }
+      if (column.onChange) {
+        column.onChange(val, row, column);
+      }
+    },
+    inputKeyPress(row, column, $event, $e) {
+      column.onKeyPress && column.onKeyPress(row, column, $event);
+      this.getInputSummaries(null, null, $event, column);
+    },
+    extraClick(row, column) {
+      column.extra.click &&
+        column.extra.click(
+          row,
+          column,
+          this.url ? this.rowData : this.tableData
+        );
+    },
+    headerClick(column, event) {
+      if (this.clickEdit && this.edit.rowIndex != -1) {
+        if (
+          this.rowEndEdit(
+            this.url
+              ? this.rowData[this.edit.rowIndex]
+              : this.tableData[this.edit.rowIndex],
+            column
+          )
+        ) {
+          this.edit.rowIndex = -1;
+        }
+      }
+      // this.edit.rowIndex = -1;
+    },
+    rowDbClick(row, column, event) {
+      //2021.05.23澧炲姞鍙屽嚮琛屼簨浠�
+      this.$emit("rowDbClick", { row, column, event });
+    },
+    rowClick(row, column, event) {
+      //2022.02.20澧炲姞鐐瑰嚮鏃惰〃鏍煎弬鏁板垽鏂�
+      if (!column) {
+        return;
+      }
+      //姝e湪缂栬緫鏃讹紝绂佹鍑哄彂rowClick浜嬩欢
+      if (this.edit.rowIndex == -1) {
+        this.$emit("rowClick", { row, column, event });
+      }
+      // 鐐瑰嚮琛屼簨浠�(2020.11.07)
+
+      if (!this.doubleEdit) {
+        return;
+      }
+      // 鐐瑰嚮鍏朵粬琛屾椂锛屽鏋滅偣鍑荤殑琛屼笌姝e湪缂栬緫鐨勮鐩稿悓锛屼繚鎸佺紪杈戠姸鎬�
+      if (this.clickEdit && this.edit.rowIndex != -1) {
+        if (row.elementIndex == this.edit.rowIndex) {
+          // 鐐瑰嚮鐨勫崟鍏冩牸濡傛灉涓嶅彲浠ョ紪杈戯紝鐩存帴缁撴潫缂栬緫
+          // 2020.10.12淇缁撴潫缂栬緫鏃讹紝element table楂樼増鏈睘鎬ц幏鍙栦笉鍒扮殑闂
+          let _col = this.columns.find((x) => {
+            return x.field == ((event && event.property) || column.property);
+          });
+          if (_col && (!_col.edit || _col.readonly)) {
+            if (this.rowEndEdit(row, event)) {
+              this.edit.rowIndex = -1;
+            }
+          }
+          return;
+        }
+        if (this.rowEndEdit(row, event && event.property ? event : column)) {
+          this.edit.rowIndex = -1;
+        }
+        //褰撴鍦ㄧ紪杈戯紝涓旂偣鍑诲埌鍏朵粬琛屾椂锛屽湪鍘熺紪杈戠殑琛岀粨鏉熺紪杈戝悗锛岃Е鍙戞柊琛岀殑rowClick浜嬩欢
+        //姝e湪缂栬緫鏃讹紝绂佹鍑哄彂rowClick浜嬩欢
+        if (this.edit.rowIndex == -1) {
+          this.$emit("rowClick", { row, column, event });
+        }
+      }
+      this.rowBeginEdit(row, column);
+    },
+    dowloadFile(file) {
+      this.base.dowloadFile(
+        file.path,
+        file.name,
+        {
+          Authorization: this.$store.getters.getToken(),
+        },
+        this.http.ipAddress
+      );
+    },
+    getFilePath(pathSring, column) {
+      // 鑾峰彇琛ㄧ殑鍥剧墖涓庢枃浠舵樉绀�
+      if (!pathSring) return [];
+      // 澧炲姞鍥剧墖鑷畾涔夋搷浣�
+      // 杩斿洖鏍煎紡蹇呴』鏄痆{name:"鏂囦欢鍚�",path:"鍥剧墖鍏ㄨ矾寰勬垨base64鏍煎紡"}]
+      if (column.formatter) {
+        return column.formatter(pathSring);
+      }
+      let filePath;
+      if (column.base64 && pathSring.indexOf("data") != -1) {
+        filePath = ("," + pathSring)
+          .split(",data")
+          .filter((x) => {
+            return x;
+          })
+          .map((m) => {
+            return "data" + m;
+          });
+      } else {
+        filePath = pathSring.replace(/\\/g, "/").split(",");
+      }
+
+      let fileInfo = [];
+      for (let index = 0; index < filePath.length; index++) {
+        let file = filePath[index];
+        // 2020.12.19澧炲姞base64鍥剧墖鏄剧ず
+        if (column.base64) {
+          fileInfo.push({
+            name: "",
+            path:
+              (file.indexOf("data") == -1 ? "data:image/png;base64," : "") +
+              file,
+          });
+        } else if (file.indexOf(".") != -1) {
+          let splitFile = file.split("/");
+          if (splitFile.length > 0) {
+            fileInfo.push({
+              name: splitFile[splitFile.length - 1],
+              path: this.base.isUrl(file) ? file : this.http.ipAddress + file,
+            });
+          }
+        }
+      }
+      return fileInfo;
+    },
+    // 閲嶇疆table
+    reset() {
+      if (this.tableData && this.tableData.length > 0) {
+        this.tableData.splice(0);
+      }
+      if (this.rowData && this.rowData.length > 0) {
+        this.rowData.splice(0);
+      }
+      if (!this.paginationHide) {
+        this.paginations.page = 1;
+        // this.paginations.rows = 30;
+        if (this.paginations.wheres && this.paginations.wheres.length > 0) {
+          this.paginations.wheres.splice(0);
+        }
+      }
+      this.errorFiled = "";
+      this.edit.columnIndex = -1;
+      this.edit.rowIndex = -1;
+    },
+    getHeight() {
+      // 娌℃湁瀹氫箟楂樺害涓庢渶澶ч珮搴︼紝浣跨敤table榛樿鍊�
+      if (!this.height && !this.maxHeight) {
+        return null;
+      }
+      // 瀹氫箟浜嗘渶澶ч珮搴﹀垯涓嶄娇鐢ㄩ珮搴�
+      if (this.maxHeight) {
+        return null;
+      }
+      // 浣跨敤褰撳墠瀹氫箟鐨勯珮搴�
+      return this.height;
+    },
+    getMaxHeight() {
+      // 娌℃湁瀹氫箟楂樺害涓庢渶澶ч珮搴︼紝浣跨敤table榛樿鍊�
+      if (!this.height && !this.maxHeight) {
+        return null;
+      }
+      // 瀹氫箟浜嗘渶澶ч珮搴︿娇鐢ㄦ渶澶ч珮搴�
+      if (this.maxHeight) {
+        return this.maxHeight;
+      }
+      // 涓嶄娇鐢ㄦ渶澶ч珮搴�
+      return null;
+    },
+    getSelectedOptions(column) {
+      if (column.bind && column.bind.data && column.bind.data.length > 0) {
+        return column.bind.data;
+      }
+      return [];
+    },
+    formatterClick(row, column, event) {
+      if (column.click) {
+        column.click(row, column, event);
+        event.stopPropagation && event.stopPropagation();
+      } else {
+        this.rowClick(row, column, event);
+      }
+    },
+    initIndex({ row, rowIndex }) {
+      if (this.index) {
+        row.elementIndex = rowIndex;
+      }
+      // if (rowIndex%2!==0) {
+      //  return "even-row";
+      // }
+      return;
+    },
+    toggleEdit(event) {},
+    setEditStatus(status) {
+      // this.columns.forEach((x) => {
+      //   if (x.hasOwnProperty("edit")) {
+      //     this.$set(x.edit, "status", status);
+      //   }
+      // });
+    },
+    // 閫氳繃button鎸夐挳鍚敤缂栬緫
+    beginWithButtonEdit(scope) {
+      // url?rowData:tableData
+      this.rowBeginEdit(scope.row, this.columns[scope.$index]);
+    },
+    rowBeginEdit(row, column) {
+      if (this.edit.rowIndex != -1) {
+        return;
+      }
+      let _row = this.columns.find((x) => x.field == column.property);
+      if (_row) {
+        if (_row.readonly) {
+          return;
+        }
+        if (
+          //涓嶈兘缂栬緫鐨勫瓧娈点�乻witch锛岀偣鍑讳笉寮�鍚惎缂栬緫鍔熻兘
+          !_row.edit ||
+          (_row.edit.keep && _row.edit.type == "switch")
+        ) {
+          return;
+        }
+      }
+      if (!this.enableEdit) return;
+      _errMsg = "";
+      // 缂栬緫鍓�
+      this.columns
+        .filter((x) => {
+          return x.bind && x.bind.data && x.bind.data.length;
+        })
+        .forEach((column) => {
+          let val = row[column.field];
+          if (typeof column.bind.data[0].key == "string") {
+            if (typeof val == "number") {
+              row[column.field] = row[column.field] + "";
+            }
+          } else {
+            if (typeof val == "string" && val) {
+              let _val = val * 1;
+              if (_val + "" === val) {
+                row[column.field] = _val;
+              }
+            }
+          }
+        });
+      if (!this.beginEdit(row, column, row.elementIndex)) return;
+      if (row.hasOwnProperty("elementIndex")) {
+        if (this.edit.rowIndex == row.elementIndex) {
+          return;
+        }
+        this.edit.rowIndex = row.elementIndex;
+      }
+    },
+    rowEndEdit(row, column, event) {
+      if (this.clickEdit && event) {
+        return true;
+      }
+      if (!this.enableEdit) {
+        if (!this.errorFiled) {
+          if (
+            this.edit.rowIndex != -1 &&
+            !this.endEditAfter(row, column, this.edit.rowIndex)
+          ) {
+            return false;
+          }
+          this.edit.rowIndex = -1;
+        }
+        return true;
+      }
+      if (!this.doubleEdit && event) {
+        return true;
+      }
+      let _row = this.url
+        ? this.rowData[this.edit.rowIndex]
+        : this.tableData[this.edit.rowIndex];
+      // 缁撴潫缂栬緫鍓�
+      if (!this.endEditBefore(_row, column, this.edit.rowIndex)) return false;
+      if (this.edit.rowIndex != -1) {
+        //2022.06.26淇琛ㄦ牸鍐呭鍒囨崲鍚庤鏁颁笉涓�鑷存椂涓嶈兘缂栬緫鐨勯棶棰�
+        if (this.edit.rowIndex - 1 > (this.rowData || this.tableData).length) {
+          this.edit.rowIndex = -1;
+          return;
+        }
+        let row = (this.url ? this.rowData : this.tableData)[
+          this.edit.rowIndex
+        ];
+        for (let index = 0; index < this.columns.length; index++) {
+          const _column = this.columns[index];
+          if (_column.edit) {
+            if (!this.validateRow(row, _column)) {
+              return;
+            }
+          }
+        }
+      }
+      if (!this.endEditAfter(_row, column, this.edit.rowIndex)) return false;
+      this.edit.rowIndex = -1;
+      return true;
+    },
+    validateRow(row, option1) {
+      if (!this.validateColum(option1, row)) {
+        this.errorFiled = option1.field;
+        // 2022.05.06 淇敼閿欒淇℃伅閲嶅鐨勯棶棰�
+        this.$message.error(option1.title + _errMsg);
+        return false;
+      }
+      this.errorFiled = "";
+      return true;
+    },
+    validateColum(option, data) {
+      if (option.hidden || option.bind) return true;
+      let val = data[option.field];
+      if (option.require || option.required) {
+        if (val != "0" && (val === "" || val === undefined)) {
+          if (!this.errorFiled) {
+            _errMsg = "涓嶈兘涓虹┖";
+          }
+          return false;
+        }
+      }
+      if (!option.edit) {
+        return true;
+      }
+      let editType = option.edit.type;
+      // 楠岃瘉鏁板瓧
+      if (editType == "int" || editType == "decimal" || editType == "number") {
+        if (val == "" || val == undefined) return true;
+        if (editType == "decimal") {
+          if (!this.rule.decimal.test(val)) {
+            _errMsg = "鍙兘鏄暟瀛�";
+            return false;
+          }
+        } else if (!this.rule.decimal.test(val)) {
+          _errMsg = "鍙兘鏄暟瀛�";
+          return false;
+        }
+        if (
+          option.edit.min != undefined &&
+          typeof option.edit.min === "number" &&
+          val < option.edit.min
+        ) {
+          _errMsg = "涓嶈兘灏忎簬" + option.edit.min;
+          return false;
+        }
+        if (
+          option.edit.max != undefined &&
+          typeof option.edit.max === "number" &&
+          val > option.edit.max
+        ) {
+          _errMsg = "涓嶈兘澶т簬" + option.edit.max;
+          return false;
+        }
+        return true;
+      }
+
+      // 楠岃瘉瀛楃涓�
+      if (val && (editType == "text" || editType == "string")) {
+        if (
+          option.edit.min != undefined &&
+          typeof option.edit.min === "number" &&
+          val.length < option.edit.min
+        ) {
+          _errMsg = "鑷冲皯" + option.edit.min + "涓瓧绗�";
+          return false;
+        }
+        if (
+          option.edit.max != undefined &&
+          typeof option.edit.max === "number" &&
+          val.length > option.edit.max
+        ) {
+          _errMsg = "鏈�澶�" + option.edit.max + "涓瓧绗�";
+          return false;
+        }
+      }
+      return true;
+    },
+    delRow() {
+      let rows = this.getSelected();
+      if (rows.length == 0) return this.$Message.error("璇烽�夋嫨瑕佸垹闄ょ殑琛�!");
+
+      let data = this.url ? this.rowData : this.tableData;
+      let indexArr = this.getSelectedIndex();
+      if (indexArr.length == 0) {
+        return this.$Message.error(
+          "鍒犻櫎鎿嶄綔蹇呴』璁剧疆VolTable鐨勫睘鎬ndex='true'"
+        );
+      }
+      // if (indexArr.length == 0 || !this.key) {
+      //   return this.$message.error(
+      //     "璇疯缃甶ndex=true灞炴�ф垨鎸嘽olumns鐨勫瓧娈典负key"
+      //   );
+      // }
+      if (indexArr.length == 0) {
+        // let keyValues=[]
+        // rows.forEach(x=>{
+        //   if (x[this.key]) {
+        //   }
+        //   keyValues.push(x[this.key])
+        // })
+        // data.find(x=>)
+      } else {
+        for (let i = data.length - 1; i >= 0; i--) {
+          if (indexArr.indexOf(i) != -1) {
+            data.splice(i, 1);
+          }
+        }
+      }
+      this.edit.rowIndex = -1;
+      return rows;
+    },
+    addRow(row) {
+      if (!row) {
+        row = {};
+      }
+      this.columns.forEach((x) => {
+        // 2022.05.06 娣诲姞琛屾椂锛屽鏋滃垪鏈夌紪杈戝睘鎬э紝璁剧疆寮�鍚紪杈�(閬垮厤鍏抽棴缂栬緫鍚庯紝鏃犳硶鍐嶆鍚敤缂栬緫)??
+        //x.readonly = false;
+        if (!row.hasOwnProperty(x.field)) {
+          if (x.edit && x.edit.type == "switch") {
+            row[x.field] = x.type == "bool" ? false : 0;
+          } else if (!row.hidden) {
+            // 2020.09.06娣诲姞琛屾椂锛岃缃粯璁ゅ瓧娈�
+            row[x.field] = undefined;
+          }
+        }
+      });
+      if (!this.url) {
+        this.tableData.push(row);
+        return;
+      }
+      this.rowData.push(row);
+    },
+    viewImg(row, column, url, $event) {
+      $event.stopPropagation();
+      this.base.previewImg(url);
+      // window.open(row[column.field]);
+    },
+    link(row, column, $e) {
+      $e.stopPropagation();
+      this.$props.linkView(row, column);
+    },
+    getSelected() {
+      return this.selectRows;
+    },
+    getSelectedIndex() {
+      if (!this.index) {
+        // 鍙湁璁剧疆浜嗗睘鎬ndex鎵嶆湁绱㈠紩琛�
+        return [];
+      }
+      let indexArr = this.selectRows.map((x) => {
+        return x.elementIndex;
+      });
+      return indexArr || [];
+    },
+    GetTableDictionary(rows) {
+      // 鍒嗛〉鎴栧埛鏂版垨閲嶆柊缁戝畾鏁版嵁婧�
+      if (this.remoteColumns.length == 0 || !rows || rows.length == 0) return;
+      let remoteInfo = {};
+      for (let index = 0; index < this.remoteColumns.length; index++) {
+        const column = this.remoteColumns[index];
+        //  column.bind.data.splice(0);
+        let key = column.bind.key;
+        let data = [];
+        rows.forEach((row) => {
+          if (row[column.field] || row[column.field] == "0") {
+            if (data.indexOf(row[column.field]) == -1) {
+              data.push(row[column.field]);
+            }
+          }
+        });
+        if (data.length > 0) {
+          remoteInfo[key] = data;
+        }
+      }
+      if (remoteInfo.length == 0) return;
+      // ha= Object.assign([], ha, hb)
+      this.http
+        .post("/api/Sys_Dictionary/GetTableDictionary", remoteInfo)
+        .then((dic) => {
+          dic.forEach((x) => {
+            this.remoteColumns.forEach((column) => {
+              if (column.bind.key == x.key) {
+                column.bind.data = Object.assign([], column.bind.data, x.data);
+                // column.bind.data.push(...x.data);
+              }
+            });
+          });
+          this.$emit("dicInited", dic);
+        });
+    },
+    load(query, isResetPage) {
+      // isResetPage閲嶇疆鍒嗛〉鏁版嵁
+      if (!this.url) return;
+      if (isResetPage) {
+        this.resetPage();
+      }
+      let param = {
+        page: this.paginations.page,
+        rows: this.paginations.rows,
+        sort: this.paginations.sort,
+        order: this.paginations.order,
+        wheres: [], // 鏌ヨ鏉′欢锛屾牸寮忎负[{ name: "瀛楁", value: "xx" }]
+      };
+      let status = true;
+      // 鍚堝苟鏌ヨ淇℃伅(鍖呮煡璇㈠垎椤点�佹帓搴忋�佹煡璇㈡潯浠剁瓑)
+      if (query) {
+        param = Object.assign(param, query);
+      }
+      /* 鏌ヨ鍓嶅鐞�(濡傛灉闇�瑕佹煡璇㈡潯浠讹紝瀹炵幇缁勪欢鏂规硶loadBefore鏂规硶鍗冲彲:
+        loadBefore=(param, callBack)=>{
+          param.wheres = [{ name: "PhoneNo", value: "13419098211" }];
+          callBack(true);
+        })
+      */
+      this.$emit("loadBefore", param, (result) => {
+        status = result;
+      });
+      if (!status) return;
+
+      if (param.wheres && param.wheres instanceof Array) {
+        param.wheres = JSON.stringify(param.wheres);
+      }
+      this.loading = true;
+      this.http.post(this.url, param).then(
+        (data) => {
+          //2021.06.04淇tree涓嶅埛鏂扮殑闂
+          if (this.rowKey) {
+            this.randomTableKey++;
+            this.rowData.splice(0);
+          }
+          this.loading = false;
+          // 鏌ヨ杩斿洖缁撴灉鍚庡鐞�
+          // 2020.10.30澧炲姞鏌ヨ鍚庤繑鍥炴墍鏈夌殑鏌ヨ淇℃伅
+          this.$emit(
+            "loadAfter",
+            data.rows || [],
+            (result) => {
+              status = result;
+            },
+            data
+          );
+          if (!status) return;
+          this.GetTableDictionary(data.rows);
+          this.rowData = data.rows || [];
+          this.paginations.total = data.total;
+          // 鍚堣
+          this.getSummaries(data);
+          // this.$nextTick(() => {
+          //   this.$refs.table.doLayout();
+          // });
+        },
+        (error) => {
+          this.loading = false;
+          // this.$Message.error(error || "缃戠粶寮傚父");
+        }
+      );
+    }, // 鑾峰彇缁熻
+    getSummaries(data) {
+      if (!this.summary || !data.summary) return;
+      this.summaryData.splice(0);
+      // 寮�鍚簡琛屽彿鐨勶紝+1
+      if (this.columnIndex) {
+        this.summaryData.push("");
+      }
+      // 濡傛灉鏈塩heckbox锛屽簲璇ョ畻浣滄槸绗竴琛�
+      if (this.ck) {
+        this.summaryData.push("");
+      }
+
+      this.columns.forEach((col) => {
+        if (col.children && col.children.length) {
+          col.children.forEach((item) => {
+            this.getColumnSummaries(item, data);
+          });
+        } else {
+          this.getColumnSummaries(col, data);
+        }
+      });
+      if (this.summaryData.length > 0 && this.summaryData[0] == "") {
+        this.summaryData[0] = "鍚堣";
+      }
+    },
+    getColumnSummaries(col, data) {
+      if (!col.hidden) {
+        if (data.summary.hasOwnProperty(col.field)) {
+          let sum = data.summary[col.field];
+          if (sum) {
+            sum =
+              (sum * 1.0).toFixed(col.numberLength || 2).replace(".00", "") *
+              1.0;
+          }
+          this.summaryData.push(sum);
+        } else {
+          this.summaryData.push("");
+        }
+      }
+    },
+    getInputChangeSummaries() {},
+    handleSizeChange(val) {
+      this.paginations.size = val;
+      this.paginations.rows = val;
+      this.load();
+    },
+    handleCurrentChange(val) {
+      this.paginations.page = val;
+      this.load();
+    },
+    sortChange(sort) {
+      this.paginations.sort = sort.prop;
+      this.paginations.order = sort.order == "ascending" ? "asc" : "desc";
+      this.load();
+    },
+    resetPage() {
+      // 閲嶇疆鏌ヨ鍒嗛〉
+      // this.paginations.rows = 30;
+      this.paginations.page = 1;
+    },
+    selectionChange(selection) {
+      // console.log(selection);
+      // 閫夋嫨琛屼簨浠�,鍙湁鍗曢�夋墠瑙﹀彂
+      this.selectRows = selection;
+      if (this.single) {
+        if (selection.length == 1) {
+          this.$emit("rowChange", selection[0]);
+        }
+        if (selection.length > 1) {
+          let _row = selection[selection.length - 1];
+          this.$refs.table.toggleRowSelection(selection[0]);
+          this.selectRows = [_row];
+        }
+      }
+      // 灏唖electionchange鏆撮湶鍑哄幓
+      this.$emit("selectionChange", selection);
+    },
+    getColor(row, column) {
+      let val = row[column.field];
+      if (column.getColor && typeof column.getColor === "function") {
+        let _color = column.getColor(row, column);
+        if (_color) {
+          return _color;
+        }
+      }
+      if (!val && val != "0") {
+        return "";
+      }
+      if (!this.formatConfig[column.field]) {
+        this.formatConfig[column.field] = [val];
+        return this.colors[0];
+      }
+      let index = this.formatConfig[column.field].indexOf(val);
+      if (index != -1) {
+        return this.colors[index];
+      }
+      if (this.formatConfig[column.field].length > 5) {
+        return "";
+      }
+
+      if (index == -1) {
+        this.formatConfig[column.field].push(val);
+        index = this.formatConfig[column.field].length - 1;
+      }
+      return this.colors[index];
+    },
+    formatterDate(row, column) {
+      return (row[column.field] || "").substr(0, 10);
+    },
+    formatter(row, column, template) {
+      if (!template) return row[column.property];
+      let val = row[column.field];
+      if (!val && val != 0) return val;
+      // 鏄惁鍊�
+      if (column.edit && column.edit.type == "switch") {
+        return val ? "鏄�" : "鍚�";
+      }
+      if (!column.bind || !column.bind.data) {
+        return row[column.field];
+      }
+
+      if (
+        column.edit &&
+        (column.edit.type == "selectList" || column.edit.type == "treeSelect")
+      ) {
+        if (!Array.isArray(val)) {
+          row[column.field] = val.split(",");
+        } else {
+          val = val.join(",");
+        }
+        return this.getSelectFormatter(column, val);
+      }
+      // 缂栬緫澶氶�塼able鏄剧ず
+      if (
+        column.bind.type == "selectList" ||
+        column.bind.type == "checkbox" ||
+        column.bind.type == "treeSelect"
+      ) {
+        // if (typeof val === 'string' && val.indexOf(',') != -1) {
+        return this.getSelectFormatter(column, val + "");
+        //  }
+      }
+      let source = column.bind.data.filter((x) => {
+        // return x.key != "" && x.key == val;
+        // 2020.06.06淇鍗曠嫭浣跨敤table缁勪欢鏃�,key涓烘暟瀛�0鏃惰浆鎹㈡垚鏂囨湰澶辫触鐨勯棶棰�
+        return x.key !== "" && x.key !== undefined && x.key + "" === val + "";
+      });
+      if (source && source.length > 0) val = source[0].label || source[0].value;
+      return val;
+    },
+    getSelectFormatter(column, val) {
+      // 缂栬緫澶氶�塼able鏄剧ず
+      let valArr = val.split(",");
+      for (let index = 0; index < valArr.length; index++) {
+        (column.bind.orginData && column.bind.orginData.length
+          ? column.bind.orginData
+          : column.bind.data
+        ).forEach((x) => {
+          // 2020.06.06淇鏁版嵁婧愪负selectList鏃�,key涓烘暟瀛�0鏃朵笉鑳借浆鎹㈡枃鏈殑闂
+          if (
+            x.key !== "" &&
+            x.key !== undefined &&
+            x.key + "" == valArr[index] + ""
+          ) {
+            valArr[index] = x.label || x.value;
+          }
+        });
+      }
+      return valArr.join(",");
+    },
+    onChange(scope, val, event, column) {
+      // 2020.09.03淇onChange涓嶈Е鍙戠殑闂
+      let row = scope.row;
+      if (column.onChange && !column.onChange(row, val, event)) {
+        return;
+      }
+      // 杈撳叆妗嗘眰鍜屽疄鏃惰绠�
+      this.getInputSummaries(scope, val, event, column);
+    },
+    // input杈撳叆瀹炴椂姹傚拰
+    getInputSummaries(scope, val, event, column) {
+      // column鍒楄缃簡summary灞炴�х殑鎵嶈绠楀��
+      if (!column.summary) return;
+      let sum = 0;
+      //  let _index = 0;
+      (this.url ? this.rowData : this.tableData).forEach((x, index) => {
+        if (x.hasOwnProperty(column.field) && !isNaN(x[column.field])) {
+          // _index = index;
+          sum += x[column.field] * 1;
+        }
+      });
+      if (sum) {
+        if (column.summary == "avg") {
+          sum = sum / (this.rowData.length || this.tableData.length || 1);
+        }
+        sum =
+          (sum * 1.0).toFixed(column.numberLength || 2).replace(".00", "") *
+          1.0;
+      }
+      this.summaryData[this.summaryIndex[column.field]] = sum;
+    },
+    getSummaryData({ columns, data }) {
+      return this.summaryData;
+    },
+    getCellStyle(row) {
+      // 2020.12.13澧炲姞璁剧疆鍗曞厓鏍奸鑹�
+      if (row.column.property) {
+        return (
+          this.cellStyleColumns[row.column.property] &&
+          this.cellStyleColumns[row.column.property](
+            row.row,
+            row.rowIndex,
+            row.columnIndex
+          )
+        );
+      }
+    },
+    compareDate(date1, date2) {
+      if (!date2) {
+        return true;
+      }
+      return (
+        date1.valueOf() <
+        (typeof date2 == "number" ? date2 : new Date(date2).valueOf())
+      );
+    },
+    getDateOptions(date, item) {
+      //2021.07.17璁剧疆鏃堕棿鍙�夎寖鍥�
+      if ((!item.min && !item.max) || !date) {
+        return false;
+      }
+      if (item.min && item.min.indexOf(" ") == -1) {
+        //涓嶈缃椂鍒嗙锛屽悗闈細鑷姩鍔犱笂 08:00
+        item.min = item.min + " 00:00:000";
+      }
+      return (
+        this.compareDate(date, item.min) || !this.compareDate(date, item.max)
+      );
+    },
+    getDateFormat(column) {
+      //瑙乭ttps://day.js.org/docs/zh-CN/display/format
+      return column.edit.type == "date" ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm:ss";
+    },
+    userSelect(selection, row) {
+      this.selectRows = selection;
+      if (!this.single) {
+        this.$emit("rowChange", { row, selection });
+      }
+    },
+    isEmptyTag(row, column) {
+      if (!row[column.field] && row[column.field] != "0") {
+        return "empty-tag";
+      }
+      return "";
+    },
+    filterChildrenColumn(children) {
+      if (!children) {
+        return [];
+      }
+      return children.filter((x) => {
+        return !x.hidden;
+      });
+    },
+    initColumnDisabled(row, column) {
+      return column.getDisabled && column.getDisabled(row, column);
+    },
+    showUpload(row, column) {
+      this.fileInfo = (row[column.field] || "")
+        .split(",")
+        .filter((x) => {
+          return x;
+        })
+        .map((item) => {
+          return { path: item, name: "" };
+        });
+      this.currentRow = row;
+      this.currentColumn = column;
+      if (this.currentColumn.edit.autoUpload === undefined) {
+        this.currentColumn.edit.autoUpload = true;
+      }
+      if (this.currentColumn.edit.multiple === undefined) {
+        this.currentColumn.edit.multiple = false;
+      }
+
+      if (this.currentColumn.edit.url === undefined) {
+        this.uploadUrl =
+          "api/" +
+          (this.url || "").replace("/api", "api").split("/")[1] +
+          "/upload";
+      } else {
+        this.uploadUrl = this.currentColumn.edit.url;
+      }
+      this.uploadModel = true;
+    },
+    uploadAfter(result, files) {
+      this.currentColumn.uploadAfter &&
+        this.currentColumn.uploadAfter(result, files);
+      return true;
+    },
+    saveUpload() {
+      //鐢熸垚淇濆瓨鍚庤繑鍥炵殑璺緞
+      let arr = this.fileInfo.map((x) => {
+        if (x.path) {
+          return x.path;
+        }
+        return result.data + x.name;
+      });
+
+      this.currentRow[this.currentColumn.field] = arr.join(",");
+      this.uploadModel = false;
+      return true;
+    },
+  },
+});
+</script>
+<style lang="less" scoped>
+.vol-table {
+  position: relative;
+  .mask {
+    opacity: 0.2;
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    background: #d0d0d0;
+    z-index: 100;
+  }
+  .message {
+    text-align: center;
+    color: #635c5c;
+    font-size: 15px;
+    font-weight: 600;
+    background: #eee;
+    transform: translateY(-50%);
+    top: 50%;
+    position: absolute;
+    z-index: 200;
+    left: 0;
+    right: 0;
+    width: 150px;
+    margin: 0 auto;
+    line-height: 40px;
+    border-radius: 4px;
+    border: 1px solid #a09e9e;
+  }
+}
+.e-item {
+  display: flex;
+  > div:first-child {
+    flex: 1;
+  }
+}
+.vol-table ::v-deep(.el-pager .number) {
+  padding: 0 7px;
+  border-radius: 5px;
+  border: 1px solid #e6e6e6;
+  margin-left: 8px;
+  font-weight: 500;
+  min-width: 28px;
+}
+.vol-table ::v-deep(.el-pager .number.active) {
+  background: #ed4014;
+  color: #fff;
+}
+.vol-table .t-file {
+  color: #1e8cff;
+  cursor: pointer;
+  border-bottom: 1px solid;
+  padding-bottom: 2px;
+}
+.vol-table .empty-tag {
+  border: none;
+  background: none;
+}
+.v-table ::v-deep(.el-date-editor .el-icon-date),
+.v-table ::v-deep(.el-date-editor .el-icon-time) {
+  width: 10px;
+}
+
+.column-required {
+  position: relative;
+  color: #f20303;
+  font-size: 14px;
+  top: 2px;
+  right: 2px;
+}
+</style>
+
+<style scoped>
+/* .v-table ::v-deep(.even-row){
+  background: rgb(245,247,250);
+} */
+.pagination {
+  text-align: right;
+  padding: 2px 28px;
+  border: 1px solid #eee;
+  border-top: 0px;
+}
+/* .v-table ::v-deep(.el-input .el-input__inner) {
+  padding: 0 7px;
+} */
+.v-table ::v-deep(.el-table__header th) {
+  /* padding: 0px !important; */
+  background-color: #f8f8f9 !important;
+  font-size: 13px;
+  height: 46px;
+  color: #616161;
+}
+
+.v-table ::v-deep(.el-table__header th.is-sortable) {
+  padding: 3px !important;
+}
+.vol-table.text-inline ::v-deep(.el-table__body .cell),
+.vol-table.text-inline ::v-deep(.el-table__header-wrapper .cell) {
+  word-break: inherit !important;
+  white-space: nowrap !important;
+}
+/* .v-table  ::v-deep(.el-table__body td) {
+  padding: 9px 0 !important;
+} */
+
+.v-table ::v-deep(.el-table__footer td) {
+  padding: 7px 0 !important;
+}
+
+.vol-table ::v-deep(.el-table-column--selection .cell) {
+  display: inline;
+}
+.vol-table.text-inline ::v-deep(.el-table th > .cell) {
+  white-space: nowrap !important;
+}
+
+.vol-table .table-img {
+  height: 40px;
+  border-radius: 5px;
+  margin-right: 10px;
+  width: 40px;
+  object-fit: cover;
+}
+.vol-table .table-img:hover {
+  cursor: pointer;
+}
+
+.vol-table ::v-deep(.cell) {
+  padding: 2px 10px;
+}
+.vol-table ::v-deep(.cell .el-tag) {
+  padding: 5px 9px;
+}
+.table-input {
+  color: rgb(104, 103, 103);
+  padding: 3px 10px;
+  height: 32px;
+  line-height: 32px;
+  width: 100%;
+  border-radius: 4px;
+  border: 1px solid #dcdcdc;
+}
+.table-input:focus {
+  outline: 1px solid #49a3fd;
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolUpload.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolUpload.vue
new file mode 100644
index 0000000..4c7d696
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/basic/VolUpload.vue
@@ -0,0 +1,880 @@
+<template>
+  <div class="upload-container">
+    <div>
+      <div class="input-btns" style="margin-bottom: 10px">
+        <input
+          ref="input"
+          type="file"
+          style="display: none"
+          @change="handleChange"
+          :multiple="multiple"
+        />
+        <div v-if="img" class="upload-img">
+          <!-- v-for="(file,index) in fileInfo.length>0?fileInfo: files" -->
+          <div v-for="(file, index) in files" :key="index" class="img-item">
+            <div class="operation">
+              <div class="action">
+                <i class="el-icon-view view" @click="previewImg(index)"></i>
+                <i class="el-icon-delete remove" @click="removeFile(index)"></i>
+              </div>
+              <div class="mask"></div>
+            </div>
+
+            <img :src="getImgSrc(file, index)" :onerror="errorImg" />
+          </div>
+          <div
+            v-show="!autoUpload || (autoUpload && files.length < maxFile)"
+            class="img-selector"
+            :class="getSelector()"
+          >
+            <div class="selector" @click="handleClick">
+              <i class="el-icon-camera-solid"></i>
+            </div>
+            <div
+              v-if="!autoUpload"
+              class="s-btn"
+              :class="{ readonly: changed }"
+              @click="upload"
+            >
+              <div>{{ loadText }}</div>
+            </div>
+          </div>
+        </div>
+        <el-button v-else @click="handleClick"
+          >閫夋嫨{{ img ? '鍥剧墖' : '鏂囦欢' }}</el-button
+        >
+
+        <el-button
+          v-if="!autoUpload && !img"
+          type="info"
+          :disabled="changed"
+          @click="upload(true)"
+          :loading="loadingStatus"
+          >涓婁紶鏂囦欢</el-button
+        >
+      </div>
+      <slot></slot>
+      <div v-if="desc">
+        <el-alert
+          :title="getText() + '鏂囦欢澶у皬涓嶈秴杩�' + (maxSize || 50) + 'M'"
+          type="info"
+          show-icon
+        >
+        </el-alert>
+      </div>
+      <slot name="content"></slot>
+      <div v-if="!img">
+        <ul class="upload-list" v-show="fileList">
+          <li class="list-file" v-for="(file, index) in files" :key="index">
+            <a>
+              <span @click="fileOnClick(index, file)">
+                <i :class="format(file)"></i>
+                {{ file.name }}
+              </span>
+            </a>
+            <span @click="removeFile(index)" class="file-remove">
+              <i class="el-icon-close"></i>
+            </span>
+          </li>
+        </ul>
+      </div>
+      <slot name="tip"></slot>
+    </div>
+  </div>
+</template>
+<script>
+let OSS = require('ali-oss');
+export default {
+  components: {},
+  props: {
+    desc: {
+      //鏄惁鏄剧ず榛樿浠嬬粛
+      //鏄惁澶氶��
+      type: Boolean,
+      default: false
+    },
+    fileInfo: {
+      //鐢ㄤ簬鎺ユ敹涓婁紶鐨勬枃浠讹紝涔熷彲浠ュ姞浠ラ粯璁ゅ�硷紝鏄剧ず宸蹭笂浼犵殑鏂囦欢锛岀敤鎴蜂笂浼犲悗浼氳鐩栭粯璁ゅ��
+      type: Array,
+      default: () => {
+        return [];
+      } //鏍煎紡[{name:'1.jpg',path:'127.0.01/1.jpg'}]
+    },
+    downLoad: {
+      //鏄惁鍙互鐐瑰嚮鏂囦欢涓嬭浇
+      type: Boolean,
+      default: true
+    },
+    multiple: {
+      //鏄惁澶氶��
+      type: Boolean,
+      default: false
+    },
+    maxFile: {
+      //鏈�澶氬彲閫夋枃浠舵暟閲忥紝蹇呴』multiple=true锛屾墠浼氱敓鏁�
+      type: Number,
+      default: 5
+    },
+    maxSize: {
+      //鏂囦欢闄愬埗澶у皬3M
+      type: Number,
+      default: 50
+    },
+
+    autoUpload: {
+      //閫夋嫨鏂囦欢鍚庢槸鍚﹁嚜鍔ㄤ笂浼�
+      type: Boolean,
+      default: true
+    },
+    img: {
+      //鍥剧墖绫诲瀷  img>excel>fileTypes涓夌鏂囦欢绫诲瀷浼樺厛绾�
+      type: Boolean,
+      default: false
+    },
+    excel: {
+      //excel鏂囦欢
+      type: Boolean,
+      default: false
+    },
+    fileTypes: {
+      //鎸囧畾涓婁紶鏂囦欢鐨勭被鍨�
+      type: Array,
+      default: () => {
+        return [];
+      }
+    },
+    url: {
+      //涓婁紶鐨剈rl
+      type: String,
+      default: ''
+    },
+    uploadBefore: {
+      //杩斿洖false浼氫腑姝㈡墽琛�
+      //涓婁紶鍓�
+      type: Function,
+      default: (files) => {
+        return true;
+      }
+    },
+    uploadAfter: {
+      //杩斿洖false浼氫腑姝㈡墽琛�
+      //涓婁紶鍚�
+      type: Function,
+      default: (result, files) => {
+        return true;
+      }
+    },
+    onChange: {
+      //閫夋嫨鏂囦欢鏃�  //杩斿洖false浼氫腑姝㈡墽琛�
+      type: Function,
+      default: (files) => {
+        return true;
+      }
+    },
+    // clear: {
+    //   //涓婁紶瀹屾垚鍚庢槸鍚︽竻绌烘枃浠跺垪琛�
+    //   type: Boolean,
+    //   default: true
+    // },
+    fileList: {
+      //鏄惁鏄剧ず閫夋嫨鐨勬枃浠跺垪琛�
+      type: Boolean,
+      default: true
+    },
+    fileClick: {
+      //鐐瑰嚮鏂囦欢浜嬩欢
+      type: Function,
+      default: (index, file, files) => {
+        return true;
+      }
+    },
+    removeBefore: {
+      //绉婚櫎鏂囦欢浜嬩欢
+      type: Function,
+      default: (index, file, files) => {
+        return true;
+      }
+    },
+    append: {
+      //姝ゅ睘鎬у凡搴熷純锛屽鏂囦欢涓婁紶锛岄粯璁よ拷鍔犳枃浠�
+      type: Boolean,
+      default: false
+    },
+    compress: {
+      //寮�鍚浘鐗囧帇缂�,鍚庨潰鏍规嵁闇�瑕佸啀瀹屽杽
+      type: Boolean,
+      default: true
+    },
+    compressMinSize: {
+      //鍘嬬缉鐨勬渶灏忔瘮渚�
+      type: Number,
+      default: 0.1
+    }
+  },
+  data() {
+    return {
+      errorImg: 'this.src="' + require('@/assets/imgs/error-img.png') + '"',
+      changed: false, //鎵嬪姩涓婁紶鎴愬姛鍚庣姝㈤噸澶嶄笂浼狅紝蹇呴』閲嶆柊閫夋嫨
+      model: true,
+      files: [],
+      bigImg: '',
+      imgTypes: ['gif', 'jpg', 'jpeg', 'png', 'bmp', 'webp', 'jfif'],
+      loadingStatus: false,
+      loadText: '涓婁紶鏂囦欢'
+    };
+  },
+  created() {
+    //榛樿鏈夊浘鐗囩殑绂佹涓婁紶鎿嶄綔
+    if (this.fileInfo) {
+      this.changed = true;
+    }
+    this.cloneFile(this.fileInfo);
+  },
+  watch: {
+    fileInfo: {
+      handler(files) {
+        this.cloneFile(files);
+      },
+      deep: true
+    }
+  },
+  methods: {
+    cloneFile(files) {
+      this.files = files.map((x) => {
+        return {
+          name: x.name || this.getFileName(x.path),
+          path: x.path
+        };
+      });
+    },
+    getFileName(path) {
+      if (!path) {
+        return '鏈畾涔夋枃浠跺悕';
+      }
+      let _index = path.lastIndexOf('/');
+      return path.substring(_index + 1);
+    },
+    previewImg(index) {
+      //鏌ョ湅澶у浘棰勮妯″紡寰呭畬
+      this.base.previewImg(this.getImgSrc(this.files[index]));
+      //  window.open(this.getImgSrc((this.files.length>0?this.files:this.fileInfo)[index]));
+    },
+    getSelector() {
+      if (this.autoUpload) {
+        return 'auto-selector';
+      }
+      return 'submit-selector';
+    },
+    getImgSrc(file, index) {
+      if (file.hasOwnProperty('path')) {
+        if (this.base.isUrl(file.path)) {
+          return file.path;
+        }
+        //2020.12.27澧炲姞base64鍥剧墖鎿嶄綔
+        if (file.path.indexOf('/9j/') != -1) {
+          return 'data:image/jpeg;base64,' + file.path;
+        }
+        if (file.path.substr(0, 1) == '/') {
+          file.path = file.path.substr(1);
+        }
+        return this.http.ipAddress + file.path;
+      }
+      return window.URL.createObjectURL(file);
+    },
+    fileOnClick(index, file) {
+      if (!this.fileClick(index, file, this.files)) {
+        return;
+      }
+      //鐐瑰嚮涓嶄笅杞�
+      if (!this.downLoad) {
+        return;
+      }
+      if (!file.path) {
+        this.$message.error('璇峰厛涓婁紶鏂囦欢');
+        return;
+      }
+      this.base.dowloadFile(
+        file.path,
+        file.name,
+        {
+          Authorization: this.$store.getters.getToken()
+        },
+        this.http.ipAddress
+      );
+    },
+    getText() {
+      if (this.img) {
+        return '鍙兘涓婁紶鍥剧墖,';
+      } else if (this.excel) {
+        return '鍙兘涓婁紶excel鏂囦欢,';
+      }
+    },
+    handleClick() {
+      this.$refs.input.click();
+    },
+    handleChange(e) {
+      //this.compress寮�鍚浘鐗囧帇缂�,鍚庨潰鏍规嵁闇�瑕佸啀瀹屽杽
+      // this.clearFiles();
+      var result = this.checkFile(e.target.files);
+      if (!result) {
+        return;
+      }
+
+      this.changed = false;
+      //濡傛灉浼犲叆浜咶ileInfo闇�瑕佽嚜琛屽鐞嗙Щ闄ileInfo
+      if (!this.onChange(e.target.files)) {
+        return;
+      }
+      for (let index = 0; index < e.target.files.length; index++) {
+        const element = e.target.files[index];
+        element.input = true;
+      }
+      if (!this.multiple) {
+        this.files.splice(0);
+      }
+      this.files.push(...e.target.files);
+
+      this.$refs.input.value = null;
+      if (this.autoUpload && result) {
+        this.upload(false);
+      }
+    },
+    removeFile(index) {
+      //濡傛灉浼犲叆浜咶ileInfo闇�瑕佽嚜琛屽鐞嗙Щ闄ileInfo
+      //t绉婚櫎鏂囦欢
+      let removeFile = this.files[index];
+      //鍒犻櫎鐨勮繕娌′笂浼犵殑鏂囦欢
+      if (removeFile.input) {
+        this.files.splice(index, 1);
+      } else {
+        this.fileInfo.splice(index, 1);
+      }
+      if (!this.removeBefore(index, removeFile, this.fileInfo)) {
+        return;
+      }
+    },
+    clearFiles() {
+      this.files.splice(0);
+    },
+    getFiles() {
+      return this.files;
+    },
+    convertToFile(dataurl, filename) {
+      let arr = dataurl.split(',');
+      let mime = arr[0].match(/:(.*?);/)[1];
+      let suffix = mime.split('/')[1];
+      let bstr = atob(arr[1]);
+      let n = bstr.length;
+      let u8arr = new Uint8Array(n);
+      while (n--) {
+        u8arr[n] = bstr.charCodeAt(n);
+      }
+      // new File杩斿洖File瀵硅薄 绗竴涓弬鏁版槸 ArraryBuffer 鎴� Bolb 鎴朅rrary 绗簩涓弬鏁版槸鏂囦欢鍚�
+      // 绗笁涓弬鏁版槸 瑕佹斁鍒版枃浠朵腑鐨勫唴瀹圭殑 MIME 绫诲瀷
+      return new File([u8arr], `${filename}.${suffix}`, {
+        type: mime,
+        input: true
+      });
+    },
+    async compressImg(file) {
+      let fileSize = file.size / 1024 / 1024;
+      let read = new FileReader();
+      read.readAsDataURL(file);
+      return new Promise((resolve, reject) => {
+        read.onload = (e) => {
+          let img = new Image();
+          img.src = e.target.result;
+          let _this = this;
+          img.onload = function() {
+            //榛樿鎸夋瘮渚嬪帇缂�
+            let w = this.width;
+            let h = this.height;
+            let canvas = document.createElement('canvas');
+            let ctx = canvas.getContext('2d');
+            canvas.setAttribute('width', w);
+            canvas.setAttribute('height', h);
+            ctx.drawImage(this, 0, 0, w, h);
+            let rate = 0.3;
+            if (fileSize > 2) {
+              rate = 0.1;
+            } else if (fileSize > 1) {
+              rate = 0.1;
+            }
+            if (_this.compressMinSize > rate) {
+              rate = _this.compressMinSize;
+            }
+            // rate=1;
+            let base64 = canvas.toDataURL('image/jpeg', rate);
+            resolve(_this.convertToFile(base64, file.name));
+          };
+        };
+      });
+    },
+    async uploadOSS() {
+      this.http.get('api/alioss/getAccessToken', {}, false).then(async (x) => {
+        if (!x.status) return this.$Message.error(x.message);
+        let client = new OSS({
+          // yourRegion濉啓Bucket鎵�鍦ㄥ湴鍩熴�備互鍗庝笢1锛堟澀宸烇級涓轰緥锛孯egion濉啓涓簅ss-cn-hangzhou銆�
+          region: x.data.region,
+          // 浠嶴TS鏈嶅姟鑾峰彇鐨勪复鏃惰闂瘑閽ワ紙AccessKey ID鍜孉ccessKey Secret锛夈��
+          accessKeyId: x.data.accessKeyId,
+          accessKeySecret: x.data.accessKeySecret,
+          // 浠嶴TS鏈嶅姟鑾峰彇鐨勫畨鍏ㄤ护鐗岋紙SecurityToken锛夈��
+          stsToken: x.data.securityToken,
+          // 濉啓Bucket鍚嶇О銆�
+          bucket: x.data.bucket
+        });
+        console.log(this.files);
+        for (let index = 0; index < this.files.length; index++) {
+          const file = this.files[index];
+          if (file.input) {
+            let result = await client.put(
+              x.data.bucketFolder + '/' + x.data.unique + file.name,
+              file
+            );
+            file.path = result.url;
+            file.newName = x.data.unique + file.name;
+          }
+        }
+
+        this.fileInfo.splice(0);
+        // }
+        let _files = this.files.map((file) => {
+          return {
+            name: file.newName || file.name,
+            path: file.path
+          };
+        });
+        this.fileInfo.push(..._files);
+        //2021.09.25淇鏂囦欢涓婁紶鍚庝笉鑳藉悓鏃朵笅杞界殑闂
+        this.files = _files;
+      });
+      return;
+    },
+    async upload(vail) {
+      if (vail && !this.checkFile()) return false;
+      if (!this.url) {
+        return this.$message.error('娌℃湁閰嶇疆濂経rl');
+      }
+      if (!this.files || this.files.length == 0) {
+        return this.$message.error('璇烽�夋嫨鏂囦欢');
+      }
+      //澧炲姞涓婁紶鏃惰嚜瀹氫箟鍙傛暟锛屽悗鍙颁娇鐢ㄨ幏鍙朥tilities.HttpContext.Current.Request.Query["瀛楁"]
+      let params={};
+      if (!this.uploadBefore(this.files,params)) {
+        return;
+      }
+      let paramText="";
+      if (Object.keys(params).length) {
+        paramText="?1=1";
+        for (const key in params) {
+          let value=params[key];
+          if(typeof(value)=='object'){
+            value=JSON.stringify(value)
+          }
+          paramText+=`&${key}=${value}`
+        }
+      }
+
+      this.loadingStatus = true;
+      this.loadText = '涓婁紶涓�..';
+      if (window.oss && window.oss.ali.use) {
+        await this.uploadOSS();
+        this.loadingStatus = false;
+        this.loadText = '涓婁紶鏂囦欢';
+        if (!this.uploadAfter({status:true}, this.files)) {
+          this.changed = false;
+          return;
+        } else {
+          this.changed = true;
+        }
+        this.$message.success('涓婁紶鎴愬姛');
+        return;
+      }
+
+      var forms = new FormData();
+      for (let index = 0; index < this.files.length; index++) {
+        let file = this.files[index];
+        if (file.input) {
+          let name = file.name.split('.');
+          name = name[name.length - 1].toLocaleLowerCase();
+          let isImg = this.imgTypes.indexOf(name) != -1;
+          if (isImg && (name == 'jpg' || name == 'jpeg')) {
+            //>200KB鐨勫紑鍚帇缂�
+            if (isImg && file.size / 1024 / 1024 > 0.2) {
+              console.log('鍘嬬缉鍓�' + file.size);
+              file = await this.compressImg(file);
+              file.compress = true;
+              this.files[index] = file;
+              this.files[index].input = true;
+              console.log('鍘嬬缉鍚�' + file.size);
+            }
+          }
+          forms.append('fileInput', file, file.name);
+        }
+      }
+      // forms.append("fileInput", this.files);
+
+      this.http
+        .post(this.url+paramText, forms, this.autoUpload ? '姝e湪涓婁紶鏂囦欢' : '')
+        .then(
+          (x) => {
+            // this.$refs.uploadFile.clearFiles();
+            this.loadingStatus = false;
+            this.loadText = '涓婁紶鏂囦欢';
+            if (!this.uploadAfter(x, this.files)) {
+              this.changed = false;
+              return;
+            } else {
+              this.changed = true;
+            }
+            this.$message.success(x.message);
+            this.changed = x.status;
+            if (!x.status) {
+              // this.files = null;
+              return;
+            }
+            //鍗曢�夋竻闄や互鍓嶇殑鏁版嵁
+            //  if (!this.multiple) {
+            this.fileInfo.splice(0);
+            // }
+            let _files = this.files.map((file) => {
+              return {
+                name: file.name,
+                path: file.path || x.data + file.name
+              };
+            });
+            this.fileInfo.push(..._files);
+            //2021.09.25淇鏂囦欢涓婁紶鍚庝笉鑳藉悓鏃朵笅杞界殑闂
+            this.files = _files;
+          },
+          (error) => {
+            this.loadText = '涓婁紶鏂囦欢';
+            this.loadingStatus = false;
+          }
+        );
+    },
+    format(file, checkFileType) {
+      const format =
+        file.name
+          .split('.')
+          .pop()
+          .toLocaleLowerCase() || '';
+      let fileIcon = 'el-icon-document';
+      if (this.fileTypes.length > 0 && checkFileType != undefined) {
+        if (this.fileTypes.indexOf(format) != -1) {
+          return true;
+        }
+        return false;
+      }
+      if (
+        checkFileType &&
+        !(checkFileType instanceof Array) &&
+        checkFileType != 'img' &&
+        checkFileType != 'excel'
+      ) {
+        if (checkFileType.indexOf(format) > -1) {
+          return true;
+        } else {
+          return false;
+        }
+      }
+
+      if (checkFileType == 'img' || this.imgTypes.indexOf(format) > -1) {
+        if (checkFileType == 'img') {
+          if (this.imgTypes.indexOf(format) > -1) {
+            return true;
+          } else {
+            return false;
+          }
+        }
+        fileIcon = 'el-icon-picture-outline';
+      }
+      if (
+        ['mp4', 'm3u8', 'rmvb', 'avi', 'swf', '3gp', 'mkv', 'flv'].indexOf(
+          format
+        ) > -1
+      ) {
+        fileIcon = 'el-icon-document';
+      }
+      if (['mp3', 'wav', 'wma', 'ogg', 'aac', 'flac'].indexOf(format) > -1) {
+        fileIcon = 'el-icon-document';
+      }
+      if (['doc', 'txt', 'docx', 'pages', 'epub', 'pdf'].indexOf(format) > -1) {
+        fileIcon = 'el-icon-document';
+      }
+      if (
+        checkFileType == 'excel' ||
+        ['numbers', 'csv', 'xls', 'xlsx'].indexOf(format) > -1
+      ) {
+        if (checkFileType == 'excel') {
+          if (['numbers', 'csv', 'xls', 'xlsx'].indexOf(format) > -1) {
+            return true;
+          } else {
+            return false;
+          }
+        }
+        fileIcon = 'el-icon-document';
+      }
+      return fileIcon;
+    },
+    beforeUpload() {},
+    checkFile(inputFiles) {
+      const files = this.files;
+
+      if (
+        this.multiple &&
+        files.length + (inputFiles || []).length > (this.maxFile || 5)
+      ) {
+        this.$message.error(
+          '鏈�澶氬彧鑳介�夈��' +
+            (this.maxFile || 5) +
+            '銆�' +
+            (this.img ? '寮犲浘鐗�' : '涓枃浠�') +
+            ''
+        );
+        return false;
+      }
+      if (!inputFiles) {
+        inputFiles = this.files.filter((x) => {
+          return x.input;
+        });
+      }
+      let names = [];
+      for (let index = 0; index < inputFiles.length; index++) {
+        const file = inputFiles[index];
+        if (names.indexOf(file.name) != -1) {
+          file.name = '(' + index + ')' + file.name;
+        }
+        names.push(file.name);
+        if (this.img && !this.format(file, 'img')) {
+          this.$message.error('閫夋嫨鐨勬枃浠躲��' + file.name + '銆戝彧鑳芥槸鍥剧墖鏍煎紡');
+          return false;
+        }
+        if (this.excel && !this.format(file, 'excel')) {
+          this.$message.error('閫夋嫨鐨勬枃浠躲��' + file.name + '銆戝彧鑳芥槸excel鏂囦欢');
+          return false;
+        }
+        if (
+          this.fileTypes &&
+          this.fileTypes.length > 0 &&
+          !this.format(file, this.fileTypes)
+        ) {
+          this.$message.error(
+            '閫夋嫨鐨勬枃浠躲��' +
+              file.name +
+              '銆戝彧鑳芥槸銆�' +
+              this.fileTypes.join(',') +
+              '銆戞牸寮�'
+          );
+          return false;
+        }
+        if (file.size > (this.maxSize || 50) * 1024 * 1024) {
+          this.$message.error(
+            '閫夋嫨鐨勬枃浠躲��' +
+              file.name +
+              '銆戜笉鑳借秴杩�:' +
+              (this.maxSize || 50) +
+              'M'
+          );
+          return false;
+        }
+      }
+      return true;
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+.upload-list {
+  padding-left: 0;
+  list-style: none;
+  .list-file {
+    line-height: 20px;
+    padding: 4px;
+    color: #515a6e;
+    border-radius: 4px;
+    transition: background-color 0.2s ease-in-out;
+    overflow: hidden;
+    position: relative;
+
+    font-size: 13px;
+    .file-remove {
+      display: none;
+      right: 0;
+      //  margin-left: 50px;
+      color: #0e9286;
+    }
+  }
+  .list-file:hover {
+    cursor: pointer;
+    .file-remove {
+      display: initial;
+    }
+    color: #2d8cf0;
+  }
+}
+.upload-container {
+  display: inline-block;
+  width: 100%;
+  // padding: 10px;
+
+  // min-height: 250px;
+  border-radius: 5px;
+  .alert {
+    margin-top: 43px;
+  }
+  .button-group > * {
+    float: left;
+    margin-right: 10px;
+  }
+  .file-info > span {
+    margin-right: 20px;
+  }
+}
+.upload-img {
+  display: inline-block;
+  .img-item:hover .operation {
+    display: block;
+  }
+  .img-item,
+  .img-selector {
+    position: relative;
+    cursor: pointer;
+    margin: 0 10px 10px 0;
+    float: left;
+    width: 65px;
+    height: 65px;
+    border: 1px solid #c7c7c7;
+    overflow: hidden;
+    border-radius: 5px;
+    box-sizing: content-box;
+    img {
+      margin: 0;
+      padding: 0;
+      width: 100%;
+      height: 100%;
+      object-fit: cover;
+    }
+
+    .operation {
+      display: none;
+      position: absolute;
+      top: 0;
+      bottom: 0;
+      left: 0;
+      right: 0;
+      .action {
+        opacity: 0.6;
+        text-align: center;
+        background: #151515de;
+        font-size: 14px;
+        position: absolute;
+        z-index: 90;
+        width: 100%;
+        bottom: 3px;
+        bottom: 0;
+        color: #ded5d5;
+        padding-right: 7px;
+        padding-bottom: 3px;
+        line-height: 20px;
+        .el-icon-view {
+          margin: 0 10px;
+        }
+      }
+      .mask {
+        opacity: 0.6;
+        background: #9e9e9e;
+        top: 0;
+        width: 100%;
+        height: 100%;
+        position: absolute;
+      }
+    }
+  }
+  .img-selector {
+    font-size: 50px;
+    text-align: center;
+    i {
+      position: relative;
+      font-size: 40px;
+      color: #6f6f6f;
+    }
+  }
+
+  .auto-selector {
+    .selector {
+      line-height: 64px;
+    }
+  }
+  .selector {
+    color: #a0a0a0;
+  }
+  .submit-selector {
+    .s-btn {
+      line-height: 22px;
+      font-size: 12px;
+      top: -6px;
+      // padding: 2px;
+      position: relative;
+      background: #2db7f5;
+      color: white;
+    }
+    .selector {
+      line-height: 50px;
+    }
+    .readonly {
+      background: #8c8c8c;
+    }
+  }
+}
+.big-model {
+  width: 100%;
+  height: 100%;
+  position: relative;
+  .m-img {
+  }
+  .mask {
+    position: absolute;
+    opacity: 0.6;
+    background: #eee;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    position: absolute;
+  }
+}
+
+.auto-upload {
+  z-index: 9999999;
+  width: 100%;
+  height: 100%;
+  position: fixed;
+  top: 0;
+  left: 0;
+  .j-content {
+    text-align: center;
+    font-size: 17px;
+    top: 40%;
+    position: absolute;
+    z-index: 999;
+    left: 0;
+    right: 0;
+    width: 240px;
+    /* height: 100%; */
+    margin: auto;
+    background: white;
+    /* bottom: 30px; */
+    line-height: 50px;
+    border-radius: 6px;
+    border: 1px solid #d2d2d2;
+  }
+  .mask {
+    cursor: pointer;
+    opacity: 0.6;
+    width: 100%;
+    height: 100%;
+    background: #101010;
+  }
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/editor/KindEditor.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/editor/KindEditor.vue
new file mode 100644
index 0000000..8c8e704
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/editor/KindEditor.vue
@@ -0,0 +1,13 @@
+<template>
+  
+</template>
+
+<script>
+export default {
+
+}
+</script>
+
+<style>
+
+</style>  
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/editor/VolWangEditor.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/editor/VolWangEditor.vue
new file mode 100644
index 0000000..d3813ae
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/editor/VolWangEditor.vue
@@ -0,0 +1,154 @@
+<template>
+  <div class="hello" ref="volWangEditor"></div>
+</template>
+
+<script>
+import E from "wangeditor";
+export default {
+  props: {
+    url: {
+      //涓婁紶鍥剧墖鐨剈rl
+      type: String,
+      default: "",
+    },
+    upload: {
+      //涓婁紶鏂规硶
+      type: Function,
+      // (file, insertImgFn) => {}
+      default: null,
+    },
+    uploadCount: {
+      //鏈�澶氬彲浠ヤ笂浼�(鍥剧墖)鐨勬暟閲�
+      type: Number,
+      default: 3,
+    },
+    modelValue: "",
+    width: {
+      type: String,
+      default: "100%",
+    },
+    height: {
+      type: Number,
+      default: 250,
+    },
+    minWidth: {
+      type: Number,
+      default: 650,
+    },
+    minHeight: {
+      type: Number,
+      default: 100,
+    },
+  },
+  name: "wang-editor",
+  data() {
+    return {
+      lastHtml: "",
+      change: false,
+      editor: null,
+      init: false,
+    };
+  },
+  watch: {
+    modelValue(newVal, val) {
+      if (
+        (newVal !== val &&
+          this.lastHtml !== "" &&
+          val === this.lastHtml &&
+          this.editor.txt.html() === this.lastHtml) ||
+        this.editor.txt.html() === ""
+      ) {
+        this.editor.txt.html(newVal);
+      }
+      this.lastHtml = newVal;
+    },
+  },
+  destroyed() {
+    this.editor = null;
+  },
+  mounted() {
+    this.editor = null;
+    let editor = new E(this.$refs.volWangEditor);
+    this.editor = editor;
+    let $this = this;
+    editor.config.zIndex = 500;
+    editor.config.height = this.height;
+    editor.config.onchange = (html) => {
+      if (!this.init && this.lastHtml === "") {
+        this.lastHtml = html;
+        this.init = true;
+      }
+      this.$emit("update:modelValue", html);
+    };
+    // editor.config.uploadFileName = "fileInput";
+    // //璁剧疆header
+    // editor.config.uploadImgHeaders = {
+    //   Accept: "application/json",
+    //   Authorization: this.$store.getters.getToken(),
+    // };
+    //涓婁紶鍦板潃
+    editor.config.uploadImgServer = this.http.ipAddress + this.url;
+    // console.log(editor.config.uploadImgServer);
+    editor.config.customUploadImg = function (resultFiles, insertImgFn) {
+      // 鑷畾涔変笂浼�
+      if ($this.upload) {
+        console.log("璋冪敤鑷畾涔夌殑涓婁紶鏂规硶");
+        console.log(resultFiles);
+        // resultFiles 鏄� input 涓�変腑鐨勬枃浠跺垪琛�
+        // insertImgFn 鏄幏鍙栧浘鐗� url 鍚庯紝鎻掑叆鍒扮紪杈戝櫒鐨勬柟娉�
+        //鏈夊彲鑳戒細涓婁紶澶氬紶鍥剧墖,涓婁紶澶氬紶鍥剧墖灏遍渶瑕佽繘琛岄亶鍘�
+        resultFiles.map((item) => {
+          // _this.getUploadImg(item, insertImgFn);
+          $this.upload(item, insertImgFn);
+        });
+      } else {
+        let formData = new FormData();
+        let nameArr = [];
+        resultFiles.forEach(function (file) {
+          formData.append("fileInput", file, file.name);
+          nameArr.push(file.name);
+        });
+        if (!$this.url) {
+          $this.$message.error("鏈厤缃畊rl");
+          return;
+        }
+        $this.http.post($this.url, formData, true).then((x) => {
+          if (!x.status) {
+            return $this.$message.error(x.message);
+          }
+          nameArr.forEach(m=>{
+            insertImgFn($this.http.ipAddress + x.data + m);
+          })
+          // let imgs = nameArr
+          //   .map((m) => {
+          //     return $this.http.ipAddress + x.data + m;
+          //   })
+          //   .join(",");
+          // insertImgFn(imgs);
+        });
+      }
+    };
+    editor.create();
+    editor.txt.html(this.modelValue);
+  },
+};
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+h1,
+h2 {
+  font-weight: normal;
+}
+ul {
+  list-style-type: none;
+  padding: 0;
+}
+li {
+  display: inline-block;
+  margin: 0 10px;
+}
+a {
+  color: #42b983;
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/401.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/401.vue
new file mode 100644
index 0000000..33e44fb
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/401.vue
@@ -0,0 +1,19 @@
+<template>
+  <div style="height: 100%">
+    <redirect-error :text="text" message="璇锋眰纭鏄惁閰嶇疆鏉冮檺" :errorNumber="errorNumber"></redirect-error>
+  </div>
+</template>
+  <script>
+import RedirectError from "./RedirectError";
+export default {
+  components: {
+    RedirectError,
+  },
+  data() {
+    return {
+      errorNumber: "401",
+      text: "鎶辨瓑锛屾偍娌℃湁鏉冮檺杩涜姝ゆ搷浣渵",
+    };
+  },
+};
+</script>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/404.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/404.vue
new file mode 100644
index 0000000..bd6db8f
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/404.vue
@@ -0,0 +1,21 @@
+<template>
+  <div style="height:100%;">
+    <redirect-error :text="text" :errorNumber="errorNumber"></redirect-error>
+  </div>
+</template>
+  <script>
+import RedirectError from "./RedirectError";
+export default {
+  components: {
+    RedirectError
+  },
+  data() {
+    return {
+      errorNumber:'404',
+      text: "鎶辨瓑锛岄〉闈㈠ソ鍍忓幓鐏槦浜唦"
+    };
+  }
+};
+</script>
+
+
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/Message.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/Message.vue
new file mode 100644
index 0000000..8952162
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/Message.vue
@@ -0,0 +1,39 @@
+<template>
+  <div class="middle-box">
+    <div class="text-center animated fadeInDown">
+      <i style="font-size: 50px;color: #67c23a;margin-top:40px;" class="el-icon-circle-check"></i>
+      <div style="font-size: 20px;margin-top: 10px;" class="error-desc">{{ text }}</div>
+    </div>
+  </div>
+</template>
+  <script>
+export default {
+  props: {
+    text: {
+      type: String,
+      default: "鎿嶄綔鎴愬姛锛�",
+    },
+  },
+  methods: {
+  },
+};
+</script>
+<style lang="less" scoped>
+body {
+  background-color: #fff;
+}
+.middle-box {
+  text-align: center;
+  padding-top: 80px;
+  height: 100%;
+  // background: #eee;
+  h1 {
+    font-size: 140px;
+    font-weight: 100;
+  }
+  .back {
+    padding: 10px;
+  }
+}
+</style>
+
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/RedirectError.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/RedirectError.vue
new file mode 100644
index 0000000..5457065
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/RedirectError.vue
@@ -0,0 +1,59 @@
+<template>
+  <div class="middle-box">
+    <div class="text-center animated fadeInDown">
+      <h1>{{ errorNumber }}</h1>
+      <h3 class="font-bold">{{message}}</h3>
+      <slot></slot>
+      <div class="error-desc">{{ text }}</div>
+      <div class="back">
+        <el-button  type="primary" @click="backHome" icon="md-arrow-round-back"
+          >杩斿洖棣栭〉</el-button >
+      </div>
+    </div>
+  </div>
+</template>
+  <script>
+import { Script } from "vm";
+export default {
+  props: {
+    errorNumber: {
+      type: String,
+      default: "500",
+    },
+    message: {
+      type: String,
+      default: "椤甸潰鏈壘鍒帮紒",
+    },
+    text: {
+      type: String,
+      default: "鍞�...濂藉儚鍑轰簡鐐归棶棰榽",
+    },
+  },
+  methods: {
+    backHome: function () {
+      this.$router.push({
+        path: "/home",
+      });
+    },
+  },
+};
+</script>
+<style lang="less" scoped>
+body {
+  background-color: #fff;
+}
+.middle-box {
+  text-align: center;
+  padding-top: 80px;
+  height: 100%;
+  // background: #eee;
+  h1 {
+    font-size: 140px;
+    font-weight: 100;
+  }
+  .back {
+    padding: 10px;
+  }
+}
+</style>
+
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/coding.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/coding.vue
new file mode 100644
index 0000000..5569483
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/redirect/coding.vue
@@ -0,0 +1,25 @@
+<template>
+  <div style="height:100%;">
+    <redirect-error :text="text" :errorNumber="errorNumber">
+      <div>
+        <router-link to="SellOrder">
+          <Button>鐐瑰嚮鏌ョ湅[娴嬭瘯瀹屾暣绀轰緥]</Button>
+        </router-link>
+      </div>
+    </redirect-error>
+  </div>
+</template>
+  <script>
+import RedirectError from "./RedirectError";
+export default {
+  components: {
+    RedirectError
+  },
+  data() {
+    return {
+      errorNumber: "鐢ㄤ緥姝e湪鏁寸悊涓�",
+      text: "璇︾粏鐢ㄤ緥鍦ㄦ鍑嗗涓�,鐩墠鍙弬鑰僛娴嬭瘯瀹屾暣绀轰緥]鐨勪娇鐢ㄦ柟娉�"
+    };
+  }
+};
+</script>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node.vue
new file mode 100644
index 0000000..5cd8e3d
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node.vue
@@ -0,0 +1,99 @@
+<template>
+    <div ref="node" class="node-item" :style="nodeContainerStyle" @click="clickNode" @mouseup="changeNodeSite"
+        :class="nodeContainerClass">
+        <!-- 鏈�宸︿晶鐨勯偅鏉$珫绾� -->
+        <div class="ef-node-left"></div>
+        <!-- 鑺傜偣绫诲瀷鐨勫浘鏍� -->
+        <div class="ef-node-left-ico flow-node-drag">
+            <i :class="nodeIcoClass"></i>
+        </div>
+        <!-- 鑺傜偣鍚嶇О -->
+        <div class="ef-node-text" :show-overflow-tooltip="true">
+            {{ node.name }}
+        </div>
+        <i @click.stop="delNode" v-if="node.type == 'node' && !disabled" style="display: none" class="el-icon-delete"></i>
+        <!-- 鑺傜偣鐘舵�佸浘鏍� -->
+        <div class="ef-node-right-ico">
+            <i class="el-icon-circle-check el-node-state-success" v-show="node.state === 'success'"></i>
+            <i class="el-icon-circle-close el-node-state-error" v-show="node.state === 'error'"></i>
+            <i class="el-icon-warning-outline el-node-state-warning" v-show="node.state === 'warning'"></i>
+            <i class="el-icon-loading el-node-state-running" v-show="node.state === 'running'"></i>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    props: {
+        node: Object,
+        activeElement: Object,
+        disabled: {
+            typeof: Boolean,
+            default: false
+        }
+    },
+    data() {
+        return {}
+    },
+    computed: {
+        nodeContainerClass() {
+            return {
+                'ef-node-container': true,
+                'ef-node-active': this.activeElement.type == 'node' ? this.activeElement.nodeId === this.node.id : false
+            }
+        },
+        // 鑺傜偣瀹瑰櫒鏍峰紡
+        nodeContainerStyle() {
+            return {
+                top: this.node.top,
+                left: this.node.left
+            }
+        },
+        nodeIcoClass() {
+            var nodeIcoClass = {}
+            nodeIcoClass[this.node.ico] = true
+            // 娣诲姞璇lass鍙互鎺ㄦ嫿杩炵嚎鍑烘潵锛寁iewOnly 鍙互鎺у埗鑺傜偣鏄惁杩愯缂栬緫
+            nodeIcoClass['flow-node-drag'] = this.node.viewOnly ? false : true
+            return nodeIcoClass
+        }
+    },
+    methods: {
+        // 鐐瑰嚮鑺傜偣
+        clickNode() {
+            this.$emit('clickNode', this.node.id)
+        },
+        // 榧犳爣绉诲姩鍚庢姮璧�
+        changeNodeSite() {
+            // 閬垮厤鎶栧姩
+            if (this.node.left == this.$refs.node.style.left && this.node.top == this.$refs.node.style.top) {
+                return;
+            }
+            this.$emit('changeNodeSite', {
+                nodeId: this.node.id,
+                left: this.$refs.node.style.left,
+                top: this.$refs.node.style.top,
+            })
+        }, delNode() {
+            this.$emit("delNode");
+        },
+    }
+}
+</script>
+<style  scoped>
+/* .node-item{
+    position: relative;
+} */
+.node-item:hover .el-icon-delete {
+    display: inline-block !important;
+}
+
+.el-icon-delete {
+    cursor: pointer;
+    position: relative;
+    top: -18px;
+    padding-left: 5px;
+    right: -16px;
+    color: #f61313;
+    height: 20px;
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node_filter.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node_filter.vue
new file mode 100644
index 0000000..83a80fb
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node_filter.vue
@@ -0,0 +1,201 @@
+<template>
+    <div class="node-filter-container">
+        <!-- <div class="add-btn">
+          <span class="name">鏉′欢璁剧疆</span>  <el-button @click="addItem" link><i>+</i>娣诲姞瀛楁</el-button>
+        </div> -->
+        <!-- {{ $store.getters.data().flowTable.WorkTable }} -->
+        <div class="ef-node-pmenu-item" style="display: flex;">
+            <div style="flex:1;">
+                <span class="name"><i class="el-icon-news"></i>鏉′欢璁剧疆</span>
+            </div>
+            <div><el-button link size="small" @click="addItem" type="primary" v-if="!disabled">
+                    + 娣诲姞瀛楁</el-button></div>
+        </div>
+
+        <div>
+            <table>
+                <tr>
+                    <td>瀛楁</td>
+                    <td style="width:90px">鏉′欢</td>
+                    <td class="value">鍊�</td>
+                    <td style="width: 40px;" v-if="!disabled">鎿嶄綔</td>
+                </tr>
+                <tr v-for="(item, index) in filters" :key="index">
+
+                    <td><el-select @change="(field) => { fieldChange(field, index) }" size="small" v-model="item.field"
+                            placeholder="璇烽�夋嫨" :disabled="disabled">
+                            <el-option v-for="data in fieldsOptions" :key="data.field" :label="data.name"
+                                :value="data.field" />
+                        </el-select></td>
+                    <td><el-select size="small" v-model="item.filterType" placeholder="璇烽�夋嫨" :disabled="disabled">
+                            <el-option v-for="data in filterType" :key="data.value" :label="data.name"
+                                :value="data.value" />
+                        </el-select></td>
+                    <td>
+                        <template v-if="item.data">
+                            <el-select v-if="item.data.length >= 300" multiple size="small" v-model="item.value"
+                                placeholder="璇烽�夋嫨">
+                                <el-option v-for="data in item.data" :key="data.key" :label="data.value"
+                                    :value="data.key" :disabled="disabled" />
+                            </el-select>
+                            <el-select-v2 style="width: 100%;" v-else multiple size="small" :options="item.data"
+                                v-model="item.value" placeholder="璇烽�夋嫨" :disabled="disabled">
+                            </el-select-v2>
+                        </template>
+                        <el-input v-else v-model="item.value" size="small" :disabled="disabled"></el-input>
+                    </td>
+                    <td @click="delItem(index)" class="item-del" v-if="!disabled"><i class="el-icon-delete"></i></td>
+                </tr>
+            </table>
+        </div>
+        <!-- <div>
+            <label>鑷畾涔塻ql</label>
+            <div><el-input type="textarea" v-model="customSql"></el-input></div>
+        </div> -->
+    </div>
+</template>
+
+<script>
+let _this = this;
+export default {
+    props: {
+        tableName: {
+            type: String,
+            default: ""
+        },
+        filters: {
+            type: Array,
+            default: () => {
+                return []
+            }
+        },
+        disabled:{
+            typeof:Boolean,
+            default:false
+        }
+    },
+    data() {
+        return {
+            filter: this.$store.getters.data().flowTable,
+            customSql: "",
+            value: "",
+            //{ field: "鍚嶇О", value: "", filterType: "=" },
+            //  filters: [],
+            fieldsOptions: [
+
+            ],
+            t: [],
+            filterType: [{ name: "绛変簬(=)", value: "=" },
+            { name: "涓嶇瓑浜�(!=)", value: "!=" },
+            { name: "澶т簬(>)", value: ">" },
+            { name: "澶т簬绛変簬(>=)", value: ">=" },
+            { name: "灏忎簬(<)", value: "<" },
+            { name: "灏忎簬绛変簬(<=)", value: "<=" },
+            { name: "鍖呮嫭(in)", value: "in" },
+            // { name: "涓嶅寘鎷�(not in)", value: "notin" },
+            { name: "妯$硦鍖归厤(like)", value: "like" },
+            { name: "鎴栬��(or)", value: "or" }
+            ]
+        }
+    },
+    methods: {
+        delItem(index) {
+            this.$confirm('纭瑕佸垹闄ゅ瓧閰嶇疆鏉′欢閰嶇疆鍚�?', '璀﹀憡', {
+                confirmButtonText: '纭畾',
+                cancelButtonText: '鍙栨秷',
+                type: 'warning',
+                center: true
+            }).then(() => {
+                this.filters.splice(index, 1);
+            });
+        },
+        addItem() {
+            this.filters.push({ field: "", value: "", filterType: "", data: null })
+        },
+        fieldChange(field, index) {
+            let option = this.fieldsOptions.find(x => { return x.field == field });
+            this.filters[index].field = option.field;
+            this.filters[index].value = option.data ? [] : null;
+            this.filters[index].data = option.data;;
+        },
+        convertOptions(result) {
+
+        },
+        getOptions(tableName) {
+            const url = 'api/Sys_WorkFlow/getFields?table=' + tableName;
+            this.http.post(url, {}, false).then(result => {
+                result.forEach(c => {
+                    if (c.data && c.data.length < 300) {
+                        c.data = c.data.map(x => {
+                            return {
+                                value: x.key,
+                                label: x.value,
+                                key: x.key
+                            }
+                        })
+                    }
+                })
+                _this.fieldsOptions = result;
+            })
+        }
+    },
+    watch: {
+        'filter.WorkTable': {
+            handler(newvalue, oldvalue) {
+                if (newvalue) {
+                    this.getOptions(newvalue);
+                } else {
+                    //  this.fieldsOptions.splice(0)
+                }
+            }
+        }
+        // deep:true,
+        // filter(newVal,oldVal){
+        //    alert(1)
+        // }
+    },
+    created() {
+        _this = this;
+    },
+}
+</script>
+
+<style lang="less" scoped>
+.node-filter-container {
+    margin-top: 15px;
+
+    table {
+        width: 100%;
+        padding-left: 6px;
+
+        td {
+            font-size: 13px;
+            padding: 5px;
+
+        }
+
+        tr:first-child {
+            font-size: 12px;
+            font-weight: bolder;
+        }
+
+        .item-del {
+            text-align: center;
+            color: rgb(226, 4, 4);
+            cursor: pointer;
+        }
+
+        .value {
+            width: 150px;
+        }
+    }
+
+    .add-btn {
+        text-align: right;
+        padding-right: 10px;
+        border-bottom: 1px solid #e8e8e8;
+        padding-bottom: 5px;
+    }
+
+    .node-filter-item {}
+}</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node_form.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node_form.vue
new file mode 100644
index 0000000..f942239
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node_form.vue
@@ -0,0 +1,350 @@
+<template>
+    <div>
+        <div class="ef-node-form">
+            <div class="ef-node-pmenu-item">
+                <div style="flex:1;">
+                    <span class="name"><i class="el-icon-news"></i>鑺傜偣灞炴��</span>
+                    <!-- <span @click="nameClick(1)" :class="{ active: index === 1 }" class="name">瀹℃壒鏉′欢</span> -->
+                </div>
+                <!-- <div><el-button link size="small" type="primary" @click="save"><i class="el-icon-check"></i>
+                        淇濆瓨閰嶇疆</el-button></div> -->
+            </div>
+            <div class="ef-node-form-body">
+                <div class="form-info">
+                    <VolForm ref="form" style="padding:0 10px;" :label-width="130" :loadKey="false" :formFields="node"
+                        :formRules="formRules" :disabled="disabled">
+                    </VolForm>
+                </div>
+                <div>
+                    <node-filter :filters="node.filters" :disabled="disabled" :tableName="tableName" ref="filter">
+                    </node-filter>
+                </div>
+            </div>
+            <!--            <div class="el-node-form-tag"></div>-->
+        </div>
+    </div>
+</template>
+
+<script>
+// import { cloneDeep } from 'lodash'
+import VolForm from '@/components/basic/VolForm.vue';
+import nodeFilter from './node_filter.vue';
+export default {
+    components: {
+        VolForm,
+        'node-filter': nodeFilter
+    },
+    props: {
+        disabled:{
+            typeof:Boolean,
+            default:false
+        }
+        // node: {
+        //     type: Object,
+        //     default: () => {
+        //         return {
+        //             name: '',
+        //             auditType: 1,//瀹℃牳绫诲瀷
+        //             userId: null,
+        //             roleId: null,
+        //             deptId: null,
+        //             auditRefuse: null,//瀹℃牳鏈�氳繃
+        //             auditBack: null, //椹冲洖
+        //             auditMethod: 0,//瀹℃壒鏂瑰紡(浼氱)
+        //             stepValue: null,
+        //             sendMail: 0,
+        //             filters: [] //瀛楁杩囨护鏉′欢
+        //         }
+        //     }
+        // }
+    },
+    created() {
+        this.http.get('api/Sys_WorkFlow/getNodeDic').then((result) => {
+            this.formRules.forEach((options) => {
+                options.forEach((option) => {
+                    if (option.dataKey && !option.data.length) {
+                        option.data = result[option.dataKey] || [];
+                    }
+                });
+            });
+        });
+    },
+    data() {
+        return {
+            tableName: "",
+            index: 1,
+            visible: true,
+            // node 鎴� line
+            type: 'node',
+            node: {},
+            line: {},
+            data: {},
+
+            node: {
+                name: '',
+                auditType: 1,//瀹℃牳绫诲瀷
+                userId: null,
+                roleId: null,
+                deptId: null,
+                auditRefuse: null,//瀹℃牳鏈�氳繃
+                auditBack: null, //椹冲洖
+                auditMethod: 0,//瀹℃壒鏂瑰紡(浼氱)
+                //  nodeValue: null,
+                sendMail: 0,
+                filters: []
+            },
+            formRules: [
+                [
+                    {
+                        title: '鑺傜偣鍚嶇О',
+                        field: 'name',
+                        required: true,
+                        colSize: 12
+                    }],
+                [
+                    {
+                        dataKey: '',
+                        title: '瀹℃壒绫诲瀷',
+                        required: true,
+                        hidden: false,
+                        field: 'auditType',
+                        data: [
+                            { key: 1, value: '鎸夌敤鎴峰鎵�' },
+                            { key: 2, value: '鎸夎鑹插鎵�' },
+                            { key: 3, value: '鎸夐儴闂ㄥ鎵�' }
+                        ],
+                        type: 'select',
+                        onChange: this.nodeTypeChange,
+                        colSize: 12
+                    }
+                ],
+                [
+                    {
+                        dataKey: 'users',
+                        hidden: false,
+                        title: '瀹℃壒鐢ㄦ埛',
+                        required: true,
+                        field: 'userId',
+                        data: [],
+                        type: 'selectList',
+                        colSize: 12
+                    }
+                    ,
+                    {
+                        dataKey: 'roles',
+                        hidden: true,
+                        title: '瑙掕壊淇℃伅',
+                        required: true,
+                        field: 'roleId',
+
+                        data: [],
+                        type: 'select',
+                        colSize: 12
+                    }
+                    ,
+                    {
+                        dataKey: 'dept',
+                        hidden: true,
+                        title: '閮ㄩ棬淇℃伅',
+                        required: true,
+                        field: 'deptId',
+                        data: [],
+                        type: 'select',
+                        colSize: 12
+                    }
+                ], [
+                    {
+                        dataKey: '',
+                        title: '瀹℃壒鏈�氳繃',
+                        required: false,
+                        field: 'auditRefuse',
+                        hidden: false,
+                        data: [
+                            { key: 1, value: '杩斿洖涓婁竴鑺傜偣' },
+                            { key: 2, value: '娴佺▼閲嶆柊寮�濮�' },
+                            { key: 0, value: '娴佺▼缁撴潫' },
+                        ],
+                        type: 'select',
+                        colSize: 6
+                    }
+                    ,
+                    {
+                        dataKey: '',
+                        title: '瀹℃壒椹冲洖',
+                        required: false,
+                        hidden: false,
+                        field: 'auditBack',
+                        data: [
+                            { key: 1, value: '杩斿洖涓婁竴鑺傜偣' },
+                            { key: 2, value: '娴佺▼閲嶆柊寮�濮�' },
+                            { key: 0, value: '娴佺▼缁撴潫' },
+                        ],
+                        type: 'select',
+                        colSize: 6
+
+                    }
+                ],
+                [
+                    {
+                        dataKey: '',
+                        title: '瀹℃牳鍚庡彂閫侀偖浠堕�氱煡',
+                        required: false,
+                        hidden: false,
+                        field: 'sendMail',
+                        data: [
+                            { key: 1, value: '鏄�' },
+                            { key: 0, value: '鍚�' },
+                        ],
+                        type: 'switch'
+                    },
+                    {
+                        dataKey: '',
+                        title: '鍚敤浼氱',
+                        required: false,
+                        hidden: false,
+                        field: 'auditMethod',//瀹℃壒鏂瑰紡
+                        data: [
+                            { key: 1, value: '鏄�' },
+                            { key: 0, value: '鍚�' }
+                        ],
+                        type: 'switch'
+                    }
+                ],
+            ],
+        }
+    },
+    methods: {
+        nameClick(index) {
+            this.index = index;
+        },
+        /**
+         * 琛ㄥ崟淇敼锛岃繖閲屽彲浠ユ牴鎹紶鍏ョ殑ID杩涜涓氬姟淇℃伅鑾峰彇
+         * @param data
+         * @param id
+         */
+        nodeInit(data, id, tableName) {
+            this.tableName = tableName;
+            this.type = 'node'
+            this.data = data;
+            // this.tableName=data.
+            data.nodeList.filter((node) => {
+                if (node.id === id) {
+                    this.formRules.forEach(options => {
+                        options.forEach(c => {
+                            if (c.field != 'name') {
+                                c.hidden = node.type == 'start' || node.type == 'end';
+                            }
+                        })
+                    })
+                    if (!node.filters) {
+                        node.filters = [];
+                    }
+                    this.node = node;// cloneDeep(node)
+                    if (node.type != 'start' && node.type != 'end') {
+                        this.nodeTypeChange(node.auditType);
+                    }
+                }
+            })
+            // data.nodeList.filter((node) => {
+            //     if (node.id === id) {
+            //         let _node = cloneDeep(node);
+            //         _node.roleId = _node.roleId || null;
+            //         _node.userId = _node.userId || null;
+            //         _node.nodeType = (_node.nodeType || 1) * 1;
+            //         if (!node.filters) {
+            //             node.filters = [];
+            //         }
+            //         _node.filters = node.filters;
+            //         this.nodeTypeChange(_node.nodeType);
+            //         Object.assign(this.node, _node);
+            //     }
+            // });
+        },
+        nodeTypeChange(value) {
+            // { key: 1, value: '鎸夌敤鎴峰鎵�' },
+            //   { key: 2, value: '鎸夎鑹插鎵�' },
+            //   { key: 3, value: '鎸夐儴闂ㄥ鎵�' }
+            this.formRules.forEach((options) => {
+                options.forEach((option) => {
+                    if (option.field == 'userId') {
+                        option.hidden = value != 1;
+                    } else if (option.field == 'roleId') {
+                        option.hidden = value != 2;
+                    } else if (option.field == 'deptId') {
+                        option.hidden = value != 3;
+                    }
+                });
+            });
+        },
+        lineInit(line) {
+            this.type = 'line'
+            this.line = line
+        },
+        // 淇敼杩炵嚎
+        saveLine() {
+            this.$emit('setLineLabel', this.line.from, this.line.to, this.line.label)
+        },
+        save() {
+            this.data.nodeList.filter((node) => {
+                if (node.id === this.node.id) {
+                    node.name = this.node.name;
+                    node.left = this.node.left;
+                    node.top = this.node.top;
+                    node.ico = this.node.ico;
+                    node.state = this.node.state;
+                    node.stepValue = this.node.stepValue;
+                    this.$emit('repaintEverything', this.node);
+                }
+
+            });
+            this.$message.success('淇濆瓨鎴愬姛')
+        }
+    }
+}
+</script>
+
+<style lang="less" scoped>
+.el-node-form-tag {
+    position: absolute;
+    top: 50%;
+    margin-left: -15px;
+    height: 40px;
+    width: 15px;
+    background-color: #fbfbfb;
+    border: 1px solid rgb(220, 227, 232);
+    border-right: none;
+    z-index: 0;
+}
+
+.btns {
+    text-align: center;
+    padding: 10px;
+
+    buttton {
+        flex: 1;
+    }
+}
+
+.ef-node-pmenu-item {
+    display: flex;
+
+    .name {
+        cursor: pointer;
+        margin-right: 15px;
+    }
+
+    .active {
+        color: #0659e8;
+    }
+}
+
+.form-info ::v-deep(.vol-form-item) {
+    display: flex;
+
+    .el-form-item:nth-child(2),
+    .el-form-item:nth-child(3),
+    .el-form-item:nth-child(4) {
+        margin-left: 12px;
+    }
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node_menu.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node_menu.vue
new file mode 100644
index 0000000..b76fa81
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/node_menu.vue
@@ -0,0 +1,126 @@
+<template>
+    <div class="flow-menu" ref="tool">
+        <div v-for="menu  in  menuList" :key="menu.id">
+            <div class="ef-node-pmenu-item"><i class="el-icon-notebook-2"></i>鑺傜偣閰嶇疆</div>
+            <ul v-show="menu.open" class="ef-node-menu-ul">
+                <draggable @end="end" @start="move" v-model="menu.children" :options="draggableOptions">
+                    <li v-for="subMenu in menu.children" class="ef-node-menu-li" :key="subMenu.id" :type="subMenu.type">
+                        <i :class="subMenu.ico"></i> {{ subMenu.name }}
+                    </li>
+                </draggable>
+            </ul>
+        </div>
+    </div>
+</template>
+<script>
+import { VueDraggableNext as draggable } from "vue-draggable-next";
+
+var mousePosition = {
+    left: -1,
+    top: -1
+}
+
+export default {
+    data() {
+        return {
+            activeNames: '1',
+            // draggable閰嶇疆鍙傛暟鍙傝�� https://www.cnblogs.com/weixin186/p/10108679.html
+            draggableOptions: {
+                preventOnFilter: false,
+                sort: false,
+                disabled: false,
+                ghostClass: 'tt',
+                // 涓嶄娇鐢℉5鍘熺敓鐨勯厤缃�
+                forceFallback: true,
+                // 鎷栨嫿鐨勬椂鍊欐牱寮�
+                // fallbackClass: 'flow-node-draggable'
+            },
+            // 榛樿鎵撳紑鐨勫乏渚ц彍鍗曠殑id
+            defaultOpeneds: ['1', '2'],
+            menuList: [
+                {
+                    id: '1',
+                    type: 'group',
+                    name: '寮�濮嬭妭鐐�',
+                    ico: 'el-icon-video-play',
+                    open: true,
+                    children: [
+                        {
+                            id: '0',
+                            type: 'start',
+                            name: '娴佺▼寮�濮�',
+                            ico: 'el-icon-time',
+                            // 鑷畾涔夎鐩栨牱寮�
+                            style: {}
+                        },
+                        {
+                            id: '1',
+                            type: 'end',
+                            name: '娴佺▼缁撴潫',
+                            ico: 'el-icon-switch-button',
+                            // 鑷畾涔夎鐩栨牱寮�
+                            style: {}
+                        },   {
+                            id: '2',
+                            type: 'node',
+                            name: '娴佺▼鑺傜偣',
+                            ico: 'el-icon-news',
+                            // 鑷畾涔夎鐩栨牱寮�
+                            style: {}
+                        }
+                    ]
+                }],
+
+            nodeMenu: {}
+        }
+    },
+    components: {
+        draggable
+    },
+    created() {
+        /**
+         * 浠ヤ笅鏄负浜嗚В鍐冲湪鐏嫄娴忚鍣ㄤ笂鎺ㄦ嫿鏃跺脊鍑簍ab椤靛埌鎼滅储闂
+         * @param event
+         */
+        if (this.isFirefox()) {
+            document.body.ondrop = function (event) {
+                // 瑙e喅鐏嫄娴忚鍣ㄦ棤娉曡幏鍙栭紶鏍囨嫋鎷界粨鏉熺殑鍧愭爣闂
+                mousePosition.left = event.layerX
+                mousePosition.top = event.clientY - 50
+                event.preventDefault();
+                event.stopPropagation();
+            }
+        }
+    },
+    methods: {
+        // 鏍规嵁绫诲瀷鑾峰彇宸︿晶鑿滃崟瀵硅薄
+        getMenuByType(type) {
+            for (let i = 0; i < this.menuList.length; i++) {
+                let children = this.menuList[i].children;
+                for (let j = 0; j < children.length; j++) {
+                    if (children[j].type === type) {
+                        return children[j]
+                    }
+                }
+            }
+        },
+        // 鎷栨嫿寮�濮嬫椂瑙﹀彂
+        move(evt, a, b, c) {
+            var type = evt.item.attributes.type.nodeValue
+            this.nodeMenu = this.getMenuByType(type)
+        },
+        // 鎷栨嫿缁撴潫鏃惰Е鍙�
+        end(evt, e) {
+            this.$emit('addNode', evt, this.nodeMenu, mousePosition)
+        },
+        // 鏄惁鏄伀鐙愭祻瑙堝櫒
+        isFirefox() {
+            var userAgent = navigator.userAgent
+            if (userAgent.indexOf("Firefox") > -1) {
+                return true
+            }
+            return false
+        }
+    }
+}
+</script>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/panel.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/panel.vue
new file mode 100644
index 0000000..84d29bc
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/components/workflow/panel.vue
@@ -0,0 +1,612 @@
+<!-- 瀹℃牳娴佺▼鎻掍欢鍩轰簬https://gitee.com/xiaoka2017/easy-flow淇敼-->
+<!--鎰熻阿钀岀骇灏忚彍楦� / easy-flow -->
+<template>
+    <div v-if="easyFlowVisible" class="flow-panel">
+
+        <div style="display: flex;height: 100%;position: relative;">
+            <el-scrollbar style="height: 100%;border-right: 1px solid rgb(220, 227, 232);">
+                <div style="width: 220px;">
+                    <div class="ef-node-pmenu-item"><i class="el-icon-warning-outline"></i>鍩虹淇℃伅</div>
+                    <VolForm ref="form" style="padding: 10px;" :label-width="180" :loadKey="true" :formFields="formFields"
+                        :disabled="disabled" :formRules="formRules"></VolForm>
+                    <node-menu @addNode="addNode" ref="nodeMenu" v-if="!disabled"></node-menu>
+                </div>
+            </el-scrollbar>
+            <div class="tools">
+                <el-button circle @click="zoomAdd"><i class="el-icon-zoom-in"></i></el-button>
+                <el-button circle @click="zoomSub"><i class="el-icon-zoom-out"></i></el-button>
+            </div>
+            <div style="flex: 1;" id="efContainer" ref="efContainer" class="container efContainer" v-flowDrag>
+                <template :key="node.id" v-for="node in data.nodeList">
+                    <flow-node :id="node.id" @delNode="deleteNode(node.id)" :node="node" :activeElement="activeElement"
+                        :disabled="disabled" @changeNodeSite="changeNodeSite" @nodeRightMenu="nodeRightMenu"
+                        @clickNode="clickNode">
+                    </flow-node>
+                </template>
+                <!-- 缁欑敾甯冧竴涓粯璁ょ殑瀹藉害鍜岄珮搴� -->
+                <div style="position:absolute;top: 3000px;left: 4000px;">&nbsp;</div>
+            </div>
+            <!-- 鍙充晶琛ㄥ崟 -->
+            <div style="width: 400px;border-left: 1px solid #dce3e8;background-color: #FBFBFB">
+                <el-scrollbar style="height: 100%;padding-bottom: 10px;">
+                    <flow-node-form @delNode="deleteNode" ref="nodeForm" @setLineLabel="setLineLabel" :disabled="disabled"
+                        @repaintEverything="repaintEverything"></flow-node-form>
+                </el-scrollbar>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+import { VueDraggableNext as draggable } from "vue-draggable-next";
+// import { jsPlumb } from 'jsplumb'
+// 浣跨敤淇敼鍚庣殑jsplumb
+import './jsplumb'
+import { easyFlowMixin } from './mixins'
+import flowNode from './node'
+import nodeMenu from './node_menu'
+import FlowNodeForm from './node_form'
+import lodash from 'lodash'
+// import { getDataA } from './data_A'
+import VolForm from '@/components/basic/VolForm.vue';
+export default {
+    props: {
+        disabled: {
+            typeof: Boolean,
+            default: false
+        }
+    },
+    data() {
+        return {
+            formFields: {
+                WorkName: '',
+                WorkTable: '',
+                WorkTableName: '',
+                Weight: 1,
+                AuditingEdit: 0,
+                Remark: ''
+            },
+            formRules: [
+                [
+                    {
+                        dataKey: '娴佺▼鍚嶇О',
+                        title: '娴佺▼鍚嶇О',
+                        field: 'WorkName',
+                        required: true
+                    }],
+                [{
+                    dataKey: '',
+                    title: '娴佺▼瀹炰緥',
+                    required: true,
+                    field: 'WorkTable',
+                    data: [],
+                    readonly: false,
+                    type: 'select',
+                    onChange: (value, item) => {
+                        this.formRules.forEach((options) => {
+                            options.forEach((option) => {
+                                if (option.field == 'WorkTable') {
+                                    this.formFields.WorkTableName = option.data.find((x) => {
+                                        return x.key == value;
+                                    }).value;
+                                }
+                            });
+                        });
+                    }
+                }],
+                [{
+                    title: '鏉冮噸(鐩稿悓鏉′欢鏉冮噸澶т紭鍏�)',
+                    field: 'Weight',
+                    type: "number",
+                }
+                ],
+                
+                [{
+                    title: '瀹℃牳涓暟鎹槸鍚﹀彲浠ョ紪杈�',
+                    field: 'AuditingEdit',
+                    type: "switch",
+                    data: [{ key: 0, value: "鍚�" }, { key: 1, value: "鏄�" }]
+                }
+                ],
+                [{
+                    title: '澶囨敞',
+                    field: 'Remark'
+                }
+                ]
+            ],
+            // jsPlumb 瀹炰緥
+            jsPlumb: null,
+            // 鎺у埗鐢诲竷閿�姣�
+            easyFlowVisible: true,
+            // 鏄惁鍔犺浇瀹屾瘯鏍囧織浣�
+            loadEasyFlowFinish: false,
+            // 鏁版嵁
+            data: {},
+            // 婵�娲荤殑鍏冪礌銆佸彲鑳芥槸鑺傜偣銆佸彲鑳芥槸杩炵嚎
+            activeElement: {
+                // 鍙�夊�� node 銆乴ine
+                type: undefined,
+                // 鑺傜偣ID
+                nodeId: undefined,
+                // 杩炵嚎ID
+                sourceId: undefined,
+                targetId: undefined
+            },
+            zoom: 1
+        }
+    },
+    // 涓�浜涘熀纭�閰嶇疆绉诲姩璇ユ枃浠朵腑
+    mixins: [easyFlowMixin],
+    components: {
+        draggable, flowNode, nodeMenu, FlowNodeForm, VolForm
+    },
+    directives: {
+        'flowDrag': {
+            mounted(el, binding, vnode, oldNode) {
+                if (!binding) {
+                    return
+                }
+                el.onmousedown = (e) => {
+                    if (e.button == 2) {
+                        // 鍙抽敭涓嶇
+                        return
+                    }
+                    //  榧犳爣鎸変笅锛岃绠楀綋鍓嶅師濮嬭窛绂诲彲瑙嗗尯鐨勯珮搴�
+                    let disX = e.clientX
+                    let disY = e.clientY
+                    el.style.cursor = 'move'
+
+                    document.onmousemove = function (e) {
+                        // 绉诲姩鏃剁姝㈤粯璁や簨浠�
+                        e.preventDefault()
+                        const left = e.clientX - disX
+                        disX = e.clientX
+                        el.scrollLeft += -left
+
+                        const top = e.clientY - disY
+                        disY = e.clientY
+                        el.scrollTop += -top
+                    }
+
+                    document.onmouseup = function (e) {
+                        el.style.cursor = 'auto'
+                        document.onmousemove = null
+                        document.onmouseup = null
+                    }
+                }
+            }
+        }
+    },
+    mounted() {
+        this.jsPlumb = jsPlumb.getInstance()
+        // this.$nextTick(() => {
+        //     // 榛樿鍔犺浇娴佺▼A鐨勬暟鎹�佸湪杩欓噷鍙互鏍规嵁鍏蜂綋鐨勪笟鍔¤繑鍥炵鍚堟祦绋嬫暟鎹牸寮忕殑鏁版嵁鍗冲彲
+        //     this.dataReload(getDataA())
+        // })
+    },
+    created() {
+        this.http.get('api/Sys_WorkFlow/getTableInfo').then((result) => {
+            this.formRules.forEach((options) => {
+                options.forEach((option) => {
+                    if (option.field == 'WorkTable') {
+                        option.data = result;
+                    }
+                });
+            });
+        });
+        this.$store.getters.data().flowTable = this.formFields;
+    },
+    methods: {
+        // 杩斿洖鍞竴鏍囪瘑
+        getUUID() {
+            return Math.random().toString(36).substr(3, 10)
+        },
+        jsPlumbInit() {
+            this.jsPlumb.ready(() => {
+                // 瀵煎叆榛樿閰嶇疆
+                this.jsPlumb.importDefaults(this.jsplumbSetting)
+                // 浼氫娇鏁翠釜jsPlumb绔嬪嵆閲嶇粯銆�
+                this.jsPlumb.setSuspendDrawing(false, true);
+                // 鍒濆鍖栬妭鐐�
+                this.loadEasyFlow()
+                // 鍗曠偣鍑讳簡杩炴帴绾�, https://www.cnblogs.com/ysx215/p/7615677.html
+                this.jsPlumb.bind('click', (conn, originalEvent) => {
+                    this.activeElement.type = 'line'
+                    this.activeElement.sourceId = conn.sourceId
+                    this.activeElement.targetId = conn.targetId
+                    this.$refs.nodeForm.lineInit({
+                        from: conn.sourceId,
+                        to: conn.targetId,
+                        label: conn.getLabel()
+                    })
+                    this.deleteElement();
+                })
+                // 杩炵嚎
+                this.jsPlumb.bind("connection", (evt) => {
+                    let from = evt.source.id
+                    let to = evt.target.id
+                    if (this.loadEasyFlowFinish) {
+                        this.data.lineList.push({ from: from, to: to })
+                    }
+                })
+
+                // 鍒犻櫎杩炵嚎鍥炶皟
+                this.jsPlumb.bind("connectionDetached", (evt) => {
+                    this.deleteLine(evt.sourceId, evt.targetId)
+                })
+
+                // 鏀瑰彉绾跨殑杩炴帴鑺傜偣
+                this.jsPlumb.bind("connectionMoved", (evt) => {
+                    this.changeLine(evt.originalSourceId, evt.originalTargetId)
+                })
+
+                // 杩炵嚎鍙冲嚮
+                this.jsPlumb.bind("contextmenu", (evt) => {
+                    console.log('contextmenu', evt)
+                })
+
+                // 杩炵嚎
+                this.jsPlumb.bind("beforeDrop", (evt) => {
+                    let from = evt.sourceId
+                    let to = evt.targetId
+                    if (from === to) {
+                        this.$message.error('鑺傜偣涓嶆敮鎸佽繛鎺ヨ嚜宸�')
+                        return false
+                    }
+                    if (this.hasLine(from, to)) {
+                        this.$message.error('璇ュ叧绯诲凡瀛樺湪,涓嶅厑璁搁噸澶嶅垱寤�')
+                        return false
+                    }
+                    if (this.hashOppositeLine(from, to)) {
+                        this.$message.error('涓嶆敮鎸佷袱涓妭鐐逛箣闂磋繛绾垮洖鐜�');
+                        return false
+                    }
+                    this.$message.success('杩炴帴鎴愬姛')
+                    setTimeout(() => { this.setLineLabel(from, to, 'x') }, 50)
+                    return true
+                })
+
+                // beforeDetach
+                this.jsPlumb.bind("beforeDetach", (evt) => {
+                    console.log('beforeDetach', evt)
+                })
+                this.jsPlumb.setContainer(this.$refs.efContainer)
+            })
+        },
+        // 鍔犺浇娴佺▼鍥�
+        loadEasyFlow() {
+            // 鍒濆鍖栬妭鐐�
+            for (var i = 0; i < this.data.nodeList.length; i++) {
+                let node = this.data.nodeList[i]
+                if (node.userId && node.userId != '') {
+                    // userId涓烘暟鍊肩被鍨�
+                    if (typeof node.userId == 'number'){
+                        node.userId = [node.userId]
+                    } else {
+                        node.userId = node.userId.split(',').map(Number);
+                    }
+                } else {
+                    node.userId = []
+                }
+                // 璁剧疆婧愮偣锛屽彲浠ユ嫋鍑虹嚎杩炴帴鍏朵粬鑺傜偣
+                this.jsPlumb.makeSource(node.id, lodash.merge(this.jsplumbSourceOptions, {}))
+                // // 璁剧疆鐩爣鐐癸紝鍏朵粬婧愮偣鎷栧嚭鐨勭嚎鍙互杩炴帴璇ヨ妭鐐�
+                this.jsPlumb.makeTarget(node.id, this.jsplumbTargetOptions)
+                if (!node.viewOnly && !this.disabled) {
+                    this.jsPlumb.draggable(node.id, {
+                        containment: 'parent',
+                        stop: function (el) {
+                            // 鎷栨嫿鑺傜偣缁撴潫鍚庣殑瀵硅皟
+                            console.log('鎷栨嫿缁撴潫: ', el)
+                        }
+                    })
+                }
+            }
+            // 鍒濆鍖栬繛绾�
+            for (var i = 0; i < this.data.lineList.length; i++) {
+                let line = this.data.lineList[i]
+                var connParam = {
+                    source: line.from,
+                    target: line.to,
+                    label: this.disabled ? null : (line.label ? line.label : 'x'),
+                    connector: line.connector ? line.connector : '',
+                    anchors: line.anchors ? line.anchors : undefined,
+
+                    paintStyle: line.paintStyle ? line.paintStyle : undefined,
+                }
+                this.jsPlumb.connect(connParam, this.jsplumbConnectOptions)
+            }
+            this.$nextTick(function () {
+                this.loadEasyFlowFinish = true
+            })
+        },
+        // 璁剧疆杩炵嚎鏉′欢
+        setLineLabel(from, to, label) {
+            var conn = this.jsPlumb.getConnections({
+                source: from,
+                target: to
+            })[0]
+            if (!label || label === '') {
+                conn.removeClass('flowLabel ')
+                conn.addClass('emptyFlowLabel')
+            } else {
+                conn.addClass('flowLabel')
+            }
+            conn.setLabel({
+                label: 'x' //label,
+            })
+            this.data.lineList.forEach(function (line) {
+                if (line.from == from && line.to == to) {
+                    line.label = 'x'// label
+                }
+            })
+
+        },
+        // 鍒犻櫎婵�娲荤殑鍏冪礌
+        deleteElement() {
+            if (this.disabled)
+                return
+            if (this.activeElement.type === 'node') {
+                this.deleteNode(this.activeElement.nodeId)
+            } else if (this.activeElement.type === 'line') {
+                this.$confirm('纭畾鍒犻櫎鎵�鐐瑰嚮鐨勭嚎鍚�?', '鎻愮ず', {
+                    confirmButtonText: '纭畾',
+                    cancelButtonText: '鍙栨秷',
+                    type: 'warning'
+                }).then(() => {
+                    var conn = this.jsPlumb.getConnections({
+                        source: this.activeElement.sourceId,
+                        target: this.activeElement.targetId
+                    })[0]
+                    this.jsPlumb.deleteConnection(conn)
+                }).catch(() => {
+                })
+            }
+        },
+        // 鍒犻櫎绾�
+        deleteLine(from, to) {
+            this.data.lineList = this.data.lineList.filter(function (line) {
+                if (line.from == from && line.to == to) {
+                    return false
+                }
+                return true
+            })
+        },
+        // 鏀瑰彉杩炵嚎
+        changeLine(oldFrom, oldTo) {
+            this.deleteLine(oldFrom, oldTo)
+        },
+        // 鏀瑰彉鑺傜偣鐨勪綅缃�
+        changeNodeSite(data) {
+            for (var i = 0; i < this.data.nodeList.length; i++) {
+                let node = this.data.nodeList[i]
+                if (node.id === data.nodeId) {
+                    node.left = data.left
+                    node.top = data.top
+                }
+            }
+        },
+        /**
+         * 鎷栨嫿缁撴潫鍚庢坊鍔犳柊鐨勮妭鐐�
+         * @param evt
+         * @param nodeMenu 琚坊鍔犵殑鑺傜偣瀵硅薄
+         * @param mousePosition 榧犳爣鎷栨嫿缁撴潫鐨勫潗鏍�
+         */
+        addNode(evt, nodeMenu, mousePosition) {
+            if (nodeMenu.type == 'start' && this.data.nodeList.some(x => { return x.type == 'start' })) {
+                this.$message.error('銆愭祦绋嬬粨鏉熴�戣妭鐐瑰凡瀛樺湪,鍙湁閫夋嫨涓�涓祦绋嬪紑濮嬭妭鐐�');
+                return
+            }
+            if (nodeMenu.type == 'end' && this.data.nodeList.some(x => { return x.type == 'end' })) {
+                this.$message.error('銆愭祦绋嬬粨鏉熴�戣妭鐐瑰凡瀛樺湪,鍙湁閫夋嫨涓�涓祦绋嬪紑濮嬭妭鐐�');
+                return
+            }
+            var screenX = evt.originalEvent.clientX, screenY = evt.originalEvent.clientY
+            let efContainer = this.$refs.efContainer
+            var containerRect = efContainer.getBoundingClientRect()
+            var left = screenX, top = screenY
+            // 璁$畻鏄惁鎷栧叆鍒板鍣ㄤ腑
+            if (left < containerRect.x || left > containerRect.width + containerRect.x || top < containerRect.y || containerRect.y > containerRect.y + containerRect.height) {
+                this.$message.error("璇锋妸鑺傜偣鎷栧叆鍒扮敾甯冧腑")
+                return
+            }
+            left = left - containerRect.x + efContainer.scrollLeft
+            top = top - containerRect.y + efContainer.scrollTop
+            // 灞呬腑
+            left -= 85
+            top -= 16
+            var nodeId = this.getUUID()
+            // 鍔ㄦ�佺敓鎴愬悕瀛�
+            var origName = nodeMenu.name
+            var nodeName = origName
+            var index = 1
+            while (index < 10000) {
+                var repeat = false
+                for (var i = 0; i < this.data.nodeList.length; i++) {
+                    let node = this.data.nodeList[i]
+                    if (node.name === nodeName) {
+                        nodeName = origName + index
+                        repeat = true
+                    }
+                }
+                if (repeat) {
+                    index++
+                    continue
+                }
+                break
+            }
+            var node = {
+                id: nodeId,
+                name: nodeName,
+                type: nodeMenu.type,
+                left: left + 'px',
+                top: top + 'px',
+                ico: nodeMenu.ico,
+                state: 'success'
+            }
+            /**
+             * 杩欓噷鍙互杩涜涓氬姟鍒ゆ柇銆佹槸鍚﹁兘澶熸坊鍔犺鑺傜偣
+             */
+            this.data.nodeList.push(node)
+            this.$nextTick(function () {
+                this.jsPlumb.makeSource(nodeId, this.jsplumbSourceOptions)
+                this.jsPlumb.makeTarget(nodeId, this.jsplumbTargetOptions)
+                this.jsPlumb.draggable(nodeId, {
+                    containment: 'parent',
+                    stop: function (el) {
+                        // 鎷栨嫿鑺傜偣缁撴潫鍚庣殑瀵硅皟
+                        console.log('鎷栨嫿缁撴潫: ', el)
+                    }
+                })
+            })
+        },
+        /**
+         * 鍒犻櫎鑺傜偣
+         * @param nodeId 琚垹闄よ妭鐐圭殑ID
+         */
+        deleteNode(nodeId) {
+            this.$confirm('纭畾瑕佸垹闄よ妭鐐�' + nodeId + '?', '鎻愮ず', {
+                confirmButtonText: '纭畾',
+                cancelButtonText: '鍙栨秷',
+                type: 'warning',
+                closeOnClickModal: false
+            }).then(() => {
+                /**
+                 * 杩欓噷闇�瑕佽繘琛屼笟鍔″垽鏂紝鏄惁鍙互鍒犻櫎
+                 */
+                this.data.nodeList = this.data.nodeList.filter(function (node) {
+                    if (node.id === nodeId) {
+                        // 浼垹闄わ紝灏嗚妭鐐归殣钘忥紝鍚﹀垯浼氬鑷翠綅缃敊浣�
+                        // node.show = false
+                        return false
+                    }
+                    return true
+                })
+                this.$nextTick(function () {
+                    this.jsPlumb.removeAllEndpoints(nodeId);
+                })
+            }).catch(() => {
+            })
+            return true
+        },
+        clickNode(nodeId) {
+            this.activeElement.type = 'node'
+            this.activeElement.nodeId = nodeId
+            this.$refs.nodeForm.nodeInit(this.data, nodeId, this.formFields.WorkTable)
+        },
+        // 鏄惁鍏锋湁璇ョ嚎
+        hasLine(from, to) {
+            for (var i = 0; i < this.data.lineList.length; i++) {
+                var line = this.data.lineList[i]
+                if (line.from === from && line.to === to) {
+                    return true
+                }
+            }
+            return false
+        },
+        // 鏄惁鍚湁鐩稿弽鐨勭嚎
+        hashOppositeLine(from, to) {
+            return this.hasLine(to, from)
+        },
+        nodeRightMenu(nodeId, evt) {
+            this.menu.show = true
+            this.menu.curNodeId = nodeId
+            this.menu.left = evt.x + 'px'
+            this.menu.top = evt.y + 'px'
+        },
+        repaintEverything(node) {
+            let _node = this.data.nodeList.find((x) => {
+                return x.id == node.id;
+            });
+            Object.assign(_node, node);
+            console.log(_node);
+            this.jsPlumb.repaint();
+        },
+        // 鍔犺浇娴佺▼鍥�
+        dataReload(data, isAdd) {
+            this.easyFlowVisible = false
+            this.data.nodeList = []
+            this.data.lineList = []
+            this.$nextTick(() => {
+                data = lodash.cloneDeep(data)
+                this.easyFlowVisible = true
+                this.data = data
+                this.$nextTick(() => {
+                    this.jsPlumb = jsPlumb.getInstance()
+                    this.$nextTick(() => {
+                        this.jsPlumbInit()
+                    })
+                })
+            })
+            this.formRules.forEach(options => {
+                options.forEach(option => {
+                    if (option.field == "WorkTable") {
+                        option.readonly = !isAdd;
+                    }
+                })
+            })
+        },
+        zoomAdd() {
+            if (this.zoom >= 1) {
+                return
+            }
+            this.zoom = this.zoom + 0.1
+            this.$refs.efContainer.style.zoom = this.zoom;
+            // this.jsPlumb.setZoom(this.zoom)
+        },
+        zoomSub() {
+            if (this.zoom <= 0) {
+                return
+            }
+            this.zoom = this.zoom - 0.1;
+            if (this.zoom < 0.3) {
+                this.zoom = 0.3;
+            }
+            this.$refs.efContainer.style.zoom = this.zoom;
+            // this.jsPlumb.setZoom(this.zoom)
+        }
+    }
+}
+</script>
+<style scoped lang="less">
+@import './index.css';
+
+.flow-panel {
+    position: absolute;
+    height: 100%;
+    width: 100%;
+}
+
+.flow-panel ::v-deep(.el-form-item__label) {
+    margin-bottom: -2px !important;
+    text-align: left;
+    padding: 0 !important;
+    justify-content: flex-start;
+}
+
+.flow-panel ::v-deep(.el-form-item) {
+    display: flex;
+    flex-direction: column;
+    margin-bottom: 7px !important;
+
+}
+
+.ef-node-menu-form {
+    padding: 0px;
+}
+
+::-webkit-scrollbar {
+    width: 0px;
+    height: 0px;
+}
+
+::-webkit-scrollbar-thumb {
+    border-radius: 0px;
+    background: #e0e3e7;
+    height: 20px;
+}
+
+::-webkit-scrollbar-track {
+    background-color: transparent;
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/basicinfo/extend/addrouters.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/basicinfo/extend/addrouters.vue
new file mode 100644
index 0000000..28ed38f
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/basicinfo/extend/addrouters.vue
@@ -0,0 +1,351 @@
+<template>
+  <div>
+    <vol-box
+      v-model="showDetialBox"
+      :lazy="true"
+      :width="width"
+      :padding="15"
+      title="璺敱閰嶇疆"
+      :footer="true"
+    >
+      <el-row height="50">
+        <el-col :span="24">
+          <div class="grid-content right-text">
+            <!-- <el-link type="primary" @click="deleteNode">绉婚櫎鑺傜偣</el-link> -->
+            <el-link type="primary" @click="addNode">娣诲姞鑺傜偣</el-link>
+          </div>
+          <div class="grid-content right-text"></div>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="6">
+          <div
+            class="grid-content"
+            style="font-weight: bold; font-size: 18px; margin-left: 5%"
+          >
+            <el-form :rules="routeTypeRules" :model="routerType">
+              <el-form-item label="璺敱绫诲瀷" label-width="120" prop="type">
+                <el-select
+                  v-model="routerType.type"
+                  filterable
+                  placeholder="璇烽�夋嫨"
+                >
+                  <el-option
+                    v-for="item in routerTypes"
+                    :key="item.key"
+                    :label="item.value"
+                    :value="item.key"
+                  >
+                    <span style="float: left">{{ item.value }}</span>
+                    <span
+                      style="float: right; color: #8492a6; font-size: 13px"
+                      >{{ item.key }}</span
+                    >
+                  </el-option>
+                </el-select>
+              </el-form-item>
+            </el-form>
+          </div>
+        </el-col>
+      </el-row>
+      <div style="overflow-x: auto">
+        <el-row style="margin-top: 3%">
+          <el-col :span="24">
+            <el-steps align-center :active="routers.length">
+              <el-step
+                v-for="(router, index) in routers"
+                :title="getTitle(index)"
+                :key="index"
+                icon=""
+                description="111"
+                style="min-width: 280px"
+              >
+                <template v-slot:description="{}">
+                  <div>
+                    <el-form
+                      :rules="rules"
+                      class="demo-ruleForm"
+                      :model="router"
+                      label-width="110px"
+                      style="margin-top: 1%"
+                      ref="router"
+                    >
+                      <el-form-item
+                        label="浣嶇疆缂栧彿"
+                        placeholder="璇烽�夋嫨浣嶇疆缂栧彿"
+                        prop="positionCode"
+                      >
+                        <el-select
+                          filterable
+                          v-model="router.positionCode"
+                          @change="deviceCodeChange"
+                        >
+                          <el-option
+                            v-for="deviceCode in filterDeviceCodes"
+                            :key="deviceCode.key"
+                            :label="deviceCode.key"
+                            :value="deviceCode.key"
+                          />
+                        </el-select>
+                      </el-form-item>
+                      <el-form-item
+                        v-show="
+                          index == routers.length - 1 &&
+                          !router.positionCode.includes('SC')
+                        "
+                        label="瀛愪綅缃紪鍙�"
+                        prop="childPositionCode"
+                      >
+                        <el-select
+                          filterable
+                          v-model="router.childPositionCode"
+                          @change="childDeviceCodeChange"
+                        >
+                          <el-option
+                            v-for="childDeviceCode in filterChildDeviceCodes"
+                            :key="childDeviceCode.key"
+                            :label="childDeviceCode.key"
+                            :value="childDeviceCode.key"
+                          />
+                        </el-select>
+                      </el-form-item>
+                      <el-form-item
+                        v-show="
+                          router.positionCode.includes('SC') ||
+                          router.childPositionCode.includes('SC')
+                        "
+                        label="鍫嗗灈鏈鸿"
+                        prop="sCRow"
+                      >
+                        <el-input v-model="router.sCRow"></el-input>
+                      </el-form-item>
+                      <el-form-item
+                        v-show="
+                          router.positionCode.includes('SC') ||
+                          router.childPositionCode.includes('SC')
+                        "
+                        label="鍫嗗灈鏈哄垪"
+                        prop="sCColumn"
+                      >
+                        <el-input v-model="router.sCColumn"></el-input>
+                      </el-form-item>
+                      <el-form-item
+                        v-show="
+                          router.positionCode.includes('SC') ||
+                          router.childPositionCode.includes('SC')
+                        "
+                        label="鍫嗗灈鏈哄眰"
+                        prop="sCLayer"
+                      >
+                        <el-input v-model="router.sCLayer"></el-input>
+                      </el-form-item>
+                    </el-form>
+                  </div>
+                </template>
+              </el-step>
+            </el-steps>
+          </el-col>
+        </el-row>
+      </div>
+      <template #footer>
+        <div>
+          <el-button plain type="danger" @click="save"
+            ><i class="el-icon-check"></i>淇� 瀛�</el-button
+          >
+          <el-button type="primary" size="mini" @click="showDetialBox = false"
+            ><i class="el-icon-close"></i>鍏抽棴</el-button
+          >
+        </div>
+      </template>
+    </vol-box>
+  </div>
+</template>
+    
+    <script>
+import VolBox from "@/components/basic/VolBox.vue";
+import { el } from "element-plus/es/locale";
+export default {
+  components: { VolBox },
+  data() {
+    return {
+      width: 1200,
+      active: 0,
+      showDetialBox: false,
+      routerTypes: [],
+      routerType: { type: "" },
+      deviceCodes: [],
+      filterDeviceCodes: [],
+      childDeviceCodes: [],
+      filterChildDeviceCodes: [],
+      routers: [
+        {
+          positionCode: "",
+          childPositionCode: "",
+          sCRow: "",
+          sCColumn: "",
+          sCLayer: "",
+        },
+        {
+          positionCode: "",
+          childPositionCode: "",
+          sCRow: "",
+          sCColumn: "",
+          sCLayer: "",
+        },
+      ],
+      rules: {
+        positionCode: [
+          { required: true, message: "璇烽�夋嫨浣嶇疆缂栧彿", trigger: "change" },
+        ],
+      },
+      routeTypeRules: {
+        type: [
+          { required: true, message: "璇烽�夋嫨璺敱绫诲瀷", trigger: "change" },
+        ],
+      },
+    };
+  },
+  methods: {
+    open() {
+      this.routerTypes = [];
+      this.routerType = { type: "" };
+      this.deviceCode = "";
+      this.deviceCodes = [];
+      this.filterDeviceCodes = [];
+      this.childDeviceCodes = [];
+      this.filterChildDeviceCodes = [];
+      this.routers = [
+        {
+          positionCode: "",
+          childPositionCode: "",
+          sCRow: "",
+          sCColumn: "",
+          sCLayer: "",
+        },
+        {
+          positionCode: "",
+          childPositionCode: "",
+          sCRow: "",
+          sCColumn: "",
+          sCLayer: "",
+        },
+      ];
+      this.showDetialBox = true;
+      this.getData();
+    },
+    getData() {
+      this.http.post("/api/Router/GetBaseRouterInfo", {}, true).then((x) => {
+        if (!x.status) return this.$message.error(x.message);
+        this.routerTypes = x.data.routerTypes;
+        this.deviceCodes = x.data.deviceCodes;
+        x.data.areaInfos.forEach((v) => {
+          this.deviceCodes.push(v);
+        });
+        this.filterDeviceCodes = this.deviceCodes;
+        this.childDeviceCodes = this.deviceCodes;
+        this.filterChildDeviceCodes = this.deviceCodes;
+      });
+    },
+    addNode() {
+      this.routers.push({
+        positionCode: "",
+        childPositionCode: "",
+        childPosiDeviceCode: "",
+        sCRow: "",
+        sCColumn: "",
+        sCLayer: "",
+      });
+    },
+    deleteNode() {
+      this.routers.splice(this.routers.length - 1, 1);
+    },
+    getTitle(index) {
+      if (index === 0) {
+        return "璧风偣";
+      } else if (index === this.routers.length - 1) {
+        return "缁堢偣";
+      } else {
+        return "瀛愯妭鐐�" + index;
+      }
+    },
+    save() {
+      this.$refs.router.forEach((x) => {
+        console.log(x);
+        x.validate((valid) => {
+          if (!valid) {
+            return false;
+          }
+        });
+      });
+      this.http
+        .post(
+          "/api/Router/AddRouters?routerType=" + this.routerType.type,
+          this.routers,
+          true
+        )
+        .then((x) => {
+          if (!x.status) return this.$message.error(x.message);
+          this.$message.success("鎿嶄綔鎴愬姛");
+          this.$emit("parentCall", ($vue) => {
+            $vue.refresh();
+          });
+          this.showDetialBox = false;
+        });
+    },
+    deviceCodeChange(value) {
+      var positionCodes = [];
+      this.routers.forEach((x) => {
+        if (x.positionCode && x.positionCode != "") {
+          positionCodes.push(x.positionCode);
+        }
+      });
+      this.filterDeviceCodes = this.deviceCodes.filter(
+        (x) => !positionCodes.includes(x.key)
+      );
+    },
+    childDeviceCodeChange(value) {
+      var positionCodes = [];
+      this.routers.forEach((x) => {
+        if (x.childPositionCode && x.childPositionCode != "") {
+          positionCodes.push(x.childPositionCode);
+        }
+      });
+      this.filterChildDeviceCodes = this.childDeviceCodes.filter(
+        (x) => !positionCodes.includes(x.key)
+      );
+    },
+  },
+  created() {},
+};
+</script>
+    
+    <style scoped>
+.el-col {
+  border-radius: 4px;
+}
+.grid-content {
+  border-radius: 4px;
+  min-height: 36px;
+}
+.content-text {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.left-text {
+  display: flex;
+  align-items: center;
+  justify-content: flex-start;
+}
+.right-text {
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+}
+</style>
+    <style>
+.el-step.is-center .el-step__description {
+  padding-left: 5%;
+  padding-right: 5%;
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/basicinfo/extend/routerview.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/basicinfo/extend/routerview.vue
new file mode 100644
index 0000000..7ad2ff8
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/basicinfo/extend/routerview.vue
@@ -0,0 +1,96 @@
+<template>
+  <div>
+    <vol-box
+      v-model="showDetialBox"
+      :lazy="true"
+      width="1200px"
+      :padding="15"
+      title="瀹屾暣璺敱鏌ョ湅"
+    >
+      <div
+        style="margin-bottom: 1%"
+        v-for="(item, index) in routerDatas"
+        :key="index"
+      >
+        <el-row>
+          <el-col>
+            <div
+              class="grid-content right-text"
+              style="font-weight: bold; font-size: 18px"
+            >
+              <span>{{ item.type == "Out" ? "鍑哄簱璺敱" : "鍏ュ簱璺敱" }}</span>
+            </div>
+          </el-col>
+        </el-row>
+        <el-steps :active="item.routes.length" align-center simple>
+          <el-step
+            v-for="itemRouter in item.routes"
+            :key="itemRouter"
+            :title="itemRouter"
+            icon=""
+          ></el-step>
+        </el-steps>
+      </div>
+    </vol-box>
+  </div>
+</template>
+  
+  <script>
+import VolBox from "@/components/basic/VolBox.vue";
+export default {
+  components: { VolBox },
+  data() {
+    return {
+      active: 0,
+      showDetialBox: false,
+      routerDatas: [],
+    };
+  },
+  methods: {
+    open() {
+      this.showDetialBox = true;
+      this.getData();
+    },
+    getData() {
+      this.http.post("/api/Router/GetAllWholeRouters", {}, true).then((x) => {
+        if (!x.status) return this.$message.error(x.message);
+        this.routerDatas = x.data;
+      });
+    },
+  },
+  created() {},
+};
+</script>
+  
+  <style scoped>
+.el-col {
+  border-radius: 4px;
+}
+.grid-content {
+  border-radius: 4px;
+  min-height: 36px;
+}
+.content-text {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.left-text {
+  display: flex;
+  align-items: center;
+  justify-content: flex-start;
+}
+</style>
+  <style>
+.el-table .warning-row {
+  background: #fcf1e2;
+}
+
+.el-table .success-row {
+  background: #f0f9eb;
+}
+
+.el-table .error-row {
+  background: #fde2e2;
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/quartzJob/extend/importDevicePro.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/quartzJob/extend/importDevicePro.vue
new file mode 100644
index 0000000..66b521c
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/quartzJob/extend/importDevicePro.vue
@@ -0,0 +1,116 @@
+<template>
+  <div>
+    <vol-box
+      v-model="showDetialBox"
+      :lazy="true"
+      :height="350"
+      :width="600"
+      :padding="15"
+      title="璁惧鍗忚淇℃伅-瀵煎叆"
+    >
+      <upload-excel
+        ref="upload_excel"
+        :url="url"
+        :template="template"
+      ></upload-excel>
+    </vol-box>
+  </div>
+</template>
+    
+    <script>
+import VolBox from "@/components/basic/VolBox.vue";
+import UploadExcel from "@/components/basic/UploadExcel.vue";
+export default {
+  components: { VolBox, UploadExcel },
+  data() {
+    return {
+      showDetialBox: false,
+      url: "",
+      template: {
+        url: "", //妯℃澘涓嬭浇璺緞锛屽鏋滄病鏈夋ā鏉胯矾寰勶紝鍒欎笉鏄剧ず涓嬭浇妯℃澘鍔熻兘
+        fileName: "璁惧鍗忚淇℃伅瀵煎叆妯℃澘", //涓嬭浇妯℃澘鐨勬枃浠跺悕
+      },
+    };
+  },
+  methods: {
+    open() {
+      this.template.url = `${this.http.ipAddress}api/DeviceProtocol/DownLoadTemplate`;
+      this.url = `${this.http.ipAddress}api/DeviceProtocol/GetImportData`;
+      this.showDetialBox = true;
+      this.$nextTick(() => {
+        this.$refs.upload_excel.upload = this.upload;
+        console.log(this.$refs.upload_excel);
+      });
+    },
+    upload() {
+      console.log("upload");
+      let _url = this.url;
+      if (!_url) {
+        return this.$Message.error("娌℃湁閰嶇疆濂経rl");
+      }
+
+      if (!this.$refs.upload_excel.file) {
+        return this.$Message.error("璇烽�夋嫨鏂囦欢");
+      }
+      var formData = new FormData();
+      formData.append("fileInput", this.$refs.upload_excel.file);
+      if (!this.$refs.upload_excel.importExcelBefore(formData)) {
+        return;
+      }
+      this.$refs.upload_excel.loadingStatus = true;
+      this.http.post(_url, formData).then(
+        (x) => {
+          // this.$refs.uploadFile.clearFiles();
+          this.$refs.upload_excel.loadingStatus = false;
+          this.$refs.upload_excel.file = null;
+          if (x.status) {
+            this.$emit("parentCall", ($vue) => {
+              $vue.$refs.detail.rowData.push(...x.data);
+            });
+          }
+
+          this.message = x.message;
+          this.resultClass = x.status ? "v-r-success" : "v-r-error";
+        },
+        (error) => {
+          this.$refs.upload_excel.loadingStatus = false;
+        }
+      );
+    },
+  },
+  created() {},
+};
+</script>
+    
+    <style scoped>
+.el-col {
+  border-radius: 4px;
+}
+.grid-content {
+  border-radius: 4px;
+  min-height: 36px;
+}
+.content-text {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.left-text {
+  display: flex;
+  align-items: center;
+  justify-content: flex-start;
+}
+</style>
+    <style>
+.el-table .warning-row {
+  background: #fcf1e2;
+}
+
+.el-table .success-row {
+  background: #f0f9eb;
+}
+
+.el-table .error-row {
+  background: #fde2e2;
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/system/Sys_User/Sys_UserGridHeader.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/system/Sys_User/Sys_UserGridHeader.vue
new file mode 100644
index 0000000..f6f59be
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/system/Sys_User/Sys_UserGridHeader.vue
@@ -0,0 +1,85 @@
+<template>
+  <div>
+    <vol-box
+      v-model="model"
+      :padding="30"
+      title="淇敼瀵嗙爜"
+      :width="500"
+      :height="250"
+    >
+      <el-alert type="success">
+        <h3>
+          <span>甯愬彿锛歿{ row.userName }}</span>
+          <span>鐢ㄦ埛锛歿{ row.userTrueName }}</span>
+        </h3>
+      </el-alert>
+      <div>
+        <el-input
+          placeholder="璇疯緭鍏ュ瘑鐮�"
+          v-model="password"
+          size="large"
+          style="width: 100%; margin-top: 15px"
+        />
+      </div>
+      <template #footer>
+        <el-button
+          type="primary"
+          @click="savePwd()"
+          >淇敼瀵嗙爜</el-button
+        >
+        <el-button
+          @click="model = false"
+          >鍏抽棴</el-button
+        >
+      </template>
+    </vol-box>
+  </div>
+</template>
+<script>
+import { defineComponent, defineAsyncComponent } from "vue";
+export default defineComponent({
+  components: {
+    VolBox: defineAsyncComponent(() => import("@/components/basic/VolBox.vue"))
+  },
+  data() {
+    return {
+      row: {},
+      password: "",
+      model: false,
+    };
+  },
+  methods: {
+    open(row) {
+      this.password = "";
+      this.row = row;
+      this.model = true;
+    },
+    savePwd() {
+      if (!this.password) return this.$Message.error("璇疯緭瀵嗙爜");
+      if (this.password.length < 6)
+        return this.$Message.error("瀵嗙爜闀垮害鑷冲皯6浣�");
+      let url =
+        "/api/user/modifyUserPwd?password=" +
+        this.password +
+        "&userName=" +
+        this.row.UserName;
+      this.http.post(url, {}, true).then((x) => {
+        if (!x.status) {
+          return this.$message.error(x.message);
+        }
+        this.model = false;
+        this.$Message.success(x.message);
+      });
+    },
+  },
+  created() {},
+})
+</script>
+<style lang="less" scoped>
+h3 {
+  font-weight: 500;
+  > span:last-child {
+    margin-left: 30px;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/taskinfo/extend/taskExecuteDetail.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/taskinfo/extend/taskExecuteDetail.vue
new file mode 100644
index 0000000..ced7068
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/extension/taskinfo/extend/taskExecuteDetail.vue
@@ -0,0 +1,259 @@
+<template>
+  <div>
+    <vol-box
+      v-model="showDetialBox"
+      :lazy="true"
+      width="1200px"
+      :padding="15"
+      title="浠诲姟璇︽儏"
+    >
+      <el-row height="50">
+        <el-col :span="24">
+          <div class="grid-content right-text">
+            <el-link type="primary" @click="switchView">鍒囨崲瑙嗗浘</el-link>
+          </div>
+        </el-col>
+      </el-row>
+      <div :style="{ height: height }">
+        <div v-if="viewType == 1">
+          <el-row height="50">
+            <el-col :span="8">
+              <div
+                class="grid-content content-text"
+                style="font-weight: bold; font-size: 18px"
+              >
+                <span>浠诲姟缂栧彿锛歿{ row.taskNum }}</span>
+              </div>
+            </el-col>
+            <el-col :span="8">
+              <div
+                class="grid-content content-text"
+                style="font-weight: bold; font-size: 18px"
+              >
+                <span>鎵樼洏缂栧彿锛歿{ row.palletCode }}</span>
+              </div>
+            </el-col>
+            <el-col :span="8">
+              <div
+                class="grid-content content-text"
+                style="font-weight: bold; font-size: 18px"
+              >
+                <span>浠诲姟鐘舵�侊細{{ row.taskState }}</span>
+              </div>
+            </el-col>
+          </el-row>
+          <div style="height: 100px; margin-top: 3%">
+            <el-steps :active="active" align-center finish-status="success">
+              <el-step
+                v-for="item in steps"
+                :key="item.title"
+                :title="item.title"
+                :description="item.description"
+              ></el-step>
+            </el-steps>
+          </div>
+          <el-row height="50" v-show="previousShow || nextShow">
+            <el-col :span="8">
+              <div v-show="previousShow" class="grid-content content-text">
+                <el-button type="danger" @click="previous"
+                  >鍥炴粴鍒颁笂涓�姝�</el-button
+                >
+              </div>
+            </el-col>
+            <el-col :span="8">
+              <div v-show="recoveryShow" class="grid-content content-text">
+                <el-button type="primary" @click="recovery">浠诲姟鎸傝捣鎭㈠</el-button>
+              </div>
+            </el-col>
+            <el-col :span="8">
+              <div v-show="nextShow" class="grid-content content-text">
+                <el-button type="warning" @click="next">璺宠浆鍒颁笅涓�姝�</el-button>
+              </div>
+            </el-col>
+          </el-row>
+        </div>
+        <div v-else>
+          <el-table
+            :data="tableData"
+            style="width: 100%"
+            :row-class-name="tableRowClassName"
+          >
+            <el-table-column type="index" width="50"> </el-table-column>
+            <el-table-column prop="taskNum" label="浠诲姟鍙�" width="90">
+            </el-table-column>
+            <el-table-column prop="taskState" label="浠诲姟鐘舵��" width="90">
+            </el-table-column>
+            <el-table-column prop="currentAddress" label="褰撳墠浣嶇疆" width="90">
+            </el-table-column>
+            <el-table-column prop="nextAddress" label="涓嬩竴浣嶇疆" width="90">
+            </el-table-column>
+            <el-table-column prop="isManual" label="鏄惁浜哄伐鎿嶄綔" width="120">
+            </el-table-column>
+            <el-table-column prop="isNormal" label="鏄惁姝e父" width="90">
+            </el-table-column>
+            <el-table-column prop="description" label="鎻忚堪"> </el-table-column>
+            <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" width="180">
+            </el-table-column>
+            <el-table-column prop="remark" label="澶囨敞" width="180">
+            </el-table-column>
+          </el-table>
+        </div>
+      </div>
+    </vol-box>
+  </div>
+</template>
+
+<script>
+import VolBox from "@/components/basic/VolBox.vue";
+export default {
+  components: { VolBox },
+  data() {
+    return {
+      active: 0,
+      showDetialBox: false,
+      row: {},
+      steps: [],
+      viewType: 1,
+      height: "200px",
+      tableData: [],
+      previousShow: false,
+      nextShow: false,
+      recoveryShow: true,
+    };
+  },
+  methods: {
+    open(row) {
+      this.row = row;
+      this.showDetialBox = true;
+      if (this.viewType == 1) {
+        this.getSteps();
+      } else {
+        this.getDetailDatas();
+      }
+
+      this.$emit("parentCall", ($vue) => {
+        var previousButton = $vue.buttons.find((x) => x.value == "Previous");
+        this.previousShow = previousButton != null;
+
+        var nextButton = $vue.buttons.find((x) => x.value == "Next");
+        this.nextShow = nextButton != null;
+      });
+    },
+    getSteps() {
+      this.http
+        .post(
+          "/api/TaskExecuteDetail/GetDetailInfo?taskNum=" + this.row.taskNum,
+          {},
+          true
+        )
+        .then((x) => {
+          if (!x.status) return this.$message.error(x.message);
+          this.steps = x.data.list;
+          this.active = x.data.active;
+        });
+    },
+    getDetailDatas() {
+      this.http
+        .post(
+          "/api/TaskExecuteDetail/GetDetailDatas?taskNum=" + this.row.taskNum,
+          {},
+          true
+        )
+        .then((x) => {
+          if (!x.status) return this.$message.error(x.message);
+          this.tableData = x.data;
+        });
+    },
+    previous() {
+      this.http
+        .post(
+          "/api/Task/RollbackTaskStatusToLast?taskNum=" + this.row.taskNum,
+          {},
+          true
+        )
+        .then((x) => {
+          if (!x.status) return this.$message.error(x.message);
+          this.$message.success("鎿嶄綔鎴愬姛");
+          this.getSteps();
+        });
+    },
+    recovery(){
+      this.http
+        .post(
+          "/api/Task/TaskStatusRecovery?taskNum=" + this.row.taskNum,
+          {},
+          true
+        )
+        .then((x) => {
+          if (!x.status) return this.$message.error(x.message);
+          this.$message.success("鎿嶄綔鎴愬姛");
+          this.getSteps();
+        });
+    },
+    next() {
+      this.http
+        .post(
+          "/api/Task/UpdateTaskStatusToNext?taskNum=" + this.row.taskNum,
+          {},
+          true
+        )
+        .then((x) => {
+          if (!x.status) return this.$message.error(x.message);
+          this.$message.success("鎿嶄綔鎴愬姛");
+          this.getSteps();
+        });
+    },
+    switchView() {
+      this.viewType = this.viewType == 1 ? 2 : 1;
+      if (this.viewType == 2) {
+        this.height = "600px";
+        this.getDetailDatas();
+      } else {
+        this.height = "200px";
+      }
+    },
+    tableRowClassName({ row, rowIndex }) {
+      if (!row.isNormal) {
+        return "error-row";
+      } else if (row.isManual) {
+        return "warning-row";
+      }
+      return "success-row";
+    },
+  },
+  created() {},
+};
+</script>
+
+<style scoped>
+.el-col {
+  border-radius: 4px;
+}
+.grid-content {
+  border-radius: 4px;
+  min-height: 36px;
+}
+.content-text {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+.right-text {
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+}
+</style>
+<style>
+.el-table .warning-row {
+  background: #fcf1e2;
+}
+
+.el-table .success-row {
+  background: #f0f9eb;
+}
+
+.el-table .error-row {
+  background: #fde2e2;
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/AgingLibrary.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/AgingLibrary.vue
new file mode 100644
index 0000000..efcfdd9
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/AgingLibrary.vue
@@ -0,0 +1,102 @@
+<template>
+  <el-row>
+    <el-col :span="3">
+
+      <device-stacker v-for="stacker in Stackers" :key="stacker.deviceName" :Stacker="stacker"></device-stacker>
+    </el-col>
+    <el-col :span="21">
+      <device-line v-for="device in devices" :key="device.deviceName" :device="device" />
+    </el-col>
+  </el-row>
+</template>
+
+<script setup>
+import { onMounted, reactive, toRefs } from "vue";
+import eventBus from "@/uitils/eventBus";
+import DeviceLine from "@/components/DeviceLine.vue";
+import DeviceStacker from "@/components/DeviceStacker.vue";
+
+// 鍫嗗灈鏈�
+const Stackers = reactive([]);
+
+// 璁惧鍒楄〃锛堜慨鏀归噸澶嶈澶囧悕绉帮級
+const devices = reactive([]);
+
+const intToBitArrayFromBinaryString = (num, numBits) => {
+  let binaryString = num.toString(2).padStart(numBits, '0');
+  return Array.from({ length: numBits }, (_, index) => binaryString[index] === '1');
+};
+
+// 鐩戝惉璁惧鏁版嵁鍙樺寲
+onMounted(() => {
+  eventBus.on('locationData', eventData => {
+    console.log(eventData)
+    if (eventData.deviceName === "闄堝寲鍏ュ簱杈撻�佺嚎" || eventData.deviceName === "闄堝寲鍏ュ簱杈撻�佺嚎") {
+
+      if (devices.length <= 0) {
+        devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.childDeviceCode });
+      }
+      else {
+        const device = devices.find(c => c.childDeviceCode == eventData.childDeviceCode)
+        if (device) {
+          const number = eventData.data.commandWrite.writeInteractiveSignal;
+          const writeInteractiveSignal = intToBitArrayFromBinaryString(number, 8)
+          eventData.data.writeInteractiveSignal = writeInteractiveSignal;
+          device.data = eventData.data
+        }
+        else {
+          const number = eventData.data.commandWrite.writeInteractiveSignal;
+          const writeInteractiveSignal = intToBitArrayFromBinaryString(number, 8)
+          eventData.data.writeInteractiveSignal = writeInteractiveSignal;
+          devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.childDeviceCode });
+        }
+      }
+    }
+  });
+  eventBus.on('stackerData', eventData => {
+    if (eventData.deviceName.indexOf("闄堝寲") != -1) {
+      if (Stackers.length == 0) {
+        Stackers.push({ deviceName: eventData.deviceName, data: eventData.data });
+      }
+      else {
+        const Stacker = Stackers.find(c => c.deviceName == eventData.deviceName);
+        if (Stacker) {
+          Stacker.data = eventData.data
+        }
+        else {
+          Stackers.push({ deviceName: eventData.deviceName, data: eventData.data });
+        }
+      }
+    }
+  })
+});
+</script>
+<style scoped>
+.Stackerbox {
+  width: 220px;
+  float: left;
+}
+
+.Linebox {
+  width: 500px;
+  float: left;
+}
+
+.box1 {
+  float: left;
+}
+
+.card-body {
+  text-align: center;
+  border-radius: 6%;
+}
+
+.Stacker {
+  background-color: burlywood;
+}
+
+.lis {
+  float: left;
+  width: 233px;
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/FormationLibrary.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/FormationLibrary.vue
new file mode 100644
index 0000000..3d46097
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/FormationLibrary.vue
@@ -0,0 +1,49 @@
+<template>
+  <el-row>
+    <el-col :span="24">
+      <device-line v-for="device in devices" :key="device.deviceName" :device="device" />
+    </el-col>
+  </el-row>
+</template>
+
+<script setup>
+import { onMounted, reactive, toRefs } from "vue";
+import eventBus from "@/uitils/eventBus";
+import DeviceLine from "@/components/DeviceLine.vue";
+
+// 璁惧鍒楄〃锛堜慨鏀归噸澶嶈澶囧悕绉帮級
+const devices = reactive([]);
+
+const intToBitArrayFromBinaryString = (num, numBits) => {
+  let binaryString = num.toString(2).padStart(numBits, '0');
+  return Array.from({ length: numBits }, (_, index) => binaryString[index] === '1');
+};
+
+// 鐩戝惉璁惧鏁版嵁鍙樺寲
+onMounted(() => {
+  eventBus.on('locationData', eventData => {
+    if (eventData.deviceName === "鍖栨垚鍏ュ簱杈撻�佺嚎") {
+      if (devices.length <= 0) {
+        devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.childDeviceCode });
+      }
+      else {
+        const device = devices.find(c => c.childDeviceCode == eventData.childDeviceCode)
+        if (device) {
+          const number = eventData.data.commandWrite.writeInteractiveSignal;
+          const writeInteractiveSignal = intToBitArrayFromBinaryString(number, 8)
+          eventData.data.writeInteractiveSignal = writeInteractiveSignal;
+          device.data = eventData.data
+          
+        }
+        else {
+          const number = eventData.data.commandWrite.writeInteractiveSignal;
+          const writeInteractiveSignal = intToBitArrayFromBinaryString(number, 8)
+          eventData.data.writeInteractiveSignal = writeInteractiveSignal;
+          devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.childDeviceCode });
+        }
+      }
+    }
+  });
+});
+</script>
+
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/Staticlibrary.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/Staticlibrary.vue
new file mode 100644
index 0000000..96bc5cc
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/Staticlibrary.vue
@@ -0,0 +1,96 @@
+<template>
+  <el-row>
+    <el-col :span="3">
+      <device-stacker v-for="stacker in Stackers" :key="stacker.deviceName" :Stacker="stacker"></device-stacker>
+    </el-col>
+    <el-col :span="21">
+      <device-line v-for="device in devices" :key="device.deviceName" :device="device" />
+    </el-col>
+  </el-row>
+</template>
+
+<script setup>
+import { onMounted, reactive, toRefs } from "vue";
+import eventBus from "@/uitils/eventBus";
+import DeviceLine from "@/components/DeviceLine.vue";
+import DeviceStacker from "@/components/DeviceStacker.vue";
+
+// 鍫嗗灈鏈�
+const Stackers = reactive([]);
+
+// 璁惧鍒楄〃锛堜慨鏀归噸澶嶈澶囧悕绉帮級
+const devices = reactive([]);
+
+const intToBitArrayFromBinaryString = (num, numBits) => {
+  let binaryString = num.toString(2).padStart(numBits, '0');
+  return Array.from({ length: numBits }, (_, index) => binaryString[index] === '1');
+};
+
+// 鐩戝惉璁惧鏁版嵁鍙樺寲
+onMounted(() => {
+  eventBus.on('locationData', eventData => {
+    console.log(eventData)
+    if (eventData.deviceName === "闈欑疆杈撻�佺嚎") {
+
+      if (devices.length <= 0) {
+        devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.childDeviceCode });
+      }
+      else {
+        const device = devices.find(c => c.childDeviceCode == eventData.childDeviceCode)
+        if (device) {
+          const number = eventData.data.commandWrite.writeInteractiveSignal;
+          const writeInteractiveSignal = intToBitArrayFromBinaryString(number, 8)
+          eventData.data.writeInteractiveSignal = writeInteractiveSignal;
+          device.data = eventData.data
+        }
+        else {
+          const number = eventData.data.commandWrite.writeInteractiveSignal;
+          const writeInteractiveSignal = intToBitArrayFromBinaryString(number, 8)
+          eventData.data.writeInteractiveSignal = writeInteractiveSignal;
+          devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.childDeviceCode });
+        }
+      }
+    }
+  });
+  eventBus.on('stackerData', eventData => {
+    if (eventData.deviceName.indexOf("闈欑疆") != -1) {
+      if (Stackers.length == 0) {
+        Stackers.push({ deviceName: eventData.deviceName, data: eventData.data });
+      }
+      else {
+        const Stacker = Stackers.find(c => c.deviceName == eventData.deviceName);
+        if (Stacker) {
+          Stacker.data = eventData.data
+        }
+        else {
+          Stackers.push({ deviceName: eventData.deviceName, data: eventData.data });
+        }
+      }
+    }
+  })
+});
+</script>
+<style scoped>
+.Stackerbox {
+  width: 220px;
+  float: left;
+}
+
+.Linebox {
+  width: 500px;
+  float: left;
+}
+
+.box1 {
+  float: left;
+}
+
+.card-body {
+  text-align: center;
+  border-radius: 6%;
+}
+
+.Stacker {
+  background-color: burlywood;
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/Twoletters.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/Twoletters.vue
new file mode 100644
index 0000000..4a17acb
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/Twoletters.vue
@@ -0,0 +1,48 @@
+<template>
+  <el-row>
+    <el-col :span="24">
+      <device-line v-for="device in devices" :key="device.deviceName" :device="device" />
+    </el-col>
+  </el-row>
+</template>
+
+<script setup>
+import { onMounted, reactive, toRefs } from "vue";
+import eventBus from "@/uitils/eventBus";
+import DeviceLine from "@/components/DeviceLine.vue";
+
+// 璁惧鍒楄〃锛堜慨鏀归噸澶嶈澶囧悕绉帮級
+const devices = reactive([]);
+
+const intToBitArrayFromBinaryString = (num, numBits) => {
+  let binaryString = num.toString(2).padStart(numBits, '0');
+  return Array.from({ length: numBits }, (_, index) => binaryString[index] === '1');
+};
+
+// 鐩戝惉璁惧鏁版嵁鍙樺寲
+onMounted(() => {
+  eventBus.on('locationData', eventData => {
+    if (eventData.deviceName === "浜屽皝杈撻�佺嚎") {
+
+      if (devices.length <= 0) {
+        devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.childDeviceCode });
+      }
+      else {
+        const device = devices.find(c => c.childDeviceCode == eventData.childDeviceCode)
+        if (device) {
+          const number = eventData.data.commandWrite.writeInteractiveSignal;
+          const writeInteractiveSignal = intToBitArrayFromBinaryString(number, 8)
+          eventData.data.writeInteractiveSignal = writeInteractiveSignal;
+          device.data = eventData.data
+        }
+        else {
+          const number = eventData.data.commandWrite.writeInteractiveSignal;
+          const writeInteractiveSignal = intToBitArrayFromBinaryString(number, 8)
+          eventData.data.writeInteractiveSignal = writeInteractiveSignal;
+          devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.childDeviceCode });
+        }
+      }
+    }
+  });
+});
+</script>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/Volume.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/Volume.vue
new file mode 100644
index 0000000..e6efdac
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/Volume.vue
@@ -0,0 +1,58 @@
+<template>
+  <el-row>
+    <el-col :span="3">
+      <device-stacker v-for="stacker in Stackers" :key="stacker.deviceName" :Stacker="stacker"></device-stacker>
+    </el-col>
+    <el-col :span="21">
+      <DeviceLineVo v-for="device in devices" :key="device.deviceName" :device="device" />
+    </el-col>
+  </el-row>
+</template>
+<script setup>
+import { onMounted, ref, reactive, toRaw } from "vue";
+import eventBus from "@/uitils/eventBus";
+import DeviceLineVo from "@/components/DeviceLineVo.vue";
+import DeviceStacker from "@/components/DeviceStacker.vue";
+// 鍫嗗灈鏈�
+const Stackers = reactive([]);
+var i = 0;
+// 璁惧鍒楄〃锛堜慨鏀归噸澶嶈澶囧悕绉帮級
+const devices = reactive([]);
+const num = reactive([])
+onMounted(() => {
+  eventBus.on('locationData', eventData => {
+    if (eventData.deviceName.indexOf("鍒嗗") != -1) {
+      if (devices.length <= 0) {
+        devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.data.childDeviceCode });
+      }
+      else {
+        const device = devices.find(c => c.childDeviceCode == eventData.data.childDeviceCode)
+        if (device) {
+          device.data = eventData.data
+        } else {
+          devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.data.childDeviceCode });
+        }
+      }
+    }
+  })
+  eventBus.on('stackerData', eventData => {
+    // if (eventData.deviceName == "鍒嗗3鍙峰爢鍨涙満"||eventData.deviceName == "鍒嗗2鍙峰爢鍨涙満") {
+    console.log(eventData.deviceName)
+    if (eventData.deviceName.indexOf("鍒嗗") != -1) {
+      if (Stackers.length == 0) {
+        Stackers.push({ deviceName: eventData.deviceName, data: eventData.data });
+      }
+      else {
+        const Stacker = Stackers.find(c => c.deviceName == eventData.deviceName);
+        if (Stacker) {
+          Stacker.data = eventData.data
+        }
+        else {
+          Stackers.push({ deviceName: eventData.deviceName, data: eventData.data });
+        }
+      }
+    }
+  })
+})
+</script>
+<style scoped></style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/baozhuang.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/baozhuang.vue
new file mode 100644
index 0000000..dc57889
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/baozhuang.vue
@@ -0,0 +1,42 @@
+<template>
+  <el-row>
+    <el-col :span="21">
+      <DeviceLineVo v-for="device in devices" :key="device.deviceName" :device="device" />
+    </el-col>
+  </el-row>
+</template>
+<script setup>
+import { onMounted, ref, reactive, toRaw } from "vue";
+import eventBus from "@/uitils/eventBus";
+import DeviceLineVo from "@/components/DeviceLineVo.vue";
+import DeviceStacker from "@/components/DeviceStacker.vue";
+// 鍫嗗灈鏈�
+const Stackers = reactive([]);
+var  i=0;
+// 璁惧鍒楄〃锛堜慨鏀归噸澶嶈澶囧悕绉帮級
+const devices = reactive([]);
+const num = reactive([])
+onMounted(() => {
+  eventBus.on('stackerData', eventData => {
+    if (eventData.deviceName === "鍖呰鍑哄簱杈撻�佺嚎") {
+    if (devices.length <= 0) {
+        devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.data.childDeviceCode });
+      }
+      else {
+        const device = devices.find(c => c.childDeviceCode == eventData.data.childDeviceCode)
+        if(device){
+          device.data = eventData.data
+        }else{
+          devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.data.childDeviceCode });
+        }
+      }
+    
+    }
+  })
+
+})
+
+</script>
+<style scoped>
+
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/hightemperature.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/hightemperature.vue
new file mode 100644
index 0000000..fa614eb
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/hightemperature.vue
@@ -0,0 +1,60 @@
+<template>
+  <el-row>
+    <el-col :span="3">
+      <device-stacker v-for="stacker in Stackers" :key="stacker.deviceName" :Stacker="stacker"></device-stacker>
+    </el-col>
+    <el-col :span="21">
+      <DeviceLineVo v-for="device in devices" :key="device.deviceName" :device="device" />
+    </el-col>
+  </el-row>
+</template>
+<script setup>
+import { onMounted, ref, reactive, toRaw } from "vue";
+import eventBus from "@/uitils/eventBus";
+import DeviceLineVo from "@/components/DeviceLineVo.vue";
+import DeviceStacker from "@/components/DeviceStacker.vue";
+// 鍫嗗灈鏈�
+const Stackers = reactive([]);
+var i = 0;
+// 璁惧鍒楄〃锛堜慨鏀归噸澶嶈澶囧悕绉帮級
+const devices = reactive([]);
+const num = reactive([])
+onMounted(() => {
+  eventBus.on('locationData', eventData => {
+    // console.log(eventData)
+    console.log(eventData)
+
+    if (eventData.deviceName.indexOf("鑰佸寲") != -1) {
+      if (devices.length <= 0) {
+        devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.data.childDeviceCode });
+      }
+      else {
+        const device = devices.find(c => c.childDeviceCode == eventData.data.childDeviceCode)
+        if (device) {
+          device.data = eventData.data
+        } else {
+          devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.data.childDeviceCode });
+        }
+      }
+
+    }
+  })
+  eventBus.on('stackerData', eventData => {
+    if (eventData.deviceName.indexOf("鑰佸寲") != -1) {
+      if (Stackers.length == 0) {
+        Stackers.push({ deviceName: eventData.deviceName, data: eventData.data });
+      }
+      else {
+        const Stacker = Stackers.find(c => c.deviceName == eventData.deviceName);
+        if (Stacker) {
+          Stacker.data = eventData.data
+        }
+        else {
+          Stackers.push({ deviceName: eventData.deviceName, data: eventData.data });
+        }
+      }
+    }
+  })
+})
+</script>
+<style scoped></style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/roomtemperature.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/roomtemperature.vue
new file mode 100644
index 0000000..2e660c2
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/Craftlibrary/roomtemperature.vue
@@ -0,0 +1,61 @@
+<template>
+  <el-row>
+    <el-col :span="3">
+      <device-stacker v-for="stacker in Stackers" :key="stacker.deviceName" :Stacker="stacker"></device-stacker>
+    </el-col>
+    <el-col :span="21">
+      <DeviceLineVo v-for="device in devices" :key="device.deviceName" :device="device" />
+    </el-col>
+  </el-row>
+</template>
+<script setup>
+import { onMounted, ref, reactive, toRaw } from "vue";
+import eventBus from "@/uitils/eventBus";
+import DeviceLineVo from "@/components/DeviceLineVo.vue";
+import DeviceStacker from "@/components/DeviceStacker.vue";
+// 鍫嗗灈鏈�
+const Stackers = reactive([]);
+var i = 0;
+// 璁惧鍒楄〃锛堜慨鏀归噸澶嶈澶囧悕绉帮級
+const devices = reactive([]);
+const num = reactive([])
+onMounted(() => {
+  eventBus.on('locationData', eventData => {
+    // console.log(eventData)
+
+    console.log(eventData)
+
+    if (eventData.deviceName.indexOf("甯告俯") != -1) {
+      if (devices.length <= 0) {
+        devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.data.childDeviceCode });
+      }
+      else {
+        const device = devices.find(c => c.childDeviceCode == eventData.data.childDeviceCode)
+        if (device) {
+          device.data = eventData.data
+        } else {
+          devices.push({ deviceName: eventData.deviceName, data: eventData.data, childDeviceCode: eventData.data.childDeviceCode });
+        }
+      }
+
+    }
+  })
+  eventBus.on('stackerData', eventData => {
+    if (eventData.deviceName.indexOf("甯告俯") != -1) {
+      if (Stackers.length == 0) {
+        Stackers.push({ deviceName: eventData.deviceName, data: eventData.data });
+      }
+      else {
+        const Stacker = Stackers.find(c => c.deviceName == eventData.deviceName);
+        if (Stacker) {
+          Stacker.data = eventData.data
+        }
+        else {
+          Stackers.push({ deviceName: eventData.deviceName, data: eventData.data });
+        }
+      }
+    }
+  })
+})
+</script>
+<style scoped></style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/indexLibrary.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/indexLibrary.vue
new file mode 100644
index 0000000..1daa868
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Devicestatus/indexLibrary.vue
@@ -0,0 +1,48 @@
+<template>
+   
+    <!--瀵艰埅鍖� -->
+    <div  class="nav-bar">
+       <RouterLink class="navlink" to="/AgingLibrary" >闄堝寲搴�</RouterLink>
+       <RouterLink class="navlink" to="/FormationLibrary" >鍖栨垚搴�</RouterLink>
+       <RouterLink class="navlink" to="/StaticLibrary" >闈欑疆搴�</RouterLink>
+       <RouterLink class="navlink" to="/Twoletters" >浜屽皝</RouterLink>
+       <RouterLink class="navlink" to="/Volume" >鍒嗗搴�</RouterLink>
+       <RouterLink class="navlink" to="/highTemperature" >鑰佸寲搴�</RouterLink>
+       <RouterLink class="navlink" to="/roomTemperature" >甯告俯搴�</RouterLink>
+       <RouterLink class="navlink" to="/Baozhuang" >鍖呰</RouterLink>
+    </div>
+     <!--娉ㄦ剰浜嬮」-->
+    <div class="area">
+           <RouterView :key="$route.fullPath" ></RouterView>
+    </div>
+</template>
+<script setup>
+ import { RouterView,RouterLink } from 'vue-router';
+
+</script>
+<style>
+.nav-bar {
+  display: flex;
+  justify-content: space-around; 
+  align-items: center; 
+  height: 50px;
+  background-color: #f5f5f5;
+  border-bottom: 1px solid #ccc; 
+}
+.navlink {
+    width: 100px;
+    height: 100%;
+      text-decoration:none;
+      text-align: center;
+      display: flex;
+         justify-content: center;
+         align-items: center;
+        
+      color: rgb(0, 195, 255);
+       }
+.navlink:hover{
+   background-color: rgb(0, 195, 255);
+   color: #ffffff;
+}
+
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Home.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Home.vue
new file mode 100644
index 0000000..134ace2
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Home.vue
@@ -0,0 +1,51 @@
+<template>
+  <div class="title"></div>
+  <el-container>
+    <el-header>鏃ュ織</el-header>
+    <el-main>
+      <el-card v-for="(log, index) in logs" :key="index" class="log-card" :style="{ color: log.color }">
+        <div :style="{ color: log.color }">{{ log.logEntry }}</div>
+        <div :style="{ color: log.color }">{{ log.time }}</div>
+      </el-card>
+    </el-main>
+  </el-container>
+</template>
+
+<script>
+import { ref, onMounted } from 'vue'
+import eventBus from "@/uitils/eventBus";
+
+export default {
+  setup() {
+    const logs = ref([]);
+    onMounted(() => {
+      eventBus.on('Logs', eventData => {
+        if (logs.value.length > 500) {
+          logs.value = [];
+        }
+        const logEntry = "鏃ュ織淇℃伅锛�" + eventData.log
+        const time = "鏃堕棿锛�" + eventData.time 
+        logs.value.unshift({ logEntry: logEntry, time: time, color: eventData.color });
+        
+        // logs.value.unshift(logEntry);
+      });
+    });
+    return {
+      logs
+    }
+  }
+}
+</script>
+
+<style scoped>
+.title {
+  line-height: 70vh;
+  text-align: center;
+  font-size: 28px;
+  color: orange;
+}
+
+.log-card {
+  margin-bottom: 10px;
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Index.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Index.vue
new file mode 100644
index 0000000..5095cc7
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Index.vue
@@ -0,0 +1,720 @@
+<template>
+  <div id="vol-container" :class="['vol-theme-' + theme]">
+    <div class="vol-aside" :style="{ width: menuWidth + 'px' }">
+      <div class="header" :style="{ width: menuWidth - 1 + 'px' }">
+        <img v-show="!isCollapse" v-bind:src="logo" />
+        <i @click="toggleLeft" class="el-icon-s-fold collapse-menu" />
+      </div>
+      <div class="vol-menu">
+        <el-scrollbar style="height: 100%">
+          <VolMenu :currentMenuId="currentMenuId" :on-select="onSelect" :enable="true" :open-select="false"
+            :isCollapse="isCollapse" :list="menuOptions"></VolMenu>
+        </el-scrollbar>
+      </div>
+    </div>
+    <div class="vol-container" :style="{ left: menuWidth - 1 + 'px' }">
+      <div class="vol-header">
+        <div class="project-name">WCS</div>
+        <div class="header-text">
+          <!-- <div class="h-link">
+            <a
+              href="javascript:void(0)"
+              @click="to(item)"
+              v-for="(item, index) in links.filter((c) => {
+                return !c.icon;
+              })"
+              :key="index"
+            >
+              <span v-if="!item.icon"> {{ item.text }}</span>
+              <i v-else :class="item.icon"></i>
+            </a>
+          </div> -->
+        </div>
+        <div class="header-info">
+          <div class="h-link">
+            <a href="javascript:void(0)" @click="to(item)" v-for="(item, index) in links.filter((c) => {
+              return c.icon;
+            })" :key="index">
+              <span> {{ item.text }}</span>
+            </a>
+
+          </div>
+          <div>
+            <img class="user-header" :src="userImg" :onerror="errorImg" />
+          </div>
+          <div class="user">
+            <span>{{ userName }}</span>
+            <span id="index-date"></span>
+          </div>
+          <div class="settings">
+            <i style="font-size: 20px" class="el-icon-s-tools" @click="drawer_model = true" />
+          </div>
+        </div>
+      </div>
+      <div class="vol-path">
+        <el-tabs @tab-click="selectNav" @tab-remove="removeNav" @contextmenu.prevent="bindRightClickMenu(false)"
+          type="border-card" class="header-navigation" v-model="selectId" :strtch="false">
+          <el-tab-pane v-for="(item, navIndex) in navigation" type="card" :name="navIndex + ''" :closable="navIndex > 0"
+            :key="navIndex" :label="item.name">
+            <span style="display: none">{{ navIndex }}</span>
+          </el-tab-pane>
+        </el-tabs>
+        <!-- 鍙抽敭鑿滃崟 -->
+        <div v-show="contextMenuVisible">
+          <ul :style="{ left: menuLeft + 'px', top: menuTop + 'px' }" class="contextMenu">
+            <li v-show="visibleItem.all">
+              <el-button link @click="closeTabs()">
+                <i class="el-icon-close"></i>
+                {{
+                  navigation.length == 2 ? "鍏抽棴鑿滃崟" : "鍏抽棴鎵�鏈�"
+                }}</el-button>
+            </li>
+            <li v-show="visibleItem.left">
+              <el-button link @click="closeTabs('left')"><i class="el-icon-back"></i>鍏抽棴宸﹁竟</el-button>
+            </li>
+            <li v-show="visibleItem.right">
+              <el-button link @click="closeTabs('right')">
+                <i class="el-icon-right"></i>鍏抽棴鍙宠竟</el-button>
+            </li>
+            <li v-show="visibleItem.other">
+              <el-button link @click="closeTabs('other')"><i class="el-icon-right"></i>鍏抽棴鍏朵粬
+              </el-button>
+            </li>
+          </ul>
+        </div>
+      </div>
+      <div class="vol-main" id="vol-main">
+        <el-scrollbar style="height: 100%" v-if="permissionInited">
+          <loading v-show="$store.getters.isLoading()"></loading>
+          <router-view v-slot="{ Component }">
+            <keep-alive>
+              <component :is="Component" :key="$route.name"
+                v-if="!$route.meta || ($route.meta && !$route.meta.hasOwnProperty('keepAlive'))" />
+            </keep-alive>
+            <component :is="Component" :key="$route.name" v-if="$route.meta && $route.meta.hasOwnProperty('keepAlive')" />
+          </router-view>
+        </el-scrollbar>
+      </div>
+    </div>
+    <el-drawer title="閫夋嫨涓婚" v-model="drawer_model" direction="rtl" destroy-on-close>
+      <div class="theme-selector">
+        <div @click="changeTheme(item.name)" class="item" v-for="(item, index) in theme_color" :key="index"
+          :style="{ background: item.color }">
+          <div v-show="item.leftColor" :style="{ background: item.leftColor }" style="height: 100%; width: 20px"
+            class="t-left"></div>
+          <div class="t-right"></div>
+        </div>
+      </div>
+    </el-drawer>
+
+    <el-drawer title="娑堟伅鍒楄〃" v-model="messageModel" direction="rtl" destroy-on-close>
+      <Message :list="messageList"></Message>
+    </el-drawer>
+  </div>
+</template>
+<style lang="less" scoped>
+@import "./index/index.less";
+</style>
+<script>
+import loading from "@/components/basic/RouterLoading";
+import VolMenu from "@/components/basic/VolElementMenu.vue";
+import Message from "./index/Message.vue";
+import MessageConfig from "./index/MessageConfig.js";
+var imgUrl = require("@/assets/imgs/wms_x.png");
+var $this;
+var $interval;
+var $indexDate;
+import {
+  defineComponent,
+  reactive,
+  ref,
+  watch,
+  onMounted,
+  getCurrentInstance,
+} from "vue";
+import { useRouter, useRoute } from "vue-router";
+import store from "../store/index";
+import http from "@/../src/api/http.js";
+import useSignalr from '../uitils/signalr.js';
+export default defineComponent({
+  components: {
+    VolMenu,
+    loading,
+    Message,
+  },
+
+  data() {
+    return {
+      allTabs: true,
+      leftTabs: true,
+      rightTabs: true,
+      otherTabs: true,
+      menuLeft: 0,
+      menuTop: 0,
+      //  contextMenuVisible: false, // 鍙抽敭鍏抽棴鏄�/闅�
+    };
+  },
+  setup(props, context) {
+    // 鑾峰彇鍏ㄥ眬灞炴�у拰鏂规硶
+    const { proxy } = getCurrentInstance();
+
+    // 鑿滃崟瀵艰埅榛樿瀹藉害
+    const menuWidth = ref(200);
+    const contextMenuVisible = ref(false);
+    const isCollapse = ref(false);
+    const drawer_model = ref(false);
+    const messageModel = ref(false);
+    const theme_color = ref([
+      { name: "blue", color: "rgb(45, 140, 240)" },
+      { name: "blue2", color: "rgb(45, 140, 240)", leftColor: "#0068d6" },
+      { name: "red", color: "rgb(237, 64, 20)" },
+      { name: "red2", color: "rgb(237, 64, 20)", leftColor: "#a90000" },
+      { name: "dark", color: "#272929" },
+      { name: "orange", color: "#ff9900" },
+      { name: "orange2", color: "#ff9900", leftColor: "rgb(232 141 5)" },
+      { name: "green", color: "rgb(25, 190, 107)" },
+      { name: "green2", color: "rgb(25, 190, 107)", leftColor: "#019e4f" },
+      { name: "white", color: "#fff" },
+    ]);
+    const links = ref([
+      // {
+      //   text: "妗嗘灦瑙嗛",
+      //   path: "https://www.cctalk.com/m/group/90268531",
+      //   id: -3,
+      // },
+      // { text: "澶у睆鏁版嵁", path: "/bigdata", id: -3 },
+      // {
+      //   text: "妗嗘灦鏂囨。",
+      //   path: "http://v2.volcore.xyz/document/guide",
+      //   id: -2,
+      // },   {
+      //   text: "妗嗘灦浼佷笟鐗�",
+      //   path: "http://pro.volcore.xyz/",
+      //   id: 10,
+      // },
+      { text: "涓汉涓績", path: "/UserInfo", id: -1, icon: "el-icon-s-custom" },
+      {
+        text: "瀹夊叏閫�鍑�",
+        path: "/login",
+        id: -4,
+        icon: "el-icon-switch-button",
+      },
+    ]);
+    const errorImg = ref(
+      'this.src="' + require("@/assets/imgs/error-img.png") + '"'
+    );
+    const selectId = ref("1");
+    // 銆愰椤点�戞爣绛惧簭鍙�(褰撳墠鍙抽敭閫変腑鐨勮彍鍗�)
+    const selectMenuIndex = ref("0");
+    //2022.05.29澧炲姞tab閫夐」涓庤彍鍗曡仈鍔ㄥ姛鑳�
+    const currentMenuId = ref(0);
+    const userName = ref("--");
+    const userInfo = ref({});
+    const visibleItem = reactive({
+      left: false,
+      right: false,
+      all: false,
+      other: false,
+    });
+    const userImg = ref("");
+    const navigation = reactive([
+      { orderNo: "0", id: "1", name: "棣栭〉", path: "/home" },
+    ]);
+    const logo = ref(imgUrl);
+    const theme = ref("blue2");
+    const menuOptions = ref([]);
+    const permissionInited = ref(false);
+    const messageList = reactive([]);
+    let _config = getCurrentInstance().appContext.config.globalProperties;
+    let router = useRouter();
+    const toggleLeft = () => {
+      isCollapse.value = !isCollapse.value;
+      menuWidth.value = isCollapse.value ? 63 : 200;
+    };
+    //2021.08.28寮�鏀炬墜鍔ㄦ姌鍙犺彍鍗曟柟娉�
+    _config.menu = {
+      show() {
+        toggleLeft();
+      },
+      hide() {
+        toggleLeft();
+      },
+    };
+    const changeTheme = (name) => {
+      if (theme.value != name) {
+        theme.value = name;
+      }
+      localStorage.setItem("vol3_theme", name);
+    };
+    const to = (item) => {
+      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      if (item.path.indexOf("http") != -1) {
+        window.open(item.path);
+        return;
+      }
+      if (typeof item == "string" || item.path == "/login") {
+        if (item == "/login" || item.path == "/login") {
+          //纭鏄惁閫�鍑�
+          store.commit("clearUserInfo", "");
+          window.location.href = "/";
+          return;
+        }
+        router.push({ path: item });
+        return;
+      }
+      if (item.path == "#") return;
+      open(item);
+    };
+    const open = (item, useRoute) => {
+      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      let _index = navigation.findIndex((x) => {
+        return x.path == item.path;
+      });
+      if (_index == -1) {
+        navigation.push({
+          //  orderNo: String(navigation.length),// 搴忓彿
+          id: item.id + "",
+          name: item.name || item.text || "鏃犳爣棰�",
+          path: item.path,
+          query: item.query, //2021.03.20淇鑷畾涔変簩娆℃墦寮�$tabs鏃跺弬鏁颁涪澶辩殑闂
+        });
+        //鏂版墦寮�鐨則ab绉昏嚦鏈�鍚庝竴涓�夐」
+        selectId.value = navigation.length - 1 + "";
+      } else {
+        selectId.value = _index + "";
+      }
+      if (useRoute === undefined) {
+        //闈炴爣鍑嗚彍鍗曪紝璁板綍鏈�鍚庝竴娆¤烦杞殑椤甸潰锛岀敤浜庡埛鏂�
+        setItem(item);
+        router.push(item);
+        // this.$router.push(item);
+      }
+      currentMenuId.value = item.id * 1;
+      // tab鑿滃崟缁戝畾鍙抽敭浜嬩欢
+      proxy.$nextTick(function (e) {
+        proxy.bindRightClickMenu(true);
+      });
+    };
+    const close = (path) => {
+      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      let index = navigation.findIndex((x) => {
+        return x.path == path;
+      });
+      if (index == -1) {
+        return _config.$Message.error("鏈壘鍒拌彍鍗�");
+      }
+      removeNav(index);
+    };
+    const setItem = (item) => {
+      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      localStorage.setItem(
+        window.location.origin + "_tabs",
+        JSON.stringify(item)
+      );
+    };
+    const getItem = () => {
+      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      let nav = localStorage.getItem(window.location.origin + "_tabs");
+      return nav ? JSON.parse(nav) : null;
+    };
+    const selectNav = (item) => {
+      //鍗囩骇element姝e紡鐗堜慨鏀�
+      selectId.value = item.props.name;
+      let _path = navigation[item.index].path;
+      currentMenuId.value = (
+        menuOptions.value.find((c) => {
+          return c.path == _path;
+        }) || { id: 0 }
+      ).id;
+
+      router.push({
+        path: navigation[item.index].path,
+        query: navigation[item.index].query,
+      });
+    };
+
+    const removeNav = (_index) => {
+      return new Promise(() => {
+        //鍏抽棴鐨勫綋鍓嶉」,璺宠浆鍒板墠涓�涓〉闈�
+        if (selectId.value == _index + "") {
+          console.log(navigation[_index - 1]);
+          setItem(navigation[_index - 1]);
+          router.push({
+            path: navigation[_index - 1].path,
+            //2022.06.27淇tabs浜屾鍒囨崲鍚庡弬鏁颁涪澶辩殑闂
+            query: navigation[_index - 1].query,
+          });
+          navigation.splice(_index, 1);
+          selectId.value = selectId.value - 1 + "";
+          return;
+        }
+        if (_index < selectId.value) {
+          selectId.value = selectId.value - 1 + "";
+        }
+        navigation.splice(_index, 1);
+        currentMenuId.value = (
+          menuOptions.value.find((c) => {
+            return c.path == navigation[selectId.value * 1].path;
+          }) || { id: 0 }
+        ).id;
+      });
+    };
+
+    const getSelectMenuName = (id) => {
+      return menuOptions.value.find(function (x) {
+        return x.id == id;
+      });
+    };
+    const onSelect = (treeId) => {
+      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      var item = getSelectMenuName(treeId);
+      open(item, false);
+    };
+
+    /**
+     * 鏄剧ず鍙抽敭鑿滃崟
+     * @param {*} e 浜嬩欢瀵硅薄
+     */
+    const openTabsMenu = function (e) {
+      e.preventDefault(); // 闃叉榛樿鑿滃崟寮瑰嚭
+      let tabId = e.target.id.split("-")[1] * 1;
+
+      //璁板綍褰撳墠閫変腑鐨勮彍鍗昳ndex
+      selectMenuIndex.value =
+        document.getElementById("pane-" + tabId).children[0].textContent * 1;
+      //鍙湁棣栭〉鏃朵笉鏄剧ず
+      if (navigation.length == 1) {
+        return;
+      }
+
+      //棣栭〉璁剧疆鏄剧ず鍏抽棴鍙宠竟鑿滃崟
+      if (!selectMenuIndex.value) {
+        visibleItem.all = false;
+        visibleItem.right = true;
+        visibleItem.left = false;
+        visibleItem.other = false;
+      } else {
+        visibleItem.all = true;
+        //涓嶆槸鏈�鍚庝竴涓樉绀哄叧闂彸杈硅彍鍗�
+        visibleItem.right = selectMenuIndex.value != navigation.length - 1;
+        //鍙湁涓や釜鑿滃崟鏃朵笉鏄剧ず鍏抽棴宸﹁竟
+        visibleItem.left = navigation.length != 2;
+        //鍙湁涓や釜鑿滃崟鏃朵笉鏄剧ず鍏抽棴鍏朵粬
+        visibleItem.other = navigation.length != 2;
+      }
+      contextMenuVisible.value = true;
+      // 璁剧疆鍙抽敭鑿滃崟鏄剧ず鐨勪綅缃�
+      proxy.menuLeft =
+        e.target.getBoundingClientRect().left - (isCollapse.value ? 63 : 198); //-e.target.clientWidth
+      proxy.menuTop = 36;
+    };
+
+    /**
+     * 鍏抽棴鍙抽敭鑿滃崟
+     */
+    const closeTabsMenu = () => {
+      contextMenuVisible.value = false;
+    };
+    const toHome = () => {
+      open({
+        text: navigation[0].name,
+        path: navigation[0].path,
+      });
+    };
+    /**
+     * 鍏抽棴鍏跺畠鏍囩椤�
+     * @param {*} par 鍏抽棴绫诲瀷(left,right,other)
+     */
+    const closeTabs = (value) => {
+      let _menuId = navigation[selectId.value * 1].id;
+      let currnetIndex = selectId.value * 1; // navigation.findIndex(c => { return c.id == selectId.value });
+      switch (value) {
+        case "left": {
+          // 鍒犻櫎宸︿晶tab鏍囩
+          navigation.splice(1, currnetIndex - 1); // 鍒犻櫎宸︿晶tab鏍囩
+          break;
+        }
+        case "right": {
+          // 鍒犻櫎鍙充晶tab鏍囩
+          if (selectMenuIndex.value == 0) {
+            navigation.splice(currnetIndex); // 鍒犻櫎鍙充晶tab鏍囩
+            toHome();
+          } else {
+            navigation.splice(currnetIndex + 1); // 鍒犻櫎鍙充晶tab鏍囩
+            if (selectMenuIndex.value < currnetIndex) {
+              navigation.splice(
+                selectMenuIndex.value,
+                currnetIndex - selectMenuIndex.value
+              );
+            }
+          }
+          break;
+        }
+        case "other": {
+          // 鍒犻櫎鍏朵粬鎵�鏈塼ab鏍囩
+          navigation.splice(currnetIndex + 1); // 鍒犻櫎鍙充晶tab鏍囩(杩欓噷蹇呴』鎸夌収鍙斥啋宸﹂『搴忓垹闄�)
+          navigation.splice(1, currnetIndex - 1); // 鍒犻櫎宸︿晶tab鏍囩
+          break;
+        }
+        default: {
+          //鍏抽棴鎵�鏈�
+          navigation.splice(1, navigation.length);
+          toHome();
+          break;
+        }
+      }
+      selectId.value =
+        navigation.findIndex((c) => {
+          return c.id == _menuId;
+        }) + "";
+      closeTabsMenu();
+    };
+
+    watch(
+      () => contextMenuVisible.value,
+      (newVal, oldVal) => {
+        // 鐩戣
+        if (newVal) {
+          document.body.addEventListener("click", closeTabsMenu);
+        } else {
+          document.body.removeEventListener("click", closeTabsMenu);
+        }
+      }
+    );
+
+    /**
+     * 绯荤粺鍒涘缓寮�濮�
+     */
+    const created = () => {
+      let _theme = localStorage.getItem("vol3_theme");
+      if (_theme) {
+        theme.value = _theme;
+      }
+
+      let _userInfo = store.getters.getUserInfo();
+      if (_userInfo) {
+        userName.value = _userInfo.userName;
+        if (_userInfo.img) {
+          userImg.value = _config.base.getImgSrc(_userInfo.img, http.ipAddress);
+        }
+      }
+      Object.assign(_config.$tabs, { open: open, close: close });
+
+      http.get("api/Sys_Menu/getTreeMenu", {}, true).then((data) => {
+        data.push({ id: "1", name: "棣栭〉", url: "/home" }); // 涓轰簡鑾峰彇閫変腑id浣跨敤
+        data.forEach((d) => {
+          d.path = (d.url || "").replace("/Manager", "");
+          d.to = (d.url || "").replace("/Manager", "");
+          if (!d.icon || d.icon.substring(0, 3) != "el-") {
+            d.icon = "el-icon-menu";
+          }
+        });
+        store.dispatch("setPermission", data);
+        menuOptions.value = data;
+        permissionInited.value = true;
+
+        //寮�鍚秷鎭帹閫侊紙main.js涓缃槸鍚﹀紑鍚痵ignalR锛�2022.05.05
+        if (_config.$global.signalR) {
+          MessageConfig(http, (result) => {
+            messageList.unshift(result);
+            //    console.log(result)
+          });
+        }
+
+        const { startSignalr } = useSignalr()
+        startSignalr()
+        
+        //褰撳墠鍒锋柊鏄笉鏄椤�
+        if (router.currentRoute.value.path != navigation[0].path) {
+          //鏌ユ壘绯荤粺鑿滃崟
+          let item = menuOptions.value.find((x) => {
+            return x.path == router.currentRoute.value.path; //this.$route.path;
+          });
+          if (item) return onSelect(item.id);
+          //鏌ユ壘椤堕儴蹇嵎杩炴帴
+          item = links.value.find((x) => {
+            return x.path == router.currentRoute.value.path; //this.$route.path;
+          });
+          //鏌ユ壘鏈�鍚庝竴娆¤烦杞殑椤甸潰
+          if (!item) {
+            item = getItem();
+          }
+          if (item) {
+            return open(item, false);
+          }
+        }
+        selectId.value = "1";
+      });
+    };
+    created();
+    return {
+      menuWidth,
+      isCollapse,
+      drawer_model,
+      theme_color,
+      errorImg,
+      userInfo,
+      userName,
+      userImg,
+      selectId,
+      selectMenuIndex,
+      navigation,
+      links,
+      onSelect,
+      openTabsMenu,
+      selectNav,
+      getSelectMenuName,
+      removeNav,
+      logo,
+      theme,
+      menuOptions,
+      permissionInited,
+      changeTheme,
+      to,
+      toggleLeft,
+      messageModel,
+      messageList,
+      contextMenuVisible,
+      visibleItem,
+      closeTabsMenu,
+      closeTabs,
+      currentMenuId,
+    };
+  },
+  /**
+   * 鎸傝浇閽╁瓙鍑芥暟
+   */
+  mounted() {
+    let _date = showTime();
+    $indexDate = document.getElementById("index-date");
+    $indexDate.innerText = _date;
+    $interval = setInterval(function () {
+      $indexDate.innerText = showTime();
+    }, 1000);
+
+    this.bindRightClickMenu(true);
+  },
+
+  methods: {
+    /**
+     * 缁戝畾鍙抽敭浜嬩欢
+     * @param {*} enable 鏄惁鍚敤鍙抽敭浜嬩欢[true:鍚敤;false:绂佺敤;]
+     * @param {*} $event 浜嬩欢
+     */
+    bindRightClickMenu(enable) {
+      if (!enable) return;
+      let that = this;
+      // 浣跨敤鍘熺敓js 涓哄崟涓猟om缁戝畾榧犳爣鍙冲嚮浜嬩欢
+      that.$nextTick(() => {
+        let tab_top_dom = Object.assign(
+          [],
+          document.getElementsByClassName("el-tabs__item is-top")
+        );
+        tab_top_dom.forEach((item, index) => {
+          item.oncontextmenu = that.openTabsMenu;
+        });
+      });
+    },
+  },
+
+  /**
+   * 閿�姣侀挬瀛愬嚱鏁�
+   */
+  destroyed() {
+    $this = null;
+    clearInterval($interval);
+  },
+});
+const week = new Array(
+  "鏄熸湡涓�",
+  "鏄熸湡浜�",
+  "鏄熸湡涓�",
+  "鏄熸湡鍥�",
+  "鏄熸湡浜�",
+  "鏄熸湡鍏�",
+  "鏄熸湡鏃�"
+);
+function showTime() {
+  let date = new Date();
+  let year = date.getFullYear();
+  let month = date.getMonth() + 1;
+  let day = date.getDate();
+  let hour = date.getHours();
+  let minutes = date.getMinutes();
+  let second = date.getSeconds();
+
+  return (
+    year +
+    "." +
+    (month < 10 ? "0" + month : month) +
+    "." +
+    (day < 10 ? "0" + day : day) + //202.08.08淇鏃ユ湡澶╂暟灏忎簬10鏃舵坊鍔�0
+    "" +
+    " " +
+    (hour < 10 ? "0" + hour : hour) +
+    ":" +
+    (minutes < 10 ? "0" + minutes : minutes) +
+    ":" +
+    (second < 10 ? "0" + second : second) +
+    " " + //2020.08.30淇棣栭〉鏃ユ湡鏄熸湡澶╀笉鏄剧ず鐨勯棶棰�
+    (week[date.getDay() - 1] || week[6])
+  );
+}
+</script>
+
+<style lang="less" scoped>
+.vol-container .vol-path ::v-deep(.el-tabs__content) {
+  padding: 0;
+}
+
+.contextMenu {
+  width: 120px;
+  margin: 0;
+  border: 1px solid #eaeaea;
+  background: #fff;
+  z-index: 30000;
+  position: absolute;
+  list-style-type: none;
+  padding: 5px 0;
+  border-radius: 4px;
+  font-size: 14px;
+  color: #333;
+  box-shadow: 2px 2px 3px 0 rgb(182 182 182 / 20%);
+
+  i,
+  button {
+    font-size: 14px !important;
+  }
+}
+
+.contextMenu li {
+  margin: 0;
+  padding: 5px 17px;
+}
+
+.contextMenu li:hover {
+  background: #fafafa;
+  cursor: pointer;
+}
+
+.contextMenu li button {
+  color: #626060;
+  font-size: 14px;
+  letter-spacing: 1px;
+}
+
+.el-tabs.el-tabs--top.el-tabs--border-card.header-navigation>.el-tabs__header .el-tabs__item:last-child,
+.el-tabs--top.el-tabs--border-card.header-navigation>.el-tabs__header .el-tabs__item:nth-child(2) {
+  padding: 0;
+}
+
+.header-navigation ::v-deep(.el-tabs__item.is-top) {
+  padding: 0 15px;
+}
+</style>
+<style>
+.horizontal-collapse-transition {
+  transition: 0s width ease-in-out, 0s padding-left ease-in-out,
+    0s padding-right ease-in-out;
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Login.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Login.vue
new file mode 100644
index 0000000..83c86c7
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/Login.vue
@@ -0,0 +1,386 @@
+<template>
+  <div class="login-container">
+    <div class="project-name">WIDESEA_WMS</div>
+    <div class="login-form">
+      <div class="form-user" @keypress="loginPress">
+        <div class="login-text">
+          <div>
+            <div>娆㈣繋鐧诲綍...</div>
+            <div class="login-line"></div>
+          </div>
+          <div style="flex:1;"></div>
+        </div>
+        <div class="login-text-small">WELCOME TO LOGIN</div>
+        <div class="item">
+          <div class="input-icon el-icon-user"></div>
+          <input type="text" v-focus v-model="userInfo.userName" placeholder="璇疯緭鍏ヨ处鍙�" />
+        </div>
+        <div class="item">
+          <div class="input-icon el-icon-lock"></div>
+          <input type="password" v-focus v-model="userInfo.password" placeholder="璇疯緭鍏ュ瘑鐮�" />
+        </div>
+        <div class="item">
+          <div class="input-icon el-icon-mobile"></div>
+
+          <input v-focus type="text" v-model="userInfo.verificationCode" placeholder="杈撳叆楠岃瘉鐮�" />
+          <div class="code" @click="getVierificationCode">
+            <img v-show="codeImgSrc != ''" :src="codeImgSrc" />
+          </div>
+        </div>
+      </div>
+      <div class="loging-btn">
+        <el-button size="large" :loading="loading" color="#3a6cd1" :dark="true" @click="login" long>
+          <span v-if="!loading">鐧诲綍</span>
+          <span v-else>姝e湪鐧诲綍...</span>
+        </el-button>
+      </div>
+
+      <!-- 璐﹀彿淇℃伅 -->
+      <!-- <div class="account-info">
+        <p>婕旂ず璐﹀彿锛歛dmin666 &nbsp; &nbsp;瀵嗙爜:123456</p>
+        <p>鏈湴璐﹀彿锛歛dmin &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;瀵嗙爜:123456</p>
+        <p><a href="https://jq.qq.com/?_wv=1027&k=Sqstuy0M" style="text-decoration: none"
+            target="_blank">QQ3缇�:743852316</a>
+          &nbsp; &nbsp;&nbsp; &nbsp;
+          <a href="http://v2.volcore.xyz/document/guide" style="text-decoration: none" target="_blank">妗嗘灦鏂囨。</a>
+        </p>
+      </div> -->
+      <!-- 閾炬帴浣嶇疆 -->
+      <!-- <div class="app-link" >
+        <a href="#" style="text-decoration: none">绉诲姩绔壂鐮�</a>
+        <a>
+          <i class="el-icon-chat-dot-round"></i> 灏忕▼搴�
+          <img src="https://app-1256993465.cos.ap-nanjing.myqcloud.com/wechat.jpg" /></a>
+        <a>
+          <i class="el-icon-apple"></i>
+          Android
+          <img src="https://app-1256993465.cos.ap-nanjing.myqcloud.com/Android.png" /></a>
+        <a>
+          <i class="el-icon-document"></i>
+          H5
+          <img src="https://app-1256993465.cos.ap-nanjing.myqcloud.com/H5.png" /></a>
+      </div> -->
+    </div>
+
+    <!-- 椤甸潰搴曢儴 -->
+    <!-- <div class="login-footer">
+      <a style="text-decoration: none" href="https://beian.miit.gov.cn/" target="_blank">浜琁CP澶�19056538鍙�-1</a>
+
+
+      <a href="https://dotnet9.com/" style="text-decoration: none" target="blank">Dotnet9</a>
+      <a href="https://space.bilibili.com/525836469" style="text-decoration: none" target="blank">NET瑙嗛鏁欑▼(寰蒋MVP-ACE褰曞埗)</a>
+      <a href="https://www.cctalk.com/m/group/90268531" style="text-decoration: none" target="blank">VOL妗嗘灦瑙嗛</a>
+      <a href="http://120.48.115.252:9990" style="text-decoration: none" target="blank">瑙嗛婕旂ず鍦板潃</a>
+    </div> -->
+
+    <img class="login-bg" src="/static/login_bg.png" />
+  </div>
+</template>
+
+
+<script >
+import {
+  defineComponent,
+  ref,
+  reactive,
+  toRefs,
+  getCurrentInstance
+} from 'vue';
+import { useRouter, useRoute } from 'vue-router';
+import store from '../store/index';
+import http from '@/../src/api/http.js';
+export default defineComponent({
+  setup(props, context) {
+    store.commit('clearUserInfo', '');
+    const loading = ref(false);
+    const codeImgSrc = ref('');
+    const userInfo = reactive({
+      userName: 'admin',
+      password: '123456',
+      verificationCode: '1234',
+      UUID: undefined
+    });
+
+    const getVierificationCode = () => {
+      http.get('/api/User/getVierificationCode').then((x) => {
+        codeImgSrc.value = 'data:image/png;base64,' + x.img;
+        userInfo.UUID = x.uuid;
+      });
+    };
+    getVierificationCode();
+
+    let appContext = getCurrentInstance().appContext;
+    let $message = appContext.config.globalProperties.$message;
+    let router = useRouter();
+
+    const login = () => {
+      if (!userInfo.userName) return $message.error('璇疯緭鍏ョ敤鎴峰悕');
+      if (!userInfo.password) return $message.error('璇疯緭鍏ュ瘑鐮�');
+      if (!userInfo.verificationCode) {
+        return $message.error('璇疯緭鍏ラ獙璇佺爜');
+      }
+      loading.value = true;
+      http.post('/api/User/login', userInfo, '姝e湪鐧诲綍....').then((result) => {
+        if (!result.status) {
+          loading.value = false;
+          getVierificationCode();
+          return $message.error(result.message);
+        }
+        $message.success('鐧诲綍鎴愬姛,姝e湪璺宠浆!');
+        store.commit('setUserInfo', result.data);
+        router.push({ path: '/' });
+      });
+    };
+    const loginPress = (e) => {
+      if (e.keyCode == 13) {
+        login();
+      }
+    };
+    const openUrl = (url) => {
+      window.open(url, '_blank');
+    };
+    return {
+      loading,
+      codeImgSrc,
+      getVierificationCode,
+      login,
+      userInfo,
+      loginPress,
+      openUrl
+    };
+  },
+  directives: {
+    focus: {
+      inserted: function (el) {
+        el.focus();
+      }
+    }
+  }
+});
+</script>
+<style lang="less" scoped>
+.login-container {
+  display: flex;
+  width: 100%;
+  height: 100%;
+  background: rgb(246, 247, 252);
+  justify-content: flex-end;
+  align-items: center;
+}
+
+.login-form {
+  align-items: center;
+  width: 50%;
+  display: flex;
+  flex-direction: column;
+  // margin-right: 150px;
+  z-index: 999;
+
+  .form-user {
+    // margin: 25px 0;
+
+    .item {
+      border-radius: 5px;
+      border: 1px solid #ececec;
+      display: flex;
+      margin-bottom: 30px;
+      background: #ffff;
+      height: 45px;
+      padding-left: 20px;
+      display: flex;
+
+      .code {
+        position: relative;
+        cursor: pointer;
+        width: 74px;
+        padding: 5px 10px 0 0;
+      }
+
+      .input-icon {
+        line-height: 45px;
+        color: #7a7a7a;
+        padding-right: 20px;
+      }
+    }
+  }
+
+  input:-webkit-autofill {
+    box-shadow: 0 0 0px 1000px white inset;
+    -webkit-box-shadow: 0 0 0px 1000px white inset !important;
+  }
+
+  input {
+    background: white;
+    display: block;
+    box-sizing: border-box;
+    width: 100%;
+    min-width: 0;
+    margin: 0;
+    padding: 0;
+    color: #323233;
+    line-height: inherit;
+    text-align: left;
+    border: 0;
+    outline: none;
+    font-size: 16px;
+    line-height: 20px;
+  }
+}
+
+.form-user,
+.loging-btn {
+  width: 400px;
+}
+
+.loging-btn {
+  box-shadow: 2px 4px 11px #a4c2ff;
+  margin-top: 10px;
+
+  button {
+    padding: 21px;
+    font-size: 14px !important;
+    width: 100%;
+  }
+}
+
+.login-text {
+  font-weight: bolder;
+  font-size: 20px;
+  letter-spacing: 2px;
+
+  position: relative;
+  display: flex;
+
+  .login-line {
+    z-index: -1;
+    padding: 5px;
+    position: relative;
+    top: -8px;
+    width: 100%;
+    background-image: linear-gradient(to right, #6598ff, white);
+  }
+}
+
+.login-text-small {
+  margin-bottom: 20px;
+  font-size: 13px;
+  color: #7d7c7c;
+}
+
+.login-bg {
+  left: 0;
+  position: absolute;
+  height: 100%;
+  width: 50%;
+  z-index: 0;
+}
+
+.project-name {
+  position: absolute;
+  top: 40px;
+  left: 40px;
+  z-index: 9999;
+  font-weight: bolder;
+  background-image: linear-gradient(to right, #1850c1, #9c009c);
+  -webkit-background-clip: text;
+  color: transparent;
+  font-size: 25px;
+}
+</style>
+<style lang="less" scoped>
+.app-link {
+  // font-weight: bolder;
+  text-align: center;
+  padding-top: 5px;
+  font-size: 12px;
+  width: 400px;
+  padding-left: 40px;
+  display: flex;
+
+  a {
+    flex: 1;
+    position: relative;
+    cursor: pointer;
+    width: 70px;
+    color: #666666;
+    margin: 2px 10px 0 0;
+  }
+
+  img {
+    display: none;
+  }
+
+  a:hover {
+    color: #0545f6 !important;
+
+    img {
+      display: block;
+      position: absolute;
+      z-index: 999999999;
+      top: -130px;
+      width: 120px;
+      left: -22px;
+
+      border: 1px solid #b1b1b1;
+    }
+  }
+}
+
+.login-footer {
+  position: absolute;
+  width: 50%;
+  bottom: 0.5rem;
+  font-size: 12px;
+  text-align: center;
+  padding-bottom: 10px;
+  color: #4f4f4f;
+
+  a {
+    margin-right: 10px;
+    font-size: 12px;
+    color: #4f4f4f;
+  }
+
+  div {
+    margin-bottom: 5px;
+  }
+
+  a:hover {
+    cursor: pointer;
+    color: #0540e3 !important;
+  }
+}
+
+.account-info {
+  font-size: 12px;
+  color: #636363;
+  margin-top: 15px;
+}
+</style>
+
+<style lang="less" scoped>
+@media screen and (max-width: 700px) {
+
+  .login-bg,
+  .account-info,
+  .app-link,
+  .login-footer,
+  .project-name {
+    display: none;
+  }
+
+  .login-container {
+    padding: 2rem;
+    justify-content: center;
+  }
+
+  .login-form {
+    width: 100%;
+  }
+
+  .form-user,
+  .loging-btn {
+    width: 100%;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/basicinfo/Dt_needBarcode.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/basicinfo/Dt_needBarcode.vue
new file mode 100644
index 0000000..287deaa
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/basicinfo/Dt_needBarcode.vue
@@ -0,0 +1,93 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/basicinfo/Dt_AreaInfo.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend">
+    </view-grid>
+</template>
+<script>
+import extend from "@/extension/basicinfo/Dt_needBarcode.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'areaID',
+            footer: "Foots",
+            cnName: '鍦ㄩ�旀暟鎹�',
+            name: 'basicinfo/dt_needBarcode',
+            url: "/dt_needBarcode/",
+            sortName: "AreaCode"
+        });
+        const editFormFields = ref({
+            "id":"",
+            "toArea": "",
+            "fromArea": "",
+            "barcodeType": "",
+            "productLine": "",
+            "inLineNum": "",
+            "cacheNum":""
+        });
+        const editFormOptions = ref([
+            [
+                { "title": "鍦ㄩ�旀暟閲�", "field": "inLineNum", type: "text" },
+                { "title": "鍙紦瀛樻暟閲�", "field": "cacheNum", type: "text" },
+            ]
+        ]);
+        const searchFormFields = ref({
+            "iD":"",
+            "toArea": "",
+            "fromArea": "",
+            "barcodeType": "",
+            "productLine": "",
+            "inLineNum": "",
+            "cacheNum":""
+        });
+        const searchFormOptions = ref([
+            [
+                { "title": "鐩爣搴撳尯", "field": "toArea", type: "text" },
+                { "title": "鏉ユ簮搴撳尯", "field": "fromArea", type: "text" },
+                { "title": "鎵樼洏绫诲瀷", "field": "barcodeType", type: "text" },
+            ],
+            [
+                { "title": "鎵�灞炰骇绾�", "field": "productLine", type: "text" },
+                { "title": "鍦ㄩ�旀暟閲�", "field": "inLineNum", type: "text" },
+                { "title": "鍙紦瀛樻暟閲�", "field": "cacheNum", type: "text" },
+            ]
+        ]);
+        const columns = ref([{ field: 'iD', title: '涓婚敭', type: 'int', sort: true, hidden: true, width: 110, readonly: true, require: true, align: 'left' },
+        { field: 'toArea', title: '鐩爣搴撳尯', type: 'string', sort: true, width: 110, require: true, align: 'left', sort: true },
+        { field: 'fromArea', title: '鏉ユ簮搴撳尯', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'barcodeType', title: '鎵樼洏绫诲瀷', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'productLine', title: '鎵�灞炰骇绾�', type: 'string', sort: true, width: 110, align: 'left',bind: { key: "ProductionLine", data: [] } },
+        { field: 'inLineNum', title: '鍦ㄩ�旀暟閲�', type: 'int', sort: true, width: 110, align: 'left' },
+        { field: 'cacheNum', title: '鍙紦瀛樻暟閲�', type: 'int', sort: true, width: 100,  align: 'left' },
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100,  align: 'left' },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150,  align: 'left', sort: true },
+        ]);
+        const detail = ref({
+            cnName: "#detailCnName",
+            table: "#detailTable",
+            columns: [],
+            sortName: "",
+            key: ""
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/basicinfo/router.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/basicinfo/router.vue
new file mode 100644
index 0000000..319e35e
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/basicinfo/router.vue
@@ -0,0 +1,265 @@
+
+<template>
+  <view-grid
+    ref="grid"
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+</template>
+    <script>
+import extend from "@/extension/basicinfo/router.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+  setup() {
+    const table = ref({
+      key: "id",
+      footer: "Foots",
+      cnName: "璺敱閰嶇疆淇℃伅",
+      name: "router",
+      url: "/Router/",
+      sortName: "createDate",
+    });
+    const editFormFields = ref({
+      // name: "",
+      // jobGroup: "",
+      // assemblyName: "",
+      // className: "",
+      // intervalSecond: "",
+      // beginTime: "",
+      // endTime: "",
+      // remark: "",
+    });
+    const editFormOptions = ref([
+      // [
+      //   {
+      //     title: "浠诲姟鍚嶇О",
+      //     required: true,
+      //     field: "name",
+      //     type: "string",
+      //   },
+      //   {
+      //     title: "浠诲姟鍒嗙粍",
+      //     required: true,
+      //     field: "jobGroup",
+      //     type: "select",
+      //     dataKey: "deviceType",
+      //     data: [],
+      //   },
+      //   {
+      //     title: "绋嬪簭闆嗗悕绉�",
+      //     required: true,
+      //     field: "assemblyName",
+      //     type: "string",
+      //     type: "select",
+      //     dataKey: "jobAssembly",
+      //     data: [],
+      //   },
+      //   {
+      //     title: "浠诲姟鎵�鍦ㄧ被",
+      //     required: true,
+      //     field: "className",
+      //     type: "string",
+      //     type: "select",
+      //     dataKey: "jobClassName",
+      //     data: [],
+      //   },
+      // ],
+      // [
+      //   {
+      //     title: "闂撮殧鏃堕棿",
+      //     required: true,
+      //     field: "intervalSecond",
+      //     type: "number",
+      //   },
+      //   {
+      //     title: "寮�濮嬫椂闂�",
+      //     field: "beginTime",
+      //     type: "datetime",
+      //   },
+      //   {
+      //     title: "缁撴潫鏃堕棿",
+      //     field: "endTime",
+      //     type: "datetime",
+      //   },
+      //   {
+      //     title: "澶囨敞",
+      //     field: "remark",
+      //     type: "string",
+      //   },
+      // ],
+    ]);
+    const searchFormFields = ref({
+      startPosi: "",
+      nextPosi: "",
+      // assemblyName: "",
+      // className: "",
+    });
+    const searchFormOptions = ref([
+      [
+        {
+          title: "璧风偣浣嶇疆",
+          field: "startPosi",
+          type: "like",
+        },
+        {
+          title: "缁堢偣浣嶇疆",
+          field: "nextPosi",
+          type: "like",
+        },
+        //   {
+        //     title: "绋嬪簭闆嗗悕绉�",
+        //     field: "assemblyName",
+        //     type: "like",
+        //   },
+        //   {
+        //     title: "浠诲姟鎵�鍦ㄧ被",
+        //     field: "className",
+        //     type: "like",
+        //   },
+      ],
+    ]);
+    const columns = ref([
+      {
+        field: "id",
+        title: "Id",
+        type: "int",
+        width: 90,
+        hidden: true,
+        readonly: true,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "startPosi",
+        title: "璧风偣浣嶇疆",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "nextPosi",
+        title: "缁堢偣浣嶇疆",
+        type: "string",
+        width: 180,
+        align: "left",
+      },
+      {
+        field: "inOutType",
+        title: "璺敱绫诲瀷",
+        type: "string",
+        width: 180,
+        align: "left",
+      },
+      {
+        field: "childPosi",
+        title: "瀛愪綅缃�",
+        type: "string",
+        width: 200,
+        align: "left",
+      },
+      {
+        field: "childPosiDeviceCode",
+        title: "瀛愪綅缃墍灞炶澶�",
+        type: "string",
+        width: 120,
+        align: "left",
+      },
+      {
+        field: "srmRow",
+        title: "鍫嗗灈鏈哄彇璐�/鏀捐揣琛�",
+        type: "int",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "srmColumn",
+        title: "鍫嗗灈鏈哄彇璐�/鏀捐揣鍒�",
+        type: "int",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "srmLayer",
+        title: "鍫嗗灈鏈哄彇璐�/鏀捐揣灞�",
+        type: "int",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "depth",
+        title: "娣卞害",
+        type: "int",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "isEnd",
+        title: "鏄惁鏄渶缁堢偣",
+        type: "bool",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "creater",
+        title: "鍒涘缓浜�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "createDate",
+        title: "鍒涘缓鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "modifier",
+        title: "淇敼浜�",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+      {
+        field: "modifyDate",
+        title: "淇敼鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "remark",
+        title: "澶囨敞",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+    ]);
+    const detail = ref({
+      cnName: "",
+      table: "",
+      columns: [],
+      sortName: "",
+      key: "",
+    });
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+    };
+  },
+});
+</script>
+    
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/builder/coder.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/builder/coder.vue
new file mode 100644
index 0000000..ea9b52a
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/builder/coder.vue
@@ -0,0 +1,658 @@
+<template>
+  <div class="builder-container">
+    <vol-box
+      ref="add"
+      :width="850"
+      :height="450"
+      title="鏂板缓閰嶇疆淇℃伅"
+      padding="10px"
+      v-model="addModel"
+    >
+      <div style="padding: 30px 30px 10px 34px">
+        <el-alert type="warning" :closable="false">
+          1銆佸鏋滃彧鏄垱寤虹洰褰曪紝鐖剁骇id濉�0,鍏朵粬闅忎究濉啓;
+          <br />
+          2銆佸鏋滄槸鐢熸垚浠g爜锛岀埗绾d濉啓銆愪唬鐮佺敓鎴愰厤缃�戝垪琛ㄩ〉闈㈢殑id
+        </el-alert>
+      </div>
+      <div class="addModel" style="padding-right: 30px">
+        <vol-form
+          ref="addForm"
+          :formRules="addOptions"
+          :formFields="layOutOptins.fields"
+        >
+        </vol-form>
+      </div>
+      <template #footer>
+        <div>
+          <el-button type="primary" size="small" @click="add"
+            ><i class="el-icon-plus"></i> 纭� 瀹�</el-button
+          >
+        </div>
+      </template>
+    </vol-box>
+    <div class="builder-left">
+      <div class="module-name">浠g爜鐢熸垚閰嶇疆</div>
+      <div class="builder-tree">
+        <el-scrollbar style="height: 100%; width: 200px">
+          <!-- :onOpenChange="onOpenChange" -->
+          <VolMenu :list="tree" :onSelect="onSelect"></VolMenu>
+        </el-scrollbar>
+      </div>
+    </div>
+    <div class="builder-content">
+      <div style="height: 100%">
+        <el-scrollbar style="height: 100%">
+          <div class="coder-container">
+            <div class="coder-item" style="padding-top: 7px">
+              <VolHeader icon="ios-chatbubbles" text="浠g爜鐢熸垚鍣�">
+                <template #content>
+                  <div style="color: red; font-size: 13px">
+                    鍒犻櫎宸︿晶閰嶇疆鑿滃崟:鍒犻櫎琛�->淇濆瓨->鍒犻櫎鑿滃崟
+                  </div>
+                </template>
+                <div class="action">
+                  <span @click="save"> <i class="el-icon-check"></i>淇濆瓨 </span>
+                  <span @click="addVisible()">
+                    <i class="el-icon-plus"></i>鏂板缓
+                  </span>
+                  <span @click="ceateVuePage(0)">
+                    <i class="el-icon-document"></i>鐢熸垚Vue椤甸潰
+                  </span>
+                  <!-- <span @click="ceateVuePage(1)">
+                    <i class="el-icon-document"></i>鐢熸垚app椤甸潰
+                  </span> -->
+                  <span @click="ceateModel">
+                    <i class="el-icon-tickets"></i>鐢熸垚Model
+                  </span>
+                  <span @click="createService">
+                    <i class="el-icon-document"></i>鐢熸垚涓氬姟绫�
+                  </span>
+                  <span @click="delTree">
+                    <i class="el-icon-delete"></i>鍒犻櫎鑿滃崟
+                  </span>
+                </div>
+              </VolHeader>
+              <div class="config">
+                <vol-form
+                  :label-width="90"
+                  ref="form"
+                  :formRules="layOutOptins.options"
+                  :formFields="layOutOptins.fields"
+                ></vol-form>
+              </div>
+            </div>
+            <el-alert type="warning" :closable="false">
+              1銆佸鏋滈渶瑕佷慨鏀硅〃缁撴瀯锛岃鍦ㄦ暟鎹簱淇敼锛屽啀鐐瑰悓姝ヨ〃缁撴瀯->鐢熸垚vue椤甸潰->鐢熸垚model銆�
+              2銆佷慨鏀圭紪杈戣鍚庨渶瑕佺偣鍑荤敓鎴恗odel銆佺敓鎴恦ue椤甸潰
+            </el-alert>
+            <div class="coder-item">
+              <VolHeader
+                icon="md-podium"
+                style="border-bottom: 0"
+                text="琛ㄧ粨鏋�"
+              >
+                <template #content>
+                  <div style="color: red; font-size: 13px">
+                    鏁版嵁搴撹〃缁撴瀯鍙戠敓鍙樺寲鏃惰鐐广�愬悓姝ヨ〃缁撴瀯銆�
+                  </div></template
+                >
+
+                <div class="action">
+                  <span
+                    style="color: rgb(23, 156, 216)"
+                    class="ivu-icon ivu-icon-ios-folder"
+                    @click="help"
+                    >浠g爜鐢熸垚鍣ㄥ弬鏁版枃妗�</span
+                  >
+                  <span @click="delRow" class="ivu-icon ivu-icon-md-close"
+                    >鍒犻櫎琛屾暟鎹�</span
+                  >
+                  <span @click="syncTable" class="ivu-icon ivu-icon-md-sync"
+                    >鍚屾琛ㄧ粨鏋�</span
+                  >
+                </div>
+              </VolHeader>
+
+              <div class="grid-container" style="padding-bottom: 20px">
+                <vol-table
+                  ref="table"
+                  :paginationHide="true"
+                  :tableData="data"
+                  :height="tableHeight"
+                  :columns="layOutOptins.columns"
+                  :color="false"
+                  :index="true"
+                  :allowEmpty="true"
+                  :clickEdit="true"
+                ></vol-table>
+              </div>
+            </div>
+          </div>
+        </el-scrollbar>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import builderData from './builderData';
+import VolForm from '@/components/basic/VolForm.vue';
+import VolTable from '@/components/basic/VolTable.vue';
+import VolBox from '@/components/basic/VolBox.vue';
+import VolHeader from '@/components/basic/VolHeader.vue';
+import VolMenu from '@/components/basic/VolElementMenu.vue';
+export default {
+  components: {
+    VolForm: VolForm,
+    VolTable: VolTable,
+    VolBox: VolBox,
+    VolHeader: VolHeader,
+    VolMenu
+  },
+  data() {
+    return {
+      more: {
+        addChild: 'addChild',
+        ceateController: 'ceateController',
+        addRow: 'addRow',
+        delRow: 'delRow',
+        delTree: 'delTree'
+      },
+      addModel: false,
+      helpModel: false,
+      tableHeight: 500,
+      addOptions: builderData.form.addOptions,
+      layOutOptins: {
+        fields: builderData.form.fields,
+        options: builderData.form.options,
+        columns: builderData.columns
+      },
+      tableInfo: null,
+      data: [],
+      tree: []
+    };
+  },
+  watch: {
+    'layOutOptins.fields.vuePath'(val) {
+      localStorage.setItem('vuePath', val);
+    },
+    deep: true
+    //localStorage.setItem("vuePath", this.layOutOptins.fields.vuePath || "");
+  },
+  methods: {
+    changeMore(funName) {
+      this[funName]();
+    },
+    help() {
+      window.open('http://v2.volcore.xyz/document/coder');
+      // this.helpModel = true;
+    },
+    addVisible(pid) {
+      this.addModel = true;
+      this.$refs.form.reset();
+      this.data.splice(0);
+      if (pid) {
+        this.layOutOptins.fields.parentId = pid;
+      }
+    },
+    delTree() {
+      let tableId = this.layOutOptins.fields.table_Id;
+      if (!tableId) return this.$message.error('璇烽�夋嫨鑺傜偣');
+      let tigger = false;
+      this.$confirm('鍒犻櫎璀﹀憡?', '纭瑕佸垹闄ゅ悧', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning',
+        center: true
+      }).then(() => {
+        if (tigger) return;
+        tigger = true;
+        this.http
+          .post('/api/builder/delTree?table_Id=' + tableId, {}, true)
+          .then((x) => {
+            if (!x.status) return this.$message.error(x.message);
+            this.$message.error('鍒犻櫎鎴愬姛,璇峰埛鏂伴〉闈�');
+            // for (let index = 0; index < this.tree.length; index++) {
+            //   if (this.tree[index].id == tableId) {
+            //     this.tree.splice(index, 1);
+            //   }
+            // }
+          });
+      });
+    },
+    add() {
+      this.$refs.form.validate(() => {
+        // this.layOutOptins.fields.tableName =
+        //   this.layOutOptins.fields.tableName.slice(0, 1).toUpperCase() +
+        //   this.layOutOptins.fields.tableName.slice(1);
+        if (!this.layOutOptins.fields.tableTrueName) {
+          this.layOutOptins.fields.tableTrueName = this.layOutOptins.fields.tableName;
+        }
+
+        let queryParam =
+          'parentId=' +
+          this.layOutOptins.fields.parentId +
+          '&tableName=' +
+          this.layOutOptins.fields.tableName +
+          '&columnCNName=' +
+          this.layOutOptins.fields.columnCNName +
+          '&nameSpace=' +
+          this.layOutOptins.fields.namespace +
+          '&foldername=' +
+          this.layOutOptins.fields.folderName +
+          '&isTreeLoad=false';
+        this.http
+          .post('/api/builder/LoadTableInfo?' + queryParam, {}, true)
+          .then((x) => {
+            if (!x.status) {
+              this.$message.error(x.message);
+              return;
+            }
+            let hasTree = this.tree.some((t) => {
+              return t.id == x.data.table_Id;
+            });
+            if (!hasTree) {
+              this.tree.push({
+                id: x.data.table_Id,
+                pId: x.data.parentId,
+                parentId: x.data.parentId,
+                name: x.data.columnCNName,
+                orderNo: x.data.orderNo
+              });
+            }
+            if (!x.data.tableTrueName) {
+              x.data.tableTrueName = x.data.tableName;
+            }
+            this.addModel = false;
+            this.tableInfo = x.data;
+            this.$refs.form.reset(x.data);
+            this.data = x.data.tableColumns;
+          });
+      });
+    },
+    addChild() {
+      // this.$message.info("寮�鍙戜腑");
+      let id = this.layOutOptins.fields.table_Id;
+      if (!id) {
+        return this.$message.error('璇烽�変腑鑺傜偣');
+      }
+      this.addVisible(id);
+    },
+    addRow() {
+      this.data.push({});
+    },
+    delRow() {
+      let tigger = false;
+      this.$confirm('鍒犻櫎璀﹀憡?', '纭瑕佸垹闄ら�夋嫨鐨勬暟鎹悧', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning',
+        center: true
+      }).then(() => {
+        if (tigger) return;
+        tigger = true;
+        this.$refs.table.delRow();
+      });
+    },
+    validateTableInfo(callback) {
+      this.$refs.form.validate(() => {
+        if (!this.tableInfo) {
+          this.$message.error('璇峰厛鍔犺浇鏁版嵁');
+          return false;
+        }
+        if (this.data && this.data.length > 0) {
+          let keyInfo = this.data.find((x) => {
+            return x.isKey;
+          });
+          if (!keyInfo) {
+            this.$message.error('璇峰嬀閫夎缃富閿�');
+            return false;
+          }
+          if (keyInfo.isNull == 1) {
+            this.$message.error('涓婚敭銆愬彲涓虹┖銆戝繀椤昏缃负鍚�');
+            return false;
+          }
+          if (
+            keyInfo.columnType != 'int' &&
+            keyInfo.columnType != 'bigint' &&
+            !this.layOutOptins.fields.sortName
+          ) {
+            this.$message.error('涓婚敭闈炶嚜澧炵被鍨�,璇疯缃笂闈㈣〃鍗曠殑銆愭帓搴忓瓧娈点��');
+            return false;
+          }
+        }
+
+        for (const key in this.tableInfo) {
+          if (this.layOutOptins.fields.hasOwnProperty(key)) {
+            let newVal = this.layOutOptins.fields[key];
+            this.tableInfo[key] = newVal;
+          }
+        }
+        callback();
+      });
+    },
+    ceateVuePage(isApp) {
+      this.validateTableInfo(() => {
+        let vuePath;
+        if (!isApp) {
+          vuePath = localStorage.getItem('vuePath');
+          if (!vuePath) {
+            return this.$message.error(
+              '璇峰厛璁剧疆Vue椤圭洰瀵瑰簲Views鐨勭粷瀵硅矾寰�,鐒跺悗鍐嶄繚瀛�!'
+            );
+          }
+        } else {
+          vuePath = localStorage.getItem('appPath');
+          if (!vuePath) {
+            return this.$message.error('璇峰厛璁剧疆app璺緞,鐒跺悗鍐嶄繚瀛�!');
+          }
+        }
+
+        let url = `/api/builder/createVuePage?vuePath=${vuePath}&v3=1&app=${isApp ||
+          0}`;
+        this.http.post(url, this.tableInfo, true).then((x) => {
+          this.$Message.info(x);
+        });
+      });
+    },
+    createService() {
+      this.validateTableInfo(() => {
+        let queryParam =
+          'tableName=' +
+          this.layOutOptins.fields.tableName +
+          '&nameSpace=' +
+          this.layOutOptins.fields.namespace +
+          '&foldername=' +
+          this.layOutOptins.fields.folderName;
+        this.http
+          .post(
+            '/api/builder/CreateServices?' + queryParam,
+            this.tableInfo,
+            true
+          )
+          .then((x) => {
+            this.$Message.info(x);
+          });
+      });
+    },
+    ceateModel() {
+      this.validateTableInfo(() => {
+        this.http
+          .post('/api/builder/CreateModel', this.tableInfo, true)
+          .then((x) => {
+            this.$message.info(x);
+          });
+      });
+    },
+    syncTable() {
+      if (!this.layOutOptins.fields.tableName)
+        return this.$Message.error('璇烽�夋ā鍧�');
+      this.http
+        .post(
+          '/api/builder/syncTable?tableName=' +
+            this.layOutOptins.fields.tableName,
+          {},
+          true
+        )
+        .then((x) => {
+          if (!x.status) {
+            return this.$Message.error(x.message);
+          }
+          this.$Message.info(x.message);
+          this.loadTableInfo(this.layOutOptins.fields.table_Id);
+        });
+    },
+    ceateApiController() {},
+    ceateController() {},
+    checkSortName() {},
+    save() {
+      localStorage.setItem('vuePath', this.layOutOptins.fields.vuePath || '');
+      localStorage.setItem('appPath', this.layOutOptins.fields.appPath || '');
+
+      if (
+        this.tableInfo &&
+        this.tableInfo.tableColumns &&
+        this.tableInfo.tableColumns.length &&
+        this.tableInfo.tableColumns.filter((x) => {
+          return x.isKey == 1;
+        }).length > 1
+      ) {
+        return this.$Message.error('琛ㄧ粨鏋勫彧鑳藉嬀閫変竴涓富閿瓧娈�');
+      }
+      this.validateTableInfo(() => {
+        this.http.post('/api/builder/Save', this.tableInfo, true).then((x) => {
+          if (!x.status) {
+            this.$Message.error(x.message);
+            return;
+          }
+          this.$Message.info(x.message);
+          this.tree.forEach((x) => {
+            if (x.id == this.layOutOptins.fields.table_Id) {
+              x.name = this.layOutOptins.fields.columnCNName;
+              x.parentId = this.layOutOptins.fields.parentId;
+            }
+          });
+          this.tableInfo = x.data;
+          x.data.vuePath = this.layOutOptins.fields.vuePath;
+          x.data.appPath = this.layOutOptins.fields.appPath;
+          this.$refs.form.reset(x.data);
+          //  this.layOutOptins.fields.vuePath = localStorage.getItem("vuePath");
+          this.data = x.data.tableColumns;
+          //  this.$Message.info(x);
+        });
+      });
+    },
+    onSelect(node) {
+      this.loadTableInfo(node);
+    },
+    onOpenChange(node) {
+      if (node.length == 0) return;
+      this.loadTableInfo(node.length == 1 ? node[0] : node[node.length - 1]);
+    },
+    loadTableInfo(id) {
+      // localStorage.setItem("vuePath", this.layOutOptins.fields.vuePath || "");
+      this.http
+        .post(
+          '/api/builder/LoadTableInfo?table_Id=' + id + '&isTreeLoad=true',
+          {},
+          true
+        )
+        .then((x) => {
+          if (!x.data.tableTrueName) {
+            x.data.tableTrueName = x.data.tableName;
+          }
+          //2021.01.09澧炲姞浠g爜鐢熸垚鍣ㄨ缃畉able鎺掑簭鍔熻兘
+          const _fields = [
+            'sortable',
+            'isNull',
+            'isReadDataset',
+            'isColumnData',
+            'isDisplay'
+          ];
+          x.data.tableColumns.forEach((item) => {
+            for (let index = 0; index < _fields.length; index++) {
+              item[_fields[index]] = item[_fields[index]] || 0;
+            }
+          });
+          this.tableInfo = x.data;
+
+          this.$refs.form.reset(x.data);
+          this.data = x.data.tableColumns;
+        });
+    },
+    getVuePath(key) {
+      let vuePath = localStorage.getItem(key);
+      if (!vuePath || vuePath == 'null' || vuePath == 'undefined') {
+        vuePath = '';
+      }
+      return vuePath;
+    }
+  },
+  mounted() {},
+  created() {
+    let clientHeight = document.documentElement.clientHeight - 170;
+    this.tableHeight = clientHeight < 400 ? 400 : clientHeight;
+    this.http
+      .post('/api/Sys_Dictionary/GetBuilderDictionary', {}, true)
+      .then((dic) => {
+        let column = this.layOutOptins.columns.find((x) => {
+          return x.field == 'dropNo';
+        });
+        if (!column) return;
+
+        let data = [{ key: '', value: '' }];
+        for (let index = 0; index < dic.length; index++) {
+          data.push({ key: dic[index], value: dic[index] });
+        }
+
+        column.bind.data = data;
+      });
+
+    builderData.form.fields.vuePath = this.getVuePath('vuePath');
+    builderData.form.fields.appPath = this.getVuePath('appPath');
+    this.http.post('/api/builder/GetTableTree', {}, false).then((x) => {
+      this.tree = JSON.parse(x.list);
+      if (!x.nameSpace) {
+        return this.$message.error(
+          '鏈幏鍙栧悗鍙伴」鐩被搴撴墍鍦ㄥ懡鍚嶇┖闂�,璇风‘璁ょ洰褰曟垨璋冭瘯Sys_TableInfoService绫籊etTableTree鏂规硶'
+        );
+      }
+      let nameSpace = JSON.parse(x.nameSpace);
+      let nameSpaceArr = [];
+      for (let index = 0; index < nameSpace.length; index++) {
+        nameSpaceArr.push({
+          key: nameSpace[index],
+          value: nameSpace[index]
+        });
+      }
+
+      //鍒濆鍖栭」鐩懡浠ょ┖闂�
+      this.layOutOptins.options.forEach((option) => {
+        option.forEach((item) => {
+          if (item.field == 'namespace') {
+            item.data.push(...nameSpaceArr);
+          }
+        });
+      });
+      this.addOptions.forEach((option) => {
+        option.forEach((item) => {
+          if (item.field == 'namespace') {
+            item.data.push(...nameSpaceArr);
+          }
+        });
+      });
+    });
+  }
+};
+</script>
+<style scoped>
+.builder-tree {
+  position: absolute;
+  top: 41px;
+  bottom: 0;
+}
+.builder-tree >>> .ivu-menu {
+  text-align: left;
+  width: 200px !important;
+}
+.builder-container {
+  widows: 100%;
+  /* padding: 20px; */
+  position: absolute;
+  top: 0px;
+  left: 0;
+  right: 0;
+  display: inline-block;
+  bottom: 0;
+}
+.grid-container >>> tr:hover {
+  cursor: pointer;
+}
+.builder-left {
+  position: relative;
+  width: 201px;
+  height: 100%;
+  border-right: 2px solid #dcd6d6;
+}
+.builder-content {
+  position: absolute;
+  top: 0px;
+  left: 200px;
+  display: inline-block;
+  bottom: 0;
+  right: 0px;
+}
+.builder-content .ivu-alert {
+  position: relative;
+  display: flex;
+  padding: 12px 18px 12px 38px;
+}
+.builder-content .ivu-alert-icon {
+  top: 10px;
+}
+.builder-content .action {
+  text-align: right;
+  line-height: 33px;
+  padding-right: 26px;
+}
+.builder-content .action i {
+  top: 0px;
+  position: relative;
+}
+.builder-content .action > span {
+  padding: 0px 6px;
+  font-size: 12px;
+  letter-spacing: 1px;
+  color: #5a5f5e;
+}
+.builder-content .action > span:hover {
+  cursor: pointer;
+  color: black;
+}
+.builder-content .config {
+  /* border: 1px solid #e9e8e8; */
+  padding: 15px 15px 0px 15px;
+  border-radius: 3px;
+  background: #ffffff;
+  margin-bottom: 10px;
+}
+.builder-container .config >>> .ivu-form > .ivu-form-item {
+  display: none;
+}
+.coder-container {
+  background: #eee;
+}
+.coder-container .coder-item {
+  background: white;
+  padding: 0px 15px;
+}
+.module-name {
+  color: #2d8cf0;
+  font-size: 13px;
+  line-height: 39px;
+  padding-left: 15px;
+  border: 1px solid #abdcff;
+  background-color: #f0faff;
+}
+.module-name >>> .ivu-alert-icon {
+  top: 12px;
+}
+.help {
+  margin-left: 15px;
+  top: 2px;
+  position: relative;
+  border-bottom: 1px solid;
+}
+.help:hover {
+  color: #f56c6c;
+  cursor: pointer;
+}
+.more {
+  text-align: left;
+  position: relative;
+  top: 2px;
+}
+.addModel {
+  padding: 10px;
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata.vue
new file mode 100644
index 0000000..2759b12
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata.vue
@@ -0,0 +1,258 @@
+
+<template>
+  <div id="big-data-container" class="big-data-container">
+    <div class="head">
+      <h1>澶у睆鏁版嵁缁熻鍒嗘瀽鏄剧ず</h1>
+    </div>
+    <div class="data-container">
+      <div class="data-left">
+        <div class="data-left-item">
+          <div class="title">鍟嗗搧閿�閲忓垎绫�</div>
+          <div id="chart-vleft-1" style="height: calc(100% - 30px)"></div>
+          <div class="data-foot-line"></div>
+        </div>
+        <div class="data-left-item">
+          <div class="title">鏈湀鍟嗗搧閿�閲�</div>
+          <div id="chart-vleft-3" style="height: calc(100% - 30px)"></div>
+
+          <div class="data-foot-line"></div>
+        </div>
+        <div class="data-left-item">
+          <div class="title">7鏃ヨ鍗曢攢閲�</div>
+          <div id="chart-vleft-2" style="height: calc(100% - 30px)"></div>  
+          <div class="data-foot-line"></div>
+        </div>
+      </div>
+      <div class="data-center">
+        <!-- <div class="title">涓棿浣嶇疆</div> -->
+        <div class="center-top-num">
+          <div class="item">
+            <div class="text">绱閿�閲�</div>
+            <div class="num">220,000</div>
+          </div>
+          <div class="item">
+            <div class="text">绱閿�鍞噾棰�</div>
+            <div class="num">58,000,000</div>
+          </div>
+          <div class="item">
+            <div class="text">璐拱鐢ㄦ埛浜烘暟</div>
+            <div class="num">15,000</div>
+          </div>
+          <div class="data-foot-line"></div>
+        </div>
+        <div
+          class="center-top"
+          style="height: 260px; padding-top: 25px; overflow: hidden"
+        >
+          <!-- <div class="title">鐢ㄦ埛娲昏穬淇℃伅-1</div> -->
+          <div id="chart-vgauge-1" style="height: 400px"></div>
+          <!-- <iview-circle :size="200" style="padding: 8px 0;"></iview-circle> -->
+          <div class="data-foot-line"></div>
+        </div>
+        <div class="title">璁㈠崟閿�鍞粺璁�</div>
+        <div id="chart-vcenter" style="height:400px;" class="chart-vcenter"></div>
+      </div>
+      <div class="data-right">
+        <div class="data-right-item">
+          <div class="title">閿�鍞儏鍐佃蛋鍔�</div>
+          <div id="chart-vright-1" style="height: calc(100% - 30px)"></div>
+          <div class="data-foot-line"></div>
+        </div>
+        <div class="data-right-item" style="height: 220px; padding-top: 25px">
+          <!-- <div class="title">鐢ㄦ埛娲昏穬淇℃伅</div> -->
+          <!-- <iview-circle></iview-circle> -->
+          <div id="chart-vgauge-2" style="height: 300px"></div>
+          <div class="data-foot-line"></div>
+        </div>
+        <div class="data-right-item right-3">
+          <div class="title">鍟嗗搧閿�鍞帓琛�</div>
+          <div id="chart-vright-3" class="right-item">
+            <div class="item">
+              <div class="top">鎺掑悕</div>
+              <div class="pro-name">鍟嗗搧鍚嶇О</div>
+              <div class="num">閿�閲�</div>
+              <div class="num">閿�鍞噾棰�</div>
+            </div>
+            <div class="item">
+              <div class="top top-1">
+                <span>1</span>
+              </div>
+              <div class="pro-name">鍗″笣涔愰硠楸�</div>
+              <div class="num">2,200</div>
+              <div class="num">360,00</div>
+            </div>
+            <div class="item">
+              <div class="top top-2">
+                <span>2</span>
+              </div>
+              <div class="pro-name">鏄ュ鐢稵鎭�</div>
+              <div class="num">1,700</div>
+              <div class="num">24,500</div>
+            </div>
+            <div class="item">
+              <div class="top top-3">
+                <span>3</span>
+              </div>
+              <div class="pro-name">鐢峰コ鍚屾浼戦棽闉�</div>
+              <div class="num">1,120</div>
+              <div class="num">12,700</div>
+            </div>
+          </div>
+          <div class="boxfoot"></div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+var echarts = require("echarts");
+let $chartLeft1,
+  $chartLeft2,
+  $chartLeft3,
+  $chartCenter,
+  $chartRight1,
+  $chartGauge1,
+  $chartGauge2;
+import {
+  chartLeft1,
+  chartLeft2,
+  chartLeft3,
+  chartRight1,
+  gauge,
+} from "./bigdata/chart-options";
+// import IviewCircle from "./bigdata/IviewCircle";
+import "./bigdata/layout.less";
+export default {
+  components: {
+    // "iview-circle": IviewCircle
+  },
+  data() {
+    return {};
+  },
+  created() {
+    console.log("chart");
+  },
+  mounted() {
+    if ($chartLeft1) {
+      $chartLeft1.dispose();
+      $chartLeft2.dispose();
+      $chartLeft3.dispose();
+      $chartCenter.dispose();
+      $chartRight1.dispose();
+      $chartGauge1.dispose();
+      $chartGauge2.dispose();
+    }
+    $chartLeft1 = echarts.init(document.getElementById("chart-vleft-1"));
+    $chartLeft1.setOption(chartLeft1, true);
+
+    $chartLeft2 = echarts.init(document.getElementById("chart-vleft-2"));
+    $chartLeft2.setOption(chartLeft2, true);
+
+    $chartLeft3 = echarts.init(document.getElementById("chart-vleft-3"));
+    $chartLeft3.setOption(chartLeft3, true);
+
+    $chartCenter = echarts.init(document.getElementById("chart-vcenter"));
+    $chartCenter.setOption(chartRight1, true);
+
+    $chartRight1 = echarts.init(document.getElementById("chart-vright-1"));
+    $chartRight1.setOption(chartRight1, true);
+
+    $chartGauge1 = echarts.init(document.getElementById("chart-vgauge-1"));
+    $chartGauge1.setOption(gauge, true);
+
+    $chartGauge2 = echarts.init(document.getElementById("chart-vgauge-2"));
+    $chartGauge2.setOption(gauge);
+  },
+  destroyed() {
+    $chartLeft1 = null;
+    $chartLeft2 = null;
+    $chartLeft3 = null;
+    $chartCenter = null;
+    $chartRight1 = null;
+    $chartGauge1 = null;
+    $chartGauge2 = null;
+  },
+};
+</script>
+<style scoped>
+/* .chart-center {
+  display: flex;
+  border: 1px solid #0000ff;
+  height: 200px;
+  flex-direction: column;
+  margin-top: 20px;
+}
+.chart-center .item {
+  text-align: center;
+  border: 1px solid #00c1b3;
+  flex: 1;
+} */
+.right-3 {
+  display: flex;
+  flex-direction: column;
+  /* margin-top: 20px; */
+}
+
+.right-3 .right-item {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+}
+
+.right-3 .item {
+  text-align: left;
+  border-bottom: 1px solid #549069;
+  flex: 1;
+  display: flex;
+  padding: 5px 10px;
+  margin: 0 10px;
+  font-size: 14px;
+  line-height: 30px;
+}
+
+.right-3 .item:last-child {
+  border-bottom: 0;
+}
+
+.right-3 .item > div {
+  color: white;
+}
+
+.right-3 .top {
+  width: 60px;
+  position: relative;
+}
+
+.right-3 .top span {
+  position: absolute;
+  width: 20px;
+  line-height: 20px;
+  top: 5px;
+  text-align: center;
+  border-radius: 5px;
+}
+
+.right-3 .top-1 span {
+  background: #e80d0d;
+}
+
+.right-3 .top-2 span {
+  background: #00c935;
+}
+
+.right-3 .top-3 span {
+  background: #0083f4;
+}
+
+.right-3 .num {
+  width: 88px;
+}
+
+.right-3 .pro-name {
+  flex: 1;
+}
+</style>
+
+
+
+
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata/IviewCircle.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata/IviewCircle.vue
new file mode 100644
index 0000000..c166d91
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata/IviewCircle.vue
@@ -0,0 +1,102 @@
+<template>
+  <div class="demo-Circle">
+    <div style>
+      <i-circle
+        :size="size"
+        :trail-width="4"
+        :stroke-width="5"
+        :percent="75"
+        stroke-linecap="square"
+        stroke-color="#43a3fb"
+      >
+        <div class="demo-Circle-custom">
+          <h1>1500</h1>
+          <p>鏄ㄦ棩娲昏穬鐢ㄦ埛鏁伴噺</p>
+          <span>
+            鍗犳瘮
+            <i>{{1500/20000}}%</i>
+          </span>
+        </div>
+      </i-circle>
+    </div>
+    <div style>
+      <i-circle
+        :size="size"
+        :trail-width="4"
+        :stroke-width="5"
+        :percent="75"
+        stroke-linecap="square"
+        stroke-color="#43a3fb"
+      >
+        <div class="demo-Circle-custom">
+          <h1>12000</h1>
+          <p>涓婃湀娲昏穬鐢ㄦ埛鏁伴噺</p>
+          <span>
+            鍗犳瘮
+            <i>{{12000/150000}}%</i>
+          </span>
+        </div>
+      </i-circle>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  props:{
+    size:{
+      type:Number,
+      default:150
+    }
+  }
+}
+</script>
+<style scoped>
+.demo-Circle {
+  display: flex;
+}
+.demo-Circle > div {
+  flex: 1;
+  text-align: center;
+}
+.demo-Circle > div:first-child{
+  padding-left:10%;
+}
+
+.demo-Circle > div:last-child{
+  padding-right:10%;
+}
+</style>
+<style lang="less" scoped>
+.demo-Circle-custom {
+  & h1 {
+    color:#ffffff;
+    font-size: 28px;
+    font-weight: normal;
+  }
+  & p {
+    color: #ece8e8;
+    font-size: 14px;
+    margin: 10px 0 15px;
+  }
+  & span {
+    display: block;
+    padding-top: 15px;
+    color: wheat;
+    font-size: 14px;
+    &:before {
+      content: "";
+      display: block;
+      width: 50px;
+      height: 1px;
+      margin: 0 auto;
+      background: #e0e3e6;
+      position: relative;
+      top: -15px;
+    }
+  }
+  & span i {
+    font-style: normal;
+    color: white;
+  }
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata/head_bg.png b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata/head_bg.png
new file mode 100644
index 0000000..a2e45f6
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata/head_bg.png
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata/layout.less b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata/layout.less
new file mode 100644
index 0000000..3f6cffd
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/bigdata/layout.less
@@ -0,0 +1,197 @@
+
+.big-data-container {
+  position: absolute;
+  overflow: hidden;
+  height: 100%;
+  width: 100%;
+  background-color: #1400a8;
+  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 1200 800'%3E%3Cdefs%3E%3CradialGradient id='a' cx='0' cy='800' r='800' gradientUnits='userSpaceOnUse'%3E%3Cstop offset='0' stop-color='%230e0077'/%3E%3Cstop offset='1' stop-color='%230e0077' stop-opacity='0'/%3E%3C/radialGradient%3E%3CradialGradient id='b' cx='1200' cy='800' r='800' gradientUnits='userSpaceOnUse'%3E%3Cstop offset='0' stop-color='%2314057c'/%3E%3Cstop offset='1' stop-color='%2314057c' stop-opacity='0'/%3E%3C/radialGradient%3E%3CradialGradient id='c' cx='600' cy='0' r='600' gradientUnits='userSpaceOnUse'%3E%3Cstop offset='0' stop-color='%230d0524'/%3E%3Cstop offset='1' stop-color='%230d0524' stop-opacity='0'/%3E%3C/radialGradient%3E%3CradialGradient id='d' cx='600' cy='800' r='600' gradientUnits='userSpaceOnUse'%3E%3Cstop offset='0' stop-color='%231400a8'/%3E%3Cstop offset='1' stop-color='%231400a8' stop-opacity='0'/%3E%3C/radialGradient%3E%3CradialGradient id='e' cx='0' cy='0' r='800' gradientUnits='userSpaceOnUse'%3E%3Cstop offset='0' stop-color='%23000000'/%3E%3Cstop offset='1' stop-color='%23000000' stop-opacity='0'/%3E%3C/radialGradient%3E%3CradialGradient id='f' cx='1200' cy='0' r='800' gradientUnits='userSpaceOnUse'%3E%3Cstop offset='0' stop-color='%23130733'/%3E%3Cstop offset='1' stop-color='%23130733' stop-opacity='0'/%3E%3C/radialGradient%3E%3C/defs%3E%3Crect fill='url(%23a)' width='1200' height='800'/%3E%3Crect fill='url(%23b)' width='1200' height='800'/%3E%3Crect fill='url(%23c)' width='1200' height='800'/%3E%3Crect fill='url(%23d)' width='1200' height='800'/%3E%3Crect fill='url(%23e)' width='1200' height='800'/%3E%3Crect fill='url(%23f)' width='1200' height='800'/%3E%3C/svg%3E");
+  background-attachment: fixed;
+  background-size: cover;
+  .head {
+    height: 75px;
+    /* height: 1.05rem; */
+    background: url(./head_bg.png) no-repeat center center;
+    background-size: 100% 100%;
+    position: relative;
+    z-index: 100;
+  }
+}
+
+.head h1 {
+  margin: 0;
+  color: #fff;
+  text-align: center;
+  /* font-size: .4rem; */
+  /* line-height: .8rem; */
+  line-height: 71px;
+}
+
+.data-container {
+  /* margin: 5px 15px;
+        height:100%; */
+
+  margin: 0px 15px;
+  position: absolute;
+  left: 0;
+  right: 0;
+  top: 76px;
+  bottom: 0;
+}
+
+.data-container > div {
+  float: left;
+  /* border: 1px solid white; */
+  height: 100%;
+}
+
+.data-center {
+  padding: 0 0.9rem;
+  width: 40%;
+  display: flex;
+  flex-direction: column;
+  // .center-top{
+  //   height: 210px;
+  //   background: red;
+  // }
+.chart-center{
+  flex: 1;
+}
+}
+.chart-center{
+  width: 100%;
+display: flex;
+//  background: white;
+}
+.data-left,
+.data-right {
+  width: 30%;
+  display: flex;
+
+  flex-direction: column;
+}
+
+.data-left-item,
+.data-right-item,.center-top,.center-top-num,.chart-center {
+  border: 1px solid rgba(25, 186, 139, 0.17);
+  padding: 0 0.2rem 0.4rem 0.15rem;
+  background: rgba(255, 255, 255, 0.04);
+  background-size: 100% auto;
+  position: relative;
+  margin-bottom: 0.15rem;
+  z-index: 10;
+}
+
+.data-foot-line {
+  position: absolute;
+  bottom: 0;
+  width: 100%;
+  left: 0;
+}
+
+.data-foot-line:before,
+.data-foot-line:after {
+  position: absolute;
+  width: 10px;
+  height:10px;
+  content: "";
+  border-bottom: 2px solid #02a6b5;
+  bottom: 0;
+}
+
+.boxall:before,
+.data-foot-line:before {
+  border-left: 2px solid #02a6b5;
+  left: 0;
+}
+
+.boxall:after,
+.data-foot-line:after {
+  border-right: 2px solid #02a6b5;
+  right: 0;
+}
+
+.boxall:before,
+.boxall:after {
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  content: "";
+  border-top: 2px solid #02a6b5;
+  top: 0;
+}
+
+.data-left-item:before,
+.data-right-item:before,
+.center-top-num:before,
+.center-top:before{
+  border-left: 2px solid #02a6b5;
+  left: 0;
+  position: absolute;
+  width: 10px;
+  height:10px;
+  content: "";
+  border-top: 2px solid #02a6b5;
+  top: 0;
+}
+
+.data-left-item:after,
+.data-right-item:after,
+.center-top-num:after,
+.center-top:after {
+  border-right: 2px solid #02a6b5;
+  right: 0;
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  content: "";
+  border-top: 2px solid #02a6b5;
+  top: 0;
+}
+
+.data-left,
+.data-right {
+  /* display: flex; */
+}
+
+.data-left > .data-left-item,
+.data-right > .data-right-item {
+  flex: 1;
+  margin-bottom: 0.9rem;
+}
+
+.data-center  .title,
+.data-left > .data-left-item .title,
+.data-right > .data-right-item .title {
+  /* font-size: .2rem; */
+  font-size: 1rem;
+  padding: 7px 0;
+  color: #fff;
+  text-align: center;
+  /* line-height: .5rem; */
+}
+
+.data-center .chart-center{
+  width: 100%;
+}
+
+.center-top-num{
+  height: 80px;
+  padding-top: 7px;
+  margin-bottom: 0.8rem;
+  display: flex;
+  .item{
+    flex: 1;
+    text-align: center;
+  }
+  .text{
+    color: #fcf0d8;
+    font-size: 14px;
+  }
+  .num{
+    font-size: 34px;
+    font-family: -apple-system, BlinkMacSystemFont, Segoe UI, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Helvetica Neue, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;
+    font-weight: bold;
+    color: #67caca;
+  }
+}
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/chart.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/chart.vue
new file mode 100644
index 0000000..3b0695a
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/chart.vue
@@ -0,0 +1,101 @@
+<template>
+  <div class="m-charts">
+    <el-tabs
+      v-model="name"
+      @tab-click="tabClick"
+      type="border-card"
+      style="height: 100%; width: 100%; box-shadow: none"
+    >
+      <el-tab-pane name="bar">
+        <template #label>
+          <span><i class="el-icon-date"></i> 鏌辩姸鍥� </span>
+        </template>
+        <div
+          :style="{ height: heigth + 'px', width: width + 'px' }"
+          id="bar-0001"
+        ></div>
+      </el-tab-pane>
+      <el-tab-pane name="pie" :lazy="false" label="娑堟伅涓績">
+        <template #label>
+          <span><i class="el-icon-date"></i> 楗肩姸鍥� </span>
+        </template>
+        <div
+          :style="{ height: heigth + 'px', width: width + 'px' }"
+          id="pie-0001"
+        ></div>
+      </el-tab-pane>
+      <el-tab-pane name="line" :lazy="false" label="瑙掕壊绠$悊">
+        <template #label>
+          <span><i class="el-icon-date"></i> 鎶樼嚎鍥� </span>
+        </template>
+        <div
+          :style="{ height: heigth + 'px', width: width + 'px' }"
+          id="line-0001"
+        ></div>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+<script>
+let echarts = require("echarts");
+import options from "./chartOptions";
+let $bar;
+let $pie;
+let $line;
+export default {
+  mounted() {
+    $bar = echarts.init(document.getElementById("bar-0001"));
+    $bar.setOption(this.options.bar);
+  },
+  created() {
+    this.heigth = document.documentElement.clientHeight - 190;
+    this.width = document.documentElement.clientWidth - 240;
+  },
+  methods: {
+    tabClick(name) {
+      if (name.props.name == "pie") {
+        if (!$pie) {
+          $pie = echarts.init(document.getElementById("pie-0001"));
+          $pie.setOption(this.options.pie);
+
+        }
+      } else if (name.props.name == "line") {
+        if (!$line) {
+          $line = echarts.init(document.getElementById("line-0001"));
+          $line.setOption(this.options.line);
+         
+        }
+      }
+    },
+  },
+  data() {
+    return {
+      name: "bar",
+      heigth: 450,
+      width: 1000,
+      options: options,
+    };
+  },
+};
+</script>
+<style lang="less" scoped>
+.m-charts {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: #f1f1f1;
+  margin: auto 0;
+  padding: 12px;
+  .m-tabs {
+    background: white;
+  }
+}
+.m-charts ::v-deep(.el-tabs__content) {
+  height: calc(100% - 45px);
+}
+.m-charts ::v-deep(.el-tab-pane) {
+  height: 100%;
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/flex.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/flex.vue
new file mode 100644
index 0000000..e94823a
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/flex.vue
@@ -0,0 +1,386 @@
+<template>
+  <div class="home-contianer">
+    <div>
+      <div class="order-title">
+        <h2>璁㈠崟缁熻</h2>
+      </div>
+      <div
+        data-v-542f4644
+        class="ivu-row"
+        style="padding: 15px; background: white"
+      >
+        <div
+          v-for="item in topColor"
+          :key="item.name"
+          class="ivu-col ivu-col-span-6"
+          style="padding-left: 8px; padding-right: 8px"
+        >
+          <div
+            data-v-542f4644
+            class="ivu-card"
+            :style="{ background: item.background }"
+          >
+            <div class="icon-left">
+              <i :class="item.icon" />
+            </div>
+            <div class="ivu-card-body">
+              <div class="demo-color-name">{{ item.name }}</div>
+              <div class="demo-color-desc">#{{ item.qty }}</div>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <div class="numbers">
+        
+        <div class="item" v-for="index in 8" :key="index">
+          <div class="number">
+            <!-- {{value}} -->
+            {{index * 1000}}
+          </div>
+          <div>Order total</div>
+        </div>
+      </div>
+
+      <div class="order-title">
+        <h2>璁㈠崟鏌ヨ</h2>
+      </div>
+     
+      <div class="order-range">
+        <div
+          class="order-item"
+          v-for="(item, index) in totalRange"
+          :key="index"
+        >
+          <div class="total">
+            <div class="number">
+              {{item.qty}}
+            </div>
+          </div>
+          <div class="name">{{ titleLeft + item.name }}</div>
+          <div class="date">
+            {{ beginDate.replace(/-/g, ".") }} --
+            {{ endDate.replace(/-/g, ".") }}
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+
+
+export default {
+  data() {
+    return {
+      beginDate: "",
+      endDate: "",
+      n: 90,
+      topColor: [
+        {
+          name: "璁㈠崟鏁�",
+          desc: "#205",
+          background: "rgb(25, 190, 107)",
+          icon: "el-icon-shopping-cart-full",
+          qty: 6000,
+          key: "total",
+        },
+        {
+          name: "宸蹭粯娆�",
+          desc: "#412",
+          background: "rgb(45, 183, 245)",
+          icon: "el-icon-wallet",
+          qty: 7100,
+          key: "total",
+        },
+        {
+          name: "寰呭彂璐�",
+          desc: "#412",
+          background: "#f2b458",
+          icon: "el-icon-shopping-cart-1",
+          qty: 500,
+          key: "hasPay",
+        },
+        {
+          name: "閰嶉�佷腑",
+          desc: "#412",
+          background: "rgb(84, 110, 122)",
+          icon: "el-icon-shopping-cart-2",
+          qty: 800,
+          key: "notShip",
+        },
+        {
+          name: "宸插畬鎴�",
+          desc: "#412",
+          background: "rgb(45, 183, 245)",
+          icon: "el-icon-set-up",
+          qty: 1880,
+          key: "completed",
+        },
+        {
+          name: "閫�璐ц鍗�",
+          desc: "#12",
+          background: "rgb(237, 64, 20)",
+          icon: "el-icon-data-analysis",
+          qty: 2290,
+          key: "refund",
+        },
+      ],
+      totalRange: [
+        {
+          name: "璁㈠崟鏁�",
+          desc: "#205",
+          background: "rgb(25, 190, 107)",
+          icon: "ios-cart",
+          qty: 1290,
+          key: "total",
+        },
+        {
+          name: "宸蹭粯娆�",
+          desc: "#412",
+          background: "rgb(45, 183, 245)",
+          icon: "ios-cash",
+          qty: 3450,
+          key: "total",
+        },
+        {
+          name: "寰呭彂璐�",
+          desc: "#412",
+          background: "rgb(255, 153, 0)",
+          icon: "md-bus",
+          qty: 200,
+          key: "hasPay",
+        },
+        {
+          name: "閰嶉�佷腑",
+          desc: "#412",
+          background: " rgb(84, 110, 122)",
+          icon: "md-pin",
+          qty: 7000,
+          key: "notShip",
+        },
+        {
+          name: "浜ゆ槗瀹屾垚",
+          desc: "#412",
+          background: "rgb(45, 183, 245)",
+          icon: "ios-help-buoy",
+          qty: 8900,
+          key: "completed",
+        },
+        {
+          name: "閫�璐ц鍗�",
+          desc: "#12",
+          background: "rgb(237, 64, 20)",
+          icon: "ios-navigate",
+          qty: 2450,
+          key: "refund",
+        },
+      ],
+      value1: "1",
+      titleLeft: "",
+      dateNow: "",
+    };
+  },
+  methods: {
+    getDate() {
+      var date = new Date();
+      var year = date.getFullYear();
+      var month = date.getMonth() + 1;
+      var day = date.getDate();
+      var hour = date.getHours();
+      var minutes = date.getMinutes();
+      var second = date.getSeconds();
+      this.beginDate =
+        year +
+        "-" +
+        (month < 10 ? "0" + month : month) +
+        "-" +
+        (day < 10 ? "0" + day : day);
+      this.endDate = this.beginDate;
+      this.dateNow = this.beginDate;
+    },
+    search() {
+      if (this.dateNow == this.beginDate && this.dateNow == this.endDate) {
+        this.titleLeft = "浠婃棩";
+      } else {
+        this.titleLeft = "褰撴湡";
+      }
+    },
+  },
+  created() {
+    this.getDate();
+  },
+  mounted() {},
+};
+</script>
+<style scoped>
+.home-contianer {
+  background: #efefef;
+  width: 100%;
+  height: 100%;
+  /* padding: 20px; */
+}
+
+.ivu-card-body {
+  text-align: center;
+  padding: 20px 5px;
+  /* padding-left: 80px; */
+  font-size: 16px;
+}
+.demo-color-name {
+  color: #fff;
+  font-size: 14px;
+}
+.demo-color-desc {
+  color: white;
+  /* opacity: 0.7; */
+  font-size: 20px;
+  margin-top: 2px;
+}
+.ivu-card {
+  box-shadow: 0 3px 13px rgba(117, 114, 114, 0.47);
+  display: flex;
+  position: relative;
+      padding-top: 10px;
+    border-radius: 5px;
+}
+.ivu-card .icon-left {
+  width: 85px;
+}
+.ivu-card .ivu-card-body {
+  flex: 1;
+}
+.ivu-card .icon-left {
+  text-align: center;
+  border-right: 1px solid;
+  padding: 8px 0px;
+  height: 100%;
+
+  font-size: 50px;
+  color: white;
+}
+.ivu-row {
+  border-bottom: 2px dotted #eee;
+  padding: 15px;
+  margin-bottom: 15px;
+  display: flex;
+}
+
+.ivu-row > div {
+  flex: 1;
+}
+
+.h5-desc {
+  padding-top: 10px;
+}
+</style>
+
+<style lang="less" scoped>
+.jn-day-total {
+  display: flex;
+  padding: 15px;
+  background: white;
+  .date-text {
+    line-height: 36px;
+    padding: 0 15px;
+  }
+  .date {
+    margin-right: 20px;
+  }
+  .btn {
+    margin-left: 10px;
+  }
+}
+.order-title {
+  h2 {
+    padding: 7px 15px;
+    font-weight: 500;
+    background: white;
+    border-bottom: 1px dotted #d4d4d4;
+  }
+}
+
+.order-range {
+  padding: 0 15px;
+  background: white;
+  background: white;
+  display: flex;
+  // flex-direction: row-reverse;
+}
+
+.order-range .order-item {
+  box-shadow: 0 3px 13px rgba(117, 114, 114, 0.47);
+  flex: 1;
+  border-radius: 6px;
+  font-size: 14px;
+  text-align: center;
+  border: 1px solid #e6e6e6;
+  margin: 7px;
+}
+
+.order-range .total {
+  color: white;
+  font-size: 50px;
+  font-weight: bold;
+  line-height: 100px;
+  background: #55ce80;
+  font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB",
+    "Microsoft YaHei", "寰蒋闆呴粦", Arial, sans-serif;
+}
+.order-range .number {
+  transition: transform 0.8s;
+}
+.order-range .number:hover {
+  cursor: pointer;
+  transform: scale(1.2);
+}
+.order-range .name {
+  font-size: 20px;
+  padding: 10px;
+}
+
+.order-range .date {
+  padding: 1px 0 20px 0;
+  color: #9e9e9e;
+  font-size: 13px;
+}
+</style>
+
+
+<style lang="less" scoped>
+.numbers {
+    margin-bottom: 15px;
+  border-radius: 5px;
+  border: 1px solid #eaeaea;
+  background: white;
+  display: flex;
+
+  padding: 20px 0px;
+  .item {
+    flex: 1;
+    text-align: center;
+    border-right: 1px solid #e5e5e5;
+  }
+  .item > 銆�div:first-child {
+    word-break: break-all;
+    color: #282727;
+    font-size: 30px;
+    // padding-bottom: 12px;
+  }
+  .item > 銆�div:last-child {
+    font-size: 13px;
+    color: #777;
+  }
+  .item:last-child {
+    border-right: none;
+  }
+  .number {
+    cursor: pointer;
+    transition: transform 0.8s;
+  }
+  .number:hover {
+    transform: scale(1.2);
+    color: #03c10b !important;
+  }
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/formChart.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/formChart.vue
new file mode 100644
index 0000000..25d4f10
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/charts/formChart.vue
@@ -0,0 +1,118 @@
+<template>
+  <div class="c-container">
+    <div class="item">
+      <div class="left">
+        <VolHeader
+          icon="md-apps"
+          text="鏌辩姸鍥�"
+          style="padding-left: 10px; margin-bottom: 5px"
+        ></VolHeader>
+        <div  style="height: calc(100% - 45px)" :id="bar"></div>
+      </div>
+      <div class="right">
+        <VolHeader
+          icon="md-apps"
+          text="鍩虹琛ㄥ崟"
+          style="padding-left: 10px; margin-bottom: 20px"
+        ></VolHeader>
+        <VolForm
+          style="padding-right: 30px"
+          ref="myform1"
+          :loadKey="true"
+          :label-width="80"
+          :formFields="formFields1"
+          :formRules="formRules1"
+        ></VolForm>
+      </div>
+    </div>
+
+    <div class="item">
+      <div class="left">
+        <VolHeader
+          icon="md-apps"
+          text="琛ㄥ崟灞炴�у瓧娈靛彧璇�"
+          style="padding-left: 10px; margin-bottom: 20px"
+        ></VolHeader>
+        <VolForm
+          style="padding-right: 30px"
+          ref="myform1"
+          :loadKey="true"
+          :formFields="formFields2"
+          :formRules="formRules2"
+        ></VolForm>
+      </div>
+      <div class="right">
+        <VolHeader
+          icon="md-apps"
+          text="楗肩姸鍥捐〃"
+          style="padding-left: 10px"
+        ></VolHeader>
+        <div style="height: calc(100% - 30px)" :id="pie"></div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import VolHeader from '@/components/basic/VolHeader.vue';
+import VolForm from '@/components/basic/VolForm.vue';
+let echarts = require('echarts');
+import options from './chartOptions';
+import {
+  formFields1,
+  formRules1,
+  formFields2,
+  formRules2
+} from './formOptions';
+export default {
+  components: { VolForm, VolHeader },
+  data() {
+    return {
+      formFields1: formFields1,
+      formRules1: formRules1,
+      formFields2: formFields2,
+      formRules2: formRules2,
+      bar: 'b-' + ~~(Math.random(10000, 100000) * 100000),
+      pie: 'p-' + ~~(Math.random(10000, 100000) * 100000),
+      options: options
+    };
+  },
+  mounted() {
+    let $bar = echarts.init(document.getElementById(this.bar));
+    $bar.setOption(this.options.bar);
+
+    this.options.pie.legend.top = 50;
+    this.options.pie.legend.right = 80;
+    this.options.pie.legend.orient = 'vertical';
+    let $pie = echarts.init(document.getElementById(this.pie));
+    $pie.setOption(this.options.pie);
+  }
+};
+</script>
+<style lang="less" scoped>
+.c-container {
+  position: absolute;
+  height: 100%;
+  width: 100%;
+  background: #f1f1f1;
+  display: flex;
+  flex-direction: column;
+  padding: 3px;
+  .item {
+    flex:1;
+    height:0;
+    display: flex;
+    > div {
+      flex: 1;
+      width: 0;
+      // margin: 10px;
+      background: #fff;
+    }
+    .left {
+      margin: 4px;
+    }
+    .right {
+      margin: 4px;
+    }
+  }
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/index/Message.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/index/Message.vue
new file mode 100644
index 0000000..2c77447
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/index/Message.vue
@@ -0,0 +1,45 @@
+<template>
+  <div class="message-container">
+    <div class="item" v-for="(item, index) in list" :key="index">
+      <div class="title">{{ item.title }}({{ item.date }})</div>
+      <div class="content">{{ item.message }}</div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    list: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    }
+  },
+  created() {
+    if (!this.list.length) {
+      this.list.push({
+        title: '娑堟伅娴嬭瘯鏍囬',
+        message: '娑堟伅娴嬭瘯鍐呭娑堟伅娴嬭瘯鍐呭娑堟伅娴嬭瘯鍐呭娑堟伅娴嬭瘯鍐呭',
+        date: '2022-05-02 03:10'
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="less">
+.message-container {
+  .title {
+    padding-bottom: 10px;
+  }
+  .item {
+    border-bottom: 1px solid #eee;
+    padding: 10px 20px;
+  }
+  .content {
+    color: #7e7e7e;
+    font-size: 13px;
+  }
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/index/index.less b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/index/index.less
new file mode 100644
index 0000000..c872e91
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/index/index.less
@@ -0,0 +1,644 @@
+.vol-aside {
+  height: 100%;
+  position: absolute;
+  float: left;
+  overflow: hidden;
+}
+
+.vol-menu {
+  border: 0 !important;
+}
+
+.vol-aside .tac {
+  text-align: left;
+}
+
+.vol-aside .header {
+  text-align: center;
+  position: absolute;
+  height: 60px;
+  position: relative;
+  line-height: 60px;
+}
+
+.vol-aside .vol-menu {
+  position: absolute;
+  width: 100%;
+  top: 60px;
+  bottom: 0;
+  background: white;
+  border-right: 1px solid #e3e3e3;
+}
+
+.vol-aside .vol-menu ::v-deep(.ivu-menu) {
+  text-align: left;
+  position: unset;
+  width: 100% !important;
+}
+
+.vol-aside .vol-menu ::v-deep(.is-horizontal) {
+  display: none !important;
+}
+
+.vol-aside .vol-menu ::v-deep(.is-vertical) {
+  width: 2px;
+  right: -1px;
+}
+
+.vol-container {
+  min-width: 800px;
+  right: 0;
+  display: inline-block;
+  position: absolute;
+  margin: 0;
+  box-sizing: border-box;
+  height: 100%;
+}
+
+.vol-container .vol-path {
+  position: relative;
+  width: 100%;
+  display: inline-block;
+  border-bottom: 1px solid #eee;
+}
+
+.vol-container .vol-path span {
+  position: relative;
+  margin-right: 10px;
+  color: #969696;
+}
+
+.vol-header {
+  height: 61px;
+  width: 100%;
+  position: relative;
+  display: flex;
+  border-bottom: 1px solid #eee;
+}
+
+.vol-main {
+  border-left: 1px solid #eee;
+  position: absolute;
+  width: 100%;
+  bottom: 0;
+  top: 95px;
+  margin: 0;
+  overflow: auto;
+}
+
+.header {
+  padding: 5px;
+}
+
+.header img {
+  height: 100%;
+  margin-right: 25px;
+}
+
+.header-info {
+  padding-right: 20px;
+  display: inline-block;
+  // position: absolute;
+  height: 100%;
+}
+
+.header-info > div {
+  float: left;
+  height: 100%;
+}
+
+.user-header {
+  background: white;
+  height: 52px;
+  width: 52px;
+  border-radius: 50%;
+  margin-right: 0px;
+  top: 4px;
+  left: 7px;
+  position: relative;
+  border: 1px solid #dfdfdf;
+}
+
+.project-name {
+  line-height: 60px;
+  padding: 0 50px 0 20px;
+  color: #fff;
+  font-size: 16px;
+  letter-spacing: 1px;
+}
+
+.header-text {
+  vertical-align: middle;
+  height: 100%;
+  // position: absolute;
+  flex: 1;
+  text-align: left;
+  font-size: 15px;
+  left: 21px;
+  line-height: 60px;
+  letter-spacing: 1px;
+}
+
+.vol-header .user {
+  text-align: left;
+  padding: 0 12px;
+  position: relative;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  // height: 60px;
+  justify-content: center;
+  span:last-child {
+    font-size: 12px;
+  }
+}
+
+.vol-header .settings {
+  padding-top: 10px;
+  color: #d4d2d2;
+}
+
+.vol-header .user span {
+  position: relative;
+}
+
+.header-info:hover {
+  cursor: pointer;
+}
+
+.header-navigation {
+  cursor: pointer;
+  box-shadow: none;
+  border-bottom: 1px solid #eee;
+  height: 34px;
+  /* overflow: hidden; */
+  line-height: 35px;
+  display: block;
+  margin: 0;
+  padding: 0;
+  outline: 0;
+  list-style: none;
+  position: relative;
+  z-index: 900;
+  font-weight: initial;
+  margin-top: -1px;
+}
+
+.el-tabs--border-card {
+  border: none;
+}
+
+.header-navigation ::v-deep(.el-tabs__item) {
+  height: 34px;
+  font-size: 14px;
+  line-height: 34px;
+  padding-bottom: 6px;
+  color: #525252 !important;
+  position: relative;
+  margin: 0 4px;
+  border: 1px solid #e2e2e2;
+  border-top-right-radius: 4px;
+  border-top-left-radius: 4px;
+  // border-bottom: 0px;
+}
+
+.header-navigation ::v-deep(.el-tabs__item.is-active) {
+  color: #1a81ea !important;
+}
+
+.header-navigation ::v-deep(.el-tabs__nav-prev),
+.header-navigation ::v-deep(.el-tabs__nav-next) {
+  line-height: 35px;
+  padding-left: 4px;
+}
+
+.vol-header .user span:first-child {
+  font-size: 15px;
+  font-weight: bolder;
+}
+
+.h-link {
+  line-height: 59px;
+}
+
+.h-link a {
+  font-size: 14px;
+  text-decoration: none;
+  padding: 0px 15px;
+  /* height: 60px; */
+  display: inline-block;
+}
+
+img[src=''],
+img:not([src]) {
+  opacity: 0;
+}
+
+//榛戣壊
+.vol-theme-dark {
+  .header {
+    background: #101010;
+  }
+
+  .header-text {
+    color: white;
+  }
+
+  .vol-header {
+    background-color: #272929;
+  }
+
+  .h-link a:hover {
+    background: #0c0202;
+  }
+
+  a {
+    color: #f2f2f2;
+  }
+
+  .h-link a:hover {
+    color: #dfdfdf;
+  }
+
+  .h-link .actived {
+    border-bottom: 2px solid white;
+  }
+
+  .h-link .actived a {
+    color: white !important;
+  }
+
+  .vol-header .user {
+    color: #ececec;
+  }
+
+  .vol-header .settings {
+    color: #d4d2d2;
+  }
+
+  .vol-aside .vol-menu {
+    background: black;
+  }
+}
+
+.vol-theme-white .vol-aside ::v-deep(.vol-el-menu-item) {
+  background: #2e333b;
+  color: white;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.vol-menu .el-submenu) {
+  background: black;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.vol-menu .el-sub-menu__title *) {
+  color: #d6d6d6;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.vol-el-menu-item .el-menu-item) {
+  color: #eee;
+  background: #1f1f1f;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.vol-el-menu-item .el-menu-item.is-active),
+.vol-theme-dark .vol-aside ::v-deep(.menu-item-lv1) {
+  background: black;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.menu-item-lv1) {
+  background: black;
+  color: #d6d6d6;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.vol-el-menu-item .el-menu-item:hover) {
+  background: black;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.el-sub-menu__title) {
+  background-color: black;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.el-sub-menu__title:hover) {
+  background-color: rgb(25, 25, 25);
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.el-sub-menu__title:hover *) {
+  color: white;
+}
+
+.vol-theme-red,
+.vol-theme-red2 {
+  .vol-header {
+    background-color: rgb(237, 64, 20);
+  }
+
+  .header-text {
+    color: #dcdfe6;
+  }
+
+  .h-link a:hover {
+    background: #d71212;
+  }
+
+  .h-link .actived {
+    border-bottom: 2px solid white;
+  }
+
+  .h-link a,
+  .h-link .actived a,
+  .vol-header .settings,
+  .vol-header .user {
+    color: white;
+  }
+
+  .vol-header .header-text {
+    color: #fbfbfb;
+  }
+}
+
+.vol-theme-red {
+  .header {
+    background-color: rgb(237, 64, 20);
+  }
+}
+
+.vol-theme-red2 {
+  .header {
+    background-color: #a90000;
+  }
+}
+
+.vol-theme-orange,
+.vol-theme-orange2 {
+  .header-text {
+    color: #dcdfe6;
+  }
+
+  .vol-header {
+    background-color: rgb(255, 153, 0);
+  }
+
+  .h-link a:hover {
+    background: #c97901;
+  }
+
+  .h-link .actived {
+    border-bottom: 2px solid white;
+  }
+
+  .h-link a,
+  .h-link .actived a,
+  .vol-header .settings,
+  .vol-header .user {
+    color: white;
+  }
+
+  .vol-header .header-text {
+    color: #fbfbfb;
+  }
+}
+
+.vol-theme-orange {
+  .header {
+    background: rgb(255, 153, 0);
+  }
+}
+
+.vol-theme-orange2 {
+  .header {
+    background-color: rgb(232, 141, 5);
+  }
+}
+
+//缁胯壊
+.vol-theme-green,
+.vol-theme-green2 {
+  .header-text {
+    color: #dcdfe6;
+  }
+
+  .vol-header {
+    background-color: rgb(25, 190, 107);
+  }
+
+  .h-link a:hover {
+    background: #329103;
+  }
+
+  .h-link .actived {
+    border-bottom: 2px solid white;
+  }
+
+  .h-link a,
+  .h-link .actived a,
+  .vol-header .settings,
+  .vol-header .user {
+    color: white;
+  }
+
+  .vol-header .header-text {
+    color: #fbfbfb;
+  }
+}
+
+.vol-theme-green {
+  .header {
+    background: rgb(25, 190, 107);
+  }
+}
+
+.vol-theme-green2 {
+  .header {
+    background-color: rgb(1, 158, 79);
+  }
+}
+
+//钃濊壊
+.vol-theme-blue,
+.vol-theme-blue2 {
+  .header-text {
+    color: #dcdfe6;
+  }
+
+  .vol-header {
+    background-color: rgb(45, 140, 240);
+  }
+
+  .h-link a:hover {
+    background: #0170e3;
+  }
+
+  .h-link .actived {
+    border-bottom: 2px solid white;
+  }
+
+  .h-link a,
+  .h-link .actived a,
+  .vol-header .settings,
+  .vol-header .user {
+    color: white;
+  }
+
+  .vol-header .header-text {
+    color: #fbfbfb;
+  }
+}
+
+.vol-theme-blue {
+  .header {
+    background-color: rgb(45, 140, 240);
+  }
+}
+
+.vol-theme-blue2 {
+  .header {
+    background-color: rgb(0, 104, 214);
+  }
+}
+
+//鐧借壊
+.vol-theme-white {
+  .header {
+    background-color: #434956;
+  }
+
+  .h-link a:hover {
+    background: #eeeeee;
+  }
+
+  .h-link a {
+    color: #211f1f;
+  }
+
+  .header-navigation {
+    // box-shadow: -7px 11px 10px -13px #678aa7;
+    border-bottom: 1px solid #eee;
+    height: 32px;
+    overflow: hidden;
+    line-height: 32px;
+    display: block;
+    margin: 0;
+    padding: 0;
+    outline: 0;
+    list-style: none;
+    position: relative;
+    z-index: 900;
+    font-weight: 400;
+  }
+
+  .vol-aside .vol-menu {
+    background: #353941;
+  }
+}
+
+.vol-theme-white .project-name {
+  color: #505050;
+}
+
+.vol-theme-white .vol-aside::v-deep(.vol-el-menu-item .el-menu-item.is-active),
+.vol-theme-white .vol-aside ::v-deep(.menu-item-lv1) {
+  background: #353941;
+}
+
+.vol-theme-white .vol-aside ::v-deep(.menu-item-lv1) {
+  background: #353941;
+  color: #d6d6d6;
+}
+
+.vol-theme-white .vol-aside ::v-deep(.vol-el-menu-item .el-menu-item:hover) {
+  background: #353941;
+}
+
+.vol-theme-white .vol-aside ::v-deep(.el-sub-menu__title) {
+  background-color: #353941;
+}
+
+.vol-theme-white .vol-aside ::v-deep(.el-sub-menu__title:hover) {
+  background-color: rgb(47, 46, 46);
+}
+
+.vol-theme-white .vol-aside ::v-deep(.el-sub-menu__title),
+.vol-theme-white .vol-aside ::v-deep(.el-menu-item),
+.vol-theme-white .vol-aside ::v-deep(.el-sub-menu__title:hover *) {
+  color: #bababa;
+}
+
+// .vol-theme-white .vol-aside ::v-deep(.vol-el-menu-item) {
+//   background: #363e4f;
+//   color: white;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.vol-menu .el-submenu),
+// .vol-theme-white .vol-aside ::v-deep(.menu-item-lv1) {
+//   background: #515a6e;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.vol-menu) {
+//   background: #515a6e;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.vol-menu .el-sub-menu__title *),
+// .vol-theme-white .vol-aside ::v-deep(.menu-item-lv1 *) {
+//   color: #d6d6d6;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.vol-el-menu-item .el-menu-item) {
+//   color: #eee;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.vol-el-menu-item .el-menu-item.is-active),
+// .vol-theme-white .vol-aside ::v-deep(.menu-item-lv1.is-active) {
+//   background: #59647b;
+//   color: #fff;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.vol-el-menu-item .el-menu-item:hover) {
+//   background: #6a758c;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.el-sub-menu__title:hover) {
+//   background-color: #525865;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.el-sub-menu__title:hover *) {
+//   color: white;
+// }
+
+// .vol-theme-red ::v-deep(.el-menu-item.is-active),
+// .vol-theme-red2 ::v-deep(.el-menu-item.is-active)
+// {
+//   background-color: #d71212;
+// }
+// .vol-theme-blue ::v-deep(.el-menu-item.is-active),
+// .vol-theme-blue2 ::v-deep(.el-menu-item.is-active)
+// {
+//   background-color: #2d8cf0;
+// }
+// .vol-theme-orange ::v-deep(.el-menu-item.is-active),
+// .vol-theme-orange2 ::v-deep(.el-menu-item.is-active)
+// {
+//   background-color: #ff9900;
+// }
+
+// .vol-theme-green ::v-deep(.el-menu-item.is-active),
+// .vol-theme-green2 ::v-deep(.el-menu-item.is-active)
+// {
+//   background-color: #19be6b;
+// }
+
+.theme-selector {
+  height: 100%;
+  padding-left: 16px;
+
+  .item {
+    cursor: pointer;
+    width: 60px;
+    height: 60px;
+    border-radius: 5px;
+    margin-bottom: 17px;
+    border: 1px solid #d4d2d2;
+    float: left;
+    margin-right: 13px;
+  }
+}
+
+.collapse-menu {
+  font-size: 21px;
+  color: #fff;
+  line-height: 60px;
+  position: absolute;
+  top: 0;
+  right: 5px;
+  cursor: pointer;
+}
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceInfo.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceInfo.vue
new file mode 100644
index 0000000..65f1f75
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceInfo.vue
@@ -0,0 +1,365 @@
+
+ <template>
+  <view-grid
+    ref="grid"
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+</template>
+<script>
+import extend from "@/extension/quartzJob/deviceInfo.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+  setup() {
+    const table = ref({
+      key: "id",
+      footer: "Foots",
+      cnName: "璁惧淇℃伅",
+      name: "deviceInfo",
+      url: "/DeviceInfo/",
+      sortName: "createDate",
+    });
+    const editFormFields = ref({
+      deviceCode: "",
+      deviceName: "",
+      deviceType: "",
+      deviceStatus: "",
+      deviceIp: "",
+      devicePort: "",
+      devicePlcType: "",
+      deviceRemark: "",
+    });
+    const editFormOptions = ref([
+      [
+        {
+          title: "璁惧缂栧彿",
+          required: true,
+          field: "deviceCode",
+          type: "string",
+        },
+        {
+          title: "璁惧鍚嶇О",
+          required: true,
+          field: "deviceName",
+          type: "string",
+        },
+        {
+          title: "璁惧绫诲瀷",
+          required: true,
+          field: "deviceType",
+          type: "select",
+          dataKey: "deviceType",
+          data: [],
+        },
+        {
+          title: "璁惧鐘舵��",
+          required: true,
+          field: "deviceStatus",
+          type: "select",
+          dataKey: "deviceStatus",
+          data: [],
+        },
+      ],
+      [
+        { title: "璁惧IP", required: true, field: "deviceIp", type: "string" },
+        {
+          title: "璁惧绔彛",
+          required: true,
+          field: "devicePort",
+          type: "string",
+        },
+        {
+          title: "PLC绫诲瀷",
+          required: true,
+          field: "devicePlcType",
+          type: "select",
+          dataKey: "devicePlcType",
+          data: [],
+        },
+        {
+          title: "澶囨敞",
+          field: "deviceRemark",
+          type: "string",
+        },
+      ],
+    ]);
+    const searchFormFields = ref({
+      deviceCode: "",
+      deviceType: "",
+      deviceStatus: "",
+    });
+    const searchFormOptions = ref([
+      [
+        { title: "璁惧缂栧彿", field: "deviceCode" },
+        {
+          title: "璁惧绫诲瀷",
+          field: "deviceType",
+          type: "select",
+          dataKey: "deviceType",
+          data: [],
+        },
+        {
+          title: "璁惧鐘舵��",
+          field: "deviceStatus",
+          type: "select",
+          dataKey: "deviceStatus",
+          data: [],
+        },
+      ],
+    ]);
+    const columns = ref([
+      {
+        field: "id",
+        title: "Id",
+        type: "int",
+        width: 90,
+        hidden: true,
+        readonly: true,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "deviceCode",
+        title: "璁惧缂栧彿",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "deviceName",
+        title: "璁惧鍚嶇О",
+        type: "string",
+        link: true,
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "deviceType",
+        title: "璁惧绫诲瀷",
+        type: "string",
+        width: 150,
+        align: "left",
+        bind: { key: "deviceType", data: [] },
+      },
+      {
+        field: "deviceStatus",
+        title: "璁惧鐘舵��",
+        type: "string",
+        width: 90,
+        align: "left",
+        bind: { key: "deviceStatus", data: [] },
+      },
+      {
+        field: "deviceIp",
+        title: "璁惧IP",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "devicePort",
+        title: "璁惧绔彛",
+        type: "int",
+        width: 120,
+        align: "left",
+      },
+      {
+        field: "devicePlcType",
+        title: "PLC绫诲瀷",
+        type: "string",
+        width: 120,
+        align: "left",
+        bind: { key: "devicePlcType", data: [] },
+      },
+      {
+        field: "creater",
+        title: "鍒涘缓浜�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "createDate",
+        title: "鍒涘缓鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "modifier",
+        title: "淇敼浜�",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+      {
+        field: "modifyDate",
+        title: "淇敼鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "deviceRemark",
+        title: "澶囨敞",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+    ]);
+    const detail = ref({
+      cnName: "璁惧鍗忚淇℃伅",
+      table: "DeviceProtocol",
+      columns: [
+        {
+          field: "id",
+          title: "Id",
+          type: "int",
+          width: 90,
+          hidden: true,
+          require: true,
+          align: "left",
+        },
+        {
+          field: "deviceId",
+          title: "璁惧涓婚敭",
+          type: "string",
+          width: 90,
+          hidden: true,
+          readonly: true,
+          require: true,
+          align: "left",
+        },
+        {
+          field: "deviceChildCode",
+          title: "璁惧瀛愮紪鍙�",
+          type: "string",
+          edit: { type: "" },
+          width: 150,
+          require: true,
+          align: "left",
+          sortable: true,
+        },
+        {
+          field: "deviceProDataBlock",
+          title: "鍗忚鏁版嵁鍧�",
+          type: "string",
+          width: 100,
+          require: true,
+          align: "left",
+          edit: { type: "" },
+        },
+        {
+          field: "deviceProOffset",
+          title: "鍋忕Щ閲�",
+          type: "decimal",
+          width: 90,
+          edit: { type: "number" },
+          require: true,
+          align: "left",
+        },
+        {
+          field: "deviceProDataType",
+          title: "鏁版嵁绫诲瀷",
+          type: "string",
+          width: 90,
+          require: true,
+          align: "left",
+          edit: { type: "" },
+        },
+        {
+          field: "deviceProDataLength",
+          title: "鏁版嵁闀垮害",
+          type: "int",
+          width: 90,
+          require: true,
+          align: "left",
+          edit: { type: "" },
+        },
+        {
+          field: "deviceProParamName",
+          title: "鍙傛暟鍚嶇О",
+          type: "string",
+          width: 150,
+          require: true,
+          align: "left",
+          edit: { type: "" },
+        },
+        {
+          field: "deviceProParamType",
+          title: "鍙傛暟绫诲瀷",
+          type: "string",
+          width: 150,
+          require: true,
+          align: "left",
+          edit: { type: "" },
+        },
+        {
+          field: "deviceProParamDes",
+          title: "鍙傛暟璇存槑",
+          type: "string",
+          width: 130,
+          require: true,
+          align: "left",
+          edit: { type: "" },
+        },
+        {
+          field: "creater",
+          title: "鍒涘缓浜�",
+          type: "string",
+          width: 90,
+          align: "left",
+          sortable: true,
+        },
+        {
+          field: "creater",
+          title: "鍒涘缓浜�",
+          type: "string",
+          width: 90,
+          align: "left",
+        },
+        {
+          field: "createDate",
+          title: "鍒涘缓鏃堕棿",
+          type: "datetime",
+          width: 160,
+          align: "left",
+        },
+        {
+          field: "modifier",
+          title: "淇敼浜�",
+          type: "string",
+          width: 100,
+          align: "left",
+        },
+        {
+          field: "modifyDate",
+          title: "淇敼鏃堕棿",
+          type: "datetime",
+          width: 160,
+          align: "left",
+        },
+      ],
+      sortName: "createDate",
+      key: "id",
+    });
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+    };
+  },
+});
+</script>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocol.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocol.vue
new file mode 100644
index 0000000..6d3ea40
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocol.vue
@@ -0,0 +1,229 @@
+
+<template>
+  <view-grid
+    ref="grid"
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+</template>
+  <script>
+import extend from "@/extension/quartzJob/deviceProtocol.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+  setup() {
+    const table = ref({
+      key: "id",
+      footer: "Foots",
+      cnName: "璁惧鍗忚淇℃伅",
+      name: "deviceProtocol",
+      url: "/DeviceProtocol/",
+      sortName: "id",
+    });
+    const editFormFields = ref({
+      deviceCode: "",
+      deviceName: "",
+      deviceType: "",
+      deviceStatus: "",
+      deviceIp: "",
+      devicePort: "",
+      devicePlcType: "",
+      deviceRemark: "",
+    });
+    const editFormOptions = ref([
+      [
+        {
+          title: "璁惧缂栧彿",
+          required: true,
+          field: "deviceCode",
+          type: "string",
+        },
+        {
+          title: "璁惧鍚嶇О",
+          required: true,
+          field: "deviceName",
+          type: "string",
+        },
+        {
+          title: "璁惧绫诲瀷",
+          required: true,
+          field: "deviceType",
+          type: "string",
+        },
+        {
+          title: "璁惧鐘舵��",
+          required: true,
+          field: "deviceStatus",
+          type: "string",
+        },
+      ],
+      [
+        { title: "璁惧IP", required: true, field: "deviceIp", type: "string" },
+        {
+          title: "璁惧绔彛",
+          required: true,
+          field: "devicePort",
+          type: "string",
+        },
+        {
+          title: "PLC绫诲瀷",
+          required: true,
+          field: "devicePlcType",
+          type: "string",
+        },
+        {
+          title: "澶囨敞",
+          field: "deviceRemark",
+          type: "string",
+        },
+      ],
+    ]);
+    const searchFormFields = ref({
+      deviceCode: "",
+      deviceType: "",
+      deviceStatus: "",
+    });
+    const searchFormOptions = ref([
+      [
+        { title: "璁惧缂栧彿", field: "deviceCode" },
+        { title: "璁惧绫诲瀷", field: "deviceType" },
+        { title: "璁惧鐘舵��", field: "deviceStatus" },
+      ],
+    ]);
+    const columns = ref([
+      {
+        field: "id",
+        title: "Id",
+        type: "int",
+        width: 90,
+        hidden: true,
+        readonly: true,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "deviceId",
+        title: "璁惧涓婚敭",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "deviceChildCode",
+        title: "璁惧瀛愮紪鍙�",
+        type: "string",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "deviceProDataBlock",
+        title: "鍗忚鏁版嵁鍧�",
+        type: "string",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "deviceProOffset",
+        title: "鍋忕Щ閲�",
+        type: "decimal",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "deviceProDataType",
+        title: "鏁版嵁绫诲瀷",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "deviceProDataLength",
+        title: "鏁版嵁闀垮害",
+        type: "int",
+        width: 120,
+        align: "left",
+      },
+      {
+        field: "deviceProParamName",
+        title: "鍙傛暟鍚嶇О",
+        type: "string",
+        width: 200,
+        align: "left",
+      },
+      {
+        field: "deviceProParamType",
+        title: "鍙傛暟绫诲瀷",
+        type: "string",
+        width: 180,
+        align: "left",
+      },
+      {
+        field: "deviceProParamDes",
+        title: "鍙傛暟璇存槑",
+        type: "string",
+        width: 120,
+        align: "left",
+      },
+      {
+        field: "creater",
+        title: "鍒涘缓浜�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "createDate",
+        title: "鍒涘缓鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "modifier",
+        title: "淇敼浜�",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+      {
+        field: "modifyDate",
+        title: "淇敼鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "deviceProRemark",
+        title: "澶囨敞",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+    ]);
+    const detail = ref({
+      cnName: "",
+      table: "",
+      columns: [],
+      sortName: "",
+      key: "",
+    });
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+    };
+  },
+});
+</script>
+  
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocolDetail.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocolDetail.vue
new file mode 100644
index 0000000..6dd1be7
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/deviceProtocolDetail.vue
@@ -0,0 +1,207 @@
+
+<template>
+  <view-grid
+    ref="grid"
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+</template>
+  <script>
+import extend from "@/extension/quartzJob/deviceProtocolDetail.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+  setup() {
+    const table = ref({
+      key: "id",
+      footer: "Foots",
+      cnName: "璁惧鍗忚鏄庣粏淇℃伅",
+      name: "deviceProtocolDetail",
+      url: "/DeviceProtocolDetail/",
+      sortName: "createDate",
+    });
+    const editFormFields = ref({
+      deviceType: "",
+      deviceProParamName: "",
+      protocolDetailType: "",
+      protocalDetailValue: "",
+      protocolDetailDes: "",
+    });
+    const editFormOptions = ref([
+      [
+        {
+          title: "璁惧绫诲瀷",
+          required: true,
+          field: "deviceType",
+          type: "select",
+          dataKey: "deviceType",
+          data: [],
+        },
+        {
+          title: "鍙傛暟鍚嶇О",
+          required: true,
+          field: "deviceProParamName",
+          type: "string",
+        },
+        {
+          title: "鏄庣粏绫诲瀷",
+          required: true,
+          field: "protocolDetailType",
+          type: "string",
+        },
+        {
+          title: "鏄庣粏鍙栧��",
+          required: true,
+          field: "protocalDetailValue",
+          type: "string",
+        },
+      ],
+      [
+        {
+          title: "鏄庣粏璇存槑",
+          field: "protocolDetailDes",
+          type: "textarea",
+        },
+      ],
+    ]);
+    const searchFormFields = ref({
+      deviceType: "",
+      deviceProParamName: "",
+      protocolDetailType: "",
+    });
+    const searchFormOptions = ref([
+      [
+      {
+          title: "璁惧绫诲瀷",
+          field: "deviceType",
+          type: "select",
+          dataKey: "deviceType",
+          data: [],
+        },
+        {
+          title: "鍙傛暟鍚嶇О",
+          field: "deviceProParamName",
+          type: "like",
+        },
+        {
+          title: "鏄庣粏绫诲瀷",
+          field: "protocolDetailType",
+          type: "like",
+        },
+        {
+          title: "鏄庣粏鍙栧��",
+          field: "protocalDetailValue",
+          type: "like",
+        },
+      ],
+    ]);
+    const columns = ref([
+      {
+        field: "id",
+        title: "Id",
+        type: "int",
+        width: 90,
+        hidden: true,
+        readonly: true,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "deviceType",
+        title: "璁惧绫诲瀷",
+        type: "string",
+        width: 180,
+        align: "left",
+        bind: { key: "deviceType", data: [] },
+      },
+      {
+        field: "deviceProParamName",
+        title: "璁惧鍗忚鍙傛暟鍚嶇О",
+        type: "string",
+        width: 180,
+        align: "left",
+      },
+      {
+        field: "protocolDetailType",
+        title: "璁惧鍗忚鏄庣粏绫诲瀷",
+        type: "string",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "protocalDetailValue",
+        title: "璁惧鍗忚鏄庣粏鍙栧��",
+        type: "string",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "protocolDetailDes",
+        title: "璁惧鍗忚鏄庣粏璇存槑",
+        type: "string",
+        width: 350,
+        align: "left",
+      },
+      {
+        field: "creater",
+        title: "鍒涘缓浜�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "createDate",
+        title: "鍒涘缓鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "modifier",
+        title: "淇敼浜�",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+      {
+        field: "modifyDate",
+        title: "淇敼鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "remark",
+        title: "澶囨敞",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+    ]);
+    const detail = ref({
+      cnName: "",
+      table: "",
+      columns: [],
+      sortName: "",
+      key: "",
+    });
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+    };
+  },
+});
+</script>
+  
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/dispatchInfo.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/dispatchInfo.vue
new file mode 100644
index 0000000..3e88503
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/quartzJob/dispatchInfo.vue
@@ -0,0 +1,247 @@
+
+<template>
+  <view-grid
+    ref="grid"
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+</template>
+  <script>
+import extend from "@/extension/quartzJob/dispatchInfo.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+  setup() {
+    const table = ref({
+      key: "id",
+      footer: "Foots",
+      cnName: "璋冨害鏈嶅姟閰嶇疆淇℃伅",
+      name: "dispatchInfo",
+      url: "/DispatchInfo/",
+      sortName: "createDate",
+    });
+    const editFormFields = ref({
+      name: "",
+      jobGroup: "",
+      assemblyName: "",
+      className: "",
+      intervalSecond: "",
+      beginTime: "",
+      endTime: "",
+      remark: "",
+    });
+    const editFormOptions = ref([
+      [
+        {
+          title: "浠诲姟鍚嶇О",
+          required: true,
+          field: "name",
+          type: "string",
+        },
+        {
+          title: "浠诲姟鍒嗙粍",
+          required: true,
+          field: "jobGroup",
+          type: "select",
+          dataKey: "deviceType",
+          data: [],
+        },
+        {
+          title: "绋嬪簭闆嗗悕绉�",
+          required: true,
+          field: "assemblyName",
+          type: "string",
+          type: "select",
+          dataKey: "jobAssembly",
+          data: [],
+        },
+        {
+          title: "浠诲姟鎵�鍦ㄧ被",
+          required: true,
+          field: "className",
+          type: "string",
+          type: "select",
+          dataKey: "jobClassName",
+          data: [],
+        },
+      ],
+      [
+        {
+          title: "闂撮殧鏃堕棿",
+          required: true,
+          field: "intervalSecond",
+          type: "number",
+        },
+        {
+          title: "寮�濮嬫椂闂�",
+          field: "beginTime",
+          type: "datetime",
+        },
+        {
+          title: "缁撴潫鏃堕棿",
+          field: "endTime",
+          type: "datetime",
+        },
+        {
+          title: "澶囨敞",
+          field: "remark",
+          type: "string",
+        },
+      ],
+    ]);
+    const searchFormFields = ref({
+      name: "",
+      jobGroup: "",
+      assemblyName: "",
+      className: "",
+    });
+    const searchFormOptions = ref([
+      [
+         {
+          title: "浠诲姟鍚嶇О",
+          field: "name",
+          type: "like",
+        },
+        {
+          title: "浠诲姟鍒嗙粍",
+          field: "jobGroup",
+          type: "select",
+          dataKey: "deviceType",
+          data: [],
+        },
+        {
+          title: "绋嬪簭闆嗗悕绉�",
+          field: "assemblyName",
+          type: "like",
+        },
+        {
+          title: "浠诲姟鎵�鍦ㄧ被",
+          field: "className",
+          type: "like",
+        },
+      ],
+    ]);
+    const columns = ref([
+      {
+        field: "id",
+        title: "Id",
+        type: "int",
+        width: 90,
+        hidden: true,
+        readonly: true,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "name",
+        title: "浠诲姟鍚嶇О",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "jobGroup",
+        title: "浠诲姟鍒嗙粍",
+        type: "string",
+        width: 180,
+        align: "left",
+        bind: { key: "deviceType", data: [] },
+      },
+      {
+        field: "assemblyName",
+        title: "绋嬪簭闆嗗悕绉�",
+        type: "string",
+        width: 180,
+        align: "left",
+      },
+      {
+        field: "className",
+        title: "浠诲姟鎵�鍦ㄧ被",
+        type: "int",
+        width: 200,
+        align: "left",
+      },
+      {
+        field: "intervalSecond",
+        title: "鎵ц闂撮殧鏃堕棿",
+        type: "int",
+        width: 120,
+        align: "left",
+      },
+      {
+        field: "beginTime",
+        title: "寮�濮嬫椂闂�",
+        type: "datetime",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "endTime",
+        title: "缁撴潫鏃堕棿",
+        type: "int",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "creater",
+        title: "鍒涘缓浜�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "createDate",
+        title: "鍒涘缓鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "modifier",
+        title: "淇敼浜�",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+      {
+        field: "modifyDate",
+        title: "淇敼鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "remark",
+        title: "澶囨敞",
+        type: "string",
+        width: 100,
+        align: "left",
+      },
+    ]);
+    const detail = ref({
+      cnName: "",
+      table: "",
+      columns: [],
+      sortName: "",
+      key: "",
+    });
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+    };
+  },
+});
+</script>
+  
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Permission.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Permission.vue
new file mode 100644
index 0000000..dd62254
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Permission.vue
@@ -0,0 +1,359 @@
+<template>
+  <div class="role-container">
+    <div class="role-tree-left flex-col">
+      <div class="title"><i class="el-icon-user"></i>瑙掕壊鍒楄〃</div>
+      <el-scrollbar class="el-role-list">
+        <el-tree
+          :data="tree"
+          @node-click="nodeClick"
+          node-key="id"
+          :default-expanded-keys="openKeys"
+          :expand-on-click-node="false"
+          style="padding: 5px 0; margin-right: 2px"
+        >
+          <template #default="{ data }">
+            <div class="action-group">
+              <div class="action-text">
+                {{ data.roleName }}
+              </div>
+            </div>
+          </template>
+        </el-tree>
+      </el-scrollbar>
+    </div>
+    <div class="role-tree-right flex-col">
+      <div class="title">
+        <div><i class="el-icon-folder-opened"></i>鑿滃崟鏉冮檺</div>
+        <el-button type="primary" @click="save">淇濆瓨</el-button>
+      </div>
+      <el-scrollbar class="el-role-list">
+        <el-tree
+          @check-change="leftCheckChange"
+          @check="nodeCheck"
+          :data="roleTree"
+          :show-checkbox="false"
+          style="padding: 15px"
+          node-key="id"
+          default-expand-all
+          :expand-on-click-node="false"
+        >
+          <template #default="{ data }">
+            <div class="action-group">
+              <div
+                class="action-text"
+                :style="{ width: (4 - data.lv) * 18 + 150 + 'px' }"
+              >
+                <el-checkbox v-model="data.leftCk" @change="allChange(data)">{{
+                  // data.text + (data.isApp ? "(app)" : "")
+                  data.text 
+                }}</el-checkbox>
+              </div>
+              <div class="action-item">
+                <el-checkbox
+                  v-for="(item, index) in data.actions"
+                  :key="index"
+                  v-model="item.checked"
+                  @change="actionChange(data, item.checked)"
+                  >{{ item.text }}</el-checkbox
+                >
+              </div>
+            </div>
+          </template>
+        </el-tree>
+      </el-scrollbar>
+    </div>
+  </div>
+</template>
+
+<script>
+import { defineComponent, ref, reactive, getCurrentInstance } from "vue";
+import http from "@/../src/api/http.js";
+export default defineComponent({
+  setup() {
+    const selectId = ref(-1);
+    const checked = ref(false);
+    const tree = reactive([]);
+    const list = reactive([]);
+    const roles = reactive([]);
+    const roleList = reactive([]);
+    const roleTree = reactive([]);
+    const openKeys = reactive([]);
+
+    const leftCheckChange = (node, selected) => {
+      node.actions.forEach((x, index) => {
+        x.checked = selected;
+      });
+    };
+    const nodeCheck = (node, data) => {
+      let rootData = roleList.find((x) => {
+        return x.id === node.pid;
+      });
+      if (rootData && rootData.actions.length) {
+        rootData.actions[0].checked =
+          node.actions.some((x) => {
+            return x.checked;
+          }) ||
+          data.halfCheckedNodes.some((x) => {
+            return x.id === node.pid;
+          });
+      }
+    };
+
+    const allChange = (data) => {
+      data.actions.forEach((item) => {
+        item.checked = data.leftCk;
+      });
+      if (!data.children) {
+        return;
+      }
+      setChildrenChecked(data, data.leftCk);
+    };
+    const setChildrenChecked = (data, ck) => {
+      data.children.forEach((item) => {
+        item.leftCk = ck;
+        item.actions.forEach((c) => {
+          c.checked = ck;
+        });
+        if (item.children) {
+          setChildrenChecked(item, ck);
+        }
+      });
+    };
+    const actionChange = (data, ck) => {
+      ck =
+        data.actions.filter((x) => {
+          return x.checked;
+        }).length == data.actions.length;
+      data.leftCk = ck;
+    };
+
+    const load = () => {
+      const url = "api/Sys_Role/getUserChildRoles";
+      http.post(url, {}, true).then((result) => {
+        
+        if (!result.status) return;
+        list.splice(0);
+        list.push(...result.data);
+        list.forEach((x) => {
+          if (x.parentId == 0) {
+            x.lv = 1;
+            x.children = [];
+            tree.push(x);
+            getTree(x.id, x);
+          }
+        });
+        openKeys.push(tree[0].id);
+        selectId.value = openKeys[0];
+      });
+    };
+    const getTree = (id, data) => {
+      list.forEach((x) => {
+        if (x.parentId == id) {
+          x.lv = data.lv + 1;
+          if (!data.children) data.children = [];
+          data.children.push(x);
+          getTree(x.id, x);
+        }
+      });
+    };
+    const nodeClick = (node, selected) => {
+      selectId.value = node.id;
+      getUserRole(node);
+    };
+    const getUserRole = (item) => {
+      selectId.value = item.id;
+      roleList.forEach((x) => {
+        x.actions.forEach((a) => {
+          a.checked = false;
+        });
+      });
+      let url = `/api/Sys_Role/getUserTreePermission?roleId=${item.id}`;
+      http.post(url, {}, true).then((result) => {
+        if (!result.status) return;
+        result.data.forEach((item) => {
+          if (item.actions.length == 0) return;
+          let sourceItem = roleList.find((f) => f.id == item.id);
+          if (!sourceItem) return;
+          item.actions.forEach((actions) => {
+            sourceItem.actions.forEach((soure) => {
+              if (soure.value == actions.value) {
+                soure.checked = true;
+              }
+            });
+          });
+        });
+      });
+    };
+
+    const getRoleTree = (id, data, isRootId) => {
+      roleList.forEach((x) => {
+        if (x.pid == id) {
+          x.lv = data.lv + 1;
+          if (isRootId) {
+            x.rootId = id;
+          }
+          if (!data.children) data.children = [];
+          data.children.push(x);
+          getRoleTree(x.id, x, isRootId);
+        }
+      });
+    };
+
+    const getCurrentTreePermission = () => {
+      let url = "/api/Sys_Role/getCurrentTreePermission";
+      http.post(url, {}, true).then((result) => {
+        if (!result.status) return;
+        roleList.splice(0);
+        roles.splice(0);
+        roleList.push(...result.data.tree);
+        roles.push(...result.data.roles);
+        roleList.forEach((x) => {
+          if (x.pid == 0) {
+            x.lv = 1;
+            x.children = [];
+            roleTree.push(x);
+            getRoleTree(x.id, x);
+          }
+        });
+      });
+    };
+    let $message =
+      getCurrentInstance().appContext.config.globalProperties.$message;
+    const save = () => {
+      if (selectId.value <= 0) {
+        return $message.error("璇烽�夋嫨瑙掕壊!");
+      }
+      let userPermissions = [];
+      roleList.forEach((x) => {
+        let checkedPermission = x.actions.filter((f) => {
+          return f.checked;
+        });
+        if (checkedPermission.length > 0) {
+          let actions = checkedPermission.map((m) => {
+            return { text: m.text, value: m.value };
+          });
+          userPermissions.push({
+            id: x.id,
+            actions: actions,
+          });
+        }
+      });
+      let url = `api/Sys_Role/SavePermission?roleId=${selectId.value}`;
+      http.post(url, userPermissions, true).then((result) => {
+        $message[result.status ? "success" : "error"](result.message);
+      });
+    };
+
+    load();
+    getCurrentTreePermission();
+    return {
+      list,
+      nodeClick,
+      checked,
+      tree,
+      selectId,
+      openKeys,
+      getUserRole,
+      roles,
+      roleList,
+      getCurrentTreePermission,
+      leftCheckChange,
+      nodeCheck,
+      roleTree,
+      allChange,
+      actionChange,
+      save,
+    };
+  },
+});
+</script>
+<style lang="less" scoped>
+.role-container {
+  position: absolute;
+  background: #f6f6f6;
+  height: 100%;
+  width: 100%;
+  padding: 10px;
+  display: flex;
+  .flex-col {
+    display: flex;
+    flex-direction: column;
+  }
+  .role-tree-left {
+    border: 1px solid #f2f2f2;
+    background: #fff;
+    width: 230px;
+    margin-right: 10px;
+    .title {
+      i {
+        margin-left: 10px;
+      }
+    }
+  }
+  .role-tree-right {
+    background: #fff;
+    border: 1px solid #f2f2f2;
+    width: 0;
+    flex: 1;
+    .title {
+      display: flex;
+      i {
+        margin-left: 10px;
+      }
+      div {
+        flex: 1;
+      }
+    }
+    .action-group {
+      display: flex;
+      // line-height: 32px;
+      justify-content: center;
+      align-items: center;
+      label {
+        float: left;
+      }
+      .action-text {
+        line-height: 33px;
+        label {
+          margin-right: 5px;
+        }
+      }
+    }
+  }
+  .title {
+    padding: 10px;
+    background: rgb(246 250 255);
+    font-weight: bold;
+    font-size: 14px;
+    letter-spacing: 2px;
+  }
+  .el-role-list {
+    flex: 1;
+    height: 0;
+    overflow-x: hidden;
+  }
+}
+.role-tree-left ::v-deep(.el-tree-node__content) {
+  cursor: pointer;
+  height: auto;
+  padding: 5px;
+  margin: 2px 10px;
+  font-size: 15px;
+}
+.role-tree-left ::v-deep(.el-tree-node__content:hover) {
+  background: #f4f4f4;
+  border-radius: 20px;
+}
+.role-tree-left ::v-deep(.is-current > .el-tree-node__content:first-child) {
+  background: #f2f2f2;
+  border-radius: 20px;
+}
+.role-tree-right ::v-deep(.el-tree-node__content) {
+  margin-bottom: 5px;
+  height: auto;
+}
+.role-tree-right ::v-deep(.el-checkbox__label) {
+  position: relative;
+  top: 2px;
+}
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Permission/RoleTree.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Permission/RoleTree.vue
new file mode 100644
index 0000000..9ae4e6b
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Permission/RoleTree.vue
@@ -0,0 +1,152 @@
+<template>
+  <div class="com-el-tree">
+
+      <div class="m-title"><i class="el-icon-warning-outline"></i>瑙掕壊鍒楄〃</div>
+
+    <el-scrollbar style="height: 100%; width: 200px" class="el-role-tree">
+      <el-tree
+        :data="tree"
+        @node-click="nodeClick"
+        node-key="id"
+        :default-expanded-keys="openKeys"
+        :expand-on-click-node="false"
+        style="padding: 5px 0; margin-right: 2px"
+      >
+        <template #default="{ node, data }">
+          <div class="action-group">
+            <div
+              class="action-text"
+              :class="{
+                actived: data.id == selectId,
+                'node-text': data.parentId !== 0,
+              }"
+              :style="{ width: (4 - data.lv) * 18 + 150 + 'px' }"
+            >
+              <Icon
+                v-if="data.parentId !== 0"
+                :type="data.id == selectId ? 'ios-paper' : 'ios-paper-outline'"
+              />
+              {{ data.roleName }}
+            </div>
+          </div>
+        </template>
+      </el-tree>
+    </el-scrollbar>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    // roles: {
+    //   type: Object,
+    //   default: () => {
+    //     return [];
+    //   }
+    // },
+    onChange: {
+      type: Function,
+      default: (treeId) => {},
+    },
+  },
+  data() {
+    return {
+      selectId: -1,
+      checked: false,
+      openKeys: [],
+      data: [],
+      tree: [],
+    };
+  },
+  created() {
+    this.load();
+  },
+  methods: {
+    load() {
+      this.http.post("/api/Sys_Role/getUserChildRoles", {}, true).then((result) => {
+        if (!result.status) return this.$message.error(result.message);
+        this.data.splice(0);
+        this.data = result.data;
+        this.data.forEach((x) => {
+          if (x.parentId == 0) {
+            x.lv = 1;
+            x.children = [];
+            this.tree.push(x);
+            this.getTree(x.id, x);
+          }
+        });
+        this.openKeys.push(this.tree[0].id);
+        this.selectId = this.openKeys[0];
+        //榛樿鍔犺浇绗竴涓爲褰㈣彍鍗曚笅闈㈢殑鏁版嵁
+
+        //this.onChange(this.selectId);
+      });
+    },
+    getTree(id, data) {
+      this.data.forEach((x) => {
+        if (x.parentId == id) {
+          x.lv = data.lv + 1;
+          if (!data.children) data.children = [];
+          data.children.push(x);
+          this.getTree(x.id, x);
+        }
+      });
+    },
+    nodeClick(node, selected) {
+      //  console.log(node);
+      this.selectId = node.id;
+      //缂撳瓨褰撳墠閫変腑鐨勮妭鐐�
+      //  this.$store.getters.data().treeDemo1.treeId = node.id;
+      this.onChange(node);
+    },
+  },
+};
+</script>
+<style lang="less" scoped>
+.com-el-tree {
+  //2020.06.03澧炲姞宸︿晶tree鍥哄畾瀹藉害
+  width: 200px;
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+  border-radius: 3px;
+  background: white;
+  .el-role-tree {
+    flex: 1;
+    // border-right: 1px solid #eee;
+  }
+  .actived {
+  }
+  .action-text {
+    font-size: 14px;
+  }
+}
+.role-list {
+  color: white;
+  line-height: 40px;
+  padding: 0 13px;
+  font-size: 16px;
+  top: 2px;
+  width: 200px;
+}
+.m-title {
+  line-height: 30px;
+  font-size: 15px;
+  background: #66b1ff0f;
+  font-weight: bold;
+  padding: 6px 16px;
+  border-bottom: 1px solid #eee;
+  i {
+    padding-right: 5px;
+  }
+}
+.com-el-tree ::v-dee(.el-tree-node) {
+  padding: 3px 0;
+}
+.com-el-tree ::v-dee(.el-scrollbar .el-scrollbar__thumb) {
+  width: 0 !important;
+}
+</style>
+<style scoped>
+
+</style>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Dictionary.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Dictionary.vue
new file mode 100644
index 0000000..5ceafd6
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Dictionary.vue
@@ -0,0 +1,325 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/system/Sys_Dictionary.js姝ゅ缂栧啓
+ -->
+<template>
+  <view-grid
+    ref="grid"
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+</template>
+<script>
+import extend from "@/extension/system/Sys_Dictionary.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+  setup() {
+    const table = ref({
+      key: "dicId",
+      footer: "Foots",
+      cnName: "瀛楀吀鏁版嵁",
+      name: "Sys_Dictionary",
+      url: "/Sys_Dictionary/",
+      sortName: "dicId",
+    });
+    const editFormFields = ref({
+      dicNo: "",
+      dicName: "",
+      parentId: "",
+      orderNo: "",
+      enable: "",
+      dbSql: "",
+      remark: "",
+      systemType: 1,
+    });
+    const editFormOptions = ref([
+      [
+        { title: "瀛楀吀缂栧彿", required: true, field: "dicNo" },
+        { title: "瀛楀吀鍚嶇О", required: true, field: "dicName" },
+        { title: "鐖剁骇ID", required: true, field: "parentId", type: "number" },
+      ],
+      [
+        { title: "鎺掑簭鍙�", field: "orderNo", type: "number" },
+        {
+          dataKey: "enable",
+          data: [],
+          title: "鏄惁鍚敤",
+          required: true,
+          field: "enable",
+          type: "select",
+        },
+      ],
+      [
+        { title: "sql璇彞", field: "dbSql", colSize: 8, type: "textarea" },
+        { title: "澶囨敞", field: "remark", type: "textarea" },
+      ],
+    ]);
+    const searchFormFields = ref({
+      dicNo: "",
+      dicName: "",
+      parentId: "",
+      enable: "",
+      createDate: "",
+      modifyDate: "",
+    });
+    const searchFormOptions = ref([
+      [
+        { title: "瀛楀吀缂栧彿", field: "dicNo" },
+        { title: "瀛楀吀鍚嶇О", field: "dicName", type: "textarea" },
+        { title: "鐖剁骇ID", field: "parentId", type: "number" },
+      ],
+      [
+        {
+          dataKey: "enable",
+          data: [],
+          title: "鏄惁鍚敤",
+          field: "enable",
+          type: "select",
+        },
+        { title: "鍒涘缓鏃堕棿", field: "createDate", type: "datetime" },
+        { title: "淇敼鏃堕棿", field: "modifyDate", type: "datetime" },
+      ],
+    ]);
+    const columns = ref([
+      {
+        field: "dicId",
+        title: "瀛楀吀ID",
+        type: "int",
+        width: 90,
+        hidden: true,
+        readonly: true,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "dicNo",
+        title: "瀛楀吀缂栧彿",
+        type: "string",
+        width: 90,
+        require: true,
+        align: "left",
+        sort: true,
+      },
+      {
+        field: "dicName",
+        title: "瀛楀吀鍚嶇О",
+        type: "string",
+        link: true,
+        width: 140,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "parentId",
+        title: "鐖剁骇ID",
+        type: "int",
+        width: 90,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "config",
+        title: "閰嶇疆椤�",
+        type: "string",
+        width: 300,
+        hidden: true,
+        align: "left",
+      },
+      {
+        field: "dbSql",
+        title: "sql璇彞",
+        type: "string",
+        width: 200,
+        align: "left",
+      },
+      {
+        field: "dBServer",
+        title: "DBServer",
+        type: "string",
+        width: 90,
+        hidden: true,
+        align: "left",
+      },
+      {
+        field: "orderNo",
+        title: "鎺掑簭鍙�",
+        type: "int",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "remark",
+        title: "澶囨敞",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "enable",
+        title: "鏄惁鍚敤",
+        type: "byte",
+        bind: { key: "enable", data: [] },
+        width: 90,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "creater",
+        title: "鍒涘缓浜�",
+        type: "string",
+        width: 130,
+        hidden: true,
+        readonly: true,
+        align: "left",
+      },
+      {
+        field: "createDate",
+        title: "鍒涘缓鏃堕棿",
+        type: "datetime",
+        width: 150,
+        readonly: true,
+        align: "left",
+        sort: true,
+      },
+      {
+        field: "modifier",
+        title: "淇敼浜�",
+        type: "string",
+        width: 130,
+        hidden: true,
+        readonly: true,
+        align: "left",
+      },
+      {
+        field: "modifyDate",
+        title: "淇敼鏃堕棿",
+        type: "datetime",
+        width: 150,
+        readonly: true,
+        align: "left",
+        sort: true,
+      },
+    ]);
+    const detail = ref({
+      cnName: "瀛楀吀鏄庣粏",
+      table: "Sys_DictionaryList",
+      columns: [
+        {
+          field: "dicList_ID",
+          title: "DicList_ID",
+          type: "int",
+          width: 90,
+          hidden: true,
+          readonly: true,
+          require: true,
+          align: "left",
+        },
+        {
+          field: "dicId",
+          title: "鏁版嵁婧怚D",
+          type: "int",
+          width: 90,
+          readonly: true,
+          align: "left",
+          sort: true,
+        },
+        {
+          field: "dicValue",
+          title: "鏁版嵁婧怴alue",
+          type: "string",
+          width: 90,
+          edit: { type: "text" },
+          align: "left",
+        },
+        {
+          field: "dicName",
+          title: "鏁版嵁婧怲ext",
+          type: "string",
+          width: 90,
+          edit: { type: "text" },
+          align: "left",
+        },
+        {
+          field: "orderNo",
+          title: "鎺掑簭鍙�",
+          type: "int",
+          width: 90,
+          edit: { type: "text" },
+          align: "left",
+        },
+        {
+          field: "remark",
+          title: "澶囨敞",
+          type: "string",
+          width: 90,
+          edit: { type: "text" },
+          align: "left",
+        },
+       
+        {
+          field: "createID",
+          title: "CreateID",
+          type: "int",
+          width: 90,
+          hidden: true,
+          align: "left",
+        },
+        {
+          field: "creater",
+          title: "鍒涘缓浜�",
+          type: "string",
+          width: 130,
+          readonly: true,
+          align: "left",
+        },
+        {
+          field: "createDate",
+          title: "鍒涘缓鏃堕棿",
+          type: "datetime",
+          width: 90,
+          readonly: true,
+          align: "left",
+          sort: true,
+        },
+        
+        {
+          field: "modifier",
+          title: "淇敼浜�",
+          type: "string",
+          width: 130,
+          align: "left",
+        },
+        {
+          field: "modifyDate",
+          title: "淇敼鏃堕棿",
+          type: "datetime",
+          width: 90,
+          align: "left",
+          sort: true,
+        },
+      ],
+      sortName: "dicId",
+      key: "dicId",
+    });
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+    };
+  },
+});
+</script>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_DictionaryList.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_DictionaryList.vue
new file mode 100644
index 0000000..02427fb
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_DictionaryList.vue
@@ -0,0 +1,65 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/system/Sys_DictionaryList.js姝ゅ缂栧啓
+ -->
+<template>
+    <div>
+        <view-grid :columns="columns"
+                   :detail="detail"
+                   :editFormFields="editFormFields"
+                   :editFormOptions="editFormOptions"
+                   :searchFormFields="searchFormFields"
+                   :searchFormOptions="searchFormOptions"
+                   :table="table"
+                   :extend="extend">
+        </view-grid>
+    </div>
+</template>
+
+<script>
+    import extend from "@/extension/system/Sys_DictionaryList.js";
+    var vueParam = {
+        data() {
+            return {
+                table: {
+                    key: 'DicList_ID',
+                    footer: "Foots",
+                    cnName: '瀛楀吀鏄庣粏',
+                    name: 'Sys_DictionaryList',
+                    url: "/Sys_DictionaryList/",
+                    sortName: "DicList_ID"
+                },
+                extend: extend,
+                editFormFields: {"DicValue":"","DicName":"","OrderNo":"","Remark":"","Enable":""},
+                editFormOptions: [[{"columnType":"string","title":"鏁版嵁婧怴alue","field":"DicValue","type":"text"},
+                               {"columnType":"string","title":"鏁版嵁婧怲ext","field":"DicName","type":"text"},
+                               {"columnType":"int","title":"鎺掑簭鍙�","field":"OrderNo","type":"text"},
+                               {"columnType":"int","title":"澶囨敞","field":"Remark","type":"text"},
+                               {"columnType":"byte","dataKey":"enable","title":"鏄惁鍙敤","field":"Enable","type":"switch"}]],
+                searchFormFields: {},
+                searchFormOptions: [],
+                columns: [{field:'DicList_ID',title:'DicList_ID',type:'int',width:90,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'Dic_ID',title:'鏁版嵁婧怚D',type:'int',width:90,readonly:true,align:'left',sortable:true},
+                       {field:'DicValue',title:'鏁版嵁婧怴alue',type:'string',width:90,align:'left'},
+                       {field:'DicName',title:'鏁版嵁婧怲ext',type:'string',width:90,align:'left'},
+                       {field:'OrderNo',title:'鎺掑簭鍙�',type:'int',width:90,align:'left'},
+                       {field:'Remark',title:'澶囨敞',type:'int',width:90,align:'left'},
+                       {field:'Enable',title:'鏄惁鍙敤',type:'byte',bind:{ key:'enable',data:[]},width:90,align:'left'},
+                       {field:'CreateID',title:'CreateID',type:'int',width:90,hidden:true,align:'left'},
+                       {field:'Creator',title:'鍒涘缓浜�',type:'string',width:130,readonly:true,align:'left'},
+                       {field:'CreateDate',title:'鍒涘缓鏃堕棿',type:'datetime',width:90,readonly:true,align:'left',sortable:true},
+                       {field:'ModifyID',title:'ModifyID',type:'int',width:90,hidden:true,align:'left'},
+                       {field:'Modifier',title:'淇敼浜�',type:'string',width:130,align:'left'},
+                       {field:'ModifyDate',title:'淇敼鏃堕棿',type:'datetime',width:90,align:'left',sortable:true}],
+                detail: {
+                    cnName:"#detailCnName",
+                    columns: [],
+                    sortName: "#detailSortName"
+                }
+            };
+        }
+    };
+    export default vueParam;
+</script>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Log.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Log.vue
new file mode 100644
index 0000000..9742628
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Log.vue
@@ -0,0 +1,70 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/system/Sys_Log.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/system/Sys_Log.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'Id',
+                footer: "Foots",
+                cnName: '绯荤粺鏃ュ織',
+                name: 'Sys_Log',
+                url: "/Sys_Log/",
+                sortName: "Id"
+            });
+            const editFormFields = ref({});
+            const editFormOptions = ref([]);
+            const searchFormFields = ref({"BeginDate":"","Url":"","LogType":[],"Success":[],"UserIP":"","ServiceIP":"","Role_Id":""});
+            const searchFormOptions = ref([[{"title":"璇锋眰鍦板潃","field":"Url","type":"text"},{"title":"鐢ㄦ埛IP","field":"UserIP","type":"text"},{"title":"鏈嶅姟鍣↖P","field":"ServiceIP","type":"text"}],[{"title":"寮�濮嬫椂闂�","field":"BeginDate","type":"datetime"},{"dataKey":"restatus","data":[],"title":"鍝嶅簲鐘舵��","field":"Success","type":"selectList"},{"dataKey":"roles","data":[],"title":"瑙掕壊ID","field":"Role_Id","type":"select"}],[{"dataKey":"log","data":[],"title":"鏃ュ織绫诲瀷","field":"LogType","colSize":12,"type":"checkbox"}]]);
+            const columns = ref([{field:'Id',title:'Id',type:'int',width:90,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'BeginDate',title:'寮�濮嬫椂闂�',type:'datetime',width:140,align:'left',sortable:true},
+                       {field:'UserName',title:'鐢ㄦ埛鍚嶇О',type:'string',width:90,align:'left'},
+                       {field:'Url',title:'璇锋眰鍦板潃',type:'string',width:110,align:'left'},
+                       {field:'LogType',title:'鏃ュ織绫诲瀷',type:'string',bind:{ key:'log',data:[]},width:80,align:'left'},
+                       {field:'Success',title:'鍝嶅簲鐘舵��',type:'int',bind:{ key:'restatus',data:[]},width:80,align:'left'},
+                       {field:'ElapsedTime',title:'鏃堕暱',type:'int',width:60,align:'left'},
+                       {field:'RequestParameter',title:'璇锋眰鍙傛暟',type:'string',width:70,align:'left'},
+                       {field:'ResponseParameter',title:'鍝嶅簲鍙傛暟',type:'string',width:70,align:'left'},
+                       {field:'ExceptionInfo',title:'寮傚父淇℃伅',type:'string',width:70,align:'left'},
+                       {field:'UserIP',title:'鐢ㄦ埛IP',type:'string',width:90,align:'left'},
+                       {field:'ServiceIP',title:'鏈嶅姟鍣↖P',type:'string',width:90,hidden:true,align:'left'},
+                       {field:'BrowserType',title:'娴忚鍣ㄧ被鍨�',type:'string',width:90,align:'left'},
+                       {field:'User_Id',title:'鐢ㄦ埛ID',type:'int',width:90,hidden:true,align:'left'},
+                       {field:'Role_Id',title:'瑙掕壊ID',type:'int',bind:{ key:'roles',data:[]},width:90,hidden:true,align:'left'},
+                       {field:'EndDate',title:'缁撴潫鏃堕棿',type:'datetime',width:150,hidden:true,align:'left',sortable:true}]);
+            const detail = ref({
+                cnName: "#detailCnName",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Menu.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Menu.vue
new file mode 100644
index 0000000..93feed5
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Menu.vue
@@ -0,0 +1,618 @@
+<template>
+  <div class="menu-container">
+    <!-- <el-input/> -->
+    <vol-box :width="940" :mask="true" :height="500" title="鍥炬爣鍒楄〃" v-model="model">
+      <Icons :onSelect="onSelect"></Icons>
+      <template #footer>
+        <el-button type="primary" size="mini" @click="model = false">纭� 璁�</el-button>
+      </template>
+    </vol-box>
+    <vol-box :width="600" :mask="true" :height="270" title="鍏朵粬鏉冮檺" v-model="actionModel">
+      <vol-form ref="actionForm" :formRules="actionOptions" :formFields="actionFields">
+        <template #header>
+          <div>
+            <el-alert show-icon type="success">
+              閰嶇疆鐨勫叾浠栨潈闄�
+              <br />1銆佹坊鍔犳柊鐨勬潈闄愬悗璇峰湪vue椤圭洰涓璫onfig鏂囦欢澶逛笅buttns.js娣诲姞姝ゆ潈闄愮殑鎸夐挳銆�
+              <br />2銆佸鏋滄潈闄愬彧鍦ㄦ煇灏戞暟鍑犱釜鍔熻兘涓娇鐢�,鍦╲ue鐨勫搴旈〉闈㈡墿灞昬xtension鏂囦欢鎵惧埌瀵瑰簲js,娣诲姞鍒癳l-buttons瀵硅薄涓�,鏍煎紡鍚宑onfig鏂囦欢澶逛笅buttns.js涓�鏍枫��
+            </el-alert>
+          </div>
+        </template>
+      </vol-form>
+      <template #footer>
+        <el-button type="primary" size="mini" @click="otherAction">纭� 璁�</el-button>
+      </template>
+    </vol-box>
+
+    <!-- v-if="tree.length" -->
+    <div class="menu-left">
+      <div class="m-title"><i class="el-icon-warning-outline"></i>鑿滃崟鍒楄〃</div>
+      <el-scrollbar style="height: 100%; width: 200px">
+        <VolMenu :onSelect="getTreeItem" :list="tree" :isCollapse="false"></VolMenu>
+      </el-scrollbar>
+    </div>
+    <div class="menu-right">
+      <el-scrollbar style="height: 100%">
+        <el-alert title="鑿滃崟閰嶇疆璇存槑" type="warning" :closable="false" show-icon>
+          <div>
+            1銆佸鏋滄槸鐢ㄤ唬鐮佺敓鍣ㄧ敓鎴愮殑Vue椤甸潰,Url涓篤ue椤圭洰涓璼rc->router->viewGrid.js瀵瑰簲琛ㄥ悕鐨刾ath灞炴��
+          </div>
+          <div style="padding-top: 5px">
+            2銆� 濡傛灉鍙槸寤轰竴绾ц彍鍗曟垨绌鸿彍鍗晆rl涓嶇敤濉啓,銆愯鍥�/琛ㄥ悕銆戝~鍐�.鎴栬��/
+          </div>
+        </el-alert>
+        <div style="padding: 0px 30px 0 20px">
+          <vol-form class="form-content" ref="form" :formRules="options" :formFields="fields">
+          </vol-form>
+          <div>
+            <div class="auth-group">
+              <label style="width: 100px">鏉冮檺鎸夐挳锛�</label>
+              <div class="ck">
+                <el-checkbox-group v-model="actions">
+                  <el-checkbox v-for="(item, index) in action" :key="index" :label="item.value">{{ item.text + "(" +
+                    item.value + ")" }}</el-checkbox>
+                </el-checkbox-group>
+              </div>
+            </div>
+          </div>
+          <div style="padding-left: 100px">
+            <el-button @click="handleCheckAll" size="mini" type="success" plain><i class="el-icon-check"></i>鍏�
+              閫�</el-button>
+            <el-button @click="actionModel = true" size="mini" type="primary" plain><i
+                class="el-icon-plus"></i>鍏朵粬鏉冮檺</el-button>
+          </div>
+          <div class="m-btn">
+            <el-button type="primary" @click="save"><i class="el-icon-check"></i>淇濆瓨</el-button>
+            <el-button type="success" @click="add"><i class="el-icon-plus"></i>鏂板缓</el-button>
+            <el-button type="warning" @click="addChild"><i class="el-icon-plus"></i>娣诲姞瀛愮骇</el-button>
+            <el-button type="primary" plain @click="addBrother"><i class="el-icon-circle-plus"></i> 娣诲姞鍚岀骇</el-button>
+            <el-button type="warning" plain @click="delMenu"><i class="el-icon-delete"></i> 鍒犻櫎鑿滃崟</el-button>
+          </div>
+        </div>
+      </el-scrollbar>
+    </div>
+  </div>
+</template>
+<script>
+import VolForm from "@/components/basic/VolForm.vue";
+import VolBox from "@/components/basic/VolBox.vue";
+import Icons from "@/components/basic/Icons.vue";
+import VolMenu from "@/components/basic/VolElementMenu.vue";
+import {
+  defineComponent,
+  reactive,
+  ref,
+  toRefs,
+  onMounted,
+  h,
+  resolveComponent,
+} from "vue";
+
+import http from "@/api/http";
+export default defineComponent({
+  components: {
+    VolForm: VolForm,
+    VolBox: VolBox,
+    Icons: Icons,
+    VolMenu,
+  },
+  methods: {
+    otherAction() {
+      this.$refs.actionForm.validate(() => {
+        let exist = this.action.some((x) => {
+          return (
+            x.text == this.actionFields.name ||
+            x.value == this.actionFields.value
+          );
+        });
+        if (exist) {
+          return this.$message.error("鏉冮檺鍚嶇О鎴栨潈闄愬�煎凡瀛樺湪");
+        }
+        this.actionModel = false;
+        this.action.push({
+          text: this.actionFields.name,
+          value: this.actionFields.value,
+        });
+      });
+    },
+    handleCheckAll() {
+      if (this.actions == this.action.length) {
+        this.checkAll = false;
+      } else {
+        this.checkAll = !this.checkAll;
+      }
+      if (this.checkAll) {
+        this.actions = this.action.map((x) => {
+          return x.value;
+        });
+      } else {
+        this.actions = [];
+      }
+    },
+    checkAllGroupChange(data) {
+      if (data.length === this.action.length) {
+        this.checkAll = true;
+      } else if (data.length > 0) {
+        this.checkAll = false;
+      } else {
+        this.checkAll = false;
+      }
+    },
+    add(obj) {
+      this.$refs.form.reset(
+        Object.assign({ enable: 1 }, obj || { parentId: 0 })
+      );
+      this.icon = "";
+      // this.actions = [];
+      //2020.08.07鏂板缓鑿滃崟鏃讹紝榛樿閫変腑鏌ヨ鎸夐挳鏉冮檺
+      this.actions = ["Search"];
+    },
+    addChild() {
+      if (!this.isSelect()) return;
+      this.add({ parentId: this.fields.menuId });
+    },
+    addBrother() {
+      if (!this.isSelect()) return;
+      this.add({ parentId: this.fields.parentId });
+    },
+    delMenu() {
+      //2020.08.07澧炲姞鑿滃崟鍒犻櫎鍔熻兘
+      if (this.fields.menuId == 0) {
+        return this.$Message.error("璇烽�夋嫨鑿滃崟");
+      }
+
+      let tigger = false;
+      this.$confirm(
+        "纭瑕佸垹闄ゃ��" + this.fields.menuName + "銆戣彍鍗曞悧锛�",
+        "璀﹀憡",
+        {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning",
+          center: true,
+        }
+      ).then(() => {
+        if (tigger) return;
+        tigger = true;
+        let menuId = this.fields.menuId;
+        this.http
+          .post("/api/Sys_Menu/delMenu?menuId=" + menuId, {}, "姝e湪鍒犻櫎鏁版嵁....")
+          .then((x) => {
+            if (!x.status) return this.$Message.error(x.message);
+            this.$refs.form.reset();
+            this.$Message.info(x.message);
+            this.initTree();
+          });
+      });
+    },
+    save() {
+      this.$refs.form.validate(() => {
+        this.fields.auth = "";
+        if (this.actions) {
+          this.fields.auth = this.action.filter((x) => {
+            return this.actions.indexOf(x.value) != -1;
+          });
+        }
+        if (
+          this.fields.auth &&
+          this.fields.auth instanceof Array &&
+          this.fields.auth.length > 0
+        ) {
+          this.fields.auth = JSON.stringify(this.fields.auth);
+        } else {
+          this.fields.auth = "";
+        }
+        this.http.post("/api/Sys_Menu/save", this.fields, true).then((x) => {
+          if (!x.status) {
+            this.$Message.error(x.message);
+            return;
+          }
+
+          this.$Message.info(x.message);
+          if (this.fields.menuId) {
+            this.tree.forEach((t) => {
+              if (t.id == this.fields.menuId) {
+                t.name = this.fields.menuName;
+                t.orderNo = this.fields.orderNo;
+                t.parentId = this.fields.parentId;
+              }
+            });
+            return;
+          }
+          this.fields.menuId = x.data.menuId;
+          this.fields.createDate = x.data.createDate;
+          this.tree.push({
+            id: x.data.menuId,
+            name: this.fields.menuName,
+            orderNo: this.fields.orderNo,
+            parentId: this.fields.parentId,
+          });
+          console.log(this.tree)
+        });
+      });
+    },
+    isSelect() {
+      let id = this.fields.menuId;
+      if (!id) {
+        this.$message.error("璇烽�夋嫨鑺傜偣");
+        return false;
+      }
+      return true;
+    },
+    onSelect(icon) {
+      this.fields.icon = icon;
+      this.$message.info(icon);
+    },
+    onOpenChange(node) {
+      if (node.length == 0) return;
+      this.getTreeItem(node[node.length > 1 ? node.length - 1 : 0]);
+    }
+  },
+  created(){
+
+  },
+  setup() {
+    const tree = ref([]);
+    const actionValues = ref([]);
+    const action = ref([
+      { text: "鏌ヨ", value: "Search" },
+      { text: "鏂板缓", value: "Add" },
+      { text: "鍒犻櫎", value: "Delete" },
+      { text: "缂栬緫", value: "Update" },
+      { text: "瀵煎叆", value: "Import" },
+      { text: "瀵煎嚭", value: "Export" },
+      // { text: "涓婁紶", value: "Upload" },
+      // { text: "瀹℃牳", value: "Audit" },
+    ]);
+    const actions = ref([]);
+    actionValues.value = action.value.map((x) => {
+      return x.value;
+    });
+    const initTree = () => {
+      http.post("/api/Sys_Menu/getMenu", {}, true).then((x) => {
+        x.forEach(item => {
+          item.icon = 'el-icon-menu';
+        })
+        
+        tree.value = x;
+      });
+    };
+    onMounted(() => {
+      initTree();
+    });
+    const actionModel = ref(false);
+    const checkAll = ref(false);
+    const model = ref(false);
+
+    const fields = ref({
+      menuId: 0,
+      parentId: 0,
+      menuName: "",
+      tableName: "",
+      url: "",
+      auth: "",
+      icon: "",
+      orderNo: "",
+      enable: 1,
+      createDate: "",
+      creator: "",
+      modifyDate: "",
+    });
+
+    const actionFields = ref({
+      name: "",
+      value: "",
+    });
+    const actionOptions = ref([
+      [
+        {
+          title: "鏉冮檺鍚嶇О",
+          field: "name",
+          placeholder: "鏉冮檺鍚嶇О,濡傦細鏂板",
+          required: true,
+        },
+      ],
+      [
+        {
+          title: "鏉� 闄� 鍊�",
+          field: "value",
+          placeholder: "鏉冮檺鍊�,濡傦細Add",
+          required: true,
+        },
+      ],
+    ]);
+
+    const options = ref([
+      [
+        {
+          title: "鑿� 鍗� ID",
+          field: "menuId",
+          placeholder: "鑿滃崟ID",
+          min: 0,
+          disabled: true,
+        },
+        {
+          title: "鐖� 绾� ID",
+          required: true,
+          type: "number",
+          min: 0,
+          field: "parentId",
+          // min: 0, max: 50
+        },
+        {
+          title: "鑿滃崟鍚嶇О",
+          field: "menuName",
+          required: true,
+        },
+      ],
+      [
+        {
+          title: "瑙嗗浘/琛ㄥ悕",
+          field: "tableName",
+          placeholder: "涓庝唬鐮佺敓鎴愬櫒浣跨敤鐨勫悕绉扮浉鍚�",
+          required: true,
+        },
+        {
+          title: "(璺敱)Url",
+          field: "url",
+          placeholder: "瑙�:涓婇潰鑿滃崟閰嶇疆璇存槑",
+        },
+        {
+          title: "鎺掑簭鍙�",
+          field: "orderNo",
+          type: "number",
+          min: 0,
+          placeholder: "鍊艰秺澶ф樉绀鸿秺闈犲墠",
+          required: true,
+        },
+      ],
+      [
+        {
+          title: "鏄惁鍚敤",
+          field: "enable",
+          required: true,
+          type: "select",
+          colSize: 4,
+          data: [
+            { key: 1, value: "鍚敤" },
+            { key: 2, value: "鍚敤涓嶆樉绀�" },
+            { key: 0, value: "绂佺敤" },
+          ],
+        },
+        // {
+        //   // 2022.03.26澧炵Щ鍔ㄧ鍔犺彍鍗曠被鍨�
+        //   title: "鑿滃崟绫诲瀷",
+        //   field: "menuType",
+        //   required: true,
+        //   type: "select",
+        //   colSize: 4,
+        //   data: [
+        //     { key: 1, value: "WCS鑿滃崟" },
+        //     { key: 0, value: "WMS鑿滃崟" },
+        //     { key: 99, value: "鍏辩敤" }
+        //   ],
+        // },
+        {
+          title: "鍥炬爣Icon",
+          field: "icon",
+          render: (h) => {
+            return h("div", {}, [
+              h("i", {
+                style: {
+                  "font-size": "25px",
+                  margin: "0px 9px",
+                  position: "relative",
+                  top: "4px",
+                },
+                class: [fields.value.icon],
+              }),
+              h(
+                resolveComponent("el-button"),
+                {
+                  size: "small",
+                  style: { padding: "0px 9px" },
+                  type: "primary",
+                  plain: true,
+                  onClick: () => {
+                    model.value = true;
+                  },
+                },
+                "閫夋嫨鍥炬爣"
+              ),
+            ]);
+          },
+        },
+      ],
+    ]);
+    const refForm = ref();
+    const getTreeItem = (node) => {
+      http.post("api/Sys_Menu/getTreeItem?menuId=" + node, {}, true).then((x) => {
+        try {
+          fields.value.icon = x.icon;
+          if (x.auth) {
+            x.auth = JSON.parse(x.auth);
+            action.value.splice(8, action.value.length);
+
+            actions.value = x.auth.map((element) => {
+              if (actionValues.value.indexOf(element.value) == -1) {
+                action.value.push(element);
+              }
+              return element.value;
+            });
+          } else {
+            action.value.splice(8, action.value.length);
+            x.auth = [];
+            fields.value.icon = "";
+            actions.value = [];
+          }
+        } catch (error) {
+          console.log("鑿滃崟鍔熻兘鏉冮檺杞崲鎴怞SON澶辫触:" + x.auth);
+          x.auth = [];
+          //   this.icon = "";
+          actions.value = [];
+        }
+        refForm.value.reset(x);
+      });
+    };
+    return {
+      tree,
+      initTree,
+      action,
+      actions,
+      actionValues,
+      actionModel,
+      checkAll,
+      model,
+      fields,
+      actionFields,
+      actionOptions,
+      options,
+      form: refForm,
+      getTreeItem
+    };
+  },
+  data() {
+    return {};
+  },
+});
+</script>
+
+<style lang="less" scoped>
+.on-icon {
+  line-height: 20px;
+  position: relative;
+
+  .remove {
+    display: none;
+    color: red;
+    right: 7px;
+    position: absolute;
+    top: -14px;
+    font-size: 13px;
+  }
+}
+
+.on-icon:hover {
+  cursor: pointer;
+
+  .remove {
+    display: block;
+  }
+}
+
+.action {
+  width: 100%;
+  display: flex;
+
+  margin-bottom: 15px;
+
+  .ivu-checkbox-wrapper {
+    margin-right: 20px;
+  }
+
+  .ck {
+    line-height: 33px;
+    display: inline-block;
+    display: flex;
+
+    label:first-child {
+      min-width: 58px;
+      float: left;
+      margin-top: 1px;
+    }
+
+    >div {
+      float: left;
+    }
+  }
+}
+
+.menu-container {
+  display: flex;
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  padding: 8px;
+  background: #f7f7f7;
+
+  .menu-left {
+    height: 100%;
+    width: 201px;
+    border: 1px solid #eee;
+    display: flex;
+    background: white;
+    flex-direction: column;
+
+    .module-name {
+      border-radius: 0px;
+      /* height: 5%; */
+      line-height: 21px;
+      margin-bottom: 0;
+    }
+  }
+
+  .menu-right {
+    flex: 1;
+    border-radius: 3px;
+    border: 1px solid #eee;
+    background: white;
+    margin-left: 9px;
+    margin-right: 3px;
+  }
+}
+
+.m-btn {
+  margin-top: 20px;
+  text-align: center;
+}
+
+.m-title {
+  line-height: 40px;
+  font-size: 15px;
+  background: #66b1ff0f;
+  font-weight: bold;
+  padding: 6px 16px;
+  border-bottom: 1px solid #eee;
+
+  i {
+    padding-right: 5px;
+  }
+}
+
+.form-content {
+  margin-top: 30px;
+}
+
+.menu-left ::v-deep(.el-scrollbar__bar.is-vertical) {
+  width: 2px;
+}
+
+.auth-group {
+  display: flex;
+
+  label {
+    display: inline-block;
+    width: 100px;
+    text-align: right;
+    color: #797979;
+    font-size: 14px;
+  }
+
+  .ck {
+    flex: 1;
+  }
+
+  .el-checkbox {
+    min-width: 105px;
+    width: auto !important;
+    margin-right: 5px;
+    display: inline-block;
+    padding-bottom: 10px;
+  }
+}
+
+.auth-group ::v-deep(.el-checkbox__label) {
+  padding-left: 4px;
+}
+</style>
+
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role.vue
new file mode 100644
index 0000000..538b0a7
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role.vue
@@ -0,0 +1,217 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/system/Sys_Role.js姝ゅ缂栧啓
+ -->
+<template>
+  <view-grid
+    ref="grid"
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+</template>
+<script>
+import extend from "@/extension/system/Sys_Role.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+  setup() {
+    const table = ref({
+      key: "roleId",
+      footer: "Foots",
+      cnName: "瑙掕壊绠$悊",
+      name: "Sys_Role",
+      url: "/Sys_Role/",
+      sortName: "roleId",
+    });
+    const editFormFields = ref({
+      parentId: [],
+      roleName: "",
+      deptId: "",
+      enable: "",
+      // creater: "",
+      // createDate: "",
+      // modifier: "",
+      // modifyDate: "",
+    });
+    const editFormOptions = ref([
+      [
+        {
+          dataKey: "tree_roles",
+          data: [],
+          title: "鐖剁骇ID",
+          required: true,
+          field: "parentId",
+          type: "cascader",
+        },
+        { title: "瑙掕壊鍚嶇О", required: true, field: "roleName" },
+      ],
+      [
+        { title: "閮ㄩ棬ID", field: "deptId" },
+        {
+          dataKey: "enable",
+          data: [],
+          title: "鏄惁鍚敤",
+          field: "enable",
+          type: "switch",
+        },
+      ],
+      // [
+      //   { title: "鍒涘缓浜�", field: "creater", disabled: true },
+      //   {
+      //     title: "鍒涘缓鏃堕棿",
+      //     field: "createDate",
+      //     disabled: true,
+      //     type: "datetime",
+      //   },
+      // ],
+      // [
+      //   { title: "淇敼浜�", field: "modifier", disabled: true },
+      //   { title: "淇敼鏃堕棿", field: "modifyDate", disabled: true },
+      // ],
+    ]);
+    const searchFormFields = ref({
+      roleName: "",
+      deptId: "",
+      enable: "",
+      createDate: "",
+      modifyDate: "",
+    });
+    const searchFormOptions = ref([
+      [
+        { title: "瑙掕壊鍚嶇О", field: "roleName", type: "text" },
+        { title: "閮ㄩ棬ID", field: "deptId", type: "text" },
+        {
+          dataKey: "enable",
+          data: [],
+          title: "鏄惁鍚敤",
+          field: "enable",
+          type: "select",
+        },
+      ],
+      [
+        { title: "鍒涘缓鏃堕棿", field: "createDate", type: "datetime" },
+        { title: "淇敼鏃堕棿", field: "modifyDate", type: "datetime" },
+      ],
+    ]);
+    const columns = ref([
+      {
+        field: "roleId",
+        title: "瑙掕壊ID",
+        type: "int",
+        width: 70,
+        readonly: true,
+        require: true,
+        align: "left",
+        sortable: true,
+      },
+      {
+        field: "parentId",
+        title: "鐖剁骇ID",
+        type: "int",
+        bind: { key: "tree_roles", data: [] },
+        width: 70,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "roleName",
+        title: "瑙掕壊鍚嶇О",
+        type: "string",
+        link: true,
+        width: 90,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "deptId",
+        title: "閮ㄩ棬ID",
+        type: "int",
+        width: 90,
+        // hidden: true,
+        align: "left",
+      },
+    //   {
+    //     field: "deptName",
+    //     title: "閮ㄩ棬鍚嶇О",
+    //     type: "string",
+    //     width: 90,
+    //     align: "left",
+    //   },
+      {
+        field: "enable",
+        title: "鏄惁鍚敤",
+        type: "byte",
+        bind: { key: "enable", data: [] },
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "orderNo",
+        title: "鎺掑簭",
+        type: "int",
+        width: 90,
+        hidden: true,
+        align: "left",
+      },
+      {
+        field: "creater",
+        title: "鍒涘缓浜�",
+        type: "string",
+        width: 130,
+        readonly: true,
+        align: "left",
+      },
+      {
+        field: "createDate",
+        title: "鍒涘缓鏃堕棿",
+        type: "datetime",
+        width: 90,
+        readonly: true,
+        align: "left",
+        sortable: true,
+      },
+      {
+        field: "modifier",
+        title: "淇敼浜�",
+        type: "string",
+        width: 130,
+        readonly: true,
+        align: "left",
+      },
+      {
+        field: "modifyDate",
+        title: "淇敼鏃堕棿",
+        type: "datetime",
+        width: 90,
+        readonly: true,
+        align: "left",
+        sortable: true,
+      },
+    ]);
+    const detail = ref({
+      cnName: "#detailCnName",
+      columns: [],
+      sortName: "",
+      key: "",
+    });
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+    };
+  },
+});
+</script>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role1.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role1.vue
new file mode 100644
index 0000000..19ed48a
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_Role1.vue
@@ -0,0 +1,72 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/system/Sys_Role.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/system/Sys_Role1.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'Role_Id',
+                footer: "Foots",
+                cnName: '瑙掕壊绠$悊',
+                name: 'Sys_Role',
+                url: "/Sys_Role/",
+                sortName: "Role_Id"
+            });
+            const editFormFields = ref({"ParentId":[],"RoleName":"","DeptName":"","Enable":"","Creator":"","CreateDate":"","Modifier":"","ModifyDate":""});
+            const editFormOptions = ref([[{"dataKey":"tree_roles","data":[],"title":"鐖剁骇ID","required":true,"field":"ParentId","type":"cascader"},
+                               {"title":"瑙掕壊鍚嶇О","required":true,"field":"RoleName"}],
+                              [{"title":"閮ㄩ棬鍚嶇О","field":"DeptName"},
+                               {"dataKey":"enable","data":[],"title":"鏄惁鍚敤","field":"Enable","type":"switch"}],
+                              [{"title":"鍒涘缓浜�","field":"Creator","disabled":true},
+                               {"title":"鍒涘缓鏃堕棿","field":"CreateDate","disabled":true,"type":"datetime"}],
+                              [{"title":"淇敼浜�","field":"Modifier","disabled":true},
+                               {"title":"淇敼鏃堕棿","field":"ModifyDate","disabled":true}]]);
+            const searchFormFields = ref({"RoleName":"","DeptName":"","Enable":"","CreateDate":"","ModifyDate":""});
+            const searchFormOptions = ref([[{"title":"瑙掕壊鍚嶇О","field":"RoleName","type":"text"},{"title":"閮ㄩ棬鍚嶇О","field":"DeptName","type":"text"},{"dataKey":"enable","data":[],"title":"鏄惁鍚敤","field":"Enable","type":"select"}],[{"title":"鍒涘缓鏃堕棿","field":"CreateDate","type":"datetime"},{"title":"淇敼鏃堕棿","field":"ModifyDate","type":"datetime"}]]);
+            const columns = ref([{field:'Role_Id',title:'瑙掕壊ID',type:'int',width:70,readonly:true,require:true,align:'left',sortable:true},
+                      // {field:'ParentId',title:'鐖剁骇ID',type:'int',bind:{ key:'tree_roles',data:[]},width:70,require:true,align:'left'},
+                       {field:'RoleName',title:'瑙掕壊鍚嶇О',type:'string',link:true,width:90,require:true,align:'left'},
+                       {field:'Dept_Id',title:'閮ㄩ棬ID',type:'int',width:90,hidden:true,align:'left'},
+                       {field:'DeptName',title:'閮ㄩ棬鍚嶇О',type:'string',width:90,align:'left'},
+                       {field:'Enable',title:'鏄惁鍚敤',type:'byte',bind:{ key:'enable',data:[]},width:90,align:'left'},
+                       {field:'OrderNo',title:'鎺掑簭',type:'int',width:90,hidden:true,align:'left'},
+                       {field:'Creator',title:'鍒涘缓浜�',type:'string',width:130,readonly:true,align:'left'},
+                       {field:'CreateDate',title:'鍒涘缓鏃堕棿',type:'datetime',width:90,readonly:true,align:'left',sortable:true},
+                       {field:'Modifier',title:'淇敼浜�',type:'string',width:130,readonly:true,align:'left'},
+                       {field:'ModifyDate',title:'淇敼鏃堕棿',type:'datetime',width:90,readonly:true,align:'left',sortable:true}]);
+            const detail = ref({
+                cnName: "#detailCnName",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_User.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_User.vue
new file mode 100644
index 0000000..21530cd
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/Sys_User.vue
@@ -0,0 +1,369 @@
+
+<template>
+  <view-grid
+    ref="grid"
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+</template>
+<script>
+import extend from "@/extension/system/Sys_User.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+  setup() {
+    const table = ref({
+      key: "user_Id",
+      footer: "Foots",
+      cnName: "鐢ㄦ埛绠$悊",
+      name: "Sys_User",
+      url: "/User/",
+      sortName: "user_Id",
+    });
+    const editFormFields = ref({
+      systemType: "0",
+      userName: "",
+      userTrueName: "",
+      role_Id: [],
+      deptIds: "",
+      enable: "",
+      gender: "",
+      remark: "",
+      headImageUrl: "",
+    });
+    const editFormOptions = ref([
+      [{ title: "甯愬彿", required: true, field: "userName"}],
+      [{ title: "濮撳悕", required: true, field: "userTrueName", type: "text" }],
+      [
+        {
+          dataKey: "tree_roles",
+          data: [],
+          title: "瑙掕壊",
+          required: true,
+          field: "role_Id",
+          type: "cascader",
+        },
+      ],
+      [
+        {
+          dataKey: "缁勭粐鏈烘瀯",
+          data: [],
+          title: "缁勭粐鏋勬灦",
+          field: "deptIds",
+          colSize: 12,
+          type: "treeSelect",
+        },
+      ],
+      [
+        {
+          dataKey: "enable",
+          data: [],
+          title: "鏄惁鍙敤",
+          required: true,
+          field: "enable",
+          type: "select",
+        },
+      ],
+      [
+        {
+          dataKey: "gender",
+          data: [],
+          title: "鎬у埆",
+          field: "gender",
+          type: "select",
+        },
+      ],
+      [{ title: "澶囨敞", field: "remark", colSize: 12, type: "textarea" }],
+      [{ title: "澶村儚", field: "headImageUrl", type: "img" }],
+    ]);
+    const searchFormFields = ref({
+      systemType: "0",
+      userName: "",
+      userTrueName: "",
+      gender: "",
+      deptName: "",
+      role_Id: [],
+      token: "",
+      appType: [],
+      createDate: "",
+      isRegregisterPhone: "",
+      phoneNo: "",
+      enable: "",
+      lastLoginDate: "",
+      address: "",
+      email: "",
+    });
+    const searchFormOptions = ref([
+      [
+        { title: "甯愬彿", field: "userName" },
+        { title: "濮撳悕", field: "userTrueName" },
+        {
+          dataKey: "gender",
+          data: [],
+          title: "鎬у埆",
+          field: "gender",
+          type: "select",
+        },
+      ],
+      [
+        {
+          dataKey: "enable",
+          data: [],
+          title: "鏄惁鍙敤",
+          field: "enable",
+          type: "select",
+        },
+        { title: "娉ㄥ唽鏃堕棿", field: "createDate", type: "datetime" },
+      ],
+    ]);
+    const columns = ref([
+      {
+        field: "user_Id",
+        title: "User_Id",
+        type: "int",
+        width: 90,
+        hidden: true,
+        readonly: true,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "userName",
+        title: "甯愬彿",
+        type: "string",
+        link: true,
+        width: 120,
+        readonly: true,
+        require: true,
+        align: "left",
+        sort: true,
+      },
+      {
+        field: "userTrueName",
+        title: "濮撳悕",
+        type: "string",
+        width: 120,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "gender",
+        title: "鎬у埆",
+        type: "int",
+        bind: { key: "gender", data: [] },
+        width: 80,
+        align: "left",
+      },
+      {
+        field: "headImageUrl",
+        title: "澶村儚",
+        type: "img",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "dept_Id",
+        title: "涓嶇敤",
+        type: "int",
+        width: 90,
+        hidden: true,
+        align: "left",
+      },
+      {
+        field: "deptName",
+        title: "涓嶇敤",
+        type: "string",
+        width: 150,
+        hidden: true,
+        align: "left",
+      },
+      {
+        field: "role_Id",
+        title: "瑙掕壊",
+        type: "int",
+        bind: { key: "tree_roles", data: [] },
+        width: 130,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "roleName",
+        title: "涓嶇敤",
+        type: "string",
+        width: 90,
+        hidden: true,
+        align: "left",
+      },
+      {
+        field: "token",
+        title: "Token",
+        type: "string",
+        width: 180,
+        hidden: true,
+        align: "left",
+      },
+      {
+        field: "appType",
+        title: "绫诲瀷",
+        type: "int",
+        bind: { key: "ut", data: [] },
+        width: 150,
+        hidden: true,
+        align: "left",
+      },
+      {
+        field: "deptIds",
+        title: "缁勭粐鏋勬灦",
+        type: "string",
+        bind: { key: "缁勭粐鏈烘瀯", data: [] },
+        width: 140,
+        hidden: true,
+        align: "left",
+      },
+      {
+        field: "createDate",
+        title: "娉ㄥ唽鏃堕棿",
+        type: "datetime",
+        width: 150,
+        readonly: true,
+        align: "left",
+        sort: true,
+      },
+      {
+        field: "phoneNo",
+        title: "鎵嬫満鍙�",
+        type: "string",
+        width: 150,
+        hidden: true,
+        align: "left",
+      },
+      {
+        field: "tel",
+        title: "Tel",
+        type: "string",
+        width: 90,
+        hidden: true,
+        align: "left",
+      },
+      {
+        field: "creater",
+        title: "鍒涘缓浜�",
+        type: "string",
+        width: 130,
+        readonly: true,
+        align: "left",
+      },
+      {
+        field: "enable",
+        title: "鏄惁鍙敤",
+        type: "byte",
+        bind: { key: "enable", data: [] },
+        width: 90,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "modifier",
+        title: "淇敼浜�",
+        type: "string",
+        width: 130,
+        hidden: true,
+        readonly: true,
+        align: "left",
+      },
+      {
+        field: "modifyDate",
+        title: "淇敼鏃堕棿",
+        type: "datetime",
+        width: 90,
+        hidden: true,
+        readonly: true,
+        align: "left",
+        sort: true,
+      },
+      {
+        field: "auditStatus",
+        title: "瀹℃牳鐘舵��",
+        type: "int",
+        bind: { key: "audit", data: [] },
+        width: 90,
+        hidden: true,
+        align: "left",
+      },
+      {
+        field: "auditor",
+        title: "瀹℃牳浜�",
+        type: "string",
+        width: 90,
+        hidden: true,
+        align: "left",
+      },
+      {
+        field: "auditDate",
+        title: "瀹℃牳鏃堕棿",
+        type: "datetime",
+        width: 150,
+        hidden: true,
+        align: "left",
+        sort: true,
+      },
+      {
+        field: "lastModifyPwdDate",
+        title: "鏈�鍚庡瘑鐮佷慨鏀规椂闂�",
+        type: "datetime",
+        width: 150,
+        hidden: true,
+        align: "left",
+        sort: true,
+      },
+      {
+        field: "address",
+        title: "鍦板潃",
+        type: "string",
+        width: 190,
+        hidden: true,
+        align: "left",
+      },
+      {
+        field: "email",
+        title: "Email",
+        type: "string",
+        width: 140,
+        hidden: true,
+        align: "left",
+      },
+      {
+        field: "remark",
+        title: "澶囨敞",
+        type: "string",
+        width: 180,
+        hidden: true,
+        align: "left",
+      },
+    ]);
+    const detail = ref({
+      cnName: "#detailCnName",
+      table: "#detailTable",
+      columns: [],
+      sortName: "",
+      key: "",
+    });
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+    };
+  },
+});
+</script>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/UserInfo.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/UserInfo.vue
new file mode 100644
index 0000000..32eb1d3
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/UserInfo.vue
@@ -0,0 +1,317 @@
+<template>
+  <VolBox :width="500" :height="270" v-model="modifyOptions.model" title="淇敼瀵嗙爜">
+    <div style="padding:10px;20px;">
+      <VolForm ref="pwd" :formRules="modifyOptions.data" :formFields="modifyOptions.fields"></VolForm>
+    </div>
+    <template #footer>
+      <div style="text-align: center;">
+        <el-button type="primary" size="mini" icon="md-checkmark-circle" long @click="savePwd">淇濆瓨</el-button>
+      </div>
+    </template>
+  </VolBox>
+  <div class="user-info">
+    <div class="left">
+      <div>
+        <img class="header-img" :src="userInfo.img" :onerror="errorImg" />
+        <div class="text">
+          <p class="name">
+            <span style="font-size: 13px">{{ userInfo.userName }}</span>
+          </p>
+          <p class="date">
+            <span>娉ㄥ唽鏃ユ湡锛歿{ userInfo.createDate }}</span>
+          </p>
+          <p>
+            <el-button type="error" @click="modifyPwd" size="small" icon="md-lock" long>淇敼瀵嗙爜</el-button>
+            <!-- <el-button
+              style="padding: 3px 16px"
+              @click="modifyImg"
+              type="primary"
+              size="mini"
+              ghost
+              >淇敼澶村儚</el-button
+            > -->
+          </p>
+        </div>
+      </div>
+    </div>
+    <div class="right">
+      <vol-form ref="form" :load-key="true" :width="500" :formRules="editFormOptions" :formFields="editFormFields">
+        <div class="footer">
+          <!-- <el-button
+            style="margin-top: 2px"
+            type="primary"
+            size="small"
+            icon="md-checkmark-circle"
+            long
+            @click="modifyInfo"
+            >淇濆瓨</el-button
+          > -->
+        </div>
+      </vol-form>
+    </div>
+
+  </div>
+</template>
+<script>
+import VolForm from "@/components/basic/VolForm.vue";
+import VolBox from "@/components/basic/VolBox.vue";
+export default {
+  components: {
+    VolForm,
+    VolBox,
+  },
+  methods: {
+    modifyImg() {
+      this.$message.info("淇敼澶村儚");
+    },
+    modifyEmail() {
+      this.$message.info("淇敼閭");
+    },
+    modifyPhone() {
+      this.$message.info("淇敼鐢佃瘽");
+    },
+    modifyPwd() {
+      this.modifyOptions.model = true;
+    },
+    savePwd() {
+      if (!this.$refs.pwd.validate()) return;
+      if (
+        this.modifyOptions.fields.newPwd != this.modifyOptions.fields.newPwd1
+      ) {
+        return this.$message.error("涓ゆ瀵嗙爜涓嶄竴鑷�");
+      }
+      let url =
+        "/api/User/modifyPwd?oldPwd=" +
+        this.modifyOptions.fields.oldPwd +
+        "&newPwd=" +
+        this.modifyOptions.fields.newPwd;
+      this.http.post(url, {}, true).then((x) => {
+        if (!x.status) {
+          return this.$message.error(x.message);
+        }
+        this.modifyOptions.model = false;
+        this.$Message.success(x.message);
+        this.$refs.pwd.reset();
+      });
+    },
+    modifyInfo() {
+      this.$message.info("淇敼涓汉淇℃伅");
+    },
+  },
+  created() {
+    this.http.post("/api/Sys_User/getCurrentUserInfo", {}, true).then((x) => {
+      if (!x.status) {
+        return this.$message(x.message);
+      }
+      x.data.createDate = (x.data.createDate || "").replace("T", " ");
+      x.data.gender = x.data.gender + "";
+      this.$refs.form.reset(x.data);
+      this.userInfo.img = this.base.getImgSrc(
+        x.data.headImageUrl,
+        this.http.ipAddress
+      );
+      this.userInfo.createDate = x.data.createDate;
+      this.userInfo.userName = x.data.userTrueName;
+      this.userInfo.phoneNo = x.data.phoneNo;
+      this.userInfo.email = x.data.email;
+      //   this.editFormFields = x.data;
+    });
+  },
+  data() {
+    return {
+      errorImg: 'this.src="' + require("@/assets/imgs/error-img.png") + '"',
+      modifyOptions: {
+        model: false,
+        fields: { oldPwd: "", newPwd: "", newPwd1: "" },
+        data: [
+          [
+            {
+              columnType: "string",
+              required: true,
+              title: "鏃у瘑鐮�",
+              field: "oldPwd",
+            },
+          ],
+          [
+            {
+              type: "password",
+              required: true,
+              title: "鏂板瘑鐮�",
+              field: "newPwd",
+            },
+          ],
+          [
+            {
+              type: "password",
+              required: true,
+              title: "纭瀵嗙爜",
+              field: "newPwd1",
+            },
+          ],
+        ],
+      },
+      binging: [{}],
+      userInfo: {
+        img: "",
+        createDate: "--",
+        userName: "--",
+        email: "",
+        phoneNo: "",
+      },
+      editFormFields: {
+        roleName: "",
+        userName: "",
+        userTrueName: "",
+        address: "",
+        gender: "",
+        remark: "",
+      },
+      editFormOptions: [
+        [
+          {
+            columnType: "string",
+            title: "鐢ㄦ埛鍚�",
+            field: "userName",
+            disabled: true,
+          },
+        ],
+        [
+          {
+            columnType: "string",
+            title: "瑙掕壊",
+            field: "roleName",
+            disabled: true,
+            type: "text",
+          },
+        ],
+        [
+          {
+            columnType: "string",
+            title: "鐪熷疄濮撳悕",
+            field: "userTrueName",
+            required: true,
+            disabled: true,
+            type: "text",
+          },
+        ],
+        [
+          {
+            columnType: "string",
+            title: "鍦板潃",
+            field: "address",
+            disabled: true,
+            type: "text",
+          },
+        ],
+        [
+          {
+            dataKey: "gender",
+            title: "鎬у埆",
+            field: "gender",
+            disabled: true,
+            data: [],
+            type: "select",
+          },
+        ],
+        [
+          {
+            columnType: "string",
+            title: "澶囨敞",
+            field: "remark",
+            disabled: true,
+            colSize: 12,
+            type: "textarea",
+          },
+        ],
+      ],
+    };
+  },
+};
+</script>
+<style scoped>
+.binding-group {
+  width: 100%;
+  padding-bottom: 20px;
+}
+
+.binding-group>>>.ivu-cell-link {
+  text-align: left;
+}
+
+.binding-group>>>.ivu-card-body {
+  padding: 0 16px;
+}
+
+.binding-group>>>.ivu-cell-title {
+  line-height: 24px;
+  font-size: 12px;
+}
+</style>
+
+<style lang="less" scoped>
+img[src=""],
+img:not([src]) {
+  opacity: 0;
+}
+
+.user-info {
+  box-shadow: #d6d6d6 0px 4px 21px;
+  position: absolute;
+  transform: translateY(-40%);
+  top: 40%;
+  /* position: relative; */
+  margin: 0 auto;
+  left: 0;
+  width: 950px;
+  right: 0;
+  text-align: center;
+  padding: 0px;
+  padding: 20px;
+
+  .text {
+    padding: 5px;
+
+    .name {
+      font-weight: bolder;
+      font-size: 15px;
+      font-weight: 900;
+    }
+
+    >p {
+      padding-top: 5px;
+    }
+  }
+
+  .header-img {
+    height: 150px;
+    width: 150px;
+    border-radius: 50%;
+    margin-right: 0px;
+    top: 4px;
+    position: relative;
+    border: 3px solid #dfdfdf;
+  }
+
+  >div {
+    float: left;
+    // height: 480px;
+    padding-top: 10px;
+  }
+
+  .left {
+    width: 320px;
+    border-right: 1px solid #eee;
+    // box-shadow: #d6d6d6 7px 4px 20px;
+    // flex: 1;
+  }
+
+  .right {
+    padding-left: 30px;
+    width: 570px;
+    // background: #fefefe;
+    // flex: 3;
+  }
+}
+</style>
+
+
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/system/Sys_Department.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/system/Sys_Department.vue
new file mode 100644
index 0000000..0ee20af
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/system/Sys_Department.vue
@@ -0,0 +1,71 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/system/system/Sys_Department.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/system/system/Sys_Department.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'DepartmentId',
+                footer: "Foots",
+                cnName: '缁勭粐鏋舵瀯',
+                name: 'system/Sys_Department',
+                url: "/Sys_Department/",
+                sortName: "CreateDate"
+            });
+            const editFormFields = ref({"DepartmentName":"","DepartmentCode":"","ParentId":[],"Remark":""});
+            const editFormOptions = ref([[{"title":"缁勭粐鍚嶇О","required":true,"field":"DepartmentName"}],
+                              [{"title":"缁勭粐缂栧彿","field":"DepartmentCode"}],
+                              [{"dataKey":"缁勭粐鏈烘瀯","data":[],"title":"涓婄骇缁勭粐","field":"ParentId","type":"cascader"}],
+                              [{"title":"澶囨敞","field":"Remark","type":"textarea"}]]);
+            const searchFormFields = ref({"DepartmentName":"","DepartmentCode":"","Creator":"","CreateDate":""});
+            const searchFormOptions = ref([[{"title":"缁勭粐鍚嶇О","field":"DepartmentName","type":"like"},{"title":"缁勭粐缂栧彿","field":"DepartmentCode"},{"title":"鍒涘缓浜�","field":"Creator"},{"title":"鍒涘缓鏃堕棿","field":"CreateDate","type":"datetime"}]]);
+            const columns = ref([{field:'DepartmentId',title:'DepartmentId',type:'guid',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'DepartmentName',title:'缁勭粐鍚嶇О',type:'string',link:true,width:180,require:true,align:'left',sort:true},
+                       {field:'DepartmentCode',title:'缁勭粐缂栧彿',type:'string',width:90,align:'left'},
+                       {field:'ParentId',title:'涓婄骇缁勭粐',type:'guid',bind:{ key:'缁勭粐鏈烘瀯',data:[]},width:110,hidden:true,align:'left'},
+                       {field:'DepartmentType',title:'缁勭粐绫诲瀷',type:'string',width:110,hidden:true,align:'left'},
+                       {field:'Enable',title:'鏄惁鍙敤',type:'int',width:110,hidden:true,align:'left'},
+                       {field:'Remark',title:'澶囨敞',type:'string',width:100,align:'left'},
+                       {field:'CreateID',title:'CreateID',type:'int',width:100,hidden:true,align:'left'},
+                       {field:'Creator',title:'鍒涘缓浜�',type:'string',width:90,align:'left'},
+                       {field:'CreateDate',title:'鍒涘缓鏃堕棿',type:'datetime',width:145,align:'left',sort:true},
+                       {field:'ModifyID',title:'ModifyID',type:'int',width:100,hidden:true,align:'left'},
+                       {field:'Modifier',title:'淇敼浜�',type:'string',width:90,align:'left'},
+                       {field:'ModifyDate',title:'淇敼鏃堕棿',type:'datetime',width:140,align:'left',sort:true}]);
+            const detail = ref({
+                cnName: "#detailCnName",
+                table: "#detailTable",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/test.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/test.vue
new file mode 100644
index 0000000..64786be
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/system/test.vue
@@ -0,0 +1,18 @@
+<template>
+
+</template>
+
+<script>
+export default {
+  props:{
+        list: {
+      type: Array,
+      default: [],
+    },
+  }
+}
+</script>
+
+<style>
+
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue
new file mode 100644
index 0000000..df216d1
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue
@@ -0,0 +1,262 @@
+
+<template>
+  <view-grid
+    ref="grid"
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+</template>
+  <script>
+import extend from "@/extension/taskinfo/task.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+  setup() {
+    const table = ref({
+      key: "taskId",
+      footer: "Foots",
+      cnName: "浠诲姟淇℃伅",
+      name: "task",
+      url: "/Task/",
+      sortName: "CreateDate",
+    });
+    const editFormFields = ref({
+      taskNum:"",
+      palletCode: "",
+      roadway: "",
+      taskType:"",
+      taskState:"",
+      wMSId:"",
+      sourceAddress: "",
+      targetAddress: "",
+      currentAddress: "",
+      nextAddress: "",
+      creater: "",
+      createDate: "",
+      grade: "",
+      productionLine:""
+    });
+    const editFormOptions = ref([[{ title: "浼樺厛绾�", field: "grade", type: "int" },]]);
+    const searchFormFields = ref({
+      taskNum: "",
+      palletCode: "",
+      roadway: "",
+      sourceAddress: "",
+      targetAddress: "",
+      currentAddress: "",
+      nextAddress: "",
+      creater: "",
+      createDate: "",
+    });
+    const searchFormOptions = ref([
+      [
+        { title: "浠诲姟鍙�", field: "taskNum", type: "int" },
+        { title: "鎵樼洏缂栧彿", field: "palletCode", type: "like" },
+        {
+          title: "浠诲姟绫诲瀷",
+          field: "taskType",
+          type: "selectList",
+          dataKey: "taskType",
+          data: [],
+        },
+        {
+          title: "浠诲姟鐘舵��",
+          field: "taskState",
+          type: "selectList",
+          dataKey: "taskState",
+          data: [],
+        },
+      ],
+      [
+        { title: "璧峰鍦板潃", field: "sourceAddress", type: "like" },
+        { title: "鐩爣鍦板潃", field: "targetAddress", type: "like" },
+        { title: "褰撳墠浣嶇疆", field: "currentAddress", type: "like" },
+        { title: "涓嬩竴浣嶇疆", field: "nextAddress", type: "like" },
+      ],
+      [
+        { title: "宸烽亾鍙�", field: "roadway", type: "like" },
+        { "title": "鐢熶骇浜х嚎", "field": "productionLine", type: "select", dataKey: "ProductionLine", data: [] },
+        { title: "鍒涘缓浜�", field: "creater", type: "like" },
+        { title: "鍒涘缓鏃堕棿", field: "createDate", type: "datetime" },
+      ],
+    ]);
+    const columns = ref([
+      {
+        field: "taskId",
+        title: "TaskId",
+        type: "int",
+        width: 90,
+        hidden: true,
+        readonly: true,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "taskNum",
+        title: "浠诲姟鍙�",
+        type: "int",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "palletCode",
+        title: "鎵樼洏缂栧彿",
+        type: "string",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "roadway",
+        title: "宸烽亾鍙�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "taskType",
+        title: "浠诲姟绫诲瀷",
+        type: "int",
+        width: 90,
+        align: "left",
+        bind: { key: "taskType", data: [] },
+      },
+      {
+        field: "taskState",
+        title: "浠诲姟鐘舵��",
+        type: "int",
+        width: 150,
+        align: "left",
+        bind: { key: "taskState", data: [] },
+      },
+      {
+        field: "sourceAddress",
+        title: "璧峰鍦板潃",
+        type: "int",
+        width: 120,
+        align: "left",
+      },
+      {
+        field: "targetAddress",
+        title: "鐩爣鍦板潃",
+        type: "string",
+        width: 120,
+        align: "left",
+      },
+      {
+        field: "currentAddress",
+        title: "褰撳墠浣嶇疆",
+        type: "string",
+        width: 110,
+        align: "left",
+      },
+      {
+        field: "nextAddress",
+        title: "涓嬩竴浣嶇疆",
+        type: "string",
+        width: 110,
+        align: "left",
+      },
+      {
+        field: "productionLine",
+        title: "浜х嚎",
+        type: "string",
+        width: 70,
+        align: "left", 
+        bind: { key: "ProductionLine", data: [] } 
+      },
+      {
+        field: "exceptionMessage",
+        title: "寮傚父淇℃伅",
+        type: "string",
+        width: 90,
+        align: "left",
+        hidden: true,
+      },
+      {
+        field: "grade",
+        title: "浼樺厛绾�",
+        type: "int",
+        width: 60,
+        align: "left",
+      },
+      {
+        field: "dispatchertime",
+        title: "浠诲姟涓嬪彂鏃堕棿",
+        type: "datetime",
+        width: 110,
+        align: "left",
+      },
+      {
+        field: "wMSId",
+        title: "WMS浠诲姟涓婚敭",
+        type: "int",
+        width: 120,
+        align: "left",
+        hidden: true,
+      },
+      
+      {
+        field: "createDate",
+        title: "鍒涘缓鏃堕棿",
+        type: "datetime",
+        width: 150,
+        align: "left",
+      },
+      
+      {
+        field: "modifyDate",
+        title: "淇敼鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "creater",
+        title: "鍒涘缓浜�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "modifier",
+        title: "淇敼浜�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "remark",
+        title: "澶囨敞",
+        type: "string",
+        width: 100,
+        align: "left",
+        hidden: true,
+      },
+    ]);
+    const detail = ref({
+      cnName: "",
+      table: "",
+      columns: [],
+      sortName: "",
+      key: "",
+    });
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+    };
+  },
+});
+</script>
+  
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/taskinfo/task_Hty.vue b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/taskinfo/task_Hty.vue
new file mode 100644
index 0000000..a043770
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Client/src/views/taskinfo/task_Hty.vue
@@ -0,0 +1,246 @@
+
+<template>
+  <view-grid
+    ref="grid"
+    :columns="columns"
+    :detail="detail"
+    :editFormFields="editFormFields"
+    :editFormOptions="editFormOptions"
+    :searchFormFields="searchFormFields"
+    :searchFormOptions="searchFormOptions"
+    :table="table"
+    :extend="extend"
+  >
+  </view-grid>
+</template>
+  <script>
+import extend from "@/extension/taskinfo/task_Hty.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+  setup() {
+    const table = ref({
+      key: "taskId",
+      footer: "Foots",
+      cnName: "浠诲姟淇℃伅",
+      name: "task_Hty",
+      url: "/Task_Hty/",
+      sortName: "CreateDate",
+    });
+    const editFormFields = ref({});
+    const editFormOptions = ref([]);
+    const searchFormFields = ref({
+      taskNum: "",
+      palletCode: "",
+      roadway: "",
+      sourceAddress: "",
+      targetAddress: "",
+      currentAddress: "",
+      nextAddress: "",
+      creater: "",
+      createDate: "",
+    });
+    const searchFormOptions = ref([
+      [
+        { title: "浠诲姟鍙�", field: "taskNum", type: "int" },
+        { title: "鎵樼洏缂栧彿", field: "palletCode", type: "like" },
+        {
+          title: "浠诲姟绫诲瀷",
+          field: "taskType",
+          type: "selectList",
+          dataKey: "taskType",
+          data: [],
+        },
+        {
+          title: "浠诲姟鐘舵��",
+          field: "taskState",
+          type: "selectList",
+          dataKey: "taskState",
+          data: [],
+        },
+      ],
+      [
+        { title: "璧峰鍦板潃", field: "sourceAddress", type: "like" },
+        { title: "鐩爣鍦板潃", field: "targetAddress", type: "like" },
+        { title: "褰撳墠浣嶇疆", field: "currentAddress", type: "like" },
+        { title: "涓嬩竴浣嶇疆", field: "nextAddress", type: "like" },
+      ],
+      [
+        { title: "宸烽亾鍙�", field: "roadway", type: "like" },
+        { title: "鐢熶骇浜х嚎", field: "productionLine", type: "select", dataKey: "ProductionLine", data: [] },
+        { title: "鍒涘缓浜�", field: "creater", type: "like" },
+        { title: "鍒涘缓鏃堕棿", field: "createDate", type: "datetime" },
+      ],
+    ]);
+    const columns = ref([
+      {
+        field: "taskId",
+        title: "TaskId",
+        type: "int",
+        width: 90,
+        hidden: true,
+        readonly: true,
+        require: true,
+        align: "left",
+      },
+      {
+        field: "taskNum",
+        title: "浠诲姟鍙�",
+        type: "int",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "palletCode",
+        title: "鎵樼洏缂栧彿",
+        type: "string",
+        width: 200,
+        align: "left",
+      },
+      {
+        field: "roadway",
+        title: "宸烽亾鍙�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "taskType",
+        title: "浠诲姟绫诲瀷",
+        type: "int",
+        width: 90,
+        align: "left",
+        bind: { key: "taskType", data: [] },
+      },
+      {
+        field: "taskState",
+        title: "浠诲姟鐘舵��",
+        type: "int",
+        width: 150,
+        align: "left",
+        bind: { key: "taskState", data: [] },
+      },
+      {
+        field: "sourceAddress",
+        title: "璧峰鍦板潃",
+        type: "int",
+        width: 120,
+        align: "left",
+      },
+      {
+        field: "targetAddress",
+        title: "鐩爣鍦板潃",
+        type: "string",
+        width: 120,
+        align: "left",
+      },
+      {
+        field: "currentAddress",
+        title: "褰撳墠浣嶇疆",
+        type: "string",
+        width: 120,
+        align: "left",
+      },
+      {
+        field: "nextAddress",
+        title: "涓嬩竴浣嶇疆",
+        type: "string",
+        width: 120,
+        align: "left",
+      },
+      {
+        field: "productionLine",
+        title: "浜х嚎",
+        type: "string",
+        width: 70,
+        align: "left",
+        bind: { key: "ProductionLine", data: [] } 
+      },
+      {
+        field: "exceptionMessage",
+        title: "寮傚父淇℃伅",
+        type: "string",
+        width: 90,
+        align: "left",
+        hidden: true,
+      },
+      {
+        field: "grade",
+        title: "浼樺厛绾�",
+        type: "int",
+        width: 60,
+        align: "left",
+      },
+      {
+        field: "dispatchertime",
+        title: "浠诲姟涓嬪彂鏃堕棿",
+        type: "datetime",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "wMSId",
+        title: "WMS浠诲姟涓婚敭",
+        type: "int",
+        width: 120,
+        align: "left",
+        hidden: true,
+      },
+      
+      {
+        field: "createDate",
+        title: "鍒涘缓鏃堕棿",
+        type: "datetime",
+        width: 150,
+        align: "left",
+      },
+      {
+        field: "modifyDate",
+        title: "淇敼鏃堕棿",
+        type: "datetime",
+        width: 160,
+        align: "left",
+      },
+      {
+        field: "creater",
+        title: "鍒涘缓浜�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "modifier",
+        title: "淇敼浜�",
+        type: "string",
+        width: 90,
+        align: "left",
+      },
+      {
+        field: "remark",
+        title: "澶囨敞",
+        type: "string",
+        width: 100,
+        align: "left",
+        hidden: true,
+      },
+    ]);
+    const detail = ref({
+      cnName: "",
+      table: "",
+      columns: [],
+      sortName: "",
+      key: "",
+    });
+    return {
+      table,
+      extend,
+      editFormFields,
+      editFormOptions,
+      searchFormFields,
+      searchFormOptions,
+      columns,
+      detail,
+    };
+  },
+});
+</script>
+  
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/ProjectEvaluation/wideseawcs_server.metadata.v7.bin b/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/ProjectEvaluation/wideseawcs_server.metadata.v7.bin
new file mode 100644
index 0000000..9ca1b3d
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/ProjectEvaluation/wideseawcs_server.metadata.v7.bin
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/ProjectEvaluation/wideseawcs_server.projects.v7.bin b/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/ProjectEvaluation/wideseawcs_server.projects.v7.bin
new file mode 100644
index 0000000..e117e5f
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/ProjectEvaluation/wideseawcs_server.projects.v7.bin
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/DesignTimeBuild/.dtbcache.v2 b/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/DesignTimeBuild/.dtbcache.v2
new file mode 100644
index 0000000..26ceb7e
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/DesignTimeBuild/.dtbcache.v2
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.futdcache.v2 b/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.futdcache.v2
new file mode 100644
index 0000000..3930e8a
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.futdcache.v2
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.suo b/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.suo
new file mode 100644
index 0000000..50bedc5
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/.suo
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/fileList.bin b/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/fileList.bin
new file mode 100644
index 0000000..1a41028
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/fileList.bin
Binary files differ
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoRepository/WIDESEAWCS_BasicInfoRepository.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoRepository/WIDESEAWCS_BasicInfoRepository.csproj
new file mode 100644
index 0000000..cf2a881
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoRepository/WIDESEAWCS_BasicInfoRepository.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEAWCS_IBasicInfoRepository\WIDESEAWCS_IBasicInfoRepository.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/WIDESEAWCS_BasicInfoService.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/WIDESEAWCS_BasicInfoService.csproj
new file mode 100644
index 0000000..0ce811f
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/WIDESEAWCS_BasicInfoService.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="..\WIDESEAWCS_IBasicInfoService\WIDESEAWCS_IBasicInfoService.csproj" />
+    <ProjectReference Include="..\WIDESEAWCS_QuartzJob\WIDESEAWCS_QuartzJob.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj
new file mode 100644
index 0000000..132c02c
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Communicator/WIDESEAWCS_Communicator.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Communicator/WIDESEAWCS_Communicator.csproj
new file mode 100644
index 0000000..7459335
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Communicator/WIDESEAWCS_Communicator.csproj
@@ -0,0 +1,15 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<Nullable>enable</Nullable>
+		<Version>1.0.0</Version>
+		<Description>宸ヤ笟璁惧閫氳</Description>
+	</PropertyGroup>
+
+	<ItemGroup>
+		<PackageReference Include="HslCommunication" Version="11.6.4" />
+	</ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core - Backup.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core - Backup.csproj
new file mode 100644
index 0000000..31d0330
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core - Backup.csproj
@@ -0,0 +1,38 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<Nullable>enable</Nullable>
+		<Version>1.0.2</Version>
+		<Description>鏇存柊鎺ュ彛璁块棶鎺堟潈闂</Description>
+	</PropertyGroup>
+
+	<ItemGroup>
+		<PackageReference Include="Autofac" Version="8.0.0" />
+		<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="9.0.0" />
+		<PackageReference Include="Autofac.Extras.DynamicProxy" Version="7.1.0" />
+		<PackageReference Include="AutoMapper" Version="13.0.1" />
+		<PackageReference Include="Magicodes.IE.EPPlus" Version="2.7.5.1" />
+		<PackageReference Include="Magicodes.IE.Excel" Version="2.7.5.1" />
+		<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.29" />
+		<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
+		<PackageReference Include="MiniProfiler.AspNetCore.Mvc" Version="4.3.8" />
+		<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
+		<PackageReference Include="OfficeOpenXml.Core.ExcelPackage" Version="1.0.0" />
+		<PackageReference Include="SkiaSharp" Version="2.88.8" />
+		<PackageReference Include="SqlSugarCore" Version="5.1.4.152" />
+		<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
+		<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="7.0.5" />
+		<PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="6.5.0" />
+		<PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.0" />
+		<PackageReference Include="System.Net.Http" Version="4.3.4" />
+		<PackageReference Include="System.Security.Cryptography.Pkcs" Version="6.0.3" />
+		<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
+	</ItemGroup>
+
+	<ItemGroup>
+		<Folder Include="ServiceExtensions\" />
+	</ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj
new file mode 100644
index 0000000..07c29eb
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/WIDESEAWCS_Core.csproj
@@ -0,0 +1,42 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<Nullable>enable</Nullable>
+		<Version>1.0.4</Version>
+		<Description>娣诲姞鍗曠偣鐧诲綍锛�
+淇鍗曡〃鏁版嵁淇敼-淇敼浜轰慨鏀规椂闂撮棶棰�</Description>
+	</PropertyGroup>
+
+	<ItemGroup>
+		<PackageReference Include="Autofac" Version="8.0.0" />
+		<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="9.0.0" />
+		<PackageReference Include="Autofac.Extras.DynamicProxy" Version="7.1.0" />
+		<PackageReference Include="AutoMapper" Version="13.0.1" />
+		<PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.5" />
+		<PackageReference Include="Magicodes.IE.EPPlus" Version="2.7.5.1" />
+		<PackageReference Include="Magicodes.IE.Excel" Version="2.7.5.1" />
+		<PackageReference Include="Masuit.Tools.Core" Version="2024.5.0" />
+		<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.29" />
+		<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.2" />
+		<PackageReference Include="MiniProfiler.AspNetCore.Mvc" Version="4.3.8" />
+		<PackageReference Include="MoYu.Pure" Version="4.9.5.5" />
+		<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
+		<PackageReference Include="OfficeOpenXml.Core.ExcelPackage" Version="1.0.0" />
+		<PackageReference Include="SkiaSharp" Version="2.88.8" />
+		<PackageReference Include="SqlSugarCore" Version="5.1.4.152" />
+		<PackageReference Include="Swashbuckle.AspNetCore" Version="6.7.2" />
+		<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="7.0.5" />
+		<PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="6.5.0" />
+		<PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.0" />
+		<PackageReference Include="System.Net.Http" Version="4.3.4" />
+		<PackageReference Include="System.Security.Cryptography.Pkcs" Version="6.0.3" />
+		<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
+	</ItemGroup>
+
+	<ItemGroup>
+		<Folder Include="ServiceExtensions\" />
+	</ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/WIDESEAWCS_DTO.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/WIDESEAWCS_DTO.csproj
new file mode 100644
index 0000000..cc0b784
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/WIDESEAWCS_DTO.csproj
@@ -0,0 +1,17 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<Nullable>enable</Nullable>
+	</PropertyGroup>
+
+	<ItemGroup>
+		<ProjectReference Include="..\WIDESEAWCS_Model\WIDESEAWCS_Model.csproj" />
+	</ItemGroup>
+
+	<ItemGroup>
+	  <Folder Include="BasicInfo\" />
+	</ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoRepository/WIDESEAWCS_IBasicInfoRepository.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoRepository/WIDESEAWCS_IBasicInfoRepository.csproj
new file mode 100644
index 0000000..c159328
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoRepository/WIDESEAWCS_IBasicInfoRepository.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEAWCS_DTO\WIDESEAWCS_DTO.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/WIDESEAWCS_IBasicInfoService.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/WIDESEAWCS_IBasicInfoService.csproj
new file mode 100644
index 0000000..9413718
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_IBasicInfoService/WIDESEAWCS_IBasicInfoService.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="..\WIDESEAWCS_BasicInfoRepository\WIDESEAWCS_BasicInfoRepository.csproj" />
+    <ProjectReference Include="..\WIDESEAWCS_ISystemServices\WIDESEAWCS_ISystemServices.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemRepository/WIDESEAWCS_ISystemRepository.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemRepository/WIDESEAWCS_ISystemRepository.csproj
new file mode 100644
index 0000000..c2103f2
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemRepository/WIDESEAWCS_ISystemRepository.csproj
@@ -0,0 +1,13 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<Nullable>enable</Nullable>
+	</PropertyGroup>
+
+	<ItemGroup>
+		<ProjectReference Include="..\WIDESEAWCS_DTO\WIDESEAWCS_DTO.csproj" />
+	</ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/WIDESEAWCS_ISystemServices.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/WIDESEAWCS_ISystemServices.csproj
new file mode 100644
index 0000000..17032f0
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/WIDESEAWCS_ISystemServices.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<Nullable>enable</Nullable>
+	</PropertyGroup>
+
+	<ItemGroup>
+		<ProjectReference Include="..\WIDESEAWCS_SystemRepository\WIDESEAWCS_SystemRepository.csproj" />
+	</ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoRepository/WIDESEAWCS_ITaskInfoRepository.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoRepository/WIDESEAWCS_ITaskInfoRepository.csproj
new file mode 100644
index 0000000..3732ca9
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoRepository/WIDESEAWCS_ITaskInfoRepository.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<Nullable>enable</Nullable>
+	</PropertyGroup>
+
+	<ItemGroup>
+	  <ProjectReference Include="..\WIDESEAWCS_DTO\WIDESEAWCS_DTO.csproj" />
+	</ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/WIDESEAWCS_ITaskInfoService.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/WIDESEAWCS_ITaskInfoService.csproj
new file mode 100644
index 0000000..2850c69
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfoService/WIDESEAWCS_ITaskInfoService.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<Nullable>enable</Nullable>
+	</PropertyGroup>
+
+	<ItemGroup>
+		<ProjectReference Include="..\WIDESEAWCS_TaskInfoRepository\WIDESEAWCS_TaskInfoRepository.csproj" />
+	</ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfo_HtyRepository/WIDESEAWCS_ITaskInfo_HtyRepository.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfo_HtyRepository/WIDESEAWCS_ITaskInfo_HtyRepository.csproj
new file mode 100644
index 0000000..57231eb
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfo_HtyRepository/WIDESEAWCS_ITaskInfo_HtyRepository.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="..\WIDESEAWCS_Core\WIDESEAWCS_Core.csproj" />
+    <ProjectReference Include="..\WIDESEAWCS_Model\WIDESEAWCS_Model.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfo_HtyService/WIDESEAWCS_ITaskInfo_HtyService.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfo_HtyService/WIDESEAWCS_ITaskInfo_HtyService.csproj
new file mode 100644
index 0000000..73d877a
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfo_HtyService/WIDESEAWCS_ITaskInfo_HtyService.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEAWCS_TaskInfo_HtyRepository\WIDESEAWCS_TaskInfo_HtyRepository.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfo_HtyService/obj/Release/net6.0/WIDESEAWCS_ITaskInfo_HtyService.csproj.CopyComplete b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfo_HtyService/obj/Release/net6.0/WIDESEAWCS_ITaskInfo_HtyService.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITaskInfo_HtyService/obj/Release/net6.0/WIDESEAWCS_ITaskInfo_HtyService.csproj.CopyComplete
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/WIDESEAWCS_Model.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/WIDESEAWCS_Model.csproj
new file mode 100644
index 0000000..2ee5dd7
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/WIDESEAWCS_Model.csproj
@@ -0,0 +1,18 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<Nullable>enable</Nullable>
+	</PropertyGroup>
+
+	<ItemGroup>
+		<PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
+	</ItemGroup>
+
+	<ItemGroup>
+		<ProjectReference Include="..\WIDESEAWCS_Common\WIDESEAWCS_Common.csproj" />
+		<ProjectReference Include="..\WIDESEAWCS_Core\WIDESEAWCS_Core.csproj" />
+	</ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ProcessParameters/WIDESEAWCS_IProcessRepository.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ProcessParameters/WIDESEAWCS_IProcessRepository.csproj
new file mode 100644
index 0000000..c159328
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ProcessParameters/WIDESEAWCS_IProcessRepository.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEAWCS_DTO\WIDESEAWCS_DTO.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ProcessRepository/WIDESEAWCS_ProcessRepository.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ProcessRepository/WIDESEAWCS_ProcessRepository.csproj
new file mode 100644
index 0000000..b8815cc
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_ProcessRepository/WIDESEAWCS_ProcessRepository.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEAWCS_ProcessParameters\WIDESEAWCS_IProcessRepository.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj
new file mode 100644
index 0000000..d9a8d3a
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/WIDESEAWCS_QuartzJob.csproj
@@ -0,0 +1,20 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<Nullable>enable</Nullable>
+		<Description>鏂板鍫嗗灈鏈哄皝瑁�</Description>
+		<Version>2.0.0</Version>
+	</PropertyGroup>
+
+	<ItemGroup>
+		<PackageReference Include="Quartz" Version="3.11.0" />
+	</ItemGroup>
+
+	<ItemGroup>
+		<ProjectReference Include="..\WIDESEAWCS_Communicator\WIDESEAWCS_Communicator.csproj" />
+		<ProjectReference Include="..\WIDESEAWCS_Core\WIDESEAWCS_Core.csproj" />
+	</ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server.sln b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server.sln
new file mode 100644
index 0000000..5d54fc1
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server.sln
@@ -0,0 +1,231 @@
+锘�
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.9.34728.123
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_Server", "WIDESEAWCS_Server\WIDESEAWCS_Server.csproj", "{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_Tasks", "WIDESEAWCS_Tasks\WIDESEAWCS_Tasks.csproj", "{294E4915-0241-4C8C-BA99-7588B945863A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_QuartzJob", "WIDESEAWCS_QuartzJob\WIDESEAWCS_QuartzJob.csproj", "{6236BFFF-173D-44A8-9FC3-7C001EA30347}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_Model", "WIDESEAWCS_Model\WIDESEAWCS_Model.csproj", "{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_DTO", "WIDESEAWCS_DTO\WIDESEAWCS_DTO.csproj", "{C2D3D138-9109-481B-8BEB-A27597890B2C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_Core", "WIDESEAWCS_Core\WIDESEAWCS_Core.csproj", "{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_Communicator", "WIDESEAWCS_Communicator\WIDESEAWCS_Communicator.csproj", "{861C4D0B-A478-48DB-A0FA-AE70F5BA210A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_Common", "WIDESEAWCS_Common\WIDESEAWCS_Common.csproj", "{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Repository", "Repository", "{4FF30CF7-DA79-4EDD-9A6E-0B0BEAD72A1A}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Service", "Service", "{A12315CA-9D81-412C-A09B-B23D95CFFE16}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System", "System", "{93EFF637-042E-4DD0-A74B-7F0CF998CF96}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TaskInfo", "TaskInfo", "{684035E2-174F-47CE-AA5C-36624C7E26F3}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "System", "System", "{6295C9FB-DAC4-4C07-97C5-C0332ABDD13D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TaskInfo", "TaskInfo", "{D9CF90D0-AFB3-42AA-A2F1-BEE741E0AC0D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_ISystemRepository", "WIDESEAWCS_ISystemRepository\WIDESEAWCS_ISystemRepository.csproj", "{F302E6D6-5A95-4D22-8DC2-21BE2CB30275}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_SystemRepository", "WIDESEAWCS_SystemRepository\WIDESEAWCS_SystemRepository.csproj", "{5777BDEC-4726-4425-85F2-A090524F692D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_ITaskInfoRepository", "WIDESEAWCS_ITaskInfoRepository\WIDESEAWCS_ITaskInfoRepository.csproj", "{09D05F35-CEA2-48D9-86D0-FB95982BA511}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_TaskInfoRepository", "WIDESEAWCS_TaskInfoRepository\WIDESEAWCS_TaskInfoRepository.csproj", "{35054AA5-CF40-4F38-9414-C76742C29382}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_ISystemServices", "WIDESEAWCS_ISystemServices\WIDESEAWCS_ISystemServices.csproj", "{9E4BFF47-52BF-4FD8-9CC7-3763BF19D9E0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_SystemServices", "WIDESEAWCS_SystemServices\WIDESEAWCS_SystemServices.csproj", "{A14242DD-DA06-4DC3-8598-1761AA7C76D1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_ITaskInfoService", "WIDESEAWCS_ITaskInfoService\WIDESEAWCS_ITaskInfoService.csproj", "{7279A2AE-8D1F-4E66-A73A-01AF7927A336}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_TaskInfoService", "WIDESEAWCS_TaskInfoService\WIDESEAWCS_TaskInfoService.csproj", "{83F18A31-5983-4587-A0B2-414BF70E50B5}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{F3797CD6-35D2-40F6-8CAF-39A7130697A7}"
+	ProjectSection(SolutionItems) = preProject
+		.editorconfig = .editorconfig
+	EndProjectSection
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BasicInfo", "BasicInfo", "{5CC8AEFF-2F75-4053-9569-73419839875A}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BasicInfo", "BasicInfo", "{9CB2F821-BB23-48E5-88E8-C326477733C0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_IBasicInfoRepository", "WIDESEAWCS_IBasicInfoRepository\WIDESEAWCS_IBasicInfoRepository.csproj", "{266D07B7-3648-4F3D-818A-89EDA7D84C58}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_BasicInfoRepository", "WIDESEAWCS_BasicInfoRepository\WIDESEAWCS_BasicInfoRepository.csproj", "{206FDF79-9BF3-433A-B7FF-627287BBD760}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_IBasicInfoService", "WIDESEAWCS_IBasicInfoService\WIDESEAWCS_IBasicInfoService.csproj", "{8C2CC25B-DE5D-433E-A550-63864C7A716D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEAWCS_BasicInfoService", "WIDESEAWCS_BasicInfoService\WIDESEAWCS_BasicInfoService.csproj", "{FFAB2C76-1C9E-4006-95C8-A0B2AA53139D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ProcessParameters", "ProcessParameters", "{396F6843-C06A-4856-B0AF-769542C83000}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WIDESEAWCS_IProcessRepository", "WIDESEAWCS_ProcessParameters\WIDESEAWCS_IProcessRepository.csproj", "{D33C3BD0-2C88-4875-B47E-7BDD908C3342}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WIDESEAWCS_ProcessRepository", "WIDESEAWCS_ProcessRepository\WIDESEAWCS_ProcessRepository.csproj", "{A099C81C-73ED-4AF0-80A0-C12FB8B87394}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WIDESEAWCS_ITaskInfo_HtyRepository", "WIDESEAWCS_ITaskInfo_HtyRepository\WIDESEAWCS_ITaskInfo_HtyRepository.csproj", "{17EADC05-D1F1-4440-8B86-56B21E19DC93}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WIDESEAWCS_TaskInfo_HtyRepository", "WIDESEAWCS_TaskInfo_HtyRepository\WIDESEAWCS_TaskInfo_HtyRepository.csproj", "{3E3522C6-5A03-4333-9602-B13243334887}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WIDESEAWCS_TaskInfo_HtyService", "WIDESEAWCS_TaskInfo_HtyService\WIDESEAWCS_TaskInfo_HtyService.csproj", "{978A638E-EDA8-43B7-A1C2-104A790A0C10}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WIDESEAWCS_ITaskInfo_HtyService", "WIDESEAWCS_ITaskInfo_HtyService\WIDESEAWCS_ITaskInfo_HtyService.csproj", "{61271216-85F8-4425-BAFB-1BEE4A35F5F9}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WIDESEAWCS_SignalR", "WIDESEAWCS_SignalR\WIDESEAWCS_SignalR.csproj", "{59D26679-7299-4251-A58E-3AC3C6FA717E}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{487FA45B-EA1A-4ACA-BB5B-0F6708F462C0}.Release|Any CPU.Build.0 = Release|Any CPU
+		{294E4915-0241-4C8C-BA99-7588B945863A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{294E4915-0241-4C8C-BA99-7588B945863A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{294E4915-0241-4C8C-BA99-7588B945863A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{294E4915-0241-4C8C-BA99-7588B945863A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6236BFFF-173D-44A8-9FC3-7C001EA30347}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6236BFFF-173D-44A8-9FC3-7C001EA30347}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6236BFFF-173D-44A8-9FC3-7C001EA30347}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6236BFFF-173D-44A8-9FC3-7C001EA30347}.Release|Any CPU.Build.0 = Release|Any CPU
+		{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7F200FE8-CAF6-4131-BD25-8D438FE0ABAC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{C2D3D138-9109-481B-8BEB-A27597890B2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{C2D3D138-9109-481B-8BEB-A27597890B2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{C2D3D138-9109-481B-8BEB-A27597890B2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{C2D3D138-9109-481B-8BEB-A27597890B2C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{BFFDD936-2E61-4D3A-ABFE-7CF77FE0B184}.Release|Any CPU.Build.0 = Release|Any CPU
+		{861C4D0B-A478-48DB-A0FA-AE70F5BA210A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{861C4D0B-A478-48DB-A0FA-AE70F5BA210A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{861C4D0B-A478-48DB-A0FA-AE70F5BA210A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{861C4D0B-A478-48DB-A0FA-AE70F5BA210A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9FBC654C-51DE-422D-9E1E-6A38268DE1E2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F302E6D6-5A95-4D22-8DC2-21BE2CB30275}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F302E6D6-5A95-4D22-8DC2-21BE2CB30275}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F302E6D6-5A95-4D22-8DC2-21BE2CB30275}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F302E6D6-5A95-4D22-8DC2-21BE2CB30275}.Release|Any CPU.Build.0 = Release|Any CPU
+		{5777BDEC-4726-4425-85F2-A090524F692D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{5777BDEC-4726-4425-85F2-A090524F692D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{5777BDEC-4726-4425-85F2-A090524F692D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{5777BDEC-4726-4425-85F2-A090524F692D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{09D05F35-CEA2-48D9-86D0-FB95982BA511}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{09D05F35-CEA2-48D9-86D0-FB95982BA511}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{09D05F35-CEA2-48D9-86D0-FB95982BA511}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{09D05F35-CEA2-48D9-86D0-FB95982BA511}.Release|Any CPU.Build.0 = Release|Any CPU
+		{35054AA5-CF40-4F38-9414-C76742C29382}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{35054AA5-CF40-4F38-9414-C76742C29382}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{35054AA5-CF40-4F38-9414-C76742C29382}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{35054AA5-CF40-4F38-9414-C76742C29382}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9E4BFF47-52BF-4FD8-9CC7-3763BF19D9E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9E4BFF47-52BF-4FD8-9CC7-3763BF19D9E0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9E4BFF47-52BF-4FD8-9CC7-3763BF19D9E0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9E4BFF47-52BF-4FD8-9CC7-3763BF19D9E0}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A14242DD-DA06-4DC3-8598-1761AA7C76D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A14242DD-DA06-4DC3-8598-1761AA7C76D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A14242DD-DA06-4DC3-8598-1761AA7C76D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A14242DD-DA06-4DC3-8598-1761AA7C76D1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{7279A2AE-8D1F-4E66-A73A-01AF7927A336}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7279A2AE-8D1F-4E66-A73A-01AF7927A336}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7279A2AE-8D1F-4E66-A73A-01AF7927A336}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7279A2AE-8D1F-4E66-A73A-01AF7927A336}.Release|Any CPU.Build.0 = Release|Any CPU
+		{83F18A31-5983-4587-A0B2-414BF70E50B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{83F18A31-5983-4587-A0B2-414BF70E50B5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{83F18A31-5983-4587-A0B2-414BF70E50B5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{83F18A31-5983-4587-A0B2-414BF70E50B5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{266D07B7-3648-4F3D-818A-89EDA7D84C58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{266D07B7-3648-4F3D-818A-89EDA7D84C58}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{266D07B7-3648-4F3D-818A-89EDA7D84C58}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{266D07B7-3648-4F3D-818A-89EDA7D84C58}.Release|Any CPU.Build.0 = Release|Any CPU
+		{206FDF79-9BF3-433A-B7FF-627287BBD760}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{206FDF79-9BF3-433A-B7FF-627287BBD760}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{206FDF79-9BF3-433A-B7FF-627287BBD760}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{206FDF79-9BF3-433A-B7FF-627287BBD760}.Release|Any CPU.Build.0 = Release|Any CPU
+		{8C2CC25B-DE5D-433E-A550-63864C7A716D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8C2CC25B-DE5D-433E-A550-63864C7A716D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8C2CC25B-DE5D-433E-A550-63864C7A716D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8C2CC25B-DE5D-433E-A550-63864C7A716D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{FFAB2C76-1C9E-4006-95C8-A0B2AA53139D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{FFAB2C76-1C9E-4006-95C8-A0B2AA53139D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{FFAB2C76-1C9E-4006-95C8-A0B2AA53139D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{FFAB2C76-1C9E-4006-95C8-A0B2AA53139D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D33C3BD0-2C88-4875-B47E-7BDD908C3342}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D33C3BD0-2C88-4875-B47E-7BDD908C3342}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D33C3BD0-2C88-4875-B47E-7BDD908C3342}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D33C3BD0-2C88-4875-B47E-7BDD908C3342}.Release|Any CPU.Build.0 = Release|Any CPU
+		{A099C81C-73ED-4AF0-80A0-C12FB8B87394}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{A099C81C-73ED-4AF0-80A0-C12FB8B87394}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{A099C81C-73ED-4AF0-80A0-C12FB8B87394}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{A099C81C-73ED-4AF0-80A0-C12FB8B87394}.Release|Any CPU.Build.0 = Release|Any CPU
+		{17EADC05-D1F1-4440-8B86-56B21E19DC93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{17EADC05-D1F1-4440-8B86-56B21E19DC93}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{17EADC05-D1F1-4440-8B86-56B21E19DC93}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{17EADC05-D1F1-4440-8B86-56B21E19DC93}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3E3522C6-5A03-4333-9602-B13243334887}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3E3522C6-5A03-4333-9602-B13243334887}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3E3522C6-5A03-4333-9602-B13243334887}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3E3522C6-5A03-4333-9602-B13243334887}.Release|Any CPU.Build.0 = Release|Any CPU
+		{978A638E-EDA8-43B7-A1C2-104A790A0C10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{978A638E-EDA8-43B7-A1C2-104A790A0C10}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{978A638E-EDA8-43B7-A1C2-104A790A0C10}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{978A638E-EDA8-43B7-A1C2-104A790A0C10}.Release|Any CPU.Build.0 = Release|Any CPU
+		{61271216-85F8-4425-BAFB-1BEE4A35F5F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{61271216-85F8-4425-BAFB-1BEE4A35F5F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{61271216-85F8-4425-BAFB-1BEE4A35F5F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{61271216-85F8-4425-BAFB-1BEE4A35F5F9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{59D26679-7299-4251-A58E-3AC3C6FA717E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{59D26679-7299-4251-A58E-3AC3C6FA717E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{59D26679-7299-4251-A58E-3AC3C6FA717E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{59D26679-7299-4251-A58E-3AC3C6FA717E}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(NestedProjects) = preSolution
+		{93EFF637-042E-4DD0-A74B-7F0CF998CF96} = {4FF30CF7-DA79-4EDD-9A6E-0B0BEAD72A1A}
+		{684035E2-174F-47CE-AA5C-36624C7E26F3} = {4FF30CF7-DA79-4EDD-9A6E-0B0BEAD72A1A}
+		{6295C9FB-DAC4-4C07-97C5-C0332ABDD13D} = {A12315CA-9D81-412C-A09B-B23D95CFFE16}
+		{D9CF90D0-AFB3-42AA-A2F1-BEE741E0AC0D} = {A12315CA-9D81-412C-A09B-B23D95CFFE16}
+		{F302E6D6-5A95-4D22-8DC2-21BE2CB30275} = {93EFF637-042E-4DD0-A74B-7F0CF998CF96}
+		{5777BDEC-4726-4425-85F2-A090524F692D} = {93EFF637-042E-4DD0-A74B-7F0CF998CF96}
+		{09D05F35-CEA2-48D9-86D0-FB95982BA511} = {684035E2-174F-47CE-AA5C-36624C7E26F3}
+		{35054AA5-CF40-4F38-9414-C76742C29382} = {684035E2-174F-47CE-AA5C-36624C7E26F3}
+		{9E4BFF47-52BF-4FD8-9CC7-3763BF19D9E0} = {6295C9FB-DAC4-4C07-97C5-C0332ABDD13D}
+		{A14242DD-DA06-4DC3-8598-1761AA7C76D1} = {6295C9FB-DAC4-4C07-97C5-C0332ABDD13D}
+		{7279A2AE-8D1F-4E66-A73A-01AF7927A336} = {D9CF90D0-AFB3-42AA-A2F1-BEE741E0AC0D}
+		{83F18A31-5983-4587-A0B2-414BF70E50B5} = {D9CF90D0-AFB3-42AA-A2F1-BEE741E0AC0D}
+		{5CC8AEFF-2F75-4053-9569-73419839875A} = {4FF30CF7-DA79-4EDD-9A6E-0B0BEAD72A1A}
+		{9CB2F821-BB23-48E5-88E8-C326477733C0} = {A12315CA-9D81-412C-A09B-B23D95CFFE16}
+		{266D07B7-3648-4F3D-818A-89EDA7D84C58} = {5CC8AEFF-2F75-4053-9569-73419839875A}
+		{206FDF79-9BF3-433A-B7FF-627287BBD760} = {5CC8AEFF-2F75-4053-9569-73419839875A}
+		{8C2CC25B-DE5D-433E-A550-63864C7A716D} = {9CB2F821-BB23-48E5-88E8-C326477733C0}
+		{FFAB2C76-1C9E-4006-95C8-A0B2AA53139D} = {9CB2F821-BB23-48E5-88E8-C326477733C0}
+		{396F6843-C06A-4856-B0AF-769542C83000} = {4FF30CF7-DA79-4EDD-9A6E-0B0BEAD72A1A}
+		{D33C3BD0-2C88-4875-B47E-7BDD908C3342} = {396F6843-C06A-4856-B0AF-769542C83000}
+		{A099C81C-73ED-4AF0-80A0-C12FB8B87394} = {396F6843-C06A-4856-B0AF-769542C83000}
+		{17EADC05-D1F1-4440-8B86-56B21E19DC93} = {684035E2-174F-47CE-AA5C-36624C7E26F3}
+		{3E3522C6-5A03-4333-9602-B13243334887} = {684035E2-174F-47CE-AA5C-36624C7E26F3}
+		{978A638E-EDA8-43B7-A1C2-104A790A0C10} = {D9CF90D0-AFB3-42AA-A2F1-BEE741E0AC0D}
+		{61271216-85F8-4425-BAFB-1BEE4A35F5F9} = {D9CF90D0-AFB3-42AA-A2F1-BEE741E0AC0D}
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {C9A356D5-D4FE-414B-B982-6C97792BE6C6}
+	EndGlobalSection
+EndGlobal
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Properties/PublishProfiles/FolderProfile.pubxml b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Properties/PublishProfiles/FolderProfile.pubxml
new file mode 100644
index 0000000..36847ea
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Properties/PublishProfiles/FolderProfile.pubxml
@@ -0,0 +1,17 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<!--
+https://go.microsoft.com/fwlink/?LinkID=208121.
+-->
+<Project>
+  <PropertyGroup>
+    <DeleteExistingFiles>false</DeleteExistingFiles>
+    <ExcludeApp_Data>false</ExcludeApp_Data>
+    <LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
+    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
+    <LastUsedPlatform>Any CPU</LastUsedPlatform>
+    <PublishProvider>FileSystem</PublishProvider>
+    <PublishUrl>bin\Release\net6.0\publish\</PublishUrl>
+    <WebPublishMethod>FileSystem</WebPublishMethod>
+    <_TargetId>Folder</_TargetId>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Properties/PublishProfiles/FolderProfile.pubxml.user b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Properties/PublishProfiles/FolderProfile.pubxml.user
new file mode 100644
index 0000000..31ee336
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -0,0 +1,11 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<!--
+https://go.microsoft.com/fwlink/?LinkID=208121.
+-->
+<Project>
+  <PropertyGroup>
+    <_PublishTargetUrl>E:\GIT\鐧炬鍐犲畤\BaiBuLiKu\Code Management\WCS\WIDESEAWCS_Server\WIDESEAWCS_Server\bin\Release\net6.0\publish\</_PublishTargetUrl>
+    <History>True|2025-02-19T03:41:36.9348078Z;True|2025-02-18T18:28:41.9967285+08:00;True|2025-02-18T18:25:36.2264950+08:00;True|2025-02-18T10:30:56.5234743+08:00;True|2025-02-15T15:24:40.7310549+08:00;True|2025-02-15T14:26:13.5854743+08:00;True|2025-02-15T14:23:09.9103735+08:00;True|2025-02-15T14:11:58.0255348+08:00;True|2025-02-15T13:55:31.3438054+08:00;True|2025-02-15T13:47:31.3307267+08:00;True|2025-02-15T13:46:24.9001959+08:00;True|2025-02-15T13:23:47.4161644+08:00;True|2025-02-15T13:10:20.4988808+08:00;True|2025-02-15T13:05:10.7619905+08:00;True|2025-02-15T12:55:42.2397751+08:00;True|2025-02-15T12:43:42.1819119+08:00;True|2025-02-15T10:19:42.3871047+08:00;True|2025-01-03T16:15:25.4007394+08:00;True|2025-01-03T15:59:55.6586669+08:00;True|2025-01-03T15:58:54.7953589+08:00;True|2025-01-03T15:54:46.8938743+08:00;True|2025-01-03T15:30:32.7439557+08:00;True|2025-01-03T15:27:53.2337341+08:00;True|2025-01-03T15:24:30.7045349+08:00;True|2025-01-02T14:13:36.7820311+08:00;</History>
+    <LastFailureDetails />
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
new file mode 100644
index 0000000..51f1104
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj
@@ -0,0 +1,99 @@
+锘�<Project Sdk="Microsoft.NET.Sdk.Web">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<Nullable>enable</Nullable>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<GenerateDocumentationFile>False</GenerateDocumentationFile>
+	</PropertyGroup>
+
+	<ItemGroup>
+		<Content Remove="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Dt_DeviceInfo.tsv" />
+		<Content Remove="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Dt_DeviceProtocol.tsv" />
+		<Content Remove="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Dt_DeviceProtocolDetail.tsv" />
+		<Content Remove="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Dt_DispatchInfo.tsv" />
+		<Content Remove="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Dt_Router.tsv" />
+		<Content Remove="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Dt_Task.tsv" />
+		<Content Remove="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Dt_TaskExecuteDetail.tsv" />
+		<Content Remove="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Sys_Dictionary.tsv" />
+		<Content Remove="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Sys_DictionaryList.tsv" />
+		<Content Remove="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Sys_Menu.tsv" />
+		<Content Remove="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Sys_Role.tsv" />
+		<Content Remove="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Sys_RoleAuth.tsv" />
+		<Content Remove="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Sys_User.tsv" />
+	</ItemGroup>
+
+	<ItemGroup>
+		<None Remove="index.html" />
+	</ItemGroup>
+
+	<ItemGroup>
+		<EmbeddedResource Include="index.html">
+			<CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</EmbeddedResource>
+		<EmbeddedResource Include="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Dt_DeviceInfo.tsv">
+		  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</EmbeddedResource>
+		<EmbeddedResource Include="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Dt_DeviceProtocol.tsv">
+		  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</EmbeddedResource>
+		<EmbeddedResource Include="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Dt_DeviceProtocolDetail.tsv">
+		  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</EmbeddedResource>
+		<EmbeddedResource Include="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Dt_DispatchInfo.tsv">
+		  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</EmbeddedResource>
+		<EmbeddedResource Include="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Dt_Router.tsv">
+		  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</EmbeddedResource>
+		<EmbeddedResource Include="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Dt_Task.tsv">
+		  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</EmbeddedResource>
+		<EmbeddedResource Include="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Dt_TaskExecuteDetail.tsv">
+		  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</EmbeddedResource>
+		<EmbeddedResource Include="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Sys_Dictionary.tsv">
+		  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</EmbeddedResource>
+		<EmbeddedResource Include="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Sys_DictionaryList.tsv">
+		  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</EmbeddedResource>
+		<EmbeddedResource Include="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Sys_Menu.tsv">
+		  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</EmbeddedResource>
+		<EmbeddedResource Include="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Sys_Role.tsv">
+		  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</EmbeddedResource>
+		<EmbeddedResource Include="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Sys_RoleAuth.tsv">
+		  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</EmbeddedResource>
+		<EmbeddedResource Include="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Sys_User.tsv">
+		  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</EmbeddedResource>
+	</ItemGroup>
+
+	<ItemGroup>
+		<PackageReference Include="Swashbuckle.AspNetCore" Version="7.2.0" />
+	</ItemGroup>
+
+	<ItemGroup>
+		<ProjectReference Include="..\WIDESEAWCS_QuartzJob\WIDESEAWCS_QuartzJob.csproj" />
+		<ProjectReference Include="..\WIDESEAWCS_SignalR\WIDESEAWCS_SignalR.csproj" />
+		<ProjectReference Include="..\WIDESEAWCS_SystemServices\WIDESEAWCS_SystemServices.csproj" />
+		<ProjectReference Include="..\WIDESEAWCs_TaskInfoService\WIDESEAWCs_TaskInfoService.csproj" />
+		<ProjectReference Include="..\WIDESEAWCS_Tasks\WIDESEAWCS_Tasks.csproj" />
+	</ItemGroup>
+
+	<ItemGroup>
+		<Content Update="nlog.config">
+			<CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</Content>
+		<Content Update="wwwroot\swg-login.html">
+		  <CopyToOutputDirectory>Never</CopyToOutputDirectory>
+		</Content>
+		<Content Update="wwwroot\WIDESEAWCS_DB.DBSeed.Json\Sys_Tenant.tsv">
+		  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+		</Content>
+	</ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj.user b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj.user
new file mode 100644
index 0000000..b8c5e1a
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/WIDESEAWCS_Server.csproj.user
@@ -0,0 +1,6 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <NameOfLastUsedPublishProfile>E:\GIT\鐧炬鍐犲畤\BaiBuLiKu\Code Management\WCS\WIDESEAWCS_Server\WIDESEAWCS_Server\Properties\PublishProfiles\FolderProfile.pubxml</NameOfLastUsedPublishProfile>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_SignalR/WIDESEAWCS_SignalR.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_SignalR/WIDESEAWCS_SignalR.csproj
new file mode 100644
index 0000000..9b75270
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_SignalR/WIDESEAWCS_SignalR.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEAWCS_Core\WIDESEAWCS_Core.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemRepository/WIDESEAWCS_SystemRepository.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemRepository/WIDESEAWCS_SystemRepository.csproj
new file mode 100644
index 0000000..e29c7fd
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemRepository/WIDESEAWCS_SystemRepository.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<Nullable>enable</Nullable>
+	</PropertyGroup>
+
+	<ItemGroup>
+		<ProjectReference Include="..\WIDESEAWCS_ISystemRepository\WIDESEAWCS_ISystemRepository.csproj" />
+	</ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/WIDESEAWCS_SystemServices.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/WIDESEAWCS_SystemServices.csproj
new file mode 100644
index 0000000..dd102f5
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/WIDESEAWCS_SystemServices.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<Nullable>enable</Nullable>
+	</PropertyGroup>
+
+	<ItemGroup>
+		<ProjectReference Include="..\WIDESEAWCS_ISystemServices\WIDESEAWCS_ISystemServices.csproj" />
+	</ItemGroup>
+	
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoRepository/WIDESEAWCS_TaskInfoRepository.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoRepository/WIDESEAWCS_TaskInfoRepository.csproj
new file mode 100644
index 0000000..297907e
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoRepository/WIDESEAWCS_TaskInfoRepository.csproj
@@ -0,0 +1,15 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<Nullable>enable</Nullable>
+	</PropertyGroup>
+
+	<ItemGroup>
+		<ProjectReference Include="..\WIDESEAWCS_Core\WIDESEAWCS_Core.csproj" />
+		<ProjectReference Include="..\WIDESEAWCS_ITaskInfoRepository\WIDESEAWCS_ITaskInfoRepository.csproj" />
+		<ProjectReference Include="..\WIDESEAWCS_Model\WIDESEAWCS_Model.csproj" />
+	</ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/WIDESEAWCS_TaskInfoService.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/WIDESEAWCS_TaskInfoService.csproj
new file mode 100644
index 0000000..6901939
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/WIDESEAWCS_TaskInfoService.csproj
@@ -0,0 +1,16 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<Nullable>enable</Nullable>
+	</PropertyGroup>
+
+	<ItemGroup>
+		<ProjectReference Include="..\WIDESEAWCS_BasicInfoService\WIDESEAWCS_BasicInfoService.csproj" />
+		<ProjectReference Include="..\WIDESEAWCS_ITaskInfoService\WIDESEAWCS_ITaskInfoService.csproj" />
+		<ProjectReference Include="..\WIDESEAWCS_SystemServices\WIDESEAWCS_SystemServices.csproj" />
+		<ProjectReference Include="..\WIDESEAWCS_TaskInfo_HtyService\WIDESEAWCS_TaskInfo_HtyService.csproj" />
+	</ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfo_HtyRepository/WIDESEAWCS_TaskInfo_HtyRepository.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfo_HtyRepository/WIDESEAWCS_TaskInfo_HtyRepository.csproj
new file mode 100644
index 0000000..87b41a7
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfo_HtyRepository/WIDESEAWCS_TaskInfo_HtyRepository.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEAWCS_ITaskInfo_HtyRepository\WIDESEAWCS_ITaskInfo_HtyRepository.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfo_HtyService/WIDESEAWCS_TaskInfo_HtyService.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfo_HtyService/WIDESEAWCS_TaskInfo_HtyService.csproj
new file mode 100644
index 0000000..3d67f10
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfo_HtyService/WIDESEAWCS_TaskInfo_HtyService.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEAWCS_ITaskInfo_HtyService\WIDESEAWCS_ITaskInfo_HtyService.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj
new file mode 100644
index 0000000..e08fa4e
--- /dev/null
+++ b/3F/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/WIDESEAWCS_Tasks.csproj
@@ -0,0 +1,17 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+	<PropertyGroup>
+		<TargetFramework>net6.0</TargetFramework>
+		<ImplicitUsings>enable</ImplicitUsings>
+		<Nullable>enable</Nullable>
+	</PropertyGroup>
+
+	<ItemGroup>
+		<ProjectReference Include="..\WIDESEAWCS_ProcessRepository\WIDESEAWCS_ProcessRepository.csproj" />
+		<ProjectReference Include="..\WIDESEAWCS_QuartzJob\WIDESEAWCS_QuartzJob.csproj" />
+		<ProjectReference Include="..\WIDESEAWCS_SignalR\WIDESEAWCS_SignalR.csproj" />
+		<ProjectReference Include="..\WIDESEAWCS_SystemServices\WIDESEAWCS_SystemServices.csproj" />
+		<ProjectReference Include="..\WIDESEAWCS_TaskInfoService\WIDESEAWCS_TaskInfoService.csproj" />
+	</ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/.browserslistrc b/3F/Code Management/WMS/WIDESEA_WMSClient/.browserslistrc
new file mode 100644
index 0000000..214388f
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/.browserslistrc
@@ -0,0 +1,3 @@
+> 1%
+last 2 versions
+not dead
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/.eslintrc.cjs b/3F/Code Management/WMS/WIDESEA_WMSClient/.eslintrc.cjs
new file mode 100644
index 0000000..2029d6d
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/.eslintrc.cjs
@@ -0,0 +1,19 @@
+/* eslint-env node */
+require('@rushstack/eslint-patch/modern-module-resolution')
+
+module.exports = {
+  root: true,
+  'extends': [
+    'plugin:vue/vue3-essential',
+    'eslint:recommended',
+    '@vue/eslint-config-typescript',
+    '@vue/eslint-config-prettier/skip-formatting'
+  ],
+  rules: {
+    'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
+    'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
+  },
+  parserOptions: {
+    ecmaVersion: 'latest'
+  }
+}
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/.gitignore b/3F/Code Management/WMS/WIDESEA_WMSClient/.gitignore
new file mode 100644
index 0000000..403adbc
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/.gitignore
@@ -0,0 +1,23 @@
+.DS_Store
+node_modules
+/dist
+
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/.vs/WIDESEA_WMSClient/v17/.wsuo b/3F/Code Management/WMS/WIDESEA_WMSClient/.vs/WIDESEA_WMSClient/v17/.wsuo
new file mode 100644
index 0000000..d788e32
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/.vs/WIDESEA_WMSClient/v17/.wsuo
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/.vs/slnx.sqlite b/3F/Code Management/WMS/WIDESEA_WMSClient/.vs/slnx.sqlite
new file mode 100644
index 0000000..be64d69
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/.vs/slnx.sqlite
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/Dt_BillGroupStock.jsx b/3F/Code Management/WMS/WIDESEA_WMSClient/Dt_BillGroupStock.jsx
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/Dt_BillGroupStock.jsx
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/README.md b/3F/Code Management/WMS/WIDESEA_WMSClient/README.md
new file mode 100644
index 0000000..06bd587
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/README.md
@@ -0,0 +1,29 @@
+# vol.vue3
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Run your unit tests
+```
+npm run test:unit
+```
+
+### Lints and fixes files
+```
+npm run lint
+```
+
+### Customize configuration
+See [Configuration Reference](https://cli.vuejs.org/config/).
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/build.bat b/3F/Code Management/WMS/WIDESEA_WMSClient/build.bat
new file mode 100644
index 0000000..10da9ff
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/build.bat
@@ -0,0 +1 @@
+npm run build
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/env.d.ts b/3F/Code Management/WMS/WIDESEA_WMSClient/env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/env.d.ts
@@ -0,0 +1 @@
+/// <reference types="vite/client" />
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/install.bat b/3F/Code Management/WMS/WIDESEA_WMSClient/install.bat
new file mode 100644
index 0000000..be01f16
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/install.bat
@@ -0,0 +1 @@
+npm cache clear --force & npm install
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/el.png b/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/el.png
new file mode 100644
index 0000000..a166689
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/el.png
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon1.png b/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon1.png
new file mode 100644
index 0000000..da63666
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon1.png
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon2.png b/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon2.png
new file mode 100644
index 0000000..d8370b6
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon2.png
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon3.png b/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon3.png
new file mode 100644
index 0000000..c8adbc2
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon3.png
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon4.png b/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon4.png
new file mode 100644
index 0000000..da73fe6
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/imgs/icon4.png
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/login_bg.png b/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/login_bg.png
new file mode 100644
index 0000000..0e50abc
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/login_bg.png
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/qq.png b/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/qq.png
new file mode 100644
index 0000000..5366a39
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/public/static/qq.png
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/run.bat b/3F/Code Management/WMS/WIDESEA_WMSClient/run.bat
new file mode 100644
index 0000000..b896a08
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/run.bat
@@ -0,0 +1 @@
+npm run dev
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/App.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/App.vue
new file mode 100644
index 0000000..6090b55
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/App.vue
@@ -0,0 +1,63 @@
+<template>
+  <div id="nav"></div>
+  <el-config-provider :locale="locale">
+    <router-view />
+  </el-config-provider>
+</template>
+<script>
+import { ElConfigProvider } from "element-plus";
+import zhCn from "element-plus/es/locale/lang/zh-cn";
+export default {
+  name: "vol_app",
+  components: {
+    [ElConfigProvider.name]: ElConfigProvider, //娣诲姞缁勪欢
+  },
+  data() {
+    return {
+      locale: zhCn,
+    };
+  },
+};
+</script>
+<style lang="stylus">
+#app {
+  font-family: Avenir, Helvetica, Arial, sans-serif;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  height: 100%;
+  width: 100%;
+}
+
+.el-alert--error.is-light {
+  border: 1px solid #ffe0e0;
+}
+
+.el-alert--error.is-light {
+  color: #f74444 !important;
+}
+
+.el-alert--warning.is-light {
+  border: 1px solid #ffe6c1;
+}
+
+.el-alert--info.is-light {
+  border: 1px solid #e6e5e5;
+}
+
+.el-alert--info .el-alert__description {
+  color: #6b6b6b !important;
+}
+
+.el-alert--warning.is-light {
+  background-color: #fdf6ec;
+  color: #d68409 !important;
+}
+
+.el-alert--success.is-light {
+  border: 1px solid #cdf7b8;
+}
+
+.el-alert--success.is-light .el-alert__description {
+  color: #3baf02 !important;
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/css/common.less b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/css/common.less
new file mode 100644
index 0000000..ac7a179
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/css/common.less
@@ -0,0 +1,75 @@
+*{
+    box-sizing:border-box;
+    -moz-box-sizing:border-box; /* Firefox */
+    -webkit-box-sizing:border-box; /* Safari */
+}
+.el-pager li{
+    font-weight: 100;
+    margin-right: 9px;
+    border: 1px solid #eee;
+    border-radius: 3px;
+    min-width: 28px;
+}
+.el-pager li.active,.el-pager li:hover{
+    background: #ed4014;
+    color: white;
+}
+.el-pagination__editor.el-input .el-input__inner{
+    height: 23px;
+}
+
+
+.animated {
+    -webkit-animation-duration: 0.5s;
+    animation-duration: 0.5s;
+    -webkit-animation-fill-mode: both;
+    animation-fill-mode: both;
+  }
+  
+  @media (print), (prefers-reduced-motion) {
+    .animated {
+      -webkit-animation: unset !important;
+      animation: unset !important;
+      -webkit-transition: none !important;
+      transition: none !important;
+    }
+  }
+  
+  @-webkit-keyframes fadeInDown {
+    from {
+      opacity: 1;
+      -webkit-transform: translate3d(0, -100%, 0);
+      transform: translate3d(0, -100%, 0);
+    }
+  
+    to {
+      opacity: 1;
+      -webkit-transform: translate3d(0, 0, 0);
+      transform: translate3d(0, 0, 0);
+    }
+  }
+  
+  @keyframes fadeInDown {
+    from {
+      opacity: 0;
+      -webkit-transform: translate3d(0, -100%, 0);
+      transform: translate3d(0, -100%, 0);
+    }
+  
+    to {
+      opacity: 1;
+      -webkit-transform: translate3d(0, 0, 0);
+      transform: translate3d(0, 0, 0);
+    }
+  }
+  
+  .fadeInDown {
+    -webkit-animation-name: fadeInDown;
+    animation-name: fadeInDown;
+  }
+  .ivu-message{
+    z-index: 999999999 !important;
+  }
+  .ivu-form-item-content{
+    text-align: left;
+  }
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/element-icon/fonts/element-icons.ttf b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/element-icon/fonts/element-icons.ttf
new file mode 100644
index 0000000..91b74de
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/element-icon/fonts/element-icons.ttf
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/element-icon/fonts/element-icons.woff b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/element-icon/fonts/element-icons.woff
new file mode 100644
index 0000000..02b9a25
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/element-icon/fonts/element-icons.woff
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/default_header.png b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/default_header.png
new file mode 100644
index 0000000..8a28a9d
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/default_header.png
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/error-img.png b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/error-img.png
new file mode 100644
index 0000000..efe8ccb
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/error-img.png
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/error.png b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/error.png
new file mode 100644
index 0000000..efe8ccb
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/error.png
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/log.png b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/log.png
new file mode 100644
index 0000000..8397330
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/log.png
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/logo.png b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/logo.png
new file mode 100644
index 0000000..165d86a
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/imgs/logo.png
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/logo.png b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/logo.png
new file mode 100644
index 0000000..f3d2503
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/assets/logo.png
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/AsyncLoading.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/AsyncLoading.vue
new file mode 100644
index 0000000..1ccf5c7
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/AsyncLoading.vue
@@ -0,0 +1,10 @@
+<template>
+  <div style="text-align: center;font-size: 16px;padding: 20px;">姝e湪鍔犺浇璧勬簮...</div>
+</template>
+<script>
+export default {
+  created() {
+    //  console.log('loading')
+  }
+};
+</script>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/Audit.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/Audit.vue
new file mode 100644
index 0000000..431d6c5
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/Audit.vue
@@ -0,0 +1,59 @@
+<template>
+  <el-alert
+    :title="'褰撳墠閫変腑' + auditParam.rows + '鏉¤褰曞緟瀹℃牳..'"
+    type="success"
+    :closable="false"
+  >
+  </el-alert>
+  <div class="item">
+    <label>瀹℃牳缁撴灉锛�</label>
+    <el-radio-group v-model="auditParam.status">
+      <el-radio
+        v-for="item in auditParam.data"
+        :key="item.status"
+        :label="item.status"
+      >
+        <span>{{ item.text }}</span>
+      </el-radio>
+    </el-radio-group>
+  </div>
+  <div class="item">
+    <label style="margin-right: 13px;">澶�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 娉細</label>
+    <el-input
+      v-model="auditParam.reason"
+      type="textarea"
+      style="margin-right: 13px;"
+      :autosize="{ minRows: 4, maxRows: 10 }"
+      placeholder="瀹℃牳澶囨敞..."
+    ></el-input>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    auditParam: {
+      type: Object,
+      default: () => {
+        return {
+          auditParam: {
+            rows: 0,
+            model: false,
+            status: -1,
+            reason: "",
+            data: [], //[{ text: "閫氳繃", status: 1 }, { text: "鎷掔粷", status: 2 }]
+          },
+        };
+      },
+    },
+  },
+};
+</script>
+<style lang="less" scoped>
+.item{
+  margin-top: 20px;
+  display: flex;
+  > label{
+    width: 86px;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/Empty.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/Empty.vue
new file mode 100644
index 0000000..e5e6a79
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/Empty.vue
@@ -0,0 +1,3 @@
+<template>
+  <div></div>
+</template>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ErrorMsg.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ErrorMsg.vue
new file mode 100644
index 0000000..3885ed5
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ErrorMsg.vue
@@ -0,0 +1,3 @@
+<template>
+    <div id="test"></div>
+</template>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/Icons.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/Icons.vue
new file mode 100644
index 0000000..afd4250
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/Icons.vue
@@ -0,0 +1,345 @@
+<template>
+  <div data-v-394040b0 class="icons">
+    <div
+      @click="select(index)"
+      v-for="(item, index) in icons"
+      :key="index"
+      class="icons-item"
+    >
+      <i
+        :class="[item, selectIndex == index ? 'active' : '']"
+        style="font-size: 32px"
+      ></i>
+      <p>{{ item }}</p>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    onSelect: {
+      type: Function,
+      default: () => {
+        return "";
+      },
+    },
+  },
+  methods: {
+    select(index) {
+      this.selectIndex = index;
+      this.onSelect(index < 0 ? "" : this.icons[index]);
+    },
+  },
+  data() {
+    return {
+      selectIndex: -1,
+      icons: [
+        //ivu-icon ivu-icon-ios-add
+        "el-icon-platform-eleme",
+        "el-icon-eleme",
+        "el-icon-delete-solid",
+        "el-icon-delete",
+        "el-icon-s-tools",
+        "el-icon-setting",
+        "el-icon-user-solid",
+        "el-icon-user",
+        "el-icon-phone",
+        "el-icon-phone-outline",
+        "el-icon-more",
+        "el-icon-more-outline",
+        "el-icon-star-on",
+        "el-icon-star-off",
+        "el-icon-s-goods",
+        "el-icon-goods",
+        "el-icon-warning",
+        "el-icon-warning-outline",
+        "el-icon-question",
+        "el-icon-info",
+        "el-icon-remove",
+        "el-icon-circle-plus",
+        "el-icon-success",
+        "el-icon-error",
+        "el-icon-zoom-in",
+        "el-icon-zoom-out",
+        "el-icon-remove-outline",
+        "el-icon-circle-plus-outline",
+        "el-icon-circle-check",
+        "el-icon-circle-close",
+        "el-icon-s-help",
+        "el-icon-help",
+        "el-icon-minus",
+        "el-icon-plus",
+        "el-icon-check",
+        "el-icon-close",
+        "el-icon-picture",
+        "el-icon-picture-outline",
+        "el-icon-picture-outline-round",
+        "el-icon-upload",
+        "el-icon-upload2",
+        "el-icon-download",
+        "el-icon-camera-solid",
+        "el-icon-camera",
+        "el-icon-video-camera-solid",
+        "el-icon-video-camera",
+        "el-icon-message-solid",
+        "el-icon-bell",
+        "el-icon-s-cooperation",
+        "el-icon-s-order",
+        "el-icon-s-platform",
+        "el-icon-s-fold",
+        "el-icon-s-unfold",
+        "el-icon-s-operation",
+        "el-icon-s-promotion",
+        "el-icon-s-home",
+        "el-icon-s-release",
+        "el-icon-s-ticket",
+        "el-icon-s-management",
+        "el-icon-s-open",
+        "el-icon-s-shop",
+        "el-icon-s-marketing",
+        "el-icon-s-flag",
+        "el-icon-s-comment",
+        "el-icon-s-finance",
+        "el-icon-s-claim",
+        "el-icon-s-custom",
+        "el-icon-s-opportunity",
+        "el-icon-s-data",
+        "el-icon-s-check",
+        "el-icon-s-grid",
+        "el-icon-menu",
+        "el-icon-share",
+        "el-icon-d-caret",
+        "el-icon-caret-left",
+        "el-icon-caret-right",
+        "el-icon-caret-bottom",
+        "el-icon-caret-top",
+        "el-icon-bottom-left",
+        "el-icon-bottom-right",
+        "el-icon-back",
+        "el-icon-right",
+        "el-icon-bottom",
+        "el-icon-top",
+        "el-icon-top-left",
+        "el-icon-top-right",
+        "el-icon-arrow-left",
+        "el-icon-arrow-right",
+        "el-icon-arrow-down",
+        "el-icon-arrow-up",
+        "el-icon-d-arrow-left",
+        "el-icon-d-arrow-right",
+        "el-icon-video-pause",
+        "el-icon-video-play",
+        "el-icon-refresh",
+        "el-icon-refresh-right",
+        "el-icon-refresh-left",
+        "el-icon-finished",
+        "el-icon-sort",
+        "el-icon-sort-up",
+        "el-icon-sort-down",
+        "el-icon-rank",
+        "el-icon-loading",
+        "el-icon-view",
+        "el-icon-c-scale-to-original",
+        "el-icon-date",
+        "el-icon-edit",
+        "el-icon-edit-outline",
+        "el-icon-folder",
+        "el-icon-folder-opened",
+        "el-icon-folder-add",
+        "el-icon-folder-remove",
+        "el-icon-folder-delete",
+        "el-icon-folder-checked",
+        "el-icon-tickets",
+        "el-icon-document-remove",
+        "el-icon-document-delete",
+        "el-icon-document-copy",
+        "el-icon-document-checked",
+        "el-icon-document",
+        "el-icon-document-add",
+        "el-icon-printer",
+        "el-icon-paperclip",
+        "el-icon-takeaway-box",
+        "el-icon-search",
+        "el-icon-monitor",
+        "el-icon-attract",
+        "el-icon-mobile",
+        "el-icon-scissors",
+        "el-icon-umbrella",
+        "el-icon-headset",
+        "el-icon-brush",
+        "el-icon-mouse",
+        "el-icon-coordinate",
+        "el-icon-magic-stick",
+        "el-icon-reading",
+        "el-icon-data-line",
+        "el-icon-data-board",
+        "el-icon-pie-chart",
+        "el-icon-data-analysis",
+        "el-icon-collection-tag",
+        "el-icon-film",
+        "el-icon-suitcase",
+        "el-icon-suitcase-1",
+        "el-icon-receiving",
+        "el-icon-collection",
+        "el-icon-files",
+        "el-icon-notebook-1",
+        "el-icon-notebook-2",
+        "el-icon-toilet-paper",
+        "el-icon-office-building",
+        "el-icon-school",
+        "el-icon-table-lamp",
+        "el-icon-house",
+        "el-icon-no-smoking",
+        "el-icon-smoking",
+        "el-icon-shopping-cart-full",
+        "el-icon-shopping-cart-1",
+        "el-icon-shopping-cart-2",
+        "el-icon-shopping-bag-1",
+        "el-icon-shopping-bag-2",
+        "el-icon-sold-out",
+        "el-icon-sell",
+        "el-icon-present",
+        "el-icon-box",
+        "el-icon-bank-card",
+        "el-icon-money",
+        "el-icon-coin",
+        "el-icon-wallet",
+        "el-icon-discount",
+        "el-icon-price-tag",
+        "el-icon-news",
+        "el-icon-guide",
+        "el-icon-male",
+        "el-icon-female",
+        "el-icon-thumb",
+        "el-icon-cpu",
+        "el-icon-link",
+        "el-icon-connection",
+        "el-icon-open",
+        "el-icon-turn-off",
+        "el-icon-set-up",
+        "el-icon-chat-round",
+        "el-icon-chat-line-round",
+        "el-icon-chat-square",
+        "el-icon-chat-dot-round",
+        "el-icon-chat-dot-square",
+        "el-icon-chat-line-square",
+        "el-icon-message",
+        "el-icon-postcard",
+        "el-icon-position",
+        "el-icon-turn-off-microphone",
+        "el-icon-microphone",
+        "el-icon-close-notification",
+        "el-icon-bangzhu",
+        "el-icon-time",
+        "el-icon-odometer",
+        "el-icon-crop",
+        "el-icon-aim",
+        "el-icon-switch-button",
+        "el-icon-full-screen",
+        "el-icon-copy-document",
+        "el-icon-mic",
+        "el-icon-stopwatch",
+        "el-icon-medal-1",
+        "el-icon-medal",
+        "el-icon-trophy",
+        "el-icon-trophy-1",
+        "el-icon-first-aid-kit",
+        "el-icon-discover",
+        "el-icon-place",
+        "el-icon-location",
+        "el-icon-location-outline",
+        "el-icon-location-information",
+        "el-icon-add-location",
+        "el-icon-delete-location",
+        "el-icon-map-location",
+        "el-icon-alarm-clock",
+        "el-icon-timer",
+        "el-icon-watch-1",
+        "el-icon-watch",
+        "el-icon-lock",
+        "el-icon-unlock",
+        "el-icon-key",
+        "el-icon-service",
+        "el-icon-mobile-phone",
+        "el-icon-bicycle",
+        "el-icon-truck",
+        "el-icon-ship",
+        "el-icon-basketball",
+        "el-icon-football",
+        "el-icon-soccer",
+        "el-icon-baseball",
+        "el-icon-wind-power",
+        "el-icon-light-rain",
+        "el-icon-lightning",
+        "el-icon-heavy-rain",
+        "el-icon-sunrise",
+        "el-icon-sunrise-1",
+        "el-icon-sunset",
+        "el-icon-sunny",
+        "el-icon-cloudy",
+        "el-icon-partly-cloudy",
+        "el-icon-cloudy-and-sunny",
+        "el-icon-moon",
+        "el-icon-moon-night",
+        "el-icon-dish",
+        "el-icon-dish-1",
+        "el-icon-food",
+        "el-icon-chicken",
+        "el-icon-fork-spoon",
+        "el-icon-knife-fork",
+        "el-icon-burger",
+        "el-icon-tableware",
+        "el-icon-sugar",
+        "el-icon-dessert",
+        "el-icon-ice-cream",
+        "el-icon-hot-water",
+        "el-icon-water-cup",
+        "el-icon-coffee-cup",
+        "el-icon-cold-drink",
+        "el-icon-goblet",
+        "el-icon-goblet-full",
+        "el-icon-goblet-square",
+        "el-icon-goblet-square-full",
+        "el-icon-refrigerator",
+        "el-icon-grape",
+        "el-icon-watermelon",
+        "el-icon-cherry",
+        "el-icon-apple",
+        "el-icon-pear",
+        "el-icon-orange",
+        "el-icon-coffee",
+        "el-icon-ice-tea",
+        "el-icon-ice-drink",
+        "el-icon-milk-tea",
+        "el-icon-potato-strips",
+        "el-icon-lollipop",
+        "el-icon-ice-cream-square",
+        "el-icon-ice-cream-round",
+      ],
+    };
+  },
+};
+</script>
+
+
+<style lang="less" scoped>
+.icons-item {
+  float: left;
+  margin: 6px 6px 6px 0;
+  width: 115px;
+  text-align: center;
+  list-style: none;
+  cursor: pointer;
+  height: 100px;
+  color: #5c6b77;
+  transition: all 0.2s ease;
+  position: relative;
+  padding-top: 10px;
+}
+.active {
+  border: 1px solid;
+  background: #f44336;
+  color: white;
+  font-size: 32px;
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/QuickSearch.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/QuickSearch.vue
new file mode 100644
index 0000000..2ef4ab8
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/QuickSearch.vue
@@ -0,0 +1,126 @@
+<template>
+  <div class="qk-search" :class="[formLen == 1 ? 'form-1' : '', hasDate ? 'date-form' : 'qk-form']">
+    <vol-form ref="searchForm" size="default" labelPosition="left" :load-key="false" :label-width="labelWidth"
+      :formRules="formOptions" :formFields="searchFormFields" :select2Count="select2Count">
+    </vol-form>
+  </div>
+</template>
+<script>
+import VolForm from "@/components/basic/VolForm.vue";
+export default {
+  components: {
+    VolForm
+  },
+  props: {
+    select2Count: {
+      type: Number,
+      default: 2000
+    },
+    labelWidth: {
+      type: Number,
+      default: 100
+    },
+    searchFormOptions: {
+      type: Array,
+      default: () => {
+        return []
+      },
+    },
+    searchFormFields: {
+      type: Object,
+      default: () => {
+        return {};
+      },
+    },
+    tiggerPress: {
+      type: Function,
+      default: () => { },
+    },
+    queryFields: { //蹇嵎鏌ヨ鐨勫瓧娈�
+      type: Array,
+      default: () => {
+        return []
+      },
+    }
+  },
+  methods: {
+
+  },
+  data() {
+    return {
+      formLen: 1,
+      formOptions: [],
+      hasDate: false
+    }
+  },
+  created() {
+    let ops = [];
+    if (this.queryFields.length) {
+      for (let index = 0; index < this.queryFields.length; index++) {
+        const field = this.queryFields[index];
+        this.searchFormOptions.forEach(options => {
+          options.forEach(x => {
+            if (field == x.field) {
+              ops.push(x);
+            }
+          })
+        })
+      }
+      // this.formOptions.push(ops);
+      this.formLen = ops.length;
+    }
+    else if (this.searchFormOptions.length) {
+      ops.push(this.searchFormOptions[0][0]);
+      //  this.formOptions.push([this.searchFormOptions[0][0]]);
+    }
+    ops.forEach(x => {
+      if (!x.onKeyPress) {
+        x.onKeyPress = ($event) => {
+          if ($event && $event.keyCode == 13) {
+            this.$emit('tiggerPress', $event)
+          }
+        }
+      }
+    })
+    this.formOptions.push(ops);
+    //tiggerPress
+    this.hasDate = ops.some(x => { return (x.type == 'date' || x.type == 'datetime') && x.range == true })
+  },
+};
+</script>
+<style lang="less" scoped>
+.qk-search ::v-deep(.el-form-item__label) {
+  // display: none;
+  width: auto !important;
+  margin-left: 10px;
+}
+
+.form-1::v-deep(.el-form-item__label) {
+  display: none;
+}
+
+.qk-search {
+  overflow: hidden;
+  height: 38px;
+  position: relative;
+  top: 1px;
+  right: -5px;
+}
+
+.qk-search ::v-deep(.el-form-item) {
+  width: auto !important;
+}
+
+.qk-search ::v-deep(.el-input--large .el-input__wrapper) {
+  padding: 0px 15px;
+}
+
+.qk-form ::v-deep(.el-form-item__content) {
+  width: 140px;
+}
+
+.date-form ::v-deep(.v-date-range) {
+  width: 205px;
+  margin-top: 1px;
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/RouterLoading.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/RouterLoading.vue
new file mode 100644
index 0000000..134a454
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/RouterLoading.vue
@@ -0,0 +1,105 @@
+<template>
+  <div class="router-loading" style="background: #eeeeee5c;">
+    <div class="spanner">
+      <span></span>
+      <span></span>
+      <span></span>
+      <span></span>
+      <span></span>
+      <span></span>
+      <span></span>
+      <span></span>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {};
+  }
+};
+</script>
+<style scoped>
+.router-loading {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  font-size: 100px;
+  text-align: center;
+  padding-top: 200px;
+  color: #808080;
+  z-index: 9999;
+}
+.spanner {
+  width: 100px;
+  height: 100px;
+  position: relative;
+  margin: 0 auto;
+}
+.router-loading span {
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  border-radius: 50%;
+  background: #66b1ff;
+  position: absolute;
+  animation: r_load 1.04s ease infinite;
+}
+@keyframes r_load {
+  0% {
+    transform: scale(1.2);
+    opacity: 1;
+  }
+  100% {
+    transform: scale(0.3);
+    opacity: 0.5;
+  }
+}
+.router-loading span:nth-child(1) {
+  left: 0;
+  top: 50%;
+  margin-top: -10px;
+  animation-delay: 0.13s;
+}
+.router-loading span:nth-child(2) {
+  left: 14px;
+  top: 14px;
+  animation-delay: 0.26s;
+}
+.router-loading span:nth-child(3) {
+  left: 50%;
+  top: 0;
+  margin-left: -10px;
+  animation-delay: 0.39s;
+}
+.router-loading span:nth-child(4) {
+  top: 14px;
+  right: 14px;
+  animation-delay: 0.52s;
+}
+.router-loading span:nth-child(5) {
+  right: 0;
+  top: 50%;
+  margin-top: -10px;
+  animation-delay: 0.65s;
+}
+.router-loading span:nth-child(6) {
+  right: 14px;
+  bottom: 14px;
+  animation-delay: 0.78s;
+}
+.router-loading span:nth-child(7) {
+  bottom: 0;
+  left: 50%;
+  margin-left: -10px;
+  animation-delay: 0.91s;
+}
+.router-loading span:nth-child(8) {
+  bottom: 14px;
+  left: 14px;
+  animation-delay: 1.04s;
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/UploadExcel.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/UploadExcel.vue
new file mode 100644
index 0000000..d013206
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/UploadExcel.vue
@@ -0,0 +1,215 @@
+<template>
+  <div class="upload-container">
+    <a :href="template.url" ref="template"></a>
+    <div class="button-group">
+      <el-upload style="float: left" ref="uploadFile" :max-size="maxSize" :on-change="clearMsg"
+        :before-upload="beforeUpload" :action="url">
+        <el-button size="small"><i class="el-icon-folder-opened"></i>閫夋嫨鏂囦欢</el-button>
+      </el-upload>
+      <el-button v-if="template.url && (template.showDowloadTemplate || template.showDowloadTemplate === undefined)"
+        style="margin-left: 10px" type="primary" size="small" @click="dowloadTemplate" :loading="loadingStatus">
+        <i class="el-icon-bottom"></i>
+        涓嬭浇妯℃澘</el-button>
+      <el-button type="success" size="small" @click="upload" :loading="loadingStatus">
+        <i class="el-icon-top"></i>
+        涓婁紶鏂囦欢</el-button>
+    </div>
+    <div class="alert">
+      <el-alert title="涓婁紶璇存槑" type="warning" :closable="false" show-icon>鍙兘涓婁紶excel鏂囦欢,鏂囦欢澶у皬涓嶈秴杩噞{ maxSize }}M</el-alert>
+    </div>
+
+    <div v-if="file">
+      <h3>鏂囦欢鍒楄〃</h3>
+      <div class="file-info">
+        <span>鏂囦欢鍚嶏細{{ file.name }}</span>
+        <span>澶у皬{{ (file.size / 1024).toFixed(2) }}KB</span>
+      </div>
+    </div>
+    <div v-show="message" class="v-r-message">
+      <h3 class="title">涓婁紶缁撴灉</h3>
+      <div class="text" :class="resultClass" v-html="message"></div>
+    </div>
+    <slot></slot>
+  </div>
+</template>
+<script>
+//鐩墠鍙敮鎸佸崟涓狤xcel涓婁紶锛屽叾浠栧姛鑳藉紑鍙戜腑...
+export default {
+  components: {},
+  props: {
+    url: {
+      type: String,
+      default: ''
+    },
+    template: {
+      //涓嬭浇妯℃澘閰嶇疆
+      type: Object,
+      default: () => {
+        return {
+          showDowloadTemplate: true,
+          url: '', //妯℃澘涓嬭浇璺緞锛屽鏋滄病鏈夋ā鏉胯矾寰勶紝鍒欎笉鏄剧ず涓嬭浇妯℃澘鍔熻兘
+          fileName: '鏈畾涔夋枃浠跺悕' //涓嬭浇妯℃澘鐨勬枃浠跺悕
+        };
+      }
+    },
+    importExcelBefore: {
+      type: Function,
+      default: (file) => {
+        return true;
+      }
+    }
+  },
+  data() {
+    return {
+      maxSize: 100,
+      model: true,
+      file: null,
+      loadingStatus: false,
+      message: '',
+      resultClass: ''
+    };
+  },
+  methods: {
+    clearMsg() {
+      this.message = '';
+    },
+    reset() {
+      this.file = null;
+      this.message = '';
+      this.resultClass = '';
+    },
+    getFileType() {
+      let fileName =
+        this.file.name
+          .split('.')
+          .pop()
+          .toLocaleLowerCase() || '';
+      if (['numbers', 'csv', 'xls', 'xlsx'].indexOf(fileName) == -1) {
+        this.$Message.error('鍙兘閫夋嫨excel鏂囦欢');
+        return false;
+      }
+      return true;
+    },
+    beforeUpload(file) {
+      this.file = file;
+      if (!this.getFileType()) {
+        return false;
+      }
+      return false;
+    },
+    upload() {
+      let _url = this.url;
+      if (!_url) {
+        return this.$Message.error('娌℃湁閰嶇疆濂経rl');
+      }
+
+      if (!this.file) {
+        return this.$Message.error('璇烽�夋嫨鏂囦欢');
+      }
+      var formData = new FormData();
+      formData.append('fileInput', this.file);
+      if (!this.importExcelBefore(formData)) {
+        return;
+      }
+      this.loadingStatus = true;
+      this.http.post(_url, formData, true, { headers: { 'Content-Type': 'multipart/form-data' } }).then(
+        (x) => {
+          // this.$refs.uploadFile.clearFiles();
+          this.loadingStatus = false;
+          this.file = null;
+          if (x.status) {
+            this.$emit('importExcelAfter', x);
+          }
+
+          this.message = x.message;
+          this.resultClass = x.status ? 'v-r-success' : 'v-r-error';
+        },
+        (error) => {
+          this.loadingStatus = false;
+        }
+      );
+    },
+    getUrl(url) {
+      if (url.startsWith("http")) {
+        return url;
+      }
+      return this.http.ipAddress + url
+    },
+    dowloadTemplate() {
+      let url = this.getUrl(this.template.url);
+
+      let xmlResquest = new XMLHttpRequest();
+      xmlResquest.open('GET', url, true);
+      xmlResquest.setRequestHeader('Content-type', 'application/json');
+      xmlResquest.setRequestHeader(
+        'Authorization',
+        this.$store.getters.getToken()
+      );
+      let fileName = this.template.fileName + '.xlsx';
+      let elink = this.$refs.template;
+      xmlResquest.responseType = 'blob';
+      let $_vue = this;
+      this.loadingStatus = true;
+      xmlResquest.onload = function (oEvent) {
+        $_vue.loadingStatus = false;
+        if (xmlResquest.response.type == 'application/json') {
+          return $_vue.message.error('鏈壘鍒颁笅杞芥枃浠�');
+        }
+        let content = xmlResquest.response;
+        elink.download = fileName;
+        let blob = new Blob([content]);
+        elink.href = URL.createObjectURL(blob);
+        elink.click();
+      };
+      xmlResquest.send();
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+.upload-container {
+  min-height: 270px !important;
+  display: inline-block;
+  width: 100%;
+  padding: 10px;
+  border: 1px dashed #989898;
+  min-height: 250px;
+  border-radius: 5px;
+
+  .alert {
+    margin-top: 12px;
+  }
+
+  .el-button-group>* {
+    display: flex;
+  }
+
+  h3 {
+    margin: 9px 0px;
+  }
+
+  .file-info>span {
+    margin-right: 20px;
+  }
+
+  .v-r-message {
+    margin-top: 10px;
+
+    .title {
+      margin-bottom: 2px;
+    }
+
+    >.text {
+      font-size: 13px;
+    }
+
+    .v-r-success {
+      color: #02b702;
+    }
+
+    .v-r-error {
+      color: #dc0909;
+    }
+  }
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/AuditHis.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/AuditHis.vue
new file mode 100644
index 0000000..d1fcb48
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/AuditHis.vue
@@ -0,0 +1,46 @@
+<template>
+  <vol-table
+    :tableData="tableData"
+    :columns="columns"
+    :height="411"
+    :pagination-hide="true"
+    :load-key="false"
+    :text-inline="false"
+    :ck="false"
+  ></vol-table>
+</template>
+<script>
+import VolTable from '@/components/basic/VolTable.vue';
+import {
+  defineComponent,
+  ref,
+  reactive,
+  toRefs,
+  getCurrentInstance
+} from 'vue';
+export default defineComponent({
+  components: {
+    VolTable
+  },
+  props: {
+    tableData: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    }
+  },
+  setup() {
+    const columns = reactive([
+      { title: '鑺傜偣', field: 'stepName' },
+      { title: '瀹℃壒浜�', field: 'auditor' },
+      { title: '瀹℃壒缁撴灉', field: 'auditStatus' },
+      { title: '瀹℃壒鏃堕棿', field: 'auditDate',width:150 },
+      { title: '澶囨敞', field: 'remark' }
+    ]);
+    return {
+        columns
+    }
+  }
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGrid.less b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGrid.less
new file mode 100644
index 0000000..7b68b2a
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGrid.less
@@ -0,0 +1,193 @@
+.view-container {
+  // padding: 15px;
+  background: white;
+  .grid-search {
+    padding-top: 15px;
+    //padding: 15px 15px 0 15px;
+  }
+  .grid-container,
+  .grid-body {
+    padding: 0 15px;
+  }
+  .view-header {
+    padding-left: 15px;
+    padding-right: 15px;
+  }
+  .fs-line {
+    height: 9px;
+    background: #f1f1f1;
+    margin-top: -10px;
+    margin-bottom: 10px;
+  }
+}
+.view-header {
+  height: 45px;
+  position: relative;
+  padding-bottom: 11px;
+  display: flex;
+  .search-line {
+    min-width: 150px;
+  }
+  .search-line > div {
+    margin-left: 5px;
+    margin-right: 10px;
+  }
+  .search-line > div > div {
+    width: 200px;
+    text-align: left;
+  }
+  .search-line > div:first-child {
+    flex: 1;
+  }
+  .search-line > div .ivu-select-dropdown {
+    max-height: 300px;
+  }
+  .btn-group {
+    white-space: nowrap;
+    button {
+      margin-left: 10px;
+      // padding: 5px 16px;
+    }
+  }
+  .btn-group .ivu-dropdown-item {
+    text-align: left !important;
+  }
+  .btn-group .ivu-dropdown-item:not(:last-child) {
+    border-bottom: 1px dotted #eee;
+  }
+  .desc-text {
+    margin-top: 5px;
+    font-weight: bold;
+    margin-bottom: 3px;
+    font-size: 14px;
+    color: #313131;
+    white-space: nowrap;
+    border-bottom: 2px solid #646565;
+    i {
+      font-size: 16px;
+      position: relative;
+      top: 1px;
+      margin-right: 2px;
+    }
+  }
+  .search-box {
+    background: #fefefe;
+    margin-top: 45px;
+    border: 1px solid #ececec;
+    position: absolute;
+    z-index: 999;
+    left: 0;
+    right: 0;
+    padding: 25px 40px;
+    padding-bottom: 0;
+    box-shadow: 0px 7px 18px -12px #bdc0bb;
+  }
+  .notice {
+    font-size: 13px;
+    color: #6b6b6b;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    position: relative;
+    top: 12px;
+    flex: 1;
+    left: 10px;
+    margin-right: 20px;
+  }
+}
+
+.table-info-cell-title {
+  background-color: #f5f5f5 !important;
+}
+.box-com .vol-edit-content{
+  > div.item {
+    // margin-bottom: 10px;
+    padding: 15px 17px 0 8px;
+    margin-bottom: 12px;
+    background: white;
+  }
+  > div.form-item {
+    padding: 16px 16px 0px 5px;
+    //box-shadow: 0 1px 7px rgb(199, 199, 199);
+  }
+  > div.table-item {
+    padding: 0 10px;
+    border-top: 1.5px solid #eaeaea;
+  }
+  .v-text {
+    line-height: 27px;
+  }
+  .form-text {
+    position: relative;
+    border-bottom: 1px solid #eee;
+    font-size: 14px;
+    margin-bottom: 14px;
+  }
+}
+
+.form-closex {
+  text-align: right;
+  padding-bottom: 24px;
+}
+.form-closex button {
+  margin-left: 10px;
+  padding: 4px 13px;
+}
+.toolbar {
+  padding: 3px 0px;
+  width: 100%;
+  display: flex;
+  .title {
+    line-height: 29px;
+    border-bottom: none;
+    font-size: 13px;
+    font-weight: bolder;
+    margin-bottom: 0;
+    color: #5d5c5c;
+    .icon {
+      color: #009688;
+      font-size: 18px;
+    }
+
+    i {
+      line-height: 29px;
+      border-bottom: none;
+      font-weight: bolder;
+      margin-bottom: 0;
+      color: #5d5c5c;
+      position: relative;
+      margin-top: -4px;
+      font-size: 14px;
+    }
+  }
+  .btns {
+    line-height: 28px;
+    flex: 1;
+    text-align: right;
+    button {
+      // border: none;
+      // margin-left:15px;
+      border: 0px;
+      padding: 0px 9px;
+      color: #292929;
+    }
+    button:hover{
+      color: #0089f6;
+    }
+  }
+}
+.vol-edit-content ::v-deep(.form-lang){
+  padding-left: 10px;
+  padding-right: 10px;
+}
+
+.vol-edit-box{
+  display: flex;
+}
+.vol-edit-content{
+  flex: 1;
+  width: 0;
+}
+.vol-edit-box-right{
+  height: 100%;
+}
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGrid.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGrid.vue
new file mode 100644
index 0000000..c66cf97
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGrid.vue
@@ -0,0 +1,536 @@
+<template>
+  <div class="layout-container">
+    <a :href="exportHref" ref="export"></a>
+    <!--寮�鍚噿鍔犺浇2020.12.06 -->
+    <vol-box :on-model-close="closeCustomModel" v-model="viewModel" :height="520" :width="500" :padding="0" :lazy="true"
+      title="璁剧疆">
+      <template #content>
+        <custom-column :view-columns="viewColumns"></custom-column>
+      </template>
+      <template #footer>
+        <div style="text-align: center">
+          <el-button type="default" size="small" @click="closeCustomModel"><i class="el-icon-close"></i>鍙栨秷</el-button>
+          <el-button type="success" size="small" @click="initViewColumns(true)"><i
+              class="el-icon-refresh"></i>閲嶇疆</el-button>
+          <el-button type="primary" size="small" @click="saveColumnConfig"><i class="el-icon-check"></i>纭畾</el-button>
+        </div>
+      </template>
+    </vol-box>
+    <ViewGridAudit @auditClick="saveAudit" :option="table" ref="audit">
+
+    </ViewGridAudit>
+
+    <!--瀵煎叆excel鍔熻兘-->
+    <!--2020.10.31娣诲姞瀵煎叆鍓嶇殑鏂规硶-->
+    <!--寮�鍚噿鍔犺浇2020.12.06 -->
+    <!-- 2022.01.08澧炲姞鏄庣粏琛ㄥ鍏ュ垽鏂� -->
+    <vol-box v-if="upload.url" v-model="upload.excel" :height="350" :width="600" :lazy="true"
+      :title="(boxModel ? detailOptions.cnName : table.cnName) + '-瀵煎叆'">
+      <UploadExcel ref="upload_excel" @importExcelAfter="importExcelAfter" :importExcelBefore="importExcelBefore"
+        :url="upload.url" :template="upload.template"></UploadExcel>
+    </vol-box>
+    <!--澶撮儴鑷畾涔夌粍浠�-->
+    <component :is="dynamicComponent.gridHeader" ref="gridHeader" @parentCall="parentCall"></component>
+    <!--涓荤晫闈㈡煡璇笌table琛ㄥ崟甯冨眬-->
+    <div class="view-container">
+      <!-- 2020.09.11澧炲姞鍥哄畾鏌ヨ琛ㄥ崟 -->
+      <!--鏌ヨ鏉′欢-->
+      <div class="grid-search">
+        <div :class="[fiexdSearchForm ? 'fiexd-search-box' : 'search-box']" v-show="searchBoxShow">
+          <!-- 2020.09.13澧炲姞formFileds鎷煎啓閿欒鍏煎澶勭悊 -->
+          <vol-form ref="searchForm" :load-key="false" style="padding: 0 15px" :label-width="labelWidth"
+            :formRules="searchFormOptions" :formFields="searchFormFields" :select2Count="select2Count">
+            <template #footer>
+              <div v-if="!fiexdSearchForm" class="form-closex">
+                <el-button size="small" type="primary" plain @click="search">
+                  <i class="el-icon-search" />鏌ヨ
+                </el-button>
+
+                <el-button size="small" type="success" plain @click="resetSearch">
+                  <i class="el-icon-refresh-right" />閲嶇疆
+                </el-button>
+                <el-button size="small" plain @click="searchBoxShow = !searchBoxShow">
+                  <i class="el-icon-switch-button" />鍏抽棴
+                </el-button>
+              </div>
+            </template>
+          </vol-form>
+          <div v-if="fiexdSearchForm" class="fs-line"></div>
+        </div>
+        <div class="view-header">
+          <div class="desc-text">
+            <i class="el-icon-s-grid" />
+            <span>{{ table.cnName }}</span>
+          </div>
+          <div class="notice">
+            <a class="text" v-html="text || extend.text"></a>
+          </div>
+          <!--蹇�熸煡璇㈠瓧娈�-->
+          <div class="search-line" v-if="!fiexdSearchForm && !searchBoxShow">
+            <QuickSearch v-if="singleSearch" :searchFormOptions="searchFormOptions" :searchFormFields="searchFormFields"
+              :select2Count="select2Count" :label-width="labelWidth" :queryFields="queryFields"
+              @tiggerPress="quickSearchKeyPress"></QuickSearch>
+          </div>
+          <!--鎿嶄綔鎸夐挳缁�-->
+          <!-- 2020.11.29澧炲姞鏌ヨ鐣岄潰hidden灞炴�� -->
+
+          <div class="btn-group">
+            <template :key="bIndex" v-for="(btn, bIndex) in buttons.slice(0, maxBtnLength)">
+              <el-dropdown size="small" v-if="btn.data" :split-button="false">
+                <el-button :color="btn.color" :dark="false" :type="btn.type" :plain="btn.plain">
+                  {{ btn.name }}<i class="el-icon-arrow-down el-icon--right"></i></el-button>
+                <template #dropdown>
+                  <el-dropdown-menu>
+                    <el-dropdown-item v-for="(item, index) in btn.data" :key="index">
+                      <div @click="onClick(item.onClick)">
+                        <i :class="item.icon"></i>
+                        {{ item.name }}
+                      </div>
+                    </el-dropdown-item>
+                  </el-dropdown-menu>
+                </template>
+              </el-dropdown>
+              <el-button v-else :type="btn.type" size="small" :color="btn.color" :dark="false" :class="btn.class"
+                :plain="btn.plain" v-show="!btn.hidden" @click="onClick(btn.onClick)">
+                <i :class="btn.icon"></i> {{ btn.name }}
+              </el-button>
+            </template>
+            <el-button type="default" style="padding: 0px 10px" size="small" :plain="true" v-if="showCustom"
+              @click="showCustomModel">
+              <i class="el-icon-s-grid"></i>
+            </el-button>
+            <el-dropdown size="small" @click="changeDropdown" v-if="buttons.length > maxBtnLength">
+              <el-button type="primary" plain size="small">
+                鏇村<i class="el-icon-arrow-down el-icon--right"></i>
+              </el-button>
+              <template #dropdown>
+                <el-dropdown-menu>
+                  <el-dropdown-item @click="changeDropdown(item.name)" :name="item.name" v-show="!item.hidden" v-for="(item, dIndex) in buttons.slice(
+                    maxBtnLength,
+                    buttons.length
+                  )" :key="dIndex">
+                    <i :class="item.icon"></i> {{ item.name }}</el-dropdown-item>
+                </el-dropdown-menu>
+              </template>
+            </el-dropdown>
+          </div>
+        </div>
+
+        <!-- 鍒嗗壊浣嶇疆 -->
+        <vol-box v-if="boxInit" v-model="boxModel" :title="boxOptions.title" :width="boxOptions.width"
+          :height="boxOptions.height" :modal="boxOptions.modal" :draggable="boxOptions.draggable" :padding="0"
+          :on-model-close="onGridModelClose" @fullscreen="fullscreen">
+          <!--鏄庣粏澶撮儴鑷畾涔夌粍浠�-->
+          <template #content>
+            <div class="box-com vol-edit-box">
+              <div class="vol-edit-content">
+                <component :is="dynamicComponent.modelHeader" ref="modelHeader" @parentCall="parentCall"></component>
+                <!-- <div v-show="isBoxAudit" class="flow-step">
+                <div v-for="(item, index) in workFlowSteps" :key="index">
+                  {{ item.stepName }}
+                </div>
+              </div> -->
+                <div class="item form-item">
+                  <vol-form ref="form" :editor="editor" :load-key="false" :label-width="boxOptions.labelWidth"
+                    :formRules="editFormOptions" :formFields="editFormFields" :select2Count="select2Count"></vol-form>
+                </div>
+                <!--鏄庣粏body鑷畾涔夌粍浠�-->
+                <component :is="dynamicComponent.modelBody" ref="modelBody" @parentCall="parentCall"></component>
+                <div v-show="hasDetail" v-if="detail.columns && detail.columns.length > 0"
+                  class="grid-detail table-item item">
+                  <div class="toolbar">
+                    <div class="title form-text">
+                      <span>
+                        <i class="el-icon-menu" />
+                        {{ detail.cnName }}
+                      </span>
+                    </div>
+                    <!--鏄庣粏琛ㄦ牸鎸夐挳-->
+                    <div class="btns" v-show="!isBoxAudit">
+                      <el-button v-for="(btn, bIndex) in detailOptions.buttons" :key="bIndex" :plain="btn.plain"
+                        v-show="!(typeof btn.hidden == 'boolean' && btn.hidden)" @click="onClick(btn.onClick)"
+                        size="small"><i :class="btn.icon"></i>{{ btn.name }}</el-button>
+                    </div>
+                  </div>
+                  <vol-table ref="detail" @loadBefore="loadInternalDetailTableBefore" @loadAfter="loadDetailTableAfter"
+                    @rowChange="detailRowOnChange" @rowClick="detailRowOnClick" :url="detailOptions.url"
+                    :load-key="false" :index="true" :tableData="detailOptions.data" :columns="detailOptions.columns"
+                    :pagination="detailOptions.pagination" :height="detailOptions.height" :single="detailOptions.single"
+                    :pagination-hide="detailOptions.paginationHide" :defaultLoadPage="detailOptions.load"
+                    :beginEdit="detailOptions.beginEdit" :endEditBefore="detailOptions.endEditBefore"
+                    :endEditAfter="detailOptions.endEditAfter" :double-edit="detailOptions.doubleEdit"
+                    :column-index="detailOptions.columnIndex" :ck="detailOptions.ck"
+                    :text-inline="detailOptions.textInline" :select2Count="select2Count" :selectable="detailSelectable"
+                    :spanMethod="detailSpanMethod"></vol-table>
+                </div>
+                <component :is="dynamicComponent.modelFooter" ref="modelFooter" @parentCall="parentCall"></component>
+              </div>
+              <div class="vol-edit-box-right">
+                <component :is="dynamicComponent.modelRight" ref="modelRight" @parentCall="parentCall"></component>
+              </div>
+            </div>
+          </template>
+          <template #footer>
+            <div style="text-align: center;" v-show="isBoxAudit">
+              <el-button size="small" type="primary" plain @click="onGridModelClose(false)">
+                <i class="el-icon-close">鍏抽棴</i>
+              </el-button>
+              <el-button size="small" type="primary" v-show="auditParam.showViewButton"
+                @click="auditParam.model = true">
+                <i class="el-icon-view">瀹℃壒</i>
+              </el-button>
+            </div>
+            <div v-show="!isBoxAudit">
+              <el-button v-for="(btn, bIndex) in boxButtons" :key="bIndex" :type="btn.type" size="small"
+                :plain="btn.plain" v-show="!(typeof btn.hidden == 'boolean' && btn.hidden)"
+                :disabled="btn.hasOwnProperty('disabled') && !!btn.disabled" @click="onClick(btn.onClick)">
+                <i :class="btn.icon"></i>{{ btn.name }}
+              </el-button>
+              <el-button size="small" type="primary" plain @click="onGridModelClose(false)">
+                <i class="el-icon-close">鍏抽棴</i>
+              </el-button>
+            </div>
+          </template>
+        </vol-box>
+      </div>
+      <!--body鑷畾涔夌粍浠�-->
+      <div class="grid-body">
+        <component :is="dynamicComponent.gridBody" ref="gridBody" @parentCall="parentCall"></component>
+      </div>
+
+      <!--table琛ㄦ牸-->
+      <div class="grid-container">
+        <!-- 2021.05.02澧炲姞鏍戝舰缁撴瀯 rowKey -->
+        <vol-table ref="table" :single="single" :rowKey="rowKey" :loadTreeChildren="loadTreeTableChildren"
+          @loadBefore="loadTableBefore" @loadAfter="loadTableAfter" @rowChange="rowOnChange" @rowClick="rowOnClick"
+          @rowDbClick="rowOnDbClick" @selectionChange="selectionOnChange" :tableData="[]" :linkView="linkData"
+          :columns="columns" :pagination="pagination" :height="height" :max-height="tableMaxHeight"
+          :pagination-hide="paginationHide" :url="url" :load-key="false" :defaultLoadPage="load"
+          :double-edit="doubleEdit" :index="doubleEdit" :beginEdit="tableBeginEdit" :endEditBefore="tableEndEditBefore"
+          :column-index="columnIndex" :text-inline="textInline" :ck="ck" :select2Count="select2Count"
+          :selectable="selectable" :spanMethod="spanMethod" :lazy="lazy" :defaultExpandAll="defaultExpandAll"
+          :expandRowKeys="expandRowKeys" :rowParentField="rowParentField"></vol-table>
+      </div>
+    </div>
+
+    <!--footer鑷畾涔夌粍浠�-->
+    <component :is="dynamicComponent.gridFooter" ref="gridFooter" @parentCall="parentCall"></component>
+  </div>
+</template>
+
+<script lang="jsx">
+const _const = {
+  EDIT: 'update',
+  ADD: 'Add',
+  VIEW: 'view',
+  PAGE: 'getPageData',
+  AUDIT: 'audit',
+  DEL: 'del',
+  EXPORT: 'Export', //瀵煎嚭鎿嶄綔杩斿洖鍔犲瘑鍚庣殑璺緞
+  DOWNLOAD: 'DownLoadFile', //瀵煎嚭鏂囦欢
+  DOWNLOADTEMPLATE: 'DownLoadTemplate', //涓嬭浇瀵煎叆妯℃澘
+  IMPORT: 'Import', //瀵煎叆(瀵煎叆琛ㄧ殑Excel鍔熻兘)
+  UPLOAD: 'Upload' //涓婁紶鏂囦欢
+};
+import Empty from '@/components/basic/Empty.vue';
+
+import VolTable from '@/components/basic/VolTable.vue';
+import VolForm from '@/components/basic/VolForm.vue';
+import {
+  defineAsyncComponent,
+  defineComponent,
+  ref,
+  shallowRef,
+  toRaw
+} from 'vue';
+var vueParam = {
+  emits: ['parentCall'],
+  components: {
+    'vol-form': VolForm,
+    'vol-table': VolTable,
+    VolBox: defineAsyncComponent(() => import('@/components/basic/VolBox.vue')),
+    QuickSearch: defineAsyncComponent(() =>
+      import('@/components/basic/QuickSearch.vue')
+    ),
+    Audit: defineAsyncComponent(() => import('@/components/basic/Audit.vue')),
+    UploadExcel: defineAsyncComponent(() =>
+      import('@/components/basic/UploadExcel.vue')
+    ),
+    'custom-column': defineAsyncComponent(() =>
+      import('./ViewGridCustomColumn.vue')
+    ),
+    'vol-header': defineAsyncComponent(() => import('./../VolHeader.vue')),
+    ViewGridAudit: defineAsyncComponent(() => import('./ViewGridAudit.vue'))
+  },
+  props: {},
+  setup(props) {
+    //2021.07.17璋冩暣鎵╁睍缁勪欢缁勪欢
+    const dynamicCom = {
+      gridHeader: Empty,
+      gridBody: Empty,
+      gridFooter: Empty,
+      modelHeader: Empty,
+      modelBody: Empty,
+      modelRight: Empty,
+      modelFooter: Empty
+    };
+    //鍚堝苟鎵╁睍缁勪欢
+    if (props.extend.components) {
+      for (const key in props.extend.components) {
+        if (props.extend.components[key]) {
+          dynamicCom[key] = toRaw(props.extend.components[key]);
+        }
+      }
+    }
+    const dynamicComponent = shallowRef(dynamicCom);
+    return { dynamicComponent };
+  },
+  data() {
+    return {
+      isBoxAudit: false,
+      formFieldsType: [],
+      workFlowSteps: [],
+      //鏍戝舰缁撴瀯鐨勪富閿瓧娈碉紝濡傛灉璁剧疆鍊奸粯璁や細寮�鍚爲褰able锛涙敞鎰弐owKey瀛楁鐨勫�煎繀椤绘槸鍞竴锛�2021.05.02锛�
+      rowKey: undefined,
+      fiexdSearchForm: false, //2020.09.011鏄惁鍥哄畾鏌ヨ琛ㄥ崟锛宼rue鏌ヨ琛ㄥ崟灏嗗浐瀹氭樉绀哄湪琛ㄥ崟鐨勬渶涓婇潰
+      _inited: false,
+      doubleEdit: false, //2021.03.19鏄惁寮�鍚煡璇㈢晫闈㈣〃鏍煎弻鍑荤紪杈�
+      single: false, //琛ㄦ槸鍚﹀崟閫�
+      const: _const, //澧炲垹鏀规煡瀵煎叆瀵煎嚭绛夊搴旂殑action
+      boxInit: false, //鏂板缓鎴栫紪杈戠殑寮瑰嚭妗嗗垵鍖栫姸鎬侊紝榛樿涓嶅仛鍒濆鍖栵紝鐐瑰嚮鏂板缓鎴栫紪杈戞墠鍒濆鍖栧脊鍑烘
+      searchBoxShow: false, //楂樼骇鏌ヨ(鐣岄潰鏌ヨ鍚庣殑涓嬫媺妗嗙偣鍑昏Е鍙�)
+      singleSearch: {}, //蹇�熸煡璇㈠瓧娈�
+      exportHref: '',
+      currentAction: _const.ADD, //褰撴柊寤烘垨缂栬緫鏃讹紝璁板綍褰撳墠鐨勭姸鎬�:濡傚綋鍓嶆搷浣滄槸鏂板缓
+      currentRow: {}, //褰撳墠缂栬緫鎴栨煡鐪嬫暟鎹殑琛�
+      closable: false,
+      boxModel: false, //寮瑰嚭鏂板缓銆佺紪杈戞
+      width: 700, //寮瑰嚭妗嗘煡鐪嬭〃鏁版嵁缁撴瀯
+      labelWidth: 100, //楂樼骇鏌ヨ鐨勬爣绛惧搴�
+      viewModel: false, //鏌ョ湅琛ㄧ粨鏋勭殑寮瑰嚭妗�
+      viewColumns: [], //鏌ョ湅琛ㄧ粨鏋勭殑鍒楁暟鎹�
+      viewColumnsClone: [],
+      showCustom: true, //鏄惁鏄剧ず鑷畾涔夐厤缃垪鎸夐挳2022.05.27
+      // viewData: [], //鏌ョ湅琛ㄧ粨鏋勪俊鎭�
+      maxBtnLength: 8, //鐣岄潰鎸夐挳鏈�澶氭樉绀虹殑涓暟锛岃秴杩囩殑鏁伴噺閮芥樉绀哄湪鏇村涓�
+      buttons: [], //鏌ヨ鐣岄潰鎸夐挳  濡傞渶瑕佸叾浠栨搷浣滄寜閽紝鍙湪琛ㄥ搴旂殑.js涓坊鍔�(濡�:Sys_User.js涓璪uttons娣诲姞鍏朵粬鎸夐挳)
+      splitButtons: [],
+      uploadfiled: [], //涓婁紶鏂囦欢鍥剧墖鐨勫瓧娈�
+      boxButtons: [], //寮瑰嚭妗嗘寜閽� 濡傞渶瑕佸叾浠栨搷浣滄寜閽紝鍙湪琛ㄥ搴旂殑.js涓坊鍔�
+      dicKeys: [], //褰撳墠鐣岄潰鎵�鏈夌殑涓嬫媺妗嗗瓧鍏哥紪鍙峰強鏁版嵁婧�
+      hasKeyField: [], //鏈夊瓧鍏告暟鎹簮鐨勫瓧娈�
+      keyValueType: { _dinit: false },
+      url: '', //鐣岄潰琛ㄦ煡璇㈢殑鏁版嵁婧愮殑url
+      hasDetail: false, //鏄惁鏈変粠琛�(鏄庣粏)琛ㄦ牸鏁版嵁
+      initActivated: false,
+      load: true, //鏄惁榛樿鍔犺浇琛ㄦ暟鎹�
+      activatedLoad: false, //椤甸潰瑙﹀彂actived鏃舵槸鍚﹀埛鏂伴〉闈㈡暟鎹�
+      // summary: false, //鏌ヨ鐣岄潰table鏄惁鏄剧ず鍚堣
+      //闇�瑕佷粠杩滅▼缁戝畾鏁版嵁婧愮殑瀛楀吀缂栧彿,濡傛灉瀛楀吀鏁版嵁婧愮殑鏌ヨ缁撴灉杈冨锛岃鍦╫nInit涓皢瀛楀吀缂栧彿娣诲姞杩涙潵
+      //鍙鑷畾sql鏈夋晥
+      remoteKeys: [],
+      columnIndex: true, //2020.11.01鏄惁鏄剧ず琛屽彿
+      ck: true, //2020.11.01鏄惁鏄剧ずcheckbox
+      continueAdd: false, //2021.04.11鏂板缓鏃舵槸鍚﹀彲浠ヨ繛缁柊寤烘搷浣�
+      continueAddName: '淇濆瓨鍚庣户缁坊鍔�', //2021.04.11鎸夐挳鍚嶇О
+      // detailUrl: "",
+      detailOptions: {
+        paginationHide: false,//鏄惁闅愯棌鏄庣粏琛ㄥ垎椤�2023.10.23
+        //寮瑰嚭妗嗕粠琛�(鏄庣粏)瀵硅薄
+        //浠庤〃閰嶇疆
+        buttons: [], //寮瑰嚭妗嗕粠琛ㄨ〃鏍兼搷浣滄寜閽�,鐩墠鏈夊垹闄よ锛屾坊鍔犺锛屽埛鏂版搷浣滐紝濡傞渶瑕佸叾浠栨搷浣滄寜閽紝鍙湪琛ㄥ搴旂殑.js涓坊鍔�
+        cnName: '', //浠庤〃鍚嶇О
+        key: '', //浠庤〃涓婚敭鍚�
+        data: [], //鏁版嵁婧�
+        columns: [], //浠庤〃鍒椾俊鎭�
+        edit: true, //鏄庣粏鏄惁鍙互缂栬緫
+        single: false, //鏄庣粏琛ㄦ槸鍚﹀崟閫�
+        load: false, //
+        delKeys: [], //褰撶紪杈戞椂鍒犻櫎褰撳墠鏄庣粏鐨勮涓婚敭鍊�
+        url: '', //浠庤〃鍔犺浇鏁版嵁鐨剈rl
+        pagination: { total: 0, size: 100, sortName: '' }, //浠庤〃鍒嗛〉閰嶇疆鏁版嵁
+        height: 0, //榛樿浠庤〃楂樺害
+        textInline: true, //鏄庣粏琛ㄨ鍐呭鏄剧ず鍦ㄤ竴琛屼笂锛屽鏋滈渶瑕佹崲琛屾樉绀猴紝璇疯缃负false
+        doubleEdit: true, //浣跨敤鍙屽嚮缂栬緫
+        clickEdit: false, //鏄惁寮�鍚偣鍑诲崟鍏冩牸缂栬緫锛岀偣鍑诲叾浠栬鏃剁粨鏉熺紪杈�
+        currentReadonly: false, //褰撳墠鐢ㄦ埛娌℃湁缂栬緫鎴栨柊寤烘潈闄愭椂锛岃〃鍗曞彧璇�(鍙敤浜庡垽鏂敤鎴锋槸鍚︽湁缂栬緫鎴栨柊寤烘潈闄�)
+        //寮�鍚紪杈戞椂
+        beginEdit: (row, column, index) => {
+          return true;
+        },
+        //缁撴潫缂栬緫鍓�
+        endEditBefore: (row, column, index) => {
+          return true;
+        },
+        //缁撴潫缂栬緫鍚�
+        endEditAfter: (row, column, index) => {
+          return true;
+        },
+        columnIndex: false, //2020.11.01鏄庣粏鏄惁鏄剧ず琛屽彿
+        ck: true //2020.11.01鏄庣粏鏄惁鏄剧ずcheckbox
+      },
+      auditParam: {
+        //瀹℃牳瀵硅薄
+        rows: 0, //褰撳墠閫変腑瀹℃牳鐨勮鏁�
+        model: false, //瀹℃牳寮瑰嚭妗�
+        value: -1, //瀹℃牳缁撴灉
+        status: -1,
+        reason: '', //瀹℃牳鍘熷洜
+        height: 500,
+        showViewButton: true,
+        auditHis: [],
+        showAction: false, //鏄惁鏄剧ず瀹℃壒鎿嶄綔(褰撳墠鑺傜偣涓虹敤鎴峰鎵规椂鏄剧ず)
+        //瀹℃牳閫夐」(鍙嚜琛屽啀娣诲姞)
+        data: [
+          { text: '閫氳繃', value: 1 },
+          { text: '鎷掔粷', value: 2 },
+          { text: '椹冲洖', value: 3 }
+        ]
+      },
+      upload: {
+        //瀵煎叆涓婁紶excel瀵硅薄
+        excel: false, //瀵煎叆鐨勫脊鍑烘鏄惁鏄剧ず
+        url: '', //瀵煎叆鐨勮矾寰�,濡傛灉娌℃湁鍊硷紝鍒欎笉娓叉煋瀵煎叆鍔熻兘
+        template: {
+          //涓嬭浇妯℃澘瀵硅薄
+          url: '', //涓嬭浇妯℃澘璺緞
+          fileName: '' //妯℃澘涓嬭浇鐨勪腑鏂囧悕
+        },
+        init: false //鏄惁鏈夊鍏ユ潈闄愶紝鏈夋墠娓叉煋瀵煎叆缁勪欢
+      },
+      height: 0, //琛ㄩ珮搴�
+      tableHeight: 0, //鏌ヨ椤甸潰table鐨勯珮搴�
+      tableMaxHeight: 0, //鏌ヨ椤甸潰table鐨勬渶澶ч珮搴�
+      textInline: true, //table鍐呭瓒呭嚭鍚庢槸鍚︿笉鎹㈣2020.01.16
+      pagination: { total: 0, size: 30, sortName: '' }, //浠庡垎椤甸厤缃暟鎹�
+      boxOptions: {
+        title: '', //寮瑰嚭妗嗘樉绀虹殑鏍囬2022.08.01
+        saveClose: true,
+        labelWidth: 100,
+        height: 0,
+        width: 0,
+        summary: false, //寮瑰嚭妗嗘槑缁唗able鏄惁鏄剧ず鍚堣
+        draggable: false, //2022.09.12寮瑰嚭妗嗘嫋鍔ㄥ姛鑳�
+        modal: true //2022.09.12寮瑰嚭妗嗚儗鏅伄缃╁眰
+      }, //saveClose鏂板缓鎴栫紪杈戞垚鍔熷悗鏄惁鍏抽棴寮瑰嚭妗�//寮瑰嚭妗嗙殑鏍囩瀹藉害labelWidth
+      editor: {
+        uploadImgUrl: '', //涓婁紶璺緞
+        upload: null //涓婁紶鏂规硶
+      },
+      numberFields: [],
+      //2022.09.26澧炲姞鑷畾涔夊鍑烘枃浠跺悕
+      downloadFileName: null,
+      select2Count: 2000, //瓒呭嚭500鏁伴噺鏄剧ずselect2缁勪欢
+      paginationHide: false,//鏄殣钘忓垎椤�(2023.10.11)
+      queryFields: [],//蹇嵎鏌ヨ瀛楁2024.01.18澧炲姞澶氫釜蹇嵎鏌ヨ瀛楁
+      lazy: true,//鏍戝舰琛ㄦ牸鏄惁榛樿寤惰繜鍔犺浇
+      defaultExpandAll: false,//鏍戝舰琛ㄦ牸鏄惁灞曞紑鎵�鏈�
+      expandRowKeys: [],//榛樿灞曞紑琛岀殑涓婚敭鍊�2024.09.03
+      paginationHide: false,//鏄惁闅愯棌鍒嗛〉
+      rowParentField: "", //鏍戝舰琛ㄦ牸鐖剁骇id
+      text: ""//鐣岄潰涓婃爣棰樺悗鏄剧ず鐨勬枃鏈紝鍙互鏄痟tml鏍囩
+    };
+  },
+  methods: {},
+  activated() {
+    this.initFlowQuery();
+    //2020.06.25澧炲姞activated鏂规硶
+    this.onActivated && this.onActivated();
+    if (!this._inited) {
+      this._inited = true;
+      return;
+    }
+    if (this.activatedLoad) {
+      this.refresh();
+    }
+  },
+  mounted() {
+    this.mounted();
+    // this.$refs.searchForm.forEach()
+  },
+  unmounted() {
+    this.destroyed();
+  },
+  created: function () {
+    //鍚堝苟鑷畾涔変笟鍔℃墿灞曟柟娉�
+    Object.assign(this, this.extend.methods);
+    //濡傛灉娌℃湁鎸囧畾鎺掑簭瀛楁锛屽垯鐢ㄤ富閿綔涓洪粯璁ゆ帓搴忓瓧娈�
+    this.pagination.sortName = this.table.sortName || this.table.key;
+    this.initBoxButtons(); //鍒濆鍖栧脊鍑烘涓庢槑缁嗚〃鏍兼寜閽�
+    this.initAuditColumn();
+    this.onInit(); //鍒濆鍖栧墠锛屽鏋滈渶瑕佸仛鍏朵粬澶勭悊鍦ㄦ墿灞曟柟娉曚腑瑕嗙洊姝ゆ柟娉�
+    this.getButtons();
+    //鍒濆鍖栬嚜瀹氫箟琛ㄦ牸鍒�
+    this.initViewColumns();
+    //鍒濆缂栬緫妗嗙瓑鏁版嵁
+    this.initBoxHeightWidth();
+    this.initDicKeys(); //鍒濆涓嬫鏁版嵁婧�
+    this.onInited(); //鍒濆鍖栧悗锛屽鏋滈渶瑕佸仛鍏朵粬澶勭悊鍦ㄦ墿灞曟柟娉曚腑瑕嗙洊姝ゆ柟娉�
+  },
+  beforeUpdate: function () { },
+  updated: function () { }
+};
+
+import props from './props.js';
+import methods from './methods.jsx';
+
+//鍚堝苟灞炴��
+vueParam.props = Object.assign(vueParam.props, props);
+//鍚堝苟鏂规硶
+vueParam.methods = Object.assign(
+  vueParam.methods,
+  methods,
+  props.extend.methods
+);
+export default defineComponent(vueParam);
+</script>
+<style lang="less" scoped>
+@import './ViewGrid.less';
+</style>
+<style lang="less" scoped>
+.btn-group ::v-deep(.ivu-select-dropdown) {
+  padding: 0px !important;
+  right: 3px;
+}
+
+.btn-group ::v-deep(.ivu-select-dropdown .ivu-dropdown-menu) {
+  min-width: 100px;
+  right: -2px;
+  position: absolute;
+  background: white;
+  width: 130px;
+  border-radius: 5px;
+  border: 1px solid #e7e5e5;
+}
+
+.vertical-center-modal ::v-deep(.srcoll-content) {
+  padding: 0;
+}
+
+.view-model-content {
+  background: #eee;
+}
+
+.grid-detail ::v-deep(.v-table .el-table__header th) {
+  height: 44px;
+}
+</style>
+<style lang="less" scoped>
+.grid-search {
+  position: relative;
+
+  .search-box {
+    background: #fefefe;
+    margin-top: 33px;
+    border: 1px solid #eae8e8;
+    position: absolute;
+    z-index: 999;
+    left: 15px;
+    right: 15px;
+    padding: 25px 20px;
+    padding-bottom: 0;
+    border-top: 0;
+    box-shadow: 0 7px 18px -12px #bdc0bb;
+  }
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGridAudit.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGridAudit.vue
new file mode 100644
index 0000000..0a72596
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGridAudit.vue
@@ -0,0 +1,427 @@
+<template>
+  <vol-box :footer="false" v-model="model" :height="height" :width="width" :padding="0" :lazy="true" title="瀹℃牳">
+
+    <div class="audit-model-content" :style="{ height: height - 100 + 'px' }">
+      <el-descriptions class="desc-top" :column="3" size="default" :border="true">
+        <el-descriptions-item v-for="(item, index) in formData" :key="index">
+          <template #label>
+            <div class="cell-item">
+              {{ item.name }}
+            </div>
+          </template>
+          {{ item.value }}
+        </el-descriptions-item>
+      </el-descriptions>
+      <el-radio-group v-show="hasFlow" style="padding-left: 15px;" v-model="activeName" class="ml-4">
+        <el-radio label="audit" size="large">瀹℃牳</el-radio>
+        <el-radio label="log" size="large">瀹℃牳璁板綍</el-radio>
+      </el-radio-group>
+      <div v-show="activeName == 'audit' || !hasFlow" class="audit-content">
+        <div class="fx-left" v-if="hasFlow">
+          <div class="v-steps">
+            <div v-for="(item, index) in workFlowSteps" :key="index">
+              <div class="step-item" :class="{'step-item-ad':item.auditId||item.stepAttrType=='start'}" v-if="item.stepAttrType == 'start'">
+                <div class="left-item">
+                  <div>娴佺▼寮�濮�</div>
+                  <div class="left-date">{{ item.createDate }}</div>
+                </div>
+                <div class="right-item">
+                  <div class="step-line"></div>
+                  <i class="step-circle"></i>
+                  <div class="step-title">
+                    {{ item.stepName }}
+                  </div>
+                  <div class="step-text">鍙戣捣浜猴細{{ item.creator }}</div>
+                </div>
+              </div>
+              <div class="step-item" v-else-if="item.stepAttrType == 'end'">
+                <div class="left-item">
+                  <div>娴佺▼缁撴潫</div>
+                </div>
+                <div class="right-item">
+                  <div class="step-line"></div>
+                  <i class="step-circle"></i>
+                  <div class="step-title">
+                    {{ item.stepName }}
+                  </div>
+                </div>
+              </div>
+              <div v-else :class="{ 'step-current': item.isCurrent }" class="step-item">
+                <div class="left-item">
+                  <div>瀹℃壒鏃堕棿</div>
+                  <div class="left-date">{{ item.auditDate || '寰呭鎵�' }}</div>
+                </div>
+                <div class="right-item">
+                  <div class="step-line"></div>
+                  <i class="step-circle"></i>
+                  <div class="step-title">
+                    {{ item.stepName }}
+                  </div>
+                  <div class="step-text">瀹℃壒浜猴細{{ item.auditor }}</div>
+                  <div class="step-text">
+                    鐘� 鎬侊細 {{ getAuditStatus(item.auditStatus) }}
+                  </div>
+                  <div class="step-text">澶� 娉細 {{ item.remark || '-' }}</div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="fx-right" :style="{ width: !hasFlow ? '100%' : '400px' }" v-if="isCurrentUser || !hasFlow">
+
+          <div v-if="!hasFlow">
+            <el-alert :title="'褰撳墠閫変腑銆�' + rowLen + '銆戞潯璁板綍寰呭鏍�..'" type="success" :closable="false" />
+          </div>
+          <div class="rd">
+            <span>瀹℃壒锛�</span>
+            <el-radio-group style="margin-left:15px" v-model="auditParam.value">
+              <el-radio v-for="item in auditParam.data" :key="item.value" :label="item.value">
+                <span>{{ item.text }}</span>
+              </el-radio>
+            </el-radio-group>
+          </div>
+          <el-input style="padding-top: 10px;" v-model="auditParam.reason" type="textarea"
+            :autosize="{ minRows: 4, maxRows: 10 }" placeholder="璇疯緭鍏ュ娉�..."></el-input>
+          <div class="btn">
+            <el-button type="primary" @click="auditClick" icon="Check">瀹℃壒</el-button>
+          </div>
+        </div>
+      </div>
+      <div v-show="activeName == 'log'">
+        <vol-table :tableData="tableData" :columns="columns" :height="height - 250" :pagination-hide="true"
+          :load-key="false" :text-inline="false" :ck="false"></vol-table>
+      </div>
+    </div>
+  </vol-box>
+</template>
+<script>
+import VolTable from '@/components/basic/VolTable.vue';
+import VolBox from '@/components/basic/VolBox.vue';
+import http from '@/../src/api/http.js';
+import { defineComponent, ref, reactive, getCurrentInstance } from 'vue';
+export default defineComponent({
+  components: {
+    VolTable,
+    VolBox
+  },
+  props: {
+    option: { //鐢熸垚vue鏂囦欢鐨則able鍙傛暟
+      type: Object,
+      default: {
+        key: '',
+        cnName: '',
+        name: '',
+        url: ""
+      }
+    }
+  },
+  setup(props, { emit }) {
+    const height = ref(500);
+    const width = ref(820);
+    const model = ref(false)
+    const workFlowSteps = reactive([]);
+
+    const hasFlow = ref(false)
+    const formData = reactive([]);
+
+    const auditParam = reactive({
+      //瀹℃牳瀵硅薄
+      rows: 0, //褰撳墠閫変腑瀹℃牳鐨勮鏁�
+      model: false, //瀹℃牳寮瑰嚭妗�
+      value: -1, //瀹℃牳缁撴灉
+      reason: '', //瀹℃牳鍘熷洜
+      //瀹℃牳閫夐」(main.js閲岄潰鍙互娣诲姞鍏朵粬閫夐」)
+      data: []
+    })
+    const { proxy } = getCurrentInstance();
+    auditParam.data = proxy.$global.audit.data;
+    const tableData = reactive([]);
+    const columns = reactive([
+      { title: '鑺傜偣', field: 'stepName', width: 100 },
+      { title: '瀹℃壒浜�', field: 'auditor', width: 80 },
+      { title: '瀹℃壒缁撴灉', field: 'auditStatus', width: 70, bind: { data: [] } },
+      { title: '瀹℃壒鏃堕棿', field: 'auditDate', width: 145 },
+      { title: '澶囨敞', field: 'remark', width: 120 }
+    ]);
+
+    const isCurrentUser = ref(null);
+    const activeName = ref('audit')
+
+    const auditDic = reactive([]);
+    const getAuditStatus = (key) => {
+      return (auditDic.find(x => { return x.key === key + '' }) || { value: key }).value;
+    }
+    const rowLen = ref(0)
+    let currentRows = []
+    const getAuditInfo = (option) => {
+      const table = option.table; //props.option.url.replaceAll('/', '');
+      const url = `api/Sys_WorkFlow/getSteps?tableName=${table}`
+      //  let ids = currentRows.map(x => { return x[props.option.key] });
+      let ids = currentRows.map(x => { return x[option.key] });
+      // ['498043c1-fbd0-4a35-a870-523823912a9b']
+      http.post(url, ids, true).then(result => {
+        if (!result.status) {
+          proxy.$message.error(result.message);
+          return;
+        }
+
+        hasFlow.value = !!(result.list || []).length;
+        if (!hasFlow.value) {
+
+          let auditStatus = Object.keys(currentRows[0]).find(x => { return x.toLowerCase() === 'auditstatus' });
+
+          let checkStatus = currentRows.every((x) => {
+            return proxy.$global.audit.status.some(c => { return c === x[auditStatus] || !x[auditStatus] })
+          });
+          if (!checkStatus) {
+            proxy.$message.error('鍙兘閫夋嫨寰呭鎵规垨瀹℃牳涓殑鏁版嵁');
+            return;
+          }
+          rowLen.value = currentRows.length;
+          model.value = true;
+          width.value = 430;
+          height.value = 350;
+          isCurrentUser.value = true;
+          //娌℃湁瀹℃壒娴佺▼鐨勬暟鎹彧鏄剧ず
+          return;
+        }
+        model.value = true;
+        height.value = document.body.clientHeight * 0.95;
+        width.value = 820;
+        if (!auditDic.length) {
+          auditDic.push(...(result.auditDic || []))
+          columns.forEach(item => {
+            if (item.field == 'auditStatus') {
+              item.bind.data = auditDic;
+            }
+          })
+        }
+        isCurrentUser.value = result.list.some(x => { return x.isCurrentUser })
+        workFlowSteps.length = 0;
+        workFlowSteps.push(...result.list);
+        tableData.length = 0;
+        tableData.push(...result.log)
+        formData.length = 0;
+        formData.push(...(result.form || []))
+      })
+    }
+    //
+
+    const auditClick = () => {
+      if (auditParam.value == -1) {
+        proxy.$message.error('璇烽�夋嫨瀹℃壒椤�');
+        return;
+      }
+
+      if (!isFlow.value) {
+        emit("auditClick", auditParam, currentRows, (result) => {
+          if (result.status) {
+            model.value = false;
+            tableData.length = 0;
+          }
+        });
+        return;
+      }
+      //鎴戠殑娴佺▼涓偣鍑诲鎵�
+      //淇濆瓨瀹℃牳
+      let keys = currentRows.map(x => { return x[currentOption.key] });
+      let url = `api/${currentOption.table}/audit?auditReason=${auditParam.reason}&auditStatus=${auditParam.value}`
+      http.post(url, keys, '瀹℃牳涓�....').then((x) => {
+        if (!x.status) {
+          proxy.$message.error(x.message);
+          return;
+        }
+        model.value = false;
+        proxy.$parent.search()
+        proxy.$message.success(x.message)
+      });
+    }
+    const isFlow = ref(false);
+    let currentOption = {};
+    const open = (rows, flow) => {
+      isFlow.value = !!flow;
+      currentRows = rows;
+      activeName.value = 'audit'
+      auditParam.reason = '';
+      auditParam.value = -1;
+
+      if (flow) {
+        currentOption = {
+          table: rows[0].WorkTable,
+          key: "WorkTableKey"// rows[0].WorkTableKey
+        }
+      } else {
+        currentOption = {
+          table: props.option.url.replaceAll('/', ''),
+          key: props.option.key
+        }
+      }
+      getAuditInfo(currentOption);
+
+    }
+
+    return {
+      columns,
+      height,
+      width,
+      model,
+      workFlowSteps,
+      getAuditInfo,
+      getAuditStatus,
+      activeName,
+      reactive,
+      tableData,
+      auditParam,
+      auditClick,
+      open,
+      isCurrentUser,
+      hasFlow,
+      rowLen,
+      formData,
+      isFlow
+    }
+  }
+});
+</script>
+  
+<style lang="less" scoped>
+.audit-model-content {
+  padding: 10px;
+}
+
+.step-item {
+  background: #fff;
+  display: flex;
+}
+
+.left-item {
+  min-width: 180px;
+  text-align: right;
+  padding-right: 25px;
+  padding-top: 8px;
+
+  .left-date {
+    font-size: 13px;
+    padding-top: 7px;
+    color: #6c6c6c;
+  }
+}
+
+.right-item {
+  cursor: pointer;
+  position: relative;
+  border-bottom: 1px solid #f3f3f3;
+  padding: 5px 0 5px 5px;
+}
+
+.left-item,
+.right-item {
+  padding-bottom: 10px;
+}
+
+.right-item:last-child {
+  border-bottom: 0;
+}
+
+.step-line {
+  top: 16px;
+  left: -10px;
+  width: 1px;
+  height: 100%;
+  position: absolute;
+  background-color: #ebedf0;
+}
+
+.step-circle {
+  position: absolute;
+  top: 17px;
+  left: -9px;
+  z-index: 2;
+  font-size: 12px;
+  line-height: 1;
+  transform: translate(-50%, -50%);
+  width: 7px;
+  height: 7px;
+  background-color: #a1a1a1;
+  border-radius: 50%;
+}
+
+.right-item::before {
+  content: '';
+}
+
+.step-content {
+  padding-top: 2px;
+  font-size: 14px;
+  color: #828282;
+  line-height: 1.5;
+}
+
+.step-title {
+  font-weight: bold;
+  padding-top: 3px;
+}
+
+.step-text {
+  font-size: 13px;
+  color: #999999;
+  padding-top: 6px;
+}
+
+.step-current {
+  * {
+    color: #2f95ff !important;
+  }
+
+  .step-circle {
+    background: #2f95ff !important;
+  }
+
+  // border-radius: 5px;
+  // border: 1px solid #d6eaff;
+  font-size: 13px;
+  padding-top: 6px;
+  // background-color: #eff7ffd9;
+  color: black;
+}
+
+.audit-content {
+  // background: #f9f9f9;
+  padding: 10px;
+  border-radius: 4px;
+  display: flex;
+
+  .fx-left {
+    flex: 1;
+    width: 0;
+
+    .rd {
+      display: flex;
+      align-items: baseline;
+    }
+  }
+
+  .fx-right {
+    // width: 400px;
+
+    .btn {
+      margin-top: 10px;
+      text-align: center;
+    }
+  }
+
+}
+
+.cell-item {
+  font-weight: 500;
+}
+
+.desc-top {
+  padding: 5px 10px 0 10px;
+}
+.step-item-ad{
+  *{
+    color: #9f9898 !important;
+  }
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGridCustomColumn.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGridCustomColumn.vue
new file mode 100644
index 0000000..97feb80
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGridCustomColumn.vue
@@ -0,0 +1,95 @@
+<template>
+  <el-alert
+    title="鎷栧姩鍒楀悕鍙皟鏁磋〃鏍煎垪鏄剧ず椤哄簭"
+    type="success"
+    :show-icon="false"
+  >
+  </el-alert>
+  <div class="view-column view-column-title">
+    <div class="view-column-index">#</div>
+    <div class="view-column-left">鍒楀悕</div>
+    <div class="view-column-right">鏄惁鏄剧ず</div>
+  </div>
+  <draggable
+    class="list-group"
+    tag="transition-group"
+    :component-data="componentData"
+    :list="viewColumns"
+    v-bind="dragOptions"
+    item-key="order"
+  >
+    <transition-group class="drag-center-item">
+      <div
+        class="view-column"
+        v-for="(column, index) in viewColumns"
+        :key="index"
+      >
+        <div class="view-column-index">{{ index + 1 }}</div>
+        <div class="view-column-left">{{ column.title }}</div>
+        <div class="view-column-right">
+          <el-checkbox v-model="column.show">
+            <div style="height: 100%; width: 250px"></div
+          ></el-checkbox>
+        </div>
+      </div>
+    </transition-group>
+  </draggable>
+</template>
+<script>
+import { VueDraggableNext } from 'vue-draggable-next';
+import { defineComponent, ref, reactive } from 'vue';
+
+export default defineComponent({
+  props: {
+    viewColumns: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    }
+  },
+  components: {
+    draggable: VueDraggableNext
+  },
+  data() {
+    return {};
+  },
+  setup(props, context) {
+    const dragOptions = reactive({
+      animation: 200,
+      group: 'description',
+      disabled: false,
+      ghostClass: 'ghost'
+    });
+    const componentData = reactive({
+      tag: 'ul',
+      type: 'transition-group'
+    });
+    return { dragOptions, componentData };
+  }
+});
+</script>
+<style lang="less" scoped>
+.view-column {
+  cursor: pointer;
+  display: flex;
+  padding: 10px;
+  border-bottom: 1px solid #f3f3f3;
+  .view-column-index {
+    width: 50px;
+  }
+  .view-column-left {
+    width: 120px;
+    padding: 0 10px;
+  }
+  .view-column-right {
+    flex: 1;
+  }
+}
+.view-column-title {
+  font-weight: bold;
+}
+.view-column:last-child {
+  border-bottom: 0;
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGridDetail.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGridDetail.vue
new file mode 100644
index 0000000..5f3ae0d
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/ViewGridDetail.vue
@@ -0,0 +1,283 @@
+<template>
+    <div class="layout-container">
+        <div class="view-container">
+            <div class="grid-search">
+                <div class="fiexd-search-box" v-show="true">
+                    <vol-form ref="searchForm" style="padding: 0 15px" :label-width="100" :formRules="searchFormOptions"
+                        :formFields="searchFormFields">
+                    </vol-form>
+                    <div v-if="fiexdSearchForm" class="fs-line"></div>
+                </div>
+                <div class="view-header">
+                    <div class="desc-text">
+                        <i class="el-icon-s-grid" />
+                        <span>{{ title }}</span>
+                    </div>
+                    <div class="notice">
+                        <a class="text" title="{{title}}"></a>
+                    </div>
+
+                    <div class="btn-group">
+                        <template :key="bIndex" v-for="(btn, bIndex) in Mybuttons.slice(0, 6)">
+                            <el-button :type="btn.type" size="small" :dark="btn.dark" :plain="btn.plain"
+                                @click="changeDropdown(btn.name)">
+                                <i :class="btn.icon"></i>
+                                {{ btn.name }}
+                            </el-button>
+                        </template>
+                        <el-dropdown size="small" @click="changeDropdown"
+                            v-if="Mybuttons.length > 5">
+                            <el-button type="primary" plain size="small">
+                                鏇村<i class="el-icon-arrow-down el-icon--right"></i>
+                            </el-button>
+                            <template #dropdown>
+                                <el-dropdown-menu>
+                                    <el-dropdown-item @click="changeDropdown(item.name)" :name="item.name"
+                                        v-show="!item.hidden" v-for="(item, dIndex) in Mybuttons.slice(6)" :key="dIndex">
+                                        <i :class="item.icon"></i>
+                                        {{ item.name }}
+                                    </el-dropdown-item>
+                                </el-dropdown-menu>
+                            </template>
+                        </el-dropdown>
+                    </div>
+                </div>
+            </div>
+
+            <div class="grid-container">
+                <el-table ref="table" stripe :data="tableData" :height="heigth" style="width: 100%" border
+                    @selection-change="selectionChange">
+                    <el-table-column type="selection" width="55" />
+                    <el-table-column prop="order_id" label="涓婚敭" v-if="false"></el-table-column>
+                    <el-table-column type="expand">
+                        <template #default="props">
+                            <h4>鏄庣粏鏁版嵁</h4>
+                            <div m="4">
+                                <el-table stripe :data="props.row.boxingInfoDetails" max-height="400"
+                                    style="width: 100%" border>
+                                    <el-table-column label="搴忓彿" type="index" fixed="left" width="55"></el-table-column>
+                                    <el-table-column :key="index" v-for="(item, index) in detailColumns"
+                                        :label="item.title" :prop="item.field" :width="item.width"
+                                        show-overflow-tooltip></el-table-column>
+                                </el-table>
+                            </div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column v-for="(item, index) in columns" :key="index" :label="item.title"
+                        :prop="item.field" sortable="true" show-overflow-tooltip>
+                        <template #default="scope" v-if="item.type == 'tag'">
+                            <el-tag size="small">
+                                {{ getDictionary(scope.row, item) }}
+                            </el-tag>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <template v-if="true">
+                    <div class="block pagination" key="pagination-01" style="display: flex">
+                        <div style="flex: 1"></div>
+                        <el-pagination key="pagination-02" @size-change="handleSizeChange"
+                            @current-change="handleCurrentChange" :current-page="currentPage1.page"
+                            :page-sizes="currentPage1.sizes" :page-size="currentPage1.size"
+                            layout="total, sizes, prev, pager, next, jumper"
+                            :total="currentPage1.total"></el-pagination>
+                    </div>
+                </template>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+import VolForm from "../VolForm.vue";
+import VolBox from "../VolBox.vue";
+import VolTable from "../VolTable.vue";
+import buttons from "@/api/buttons";
+import methodss from './methodsDetail.jsx';
+export default {
+    components: {
+        'vol-form': VolForm,
+        'vol-table': VolTable,
+        'vol-box': VolBox
+    },
+
+    name: 'CustomTableComponent',
+    data() {
+        return {
+            tableData: [],
+            Mybuttons: [],
+            currentPage1: {
+                sort: "",
+                order: "desc",
+                Foots: "",
+                total: 0,
+                // 2020.08.29澧炲姞鑷畾涔夊垎椤垫潯澶у皬
+                sizes: [30, 60, 100, 120],
+                size: 30, // 榛樿鍒嗛〉澶у皬
+                Wheres: [],
+                page: 1,
+                rows: 30,
+            },
+            selectRows: [],
+        };
+    },
+    props: {
+        url: String,
+        title: String,
+        columns: {
+            type: Array,
+            default: []
+        },
+        detailColumns: Array,
+        searchFormOptions: Object,
+        searchFormFields: Array,
+        dropdownItems: Array,
+        heigth: String,
+        table: String,
+    },
+    methods: {
+        ...methodss.methods,
+        ...methodss.data,
+        changeDropdown(btnName, v1) {
+            let button = this.dropdownItems.filter((x) => {
+                return x.name == btnName
+            })
+            if (button && button.length > 0) {
+                button[0].onClick.apply(this)
+            }
+        },
+        handleSizeChange(val) {
+            this.currentPage1.pageSize = val;
+        },
+        handleCurrentChange(val) {
+            this.currentPage1.currentPage = val;
+        },
+
+        getPageData() {
+            // 鑾峰彇鍒嗛〉鏁版嵁
+            var query = this.getSearchParameters();
+            let param = {
+                page: this.currentPage1.page,
+                rows: this.currentPage1.rows,
+                sort: this.currentPage1.sort,
+                order: this.currentPage1.order,
+                wheres: "", // 鏌ヨ鏉′欢锛屾牸寮忎负[{ name: "瀛楁", value: "xx" }]
+            };
+            param = Object.assign(param, query);
+            param.wheres = JSON.stringify(param.wheres);
+            this.http.post(this.url, param, "鏌ヨ涓�").then((x) => {
+                this.tableData = x.rows;
+                this.currentPage1.total = x.total;
+            });
+        },
+        search() {
+            this.getPageData();
+        },
+
+        getSearchParameters() {
+            //鑾峰彇鏌ヨ鍙傛暟
+            let query = { wheres: [] };
+            for (const key in this.searchFormFields) {
+                let value = this.searchFormFields[key];
+                if (this.emptyValue(value)) continue;
+
+                if (typeof value == "number") {
+                    value = value + "";
+                }
+                let displayType = this.getSearchItem(key);
+
+                //鑱旂骇鍙繚鐣欓�変腑鑺傜偣鐨勬渶鍚庝竴涓��
+                if (displayType == "cascader") {
+                    //鏌ヨ涓嬮潰鎵�鏈夌殑瀛愯妭鐐癸紝濡傦細閫変腑鐨勬槸鐖惰妭鐐癸紝搴旇鏌ヨ涓嬮潰鎵�鏈夌殑鑺傜偣鏁版嵁--寰呭畬
+                    value = value.length ? value[value.length - 1] + "" : "";
+                }
+                //2021.05.02澧炲姞鍖洪棿鏌ヨ
+                if (
+                    typeof value == "string" ||
+                    ["date", "datetime", "range"].indexOf(displayType) == -1
+                ) {
+                    query.wheres.push({
+                        name: key,
+                        value:
+                            typeof value == "string" ? (value + "").trim() : value.join(","),
+                        displayType: displayType,
+                    });
+                    continue;
+                }
+                for (let index = 0; index < value.length; index++) {
+                    if (!this.emptyValue(value[index])) {
+                        query.wheres.push({
+                            name: key,
+                            value: (value[index] + "").trim(),
+                            displayType: (() => {
+                                if (["date", "datetime", "range"].indexOf(displayType) != -1) {
+                                    return index ? "lessorequal" : "thanorequal";
+                                }
+                                return displayType;
+                            })(),
+                        });
+                    }
+                }
+            }
+            return query;
+        },
+
+        getSearchItem(field) {
+            //鑾峰彇鏌ヨ鐨勫弬鏁�
+            let data;
+            for (let index = 0; index < this.searchFormOptions.length; index++) {
+                if (data) return data.type;
+                const item = this.searchFormOptions[index];
+                data = item.find((x) => {
+                    return x.field == field;
+                });
+            }
+
+            return (data || {}).type;
+        },
+
+        emptyValue(value) {
+            if (typeof value == "string" && value.trim() === "") {
+                return true;
+            }
+            if (value instanceof Array && !value.length) {
+                return true;
+            }
+            return value === null || value === undefined || value === "";
+        },
+
+
+        filterPermission(tableName, permission) {
+            //2021.03.19鍒ゆ柇鏄惁鏈夋煇涓〃鐨勬寜閽潈闄�
+            //:["Search","Add","Delete","Update","Import","Export","Upload","Audit"]
+            const _result = (this.$store.state.permission || []).find((x) => {
+                return x.url == '/' + tableName
+            })
+            return _result
+        },
+        getButtons() {
+            console.log(buttons);
+            buttons.forEach(element => {
+                this.dropdownItems.push(element);
+            });
+        }
+    },
+    created() {
+        this.getPageData();
+        let permission = this.filterPermission(this.table);
+        console.log(permission);
+        this.getButtons();
+        this.Mybuttons = this.dropdownItems.filter(item => permission.permission.includes(item.value));
+    }
+};
+</script>
+
+<style>
+@import "./ViewGrid.less";
+
+.pagination {
+    text-align: right;
+    padding: 2px 28px;
+    border: 1px solid #eee;
+    border-top: 0px;
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/methods.jsx b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/methods.jsx
new file mode 100644
index 0000000..e937987
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/methods.jsx
@@ -0,0 +1,1721 @@
+import detailMethods from './detailMethods.js'
+//涓氬姟澶勭悊鏂规硶,鍏ㄩ儴鍙互鐢卞紑鍙戣鐩�
+import serviceFilter from './serviceFilter.js'
+let methods = {
+  //褰撴坊鍔犳墿灞曠粍浠秅ridHeader/gridBody/gridFooter鍙婃槑缁唌odelHeader/modelBody/modelFooter鏃讹紝
+  //濡傛灉瑕佽幏鍙栫埗绾ue瀵硅薄,璇蜂娇鐢ㄦ鏂规硶杩涜鍥炶皟
+  parentCall(fun) {
+    if (typeof fun != 'function') {
+      return console.log('鎵╁睍缁勪欢闇�瑕佷紶鍏ヤ竴涓洖璋冩柟娉曟墠鑳借幏鍙栫埗绾ue瀵硅薄')
+    }
+    fun(this)
+  },
+  getCurrentAction() {
+    if (this.currentReadonly) {
+      return ''
+    }
+    return '--' + (this.currentAction == this.const.ADD ? '鏂板' : '缂栬緫')
+  },
+  quickSearchKeyPress($event) {
+    //鏌ヨ瀛楁涓篿nput鏃讹紝鎸夊洖杞︽煡璇�
+    if ($event.keyCode == 13) {
+      // if (this.searchFormFields[this.singleSearch.field] != '') {
+      this.search()
+      //}
+    }
+  },
+  getButtons() {
+    //鐢熸垚ViewGrid鐣岄潰鐨勬搷浣滄寜閽強鏇村閫夐」
+    let searchIndex = this.buttons.findIndex((x) => {
+      return x.value == 'Search'
+    })
+    //娣诲姞楂樼骇鏌ヨ
+    let hasOneFormItem = this.searchFormOptions.length == 1 && this.searchFormOptions[0].length == 1
+    if (searchIndex != -1 && !hasOneFormItem) {
+      this.buttons.splice(searchIndex + 1, 0, {
+        icon: this.fiexdSearchForm ? 'el-icon-refresh-left' : 'el-icon-search',
+        name: this.fiexdSearchForm ? '閲嶇疆' : '楂樼骇鏌ヨ',
+        plain: true,
+        type: this.buttons[searchIndex].type,
+        onClick: () => {
+          if (this.fiexdSearchForm) {
+            return this.resetSearch()
+          }
+          this.searchBoxShow = !this.searchBoxShow
+        }
+      })
+    }
+    if (hasOneFormItem) {
+      this.fiexdSearchForm = false
+    }
+    this.maxBtnLength += searchIndex == -1 ? 0 : 1
+    // if (this.buttons.length <= this.maxBtnLength) {
+    //   return this.buttons;
+    // }
+    // let btns = this.buttons.slice(0, this.maxBtnLength);
+    // btns[this.maxBtnLength - 1].last = true;
+    // return btns;
+  },
+  extendBtn(btns, source) {
+    //btns鏉冮檺鎸夐挳锛宻ource涓烘墿灞曟寜閽�
+    if (!btns || !(source && source instanceof Array)) {
+      return
+    }
+    //source閫氳繃鍦ㄨ〃鐨勬墿灞昷s鏂囦欢涓璪uttons瀵瑰簲鎸夐挳鐨勫睘鎬ndex鍐冲畾鎸夐挳鎵�鏀句綅缃�
+    source.forEach((x) => {
+      //閫氳繃鎸夐挳鐨処ndex灞炴�э紝鏀惧埌鎸囧畾鐨勪綅缃�
+      btns.splice(x.index == undefined ? btns.length : x.index, 0, x)
+    })
+    // if (this.extend.buttons.view) {
+    //     this.extend.buttons.view.forEach((x) => {
+    //         //閫氳繃鎸夐挳鐨処ndex灞炴�э紝鏀惧埌鎸囧畾鐨勪綅缃�
+    //         this.buttons.splice(x.index == undefined ? this.buttons.length : x.index, 0, x);
+    //     })
+    // }
+  },
+  initBoxButtons() {
+    //鍒濆鍖朧iewGird涓庡脊鍑烘/鏄庣粏琛ㄦ寜閽�
+    let path = this.$route.path
+    //閫氳繃鑿滃崟鑾峰彇鐢ㄦ埛鎵�瀵瑰簲鑿滃崟闇�瑕佹樉绀虹殑鎸夐挳
+    let permissionButtons = this.permission.getButtons(
+      path,
+      null,
+      this.extend.tableAction,
+      this.table.name
+    )
+    if (permissionButtons) {
+      //2020.03.31娣诲姞娣辨嫹璐濇寜閽粍
+      permissionButtons.forEach((p) => {
+        let _obj = {}
+        for (const key in p) {
+          _obj[key] = p[key]
+        }
+        this.buttons.push(_obj)
+      })
+      // this.buttons.push(...permissionButtons);
+    }
+    if (!this.extend) {
+      this.extend = {}
+    }
+    if (!this.extend.buttons) {
+      this.extend.buttons = {}
+    }
+    //鏌ヨ鐣岄潰鎵╁睍鎸夐挳(鎵╁睍鎸夐挳鍙嚜琛岄�氳繃璁剧疆鎸夐挳鐨処ndex灞炴�ф樉绀哄埌鍏蜂綋浣嶇疆)
+    if (this.extend.buttons.view) {
+      this.extendBtn(this.buttons, this.extend.buttons.view)
+    }
+
+    //寮瑰嚭妗嗘寜閽�
+    let boxButtons = []
+
+    let saveBtn = this.buttons.some((x) => {
+      if (
+        x.value &&
+        (x.value.toLowerCase() == this.const.ADD.toLowerCase() ||
+          x.value.toLowerCase() == this.const.EDIT.toLowerCase())
+      )
+        return true
+    })
+    this.currentReadonly = !saveBtn
+    //浠庤〃琛ㄦ牸鎿嶄綔鎸夐挳
+    let detailGridButtons = {
+      name: '鍒锋柊',
+      type: 'info',
+      icon: 'el-icon-refresh',
+      onClick() {
+        //濡傛灉鏄庣粏琛ㄥ綋鍓嶇殑鐘舵�佷负鏂板缓鏃讹紝绂佹鍒锋柊
+        if (this.currentAction == this.const.ADD) {
+          return
+        }
+        this.refreshRow()
+      }
+    }
+
+    let importExcel = this.buttons.some((x) => {
+      if (x.value == this.const.IMPORT) return true
+    })
+    //濡傛灉鏈夊鍏ユ潈闄�,鍒欓渶瑕佸垵濮嬪寲瀵煎叆缁勪欢
+    if (importExcel) {
+      this.upload.url = this.getUrl(this.const.IMPORT)
+      //瀹氫箟涓嬭浇妯℃澘鐨勬枃浠跺悕
+      this.upload.template.fileName = this.table.cnName
+      //瀹氫箟涓嬭浇妯℃澘鐨刄rl璺緞
+      this.upload.template.url =
+        this.http.ipAddress + this.getUrl(this.const.DOWNLOADTEMPLATE, true)
+    }
+
+    // disabled
+    //濡傛灉褰撳墠瑙掕壊娌℃湁缂栬緫鎴栨柊寤哄姛鑳斤紝鏌ョ湅鏄庣粏鏃跺瓧娈佃缃叏閮ㄥ彧璇�
+    //鍙湁鏄庣粏琛紝灏嗘槑缁嗚〃涔熻缃负涓嶅彲鑳界紪杈戯紝骞朵笖涓嶆樉绀烘坊鍔犺銆佸垹闄よ
+    if (!saveBtn) {
+      this.editFormOptions.forEach((row) => {
+        row.forEach((x) => {
+          x.disabled = true
+        })
+      })
+      //娌℃湁鏂板缂栬緫鏉冮檺鐨勶紝寮瑰嚭妗嗛兘璁剧疆涓哄彧璇�
+      this.detail.columns.forEach((column) => {
+        if (column.hasOwnProperty('edit')) {
+          column.readonly = true
+          // row['edit'] = false;
+        }
+      })
+      //寮瑰嚭妗嗘墿灞曟寜閽�
+      this.extendBtn(boxButtons, this.extend.buttons.box)
+      //寮瑰嚭寮规鎸夐挳(2020.04.21),娌℃湁缂栬緫鎴栨柊寤烘潈闄愭椂锛屼篃鍙互閫氳繃buttons灞炴�ф坊鍔犺嚜瀹氫箟寮瑰嚭妗嗘寜閽�
+      this.boxButtons.push(...boxButtons)
+      this.detailOptions.buttons.push(detailGridButtons)
+      this.detailOptions.buttons.forEach((button) => {
+        if (!button.hasOwnProperty('hidden')) {
+          button.hidden = false
+        }
+      })
+      //寮瑰嚭妗嗘墿灞曟槑缁嗚〃鎸夐挳
+      this.extendBtn(this.detailOptions.buttons, this.extend.buttons.detail)
+
+      return boxButtons
+    }
+
+    this.detailOptions.edit = true
+    boxButtons.push(
+      ...[
+        {
+          name: '淇� 瀛�',
+          icon: 'el-icon-check',
+          type: 'danger',
+          disabled: false,
+          value: 'save',
+          onClick() {
+            this.save()
+          }
+        }
+        // {
+        //   name: '閲� 缃�',
+        //   icon: 'el-icon-refresh-right',
+        //   type: 'primary',
+        //   disabled: false,
+        //   onClick() {
+        //     this.resetEdit();
+        //   }
+        // }
+      ]
+    )
+    //浠庤〃琛ㄦ牸鎿嶄綔鎸夐挳
+    this.detailOptions.buttons.push(
+      ...[
+        {
+          name: '娣诲姞琛�',
+          icon: 'el-icon-plus',
+          type: 'primary',
+          hidden: false,
+          plain: true,
+          onClick() {
+            this.addRow()
+          }
+        },
+        {
+          type: 'danger',
+          plain: true,
+          name: '鍒犻櫎琛�',
+          hidden: false,
+          icon: 'el-icon-delete',
+          onClick() {
+            this.delRow()
+          }
+        },
+        //2022.01.08澧炲姞鏄庣粏琛ㄥ鍏ュ鍑哄姛鑳�
+        //娉ㄦ剰闇�瑕侀噸鍐欏悗鍙版槑缁嗚〃鎺ュ彛鐨勫鍏ヤ笌涓嬭浇妯℃澘銆佸鍑虹殑鏉冮檺,Sys_DictionaryListController.cs/SellOrderListController.cs
+        {
+          type: 'danger',
+          plain: true,
+          name: '瀵煎叆',
+          value: 'import',
+          hidden: false,
+          icon: 'el-icon-upload2',
+          onClick() {
+            this.upload.url = `${this.http.ipAddress}api/${this.detail.table}/${this.const.IMPORT}?table=1`
+            this.upload.template.url = `${this.http.ipAddress}api/${this.detail.table}/${this.const.DOWNLOADTEMPLATE}`
+            //瀹氫箟涓嬭浇妯℃澘鐨勬枃浠跺悕
+            this.upload.template.fileName = this.detail.cnName
+            this.upload.excel = true
+          }
+        },
+        {
+          type: 'danger',
+          plain: true,
+          name: '瀵煎嚭',
+          value: 'export',
+          icon: 'el-icon-download',
+          hidden: false,
+          onClick() {
+            this.export(true)
+          }
+        }
+      ]
+    )
+    this.detailOptions.buttons.forEach((button) => {
+      if (button.hasOwnProperty('hidden')) {
+        button.hidden = false
+      }
+    })
+    //寮瑰嚭妗嗘墿灞曟寜閽�
+    this.extendBtn(boxButtons, this.extend.buttons.box)
+
+    //寮瑰嚭妗嗘墿灞曟槑缁嗚〃鎸夐挳
+    this.detailOptions.buttons.push(detailGridButtons)
+    this.extendBtn(this.detailOptions.buttons, this.extend.buttons.detail)
+
+    //寮瑰嚭寮规鎸夐挳
+    this.boxButtons.push(...boxButtons)
+  },
+  onClick(click) {
+    click.apply(this)
+  },
+  changeDropdown(btnName, v1) {
+    let button = this.buttons.filter((x) => {
+      return x.name == btnName
+    })
+    if (button && button.length > 0) {
+      button[0].onClick.apply(this)
+    }
+  },
+  emptyValue(value) {
+    if (typeof value == 'string' && value.trim() === '') {
+      return true
+    }
+    if (value instanceof Array && !value.length) {
+      return true
+    }
+    return value === null || value === undefined || value === ''
+  },
+  getSearchParameters() {
+    //鑾峰彇鏌ヨ鍙傛暟
+    // 2020.09.11澧炲姞鍥哄畾鏌ヨ琛ㄥ崟,濡傛灉璁剧疆鍥哄畾浜嗘煡璇㈣〃鍗曪紝鐐瑰嚮鏌ヨ鏃讹紝涓嶅啀鍏抽棴
+    if (!this.fiexdSearchForm) {
+      this.searchBoxShow = false
+    }
+
+    let query = { wheres: [] }
+    for (const key in this.searchFormFields) {
+      let value = this.searchFormFields[key]
+      if (this.emptyValue(value)) continue
+
+      if (typeof value == 'number') {
+        value = value + ''
+      }
+      let displayType = this.getSearchItem(key)
+
+      //鑱旂骇鍙繚鐣欓�変腑鑺傜偣鐨勬渶鍚庝竴涓��
+      if (displayType == 'cascader') {
+        //鏌ヨ涓嬮潰鎵�鏈夌殑瀛愯妭鐐癸紝濡傦細閫変腑鐨勬槸鐖惰妭鐐癸紝搴旇鏌ヨ涓嬮潰鎵�鏈夌殑鑺傜偣鏁版嵁--寰呭畬
+        value = value.length ? value[value.length - 1] + '' : ''
+      } else if (displayType == 'treeSelect') {
+        displayType = 'selectList'
+      }
+      //2021.05.02澧炲姞鍖洪棿鏌ヨ
+      if (typeof value == 'string' || ['date', 'datetime', 'range'].indexOf(displayType) == -1) {
+        query.wheres.push({
+          name: key,
+          value: typeof value == 'string' ? (value + '').trim() : value.join(','),
+          displayType: displayType
+        })
+        continue
+      }
+      for (let index = 0; index < value.length; index++) {
+        if (!this.emptyValue(value[index])) {
+          query.wheres.push({
+            name: key,
+            value: (value[index] + '').trim(),
+            displayType: (() => {
+              if (['date', 'datetime', 'range'].indexOf(displayType) != -1) {
+                return index ? 'lessorequal' : 'thanorequal'
+              }
+              return displayType
+            })()
+          })
+        }
+      }
+    }
+    return query
+  },
+  search() {
+    //鏌ヨ
+    // let query = this.getSearchParameters();
+    // this.$refs.table.load(query, true);
+    this.$refs.table.load(null, true)
+  },
+  loadTableBefore(param, callBack) {
+    //鏌ヨ鍓嶈缃煡璇㈡潯浠跺強鍒嗛〉淇℃伅
+    let query = this.getSearchParameters()
+    if (query) {
+      param = Object.assign(param, query)
+    }
+
+    if (this.$route.query.viewflow && this.$route.query.id) {
+      param.wheres.push({
+        name: this.table.key,
+        value: this.$route.query.id
+      })
+    }
+    // if (this.isViewFlow() && data && data.length) {
+    //   let query = JSON.parse(JSON.stringify(this.$route.query));
+    //   query.viewflow = 0;
+    //   this.$router.replace({ path: this.$route.path, query: query });
+    //   this.$nextTick(() => {
+    //     this.getWorkFlowSteps(data[0]);
+    //   });
+    // }
+    let status = this.searchBefore(param)
+    callBack(status)
+  },
+
+  loadTableAfter(data, callBack, result) {
+    //鏌ヨ鍚�
+    //2020.10.30澧炲姞鏌ヨ鍚庤繑鍥炴墍鏈夌殑鏌ヨ淇℃伅
+    let status = this.searchAfter(data, result)
+    callBack(status)
+    //鑷姩寮瑰嚭妗嗗鎵硅鎯�
+  },
+  loadDetailTableBefore(param, callBack, data) {
+    //鏄庣粏鏌ヨ鍓�
+    //鏂板缓鏃剁姝㈠姞杞芥槑缁�
+    if (this.currentAction == this.const.ADD) {
+      callBack(false)
+      return false
+    }
+    let status = this.searchDetailBefore(param, data)
+    callBack(status)
+  },
+  loadDetailTableAfter(data, callBack, result) {
+    //鏄庣粏鏌ヨ鍚�
+    let status = this.searchDetailAfter(data, result)
+    callBack(status)
+  },
+  getSearchItem(field) {
+    //鑾峰彇鏌ヨ鐨勫弬鏁�
+    let data
+    for (let index = 0; index < this.searchFormOptions.length; index++) {
+      if (data) return data.type
+      const item = this.searchFormOptions[index]
+      data = item.find((x) => {
+        return x.field == field
+      })
+    }
+
+    return (data || {}).type
+  },
+  resetSearch() {
+    //閲嶇疆鏌ヨ瀵硅薄
+    this.resetSearchForm()
+    //2020.10.17澧炲姞閲嶇疆鍚庢柟娉�
+    this.resetSearchFormAfter && this.resetSearchFormAfter()
+  },
+  resetEdit() {
+    //閲嶇疆缂栬緫鐨勬暟鎹�
+    let isEdit = this.currentAction != this.const.ADD
+    //閲嶇疆涔嬪墠
+    if (!this[isEdit ? 'resetUpdateFormBefore' : 'resetAddFormBefore']()) {
+      return
+    }
+    let objKey = {}
+    //缂栬緫鐘舵�佷笅,涓嶉渶瑕侀噸缃富閿�,鍒涘缓鏃堕棿鍒涘缓浜�
+    if (isEdit) {
+      objKey[this.table.key] = this.editFormFields[this.table.key]
+    }
+    this.resetEditForm(objKey)
+    //閲嶇疆涔嬪悗
+
+    if (!this[isEdit ? 'resetUpdateFormAfter' : 'resetAddFormAfter']()) {
+      return
+    }
+  },
+  resetSearchForm(sourceObj) {
+    //閲嶇疆鏌ヨ琛�
+    this.resetForm('searchForm', sourceObj)
+  },
+  resetEditForm(sourceObj) {
+    if (this.hasDetail && this.$refs.detail) {
+      // this.$refs.detail.rowData.splice(0);
+      this.$refs.detail.reset()
+    }
+    this.resetForm('form', sourceObj)
+    if (this.$refs.form && this.$refs.form.$refs.volform) {
+      setTimeout(() => {
+        this.$refs.form.$refs.volform.clearValidate()
+      }, 100)
+    }
+  },
+  getKeyValueType(formData, isEditForm) {
+    try {
+      let keyLeft = (isEditForm ? 'e' : 's') + '_b_'
+      formData.forEach((item) => {
+        item.forEach((x) => {
+          if (this.keyValueType.hasOwnProperty(keyLeft + x.field)) {
+            return true
+          }
+          let data
+          if (x.type == 'switch') {
+            this.keyValueType[x.field] = 1
+          } else if (x.bind && x.bind.data) {
+            data = x.bind.data
+          } else if (x.data) {
+            if (x.data instanceof Array) {
+              data = x.data
+            } else if (x.data.data && x.data.data instanceof Array) {
+              data = x.data.data
+            }
+          }
+          if (data && data.length > 0) {
+            if (!this.keyValueType.hasOwnProperty(x.field)) {
+              this.keyValueType[x.field] = data[0].key
+            }
+            if (!this.keyValueType.hasOwnProperty(keyLeft + x.field)) {
+              this.keyValueType[keyLeft + x.field] = x.type
+            }
+          }
+        })
+      })
+    } catch (error) {
+      console.log(error.message)
+    }
+  },
+  resetForm(formName, sourceObj) {
+    //   return;
+    //閲嶇疆琛ㄥ崟鏁版嵁
+    if (this.$refs[formName]) {
+      this.$refs[formName].reset()
+    }
+
+    if (!sourceObj) return
+    let form, keyLeft
+    if (formName == 'searchForm') {
+      form = this.searchFormFields
+      keyLeft = 's' + '_b_'
+    } else {
+      form = this.editFormFields
+      keyLeft = 'e' + '_b_'
+    }
+    //鑾峰彇鏁版嵁婧愮殑data绫诲瀷锛屽惁鍒欏鏋滄暟鎹簮data鐨刱ey鏄暟瀛楋紝閲嶇疆鐨勫�兼槸瀛楃涓插氨鏃犳硶缁戝畾鍊�
+    if (!this.keyValueType._dinit) {
+      this.getKeyValueType(this.editFormOptions, true)
+      this.getKeyValueType(this.searchFormOptions, false)
+      this.keyValueType._dinit = true
+    }
+    var _cascaderParentTree
+    for (const key in form) {
+      if (sourceObj.hasOwnProperty(key)) {
+        let newVal = sourceObj[key]
+        let kv_type = this.keyValueType[keyLeft + key]
+
+        if (
+          kv_type == 'selectList' ||
+          kv_type == 'checkbox' ||
+          kv_type == 'cascader' ||
+          kv_type == 'treeSelect'
+        ) {
+          // 2020.05.31澧炲姞iview缁勪欢Cascader
+          // 2020.11.01澧炲姞iview缁勪欢Cascader琛ㄥ崟閲嶇疆鏃舵煡璇㈡墍鏈夌殑鐖惰妭鐐�
+          if (kv_type == 'cascader' || kv_type == 'treeSelect') {
+            var treeDic = this.dicKeys.find((dic) => {
+              return dic.fileds && dic.fileds.indexOf(key) != -1
+            })
+
+            if (treeDic && treeDic.orginData && treeDic.orginData.length) {
+              let keyIsNum = typeof treeDic.orginData[0].id == 'number'
+
+              if (kv_type == 'cascader') {
+                newVal = keyIsNum ? newVal * 1 || 0 : newVal + ''
+                if (kv_type == 'cascader') {
+                  _cascaderParentTree = this.base.getTreeAllParent(newVal, treeDic.orginData)
+                  if (_cascaderParentTree) {
+                    newVal = _cascaderParentTree.map((x) => {
+                      return x.id
+                    })
+                  }
+                }
+              } else {
+                if (newVal === null || newVal === undefined) {
+                  newVal = []
+                } else if (typeof newVal == 'string') {
+                  newVal = newVal.split(',')
+                }
+                if (keyIsNum) {
+                  if (Array.isArray(newVal)) {
+                    newVal = newVal.map((x) => {
+                      return x * 1 || 0
+                    })
+                  }
+                } else if (typeof newVal == 'number') {
+                  newVal = [newVal + '']
+                }
+              }
+            } else {
+              newVal = [newVal]
+            }
+          } else if (typeof newVal == 'number') {
+            newVal = [newVal + '']
+            this.$message.error(`澶氶�夋椂鏁版嵁搴撳瓧娈礫${key}]蹇呴』鏄瓧绗︿覆绫诲瀷`)
+          } else if (newVal != '' && newVal != undefined && typeof newVal == 'string') {
+            newVal = newVal.split(',')
+          } else {
+            //if (kv_type == 'checkbox') {
+            newVal = []
+          }
+        } else if (
+          this.keyValueType.hasOwnProperty(key) &&
+          typeof this.keyValueType[key] == 'number' &&
+          newVal * 1 == newVal
+        ) {
+          newVal = newVal * 1
+        } else {
+          if (newVal == null || newVal == undefined) {
+            newVal = ''
+          } else if (this.numberFields.indexOf(key) != -1) {
+            newVal = newVal * 1 || 0
+          } else {
+            newVal += ''
+          }
+        }
+        if (newVal instanceof Array) {
+          if (form[key]) {
+            form[key] = []
+          }
+          form[key] = newVal
+        } else {
+          form[key] = newVal
+        }
+      } else {
+        form[key] = form[key] instanceof Array ? [] : ''
+      }
+    }
+  },
+  onBtnClick(param) {
+    this[param.method](param.data)
+  },
+  refresh() {
+    //鍒锋柊
+    this.search()
+    // this.$refs.table.load();
+  },
+  saveBefore(formData) {
+    return true
+  },
+  saveAfter(formData, result) {
+    return true
+  },
+  save() {
+    //鏂板鎴栫紪杈戞椂淇濆瓨
+    // if (!this.$refs.form.validate()) return;
+    this.$refs.form.validate((result) => {
+      if (result) {
+        this.saveExecute()
+      }
+    })
+  },
+  async saveExecute() {
+    let editFormFields = {}
+    //涓婁紶鏂囦欢浠ラ�楀彿闅斿紑
+    for (const key in this.editFormFields) {
+      if (
+        this.uploadfiled &&
+        this.uploadfiled.length > 0 &&
+        this.uploadfiled.indexOf(key) != -1 &&
+        this.editFormFields[key] instanceof Array
+      ) {
+        let allPath = this.editFormFields[key].map((x) => {
+          return x.path
+        })
+        editFormFields[key] = allPath.join(',')
+      } else if (typeof this.editFormFields[key] == 'function') {
+        try {
+          editFormFields[key] = this.editFormFields[key]()
+        } catch (error) {}
+      } else {
+        //2021.05.30淇涓嬫媺妗嗘竻闄ゆ暟鎹悗鍚庡彴涓嶈兘淇濆瓨鐨勯棶棰�
+        if (
+          this.editFormFields[key] === undefined &&
+          this.dicKeys.some((x) => {
+            return x.fileds && x.fileds.indexOf(key) != -1
+          })
+        ) {
+          editFormFields[key] = null
+        } else {
+          editFormFields[key] = this.editFormFields[key]
+        }
+      }
+    }
+    //灏嗘暟缁勮浆鎹㈡垚string
+    //2020.11.01澧炲姞绾ц仈澶勭悊
+    for (const key in editFormFields) {
+      if (editFormFields[key] instanceof Array) {
+        var iscascader = this.dicKeys.some((x) => {
+          return (
+            x.type == 'cascader' &&
+            x.e_type != 'treeSelect' &&
+            x.fileds &&
+            x.fileds.indexOf(key) != -1
+          )
+        })
+        if (iscascader && editFormFields[key].length) {
+          editFormFields[key] = editFormFields[key][editFormFields[key].length - 1]
+        } else {
+          editFormFields[key] = editFormFields[key].join(',')
+        }
+      }
+    }
+
+    let formData = {
+      mainData: editFormFields,
+      detailData: null,
+      delKeys: null
+    }
+
+    //鑾峰彇鏄庣粏鏁版嵁(鍓嶅彴鏁版嵁鏄庣粏鏈仛鏍¢獙锛屽緟瀹�.鍚庡彴宸茬粡鏍¢獙)
+    if (this.hasDetail) {
+      formData.detailData = this.$refs.detail.rowData
+      const types = ['selectList', 'cascader', 'treeSelect']
+      let _fields = this.detail.columns
+        .filter((c) => {
+          return types.indexOf(c.type) != -1 || types.indexOf(c.edit && c.edit.type) != -1
+        })
+        .map((c) => {
+          return c.field
+        })
+      //2022.06.20澧炲姞淇濆瓨鏃跺鏄庣粏琛ㄤ笅鎷夋澶氶�夌殑鍒ゆ柇
+      if (_fields.length) {
+        formData.detailData = JSON.parse(JSON.stringify(formData.detailData))
+        formData.detailData.forEach((row) => {
+          for (let index = 0; index < _fields.length; index++) {
+            const _field = _fields[index]
+            if (Array.isArray(row[_field])) {
+              row[_field] = row[_field].join(',')
+            }
+          }
+        })
+      }
+    }
+    if (this.detailOptions.delKeys.length > 0) {
+      formData.delKeys = this.detailOptions.delKeys
+    }
+    //淇濆瓨鍓嶆嫤鎴�
+    let _currentIsAdd = this.currentAction == this.const.ADD
+    if (_currentIsAdd) {
+      //2020.12.06澧炲姞鏂板缓鍓嶅紓姝ュ鐞嗘柟娉�
+      //2021.08.16淇寮傛璇硶鍐欓敊鐨勯棶棰�
+      if (!this.addBefore(formData) || !(await this.addBeforeAsync(formData))) return
+    } else {
+      //2020.12.06澧炲姞淇敼鍓嶅紓姝ュ鐞嗘柟娉�
+      if (!this.updateBefore(formData) || !(await this.updateBeforeAsync(formData))) return
+    }
+    let url = this.getUrl(this.currentAction)
+    this.http.post(url, formData, true).then((x) => {
+      //淇濆瓨鍚�
+      if (_currentIsAdd) {
+        if (!this.addAfter(x)) return
+        //杩炵画娣诲姞
+        if (this.continueAdd && x.status) {
+          this.$success(x.message)
+          //鏂板缓
+          this.currentAction = this.const.ADD
+          //2023.07.23澧炲姞杩炵画娣诲姞鍚庢柟娉�
+          let _formFields
+          if (this.continueAddAfter) {
+            _formFields = JSON.parse(JSON.stringify(this.editFormFields))
+          }
+          this.currentRow = {}
+          this.resetAdd()
+          this.refresh()
+          //2023.07.23澧炲姞杩炵画娣诲姞鍚庢柟娉�
+          this.continueAddAfter && this.continueAddAfter(_formFields, formData, x)
+          return
+        }
+      } else {
+        if (!this.updateAfter(x)) return
+      }
+      if (!x.status) return this.$error(x.message)
+      this.$success(x.message || '鎿嶄綔鎴愬姛')
+      //濡傛灉淇濆瓨鎴愬姛鍚庨渶瑕佸叧闂紪杈戞锛岀洿鎺ヨ繑鍥炰笉澶勭悊鍚庨潰
+      if (this.boxOptions.saveClose) {
+        this.boxModel = false
+        //2020.12.27濡傛灉鏄紪杈戜繚瀛樺悗涓嶉噸缃垎椤甸〉鏁帮紝鍒锋柊椤甸潰鏃惰繕鏄樉绀哄綋鍓嶉〉鐨勬暟鎹�
+        this.$refs.table.load(null, _currentIsAdd)
+        //this.refresh();
+        return
+      }
+      let resultRow
+      if (typeof x.data == 'string' && x.data != '') {
+        resultRow = JSON.parse(x.data)
+      } else {
+        resultRow = x.data
+      }
+
+      if (this.currentAction == this.const.ADD) {
+        //  this.currentRow=x.data;
+        this.editFormFields[this.table.key] = ''
+        this.currentAction = this.const.EDIT
+        this.currentRow = resultRow.data
+      }
+      this.resetEditForm(resultRow.data)
+      // console.log(resultRow);
+      if (this.hasDetail) {
+        this.detailOptions.delKeys = []
+        if (resultRow.list) {
+          this.$refs.detail.rowData.push(...resultRow.list)
+        }
+      }
+      this.$refs.table.load(null, _currentIsAdd)
+      // this.refresh();
+    })
+  },
+  async delBeforeAsync(delKeys, rows) {
+    return true
+  },
+  async del(rows) {
+    if (rows) {
+      if (!(rows instanceof Array)) {
+        rows = [rows]
+      }
+    } else {
+      rows = this.$refs.table.getSelected()
+    }
+    //鍒犻櫎鏁版嵁
+
+    if (!rows || rows.length == 0) return this.$error('璇烽�夋嫨瑕佸垹闄ょ殑琛�!')
+    let delKeys = rows.map((x) => {
+      return x[this.table.key]
+    })
+    if (!delKeys || delKeys.length == 0) return this.$error('娌℃湁鑾峰彇瑕佸垹闄ょ殑琛屾暟鎹�!')
+    //鍒犻櫎鍓�
+    if (!this.delBefore(delKeys, rows) || !(await this.delBeforeAsync(delKeys, rows))) {
+      return
+    }
+    let tigger = false
+    this.$confirm('纭瑕佸垹闄ら�夋嫨鐨勬暟鎹悧?', '璀﹀憡', {
+      confirmButtonText: '纭畾',
+      cancelButtonText: '鍙栨秷',
+      type: 'warning',
+      center: true
+    }).then(() => {
+      if (tigger) return
+      tigger = true
+      let url = this.getUrl(this.const.DEL)
+      this.http.post(url, delKeys, '姝e湪鍒犻櫎鏁版嵁....').then((x) => {
+        if (!x.status) return this.$error(x.message)
+        this.$success(x.message)
+        //鍒犻櫎鍚�
+        if (!this.delAfter(x)) {
+          return
+        }
+        this.refresh()
+      })
+    })
+  },
+  async modelOpenBeforeAsync(row) {
+    return true
+  },
+  async initBox() {
+    //2022.01.08澧炲姞鏂板缓鏃堕殣钘忔槑缁嗚〃瀵煎嚭鍔熻兘
+    this.detailOptions.buttons.forEach((x) => {
+      if (x.value == 'export') {
+        x.hidden = this.currentAction == 'Add'
+      }
+    })
+    //鍒濆鍖栨柊寤恒�佺紪杈戠殑寮瑰嚭妗�
+    if (!(await this.modelOpenBeforeAsync(this.currentRow))) return false
+    this.modelOpenBefore(this.currentRow)
+    if (!this.boxInit) {
+      this.boxInit = true
+      this.boxModel = true
+      // this.detailUrl = this.url;
+    }
+    return true
+  },
+  setEditForm(row) {
+    // if (this.remoteColumns.length == 0 || !rows || rows.length == 0) return;
+    let remoteColumns = this.$refs.table.remoteColumns
+    remoteColumns.forEach((column) => {
+      this.editFormOptions.forEach((option) => {
+        option.forEach((x) => {
+          if (x.field == column.field) {
+            x.data.data = Object.assign([], x.data, column.bind.data)
+          }
+        })
+      })
+    })
+    this.editFormFields
+    //閲嶇疆缂栬緫琛ㄥ崟鏁版嵁
+    this.editFormFields[this.table.key] = row[this.table.key]
+
+    this.resetEditForm(row)
+    this.currentAction = this.const.EDIT
+    this.boxModel = true
+  },
+  async linkData(row, column) {
+    this.boxOptions.title = this.table.cnName + '(缂栬緫)'
+    //鐐瑰嚮table鍗曞厓鏍煎揩鎹烽摼鎺ユ樉绀虹紪杈戞暟鎹�
+    this.currentAction = this.const.EDIT
+    this.currentRow = row
+    if (!(await this.initBox())) return
+    this.resetDetailTable(row)
+    this.setEditForm(row)
+    this.setContinueAdd(false)
+    //璁剧疆杩滅▼鏌ヨ琛ㄥ崟鐨勯粯璁ey/value
+    this.getRemoteFormDefaultKeyValue()
+    //鐐瑰嚮缂栬緫鎸夐挳寮瑰嚭妗嗗悗锛屽彲浠ュ湪姝ゅ鍐欓�昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+    this.modelOpenProcess(row)
+  },
+  setContinueAdd(isAdd) {
+    if (!this.continueAdd) return
+    var _button = this.boxButtons.find((x) => {
+      return x.value == 'save'
+    })
+    if (_button) {
+      _button.name = isAdd ? this.continueAddName : '淇� 瀛�'
+    }
+  },
+  resetAdd() {
+    if (this.hasDetail) {
+      this.$refs.detail &&
+        //  this.$refs.detail.rowData &&
+        this.$refs.detail.reset()
+    }
+    let obj = {}
+    //濡傛灉鏈塻witch鏍囩锛岄粯璁ら兘璁剧疆涓哄惁
+    this.editFormOptions.forEach((x) => {
+      x.forEach((item) => {
+        if (item.type == 'switch') {
+          obj[item.field] = 0
+        }
+      })
+    })
+    this.resetEditForm(obj)
+  },
+  async add() {
+    this.boxOptions.title = this.table.cnName + '(鏂板缓)'
+    //鏂板缓
+    this.currentAction = this.const.ADD
+    this.currentRow = {}
+    if (!(await this.initBox())) return
+
+    this.resetAdd()
+    this.setContinueAdd(true)
+    //  this.resetEditForm();
+    this.boxModel = true
+    //鐐瑰嚮鏂板缓鎸夐挳寮瑰嚭妗嗗悗锛屽彲浠ュ湪姝ゅ鍐欓�昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+    this.modelOpenProcess()
+    // this.modelOpenAfter();
+  },
+  async edit(rows) {
+    this.boxOptions.title = '缂栬緫'
+    //缂栬緫
+    this.currentAction = this.const.EDIT
+    if (rows) {
+      if (!(rows instanceof Array)) {
+        rows = [rows]
+      }
+    } else {
+      rows = this.$refs.table.getSelected()
+    }
+    if (rows.length == 0) {
+      return this.$error('璇烽�夋嫨瑕佺紪杈戠殑琛�!')
+    }
+    if (rows.length != 1) {
+      return this.$error('鍙兘閫夋嫨涓�琛屾暟鎹繘琛岀紪杈�!')
+    }
+    //璁板綍褰撳墠缂栬緫鐨勮
+    this.currentRow = rows[0]
+    //鍒濆鍖栧脊鍑烘
+    if (!(await this.initBox())) return
+    this.setContinueAdd(false)
+    //閲嶇疆琛ㄥ崟
+    this.resetDetailTable()
+
+    //璁剧疆褰撳墠鐨勬暟鎹埌琛ㄥ崟涓�
+    this.setEditForm(rows[0])
+    //璁剧疆杩滅▼鏌ヨ琛ㄥ崟鐨勯粯璁ey/value
+    this.getRemoteFormDefaultKeyValue()
+    //鐐瑰嚮缂栬緫鎸夐挳寮瑰嚭妗嗗悗锛屽彲浠ュ湪姝ゅ鍐欓�昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+    this.modelOpenProcess(rows[0])
+    // this.modelOpenAfter(rows[0]);
+  },
+  getRemoteFormDefaultKeyValue() {
+    //璁剧疆琛ㄥ崟杩滅▼鏁版嵁婧愮殑榛樿key.value
+    if (this.currentAction != this.const.EDIT || this.remoteKeys.length == 0) return
+    this.editFormOptions.forEach((x, xIndex) => {
+      x.forEach((item, yIndex) => {
+        if (item.remote) {
+          let column = this.columns.find((x) => {
+            return x.bind && x.bind.key == item.dataKey
+          })
+          if (!column) return
+          let key = this.currentRow[item.field]
+          let obj = column.bind.data.find((x) => {
+            return x.key == key
+          })
+          // obj ? obj.value : key濡傛灉娌℃湁鏌ュ埌鏁版嵁婧愶紝鐩存帴浣跨敤鍘熸暟鎹�
+          item.data = [{ key: key, value: obj ? obj.value : key }]
+          this.editFormOptions[xIndex].splice(yIndex, 1, item)
+          // this.$set(item, 'data', [{ key: key + '', value: obj.value }])
+          //  item.data = [{ key: key + '', value: obj.value }];
+        }
+      })
+    })
+  },
+  modelOpenProcess(row) {
+    this.$nextTick(() => {
+      this.modelOpenAfter(row)
+    })
+    return
+    // if (!this.$refs.form) {
+    //     let timeOut = setTimeout(x => {
+    //         this.modelOpenAfter(row);
+    //     }, 500)
+    //     return;
+    // }
+    // this.modelOpenAfter(row);
+  },
+  import() {
+    //瀵煎叆(涓婁紶excel),寮瑰嚭瀵煎叆缁勪欢UploadExcel.vue
+    this.upload.excel = true
+    this.$refs.upload_excel && this.$refs.upload_excel.reset()
+  },
+  download(url, fileName) {
+    //涓嬭浇瀵煎嚭鐨勬枃浠�
+    let xmlResquest = new XMLHttpRequest()
+    xmlResquest.open('GET', url, true)
+    xmlResquest.setRequestHeader('Content-type', 'application/json')
+    xmlResquest.setRequestHeader('Authorization', this.$store.getters.getToken())
+    let elink = this.$refs.export
+    xmlResquest.responseType = 'blob'
+    xmlResquest.onload = function (oEvent) {
+      if (xmlResquest.status != 200) {
+        this.$error('涓嬭浇鏂囦欢鍑洪敊浜�..')
+        return
+      }
+      let content = xmlResquest.response
+      //  let elink = this.$refs.export;//document.createElement("a");
+      elink.download = fileName //+".xlsx";
+      // elink.style.display = "none";
+      let blob = new Blob([content])
+      elink.href = URL.createObjectURL(blob)
+      //  document.body.appendChild(elink);
+      elink.click()
+      //  document.body.removeChild(elink);
+    }
+    xmlResquest.send()
+  },
+  getFileName(isDetail) {
+    //2021.01.08澧炲姞瀵煎嚭excel鏃惰嚜瀹氫箟鏂囦欢鍚�
+    if (isDetail) {
+      return this.detail.cnName + '.xlsx'
+    }
+    return this.table.cnName + '.xlsx'
+  },
+  export(isDetail) {
+    //瀵煎嚭
+    let url, query, param
+    if (isDetail) {
+      //鏄庣粏琛ㄥ鍑烘椂濡傛灉鏄柊寤虹姸鎬侊紝绂佹瀵煎嚭
+      if (this.currentAction == 'Add') {
+        return
+      }
+      url = `api/${this.detail.table}/${this.const.EXPORT}`
+      param = {
+        wheres: [{ name: this.table.key, value: this.editFormFields[this.table.key] }]
+      }
+    } else {
+      //涓昏〃瀵煎嚭
+      url = this.getUrl(this.const.EXPORT)
+      query = this.getSearchParameters()
+      param = { order: this.pagination.order, wheres: query.wheres || [] }
+    }
+    //2020.06.25澧炲姞瀵煎嚭鍓嶅鐞�
+    if (!isDetail && !this.exportBefore(param)) {
+      return
+    }
+    if (
+      !param.wheres.some((x) => {
+        return x.name == this.table.key
+      })
+    ) {
+      let ids = this.getSelectRows()
+        .map((x) => {
+          return x[this.table.key]
+        })
+        .join(',')
+      //2024.01.13澧炲姞榛樿瀵煎嚭鍕鹃�夌殑鏁版嵁
+      if (ids) {
+        param.wheres.push({
+          name: this.table.key,
+          value: ids,
+          displayType: 'selectList'
+        })
+      }
+    }
+    if (param.wheres && typeof param.wheres == 'object') {
+      param.wheres = JSON.stringify(param.wheres)
+    }
+    let $http = this.http
+    //2022.09.26澧炲姞鑷畾涔夊鍑烘枃浠跺悕
+    let fileName = this.downloadFileName || this.getFileName(isDetail)
+    //2021.01.08浼樺寲瀵煎嚭鍔熻兘
+    $http.post(url, param, '姝e湪瀵煎嚭鏁版嵁....', { responseType: 'blob' }).then((content) => {
+      const blob = new Blob([content])
+      if ('download' in document.createElement('a')) {
+        // 闈濱E涓嬭浇
+        const elink = document.createElement('a')
+        elink.download = fileName
+        elink.style.display = 'none'
+        elink.href = URL.createObjectURL(blob)
+        document.body.appendChild(elink)
+        elink.click()
+        URL.revokeObjectURL(elink.href)
+        document.body.removeChild(elink)
+      } else {
+        // IE10+涓嬭浇
+        navigator.msSaveBlob(blob, fileName)
+      }
+    })
+    //.then(result => {
+    // if (!result.status) {
+    //   return this.$error(result.message);
+    // }
+    // let path = this.getUrl(this.const.DOWNLOAD);
+    // path = path[0] == "/" ? path.substring(1) : path;
+    // this.download(
+    //   $http.ipAddress + path + "?path=" + result.data,
+    //   this.table.cnName + ".xlsx" // filePath
+    // );
+    ///  window.open($http.ipAddress + path + "?fileName=" + filePath, "_self");
+    // });
+  },
+  getSelectRows() {
+    //鑾峰彇閫変腑鐨勮
+    return this.$refs.table.getSelected()
+  },
+  getDetailSelectRows() {
+    //鎴栬幏鍙栨槑缁嗛�変腑鐨勮
+    if (!this.$refs.detail) {
+      return []
+    }
+    return this.$refs.detail.getSelected()
+  },
+  audit() {
+    //瀹℃牳寮瑰嚭妗�
+    let rows = this.$refs.table.getSelected()
+    if (rows.length == 0) return this.$error('璇烽�夋嫨瑕佸鏍哥殑琛�!')
+    let auditStatus = Object.keys(rows[0]).find((x) => {
+      return x.toLowerCase() === 'auditstatus'
+    })
+    if (!auditStatus) {
+      return this.$message.error(`琛ㄥ繀椤诲寘鎷鏍稿瓧娈点�怉uditStatus銆�,骞朵笖鏄痠nt绫诲瀷`)
+    }
+    // let checkStatus = rows.every((x) => {
+    //   return this.$global.audit.status.some(c => { return c === x[auditStatus] || !x[auditStatus] })
+    // });
+    // if (!checkStatus) return this.$error('鍙兘閫夋嫨寰呭鎵规垨瀹℃牳涓殑鏁版嵁!');
+    this.$refs.audit.open(rows)
+  },
+  saveAudit(params, rows, callback) {
+    //淇濆瓨瀹℃牳
+    let keys = rows.map((x) => {
+      return x[this.table.key]
+    })
+    if (!this.auditBefore(keys, rows)) {
+      return
+    }
+    let url = `${this.getUrl(this.const.AUDIT)}?auditReason=${params.reason}&auditStatus=${
+      params.value
+    }`
+    this.http.post(url, keys, '瀹℃牳涓�....').then((x) => {
+      if (!this.auditAfter(x, keys)) {
+        return
+      }
+      if (!x.status) return this.$error(x.message)
+
+      callback && callback(x)
+      this.$success(x.message)
+      this.refresh()
+    })
+  },
+  viewModelCancel() {
+    //鏌ョ湅琛ㄧ粨鏋�
+    this.viewModel = false
+  },
+  initFormOptions(formOptions, keys, formFields, isEdit) {
+    //鍒濆鍖栨煡璇€�佺紪杈戝璞$殑涓嬫媺妗嗘暟鎹簮銆佸浘鐗囦笂浼犻摼鎺ュ湴鍧�
+    //let defaultOption = { key: "", value: "璇烽�夋嫨" };
+    //鏈変笂浼犵殑瀛楁
+    //2020.05.03鏂板
+    //缂栬緫鏁版嵁婧愮殑绫诲瀷
+    formOptions.forEach((item) => {
+      item.forEach((d) => {
+        if (d.type == 'number') {
+          //2022.08.22浼樺寲琛ㄥ崟绫诲瀷涓簄umber鏃剁殑榛樿鍊�
+          if (formFields[d.field] === '') {
+            formFields[d.field] = undefined
+          }
+          this.numberFields.push(d.field)
+        }
+        if (d.type == 'img' || d.type == 'excel' || d.type == 'file' || d.columnType == 'img') {
+          d.url = this.http.ipAddress + 'api' + this.table.url + 'Upload'
+          this.uploadfiled.push(d.field)
+        }
+        if (!d.dataKey) return true
+        //2022.02.20寮哄埗寮�鍚仈绾у彲浠ラ�夋嫨鏌愪釜鑺傜偣
+        if (d.type == 'cascader' && !d.hasOwnProperty('changeOnSelect')) {
+          //寮哄埗寮�鍚仈绾у彲浠ラ�夋嫨鏌愪釜鑺傜偣
+          d.changeOnSelect = true
+        }
+        //寮�鍚繙绋嬫悳绱�
+        if (d.remote) {
+          this.remoteKeys.push(d.dataKey)
+          d.data = [] //{ dicNo: d.dataKey, data: [] };
+          return true
+        }
+        //2020.05.03澧炲姞缂栬緫琛ㄥ崟瀵筩heckbox鐨勬敮鎸�
+        if (d.type == 'checkbox' && !(formFields[d.field] instanceof Array)) {
+          formFields[d.field] = []
+        }
+        if (keys.indexOf(d.dataKey) == -1) {
+          //2020.05.03澧炲姞璁板綍缂栬緫瀛楁鐨勬暟鎹簮绫诲瀷
+
+          keys.push(d.dataKey)
+          //2020.05.03淇鏌ヨ琛ㄥ崟涓庣紪杈戣〃鍗晅ype绫诲瀷鍙樻垚寮轰竴鑷存�х殑闂
+          //this.dicKeys.push({ dicNo: d.dataKey, data: [], type: d.type });
+          //  2020.11.01澧炲姞iview缁勪欢Cascader鏁版嵁婧愬瓨鍌�
+          let _dic = {
+            dicNo: d.dataKey,
+            data: [],
+            fileds: [d.field],
+            orginData: []
+          }
+          if (d.type == 'cascader') {
+            _dic.type = 'cascader'
+          }
+          if (isEdit) {
+            _dic['e_type'] = d.type
+          }
+          this.dicKeys.push(_dic)
+        } else if (d.type == 'cascader') {
+          this.dicKeys.forEach((x) => {
+            if (x.dicNo == d.dataKey) {
+              x.type = 'cascader'
+              x.fileds.push(d.field)
+            }
+          })
+        }
+        if (d.type != 'cascader') {
+          //2020.01.30绉婚櫎鍐呴儴琛ㄥ崟formOptions鏁版嵁婧愰厤缃牸寮廳ata.data锛屾墍鏈夊弬鏁版敼涓轰笌缁勪欢api鏍煎紡鐩稿悓
+          Object.assign(
+            d,
+            this.dicKeys.filter((f) => {
+              return f.dicNo == d.dataKey
+            })[0],
+            { type: d.type }
+          )
+        }
+      })
+    })
+  },
+  //鍒濆table涓庢槑缁嗚〃鐨勬暟鎹簮鎸囧悜dicKeys瀵硅薄锛屽啀鍘诲悗鍙板姞杞芥暟鎹簮
+  initColumns(scoure, dicKeys, keys) {
+    if (!scoure || !(scoure instanceof Array)) return
+    scoure.forEach((item) => {
+      if (!item.bind || (item.bind.data && item.bind.data.length > 0)) return true
+      let key = item.bind.key || item.bind.dicNo
+      if (this.remoteKeys.indexOf(key) != -1) {
+        item.bind.remote = true
+        return true
+      }
+      if (this.hasKeyField.indexOf(item.field) == -1) {
+        this.hasKeyField.push(item.field)
+      }
+      var dic = dicKeys.filter((x) => {
+        return x.dicNo == key
+      })
+      if (!dic || dic.length == 0) {
+        dicKeys.push({ dicNo: key, data: [], type: item.edit ? item.edit.type : null })
+        dic = [dicKeys[dicKeys.length - 1]]
+        keys.push(key)
+      }
+      //2020.11.01澧炲姞绾ц仈澶勭悊
+      if (dic[0].type == 'cascader' || dic[0].type == 'treeSelect') {
+        if (!dic[0].orginData) {
+          dic[0].orginData = []
+        }
+        if (!dic[0].data) {
+          dic[0].data = []
+        }
+        item.bind = { data: dic[0].data, orginData: dic[0].orginData, type: dic[0].type, key: key }
+        return
+      } else {
+        item.bind = dic[0]
+      }
+      //2020.05.03浼樺寲table鏁版嵁婧恈heckbox涓巗elect绫诲瀷浠庣紪杈戝垪涓�夊彇
+      item.bind.type = item.bind.e_type || 'string'
+    })
+  },
+  bindOptions(dic) {
+    //缁戝畾涓嬫媺妗嗙殑鏁版嵁婧�
+    //缁戝畾鍚庡彴鐨勫瓧鍏告暟鎹�
+    dic.forEach((d) => {
+      if (d.data.length >= (this.select2Count || 500)) {
+        if (
+          !this.dicKeys.some((x) => {
+            return x.dicNo == d.dicNo && (x.type == 'cascader' || x.type == 'treeSelect')
+          })
+        ) {
+          d.data.forEach((item) => {
+            item.label = item.value
+            item.value = item.key
+          })
+        }
+      }
+      this.dicKeys.forEach((x) => {
+        if (x.dicNo != d.dicNo) return true
+        //2020.10.26澧炲姞绾ц仈鏁版嵁婧愮粦瀹氬鐞�
+        if (x.type == 'cascader' || x.type == 'treeSelect') {
+          // x.data=d.data;
+          //鐢熸垚tree缁撴瀯
+          let _data = JSON.parse(JSON.stringify(d.data))
+          //2022.04.04澧炲姞绾ц仈瀛楀吀鏁版嵁婧愬埛鏂板悗table娌℃湁鍙樺寲鐨勯棶棰�
+          this.columns.forEach((column) => {
+            if (column.bind && column.bind.key == d.dicNo) {
+              column.bind.data = d.data
+            }
+          })
+          let arr = this.base.convertTree(_data, (node, data, isRoot) => {
+            if (!node.inited) {
+              node.inited = true
+              node.label = node.value
+              node.value = node.key
+            }
+          })
+          x.data.push(...arr)
+          x.orginData.push(...d.data)
+          //2021.10.17淇鏌ヨ绾ц仈涓嶈兘缁戝畾鏁版嵁婧愮殑闂
+          this.searchFormOptions.forEach((searhcOption) => {
+            searhcOption.forEach((_option) => {
+              if (_option.type == 'cascader' && _option.dataKey == x.dicNo) {
+                _option.data = arr
+                _option.orginData = d.data
+              }
+            })
+          })
+          //2021.10.17淇绾ц仈涓嶈兘浜岀骇鍒锋柊鐨勯棶棰�
+          this.editFormOptions.forEach((editOption) => {
+            editOption.forEach((_option) => {
+              if (
+                (_option.type == 'cascader' || _option.type == 'treeSelect') &&
+                _option.dataKey == x.dicNo
+              ) {
+                _option.data = arr
+                _option.orginData = d.data
+              }
+            })
+          })
+        } else if (d.data.length > 0 && !d.data[0].hasOwnProperty('key')) {
+          let source = d.data,
+            newSource = new Array(source.length)
+          for (let index = 0; index < source.length; index++) {
+            newSource[index] = {
+              //榛樿浠庡瓧鍏告暟鎹鍑烘潵鐨刱ey閮芥槸string绫诲瀷,浣嗗鏋滄暟鎹粠sql涓煡璇㈢殑鍙兘涓洪潪string,鍚︽槸async-validator闇�瑕侀噸缃缃牸寮�
+              key: source['key'] + '', //source[index][x.config.valueField] + "",
+              value: source['value'] //source[index][x.config.textField]
+            }
+          }
+
+          x.data.push(...newSource)
+        } else {
+          //2020.06.06锛屽鏋滄槸selectList鏁版嵁婧愪娇鐢ㄧ殑鑷畾涔塻ql骞朵笖key鏄暟瀛楋紝寮哄埗杞崲鎴愬瓧绗︿覆
+          if (x.e_type == 'selectList' && d.data.length > 0 && typeof d.data[0].key == 'number') {
+            d.data.forEach((c) => {
+              c.key = c.key + ''
+            })
+          }
+          x.data.push(...d.data)
+        }
+        if (
+          this.singleSearch &&
+          this.singleSearch.dataKey &&
+          this.singleSearch.dataKey == x.dicNo
+        ) {
+          this.singleSearch.data.splice(0, 1, ...x.data)
+        }
+      })
+    })
+  },
+  getUrl(action, ingorPrefix) {
+    return 'api' + this.table.url + action
+    //鏄惁蹇界暐鍓嶇紑/  鑾峰彇鎿嶄綔鐨剈rl
+    // return (!ingorPrefix ? '/' : '') + 'api' + this.table.url + action;
+  },
+  initDicKeys() {
+    //鍒濆鍖栧瓧鍏告暟鎹�
+    let keys = []
+    //2022.04.17浼樺寲閲嶆柊鍔犺浇鏁版嵁婧�
+    this.dicKeys.forEach((item) => {
+      item.data.splice(0)
+      item.orginData && item.orginData.splice(0)
+    })
+    //this.dicKeys.splice(0);
+    //鍒濆鍖栫紪杈戞暟鎹簮,榛樿涓轰竴涓┖鏁扮粍锛屽鏋滆姹傚繀濉缃畉ype=number/decimal鐨勬渶灏忓��
+    this.initFormOptions(this.editFormOptions, keys, this.editFormFields, true)
+    //鍒濆鍖栨煡璇㈡暟鎹簮,榛樿涓轰竴涓┖鏁扮粍
+    this.initFormOptions(this.searchFormOptions, keys, this.searchFormFields, false)
+    //鏌ヨ鏃ユ湡璁剧疆涓哄彲閫夊紑濮嬩笌缁撴灉鏃ユ湡
+    this.searchFormOptions.forEach((item) => {
+      item.forEach((x) => {
+        if (x.type == 'date' || x.type == 'datetime' || x.type == 'month') x.range = true
+      })
+    })
+    //鍒濆鍖杁atatable琛ㄦ暟鎹簮,榛樿涓轰竴涓┖鏁扮粍,dicKeys涓虹晫闈㈡墍鏈夌殑鏁版嵁瀛楀吀缂栧彿
+    this.initColumns(this.columns, this.dicKeys, keys)
+    //2021.05.23榛樿寮�鍚煡璇㈤〉闈㈡墍鏈夊瓧娈垫帓搴�,濡傛灉涓嶉渶瑕佹帓搴忥紝鍦╫nInited閬嶅巻columns璁剧疆sort=false
+    //2021.09.25绉婚櫎寮哄埗鎺掑簭鍔熻兘
+    // this.columns.forEach(x => {
+    //   x.sort = x.render ? false : true;
+    // })
+    if (this.detailOptions && this.detailOptions.columns) {
+      this.initColumns(this.detailOptions.columns, this.dicKeys, keys)
+    }
+    //鍒濆鍖栧揩閫熸煡璇㈠瓧娈�,榛樿浣跨敤浠g爜鐢熸垚鍣ㄩ厤缃殑绗竴涓煡璇㈠瓧娈�
+    if (this.searchFormOptions.length > 0) {
+      this.singleSearch = {
+        dataKey: this.searchFormOptions[0][0].dataKey,
+        dicNo: this.searchFormOptions[0][0].dicNo,
+        field: this.searchFormOptions[0][0].field,
+        title: this.searchFormOptions[0][0].title,
+        type: this.searchFormOptions[0][0].type,
+        data: []
+      }
+      // this.singleSearch = this.searchFormOptions[0][0];
+    }
+    if (keys.length == 0) return
+    let $this = this
+    this.http.post('/api/Sys_Dictionary/GetVueDictionary', keys).then((dic) => {
+      $this.bindOptions(dic)
+      //2022.04.04澧炲姞瀛楀吀鍔犺浇瀹屾垚鏂规硶
+      $this.dicInited && $this.dicInited(dic)
+    })
+  },
+  setFiexdColumn(columns, containerWidth) {
+    //璁$畻鏁翠釜table鐨勫搴︼紝鏍规嵁瀹藉害鍐冲畾鏄惁鍚敤绗竴琛屾樉绀虹殑鍒椾负鍥哄畾鍒�
+    //2021.09.21绉婚櫎寮哄埗鍥哄畾绗竴鍒�
+    // let columnsWidth = 0;
+    // columns.forEach(x => {
+    //   if (!x.hidden && x.width) {
+    //     columnsWidth += x.width;
+    //   }
+    // });
+    // //鍚敤绗竴鍒椾负鍥哄畾鍒�
+    // if (columnsWidth > containerWidth) {
+    //   let firstColumn = columns.find(x => !x.hidden);
+    //   if (firstColumn) {
+    //     firstColumn.fixed = true;
+    //   }
+    // }
+  },
+  initBoxHeightWidth() {
+    //鍒濆鍖栧脊鍑烘鐨勯珮搴︿笌瀹藉害
+    let clientHeight = document.documentElement.clientHeight
+    //寮瑰嚭妗嗛珮搴﹁嚦灏�250px
+    clientHeight = clientHeight < 250 ? 250 : clientHeight
+    let clientWidth = document.documentElement.clientWidth
+    if (
+      this.editFormOptions.some((x) => {
+        return x.some((item) => {
+          return item.type == 'editor'
+        })
+      })
+    ) {
+      this.editor.uploadImgUrl = this.getUrl('upload')
+      this.boxOptions.height = clientHeight * 0.8
+      this.boxOptions.width = clientWidth * 0.8
+    } else {
+      if (this.boxOptions.height) {
+        //濡傛灉楂樺害涓庡搴﹁秴杩囦簡鑾峰彇鍒扮殑鍙楂樺搴︼紝鍒欒涓洪粯璁ょ殑90%楂樺
+        if (this.boxOptions.height > clientHeight * 0.8) {
+          this.boxOptions.height = clientHeight * 0.8
+        }
+      }
+      if (this.boxOptions.width) {
+        //濡傛灉楂樺害涓庡搴﹁秴杩囦簡鑾峰彇鍒扮殑鍙楂樺搴︼紝鍒欒涓洪粯璁ょ殑90%楂樺
+        if (this.boxOptions.width > clientWidth * 0.8) {
+          this.boxOptions.width = clientWidth * 0.8
+        }
+      }
+    }
+    //璁$畻鏁翠釜table鐨勫搴︼紝鏍规嵁瀹藉害鍐冲畾鏄惁鍚敤绗竴琛屾樉绀虹殑鍒椾负鍥哄畾鍒�
+    let maxTableWidth = clientWidth - 270
+    this.setFiexdColumn(this.columns, maxTableWidth)
+
+    this.height = this.tableHeight || clientHeight - 206
+    this.url = this.getUrl(this.const.PAGE)
+    //璁$畻寮瑰嚭妗嗙殑楂樹笌瀹藉害
+    //濡傛灉鏈夋槑缁嗚〃锛岄珮搴︿笌瀹藉甫璁剧疆涓�0.9/0.82
+    if (this.detail.columns && this.detail.columns.length > 0) {
+      this.hasDetail = true
+      clientWidth = clientWidth * 0.8
+      clientHeight = clientHeight * 0.85
+      if (!this.detailOptions.height) {
+        this.detailOptions.height = clientHeight - this.editFormOptions.length * 36 - 234
+        this.detailOptions.height =
+          this.detailOptions.height < 240 ? 240 : this.detailOptions.height
+      }
+
+      this.detailOptions.columns = this.detail.columns
+      this.detailOptions.pagination.sortName = this.detail.sortName
+      this.detailOptions.cnName = this.detail.cnName
+      this.detailOptions.key = this.detail.key
+      this.detailOptions.url = this.getUrl('getDetailPage')
+      //璁$畻寮瑰嚭妗嗘暣涓猼able鐨勫搴︼紝鏍规嵁瀹藉害鍐冲畾鏄惁鍚敤绗竴琛屾樉绀虹殑鍒椾负鍥哄畾鍒�
+      this.setFiexdColumn(this.detail.columns, clientWidth)
+    } else {
+      let maxColumns = 1 //鏈�澶у垪鏁帮紝鏍规嵁鍒楄绠楀脊妗嗙殑瀹藉害
+      this.editFormOptions.forEach((x) => {
+        if (x.length > maxColumns) maxColumns = x.length
+      })
+      let maxHeightRate = 0.7,
+        maxWidthRate = 0.5
+      maxWidthRate = maxColumns / 10 + 0.3
+      maxHeightRate = (this.editFormOptions.length || 1) * 0.1 + 0.03
+      maxHeightRate = maxHeightRate > 0.9 ? 0.9 : maxHeightRate
+      clientWidth = clientWidth * maxWidthRate
+      clientHeight = clientHeight * maxHeightRate
+      // this.boxOptions.width = clientWidth * maxWidthRate;
+      // this.boxOptions.height = clientHeight * maxHeightRate;
+    }
+    if (!this.boxOptions.height) {
+      this.boxOptions.height = clientHeight + 10
+    }
+    if (!this.boxOptions.width) {
+      this.boxOptions.width = clientWidth + 30
+    }
+    //2023.10.11闅愯棌鍒嗛〉鏃惰皟鏁磋〃鏍奸珮搴�
+    if (this.paginationHide) {
+      this.height = this.height + 37
+    }
+  },
+  rowOnChange(row) {
+    this.rowChange(row)
+  },
+  rowChange(row) {
+    //閫変腑琛宑heckbox琛屼簨浠�
+  },
+  selectionOnChange(rows) {
+    this.selectionChange(rows)
+  },
+  selectionChange(rows) {},
+  rowOnClick({ row, column, event }) {
+    this.rowClick({ row, column, event })
+  },
+  rowClick({ row, column, event }) {
+    // 鐐瑰嚮琛屼簨浠�(2020.11.07)
+  },
+  rowOnDbClick({ row, column, event }) {
+    this.rowDbClick({ row, column, event })
+  },
+  rowDbClick({ row, column, event }) {
+    // 鍙屽嚮鍑昏浜嬩欢(2021.05.23)
+  },
+  $error(message) {
+    this.$message.error(message)
+    // this.$message({
+    //   type: 'error',
+    //   content: message,
+    //   duration: 5
+    // });
+  },
+  $success(message) {
+    this.$message.success(message)
+  },
+  setFiexdSearchForm(visiable) {
+    //2020.09.011澧炲姞鍥哄畾鏌ヨ琛ㄥ崟鍔熻兘,visiable=true榛樿灏嗘煡璇㈣〃鍗曞睍寮�
+    this.fiexdSearchForm = true
+    let refreshBtn = this.buttons.find((x) => x.name == '鍒� 鏂�')
+    if (visiable) {
+      this.searchBoxShow = true
+    }
+    if (refreshBtn) {
+      refreshBtn.name = '閲� 缃�'
+      refreshBtn.onClick = function () {
+        this.resetSearch()
+      }
+    }
+  },
+  tableBeginEdit(row, column, index) {
+    //2021.03.19鏄惁寮�鍚煡璇㈢晫闈㈣〃鏍煎弻鍑荤紪杈戠粨鏉熸柟娉�,杩斿洖false涓嶄細缁撴潫缂栬緫
+    return this.beginEdit(row, column, index)
+  },
+  beginEdit(row, column, index) {
+    //2021.03.19鏄惁寮�鍚煡璇㈢晫闈㈣〃鏍煎弻鍑荤紪杈戠粨鏉熸柟娉�,杩斿洖false涓嶄細缁撴潫缂栬緫
+    return true
+  },
+  tableEndEditBefore(row, column, index) {
+    return this.endEditBefore(row, column, index)
+  },
+  endEditBefore(row, column, index) {
+    //2021.03.19鏄惁寮�鍚煡璇㈢晫闈㈣〃鏍煎弻鍑荤紪杈戠粨鏉熸柟娉�,杩斿洖false涓嶄細缁撴潫缂栬緫
+    return true
+  },
+  filterPermission(tableName, permission) {
+    //2021.03.19鍒ゆ柇鏄惁鏈夋煇涓〃鐨勬寜閽潈闄�
+    //:["Search","Add","Delete","Update","Import","Export","Upload","Audit"]
+    const _result = (this.$store.state.permission || []).find((x) => {
+      return x.url == '/' + tableName
+    })
+    return _result && _result.permission.some((x) => x == permission)
+  },
+  destroyed() {
+    //2021.04.11澧炲姞vue椤甸潰閿�姣佹柟娉�,璺敱蹇呴』璁剧疆keepLive:false锛岃缃柟娉曡锛氬墠绔紑鍙戞枃妗�-銆媅绂佺敤椤甸潰缂撳瓨keepAlive]
+  },
+  loadTreeTableChildren(tree, treeNode, resolve) {
+    this.loadTreeChildren.call(this, tree, treeNode, resolve)
+  },
+  loadTreeChildren(tree, treeNode, resolve) {
+    //鏍戝舰缁撴瀯鍔犺浇瀛愯妭鐐�(2021.05.02),鍦╫nInit涓缃簡rowKey涓婚敭瀛楁鍚庢墠浼氱敓鏁�
+    return resolve([])
+  },
+  importDetailAfter(data) {
+    //2022.01.08澧炲姞鏄庣粏琛ㄥ鍏ュ悗澶勭悊
+  },
+  importExcelAfter(data) {
+    //2022.01.08澧炲姞鏄庣粏琛ㄥ鍏ュ悗鏂规硶鍒ゆ柇
+
+    if (!data.status) {
+      return // this.$message.error(data.message);
+    }
+    //鏄庣粏琛ㄥ鍏�
+    if (this.boxModel) {
+      if (data.data) {
+        data.data = JSON.parse(data.data)
+      } else {
+        data.data = []
+      }
+      data.data.forEach((x) => {
+        x[this.detail.key] = undefined
+        x[this.table.key] = undefined
+      })
+      this.importDetailAfter(data) //澧炲姞鏄庣粏琛ㄥ鍏ュ悗澶勭悊
+      this.$refs.detail.rowData.unshift(...data.data)
+      this.upload.excel = false
+      return
+    }
+    this.importAfter(data)
+  },
+  onGridModelClose(iconClick) {
+    if (this.isBoxAudit) {
+      this.initFormOptionType(false)
+    }
+    this.isBoxAudit = false
+    this.onModelClose(iconClick)
+  },
+  initAuditColumn() {},
+  getWorkFlowSteps(row) {
+    let table = this.table.url.replaceAll('/', '')
+    let url = `api/Sys_WorkFlow/getSteps?tableName=${table}&id=${row[this.table.key]}`
+    this.http.get(url, {}, true).then((result) => {
+      this.workFlowSteps.splice(0)
+      //鏈夊彲鑳芥病鏈夐厤缃鎵规祦绋�
+      if (!result.list || !result.list.length) {
+        result.list = []
+        this.auditParam.showAction = true
+        this.auditParam.height = 240
+        this.auditParam.showViewButton = row.AuditStatus == 0
+      } else {
+        this.auditParam.showAction = result.list.some((c) => {
+          return c.isCurrentUser
+        })
+        this.auditParam.height = 511
+        this.auditParam.showViewButton = true
+      }
+      this.auditParam.reason = ''
+      this.auditParam.status = -1
+      this.auditParam.value = -1
+      if (result.his) {
+        result.his.forEach((item) => {
+          item.auditStatus = this.getAuditStatus(item.auditStatus)
+        })
+      }
+
+      this.auditParam.auditHis = result.his
+      this.workFlowSteps.push(...result.list)
+      this.isBoxAudit = true
+      this.initFormOptionType(true)
+      this.edit(row)
+      this.boxOptions.title = '瀹℃牳'
+    })
+  },
+  initFormOptionType(isReadonly) {
+    this.editFormOptions.forEach((options) => {
+      options.forEach((option) => {
+        if (isReadonly) {
+          if (!option.readonly) {
+            this.formFieldsType.push(option.field)
+            option.readonly = true
+          }
+        } else {
+          if (this.formFieldsType.indexOf(option.field) != -1) {
+            option.readonly = false
+          }
+        }
+      })
+    })
+  },
+  getAuditStatus(status) {
+    let data = this.auditParam.data.find((x) => {
+      return x.value == status
+    })
+    if (!data) {
+      return '-'
+      //   return `瀹℃牳鍊间笉姝g‘:${status}`
+    }
+    return data.text
+  },
+  initFlowQuery() {
+    if (this.$route.query.viewflow) {
+      this.$refs.table && this.search()
+    }
+  },
+  fullscreen(full) {
+    //寮瑰嚭妗嗗叏灞忔柟娉�
+  },
+  //鏌ヨ椤甸潰琛ㄦ牸鍚堝苟琛屾垨鍒楋紝瑙乭ttps://element-plus.gitee.io/zh-CN/component/table.html#%E5%90%88%E5%B9%B6%E8%A1%8C%E6%88%96%E5%88%97
+  spanMethod({ row, column, rowIndex, columnIndex }) {},
+  //鏌ヨ椤甸潰琛ㄦ牸鍚堝苟琛屾垨鍒楋紝瑙乭ttps://element-plus.gitee.io/zh-CN/component/table.html#%E5%90%88%E5%B9%B6%E8%A1%8C%E6%88%96%E5%88%97
+  detailSpanMethod({ row, column, rowIndex, columnIndex }) {},
+  getFormOption(field) {
+    if (!field) {
+      return null
+    }
+    for (let index = 0; index < this.editFormOptions.length; index++) {
+      const _options = this.editFormOptions[index]
+      const obj = _options.find((c) => {
+        return c.field == field
+      })
+      if (obj) {
+        return obj
+      }
+    }
+  },
+  setFormReadonly(readonly) {
+    //蹇�熻缃〃鍗曚笌鏄庣粏琛ㄦ槸鍚﹀彧璇�
+    this.editFormOptions.forEach((x) => {
+      x.forEach((ops) => {
+        ops.readonly = !!readonly
+      })
+    })
+    this.detailOptions.columns.forEach((x) => {
+      x.readonly = !!readonly
+    })
+    this.detailOptions.buttons.forEach((x) => {
+      x.hidden = !!readonly
+    })
+  }
+}
+import customColumns from './ViewGridCustomColumn.js'
+//鍚堝苟鎵╁睍鏂规硶
+methods = Object.assign(methods, detailMethods, serviceFilter, customColumns)
+export default methods
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/methodsDetail.jsx b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/methodsDetail.jsx
new file mode 100644
index 0000000..d795e90
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/ViewGrid/methodsDetail.jsx
@@ -0,0 +1,43 @@
+let methods = {
+  add() {
+    this.$Message.success('鐐瑰嚮浜嗘坊鍔犳寜閽�')
+  },
+  edit() {
+    let rows = this.getSelected()
+    if (rows.length == 0) {
+      return this.$Message.error('璇烽�夋嫨瑕佺紪杈戠殑琛�!')
+    }
+    this.$Message.success('鐐瑰嚮浜嗙紪杈戞寜閽�')
+  },
+  del() {
+    let rows = this.getSelected()
+    if (rows.length == 0) {
+      return this.$Message.error('璇烽�夋嫨瑕佸垹闄ょ殑琛�!')
+    }
+    this.$Message.success('鐐瑰嚮浜嗗垹闄ゆ寜閽�')
+  },
+  getSelected() {
+    return this.selectRows
+  },
+
+  selectionChange(selection) {
+    // console.log(selection);
+    // 閫夋嫨琛屼簨浠�,鍙湁鍗曢�夋墠瑙﹀彂
+    this.selectRows = selection
+    if (this.single) {
+      if (selection.length == 1) {
+        this.$emit('rowChange', selection[0])
+      }
+      if (selection.length > 1) {
+        let _row = selection[selection.length - 1]
+        this.$refs.table.toggleRowSelection(selection[0])
+        this.selectRows = [_row]
+      }
+    }
+    // 灏唖electionchange鏆撮湶鍑哄幓
+    this.$emit('selectionChange', selection)
+  }
+}
+export default {
+  methods
+}
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolBox.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolBox.vue
new file mode 100644
index 0000000..4e05a0e
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolBox.vue
@@ -0,0 +1,200 @@
+<template>
+  <div class="vol-dialog">
+
+    <el-dialog v-model="vmodel" :close-on-click-modal="false" :close-on-press-escape="false" :width="width"
+      :fullscreen="fullscreen" :draggable="draggable" :modal="modal" :before-close="handleClose">
+      <template #header>
+        <i :class="icon"></i> {{ title }}
+        <button class="el-dialog__headerbtn" type="button" style="right: 35px; color: var(--el-color-info)" @click="handleFullScreen">
+          <i class="el-icon el-icon-full-screen"></i>
+        </button>
+      </template>
+      <el-scrollbar :max-height="contentHeight">
+        <div v-if="inited" style="min-height: 50px;" class="srcoll-content" :style="{ padding: padding + 'px' }">
+          <slot name="content"></slot>
+          <slot></slot>
+        </div>
+      </el-scrollbar>
+      <template #footer>
+        <div class="dia-footer" v-if="footer">
+          <slot name="footer"></slot>
+          <el-button type="primary" v-if="!footer" size="mini" @click="handleClose()"><i
+              class="el-icon-close"></i>鍏抽棴</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { defineComponent, ref, watch, watchEffect } from 'vue';
+
+export default defineComponent({
+  props: {
+    modelValue: false,
+    lazy: {
+      //鏄惁寮�鍚噿鍔犺浇2020.12.06
+      type: Boolean,
+      default: false,
+    },
+    icon: {
+      type: String,
+      default: "el-icon-warning-outline",
+    },
+    title: {
+      type: String,
+      default: "鍩烘湰淇℃伅",
+    },
+    height: {
+      type: Number,
+      default: 200,
+    },
+    width: {
+      type: Number,
+      default: 650,
+    },
+    padding: {
+      type: Number,
+      default: 16,
+    },
+    modal: {
+      //鏄惁闇�瑕侀伄缃╁眰
+      type: Boolean,
+      default: true,
+    },
+    draggable: {
+      //鍚敤鍙嫋鎷藉姛鑳�
+      type: Boolean,
+      default: false,
+    },
+    mask: {
+      type: Boolean,
+      default: true,
+    },
+    onModelClose: {
+      //2021.07.11澧炲姞寮瑰嚭妗嗗叧闂簨浠�
+      type: Function,
+      default: (iconClick) => {
+        return true;        
+      }
+    },
+    footer:{ //鏄惁鏄剧ず搴曢儴鎸夐挳
+      type: Boolean,
+      default: true
+    }
+
+  },
+  setup(props, context) {
+    const clientHeight = document.body.clientHeight * 0.95 - 60;
+    const inited = ref(true);
+    const vmodel = ref(false);
+    const footer = ref(false);
+    const top = ref(100);
+    vmodel.value = props.modelValue;
+    footer.value = !!context.slots.footer;
+    const contentHeight = ref(200);
+    contentHeight.value = props.height;
+    const handleClose = (done, iconClose) => {
+      let result = props.onModelClose(!!iconClose);
+      if (result === false) return;
+      vmodel.value = false;
+      context.emit("update:modelValue", false);
+      done && done();
+    };
+    const calcHeight = (val) => {
+    //  if (props.height > clientHeight) {
+    //  if(true){
+        contentHeight.value = clientHeight - 30;
+        return clientHeight / -2 + 'px';
+    //  }
+      // contentHeight.value = val || props.height;
+      // return (props.height + 56) / -2 + 'px';
+    };
+    top.value = calcHeight();
+    watch(
+      () => props.modelValue,
+      (newVal, oldVal) => {
+        vmodel.value = newVal;
+      }
+    );
+    watch(
+      () => props.height,
+      (newVal, oldVal) => {
+        top.value = calcHeight();
+      }
+    );
+    const fullscreen=ref(false);
+    const handleFullScreen=()=> {
+      fullscreen.value = !fullscreen.value;
+      context.emit("fullscreen", fullscreen.value);
+    }
+    return {
+      handleClose,
+      inited,
+      vmodel,
+      footer,
+      top,
+      calcHeight,
+      contentHeight,
+      fullscreen,
+      handleFullScreen
+    };
+  }
+});
+</script>
+
+<style lang="less" scoped>
+.dia-footer {
+  text-align: right;
+  width: 100%;
+  border-top: 1px solid #e2e2e2;
+  text-align: right;
+  padding: 6px 8px;
+}
+</style>
+
+<style scoped lang="less">
+.vol-dialog ::v-deep(.el-overlay-dialog) {
+  display: flex !important;
+}
+
+.vol-dialog ::v-deep(.el-dialog) {
+  margin: auto;
+}
+
+.vol-dialog ::v-deep(.el-dialog) {
+  border-top-left-radius: 4px;
+  border-top-right-radius: 4px;
+}
+
+.vol-dialog ::v-deep(.el-dialog__header) {
+  border-top-left-radius: 4px;
+  border-top-right-radius: 4px;
+  padding: 0px 13px;
+  line-height: 53px;
+  border-bottom: 1px solid #e6e6e6;
+  height: 50px;
+  color: rgb(79, 79, 79);
+  font-weight: bold;
+  font-size: 14px;
+  margin: 0;
+  // background-image: linear-gradient(135deg, #0cd7bd 10%, #50c3f7);
+}
+
+.vol-dialog ::v-deep(.el-dialog__footer),
+.vol-dialog ::v-deep(.el-dialog__body) {
+  padding: 0;
+}
+
+.vol-dialog ::v-deep(.el-dialog__headerbtn) {
+  top: 0;
+  padding-top: 8px;
+  height: 50px;
+  width: 0;
+  padding-right: 30px;
+  padding-left: 5px;
+}
+.vol-dialog ::v-deep(.el-dialog) {
+   padding: 0;
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolElementMenu.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolElementMenu.vue
new file mode 100644
index 0000000..cc544d1
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolElementMenu.vue
@@ -0,0 +1,236 @@
+<template>
+  <div class="vol-el-menu">
+    <div class="menu-search" v-if="showSearch">
+      <el-select placement="bottom" v-model="searchValue" clearable filterable remote reserve-keyword
+        :placeholder="'璇疯緭鍏ュ叧閿瓧鎼滅储...'" :remote-method="remoteMethod" @change="selectChange" :loading="loading">
+        <template #prefix><i class="el-icon-search"></i></template>
+        <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
+      </el-select>
+    </div>
+    <el-menu close="vol-el-menu--vertical" :default-openeds="openedIds" :default-active="defaultActive"
+      :unique-opened="true" @select="select" :collapse="isCollapse" @open="handleOpen" @close="handleClose"
+      @contextmenu.prevent="bindRightClickMenu">
+      <template v-for="item in convertTree(list)">
+        <el-sub-menu :key="item.id" :index="'' + item.id" v-if="item.children.length && (!enable || item.enable == 1)">
+          <template #title>
+            <i class="menu-icon" :class="item.icon"></i>
+            <span> {{ item.name}}</span>
+          </template>
+          <vol-element-menu-child :enable="enable" :list="item.children"></vol-element-menu-child>
+        </el-sub-menu>
+        <template v-else>
+          <el-menu-item class="menu-item-lv1" v-if="!enable || item.enable == 1" :key="item.id" :index="'' + item.id">
+            <i :class="item.icon"></i>
+            <span> {{ item.name }}</span>
+          </el-menu-item>
+        </template>
+      </template>
+    </el-menu>
+  </div>
+</template>
+
+<script>
+import VolElementMenuChild from "./VolElementMenuChild";
+import { useRouter } from "vue-router";
+
+import {
+  defineComponent,
+  reactive,
+  watch,
+  ref,
+  toRef,
+  toRefs,
+  getCurrentInstance,
+  // onMounted,
+} from "vue";
+export default defineComponent({
+  components: {
+    "vol-element-menu-child": VolElementMenuChild,
+  },
+  props: {
+    enable: {
+      type: Boolean,
+      default: false, //鏄惁鍒ゆ柇enable=1
+    },
+    isCollapse: {
+      type: Boolean,
+      default: false,
+    },
+    onSelect: {
+      type: Function,
+      default: (x) => { },
+    },
+    openSelect: {
+      //鎵撳紑鐨勬椂鍊欐槸鍚﹁Е鍙戦�変腑浜嬩欢
+      type: Boolean,
+      default: true,
+    },
+    list: {
+      type: Array,
+      default: [],
+    },
+    rootId: {
+      type: String,
+      default: "0",
+    },
+    currentMenuId: {
+      type: Number,
+      default: 0,
+    },
+  },
+  setup(props) {
+    // const { list } = toRefs(props);
+    //  const treeList = ref([]);
+    const getTree = (id, node, data) => {
+      if (!node.children) {
+        node.children = [];
+      }
+      data.forEach((x) => {
+        if (x.parentId == id && !node.children.some((c) => c.id === x.id)) {
+          node.children.push(x);
+          getTree(x.id, x, data);
+        }
+      });
+    };
+    let rootTreeId = !isNaN(props.rootId) ? ~~props.rootId : props.rootId;
+    props.list.forEach((x) => {
+      if (!x.icon || x.icon.substring(0, 3) != "el-") {
+        x.icon = "el-icon-menu";
+      }
+      x.children = [];
+      x.isRoot = x.parentId === rootTreeId;
+    });
+    const convertTree = (data) => {
+      var root_data = [];
+      data.forEach((x) => {
+        if (x.parentId === rootTreeId) {
+          if (!x.hasOwnProperty("enable")) x.enable = 1;
+          root_data.push(x);
+          getTree(x.id, x, data);
+        }
+      });
+      return root_data;
+    };
+    const openedIds = reactive([props.currentMenuId]);
+    const defaultActive = ref(props.currentMenuId + "");
+    let _base = getCurrentInstance().appContext.config.globalProperties.base;
+    watch(
+      () => props.currentMenuId,
+      (newVal, oldVal) => {
+        defaultActive.value = newVal + "";
+        openedIds.splice(0);
+        openedIds.push(
+          ..._base.getTreeAllParent(newVal, props.list).map((c) => {
+            return c.id;
+          })
+        );
+      }
+    );
+    const router = useRouter();
+    let eventSelect = false;
+    const select = (index, _item) => {
+
+      _item = props.list.find((x) => {
+        return x.id == index;
+      });
+
+      if (_item.linkType == 1) {
+        window.open(_item.url || _item.path, '_blank')
+        return;
+      }
+      if (eventSelect) {
+        return;
+      }
+      eventSelect = true;
+      setTimeout(() => {
+        eventSelect = false;
+      }, 20);
+
+
+
+      props.onSelect(index, _item);
+      router.push({ path: _item.path || "", query: _item.query });
+    };
+
+    const handleOpen = (index, path) => {
+      if (props.openSelect) {
+        select(index, path);
+      }
+    };
+    const handleClose = () => { };
+
+    /**
+     * 鑿滃崟瀵艰埅鍙抽敭浜嬩欢
+     * @param {*} enable 鏄惁鍚敤鍙抽敭浜嬩欢[true:鍚敤;false:绂佺敤;]
+     */
+    const bindRightClickMenu = (enable) => {
+      if (!enable) return;
+    };
+    const { proxy } = getCurrentInstance();
+    const loading = ref(false)
+    const searchValue = ref('');
+    const options = ref([]);
+    const remoteMethod = (query) => {
+      if (!query) {
+        options.value.length = 0;
+        return;
+      }
+      options.value = props.list
+        .filter(c => { return (c.enable == 1 || c.enable === undefined) && c.name.indexOf(query) != -1 && (!c.children || !c.children.length) })
+        .map(x => { return { value: x.id, label: x.name } }).slice(0, 7)
+    }
+    const selectChange = (id) => {
+      if (!id) {
+        return;
+      }
+      let index = props.list.findIndex(c => { return c.id === id });
+      if (index === -1) {
+        return;
+      }
+      searchValue.value = "";
+      if(proxy.list.some(c=>{return c.parentId===id})){
+        return;
+      }
+      select(id, props.list[index]);
+    }
+ 
+    const showSearch=ref(proxy.$global.menuSearch===undefined||proxy.$global.menuSearch)
+    return {
+      // treeList,
+      // list,
+      select,
+      convertTree,
+      handleOpen,
+      handleClose,
+      bindRightClickMenu,
+      openedIds,
+      defaultActive,
+      searchValue,
+      options,
+      remoteMethod,
+      loading,
+      selectChange,
+      showSearch
+    };
+  },
+});
+</script>
+<style lang="less" scoped>
+.vol-el-menu {
+  // box-sizing: content-box;
+  width: 100%;
+
+  .menu-icon {
+    font-size: 18px;
+    margin-right: 6px;
+  }
+}
+
+.menu-search {
+  padding: 6px 10px;
+
+  ::v-deep(.el-input__wrapper) {
+    border-radius: 15px !important;
+  }
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolElementMenuChild.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolElementMenuChild.vue
new file mode 100644
index 0000000..ccea321
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolElementMenuChild.vue
@@ -0,0 +1,56 @@
+<template>
+  <div class="vol-el-menu-item">
+    <template v-for="(item) in list">
+      <template v-if="item.children&&item.children.length">
+        <el-menu-item :key="item.id"
+                      :index="'' + item.id"
+                      v-if="!item.children.length && (!enable || item.enable == 1)">
+          <template #title></template>
+          <span> {{ item.name }}</span>
+        </el-menu-item>
+        <el-sub-menu :key="item.id"
+                    :index="'' + item.id"
+                    v-if="item.children.length && (!enable || item.enable == 1)">
+          <template #title>
+            <span> {{ item.name }}</span>
+          </template>
+          <vol-element-menu-child :enable="enable" :list="item.children" />
+        </el-sub-menu>
+      </template>
+      <template v-else>
+        <el-menu-item :key="item.id"
+                      :index="'' + item.id"
+                      v-if="(!enable || item.enable == 1)">
+          <template #title></template>
+          <span> {{item.name }}</span>
+        </el-menu-item>
+      </template>
+    </template>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "vol-element-menu-child",
+  props: {
+    list: {
+      type: Array,
+      default: [],
+    },
+    enable: {
+      type: Boolean,
+      default: false, //鏄惁鍒ゆ柇enable=1
+    },
+  },
+};
+</script>
+
+<style scoped lang="less">
+.vol-el-menu-item ::v-deep(.el-menu-item) {
+  height: 42px !important;
+  line-height: 42px !important;
+}
+</style>
+
+
+
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolForm.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolForm.vue
new file mode 100644
index 0000000..bacb3e6
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolForm.vue
@@ -0,0 +1,1551 @@
+<template>
+  <el-form
+    style="display: inline-block; width: 100%"
+    :inline="true"
+    ref="volform"
+    @submit.prevent
+    :model="formFields"
+    :label-width="labelWidth"
+    :rules="rules"
+  >
+    <template v-for="(row, findex) in formRules" :key="findex">
+      <div class="vol-form-item">
+        <el-form-item
+          :label="item.title ? item.title + '锛�' : ''"
+          v-show="!item.hidden"
+          v-for="(item, index) in row"
+          :prop="item.field"
+          :key="item.field + index"
+          :style="getColWidth(item)"
+        >
+          <!-- render -->
+          <form-expand
+            v-if="item.render && typeof item.render == 'function'"
+            :render="item.render"
+            :par="12"
+          ></form-expand>
+          <!-- 2021.10.17澧炲姞琛ㄥ崟瀹炴椂鏂规硶璁$畻 -->
+          <span
+            v-else-if="
+              item.readonly && typeof formFields[item.field] == 'function'
+            "
+            >{{ formFields[item.field]() }}</span
+          >
+          <!-- 鍙鍥剧墖鎴栨枃浠�  -->
+          <div v-else-if="isReadonlyImgFile(item, formFields)">
+            <div v-if="item.type == 'img'" class="form-imgs">
+              <div
+                class="img-item"
+                v-for="(img, imgIndex) in formFields[item.field]"
+                :key="imgIndex"
+              >
+                <img
+                  :src="getSrc(img.path)"
+                  @error="handleImageError"
+                  :onerror="errorImg"
+                  @click="previewImg(img.path)"
+                />
+              </div>
+            </div>
+            <div
+              v-else
+              class="form-file-list"
+              v-for="(file, fileIndex) in formFields[item.field]"
+              :key="fileIndex"
+            >
+              <a @click="dowloadFile(formFields[item.field][fileIndex])">{{
+                file.name
+              }}</a>
+            </div>
+          </div>
+
+          <div v-else :class="{ 'form-item-extra': item.extra }">
+            <!-- 鍙灞炴�� -->
+            <label
+              :style="item.inputStyle"
+              v-if="item.type == 'label'||item.label"
+              class="readonly-input"
+              >{{ getText(formFields, item) }}</label
+            >
+            <!-- 20223.05.13闆嗘垚el-tree-select -->
+            <!-- :filter-method="(value)=>{filterMethod(value,item.data)}" -->
+            <!-- :filterable="true" -->
+            <el-tree-select
+              style="width: 100%"
+              v-else-if="item.type == 'treeSelect'"
+              v-model="formFields[item.field]"
+              :disabled="item.readonly || item.disabled"
+              :data="item.data"
+              :multiple="item.multiple"
+              :render-after-expand="false"
+              :show-checkbox="true"
+              :check-strictly="true"
+              check-on-click-node
+              node-key="key"
+              :props="{ label: 'label' }"
+            >
+              <template #default="{data,node }">
+                <!-- <el-checkbox v-model="node.checked"></el-checkbox> -->
+               <!-- {{getNode(node, data)}} -->
+               <!-- {{node.checked}} -->
+               <!-- 杩欓噷杩樻湁鐐归棶棰橈紝鍚庨潰澶勭悊 -->
+                {{  data.label}}</template
+              >
+            </el-tree-select>
+            <template
+              v-else-if="['select', 'selectList'].indexOf(item.type) != -1"
+            >
+              <el-select-v2
+                :disabled="item.readonly || item.disabled"
+                v-show="!item.hidden"
+                style="width: 100%"
+                :size="size"
+                v-if="item.data.length > select2Count"
+                v-model="formFields[item.field]"
+                filterable
+                :multiple="item.type == 'select' ? false : true"
+                :placeholder="item.placeholder ? item.placeholder : item.title"
+                :allow-create="item.autocomplete"
+                :options="item.data"
+                @change="
+                  (val) => {
+                    item.onChange(val, item.data);
+                  }
+                "
+                clearable
+              >
+                <template #default="{ item }">
+                  {{ item.label }}
+                </template>
+              </el-select-v2>
+              <el-select
+                :disabled="item.readonly || item.disabled"
+                v-show="!item.hidden"
+                style="width: 100%"
+                :size="size"
+                v-else-if="item.remote || item.url"
+                v-model="formFields[item.field]"
+                filterable
+	              remote
+                :multiple="item.type == 'select' ? false : true"
+                :placeholder="item.placeholder ? item.placeholder : item.title"
+                clearable
+                @change="
+                  (val) => {
+                    item.onChange&&item.onChange(val, item.data);
+                  }"
+                 :remote-method="
+                  (val) => {
+                    remoteSearch(item, formFields, val);
+                  }
+                "
+              >
+                <el-option
+                  v-for="item in item.data"
+                  :key="item.key"
+                  :label="item.value"
+                  :value="item.key"
+                >
+                </el-option>
+              </el-select>
+              <el-select
+                :disabled="item.readonly || item.disabled"
+                v-show="!item.hidden"
+                style="width: 100%"
+                :size="size"
+                v-else
+                v-model="formFields[item.field]"
+                filterable
+                :multiple="item.type == 'select' ? false : true"
+                :placeholder="item.placeholder ? item.placeholder : item.title"
+                :allow-create="item.autocomplete"
+                @change="
+                  (val) => {
+                    item.onChange(val, item.data);
+                  }
+                "
+                clearable
+              >
+                <el-option
+                  v-show="!item.hidden"
+                  :disabled="item.disabled"
+                  v-for="item in item.data"
+                  :key="item.key"
+                  :label="item.value"
+                  :value="item.key"
+                >
+                </el-option>
+              </el-select>
+            </template>
+
+            <el-switch
+              v-show="!item.hidden"
+              v-else-if="item.type == 'switch'"
+              v-model="formFields[item.field]"
+              :disabled="item.readonly || item.disabled"
+              active-color="#0f84ff"
+              @change="item.onChange"
+              inactive-color="rgb(194 194 194)"
+              :active-value="
+                typeof formFields[item.field] == 'boolean'
+                  ? true
+                  : typeof formFields[item.field] == 'string'
+                  ? '1'
+                  : 1
+              "
+              :inactive-value="
+                typeof formFields[item.field] == 'boolean'
+                  ? false
+                  : typeof formFields[item.field] == 'string'
+                  ? '0'
+                  : 0
+              "
+            >
+            </el-switch>
+
+            <el-radio-group
+              :disabled="item.readonly || item.disabled"
+              v-show="!item.hidden"
+              v-model="formFields[item.field]"
+              v-else-if="item.type == 'radio'"
+              @change="item.onChange"
+            >
+              <el-radio
+                v-for="kv in item.data"
+                :disabled="item.readonly || item.disabled"
+                :key="kv.key"
+                :label="kv.key"
+                >{{ kv.value }}</el-radio
+              >
+            </el-radio-group>
+
+            <el-checkbox-group
+              :disabled="item.readonly || item.disabled"
+              v-show="!item.hidden"
+              v-model="formFields[item.field]"
+              v-else-if="item.type == 'checkbox'"
+              @change="item.onChange"
+            >
+              <el-checkbox
+                v-for="kv in item.data"
+                :key="kv.key"
+                :disabled="item.readonly || item.disabled"
+                :label="kv.key"
+                >{{ kv.value }}</el-checkbox
+              >
+            </el-checkbox-group>
+            <div
+              class="v-date-range"
+              style="display: flex"
+              v-else-if="
+                ['date', 'datetime','month'].indexOf(item.type) != -1 && item.range
+              "
+            >
+              <el-date-picker
+                :size="size"
+                :disabled="item.readonly || item.disabled"
+                style="flex: 1; width: auto"
+                v-model="formFields[item.field][0]"
+                :type="item.type"
+                :disabledDate="(val) => getDateOptions(val, item)"
+                placeholder="寮�濮嬫椂闂�"
+                @change="
+                  (val) => {
+                    dateRangeChange(val, item);
+                  }
+                "
+                :value-format="getDateFormat(item)"
+              >
+              </el-date-picker>
+              <span style="margin: 0px 5px; font-size: 13px; color: #6f6b6b"
+                >鑷�</span
+              >
+              <el-date-picker
+                :size="size"
+                :disabled="item.readonly || item.disabled"
+                style="flex: 1; width: auto"
+                v-model="formFields[item.field][1]"
+                placeholder="缁撴潫鏃堕棿"
+                :type="item.type"
+                :disabledDate="(val) => getDateOptions(val, item)"
+                @change="
+                  (val) => {
+                    dateRangeChange(val, item);
+                  }
+                "
+                :value-format="getDateFormat(item)"
+              >
+              </el-date-picker>
+            </div>
+            <!-- v-show涓嶆坊鍔犳牴鑺傜偣灏变細鎶ラ敊娌℃湁鏍圭偣鑺� -->
+            <div
+              v-show="!item.hidden"
+              style="width: 100%"
+              v-else-if="['date', 'datetime', 'year', 'month'].indexOf(item.type) != -1"
+            >
+              <el-date-picker
+                :size="size"
+                clearable
+                :disabled="item.readonly || item.disabled"
+                style="width: 100%"
+                v-model="formFields[item.field]"
+                @change="item.onChange"
+                :type="item.type"
+                :placeholder="
+                  item.placeholder ? item.placeholder : '璇烽�夋嫨' + item.title
+                "
+                :disabledDate="(val) => getDateOptions(val, item)"
+                :value-format="getDateFormat(item)"
+              >
+              </el-date-picker>
+            </div>
+
+            <el-time-picker
+              :size="size"
+              v-else-if="item.type == 'time'"
+              v-model="formFields[item.field]"
+              :disabled="item.readonly || item.disabled"
+              placeholder="璇烽�夋嫨鏃堕棿"
+              :value-format="item.format || 'YYYY-MM-DD HH:mm:ss'"
+              :format="item.format"
+              style="width: 100%"
+            >
+            </el-time-picker>
+
+            <el-scrollbar
+              style="border: 1px solid #c7d8db; border-radius: 5px"
+              :height="item.height || 150"
+              v-else-if="
+                item.type == 'editor' && (item.readonly || item.disabled)
+              "
+            >
+              <div ref="editor" v-html="formFields[item.field]"></div>
+            </el-scrollbar>
+
+            <vol-wang-editor
+              ref="editor"
+              v-else-if="item.type == 'editor'"
+              :url="item.url || editor.uploadImgUrl"
+              :upload="item.upload || editor.upload"
+              v-model="formFields[item.field]"
+              :height="item.height || 350"
+            ></vol-wang-editor>
+
+            <vol-upload
+              v-show="!item.hidden"
+              v-else-if="isFile(item, formFields)"
+              :desc="item.desc"
+              :multiple="item.multiple"
+              :max-file="item.maxFile"
+              :max-size="item.maxSize"
+              :autoUpload="item.autoUpload"
+              :fileInfo="formFields[item.field]"
+              :url="item.url"
+              :img="item.type == 'img' || item.columnType == 'img'"
+              :excel="item.type == 'excel'"
+              :fileTypes="item.fileTypes ? item.fileTypes : []"
+              :upload-before="item.uploadBefore"
+              :upload-after="item.uploadAfter"
+              :append="item.multiple"
+              :on-change="
+                (files) => {
+                  return fileOnChange(files, item);
+                }
+              "
+              :file-click="item.fileClick"
+              :remove-before="item.removeBefore"
+              :downLoad="item.downLoad ? true : false"
+            ></vol-upload>
+            <el-cascader
+              :size="size"
+              clearable
+              style="width: 100%; margin-top: -3px"
+              v-model="formFields[item.field]"
+              :disabled="item.readonly || item.disabled"
+              v-else-if="item.type == 'cascader'"
+              :options="item.data"
+              :props="{
+                checkStrictly: item.changeOnSelect || item.checkStrictly
+              }"
+              @change="item.onChange"
+            >
+            </el-cascader>
+            <el-rate
+              :disabled="item.readonly || item.disabled"
+              v-else-if="item.type == 'rate'"
+              @change="
+                (val) => {
+                  item.onChange && item.onChange(val);
+                }
+              "
+              :max="item.max"
+              v-model="formFields[item.field]"
+            />
+            <div
+              style="display: flex"
+              v-else-if="item.type == 'range' || item.range"
+            >
+              <el-input
+                :size="size"
+                :disabled="item.readonly || item.disabled"
+                style="flex: 1"
+                v-model="formFields[item.field][0]"
+                clearable
+              />
+              <span style="margin: 0 5px">-</span>
+              <el-input
+                :size="size"
+                :disabled="item.readonly || item.disabled"
+                style="flex: 1"
+                v-model="formFields[item.field][1]"
+                clearable
+              />
+            </div>
+            <el-input
+              :size="size"
+              clearable
+              :ref="item.field"
+              :input-style="item.inputStyle"
+              :disabled="item.readonly || item.disabled"
+              v-else-if="item.type == 'textarea'"
+              v-model="formFields[item.field]"
+              type="textarea"
+              :autosize="{
+                minRows: item.minRows || 2,
+                maxRows: item.maxRows || 10
+              }"
+              :placeholder="item.placeholder ? item.placeholder : item.title"
+              @keypress="
+                ($event) => {
+                  onKeyPress($event, item);
+                }
+              "
+              @change="($event) => {
+                  onKeyPress($event, item);
+                }"
+              @keyup.enter="($event) => {
+                  onKeyPress($event, item);
+                }"
+            />
+            <el-input-number
+              :size="size"
+              style="width: 100%"
+              :ref="item.field"
+              :input-style="item.inputStyle"
+              v-else-if="item.type == 'number'"
+              v-model="formFields[item.field]"
+              :min="item.min"
+              :disabled="item.readonly || item.disabled"
+              :max="item.max"
+              controls-position="right"
+              @change="item.onKeyPress"
+            />
+            <el-input
+              :size="size"
+              clearable
+              :input-style="item.inputStyle"
+              v-else-if="item.type == 'password'"
+              type="password"
+              v-model="formFields[item.field]"
+              :disabled="item.readonly || item.disabled"
+              v-show="!item.hidden"
+              :placeholder="item.placeholder ? item.placeholder : item.title"
+            />
+            <!-- 2021.11.18淇el-input娌℃湁榛樿enter浜嬩欢鏃跺洖杞﹀紓甯� -->
+            <el-input
+              :size="size"
+              clearable
+              :ref="item.field"
+              :input-style="item.inputStyle"
+              v-else-if="item.onKeyPress"
+              :placeholder="item.placeholder ? item.placeholder : item.title"
+              :disabled="item.readonly || item.disabled"
+              v-show="!item.hidden"
+              v-model="formFields[item.field]"
+              @keypress="
+                ($event) => {
+                  onKeyPress($event, item);
+                }
+              "
+              @change="item.onKeyPress"
+              @keyup.enter="item.onKeyPress"
+              @blur="item.blur"
+              @focus="item.focus"
+            ></el-input>
+            <el-input
+              :size="size"
+              clearable
+              v-else
+              :ref="item.field"
+              :input-style="item.inputStyle"
+              :placeholder="item.placeholder ? item.placeholder : item.title"
+              :disabled="item.readonly || item.disabled"
+              v-show="!item.hidden"
+              v-model="formFields[item.field]"
+              @blur="item.blur"
+              @focus="item.focus"
+            ></el-input>
+
+            <div class="form-extra" v-if="item.extra">
+              <form-expand
+                v-if="item.extra.render"
+                :render="item.extra.render"
+              ></form-expand>
+              <a
+                v-else-if="item.extra.click"
+                :style="item.extra.style"
+                @click="item.extra.click(item, formFields[item.field])"
+              >
+                <i v-if="item.extra.icon" :class="item.extra.icon" />
+                {{ item.extra.text }}
+              </a>
+              <a v-else :style="item.extra.style">
+                <i v-if="item.extra.icon" :class="item.extra.icon" />
+                {{ item.extra.text }}
+              </a>
+            </div>
+          </div>
+        </el-form-item>
+      </div>
+    </template>
+    <slot></slot>
+    <div style="width: 100%">
+      <slot name="footer"></slot>
+    </div>
+  </el-form>
+</template>
+<script>
+const rule = {
+  change: [
+    'checkbox',
+    'select',
+    'date',
+    'datetime',
+    'drop',
+    'radio',
+    'cascader'
+  ], // 2020.05.31澧炲姞绾ц仈绫诲瀷
+  phone: /^[1][3,4,5,6,7,8,9][0-9]{9}$/,
+  decimal: /(^[\-0-9][0-9]*(.[0-9]+)?)$/,
+  number: /(^[\-0-9][0-9]*([0-9]+)?)$/
+};
+const inputTypeArr = ['text', 'string', 'mail', 'textarea', 'password'];
+const types = {
+  int: 'number',
+  byte: 'number',
+  decimal: 'number', // "float",
+  string: 'string',
+  bool: 'boolean',
+  date: 'datetime',
+  date: 'date',
+  mail: 'email'
+};
+//琛ㄥ崟楠岃瘉娉ㄦ剰锛氭瘡娆¢獙璇侀兘蹇呴』鎵цcallback,鍚﹀垯楠岃瘉涓嶆墽琛屽洖璋冩柟娉�
+const colPow = Math.pow(10, 3);
+import FormExpand from './VolForm/VolFormRender';
+import {
+  defineAsyncComponent,
+  defineComponent,
+  ref,
+  reactive,
+  toRefs,
+  getCurrentInstance,
+  onMounted,
+  watch
+} from 'vue';
+export default defineComponent({
+  components: {
+    FormExpand,
+    'vol-upload': defineAsyncComponent(() =>
+      import('@/components/basic/VolUpload.vue')
+    ),
+    'vol-wang-editor': defineAsyncComponent(() =>
+      import('@/components/editor/VolWangEditor.vue')
+    )
+  },
+  props: {
+    loadKey: {
+      // 鏄惁鍔犺浇formRules瀛楁閰嶇疆鐨勬暟鎹簮
+      type: Boolean,
+      default: true
+    },
+    width: {
+      // 琛ㄥ崟瀹藉害
+      type: Number,
+      default: 0
+    },
+    labelWidth: {
+      // 琛ㄥ崟宸﹁竟label鏂囧瓧鏍囩鐨勫搴�
+      type: Number,
+      default: 100
+    },
+    formRules: {
+      // 琛ㄥ崟閰嶇疆瑙勫垯锛屽瀛楁绫诲瀷锛屾槸鍚﹀繀濉�
+      type: Array,
+      default: []
+    },
+    formFields: {
+      type: Object,
+      default: () => {
+        return {};
+      }
+    },
+    editor: {
+      // 2021.01.16缂栬緫鍣ㄤ俊鎭� {uploadImgUrl:"",upload:null//涓婁紶鏂规硶}
+      type: Object,
+      default: () => {
+        return {};
+      }
+    },
+    size: {
+      type: String, //large / default / small
+      default: 'default'
+    },
+    select2Count: {
+      //瓒呭嚭鏁伴噺鏄剧ずselect2缁勪欢
+      type: Number,
+      default: 2000
+    }
+  },
+  computed: {
+    rules() {
+      let ruleResult = {};
+      this.formRules.forEach((option, xIndex) => {
+        option.forEach((item) => {
+          ruleResult[item.field] = [this.getRule(item, this.formFields)];
+        });
+      });
+      if (this.$refs.volform) {
+        setTimeout(() => {
+          this.$refs.volform.clearValidate();
+        }, 100);
+      }
+      return ruleResult;
+    }
+  },
+  setup(props, context) {
+    const { appContext, proxy } = getCurrentInstance();
+    const remoteCall = ref(true);
+    const span = ref(1);
+    const rangeFields = reactive([]);
+    const volform = ref(null);
+    const numberFields = reactive([]);
+    onMounted(() => {});
+    const initFormRules = (init) => {
+      if (props.loadKey) {
+        initSource();
+      }
+      props.formRules.forEach((row, xIndex) => {
+        if (row.length > span.value) span.value = row.length;
+        let _count = 0,
+          _size = 0;
+        row.forEach((x) => {
+          if (x.colSize > 0) {
+            _size = _size + x.colSize;
+            _count++;
+          }
+        });
+        if (_count > 0 && row.length - _count > 0) {
+          let _cellSize = (12 - _size) / (row.length - _count);
+          row.forEach((x) => {
+            if (!x.colSize) {
+              x.colSize = _cellSize;
+            }
+          });
+        }
+        row.forEach((item, yIndex) => {
+          if (item.type == 'number') {
+            numberFields.push(item.field);
+          }
+          // 鐩墠鍙敮鎸乻elect鍗曢�夎繙绋嬫悳绱紝remote杩滅▼浠庡悗鍙板瓧鍏告暟鎹簮杩涜鎼滅储锛寀rl浠庢寚瀹氱殑url鎼滅储
+          if (item.remote || item.url) {
+            // item.remoteData = [];
+            item.loading = false;
+            item.point = { x: xIndex, y: yIndex };
+          }
+          // 鍒濆鍖栦笂浼犳枃浠朵俊鎭�
+          initUpload(item, init);
+          // 鍒濆鍖栨暟鎹簮绌哄璞�
+          if (item.dataKey) {
+            // 涓嬫媺妗嗛兘寮哄埗璁剧疆涓哄瓧绗︿覆绫诲瀷
+            item.columnType = 'string';
+            if (!item.data) {
+              item.data = [];
+            }
+          }
+
+          if (item.range || item.type == 'range') {
+            if (
+              !(props.formFields[item.field] instanceof Array) ||
+              props.formFields[item.field].length != 2
+            ) {
+              props.formFields[item.field] = ['', ''];
+            }
+            rangeFields.push(item.field);
+          }
+        });
+      });
+    };
+
+    const initSource = () => {
+      let keys = [],
+        binds = [];
+      // 鍒濆鍖栧瓧鍏告暟鎹簮
+      props.formRules.forEach((item) => {
+        item.forEach((x) => {
+          if (x.dataKey && (!x.data || x.data.length == 0) && !x.remote) {
+            x.data = [];
+            binds.push({ key: x.dataKey, data: x.data, type: x.type });
+            if (keys.indexOf(x.dataKey) == -1) {
+              keys.push(x.dataKey);
+            }
+          }
+        });
+      });
+
+      if (keys.length == 0) return;
+      appContext.config.globalProperties.http
+        .post('/api/Sys_Dictionary/GetVueDictionary', keys)
+        .then((dic) => {
+          bindOptions(dic, binds);
+          proxy.$emit('dicInited', dic);
+        });
+    };
+    const bindOptions = (dic, binds) => {
+      dic.forEach((d) => {
+        if (d.data.length > props.select2Count) {
+          if (
+            !binds.some((x) => {
+              return x.key == d.dicNo && x.type == 'cascader';
+            })
+          ) {
+            d.data.forEach((item) => {
+              item.label = item.value;
+              item.value = item.key;
+            });
+          }
+        }
+        binds.forEach((x) => {
+          if (x.key != d.dicNo) return true;
+          // 濡傛灉鏈夋暟鎹殑鍒欎笉鏌ヨ
+          if (x.data.length > 0) return true;
+          //2022.03.13澧炲姞绾ц仈鏁版嵁婧愯嚜鍔ㄨ浆鎹�
+          if (x.type == 'cascader' || x.type == 'treeSelect') {
+            let _data = JSON.parse(JSON.stringify(d.data));
+            let cascaderArr = appContext.config.globalProperties.base.convertTree(
+              _data,
+              (node, data, isRoot) => {
+                if (!node.inited) {
+                  node.inited = true;
+                  node.label = node.value;
+                  node.value = node.key;
+                }
+              }
+            );
+            props.formRules.forEach((option) => {
+              option.forEach((item) => {
+                if (item.dataKey == x.key) {
+                  item.orginData = x.data;
+                  item.data = cascaderArr;
+                }
+              });
+            });
+          } else if (d.data.length > 0 && !d.data[0].hasOwnProperty('key')) {
+            let source = d.data,
+              newSource = new Array(source.length);
+            for (let index = 0; index < source.length; index++) {
+              newSource[index] = {
+                key: source['key'] + '',
+                value: source['value']
+              };
+            }
+            x.data.push(...newSource);
+          } else {
+            x.data.push(...d.data);
+          }
+        });
+      });
+    };
+
+    const initUpload = (item, init) => {
+      if (!init) return;
+      if (
+        ['img', 'excel', 'file'].indexOf(item.type != -1) ||
+        item.columnType == 'img'
+      ) {
+        // 鍙槸娌¤缃槸鍚﹁嚜鍔ㄤ笂浼犵殑锛岄粯璁ら兘鏄�夋嫨鏂囦欢鍚庤嚜鍔ㄤ笂浼�
+        if (!item.hasOwnProperty('autoUpload')) {
+          item.autoUpload = true;
+        }
+        if (!item.hasOwnProperty('fileList')) {
+          item.fileList = true;
+        }
+        if (!item.hasOwnProperty('downLoad')) {
+          item.downLoad = true;
+        }
+        if (!item.removeBefore) {
+          item.removeBefore = (index, file, files) => {
+            return true;
+          };
+        }
+        if (!item.fileClick) {
+          item.fileClick = (index, file, files) => {
+            return true;
+          };
+        }
+        if (!item.onChange) {
+          item.onChange = (files) => {
+            return true;
+          };
+        }
+        if (!item.uploadAfter) {
+          item.uploadAfter = (result, files) => {
+            return true;
+          };
+        }
+        if (!item.uploadBefore) {
+          item.uploadBefore = (files) => {
+            return true;
+          };
+        }
+      }
+    };
+    const validate =async (callback) => {
+      let result = true;
+      await volform.value.validate((valid) => {
+        if (!valid) {
+          appContext.config.globalProperties.$message.error('鏁版嵁楠岃瘉鏈�氳繃!');
+          result = false;
+        } else if (typeof callback === 'function') {
+          try {
+            callback(valid);
+          } catch (error) {
+            let msg = `琛ㄥ崟楠岃瘉鍥炶皟鏂规硶寮傚父锛�${error.message}`;
+            appContext.config.globalProperties.$message.error(msg);
+            console.log(msg);
+          }
+        }
+      });
+      return result;
+    };
+
+    initFormRules(true);
+    return {
+      remoteCall,
+      span,
+      rangeFields,
+      numberFields,
+      validate,
+      volform
+      //  initFormRules,
+      // initSource
+    };
+  },
+  created() {
+    this.formRules.forEach((rules) => {
+      rules.forEach((option) => {
+        if (option.type == 'treeSelect' && option.multiple === undefined) {
+          option.multiple = true;
+        }
+      });
+    });
+  },
+
+  data() {
+    return {
+      // remoteCall: true,
+      defaultImg: new URL('@/assets/imgs/error-img.png', import.meta.url).href
+     // errorImg: 'this.src="' + require('@/assets/imgs/error-img.png') + '"'
+      // span: 1,
+      // rangeFields: [],
+    };
+  },
+  methods: {
+    getColWidth(item) {
+      if (item.itemStyle) {
+         return item.itemStyle;
+      }
+      //2021.08.30 澧炲姞鍔ㄦ�佽绠楄〃鍗曞搴�
+      let _span = 0;
+      this.formRules.forEach((row, xIndex) => {
+        //2022.05.06 杩藉姞琛ㄥ崟涓殣钘忕殑鍏冪礌涓嶅弬涓庡姩鎬佽绠楄〃鍗曞搴�
+        let rowLength = row.filter((item) => {
+          return !item.hidden;
+        }).length;
+        if (rowLength > _span) _span = rowLength;
+      });
+      let rate =
+        Math.round(((item.colSize || 12 / _span) / 0.12) * colPow, 10.0) / colPow;
+      // if (item.colSize) return rate.toFixed(3);
+      // return rate.toFixed(3);
+      return {width:rate.toFixed(3)+'%'};
+      // return (100 - rate).toFixed(3);
+    },
+    previewImg(url) {
+      this.base.previewImg(url, this.http.ipAddress);
+    },
+    getSrc(path) {
+      if (!path) return;
+      if (!this.base.isUrl(path) && path.indexOf('.') != -1) {
+        return this.http.ipAddress + path;
+      }
+      return path;
+    },
+    // 鏄惁涓哄浘鐗囨枃浠剁瓑鏍煎紡骞跺瀛楁鐨勮浆鎹㈡垚鏁扮粍锛歔{name:'1.jpg',path:'127.0.0.1/ff/1.jpg'}]
+    isFile(item, formFields) {
+      if (
+        item.type == 'img' ||
+        item.columnType == 'img' ||
+        item.type == 'excel' ||
+        item.type == 'file'
+      ) {
+        this.convertFileToArray(item, formFields);
+        return true;
+      }
+      return false;
+    },
+    isReadonlyImgFile(item, formFields) {
+      if ((item.disabled || item.readonly) && this.isFile(item, formFields)) {
+        return true;
+      }
+      return false;
+    },
+    convertFileToArray(item, formFields) {
+      if (!item.maxFile) {
+        item.maxFile = 1; // 榛樿鍙兘涓婁紶涓�涓枃浠讹紝鍙互鍦╫nInit涓缃�
+      }
+
+      let fileInfo = formFields[item.field];
+      if (fileInfo instanceof Array) {
+        return;
+      }
+      if (fileInfo === null || fileInfo === undefined) {
+        formFields[item.field] = [];
+        return;
+      }
+      // 灏嗕互閫楀彿闅斿紑鐨勬枃浠跺垎鍓叉垚鏁扮粍127.0.0.1/aa/1.jpg,灏�127.0.0.1/aa/2.jpg
+      if (typeof fileInfo === 'string') {
+        if (fileInfo.trim() === '') {
+          formFields[item.field] = [];
+          return;
+        }
+        // 濡傛灉鏂囦欢璺緞鏄瓧绗︿覆锛屽垯浣跨敤锛屾媶鍒�
+        fileInfo = fileInfo.replace(/\\/g, '/');
+        let files = fileInfo.split(',');
+        formFields[item.field] = [];
+        for (let index = 0; index < files.length; index++) {
+          let file = files[index];
+          let splitFile = file.split('/');
+          formFields[item.field].push({
+            name: splitFile.length > 0 ? splitFile[splitFile.length - 1] : file,
+            path: file // this.base.isUrl(file) ? file : this.http.ipAddress + file,
+          });
+        }
+      }
+    },
+    dowloadFile(file) {
+      this.base.dowloadFile(
+        file.path,
+        file.name,
+        {
+          Authorization: this.$store.getters.getToken()
+        },
+        this.http.ipAddress
+      );
+    },
+    validatorPhone(ruleOption, value, callback) {
+      if (!ruleOption.required && !value && value != '0') {
+        return callback();
+      }
+      if (!rule.phone.test((value || '').trim())) {
+        return callback(new Error('璇疯緭鍏ユ纭殑鎵嬫満鍙�'));
+      }
+      callback();
+    },
+    validatorPwd(ruleOption, value, callback) {
+      if (!ruleOption.required && !value && value != '0') {
+        return callback();
+      }
+      if ((value + '').trim().length < 6) {
+        return callback(new Error('瀵嗙爜闀垮害涓嶈兘灏忎簬6浣�'));
+      }
+      callback();
+    },
+    convertArrayValue(data, val) {
+      // 2020.12.13澧炲姞琛ㄥ崟澶氶�夊彧杞崲瀛楀吀
+      // 缂栬緫澶氶�塼able鏄剧ず
+      //2023.04.20淇鍙涓簂abel鏃跺師鏁版嵁琚瓧鍏告浛鎹簡鐨勯棶棰�
+      let valArr = Array.isArray(val)
+        ? val.map((x) => {
+            return x;
+          })
+        : val.split(',');
+      for (let index = 0; index < valArr.length; index++) {
+        var _item = data.find((x) => {
+          return x.key && x.key != '0' && x.key + '' == valArr[index] + '';
+        });
+        if (_item) {
+          valArr[index] = _item.value;
+        }
+      }
+      return valArr.join(',');
+    },
+    getText(formFields, item) {
+      // 2019.10.24淇琛ㄥ崟select缁勪欢涓哄彧璇荤殑灞炴�ф椂娌℃湁缁戝畾鏁版嵁婧�
+      let text = formFields[item.field];
+      if (typeof text === 'function') return text(formFields);
+      if (text === 'null' || text === '' || text === null || text === undefined)
+        return '--';
+      //2021.03.02澧炲姞鍙鏃舵棩鏈熷鐞�
+      if (item.type == 'date') {
+        return text.replace('T', ' ').split(' ')[0];
+      }
+      //2021.03.31淇琛ㄥ崟switch鍙鏃舵病鏈夎浆鎹㈠�肩殑闂
+      if (item.type == 'switch') {
+        return text ? '鏄�' : '鍚�';
+      }
+      if (!item.data) return text;
+      if (item.type == 'selectList' || item.type == 'checkbox') {
+        return this.convertArrayValue(item.data, text);
+      }
+      var _item = item.data.find((x) => {
+        return x.key == text;
+      });
+      return _item ? _item.value : text;
+    },
+    onClear(item, formFields) {
+      // 杩滅▼select鏍囩娓呯┖閫夐」
+      item.data.splice(0);
+      // console.log(2);
+    },
+    onChange(item, value) {
+      if (item.onChange && typeof item.onChange === 'function') {
+        item.onChange(value, item);
+      }
+    },
+    onRemoteChange(item, value) {
+      // 绗簩娆℃墦寮�鏃讹紝榛樿鍊兼垚浜唘ndefined锛屽緟鏌iewgrid涓噸缃唬鐮�
+      if (value == undefined && item.data.length > 0) {
+        this.formFields[item.field] = item.data[0].key;
+        //  console.log('undefined');
+      }
+      this.remoteCall = false;
+      if (item.onChange && typeof item.onChange === 'function') {
+        item.onChange(value, item);
+      }
+    },
+    getData(item) {
+      return item.data;
+    },
+
+    // 杩滅▼鎼滅储(鎵撳紑寮瑰嚭妗嗘椂搴旇绂佹鎼滅储)
+    remoteSearch(item, formFields, val) {
+      if (!item.remote && !item.url) {
+        return;
+      }
+      if (
+        val == '' ||
+        (item.data.length == 1 &&
+          (val == item.data[0].key || val == item.data[0].value))
+      ) {
+        return;
+      }
+      // 寮瑰嚭妗嗘垨鍒濆鍖栬〃鍗曟椂缁檇ata璁剧疆鏁扮粍榛樿鍊�2
+      // 2020.09.26淇杩滅▼鎼滅储鑷畾涔塽rl涓嶈捣浣滅敤鐨勯棶棰�
+      let url;
+      if (typeof item.url === 'function') {
+        url = item.url(val, item.dataKey, item);
+      } else {
+        url =
+          (item.url || '/api/Sys_Dictionary/GetSearchDictionary') +
+          '?dicNo=' +
+          item.dataKey +
+          '&value=' +
+          val;
+      }
+      this.http.post(url).then((dicData) => {
+        //this.$set(item, "loading", false);
+        item.loading = false;
+        item.data = dicData;
+        this.formRules[item.point.x].splice(item.point.y, 1, item);
+      });
+    },
+    getObject(date) {
+      if (typeof date === 'object') {
+        return date;
+      }
+      return new Date(date);
+    },
+    reset(sourceObj) {
+      // 閲嶇疆琛ㄥ崟鏃讹紝绂佺敤杩滅▼鏌ヨ
+      this.$refs['volform'].resetFields();
+      if (this.rangeFields.length) {
+        this.rangeFields.forEach((key) => {
+          this.formFields[key].splice(0);
+          this.formFields[key] = [null, null];
+        });
+      }
+      if (!sourceObj) return;
+      for (const key in this.formFields) {
+        if (sourceObj.hasOwnProperty(key)) {
+          this.formFields[key] = sourceObj[key];
+          if (this.numberFields.indexOf(key) != -1) {
+            this.formFields[key] = sourceObj[key] * 1 || 0;
+          }
+        }
+      }
+      //  this.remoteCall = true;
+    },
+
+    fileOnChange(files, item) {
+      this.$refs.volform.clearValidate(item.field);
+      if (item.onChange) {
+        return item.onChange(files);
+      }
+      return true;
+    },
+    isReadonly(item) {
+      return item.readonly || item.disabled;
+    },
+    getRule(item, formFields) {
+      //2021.07.17澧炲姞鍙琛ㄥ崟涓嶉獙璇�
+      //range涓巗wtich鏆傛椂涓嶅仛鏍¢獙
+      if (
+        // item.readonly ||
+        // item.disabled ||
+        item.type == 'switch' ||
+        item.type == 'range'
+      )
+        return { required: false };
+      // 鐢ㄦ埛璁剧疆鐨勮嚜瀹氫箟鏂规硶
+      if (item.validator && typeof item.validator === 'function') {
+        return {
+          validator: (rule, val, callback) => {
+            // 鐢ㄦ埛鑷畾涔夌殑鏂规硶锛屽鏋滆繑鍥炰簡鍊硷紝鐩存帴鏄剧ず杩斿洖鐨勫�硷紝楠岃瘉涓嶉�氳繃
+            let message = item.validator(rule, val);
+            if (message) return callback(new Error(message + ''));
+            return callback();
+          },
+          required: item.required,
+          trigger: rule.change.indexOf(item.type) != -1 ? 'change' : 'blur'
+        };
+      }
+      if (['img', 'excel', 'file'].indexOf(item.type) != -1) {
+        return {
+          validator: (rule, val, callback) => {
+            //2021.09.05绉婚櫎鏂囦欢涓婁紶榛樿蹇呭~
+            if (
+              item.required &&
+              !this.isReadonly(item) &&
+              (!val || !val.length)
+            ) {
+              return callback(
+                new Error(item.type == 'img' ? '璇蜂笂浼犵収鐗�' : '璇蜂笂浼犳枃浠�')
+              );
+            }
+            return callback();
+          },
+          required: item.required,
+          trigger: 'change'
+        };
+      }
+      // 璁剧疆鏁板瓧鐨勬渶澶у�兼皯鏈�灏忓��
+      if (
+        item.type == 'number' ||
+        item.columnType == 'number' ||
+        item.columnType == 'int' ||
+        item.type == 'decimal'
+      ) {
+        // 濡傛灉鏄繀濉」鐨勬暟瀛楋紝璁剧疆涓�涓粯璁ゆ渶澶т笌鏈�鍊煎皬
+        // if (item.required && typeof item.min !== 'number') {
+        //   item.min = -9999999; //item.type == "decimal" ? 0.1 : 1;
+        // }
+
+        return {
+          required: item.required,
+          message: item.title + '鍙兘鏄暟瀛�',
+          title: item.title,
+          trigger: 'blur',
+          min: item.min,
+          max: item.max,
+          type: item.columnType || item.type,
+          validator: (ruleObj, value, callback) => {
+            if (!ruleObj.min && !ruleObj.max) {
+              if (ruleObj.required) {
+                if ((!value && value != '0') || !rule.decimal.test(value)) {
+                  return callback(new Error('鍙兘鏄暟瀛�'));
+                }
+              }
+              return callback();
+            }
+            if (this.isReadonly(item)) return callback();
+            if (ruleObj.type == 'number') {
+              if (!rule.number.test(value)) {
+                ruleObj.message = ruleObj.title + '鍙兘鏄暣鏁�';
+                return callback(new Error(ruleObj.message));
+              }
+            } else {
+              if (!rule.decimal.test(value)) {
+                ruleObj.message = ruleObj.title + '鍙兘鏄暟瀛�';
+                return callback(new Error(ruleObj.message));
+              }
+            }
+            if (
+              ruleObj.min !== undefined &&
+              typeof ruleObj.min === 'number' &&
+              value < ruleObj.min
+            ) {
+              ruleObj.message = ruleObj.title + '涓嶈兘灏忎簬' + ruleObj.min;
+              return callback(new Error(ruleObj.message));
+            }
+            if (
+              ruleObj.max !== undefined &&
+              typeof ruleObj.max === 'number' &&
+              value > ruleObj.max
+            ) {
+              ruleObj.message = ruleObj.title + '涓嶈兘澶т簬' + ruleObj.max;
+              return callback(new Error(ruleObj.message));
+            }
+            return callback();
+          }
+        };
+      }
+
+      // 鎵嬫満銆佸瘑鐮侀獙璇�
+      if (item.type == 'password' || item.type == 'phone') {
+        return {
+          validator:
+            item.type == 'phone' ? this.validatorPhone : this.validatorPwd,
+          required: item.required,
+          trigger: 'blur'
+        };
+      }
+
+      if (!item.required && item.type != 'mail') return { required: false };
+
+      if (!item.hasOwnProperty('type')) item.type = 'text';
+
+      if (inputTypeArr.indexOf(item.type) != -1) {
+        let message =
+          item.title +
+          (item.type == 'mail' ? '蹇呴』鏄竴涓偖绠卞湴鍧�' : '涓嶈兘涓虹┖');
+        let type = item.type == 'mail' ? 'email' : types[item.columnType];
+        let _rule = {
+          required: item.required,
+          message: message,
+          trigger: 'blur',
+          type: type,
+          validator: (ruleObj, value, callback) => {
+            if (
+              !this.isReadonly(item) &&
+              (value === '' || value === undefined || value === null)
+            ) {
+              return callback(new Error(ruleObj.message));
+            }
+            return callback();
+          }
+        };
+        if (item.type == 'mail') {
+          _rule.validator = undefined;
+          return _rule;
+        }
+        if (item.min) {
+          _rule.min = item.min;
+          _rule.message = item.title + '鑷冲皯' + item.min + '涓瓧绗�!';
+        }
+        if (item.max) {
+          return [
+            _rule,
+            {
+              max: item.max,
+              required: true,
+              message: item.title + '鏈�澶�' + item.max + '涓瓧绗�!',
+              trigger: 'blur'
+            }
+          ];
+        }
+        return _rule;
+      }
+
+      if (item.type == 'radio') {
+        return {
+          required: item.required,
+          message: '璇烽�夋嫨' + item.title,
+          trigger: 'change',
+          type: 'string'
+        };
+      }
+      if (
+        item.type == 'date' ||
+        item.type == 'datetime' ||
+        item.type == 'year' ||
+        item.type == 'month' ||
+        item.type == 'time'
+      ) {
+        return {
+          required: true,
+          message: '璇烽�夋嫨' + item.title,
+          trigger: 'change',
+          type: item.range ? 'array' : 'string',
+          validator: (rule, val, callback) => {
+            if (this.isReadonly(item)) return callback();
+            // 鐢ㄦ埛鑷畾涔夌殑鏂规硶锛屽鏋滆繑鍥炰簡鍊硷紝鐩存帴鏄剧ず杩斿洖鐨勫�硷紝楠岃瘉涓嶉�氳繃
+            if (!val || (item.range && !val.length)) {
+              return callback(new Error('璇烽�夋嫨鏃ユ湡'));
+            }
+            return callback();
+          }
+        };
+      }
+
+      if (item.type == 'cascader') {
+        return {
+          type: 'array',
+          required: true,
+          min: item.min || 1,
+          // message: "璇烽�夋嫨" + item.title,
+          trigger: 'change',
+          validator: (rule, val, callback) => {
+            if (this.isReadonly(item)) return callback();
+            // 鐢ㄦ埛鑷畾涔夌殑鏂规硶锛屽鏋滆繑鍥炰簡鍊硷紝鐩存帴鏄剧ず杩斿洖鐨勫�硷紝楠岃瘉涓嶉�氳繃
+            let _arr = this.formFields[item.field];
+            if (!_arr || !_arr.length) {
+              return callback(new Error('璇烽�夋嫨' + item.title));
+            }
+            return callback();
+          }
+        };
+      }
+
+      if (
+        ['select', 'selectList', 'checkbox', 'cascader', 'treeSelect'].indexOf(
+          item.type
+        ) != -1
+      ) {
+        let _rule = {
+          type: item.type == 'select' ? 'string' : 'array',
+          required: true,
+          min: item.min || 1,
+          message: '璇烽�夋嫨' + item.title,
+          trigger: 'change',
+          validator: (rule, value, callback) => {
+            if (this.isReadonly(item)) return callback();
+            //2021.11.27淇澶氶�夋病鏈夋彁绀虹殑闂
+            if (value == undefined || value === '') {
+              return callback(new Error(rule.message));
+            } else if (
+              (item.type == 'checkbox' ||
+                item.type == 'selectList' ||
+                item.type == 'treeSelect') &&
+              (!(value instanceof Array) || !value.length)
+            ) {
+              return callback(new Error(rule.message));
+            }
+            return callback();
+          }
+        };
+
+        if (_rule.max) {
+          _rule.nax = item.max;
+          _rule.message = '鏈�澶氬彧鑳介�夋嫨' + item.max + '椤�';
+        }
+        return _rule;
+      }
+      return {};
+    },
+    compareDate(date1, date2) {
+      if (!date2) {
+        return true;
+      }
+      return (
+        date1.valueOf() <
+        (typeof date2 == 'number' ? date2 : new Date(date2).valueOf())
+      );
+    },
+    getDateOptions(date, item) {
+      //2021.07.17璁剧疆鏃堕棿鍙�夎寖鍥�
+      if ((!item.min && !item.max) || !date) {
+        return false;
+      }
+      if (item.min && item.min.indexOf(' ') == -1) {
+        //涓嶈缃椂鍒嗙锛屽悗闈細鑷姩鍔犱笂 08:00
+        item.min = item.min + ' 00:00:000';
+      }
+      return (
+        this.compareDate(date, item.min) || !this.compareDate(date, item.max)
+      );
+    },
+    getDateFormat(item) {
+      if(item.format){
+        return item.format;
+      }
+      if (item.type == 'year') {
+        return 'YYYY';
+      }
+      if (item.type == 'month') {
+        return 'YYYY-MM';
+      }
+      // if (item.type=='time') {
+      //     return 'HH:mm:ss'
+      // }
+      //瑙乭ttps://day.js.org/docs/zh-CN/display/format
+      return item.type == 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss';
+    },
+    dateRangeChange(val, item) {
+      if (!val) {
+        this.$emit('update:formFields');
+        return;
+      }
+      item.onChange && item.onChange(val);
+    },
+    onKeyPress($event, item) {
+      if ($event.keyCode == 13) {
+        return;
+      }
+     item.onKeyPress&&item.onKeyPress($event);
+    },
+    filterMethod(value, data) {
+      return data.label.includes(value);
+    },
+    getNode( label,node, data){
+      console.log(label)
+    },
+    getShortcuts() {
+      const end = new Date()
+      return [
+        { name: '浠婂ぉ', value: 0 },
+        { name: '鏄ㄥぉ', value: 1 },
+        { name: '杩戜笁澶�', value: 2 },
+        { name: '杩戜竴鍛�', value: 6 },
+        { name: '杩戜竴鏈�', m: true, value: 1 },
+        { name: '杩戜笁鏈�', m: true, value: 3 },
+        { name: '杩戝崐骞�', m: true, value: 6 },
+        { name: '杩戜竴骞�', m: true, value: 12 }
+      ].map((x) => {
+        return {
+          text: this.$ts(x.name),
+          value: () => {
+            const start = new Date()
+            if (x.m) {
+              start.setMonth(start.getMonth() - x.value)
+              return [start.getTime(), end]
+            }
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * x.value)
+            return [start, end]
+          }
+        }
+      })
+    },
+    handleImageError($e) {
+      $e.target.src = this.defaultImg
+    }
+  }
+});
+</script>
+<style lang="less" scoped>
+.el-form-item {
+  margin-right: 0;
+}
+.el-form-item {
+  .form-imgs {
+    img {
+      float: left;
+      cursor: pointer;
+      object-fit: cover;
+      margin: 0 10px 10px 0;
+      width: 65px;
+      height: 65px;
+      border: 1px solid #c7c7c7;
+      overflow: hidden;
+      border-radius: 5px;
+      box-sizing: content-box;
+    }
+  }
+}
+.el-form-item ::v-deep(.el-form-item__label) {
+  padding: 0 0px 0 4px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.el-form-item ::v-deep(.el-range-separator) {
+  text-align: center;
+  width: 13px;
+  padding: 0px 1px;
+  font-size: 12px;
+}
+.el-form-item ::v-deep(.el-range__close-icon) {
+  margin-right: -10px;
+}
+.form-item-extra {
+  > *:first-child {
+    flex: 1;
+  }
+  display: flex;
+  .form-extra {
+    padding-left: 7px;
+    line-height: 36px;
+  }
+}
+.vol-form-item {
+  width: 100%;
+}
+.vol-form-item ::v-deep(.el-form-item__content) {
+  display: unset !important;
+}
+.vol-form-item ::v-deep(.el-input--large .el-input__inner) {
+  height: 34px !important;
+}
+.vol-form-item ::v-deep(.el-input-number--large .el-input-number__increase) {
+  border-top: 1px solid #d4d4d4;
+}
+.vol-form-item ::v-deep(.el-input-number--large .el-input-number__decrease) {
+  border-bottom: 1px solid #d4d4d4;
+}
+.vol-form-item ::v-deep(.el-input--large.el-date-editor) {
+  height: 36px;
+}
+.v-date-range ::v-deep(.el-input__prefix) {
+  display: none;
+}
+.v-date-range ::v-deep(.el-input__inner) {
+  padding: 0;
+}
+
+.el-form-item ::v-deep(.el-checkbox) {
+  margin-right: 8px;
+}
+.el-form-item ::v-deep(.el-checkbox .el-checkbox__label) {
+  padding-left: 5px;
+}
+.el-form-item ::v-deep(textarea) {
+  font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB',
+    'Microsoft YaHei', '寰蒋闆呴粦', Arial, sans-serif !important;
+}
+.el-form-item ::v-deep(.el-select .el-select__tags > span) {
+  display: flex;
+}
+.el-form-item ::v-deep(.el-select-v2__combobox-input) {
+  height: 30px;
+}
+.el-form-item ::v-deep(.el-select__tags) {
+  overflow: hidden;
+  height: 30px;
+}
+.el-form-item ::v-deep(.el-select-tags-wrapper) {
+  position: absolute;
+}
+
+.el-form-item {
+  vertical-align: top !important;
+}
+.form-file-list {
+  a {
+    color: #3ea9ff;
+  }
+  a:hover {
+    cursor: pointer;
+    color: #0281e7;
+  }
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolFormDraggable/VolFormDraggable.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolFormDraggable/VolFormDraggable.vue
new file mode 100644
index 0000000..f4d07ea
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolFormDraggable/VolFormDraggable.vue
@@ -0,0 +1,1157 @@
+<template>
+  <div class="drag-container">
+    <!-- @start="onStart" -->
+    <div class="drag-left">
+      <div class="left-title">缁勪欢鍒楄〃</div>
+      <draggable
+        v-model="components"
+        @end="end1"
+        class="left-draggable-item"
+        :group="{ name: 'componentsGroup', pull: 'clone', put: false }"
+        animation="300"
+        @start="onStart"
+        :sort="false"
+        :move="onMove1"
+      >
+        <transition-group>
+          <div
+            :class="item.id == 1 ? 'item forbid' : 'item'"
+            v-for="item in components"
+            :key="item.id"
+          >
+            <i :class="item.icon"></i> {{ item.name }}
+          </div>
+        </transition-group>
+      </draggable>
+      <div class="example">
+        <div @click="example1">绀轰緥涓�<i class="el-icon-arrow-right"></i></div>
+        <div @click="example2">绀轰緥浜�<i class="el-icon-arrow-right"></i></div>
+        <div @click="example3">绀轰緥涓�<i class="el-icon-arrow-right"></i></div>
+      </div>
+    </div>
+
+    <div class="drag-center">
+      <div class="center-top">
+        <span>
+          <!-- <i class="el-icon-warning-outline"></i>楂樻晥鐨勮〃鍗曢厤缃� -->
+        </span>
+        <el-button type="primary" size="mini" plain @click="save"
+          ><i class="el-icon-check"> </i>淇濆瓨</el-button
+        >
+        <el-button type="primary" size="mini" plain @click="preview(true)"
+          ><i class="el-icon-view"> </i>棰勮</el-button
+        >
+        <el-button type="primary" size="mini" plain @click="download"
+          ><i class="el-icon-view"> </i>涓嬭浇</el-button
+        >
+        <el-button type="primary" @click="clearItems" size="mini" plain
+          ><i class="el-icon-delete"> </i>娓呯┖</el-button
+        >
+        <a
+          style="margin-left: 15px"
+          href="http://v2.volcore.xyz/document/api"
+          target="_blank"
+          >璁捐鍣ㄥ熀浜庢鏋秜olform銆乿oltable銆乿olupload銆乿olbox瀹氬埗寮�鍙�</a
+        >
+      </div>
+      <div>
+        <el-alert
+          title="鍏充簬琛ㄥ崟璁捐鍣�"
+          type="success"
+          :show-icon="true"
+          :closable="false"
+        >
+          <div>
+            1銆佽〃鍗曡璁″櫒鍩轰簬draggable寮�鍙�,涓烘湰妗嗘灦鑷畾涔夐〉闈㈠姛鑳界殑琛ュ厖,妗嗘灦浠嶄互鍙鍖栦唬鐮佺敓鎴愬櫒涓烘牳蹇�
+          </div>
+          <div>
+            2銆佹敮鎸佸彲瑙嗗寲璁捐1瀵�1銆�1瀵瑰鍙婅〃鍗曚笅鎷夋鑷姩缁戝畾銆乼able鑷姩鍔犺浇鏁版嵁(鍒嗛〉銆佺紪杈�)銆佽嚜鍔ㄤ笂浼犳枃浠躲�佸瘜鏂囨湰缂栬緫
+          </div>
+        </el-alert>
+      </div>
+      <el-scrollbar style="flex: 1">
+        <div class="tips" key="empty" v-show="!currentComponents.length">
+          璇峰皢宸﹁竟缁勪欢鎷栧叆姝ゅ鍣ㄤ腑
+        </div>
+        <el-form label-position="top">
+          <draggable
+            class="draggable-container"
+            v-model="currentComponents"
+            @end="end2"
+            animation="300"
+            :move="onMove"
+            group="componentsGroup"
+          >
+            <transition-group class="drag-center-item">
+              <div
+                class="item2"
+                :class="{ actived: index === currentIndex }"
+                @click="itemClick(item, index)"
+                :style="{ width: item.width + '%' }"
+                v-for="(item, index) in currentComponents"
+                :key="index"
+              >
+                <i
+                  class="el-icon-document-copy"
+                  @click.stop="copyItem(item)"
+                ></i>
+                <i class="el-icon-delete" @click.stop="removeItem(index)"> </i>
+                <el-form-item
+                  :required="item.required"
+                  label-position="top"
+                  style="width: 100%"
+                  :label="item.type == 'line' ? '' : item.name"
+                >
+                  <el-col>
+                    <!-- <div></div> -->
+                    <!-- {{ item.name }} -->
+                    <el-input
+                      v-if="item.type == 'text'"
+                      placeholder="璇疯緭鍏ュ唴瀹�"
+                      v-model="item.value"
+                      :disabled="item.readonly"
+                      size="medium"
+                    ></el-input>
+                    <el-input
+                      v-else-if="item.type == 'textarea'"
+                      type="textarea"
+                      v-model="item.value"
+                      :disabled="item.readonly"
+                      placeholder="璇疯緭鍏ュ唴瀹�"
+                    ></el-input>
+                    <el-date-picker
+                      v-else-if="item.type == 'date'"
+                      align="right"
+                      v-model="item.value"
+                      type="date"
+                      :disabled="item.readonly"
+                      size="medium"
+                      placeholder="閫夋嫨鏃ユ湡"
+                    >
+                    </el-date-picker>
+                    <el-radio-group
+                      :disabled="item.readonly"
+                      v-else-if="item.type == 'radio'"
+                      v-model="item.value"
+                    >
+                      <el-radio
+                        v-for="item in item.data"
+                        :key="item.key"
+                        :label="item.value"
+                        :value="item.key"
+                      >
+                      </el-radio>
+                      <!-- <el-radio :label="1">鏄�</el-radio>
+                      <el-radio :label="0">鍚�</el-radio> -->
+                    </el-radio-group>
+
+                    <el-checkbox-group
+                      v-model="item.values"
+                      :disabled="item.readonly"
+                      style="width: 100%; display: inline-block"
+                      v-else-if="item.type == 'checkbox'"
+                    >
+                      <el-checkbox
+                        v-for="item in item.data"
+                        :key="item.key"
+                        :label="item.value"
+                        :value="item.key"
+                      >
+                      </el-checkbox>
+                      <!-- <el-checkbox label="澶嶉�夋 A"></el-checkbox>
+                      <el-checkbox label="澶嶉�夋 B"></el-checkbox>
+                      <el-checkbox label="澶嶉�夋 C"></el-checkbox> -->
+                    </el-checkbox-group>
+
+                    <el-select
+                      style="width: 100%"
+                      :disabled="item.readonly"
+                      v-model="item.value"
+                      size="medium"
+                      v-else-if="item.type == 'select'"
+                      placeholder="璇烽�夋嫨"
+                    >
+                      <el-option
+                        v-for="item in item.data"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                      >
+                      </el-option>
+                    </el-select>
+                    <el-select
+                      style="width: 100%"
+                      :disabled="item.readonly"
+                      v-model="item.values"
+                      size="medium"
+                      :multiple="true"
+                      v-else-if="item.type == 'selectList'"
+                      placeholder="璇烽�夋嫨"
+                    >
+                      <el-option
+                        v-for="item in item.data"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value"
+                      >
+                      </el-option>
+                    </el-select>
+                    <el-cascader
+                      :disabled="item.readonly"
+                      style="width: 100%"
+                      v-else-if="item.type == 'cascader'"
+                      v-model="item.values"
+                      :options="item.data"
+                      @change="() => {}"
+                    ></el-cascader>
+
+                    <el-switch
+                      :disabled="item.readonly"
+                      v-model="item.value"
+                      style="width: 100%"
+                      v-else-if="item.type == 'switch'"
+                      active-color="#13ce66"
+                      inactive-color="#0e7ef3"
+                      :active-value="1"
+                      :inactive-value="0"
+                    >
+                    </el-switch>
+                    <div class="col-line" v-else-if="item.type == 'line'">
+                      {{ item.name }}
+                    </div>
+
+                    <vol-upload
+                      v-else-if="
+                        item.type == 'img' ||
+                        item.type == 'excel' ||
+                        item.type == 'file'
+                      "
+                      :fileInfo="item.fileInfo"
+                      :url="item.url"
+                      :img="item.type == 'img'"
+                      :excel="item.type == 'excel'"
+                      :multiple="item.multiple"
+                      :max-size="item.maxSize"
+                      :max-file="item.maxFile"
+                      :autoUpload="item.autoUpload"
+                    >
+                    </vol-upload>
+                    <vol-wang-editor
+                      v-else-if="item.type == 'editor'"
+                      :url="item.url"
+                      v-model="item.value"
+                      :height="item.height"
+                    ></vol-wang-editor>
+
+                    <vol-table
+                      v-else-if="item.type == 'table'"
+                      :url="item.url"
+                      :load-key="true"
+                      :index="item.edit"
+                      :tableData="item.tableData"
+                      :columns="item.columns"
+                      :height="item.height"
+                      :pagination-hide="true"
+                      :column-index="item.columnIndex"
+                      :ck="item.ck"
+                    ></vol-table>
+                    <el-button
+                      @click="model = true"
+                      v-else-if="item.type == 'box'"
+                      type="primary"
+                      size="small"
+                      >{{ item.name }}</el-button
+                    >
+                  </el-col>
+                </el-form-item>
+              </div>
+            </transition-group>
+          </draggable>
+        </el-form>
+      </el-scrollbar>
+    </div>
+    <div class="drag-right">
+      <div class="left-title">缁勪欢灞炴��</div>
+      <div class="attr" v-show="currentIndex != -1">
+        <div class="attr-item">
+          <div class="text">瀛楁鍚嶇О</div>
+          <el-input size="medium" v-model="currentItem.name" />
+        </div>
+        <div class="attr-item">
+          <div class="text">瀛楁(鍞竴瀛楁)</div>
+          <el-input size="medium" v-model="currentItem.field" />
+        </div>
+        <div class="attr-item" v-show="currentItem.type == 'table'">
+          <div class="text">鍚庡彴杩斿洖鏁版嵁鎺ュ彛鍦板潃</div>
+          <el-input
+            size="medium"
+            placeholder="渚�:api/琛ㄥ悕/getPageData"
+            v-model="currentItem.url"
+          />
+        </div>
+        <div
+          class="attr-item"
+          v-show="
+            currentItem.type != 'table' && currentItem.hasOwnProperty('url')
+          "
+        >
+          <div class="text">涓婁紶鎺ュ彛鍦板潃(鍚庡彴鎺ュ彛)</div>
+          <el-input
+            size="medium"
+            placeholder="鍙敤妗嗘灦鍦板潃:api/琛ㄥ悕/upload"
+            v-model="currentItem.url"
+          />
+          <div class="text" style="margin-top: 10px">鏂囦欢澶у皬闄愬埗(M)</div>
+          <el-input size="medium" v-model="currentItem.maxSize" />
+          <div class="text" style="margin-top: 10px">鏄惁澶氭枃浠朵笂浼�</div>
+          <el-switch
+            v-model="currentItem.multiple"
+            style="width: 100%"
+            active-color="#13ce66"
+            inactive-color="rgb(165 165 165)"
+            :active-value="true"
+            :inactive-value="false"
+          >
+          </el-switch>
+          <div class="text" style="margin-top: 10px">鏄惁鑷姩涓婁紶</div>
+          <el-switch
+            v-model="currentItem.autoUpload"
+            style="width: 100%"
+            active-color="#13ce66"
+            inactive-color="rgb(165 165 165)"
+            :active-value="true"
+            :inactive-value="false"
+          >
+          </el-switch>
+        </div>
+        <div class="attr-item" v-show="currentItem.data">
+          <div class="text">鏁版嵁婧�(涓嬫媺妗嗙粦瀹氳缃腑缁存姢)</div>
+
+          <!-- dicList -->
+          <el-select
+            style="width: 100%"
+            v-model="currentItem.key"
+            size="medium"
+            @change="dicChange"
+            placeholder="璇烽�夋嫨鏁版嵁婧愬瓧鍏�"
+          >
+            <el-option
+              v-for="item in dicList"
+              :key="item.key"
+              :label="item.value"
+              :value="item.key"
+            >
+            </el-option>
+          </el-select>
+        </div>
+        <div class="attr-item" v-show="currentItem.type != 'table'">
+          <div class="text">鏍囩瀹藉害</div>
+          <el-slider
+            style="width: 90%"
+            :min="20"
+            v-model="colWidth"
+            :step="10"
+            show-stops
+          >
+          </el-slider>
+        </div>
+        <div class="attr-item attr2" v-show="currentItem.type != 'table'">
+          <div>
+            <div class="text">蹇呭~</div>
+            <el-switch
+              v-model="currentItem.required"
+              style="width: 100%"
+              active-color="#13ce66"
+              inactive-color="rgb(165 165 165)"
+              :active-value="true"
+              :inactive-value="false"
+            >
+            </el-switch>
+          </div>
+
+          <div>
+            <!-- active-text="鏄�"
+              inactive-text="鍚�" -->
+            <div class="text">鍙</div>
+            <el-switch
+              v-model="currentItem.readonly"
+              style="width: 100%"
+              active-color="#13ce66"
+              inactive-color="rgb(165 165 165)"
+              :active-value="true"
+              :inactive-value="false"
+            >
+            </el-switch>
+          </div>
+        </div>
+        <div v-show="currentItem.type == 'table'">
+          <div class="attr-item">
+            <div class="text">鏄惁浣跨敤閫夐」鍗�(tabs)</div>
+            <div>
+              <el-switch
+                v-model="currentItem.tabs"
+                style="width: 100%"
+                active-text="鏄�"
+                inactive-text="鍚�"
+                active-color="#13ce66"
+                inactive-color="rgb(165 165 165)"
+                :active-value="true"
+                :inactive-value="false"
+              >
+              </el-switch>
+            </div>
+          </div>
+          <div class="attr-item attr2">
+            <el-button
+              style="width: 100%"
+              @click="openTableModel"
+              type="primary"
+              size="medium"
+              >table閰嶇疆</el-button
+            >
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <vol-box
+    v-model="model"
+    :height="300"
+    :width="550"
+    :lazy="true"
+    title="寮瑰嚭妗�"
+  >
+    <template #content>
+      <div>寮瑰嚭妗嗗唴瀹�</div>
+    </template>
+    <template #footer>
+      <div>
+        <el-button type="primary" size="mini" @click="model = false"
+          ><i class="el-icon-close"></i>鐐瑰嚮鍏抽棴</el-button
+        >
+        <el-button size="mini" @click="model = false"
+          ><i class="el-icon-close"></i>鍏抽棴</el-button
+        >
+      </div>
+    </template>
+  </vol-box>
+
+  <vol-box
+    v-model="previewModel"
+    :height="600"
+    :width="1300"
+    :lazy="true"
+    :padding="1"
+    :close="false"
+    title="棰勮"
+  >
+    <preview style="height:600px" :options="viewFormData"></preview>
+  </vol-box>
+
+  <vol-box
+    v-model="tableModel"
+    :height="600"
+    :width="1300"
+    :lazy="true"
+    :padding="0"
+    :title="currentItem.name"
+  >
+    <template #content>
+      <div style="height:600px" >
+      <el-alert title="鍏充簬table閰嶇疆" type="info" :closable="false" show-icon>
+        姝ゅtable鏄妗嗘灦voltable鍩烘湰鎿嶄綔鐨勯厤缃�,濡傛灉闇�瑕佷簨浠惰Е鍙戙�佹暟鎹姞杞界瓑鏇村鍔熻兘锛岃鍦ㄧ敓鎴愬悗鐨勪唬鐮佹坊鍔犻渶瑕佺殑鍔熻兘锛屽畬鏁撮厤缃鏂囨。<a
+          href="http://v2.volcore.xyz/document/api"
+          style="color: #1e88e5; margin-left: 9px"
+          target="_blank"
+          >voltable</a
+        >
+      </el-alert>
+      <div class="btns">
+        <div class="btns-left">
+          琛ㄦ牸榛樿鍔熻兘鎸夐挳锛�
+          <el-checkbox
+            v-for="item in currentItem.buttons"
+            :label="item.name"
+            :key="item.name"
+            >{{ item.name }}</el-checkbox
+          >
+        </div>
+        <div class="btns-right">
+          <el-button type="primary" size="mini" @click="addRow"
+            ><i class="el-icon-plus"></i>娣诲姞瀛楁</el-button
+          >
+          <el-button type="primary" size="mini" @click="delRow"
+            ><i class="el-icon-delete"></i>鍒犻櫎瀛楁</el-button
+          >
+          <el-button type="primary" size="mini" @click="sortRow"
+            ><i class="el-icon-sort"></i>閲嶆柊鎺掑垪</el-button
+          >
+        </div>
+      </div>
+      <vol-table
+        :load-key="true"
+        :tableData="currnetTableData"
+        :columns="currentTableOption"
+        :height="448"
+        ref="table"
+        :index="true"
+        :pagination-hide="true"
+        :column-index="true"
+        :ck="true"
+      ></vol-table>
+    </div>
+    </template>
+    <template #footer>
+      <div style="text-align: center">
+        <el-button size="mini" @click="tableModel = false"
+          ><i class="el-icon-close"></i>鍏抽棴</el-button
+        >
+        <el-button type="primary" size="mini" @click="saveConfigOptions"
+          ><i class="el-icon-check"></i>淇濆瓨</el-button
+        >
+      </div>
+    </template>
+  </vol-box>
+</template>
+
+<script>
+import { h, resolveComponent } from "vue";
+// import draggable from "vuedraggable";
+import { VueDraggableNext } from "vue-draggable-next";
+import VolWangEditor from "@/components/editor/VolWangEditor.vue";
+import VolUpload from "./../VolUpload";
+import VolTable from "./../VolTable";
+import VolBox from "./../VolBox";
+import VolFormPreview from "./VolFormPreview";
+import { components, tableOption } from "./options";
+import { options1, options2, options3 } from "./formTemplate";
+import downloadForm from "./DownloadForm";
+export default {
+  props: {
+    userComponents: {
+      type: Array,
+      default: () => {
+        return [];
+      },
+    },
+  },
+  components: {
+    draggable: VueDraggableNext,
+    "vol-upload": VolUpload,
+    "vol-wang-editor": VolWangEditor,
+    "vol-table": VolTable,
+    "vol-box": VolBox,
+    preview: VolFormPreview,
+  },
+  data() {
+    return {
+      options:{},
+      options1: options1,
+      options2: options2,
+      options3: options3,
+      colWidth: 100,
+      currentIndex: -1,
+      currentItem: {},
+      currnetTableData: [],
+      currentTableOption: tableOption,
+      //瀹氫箟瑕佽鎷栨嫿瀵硅薄鐨勬暟缁�
+      components: components,
+      currentComponents: [],
+      dicList: [],
+      model: false,
+      tableModel: false,
+      previewModel: false,
+      viewFormData: { fields: {}, formOptions: [], tables: [] },
+    };
+  },
+  watch: {
+    colWidth(newVal) {
+      if (this.currentIndex != -1) {
+        this.currentComponents[this.currentIndex].width = newVal;
+      }
+    },
+    userComponents: {
+      handler(newVal) {
+        this.currentComponents = newVal;
+      },
+      immediate: true,
+      deep: true,
+    },
+  },
+  created() {
+    this.currentComponents = this.userComponents;
+    this.http
+      .post("api/Sys_Dictionary/GetBuilderDictionary", {}, false)
+      .then((x) => {
+        this.dicList = x.map((c) => {
+          return { key: c, value: c };
+        });
+      });
+  },
+  methods: {
+    getFormOptions(item) {
+      let _option = {};
+      _option.field = item.field;
+      _option.title = item.name;
+      _option.type = item.type;
+      _option.required = item.required;
+      _option.readonly = item.readonly;
+      if (item.type == "line") {
+        _option.title = "";
+        let title = item.name;
+        _option.render = (h) => {
+          return h(
+            "div",
+            {
+              style: {
+                "line-height": "25px",
+                "font-weight": "bold",
+                "margin-left": "15px",
+                "border-bottom": "1px solid #dadada",
+              },
+            },
+            title
+            //涔熷彲浠ュ湪杩欓噷鏀句竴浜涚粍浠讹紝渚嬪锛�
+            // resolveComponent("el-tooltip"),
+            // {
+            //   content: "杩欓噷鏄彁绀虹殑鍐呭",
+            //   props: { effect: "dark", placement: "top-start" },
+            //   style: {},
+            // },
+            // [h("a", { style: { color: "#2a92ff" } }, "鎻愮ず淇℃伅")]
+          );
+        };
+      }
+      if (item.type == "editor") {
+        _option.height = item.height;
+      }
+      if (item.width == 100) {
+        _option.colSize = 12;
+      } else {
+        _option.colSize = (_option.width * 12) / 100;
+      }
+      if (["img", "excel", "file"].indexOf(item.type) != -1) {
+        _option.maxSize = item.maxSize;
+        _option.fileInfo = item.fileInfo;
+        _option.multiple = item.multiple;
+        _option.autoUpload = item.autoUpload;
+        _option.maxFile = item.maxFile;
+      }
+      if (
+        ["img", "excel", "file", "editor", "table"].indexOf(item.type) != -1
+      ) {
+        _option.url = item.url;
+      }
+      if (item.data) {
+        _option.data = item.data;
+        _option.dataKey = item.key;
+      }
+      return _option;
+    },
+    getLineFormOptions(index) {
+      let _index = index;
+      let endIndex = index;
+      let width = 0;
+      let _options = [];
+      for (index; index < this.filterCurrentComponents().length; index++) {
+        const item = this.currentComponents[index];
+        if (item.width + width <= 100) {
+          width = item.width + width;
+          endIndex = index;
+          _options.push(this.getFormOptions(item));
+        }
+      }
+      return { options: _options, index: _index, endIndex: endIndex };
+    },
+    filterCurrentComponents() {
+      return this.currentComponents.filter((x) => {
+        return x.type != "table";
+      });
+    },
+    setSpan() {},
+    preview(isPre) {
+      let _fields = {};
+      let _formOptions = [];
+      let endIndex = -1;
+      this.filterCurrentComponents().forEach((item, index) => {
+        if (item.hasOwnProperty("values")) {
+          _fields[item.field] = [];
+        } else {
+          _fields[item.field] = null;
+        }
+
+        if (item.width == 100) {
+          _formOptions.push([this.getFormOptions(item)]);
+        } else {
+          if (endIndex == -1) {
+            let lineOptions = this.getLineFormOptions(index);
+            endIndex = lineOptions.endIndex;
+            _formOptions.push(lineOptions.options);
+            endIndex--;
+          } else {
+            endIndex--;
+          }
+        }
+        // _fields[item.field] = null;xc
+        // let _option = {};
+        // _option.field = item.field;
+        // _option.title = item.name;
+        // _option.type = item.type;
+        // _option.required = item.required;
+        // _option.readonly = item.readonly;
+        // if (["img", "excel", "file"].indexOf(item.type) != -1) {
+        //   _option.maxSize = item.maxSize;
+        //   _option.fileInfo = item.fileInfo;
+        //   _option.multiple = item.multiple;
+        //   _option.autoUpload = item.autoUpload;
+        //   _option.maxFile = item.maxFile;
+        // }
+        // if (
+        //   ["img", "excel", "file", "editor", "table"].indexOf(item.type) != -1
+        // ) {
+        //   _option.url = item.url;
+        // }
+        // if (item.data) {
+        //   _option.data = item.data;
+        //   _option.dataKey = item.key;
+        // }
+        // _formOptions.push(_option);
+      });
+      this.viewFormData.fields = _fields;
+      // console.log(JSON.stringify(_formOptions))
+      this.viewFormData.formOptions = _formOptions;
+      if (isPre) {
+        this.previewModel = true;
+      }
+      let tableIndex = 0;
+      let keys = [];
+      let tables = this.currentComponents
+        .filter((x) => {
+          return x.type == "table";
+        })
+        .map((m) => {
+          m.pagination = !m.url;
+          if (m.name == "琛ㄦ牸") {
+            tableIndex++;
+          }
+          return {
+            name: m.name + (m.name == "琛ㄦ牸" ? tableIndex : ""),
+            url: m.url,
+            tabs: m.tabs,
+            pagination: m.pagination,
+            buttons: m.buttons,
+            columns: m.columns.map((c) => {
+              let obj = {
+                title: c.title,
+                field: c.field,
+                hidden: !c.show,
+                width: c.width,
+                required: c.required,
+              };
+
+              if (c.dataSource) {
+                obj.bind = { key: c.dataSource, data: [] };
+              }
+              if (c.dataSource) {
+                keys.push(c.dataSource);
+              }
+              if (c.edit) {
+                if (!obj.bind) {
+                  obj.bind = { key: "", data: [] };
+                }
+                obj.edit = { type: c.editType };
+              }
+              return obj;
+            }),
+            tableData: [{}, {}, {}],
+          };
+        });
+      this.viewFormData.tables = tables.filter((x) => {
+        return !x.tabs;
+      });
+      this.viewFormData.tabs = tables.filter((x) => {
+        return x.tabs;
+      });
+      this.getDicKeys(keys);
+          this.options = this.viewFormData;
+    },
+    getDicKeys(keys) {
+      if (!keys.length) {
+        return;
+      }
+      this.http
+        .post("api/Sys_Dictionary/GetVueDictionary", keys, true)
+        .then((result) => {
+          result.forEach((c) => {
+            this.viewFormData.tables.forEach((t) => {
+              let _option = t.columns.find((x) => {
+                return x.bind && x.bind.key == c.dicNo;
+              });
+              if (_option) {
+                _option.bind.data = c.data;
+              }
+            });
+            this.viewFormData.tabs.forEach((t) => {
+              let _option = t.columns.find((x) => {
+                return x.bind && x.bind.key == c.dicNo;
+              });
+              if (_option) {
+                _option.bind.data = c.data;
+              }
+            });
+          });
+        });
+    },
+    save() {
+      this.preview(false);
+      this.$emit("save", {
+        daraggeOptions: this.currentComponents,
+        formOptions: this.viewFormData,
+      });
+    },
+    download() {
+      this.preview(false);
+      downloadForm.call(this);
+    },
+    openTableModel() {
+      let dataSource = this.currentTableOption.find((x) => {
+        return x.field == "dataSource";
+      });
+      if (!dataSource.bind.data.length) {
+        dataSource.bind.data = this.dicList;
+      }
+      this.currnetTableData = JSON.parse(
+        JSON.stringify(this.currentItem.columns)
+      );
+      this.tableModel = true;
+    },
+    addRow() {
+      this.currnetTableData.push({ field: this.getField() });
+    },
+    delRow() {
+      this.$confirm("纭瑕佸垹闄ら�夋嫨鐨勬暟鎹悧?", "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+        center: true,
+      }).then(() => {
+        this.$refs.table.delRow();
+      });
+    },
+    sortRow() {
+      this.currnetTableData = this.currnetTableData.sort((a, b) => {
+        return a.orderNo - b.orderNo;
+      }); //.reverse();
+      this.$Message.success("鍒楁樉绀洪『搴忓凡閲嶆柊鎺掑垪,鐐瑰嚮棰勮鍙煡鐪�");
+    },
+    saveConfigOptions() {
+      this.currentItem.columns = JSON.parse(
+        JSON.stringify(this.currnetTableData)
+      );
+      this.tableModel = false;
+    },
+    copyItem(item) {
+      let itemClone = JSON.parse(JSON.stringify(item));
+      itemClone.field = "field" + new Date().valueOf();
+      this.currentComponents.push(itemClone);
+    },
+    removeItem(index) {
+      this.currentComponents.splice(index, 1);
+      this.colWidth = 100;
+      this.currentIndex = -1;
+      this.currentItem = {};
+    },
+    clearItems() {
+      this.currentComponents.length = 0;
+      this.colWidth = 100;
+      this.currentIndex = -1;
+      this.currentItem = {};
+    },
+    itemClick(item, index) {
+      this.currentIndex = index;
+      this.colWidth = this.currentComponents[this.currentIndex].width;
+      this.currentItem = this.currentComponents[this.currentIndex];
+    },
+    //寮�濮嬫嫋鎷戒簨浠�
+    onStart(e, e1) {
+      this.drag = true;
+    },
+    getField() {
+      return "field" + new Date().valueOf();
+    },
+    //宸﹁竟寰�鍙宠竟鎷栧姩鏃剁殑浜嬩欢
+    end1(e) {
+      if (1 == 1 && e.from !== e.to) {
+        let obj = JSON.parse(JSON.stringify(this.components[e.oldIndex]));
+        obj.field = this.getField();
+        obj.width = 100;
+        obj.readonly = false;
+        obj.required = false;
+        this.currentComponents.splice(e.newIndex, 1, obj);
+        this.userComponents.splice(0);
+        this.userComponents.push(...this.currentComponents);
+        // this.currentComponents = this.currentComponents.filter((x) => {
+        //   return x.hasOwnProperty("field");
+        // });
+        this.colWidth = 100;
+        this.currentIndex = e.newIndex; //this.currentComponents.length - 1;
+        this.currentItem = this.currentComponents[this.currentIndex];
+      }
+    },
+    //鍙宠竟寰�宸﹁竟鎷栧姩鏃剁殑浜嬩欢
+    end2(e) {},
+    onMove1(e, originalEvent) {
+      // this.moveId = e.relatedContext.element.id;
+      return true;
+    },
+    //move鍥炶皟鏂规硶
+    onMove(e, originalEvent) {
+      console.log(JSON.stringify(this.currentComponents));
+      return true;
+    },
+    dicChange(key) {
+      this.http
+        .post("api/Sys_Dictionary/GetVueDictionary", [key], true)
+        .then((result) => {
+          this.currentItem.data = result[0].data;
+          if (result[0].data.length) {
+            if (this.currentItem.type == "select") {
+              this.currentItem.value = result[0].data[0].value;
+            } else {
+              this.currentItem.values = [result[0].data[0].value];
+            }
+          }
+        });
+    },
+    example1() {
+      this.currentComponents = this.options1;
+    },
+    example2() {
+      this.currentComponents = this.options2;
+    },
+    example3() {
+      this.currentComponents = this.options3;
+    },
+  },
+  computed: {
+    tabsTable() {
+      return this.currentComponents.filter((x) => {
+        return x.type == "table" && x.tabs == true;
+      });
+    },
+  },
+};
+</script>
+<style lang="less" scoped>
+* {
+  box-sizing: border-box;
+}
+.drag-container {
+  /* padding: 20px; */
+  display: flex;
+  height: 100%;
+  position: absolute;
+  width: 100%;
+  box-sizing: border-box;
+}
+.drag-left {
+  width: 250px;
+  display: flex;
+  border-right: 1px solid #eee;
+  flex-direction: column;
+}
+.left-title {
+  height: 42px;
+  text-align: left;
+  border-right: 1px solid #eee;
+  padding: 10px 0 10px 11px;
+  border-bottom: 1px solid #eee;
+}
+.drag-center {
+  display: flex;
+  flex-direction: column;
+  flex: 1;
+}
+.left-draggable-item {
+  //   flex: 1;
+  display: inline-block;
+  padding: 5px;
+  //   border-right: 1px solid #eee;
+}
+
+.left-draggable-item .item {
+  cursor: move;
+  float: left;
+  width: 111px;
+  /* height: 20px; */
+  text-align: center;
+  border: 1px solid #eeeeee;
+  padding: 2px 13px;
+  text-align: left;
+  line-height: 28px;
+  margin: 4px;
+  border-radius: 3px;
+  background: #f0f9eb;
+  font-size: 13px;
+}
+// .drag-center-item {
+//   display: inline-block;
+//   width: 100%;
+//   height: calc(100vh - 122px);
+//   padding: 10px;
+// }
+.draggable-container {
+  display: inline-block;
+  width: 100%;
+  height: calc(100vh - 215px);
+  padding: 10px 0;
+}
+
+.item2 {
+  position: relative;
+  cursor: move;
+  padding: 18px 10px 10px 10px;
+  text-align: left;
+  float: left;
+  margin-bottom: 10px;
+}
+.item2 .el-icon-delete,
+.item2 .el-icon-document-copy {
+  position: absolute;
+  right: 10px;
+  top: 2px;
+  padding: 5px;
+  display: none;
+  color: red;
+  cursor: pointer;
+}
+.item2 .el-icon-document-copy {
+  right: 35px;
+}
+.item2:hover,
+.actived {
+  background: #f0f9eb;
+}
+.item:hover {
+  border: 1px dashed #787be8;
+  color: #787be8;
+}
+.item2:hover .el-icon-delete,
+.item2:hover .el-icon-document-copy {
+  display: block;
+}
+
+.drag-right {
+  background: #f7fbff3d;
+  width: 250px;
+  border-left: 1px solid #eee;
+}
+
+.center-top {
+  height: 42px;
+  line-height: 41px;
+  background: #f2f5fb;
+  border-bottom: 1px solid #eee;
+  text-align: left;
+  padding: 0 10px;
+  font-size: 12px;
+  color: #3391f3;
+}
+.center-top span {
+  margin-right: 10px;
+}
+.attr {
+  padding: 0px 15px 15px 15px;
+}
+.attr-item {
+  text-align: left;
+  margin-top: 12px;
+  font-size: 14px;
+}
+.attr-item .text {
+  padding: 0 0 5px 5px;
+}
+.attr2 {
+  display: flex;
+}
+.attr2 > div {
+  flex: 1;
+}
+.tips {
+  position: absolute;
+  font-size: 26px;
+  letter-spacing: 6px;
+  left: 0px;
+  right: 0px;
+  top: 150px;
+  width: 500px;
+  margin: auto;
+  color: #c5c5c5;
+}
+.col-line {
+  line-height: 25px;
+  font-weight: bold;
+  border-bottom: 1px solid rgb(218 218 218);
+}
+.drag-container ::v-deep(.el-col) {
+  width: 100%;
+}
+.drag-center ::v-deep(.el-form-item__label) {
+  line-height: 0 !important;
+}
+.drag-center ::v-deep(.el-scrollbar__wrap) {
+  overflow-x: hidden;
+}
+.drag-center ::v-deep(.el-form-item) {
+  margin-bottom: 10px;
+}
+.drag-center ::v-deep(.el-date-editor) {
+  width: 100%;
+}
+.drag-center ::v-deep(.el-checkbox) {
+  margin-right: 15px;
+}
+.drag-center ::v-deep(.el-checkbox__label) {
+  padding-left: 5px;
+}
+.drag-center ::v-deep(.hello > div) {
+  z-index: 500 !important;
+}
+.drag-center ::v-deep(th),
+.drag-center ::v-deep(td) {
+  padding: 6px 0;
+}
+.example {
+  margin-top: 8px;
+  > div {
+    cursor: pointer;
+    padding: 14px 20px;
+    border-top: 1px solid #eee;
+    font-size: 13px;
+    color: #646465;
+    position: relative;
+  }
+  > div:hover {
+    background: rgb(231, 231, 231);
+  }
+  i {
+    position: absolute;
+    right: 20px;
+  }
+}
+.btns {
+  padding: 8px 0;
+  display: flex;
+  > div {
+    flex: 1;
+  }
+  .btns-left {
+    padding-top: 8px;
+    color: black;
+    font-weight: bold;
+  }
+  .btns-right {
+    text-align: right;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolFormDraggable/VolFormPreview.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolFormDraggable/VolFormPreview.vue
new file mode 100644
index 0000000..7d8aa93
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolFormDraggable/VolFormPreview.vue
@@ -0,0 +1,206 @@
+<template>
+  <div style="padding: 15px 20px 15px 5px">
+    <div class="pre-text">{{ text }}</div>
+    <vol-form
+      ref="form"
+      :labelWidth="80"
+      :load-key="false"
+      :formFields="options.fields"
+      :formRules="options.formOptions"
+    >
+    </vol-form>
+    <div class="tables">
+      <div
+        class="table-item"
+        v-for="(item, index) in options.tables"
+        :key="index"
+      >
+        <div class="table-header">
+          <div class="header-text">
+            {{ item.name }}
+          </div>
+          <div class="header-btns">
+            <el-button
+              type="primary"
+              size="small"
+              :key="bindex"
+              plain
+              @click="tableBtnClick(item, bindex, index)"
+              :icon="btnItem.icon"
+              v-for="(btnItem, bindex) in item.buttons"
+            >
+              {{ btnItem.name }}
+            </el-button>
+          </div>
+        </div>
+        <vol-table
+          :url="item.url"
+          :load-key="false"
+          :index="true"
+          :ref="'table' + index"
+          :tableData="item.tableData"
+          :columns="item.columns"
+          :max-height="250"
+          :pagination-hide="item.pagination"
+          :column-index="true"
+          :ck="true"
+        ></vol-table>
+      </div>
+    </div>
+
+    <div class="tables" style="padding-bottom: 10px">
+      <el-tabs
+        v-model="tabsModel"
+        v-show="options.tabs.length"
+        @tab-click="() => {}"
+      >
+        <el-tab-pane
+          style="padding: 0"
+          class="table-item"
+          v-for="(item, index) in options.tabs"
+          :label="item.name"
+          :name="index"
+          :key="index"
+        >
+          <div class="table-header">
+            <div class="header-text">
+              {{ item.name }}
+            </div>
+            <div class="header-btns">
+              <el-button
+                type="primary"
+                size="small"
+                :key="bindex"
+                :icon="btnItem.icon"
+                plain
+                @click="tabsTableBtnClick(item, bindex, index)"
+                v-for="(btnItem, bindex) in item.buttons"
+              >
+                {{ btnItem.name }}
+              </el-button>
+            </div>
+          </div>
+          <vol-table
+            :url="item.url"
+            :load-key="false"
+            :index="true"
+            :ref="'tabsTable' + index"
+            :tableData="item.tableData"
+            :columns="item.columns"
+            :max-height="250"
+            :pagination-hide="item.pagination"
+            :column-index="true"
+            :ck="true"
+          ></vol-table>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+
+    <div class="form-btns">
+      <el-button type="primary" @click="submit" icon="el-icon-check" size="small"
+        >鎻愪氦</el-button
+      >
+      <el-button
+        type="primary"
+        @click="reset"
+        plain
+        icon="el-icon-refresh-right"
+        size="small"
+        >閲嶇疆</el-button
+      >
+      <el-button
+        type="primary"
+        @click="download"
+        plain
+        icon="el-icon-refresh-right"
+        size="small"
+        >涓嬭浇浠g爜</el-button
+      >
+    </div>
+  </div>
+</template>
+
+<script>
+import VolTable from "./../VolTable";
+import VolBox from "./../VolBox";
+import VolForm from "./../VolForm";
+import downloadForm from "./DownloadForm";
+export default {
+  props: {
+    options: {
+      type: Object,
+      default: () => {
+        return { fields: {}, formOptions: [], tables: [], tabs: [] };
+      },
+    },
+  },
+  data() {
+    return {
+      text: "",
+      tabsModel: 0,
+    };
+  },
+  created() {},
+  methods: {
+    tableBtnClick(item, btnIndex, index) {
+      if (item.buttons[btnIndex].value == "add") {
+        this.$refs["table" + index].addRow({});
+        return;
+      }
+      if (item.buttons[btnIndex].value == "del") {
+        this.$refs["table" + index].delRow();
+        return;
+      }
+    },
+    tabsTableBtnClick(item, btnIndex, index) {
+      if (item.buttons[btnIndex].value == "add") {
+        this.$refs["tabsTable" + index].addRow({});
+        return;
+      }
+      if (item.buttons[btnIndex].value == "del") {
+        this.$refs["tabsTable" + index].delRow();
+        return;
+      }
+    },
+    submit() {},
+    reset() {
+      this.$refs.form.reset();
+      this.$Message.success("琛ㄥ崟宸查噸缃�");
+    },
+    download() {
+      downloadForm.call(this);
+    },
+  },
+  components: {
+    "vol-table": VolTable,
+    "vol-box": VolBox,
+    "vol-form": VolForm,
+  },
+};
+
+VolForm;
+</script>
+<style lang="less" scoped>
+.form-btns {
+  text-align: center;
+}
+.tables {
+  padding-left: 15px;
+  .table-item {
+    padding: 10px;
+  }
+  .table-header {
+    display: flex;
+    margin-bottom: 8px;
+  }
+  .header-text {
+    position: relative;
+    bottom: -9px;
+    flex: 1;
+    font-weight: bold;
+  }
+  .header-btns {
+    text-align: right;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolHeader.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolHeader.vue
new file mode 100644
index 0000000..cbe64e7
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolHeader.vue
@@ -0,0 +1,67 @@
+<template>
+  <div class="v-header">
+    <div class="v-left-text">
+      <!-- <i size="20" :class="icon" class="h-icon"/> -->
+      <span>{{ title || text }}</span>
+    </div>
+    <div class="content">
+      <slot name="content"></slot>
+    </div>
+    <div class="v-right-content">
+      <slot></slot>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    icon: {
+      type: String,
+      default: ''
+    },
+    title: {
+      type: String,
+      default: ''
+    },
+    text: {
+      type: String,
+      default: '鏈畾涔夊悕绉�'
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+.v-header {
+  display: flex;
+  border-bottom: 1px solid #dcdee2;
+  .v-left-text {
+    margin-top: 3px;
+    padding-bottom: 6px;
+    font-weight: bold;
+    font-size: 15px;
+    color: #484848;
+    white-space: nowrap;
+    border-bottom: 2px solid #676767;
+    margin-bottom: -1px;
+    letter-spacing: 1px;
+    > span {
+      position: relative;
+      top: 2px;
+    }
+  }
+  .content {
+    line-height: 25px;
+    padding-left: 10px;
+    padding: 6px 0 0 10px;
+  }
+  .v-right-content {
+    flex: 1;
+    text-align: right;
+  }
+  .h-icon {
+    position: relative;
+    top: 2px;
+    margin-right: 3px;
+  }
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolImageViewer.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolImageViewer.vue
new file mode 100644
index 0000000..84edee3
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolImageViewer.vue
@@ -0,0 +1,34 @@
+<template>
+    <el-image-viewer hide-on-click-modal v-if="showImageViewer" :initial-index="initialIndex" :url-list="imageViewerList"
+        @close="closeViewer"></el-image-viewer>
+</template>
+<script>
+import { ref } from 'vue';
+export default {
+    setup() {
+        const initialIndex = ref(0);
+        const imageViewerList = ref([]);
+        const showImageViewer = ref(false)
+
+        const show = (imgs, index) => {
+            initialIndex.value = index || 0;
+            if (Array.isArray(imgs)) {
+                imageViewerList.value = imgs;
+            } else {
+                imageViewerList.value = [imgs]
+            }
+            showImageViewer.value=true;
+        }
+        const closeViewer=()=>{
+            showImageViewer.value=false;
+        }
+        return {
+            initialIndex,
+            imageViewerList,
+            showImageViewer,
+            closeViewer,
+            show
+        }
+    }
+}
+</script>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolTable.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolTable.vue
new file mode 100644
index 0000000..3279d39
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolTable.vue
@@ -0,0 +1,1793 @@
+<template>
+  <!-- 2021.11.18绉婚櫎voltable鏂规硶@cell-mouse-leave="rowEndEdit" -->
+  <div class="vol-table" :class="[
+    textInline ? 'text-inline' : '',
+    fxRight ? 'fx-right' : '',
+    isChrome ? 'chrome' : '',
+    smallCell ? 'small-table' : ''
+  ]">
+    <div class="mask" v-show="loading"></div>
+    <div class="message" v-show="loading">鍔犺浇涓�.....</div>
+    <el-table :show-summary="summary" :summary-method="getSummaryData" :row-key="rowKey" :key="randomTableKey"
+      :lazy="lazy" :defaultExpandAll="defaultExpandAll" :expand-row-keys="rowKey ? expandRowKeys : undefined" stripe
+      :load="loadTreeChildren" @select="userSelect" @select-all="userSelect" @selection-change="selectionChange"
+      @row-dblclick="rowDbClick" @row-click="rowClick" @header-click="headerClick"
+      :highlight-current-row="highlightCurrentRow" ref="table" class="v-table" @sort-change="sortChange"
+      tooltip-effect="dark" :height="realHeight" :max-height="realMaxHeight" :data="url ? rowData : tableData" border
+      :row-class-name="initIndex" :cell-style="getCellStyle" style="width: 100%" :scrollbar-always-on="true"
+      :span-method="cellSpanMethod" @expand-change="expandChange">
+      <el-table-column v-if="columnIndex" type="index" :fixed="fixed" width="55"></el-table-column>
+      <el-table-column v-if="ck" type="selection" :fixed="fixed" :selectable="selectable" width="55"></el-table-column>
+
+      <!-- 2020.10.10绉婚櫎table绗竴琛屽己鍒舵帓搴� -->
+      <el-table-column v-for="(column, cindex) in filterColumns" :prop="column.field" :label="column.title"
+        :min-width="column.width" :formatter="formatter" :fixed="column.fixed" :key="column.field + cindex"
+        :align="column.align" :sortable="column.sort ? 'custom' : false"
+        :show-overflow-tooltip="column.showOverflowTooltip">
+        <template #header>
+          <span v-if="(column.require || column.required) && column.edit" class="column-required">*</span>{{
+            column.title }}
+        </template>
+
+        <template #default="scope">
+          <!-- 2022.01.08澧炲姞澶氳〃澶达紝鐜板湪鍙敮鎸佸父鐢ㄥ姛鑳芥覆鏌擄紝涓嶆敮鎸佺紪杈戝姛鑳�(娑夊強鍒扮粍浠堕噸鍐�) -->
+          <el-table-column style="border: none" v-for="columnChildren in filterChildrenColumn(column.children)"
+            :key="columnChildren.field" :min-width="columnChildren.width" :class-name="columnChildren.class"
+            :prop="columnChildren.field" :align="columnChildren.align" :label="columnChildren.title">
+            <template #default="scopeChildren">
+              <a href="javascript:void(0);" style="text-decoration: none"
+                @click="link(scopeChildren.row, columnChildren, $event)" v-if="columnChildren.link"
+                v-text="scopeChildren.row[columnChildren.field]"></a>
+              <table-render v-else-if="columnChildren.render && typeof columnChildren.render == 'function'"
+                :row="scopeChildren.row" key="rd-01" :index="scope.$index" :column="columnChildren"
+                :render="columnChildren.render"></table-render>
+              <div v-else-if="columnChildren.formatter" @click="
+                columnChildren.click &&
+                columnChildren.click(
+                  scopeChildren.row,
+                  columnChildren,
+                  scopeChildren.$index
+                )
+                " v-html="columnChildren.formatter(
+                  scopeChildren.row,
+                  columnChildren,
+                  scopeChildren.$index
+                )
+                  "></div>
+              <div v-else-if="columnChildren.bind">
+                {{ formatter(scopeChildren.row, columnChildren, true) }}
+              </div>
+              <span v-else-if="columnChildren.type == 'date'">{{
+                formatterDate(scopeChildren.row, columnChildren)
+              }}</span>
+              <template v-else>
+                {{ scopeChildren.row[columnChildren.field] }}
+              </template>
+            </template>
+          </el-table-column>
+          <!-- 2020.06.18澧炲姞render娓叉煋鑷畾涔夊唴瀹� -->
+          <table-render v-if="column.render && typeof column.render == 'function'" :row="scope.row" key="rd-01"
+            :index="scope.$index" :column="column" :render="column.render"></table-render>
+          <!-- 鍚敤鍙屽嚮缂栬緫鍔熻兘锛屽甫缂栬緫鍔熻兘鐨勪笉浼氭覆鏌撲笅鎷夋鏂囨湰鑳屾櫙棰滆壊 -->
+          <!-- @click="rowBeginEdit(scope.$index,cindex)" -->
+          <!-- 2021.09.21澧炲姞缂栬緫鏃跺readonly灞炴�у垽鏂� -->
+          <template
+            v-else-if="column.edit && !column.readonly && ['file', 'img', 'excel'].indexOf(column.edit.type) != -1">
+            <div style="display:flex;align-items: center;" @click.stop>
+              <i v-if="!column.showUpload || column.showUpload(scope.row, column)"
+                style="padding: 3px;margin-right: 10px;color:#8f9293;cursor: pointer;"
+                @click="showUpload(scope.row, column)" class="el-icon-upload"></i>
+              <template v-if="column.edit.type == 'img'">
+                <img v-for="(file, imgIndex) in getFilePath(
+                  scope.row[column.field],
+                  column
+                )" :key="imgIndex" @error="handleImageError"
+                  @click="viewImg(scope.row, column, file.path, $event, imgIndex)" class="table-img" :src="file.path" />
+              </template>
+              <a style="margin-right: 8px" v-else class="t-file" v-for="(file, fIndex) in getFilePath(
+                scope.row[column.field],
+                column
+              )" :key="fIndex" @click="dowloadFile(file)">{{ file.name }}</a>
+            </div>
+          </template>
+          <div v-else-if="
+            column.edit &&
+            !column.readonly &&
+            (column.edit.keep || edit.rowIndex == scope.$index)
+          " class="edit-el">
+            <div @click.stop class="e-item">
+              <div>
+                <!-- 2020.07.24澧炲姞鏃ユ湡onChange浜嬩欢 -->
+                <el-date-picker clearable size="default" style="width: 100%"
+                  v-if="['date', 'datetime'].indexOf(column.edit.type) != -1" v-model="scope.row[column.field]" @change="(val) => {
+                    column.onChange &&
+                      column.onChange(scope.row, column, val);
+                  }
+                    " :type="column.edit.type" :placeholder="column.placeholder || column.title"
+                  :disabledDate="(val) => getDateOptions(val, column)" :value-format="getDateFormat(column)"
+                  :disabled="initColumnDisabled(scope.row, column)">
+                </el-date-picker>
+                <el-time-picker clearable size="default" style="width: 100%" v-else-if="column.edit.type == 'time'"
+                  v-model="scope.row[column.field]" @change="(val) => {
+                    column.onChange &&
+                      column.onChange(scope.row, column, val);
+                  }
+                    " :placeholder="column.placeholder || column.title" :value-format="column.format || 'HH:mm:ss'"
+                  :disabled="initColumnDisabled(scope.row, column)">
+                </el-time-picker>
+                <el-switch v-else-if="column.edit.type == 'switch'" v-model="scope.row[column.field]"
+                  active-color="#0f84ff" inactive-color="rgb(194 194 194)" active-text="鏄�" inactive-text="鍚�"
+                  inline-prompt @change="(val) => {
+                    switchChange(val, scope.row, column);
+                  }
+                    " :active-value="typeof scope.row[column.field] == 'boolean'
+                      ? true
+                      : typeof scope.row[column.field] == 'string'
+                        ? '1'
+                        : 1
+                      " :inactive-value="typeof scope.row[column.field] == 'boolean'
+                      ? false
+                      : typeof scope.row[column.field] == 'string'
+                        ? '0'
+                        : 0
+                      " :disabled="initColumnDisabled(scope.row, column)">
+                </el-switch>
+                <template v-else-if="
+                  ['select', 'selectList'].indexOf(column.edit.type) != -1
+                ">
+                  <el-select-v2 style="width: 100%" :size="size" v-if="column.bind.data.length >= select2Count"
+                    v-model="scope.row[column.field]" filterable :multiple="column.edit.type == 'select' ? false : true"
+                    :placeholder="column.placeholder || column.title" :autocomplete="column.autocomplete"
+                    :options="column.bind.data" @change="
+                      column.onChange && column.onChange(scope.row, column)
+                      " clearable :disabled="initColumnDisabled(scope.row, column)">
+                    <template #default="{ item }">
+                      {{ item.label }}
+                    </template>
+                  </el-select-v2>
+
+                  <el-select size="default" style="width: 100%" v-else v-model="scope.row[column.field]" :filterable="column.filter || column.bind.data.length > 10
+                    ? true
+                    : false
+                    " :multiple="column.edit.type == 'select' ? false : true"
+                    :placeholder="column.placeholder || column.title" :allow-create="column.autocomplete" @change="
+                      column.onChange && column.onChange(scope.row, column)
+                      " clearable :disabled="initColumnDisabled(scope.row, column)">
+                    <el-option v-for="item in column.bind.data" :key="item.key" v-show="!item.hidden"
+                      :disabled="item.disabled" :label="item.value" :value="item.key">{{ item.value }}
+                    </el-option>
+                  </el-select>
+                </template>
+                <el-tree-select style="width: 100%"
+                  v-else-if="column.edit.type == 'treeSelect' || column.edit.type == 'cascader'"
+                  v-model="scope.row[column.field]" :data="column.bind.data"
+                  :multiple="column.multiple === undefined ? true : column.multiple" :render-after-expand="false"
+                  :show-checkbox="true"
+                  :check-strictly="column.checkStrictly === undefined ? true : column.checkStrictly" check-on-click-node
+                  node-key="key" @change="column.onChange && column.onChange(scope.row, column)"
+                  :props="{ label: 'label' }">
+                  <template #default="{ data, node }">
+                    {{ data.label }}</template>
+                </el-tree-select>
+                <!-- <div     v-else-if="column.edit.type == 'cascader'">4444444</div> -->
+                <!-- <el-cascader
+                  clearable
+                  style="width: 100%;"
+                  v-model="scope.row[column.field]"
+                  v-else-if="column.edit.type == 'cascader'"
+                  :data="column.bind.data"
+                  :props="{
+                    checkStrictly: column.changeOnSelect || column.checkStrictly,
+                  }"
+                  @change="column.onChange && column.onChange(scope.row, column)"
+                >
+                </el-cascader> -->
+                <el-input v-else-if="column.edit.type == 'textarea'" type="textarea"
+                  :placeholder="column.placeholder || column.title" v-model="scope.row[column.field]"
+                  :disabled="initColumnDisabled(scope.row, column)">
+                </el-input>
+                <input class="table-input" v-else-if="!column.summary && !column.onKeyPress"
+                  v-model.lazy="scope.row[column.field]" :placeholder="column.placeholder || column.title"
+                  :disabled="initColumnDisabled(scope.row, column)" />
+                <el-input v-else @change="inputKeyPress(scope.row, column, $event)"
+                  @input="inputKeyPress(scope.row, column, $event)"
+                  @keyup.enter="inputKeyPress(scope.row, column, $event)" size="default"
+                  v-model="scope.row[column.field]" :placeholder="column.placeholder || column.title"
+                  :disabled="initColumnDisabled(scope.row, column)"></el-input>
+              </div>
+              <div class="extra" v-if="column.extra && edit.rowIndex == scope.$index">
+                <a :style="column.extra.style" style="text-decoration: none" @click="extraClick(scope.row, column)">
+                  <i v-if="column.extra.icon" :class="[column.extra.icon]" />
+                  {{ column.extra.text }}
+                </a>
+              </div>
+            </div>
+          </div>
+          <!--娌℃湁缂栬緫鍔熻兘鐨勭洿鎺ユ覆鏌撴爣绛�-->
+          <template v-else>
+            <a href="javascript:void(0)" style="text-decoration: none;line-height: 1.3;"
+              @click="link(scope.row, column, $event)" v-if="column.link" v-text="scope.row[column.field]"></a>
+            <img v-else-if="column.type == 'img'" v-for="(file, imgIndex) in getFilePath(
+              scope.row[column.field],
+              column
+            )" :key="imgIndex" @error="handleImageError"
+              @click="viewImg(scope.row, column, file.path, $event, imgIndex)" class="table-img" :src="file.path" />
+            <a style="margin-right: 8px" v-else-if="column.type == 'file' || column.type == 'excel'" class="t-file"
+              v-for="(file, fIndex) in getFilePath(
+                scope.row[column.field],
+                column
+              )" :key="fIndex" @click="dowloadFile(file)">{{ file.name }}</a>
+            <span v-else-if="column.type == 'date'">{{
+              formatterDate(scope.row, column)
+            }}</span>
+            <div v-else-if="column.formatter" @click="formatterClick(scope.row, column, $event)"
+              v-html="column.formatter(scope.row, column)"></div>
+            <!-- 2021.11.18淇table鏁版嵁婧愯缃负normal鍚庣偣鍑昏$event缂哄け鐨勯棶棰� -->
+            <div v-else-if="column.bind && (column.normal || column.edit)"
+              @click="formatterClick(scope.row, column, $event)"
+              :style="column.getStyle && column.getStyle(scope.row, column)">
+              {{ formatter(scope.row, column, true) }}
+            </div>
+            <div v-else-if="column.click && !column.bind" @click="formatterClick(scope.row, column)">
+              {{ scope.row[column.field] }}
+            </div>
+            <div @click="() => {
+              column.click && formatterClick(scope.row, column);
+            }
+              " v-else-if="column.bind">
+              <el-tag v-if="useTag" class="cell-tag" :class="[isEmptyTag(scope.row, column)]"
+                :type="getColor(scope.row, column)" :effect="column.effect">{{ formatter(scope.row, column, true)
+                }}</el-tag>
+              <template v-else>{{
+                formatter(scope.row, column, true)
+              }}</template>
+            </div>
+
+            <span v-else>{{ formatter(scope.row, column, true) }}</span>
+          </template>
+        </template>
+      </el-table-column>
+    </el-table>
+    <template v-if="!paginationHide">
+      <div class="block pagination" key="pagination-01" style="display: flex">
+        <div style="flex: 1"></div>
+        <el-pagination key="pagination-02" @size-change="handleSizeChange" @current-change="handleCurrentChange"
+          :current-page="paginations.page" :page-sizes="paginations.sizes" :page-size="paginations.size"
+          layout="total, sizes, prev, pager, next, jumper" :total="paginations.total"></el-pagination>
+      </div>
+    </template>
+  </div>
+
+  <VolBox v-model="uploadModel" title="涓婁紶" :height="228" :width="500" :padding="15" lazy>
+    <!-- 涓婁紶鍥剧墖銆乪xcel鎴栧叾浠栨枃浠躲�佹枃浠舵暟閲忋�佸ぇ灏忛檺鍒堕兘鍙互锛屽弬鐓olupload缁勪欢api -->
+    <div style="height: 200px;display: flex;align-items: center;">
+      <VolUpload style="text-align: center; " :autoUpload="currentColumn.edit.autoUpload"
+        :multiple="currentColumn.edit.multiple" :url="uploadUrl" :max-file="currentColumn.edit.maxFile"
+        :img="currentColumn.edit.type == 'img'" :excel="currentColumn.edit.type == 'excel'"
+        :fileTypes="currentColumn.edit.fileTypes ? currentColumn.edit.fileTypes : []" :fileInfo="fileInfo"
+        :upload-after="uploadAfter" :upload-before="uploadBefore" :append="currentColumn.edit.accept">
+        <div>{{ currentColumn.message }}</div>
+      </VolUpload>
+    </div>
+    <template #footer>
+      <div style="text-align: center; ">
+        <el-button type="default" size="small" @click="uploadModel = false">鍏抽棴</el-button>
+        <el-button type="primary" size="small" @click="saveUpload">淇濆瓨</el-button>
+      </div>
+    </template>
+  </VolBox>
+  <vol-image-viewer ref="viewer"></vol-image-viewer>
+</template>
+<script>
+import VolTableRender from './VolTable/VolTableRender';
+let _errMsg;
+import { defineComponent, defineAsyncComponent } from 'vue';
+export default defineComponent({
+  emits: ['loadBefore', 'loadAfter', 'rowChange', 'rowClick', 'rowDbClick', 'selectionChange'],
+  //https://github.com/element-plus/element-plus/issues/1483
+  //娌℃湁鍘熷厛鐨剆election灞炴�т簡锛岀湅issue涓婁娇鐢╯elect/selectall鑾峰彇
+  //鐩戝惉鏁扮粍闀垮害锛屽鏋滃垹闄や簡鏁版嵁锛岀幇鍦ㄥ彧鑳借杩竻闄ゆ墍鏈夐�変腑鐨勮
+  watch: {
+    'tableData.length': {
+      handler(newLen, oldLen) {
+        this.watchRowSelectChange(newLen, oldLen);
+      }
+    },
+    'rowData.length': {
+      handler(newLen, oldLen) {
+        this.watchRowSelectChange(newLen, oldLen);
+      }
+    }
+  },
+  components: {
+    'vol-image-viewer': defineAsyncComponent(() => import("./VolImageViewer.vue")),
+    'table-render': VolTableRender,
+    VolUpload: defineAsyncComponent(() => import("./VolUpload.vue")),
+    VolBox: defineAsyncComponent(() => import("./VolBox.vue")),
+  },
+  props: {
+    rowKey: {
+      // 鏍戝舰缁撴瀯鐨勪富閿瓧娈碉紝濡傛灉璁剧疆鍊奸粯璁や細寮�鍚爲褰able锛涙敞鎰弐owKey瀛楁鐨勫�煎繀椤绘槸鍞竴锛�2021.05.02锛�
+      typeof: String,
+      default: undefined
+    },
+    loadTreeChildren: {
+      // 鏍戝舰缁撴瀯鍔犺浇瀛愯妭鐐�
+      type: Function,
+      default: (tree, treeNode, resolve) => {
+        if (resolve) {
+          return resolve([]);
+        }
+      }
+    },
+    textInline: {
+      // 琛ㄦ牸鍐呭瓒呭嚭鍚庢槸鍚︽崲琛屾樉绀猴紙2020.01.16锛�
+      type: Boolean,
+      default: true
+    },
+    tableData: {
+      // 琛ㄦ暟鎹簮,閰嶇疆浜唘rl灏变笉鐢ㄤ紶杩欎釜鍙傛暟浜�
+      type: Array,
+      default: () => {
+        return [];
+      }
+    },
+    columns: {
+      type: Array,
+      default: []
+    },
+    height: {
+      type: Number,
+      default: 0
+    },
+    maxHeight: {
+      type: Number,
+      default: 0
+    },
+    linkView: {
+      type: Function,
+      default: function () {
+        return 1;
+      }
+    },
+    pagination: {
+      type: Object,
+      default: function () {
+        return { total: 0, size: 30, sortName: '' };
+      }
+    },
+    url: {
+      type: String,
+      default: ''
+    },
+    paginationHide: {
+      type: Boolean,
+      default: true
+    },
+    color: {
+      type: Boolean,
+      default: true
+    },
+    index: {
+      // 鏄惁鍒涘缓绱㈠紩鍙�,濡傛灉闇�瑕佽〃鏍肩紪杈戝姛鑳斤紝杩欓噷闇�瑕佽缃负true
+      type: Boolean,
+      default: false
+    },
+    allowEmpty: {
+      // 琛ㄦ牸鏁版嵁涓虹┖鏃舵槸鍚﹂粯璁や负--
+      type: Boolean,
+      default: true
+    },
+    defaultLoadPage: {
+      // 浼犲叆浜唘rl锛屾槸鍚﹂粯璁ゅ姞杞借〃鏍兼暟鎹�
+      type: Boolean,
+      default: true
+    },
+    loadKey: {
+      // 鏄惁鑷姩浠庡悗鍙板姞杞芥暟鎹簮
+      type: Boolean,
+      default: true
+    },
+    single: {
+      type: Boolean, // 鏄惁鍗曢��
+      default: false
+    },
+    doubleEdit: {
+      type: Boolean, // 鏄惁鍙屽嚮鍚敤缂栬緫鍔熻兘
+      default: true
+    },
+    beginEdit: {
+      // 缂栬緫寮�濮�
+      type: Function,
+      default: function (row, column, index) {
+        return true;
+      }
+    },
+    endEditBefore: {
+      // 缁撴潫缂栬緫鍓�
+      type: Function,
+      default: function (row, column, index) {
+        return true;
+      }
+    },
+    endEditAfter: {
+      // 缁撴潫缂栬緫鍓�
+      type: Function,
+      default: function (row, column, index) {
+        return true;
+      }
+    },
+    ck: {
+      // 鏄惁鏄剧ずcheckbox
+      type: Boolean,
+      default: true
+    },
+    columnIndex: {
+      // 鏄惁鏄剧ず琛屽彿(2020..11.1)
+      type: Boolean,
+      default: true
+    },
+    highlightCurrentRow: {
+      //澧炲姞閫変腑琛岄珮浜樉绀�(2022.10.07)
+      type: Boolean,
+      default: true
+    },
+    select2Count: {
+      //瓒呭嚭鏁伴噺鏄剧ずselect2缁勪欢
+      type: Number,
+      default: 2000
+    },
+    selectable: {
+      type: Function,
+      default: (row, index) => {
+        return true;
+      }
+    },
+    spanMethod: {
+      type: Function,
+      default: ({ row, column, rowIndex, columnIndex }) => {
+      }
+    },
+    lazy: { //鏍戝舰琛ㄦ牸鏄惁榛樿寤惰繜鍔犺浇
+      type: Boolean,
+      default: true,
+    },
+    defaultExpandAll: { //鏍戝舰琛ㄦ牸鏄惁灞曞紑鎵�鏈�
+      type: Boolean,
+      default: false
+    },
+    expandRowKeys: { //榛樿灞曞紑琛�
+      type: Array,
+      default: () => {
+        return []
+      }
+    },
+    rowParentField: { //鏍戝舰琛ㄦ牸鐖剁骇id
+      type: String,
+      default: ""
+    }
+  },
+  data() {
+    return {
+      fixed: false, //鏄浐瀹氳鍙蜂笌checkbox
+      clickEdit: true, //2021.07.17璁剧疆涓虹偣鍑昏缁撴潫缂栬緫
+      randomTableKey: 1,
+      visiblyColumns: [],
+      key: '',
+      realHeight: 0,
+      realMaxHeight: 0,
+      enableEdit: false, // 鏄惁鍚〃鏍肩敤缂栬緫鍔熻兘
+      empty: this.allowEmpty ? '' : '--',
+      defaultImg: new URL('@/assets/imgs/error-img.png', import.meta.url).href,
+      loading: false,
+      footer: {},
+      total: 0,
+      formatConfig: {},
+      // defaultColor: "",
+      // 2020.09.06璋冩暣table鍒楁暟鎹簮鐨勮儗鏅鑹�
+      colors: ["primary", "success", "info", "warning", "danger"],// ["warning", "success", "danger", "info"],
+      rule: {
+        phone: /^[1][3,4,5,6,7,8,9][0-9]{9}$/,
+        decimal: /(^[\-0-9][0-9]*(.[0-9]+)?)$/,
+        number: /(^[\-0-9][0-9]*([0-9]+)?)$/
+      },
+      columnNames: [],
+      rowData: [],
+      paginations: {
+        sort: '',
+        order: 'desc',
+        Foots: '',
+        total: 0,
+        // 2020.08.29澧炲姞鑷畾涔夊垎椤垫潯澶у皬
+        sizes: [30, 60, 100, 120],
+        size: 30, // 榛樿鍒嗛〉澶у皬
+        Wheres: [],
+        page: 1,
+        rows: 30
+      },
+      errorFiled: '',
+      edit: { columnIndex: -1, rowIndex: -1 }, // 褰撳墠鍙屽嚮缂栬緫鐨勮涓庡垪鍧愭爣
+      editStatus: {},
+      summary: false, // 鏄惁鏄剧ず鍚堣
+      // 鐩墠鍙敮鎸佷粠鍚庡彴杩斿洖鐨剆ummaryData鏁版嵁
+      summaryData: [],
+      summaryIndex: {},
+      remoteColumns: [], // 闇�瑕佹瘡娆″埛鏂版垨鍒嗛〉鍚庝粠鍚庡彴鍔犺浇瀛楀吀鏁版嵁婧愮殑鍒楅厤缃�
+      cellStyleColumns: {}, // 鏈夎儗鏅鑹茬殑閰嶇疆
+      fxRight: false, //鏄惁鏈夊彸杈瑰浐瀹氳〃澶�
+      selectRows: [], //褰撳墠閫変腑鐨勮
+      isChrome: false,
+      //vol-table甯︽暟鎹簮鐨勫崟鍏冩牸鏄惁鍚敤tag鏍囩(涓嬫媺妗嗙瓑鍗曞厓鏍间互tag鏍囩鏄剧ず)
+      //2023.04.02鏇存柊voltable涓巑ain.js
+      useTag: true,
+      currentRow: {},
+      currentColumn: [],
+      fileInfo: [],
+      uploadUrl: "",
+      uploadModel: false,
+      smallCell: true
+    };
+  },
+  created() {
+    try {
+      this.useTag = this.$global.table && this.$global.table.useTag;
+      this.smallCell = this.$global.table && this.$global.table.smallCell;
+    } catch (error) {
+      console.log(error.message);
+    }
+
+    this.realHeight = this.getHeight();
+    this.realMaxHeight = this.getMaxHeight();
+    this.fxRight = this.columns.some((x) => {
+      return x.fixed == 'right';
+    });
+    //2021.09.21绉婚櫎寮哄埗鍥哄畾琛屽彿涓巆heckbox鍒�
+    if (
+      this.columns.some((x) => {
+        return x.fixed && x.fixed != 'right';
+      })
+    ) {
+      this.fixed = true;
+    }
+    //2022.04.06浼樺寲table鍚堣鍥哄畾鍒楁樉绀�
+    // if (
+    //   this.columns.some((x) => {
+    //     return x.summary;
+    //   })
+    // ) {
+    //   this.columns.forEach((x) => {
+    //     if (x.fixed && x.fixed != 'right') {
+    //       x.fixed = false;
+    //     }
+    //   });
+    //   this.fixed = false;
+    // }
+
+    // 浠庡悗鍙板姞涓嬫媺妗嗙殑[鏄惁鍚敤鐨刔鏁版嵁婧�
+    let keys = [];
+    let columnBind = [];
+    this.summaryData.push('鍚堣');
+    if (this.columnIndex) {
+      this.summaryData.push(' ');
+    }
+    this.initCellStyleColumns();
+    this.columns.forEach((x, _index) => {
+
+      if (!x.hidden) {
+        // this.summaryIndex[x.field] = _index;
+        // 2020.10.11淇姹傚拰鍒楅敊浣嶇殑闂
+        this.summaryData.push('');
+        this.summaryIndex[x.field] = this.summaryData.length - 1;
+      }
+      // 姹傚拰
+      if (x.summary && !this.summary) {
+        this.summary = true;
+      }
+      if (x.children && Array.isArray(x.children)) {
+        x.children.forEach(cl => {
+          if (cl.bind && cl.bind.key && (!cl.bind.data || cl.bind.data.length == 0)) {
+            keys.push(cl.bind.key);
+            cl.bind.valueType = cl.type;
+            columnBind.push(cl.bind);
+          }
+        })
+      } else if (x.bind && x.bind.key && (!x.bind.data || x.bind.data.length == 0)) {
+        // 鍐欏叆杩滅▼
+        if (!x.bind.data) x.bind.data = [];
+        if (x.bind.remote) {
+          this.remoteColumns.push(x);
+        } else if (this.loadKey) {
+          keys.push(x.bind.key);
+          x.bind.valueType = x.type;
+          if (x.edit && x.edit.type) {
+            x.bind.editType = x.edit.type
+          }
+          columnBind.push(x.bind);
+        }
+      }
+    });
+    if (keys.length > 0) {
+      this.http
+        .post('/api/Sys_Dictionary/GetVueDictionary', keys)
+        .then((dic) => {
+          dic.forEach((x) => {
+            if (x.data.length > this.select2Count) {
+              x.data.forEach((item) => {
+                item.label = item.value;
+                item.value = item.key;
+              });
+            }
+            const arrType = ['cascader', 'treeSelect'];
+            columnBind.forEach((c) => {
+              if ((arrType.indexOf(c.valueType) != -1 || arrType.indexOf(c.editType) != -1)) {
+                this.columns.forEach(col => {
+                  if (col.bind && col.bind.key == c.key) {
+                    col.bind.orginData = JSON.parse(JSON.stringify(x.data));
+                  }
+                })
+                x.data = this.base.convertTree(x.data, (node, data, isRoot) => {
+                  if (!node.inited) {
+                    node.inited = true;
+                    node.label = node.value;
+                    node.value = node.key + '';
+                  }
+                });
+              }
+              // 杞崲鏁版嵁婧愮殑绫诲瀷涓庡垪鐨勭被鍨嬩竴鑷�(2020.04.04)
+              else if (c.key == x.dicNo && (c.valueType == "int" || c.valueType == "sbyte")) {
+                x.data.forEach((d) => {
+                  // 2020.09.01澧炲姞瀵规暟瀛楃被鍨嬬殑浜屾鍒ゆ柇
+                  if (!isNaN(d.key)) {
+                    d.key = ~~d.key;
+                  }
+                });
+              }
+              if (c.key == x.dicNo) c.data.push(...x.data);
+            });
+          });
+        });
+    }
+
+    this.paginations.sort = this.pagination.sortName;
+    // 2020.08.29澧炲姞鑷畾涔夊垎椤垫潯澶у皬
+    Object.assign(this.paginations, this.pagination);
+    if (this.pagination.size) {
+      this.paginations.rows = this.pagination.size;
+    }
+    this.enableEdit = this.columns.some((x) => {
+      return x.hasOwnProperty('edit');
+    });
+    let keyColumn = this.columns.find((x) => {
+      return x.isKey;
+    });
+    if (keyColumn) {
+      this.key = keyColumn.field;
+    }
+    this.defaultLoadPage && this.load();
+  },
+  computed: {
+    filterColumns() {
+      return this.columns.filter((x, index) => {
+        if (!x.field) {
+          x.field = x.title + index;
+        }
+        return !x.hidden;
+      });
+    }
+  },
+  methods: {
+    initCellStyleColumns() {
+      this.columns.forEach(x => {
+        if (x.cellStyle) {
+          this.cellStyleColumns[x.field] = x.cellStyle;
+        }
+      })
+    },
+    watchRowSelectChange(newLen, oldLen) {
+      if (newLen < oldLen && this.selectRows.length) {
+        this.selectRows = [];
+        this.$refs.table.clearSelection();
+      }
+    },
+    switchChange(val, row, column) {
+      //杩欓噷鍦ㄥ垵濮嬪寲鐨勬椂鍊欎篃浼氳Е鍙慶hange浜嬩欢
+      if (Object.keys(row).length <= 1) {
+        return;
+      }
+      if (column.onChange) {
+        column.onChange(val, row, column);
+      }
+    },
+    inputKeyPress(row, column, $event, $e) {
+      column.onKeyPress && column.onKeyPress(row, column, $event);
+      this.getInputSummaries(null, null, $event, column);
+    },
+    extraClick(row, column) {
+      column.extra.click &&
+        column.extra.click(
+          row,
+          column,
+          this.url ? this.rowData : this.tableData
+        );
+    },
+    headerClick(column, event) {
+      if (this.clickEdit && this.edit.rowIndex != -1) {
+        if (
+          this.rowEndEdit(
+            this.url
+              ? this.rowData[this.edit.rowIndex]
+              : this.tableData[this.edit.rowIndex],
+            column
+          )
+        ) {
+          this.edit.rowIndex = -1;
+        }
+      }
+      // this.edit.rowIndex = -1;
+    },
+    rowDbClick(row, column, event) {
+      //2021.05.23澧炲姞鍙屽嚮琛屼簨浠�
+      this.$emit('rowDbClick', { row, column, event });
+    },
+    rowClick(row, column, event) {
+      //2022.02.20澧炲姞鐐瑰嚮鏃惰〃鏍煎弬鏁板垽鏂�
+      if (!column) {
+        return;
+      }
+      //姝e湪缂栬緫鏃讹紝绂佹鍑哄彂rowClick浜嬩欢
+      if (this.edit.rowIndex == -1) {
+        this.$emit('rowClick', { row, column, event });
+      }
+      // 鐐瑰嚮琛屼簨浠�(2020.11.07)
+
+      if (!this.doubleEdit) {
+        return;
+      }
+      // 鐐瑰嚮鍏朵粬琛屾椂锛屽鏋滅偣鍑荤殑琛屼笌姝e湪缂栬緫鐨勮鐩稿悓锛屼繚鎸佺紪杈戠姸鎬�
+      if (this.clickEdit && this.edit.rowIndex != -1) {
+        if (row.elementIndex == this.edit.rowIndex) {
+          // 鐐瑰嚮鐨勫崟鍏冩牸濡傛灉涓嶅彲浠ョ紪杈戯紝鐩存帴缁撴潫缂栬緫
+          // 2020.10.12淇缁撴潫缂栬緫鏃讹紝element table楂樼増鏈睘鎬ц幏鍙栦笉鍒扮殑闂
+          let _col = this.columns.find((x) => {
+            return x.field == ((event && event.property) || column.property);
+          });
+          if (_col && (!_col.edit || _col.readonly)) {
+            if (this.rowEndEdit(row, event)) {
+              this.edit.rowIndex = -1;
+            }
+          }
+          return;
+        }
+        if (this.rowEndEdit(row, event && event.property ? event : column)) {
+          this.edit.rowIndex = -1;
+        }
+        //褰撴鍦ㄧ紪杈戯紝涓旂偣鍑诲埌鍏朵粬琛屾椂锛屽湪鍘熺紪杈戠殑琛岀粨鏉熺紪杈戝悗锛岃Е鍙戞柊琛岀殑rowClick浜嬩欢
+        //姝e湪缂栬緫鏃讹紝绂佹鍑哄彂rowClick浜嬩欢
+        if (this.edit.rowIndex == -1) {
+          this.$emit('rowClick', { row, column, event });
+        }
+      }
+      this.rowBeginEdit(row, column);
+    },
+    dowloadFile(file) {
+      this.base.dowloadFile(
+        file.path,
+        file.name,
+        {
+          Authorization: this.$store.getters.getToken()
+        },
+        this.http.ipAddress
+      );
+    },
+    getFilePath(pathSring, column) {
+      // 鑾峰彇琛ㄧ殑鍥剧墖涓庢枃浠舵樉绀�
+      if (!pathSring) return [];
+      // 澧炲姞鍥剧墖鑷畾涔夋搷浣�
+      // 杩斿洖鏍煎紡蹇呴』鏄痆{name:"鏂囦欢鍚�",path:"鍥剧墖鍏ㄨ矾寰勬垨base64鏍煎紡"}]
+      if (column.formatter) {
+        return column.formatter(pathSring);
+      }
+      let filePath;
+      if (column.base64 && pathSring.indexOf('data') != -1) {
+        filePath = (',' + pathSring)
+          .split(',data')
+          .filter((x) => {
+            return x;
+          })
+          .map((m) => {
+            return 'data' + m;
+          });
+      } else {
+        filePath = pathSring.replace(/\\/g, '/').split(',');
+      }
+
+      let fileInfo = [];
+      for (let index = 0; index < filePath.length; index++) {
+        let file = filePath[index];
+        // 2020.12.19澧炲姞base64鍥剧墖鏄剧ず
+        if (column.base64) {
+          fileInfo.push({
+            name: '',
+            path:
+              (file.indexOf('data') == -1 ? 'data:image/png;base64,' : '') +
+              file
+          });
+        } else if (file.indexOf('.') != -1) {
+          let splitFile = file.split('/');
+          if (splitFile.length > 0) {
+            fileInfo.push({
+              name: splitFile[splitFile.length - 1],
+              path: this.base.isUrl(file) ? file : this.http.ipAddress + file
+            });
+          }
+        }
+      }
+      return fileInfo;
+    },
+    // 閲嶇疆table
+    reset() {
+      if (this.tableData && this.tableData.length > 0) {
+        this.tableData.splice(0);
+      }
+      if (this.rowData && this.rowData.length > 0) {
+        this.rowData.splice(0);
+      }
+      if (!this.paginationHide) {
+        this.paginations.page = 1;
+        // this.paginations.rows = 30;
+        if (this.paginations.wheres && this.paginations.wheres.length > 0) {
+          this.paginations.wheres.splice(0);
+        }
+      }
+      this.errorFiled = '';
+      this.edit.columnIndex = -1;
+      this.edit.rowIndex = -1;
+    },
+    getHeight() {
+      // 娌℃湁瀹氫箟楂樺害涓庢渶澶ч珮搴︼紝浣跨敤table榛樿鍊�
+      if (!this.height && !this.maxHeight) {
+        return null;
+      }
+      // 瀹氫箟浜嗘渶澶ч珮搴﹀垯涓嶄娇鐢ㄩ珮搴�
+      if (this.maxHeight) {
+        return null;
+      }
+      // 浣跨敤褰撳墠瀹氫箟鐨勯珮搴�
+      return this.height;
+    },
+    getMaxHeight() {
+      // 娌℃湁瀹氫箟楂樺害涓庢渶澶ч珮搴︼紝浣跨敤table榛樿鍊�
+      if (!this.height && !this.maxHeight) {
+        return null;
+      }
+      // 瀹氫箟浜嗘渶澶ч珮搴︿娇鐢ㄦ渶澶ч珮搴�
+      if (this.maxHeight) {
+        return this.maxHeight;
+      }
+      // 涓嶄娇鐢ㄦ渶澶ч珮搴�
+      return null;
+    },
+    getSelectedOptions(column) {
+      if (column.bind && column.bind.data && column.bind.data.length > 0) {
+        return column.bind.data;
+      }
+      return [];
+    },
+    formatterClick(row, column, event) {
+      if (column.click) {
+        column.click(row, column, event);
+        event.stopPropagation && event.stopPropagation();
+      } else {
+        this.rowClick(row, column, event);
+      }
+    },
+    initIndex({ row, rowIndex }) {
+      if (this.index) {
+        row.elementIndex = rowIndex;
+      }
+      // if (rowIndex%2!==0) {
+      //  return "even-row";
+      // }
+      return;
+    },
+    toggleEdit(event) { },
+    setEditStatus(status) {
+      // this.columns.forEach((x) => {
+      //   if (x.hasOwnProperty("edit")) {
+      //     this.$set(x.edit, "status", status);
+      //   }
+      // });
+    },
+    // 閫氳繃button鎸夐挳鍚敤缂栬緫
+    beginWithButtonEdit(scope) {
+      // url?rowData:tableData
+      this.rowBeginEdit(scope.row, this.columns[scope.$index]);
+    },
+    rowBeginEdit(row, column) {
+      if (this.edit.rowIndex != -1) {
+        return;
+      }
+      let _row = this.columns.find((x) => x.field == column.property);
+      if (_row) {
+        if (_row.readonly) {
+          return;
+        }
+        if (
+          //涓嶈兘缂栬緫鐨勫瓧娈点�乻witch锛岀偣鍑讳笉寮�鍚惎缂栬緫鍔熻兘
+          !_row.edit ||
+          (_row.edit.keep && _row.edit.type == 'switch')
+        ) {
+          return;
+        }
+      }
+      if (!this.enableEdit) return;
+      _errMsg = '';
+      // 缂栬緫鍓�
+      this.columns
+        .filter((x) => {
+          return x.bind && x.bind.data && x.bind.data.length;
+        })
+        .forEach((column) => {
+          let val = row[column.field];
+          if (typeof column.bind.data[0].key == 'string') {
+            if (typeof val == 'number') {
+              row[column.field] = row[column.field] + '';
+            }
+          } else {
+            //澶氶�夋垨鑰呯骇鑱旂紪杈戝洖鍐�,2023.01.06
+            if (Array.isArray(val)) {
+              val = val.map(v => {
+                return v * 1
+              });
+              row[column.field] = val;
+            }
+            else if (typeof val == 'string' && val) {
+              let _val = val * 1;
+              if (_val + '' === val) {
+                row[column.field] = _val;
+              }
+            }
+          }
+        });
+      if (!this.beginEdit(row, column, row.elementIndex)) return;
+      if (row.hasOwnProperty('elementIndex')) {
+        if (this.edit.rowIndex == row.elementIndex) {
+          return;
+        }
+        this.edit.rowIndex = row.elementIndex;
+      }
+    },
+    rowEndEdit(row, column, event) {
+      if (this.clickEdit && event) {
+        return true;
+      }
+      if (!this.enableEdit) {
+        if (!this.errorFiled) {
+          if (
+            this.edit.rowIndex != -1 &&
+            !this.endEditAfter(row, column, this.edit.rowIndex)
+          ) {
+            return false;
+          }
+          this.edit.rowIndex = -1;
+        }
+        return true;
+      }
+      if (!this.doubleEdit && event) {
+        return true;
+      }
+      let _row = this.url
+        ? this.rowData[this.edit.rowIndex]
+        : this.tableData[this.edit.rowIndex];
+      // 缁撴潫缂栬緫鍓�
+      if (!this.endEditBefore(_row, column, this.edit.rowIndex)) return false;
+      if (this.edit.rowIndex != -1) {
+        //2022.06.26淇琛ㄦ牸鍐呭鍒囨崲鍚庤鏁颁笉涓�鑷存椂涓嶈兘缂栬緫鐨勯棶棰�
+        if (this.edit.rowIndex - 1 > (this.rowData || this.tableData).length) {
+          this.edit.rowIndex = -1;
+          return;
+        }
+        let row = (this.url ? this.rowData : this.tableData)[
+          this.edit.rowIndex
+        ];
+        for (let index = 0; index < this.columns.length; index++) {
+          const _column = this.columns[index];
+          if (_column.edit) {
+            if (!this.validateRow(row, _column)) {
+              return;
+            }
+          }
+        }
+      }
+      if (!this.endEditAfter(_row, column, this.edit.rowIndex)) return false;
+      this.edit.rowIndex = -1;
+      return true;
+    },
+    validateRow(row, option1) {
+      if (!this.validateColum(option1, row)) {
+        this.errorFiled = option1.field;
+        // 2022.05.06 淇敼閿欒淇℃伅閲嶅鐨勯棶棰�
+        this.$message.error(option1.title + _errMsg);
+        return false;
+      }
+      this.errorFiled = '';
+      return true;
+    },
+    validateColum(option, data) {
+      if (option.hidden || option.bind || !data) return true;
+      let val = data[option.field];
+      if (option.require || option.required) {
+        if (val != '0' && (val === '' || val === undefined)) {
+          if (!this.errorFiled) {
+            _errMsg = '涓嶈兘涓虹┖';
+          }
+          return false;
+        }
+      }
+      if (!option.edit) {
+        return true;
+      }
+      let editType = option.edit.type;
+      // 楠岃瘉鏁板瓧
+      if (editType == 'int' || editType == 'decimal' || editType == 'number') {
+        if (val == '' || val == undefined) return true;
+        if (editType == 'decimal') {
+          if (!this.rule.decimal.test(val)) {
+            _errMsg = '鍙兘鏄暟瀛�';
+            return false;
+          }
+        } else if (!this.rule.decimal.test(val)) {
+          _errMsg = '鍙兘鏄暟瀛�';
+          return false;
+        }
+        if (
+          option.edit.min != undefined &&
+          typeof option.edit.min === 'number' &&
+          val < option.edit.min
+        ) {
+          _errMsg = '涓嶈兘灏忎簬' + option.edit.min;
+          return false;
+        }
+        if (
+          option.edit.max != undefined &&
+          typeof option.edit.max === 'number' &&
+          val > option.edit.max
+        ) {
+          _errMsg = '涓嶈兘澶т簬' + option.edit.max;
+          return false;
+        }
+        return true;
+      }
+
+      // 楠岃瘉瀛楃涓�
+      if (val && (editType == 'text' || editType == 'string')) {
+        if (
+          option.edit.min != undefined &&
+          typeof option.edit.min === 'number' &&
+          val.length < option.edit.min
+        ) {
+          _errMsg = '鑷冲皯' + option.edit.min + '涓瓧绗�';
+          return false;
+        }
+        if (
+          option.edit.max != undefined &&
+          typeof option.edit.max === 'number' &&
+          val.length > option.edit.max
+        ) {
+          _errMsg = '鏈�澶�' + option.edit.max + '涓瓧绗�';
+          return false;
+        }
+      }
+      return true;
+    },
+    delRow() {
+      let rows = this.getSelected();
+      if (rows.length == 0) return this.$Message.error('璇烽�夋嫨瑕佸垹闄ょ殑琛�!');
+
+      let data = this.url ? this.rowData : this.tableData;
+      let indexArr = this.getSelectedIndex();
+      if (indexArr.length == 0) {
+        return this.$Message.error(
+          "鍒犻櫎鎿嶄綔蹇呴』璁剧疆VolTable鐨勫睘鎬ndex='true'"
+        );
+      }
+      // if (indexArr.length == 0 || !this.key) {
+      //   return this.$message.error(
+      //     "璇疯缃甶ndex=true灞炴�ф垨鎸嘽olumns鐨勫瓧娈典负key"
+      //   );
+      // }
+      if (indexArr.length == 0) {
+        // let keyValues=[]
+        // rows.forEach(x=>{
+        //   if (x[this.key]) {
+        //   }
+        //   keyValues.push(x[this.key])
+        // })
+        // data.find(x=>)
+      } else {
+        for (let i = data.length - 1; i >= 0; i--) {
+          if (indexArr.indexOf(i) != -1) {
+            data.splice(i, 1);
+          }
+        }
+      }
+      this.edit.rowIndex = -1;
+      return rows;
+    },
+    addRow(row) {
+      if (!row) {
+        row = {};
+      }
+      this.columns.forEach((x) => {
+        // 2022.05.06 娣诲姞琛屾椂锛屽鏋滃垪鏈夌紪杈戝睘鎬э紝璁剧疆寮�鍚紪杈�(閬垮厤鍏抽棴缂栬緫鍚庯紝鏃犳硶鍐嶆鍚敤缂栬緫)??
+        //x.readonly = false;
+        if (!row.hasOwnProperty(x.field)) {
+          if (x.edit && x.edit.type == 'switch') {
+            row[x.field] = x.type == 'bool' ? false : 0;
+          } else if (!row.hidden) {
+            // 2020.09.06娣诲姞琛屾椂锛岃缃粯璁ゅ瓧娈�
+            row[x.field] = undefined;
+          }
+        }
+      });
+      if (!this.url) {
+        this.tableData.push(row);
+        return;
+      }
+      this.rowData.push(row);
+    },
+    viewImg(row, column, url, $event, index) {
+      $event.stopPropagation();
+      const imgs = this.getFilePath(row[column.field], column).map(x => { return x.path });
+      this.$refs.viewer.show(imgs, index);
+      //this.base.previewImg(url);
+      // window.open(row[column.field]);
+    },
+    link(row, column, $e) {
+      $e.stopPropagation();
+      this.$props.linkView(row, column);
+    },
+    getSelected() {
+      return this.selectRows;
+    },
+    getSelectedIndex() {
+      if (!this.index) {
+        // 鍙湁璁剧疆浜嗗睘鎬ndex鎵嶆湁绱㈠紩琛�
+        return [];
+      }
+      let indexArr = this.selectRows.map((x) => {
+        return x.elementIndex;
+      });
+      return indexArr || [];
+    },
+    GetTableDictionary(rows) {
+      // 鍒嗛〉鎴栧埛鏂版垨閲嶆柊缁戝畾鏁版嵁婧�
+      if (this.remoteColumns.length == 0 || !rows || rows.length == 0) return;
+      let remoteInfo = {};
+      for (let index = 0; index < this.remoteColumns.length; index++) {
+        const column = this.remoteColumns[index];
+        //  column.bind.data.splice(0);
+        let key = column.bind.key;
+        let data = [];
+        rows.forEach((row) => {
+          if (row[column.field] || row[column.field] == '0') {
+            if (data.indexOf(row[column.field]) == -1) {
+              data.push(row[column.field]);
+            }
+          }
+        });
+        if (data.length > 0) {
+          remoteInfo[key] = data;
+        }
+      }
+      if (remoteInfo.length == 0) return;
+      // ha= Object.assign([], ha, hb)
+      this.http
+        .post('/api/Sys_Dictionary/GetTableDictionary', remoteInfo)
+        .then((dic) => {
+          dic.forEach((x) => {
+            this.remoteColumns.forEach((column) => {
+              if (column.bind.key == x.key) {
+                column.bind.data = Object.assign([], column.bind.data, x.data);
+                // column.bind.data.push(...x.data);
+              }
+            });
+          });
+          this.$emit('dicInited', dic);
+        });
+    },
+    load(query, isResetPage) {
+      // isResetPage閲嶇疆鍒嗛〉鏁版嵁
+      if (!this.url) return;
+      if (isResetPage) {
+        this.resetPage();
+      }
+      let param = {
+        page: this.paginations.page,
+        rows: this.paginationHide ? 1000 : this.paginations.rows,
+        sort: this.paginations.sort,
+        order: this.paginations.order,
+        wheres: [] // 鏌ヨ鏉′欢锛屾牸寮忎负[{ name: "瀛楁", value: "xx" }]
+      };
+      let status = true;
+      // 鍚堝苟鏌ヨ淇℃伅(鍖呮煡璇㈠垎椤点�佹帓搴忋�佹煡璇㈡潯浠剁瓑)
+      if (query) {
+        param = Object.assign(param, query);
+      }
+      /* 鏌ヨ鍓嶅鐞�(濡傛灉闇�瑕佹煡璇㈡潯浠讹紝瀹炵幇缁勪欢鏂规硶loadBefore鏂规硶鍗冲彲:
+        loadBefore=(param, callBack)=>{
+          param.wheres = [{ name: "PhoneNo", value: "13419098211" }];
+          callBack(true);
+        })
+      */
+      this.$emit('loadBefore', param, (result) => {
+        status = result;
+      });
+      if (!status) return;
+
+      if (param.wheres && param.wheres instanceof Array) {
+        param.wheres = JSON.stringify(param.wheres);
+      }
+      this.loading = true;
+      let url = param.url || this.url;
+      param.url = undefined;
+      this.http.post(url, param).then(
+        (data) => {
+          //2021.06.04淇tree涓嶅埛鏂扮殑闂
+          if (this.rowKey) {
+            this.randomTableKey++;
+            this.rowData.splice(0);
+          }
+          this.loading = false;
+          let rows = data.rows || [];
+          // 鏌ヨ杩斿洖缁撴灉鍚庡鐞�
+          // 2020.10.30澧炲姞鏌ヨ鍚庤繑鍥炴墍鏈夌殑鏌ヨ淇℃伅
+          this.$emit(
+            'loadAfter',
+            rows,
+            (result) => {
+              status = result;
+            },
+            data
+          );
+          if (!status) return;
+          this.GetTableDictionary(data.rows);
+
+          if (this.rowParentField) {
+            rows = this.base.convertTree(rows, null, this.rowKey, this.rowParentField);
+          }
+          this.rowData = rows;
+          this.paginations.total = data.total;
+          // 鍚堣
+          this.getSummaries(data);
+          // this.$nextTick(() => {
+          //   this.$refs.table.doLayout();
+          // });
+        },
+        (error) => {
+          this.loading = false;
+          // this.$Message.error(error || "缃戠粶寮傚父");
+        }
+      );
+    }, // 鑾峰彇缁熻
+    getSummaries(data) {
+      if (!this.summary || !data.summary) return;
+      this.summaryData.splice(0);
+      // 寮�鍚簡琛屽彿鐨勶紝+1
+      if (this.columnIndex) {
+        this.summaryData.push('');
+      }
+      // 濡傛灉鏈塩heckbox锛屽簲璇ョ畻浣滄槸绗竴琛�
+      if (this.ck) {
+        this.summaryData.push('');
+      }
+
+      this.columns.forEach((col) => {
+        if (col.children && col.children.length) {
+          col.children.forEach((item) => {
+            this.getColumnSummaries(item, data);
+          });
+        } else {
+          this.getColumnSummaries(col, data);
+        }
+      });
+      if (this.summaryData.length > 0 && this.summaryData[0] == '') {
+        this.summaryData[0] = '鍚堣';
+      }
+    },
+    getColumnSummaries(col, data) {
+      if (!col.hidden) {
+        if (data.summary.hasOwnProperty(col.field)) {
+          let sum = data.summary[col.field];
+          //2024.01.07澧炲姞鑷畾涔夊悎璁℃牸寮忓寲
+          if (col.summaryFormatter) {
+            sum = col.summaryFormatter(sum, col, data, this.summaryData)
+          } else if (sum) {
+            sum =
+              (sum * 1.0).toFixed(col.numberLength || 2).replace('.00', '') *
+              1.0;
+          }
+          this.summaryData.push(sum);
+        } else {
+          this.summaryData.push('');
+        }
+      }
+    },
+    getInputChangeSummaries() { },
+    handleSizeChange(val) {
+      this.paginations.size = val;
+      this.paginations.rows = val;
+      this.load();
+    },
+    handleCurrentChange(val) {
+      this.paginations.page = val;
+      this.load();
+    },
+    sortChange(sort) {
+      this.paginations.sort = sort.prop;
+      this.paginations.order = sort.order == 'ascending' ? 'asc' : 'desc';
+      this.load();
+    },
+    resetPage() {
+      // 閲嶇疆鏌ヨ鍒嗛〉
+      // this.paginations.rows = 30;
+      this.paginations.page = 1;
+    },
+    selectionChange(selection) {
+      // console.log(selection);
+      // 閫夋嫨琛屼簨浠�,鍙湁鍗曢�夋墠瑙﹀彂
+      this.selectRows = selection;
+      if (this.single) {
+        if (selection.length == 1) {
+          this.$emit('rowChange', selection[0]);
+        }
+        if (selection.length > 1) {
+          let _row = selection[selection.length - 1];
+          this.$refs.table.toggleRowSelection(selection[0]);
+          this.selectRows = [_row];
+        }
+      }
+      // 灏唖electionchange鏆撮湶鍑哄幓
+      this.$emit('selectionChange', selection);
+    },
+    getColor(row, column) {
+      let val = row[column.field];
+      if (column.getColor && typeof column.getColor === 'function') {
+        let _color = column.getColor(row, column);
+        if (_color) {
+          return _color;
+        }
+      }
+      if (!val && val != '0') {
+        return undefined;
+      }
+      if (!this.formatConfig[column.field]) {
+        this.formatConfig[column.field] = [val];
+        return this.colors[0];
+      }
+      let index = this.formatConfig[column.field].indexOf(val);
+      if (index != -1) {
+        return this.colors[index];
+      }
+      if (this.formatConfig[column.field].length > 5) {
+        return '';
+      }
+
+      if (index == -1) {
+        this.formatConfig[column.field].push(val);
+        index = this.formatConfig[column.field].length - 1;
+      }
+      return this.colors[index] || 'info';
+    },
+    formatterDate(row, column) {
+      return (row[column.field] || '').substr(0, 10);
+    },
+    formatter(row, column, template) {
+      if (!template) return row[column.property];
+      let val = row[column.field];
+      if (!val && val != 0) return val;
+      // 鏄惁鍊�
+      if (column.edit && column.edit.type == 'switch') {
+        return val ? '鏄�' : '鍚�';
+      }
+      if (!column.bind || !column.bind.data) {
+        return row[column.field];
+      }
+
+      if (column.edit && (column.edit.type == 'selectList'
+        || column.edit.type == 'treeSelect'
+        || column.bind.type == "cascader"
+        || column.bind.type == "treeSelect")) {
+        if (!Array.isArray(val)) {
+          row[column.field] = (val + '').split(',');
+        } else {
+          val = val.join(',');
+        }
+        return this.getSelectFormatter(column, val);
+      }
+      // 缂栬緫澶氶�塼able鏄剧ず
+      //  if (
+      //   column.bind.type == "selectList" ||
+      //   column.bind.type == "checkbox" ||
+      //   column.bind.type == "cascader" ||
+      //   column.bind.type == "treeSelect"
+      // ) {
+      if (typeof val === 'string' && val.indexOf(',') != -1) {
+        return this.getSelectFormatter(column, val);
+      }
+      //}
+      let source = column.bind.data.filter((x) => {
+        // return x.key != "" && x.key == val;
+        // 2020.06.06淇鍗曠嫭浣跨敤table缁勪欢鏃�,key涓烘暟瀛�0鏃惰浆鎹㈡垚鏂囨湰澶辫触鐨勯棶棰�
+        return x.key !== '' && x.key !== undefined && x.key + '' === val + '';
+      });
+      if (source && source.length > 0) val = source[0].label || source[0].value;
+      return val;
+    },
+    getSelectFormatter(column, val) {
+      // 缂栬緫澶氶�塼able鏄剧ず
+      let valArr = (val + "").split(",");
+      for (let index = 0; index < valArr.length; index++) {
+        (column.bind.orginData && column.bind.orginData.length
+          ? column.bind.orginData
+          : column.bind.data)
+          .forEach((x) => {
+            // 2020.06.06淇鏁版嵁婧愪负selectList鏃�,key涓烘暟瀛�0鏃朵笉鑳借浆鎹㈡枃鏈殑闂
+            if (x.key !== "" && x.key !== undefined && x.key + "" == valArr[index] + "") {
+              valArr[index] = x.label || x.value;
+            }
+          });
+      }
+      return valArr.join(",");
+    },
+    onChange(scope, val, event, column) {
+      // 2020.09.03淇onChange涓嶈Е鍙戠殑闂
+      let row = scope.row;
+      if (column.onChange && !column.onChange(row, val, event)) {
+        return;
+      }
+      // 杈撳叆妗嗘眰鍜屽疄鏃惰绠�
+      this.getInputSummaries(scope, val, event, column);
+    },
+    // input杈撳叆瀹炴椂姹傚拰
+    getInputSummaries(scope, val, event, column) {
+      // column鍒楄缃簡summary灞炴�х殑鎵嶈绠楀��
+      if (!column.summary) return;
+      let sum = 0;
+      //  let _index = 0;
+      (this.url ? this.rowData : this.tableData).forEach((x, index) => {
+        if (x.hasOwnProperty(column.field) && !isNaN(x[column.field])) {
+          // _index = index;
+          sum += x[column.field] * 1;
+        }
+      });
+      if (sum) {
+        if (column.summary == 'avg') {
+          sum = sum / (this.rowData.length || this.tableData.length || 1);
+        }
+        sum =
+          (sum * 1.0).toFixed(column.numberLength || 2).replace('.00', '') *
+          1.0;
+      }
+      this.summaryData[this.summaryIndex[column.field]] = sum;
+    },
+    getSummaryData({ columns, data }) {
+      return this.summaryData;
+    },
+    getCellStyle(row) {
+      // 2020.12.13澧炲姞璁剧疆鍗曞厓鏍奸鑹�
+      if (row.column.property) {
+        return (
+          this.cellStyleColumns[row.column.property] &&
+          this.cellStyleColumns[row.column.property](
+            row.row,
+            row.rowIndex,
+            row.columnIndex
+          )
+        );
+      }
+    },
+    compareDate(date1, date2) {
+      if (!date2) {
+        return true;
+      }
+      return (
+        date1.valueOf() <
+        (typeof date2 == 'number' ? date2 : new Date(date2).valueOf())
+      );
+    },
+    getDateOptions(date, item) {
+      //2021.07.17璁剧疆鏃堕棿鍙�夎寖鍥�
+      if ((!item.min && !item.max) || !date) {
+        return false;
+      }
+      if (item.min && item.min.indexOf(' ') == -1) {
+        //涓嶈缃椂鍒嗙锛屽悗闈細鑷姩鍔犱笂 08:00
+        item.min = item.min + ' 00:00:000';
+      }
+      return (
+        this.compareDate(date, item.min) || !this.compareDate(date, item.max)
+      );
+    },
+    getDateFormat(column) {
+      if (column.format) {
+        return column.format;
+      }
+      if (column.edit.type == "month") {
+        return "YYYY-MM";
+      }
+      //瑙乭ttps://day.js.org/docs/zh-CN/display/format
+      return column.edit.type == 'date' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss';
+    },
+    userSelect(selection, row) {
+      this.selectRows = selection;
+      if (!this.single) {
+        this.$emit('rowChange', { row, selection });
+      }
+    },
+    isEmptyTag(row, column) {
+      if (!row[column.field] && row[column.field] != '0') {
+        return 'empty-tag';
+      }
+      return '';
+    },
+    filterChildrenColumn(children) {
+      if (!children) {
+        return [];
+      }
+      return children.filter((x) => {
+        return !x.hidden;
+      });
+    },
+    initColumnDisabled(row, column) {
+      return column.getDisabled && column.getDisabled(row, column);
+    },
+    showUpload(row, column) {
+      this.fileInfo = (row[column.field] || '').split(",")
+        .filter(x => { return x })
+        .map(item => {
+          return { path: item, name: "" };
+        })
+      this.currentRow = row;
+      this.currentColumn = column;
+      if (this.currentColumn.edit.autoUpload === undefined) {
+        this.currentColumn.edit.autoUpload = true;
+      }
+      if (this.currentColumn.edit.multiple === undefined) {
+        this.currentColumn.edit.multiple = false;
+      }
+
+      if (this.currentColumn.edit.url === undefined) {
+        this.uploadUrl = 'api/' + (this.url || '').replace('/api', 'api').split('/')[1] + '/upload'
+      } else {
+        this.uploadUrl = this.currentColumn.edit.url;
+      }
+      this.uploadModel = true;
+    },
+    uploadAfter(result, files) {
+      this.currentColumn.uploadAfter && this.currentColumn.uploadAfter(result, files);
+      return true;
+    },
+    uploadBefore(files, params) {
+      this.currentColumn.uploadBefore && this.currentColumn.uploadBefore(files, this.currentRow, params);
+      return true;
+    },
+    saveUpload() {
+      //鐢熸垚淇濆瓨鍚庤繑鍥炵殑璺緞
+      let arr = this.fileInfo.map((x) => {
+        if (x.path) {
+          return x.path;
+        }
+        return result.data + x.name;
+      });
+
+      this.currentRow[this.currentColumn.field] = arr.join(",");
+      this.uploadModel = false;
+      return true;
+    },
+    expandChange(row, expandedRows) { //	褰撶敤鎴峰鏌愪竴琛屽睍寮�鎴栬�呭叧闂殑鏃�
+      if (!this.defaultExpandAll && !this.lazy) {
+        if (expandedRows) {
+          if (this.expandRowKeys.indexOf(row[this.rowKey]) == -1) {
+            this.expandRowKeys.push(row[this.rowKey])
+          }
+        } else {
+          let _index = this.expandRowKeys.findIndex(x => { return x == row[this.rowKey] });
+          if (_index != -1) {
+            this.expandRowKeys.splice(_index, 1);
+          }
+        }
+      }
+    },
+    handleImageError($e) {
+      $e.target.src = this.defaultImg;
+    },
+    cellSpanMethod({ row, column, rowIndex, columnIndex }) {
+      return this.spanMethod({ row, column, rowIndex, columnIndex }, this.url ? this.rowData : this.tableData)
+    }
+  }
+});
+</script>
+<style lang="less" scoped>
+.vol-table {
+  position: relative;
+
+  .mask {
+    opacity: 0.2;
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    background: #d0d0d0;
+    z-index: 100;
+  }
+
+  .message {
+    text-align: center;
+    color: #635c5c;
+    font-size: 15px;
+    font-weight: 600;
+    background: #eee;
+    transform: translateY(-50%);
+    top: 50%;
+    position: absolute;
+    z-index: 200;
+    left: 0;
+    right: 0;
+    width: 150px;
+    margin: 0 auto;
+    line-height: 40px;
+    border-radius: 4px;
+    border: 1px solid #a09e9e;
+  }
+}
+
+.e-item {
+  display: flex;
+
+  >div:first-child {
+    flex: 1;
+  }
+}
+
+.vol-table ::v-deep(.el-pager .number) {
+  padding: 0 7px;
+  border-radius: 5px;
+  border: 1px solid #e6e6e6;
+  margin-left: 8px;
+  font-weight: 500;
+  min-width: 28px;
+  height: 27px;
+}
+
+.vol-table ::v-deep(.el-pager .number.active) {
+  background: #ed4014;
+  color: #fff;
+}
+
+.vol-table ::v-deep(.el-pagination .el-input__wrapper) {
+  height: 27px;
+}
+
+.vol-table .t-file {
+  color: #1e8cff;
+  cursor: pointer;
+  border-bottom: 1px solid;
+  padding-bottom: 2px;
+}
+
+.vol-table .empty-tag {
+  border: none;
+  background: none;
+}
+
+.v-table ::v-deep(.el-date-editor .el-icon-date),
+.v-table ::v-deep(.el-date-editor .el-icon-time) {
+  width: 10px;
+}
+
+.column-required {
+  position: relative;
+  color: #f20303;
+  font-size: 14px;
+  top: 2px;
+  right: 2px;
+}
+</style>
+
+<style scoped>
+/* .v-table ::v-deep(.even-row){
+  background: rgb(245,247,250);
+} */
+.pagination {
+  text-align: right;
+  padding: 2px 28px;
+  border: 1px solid #eee;
+  border-top: 0px;
+}
+
+/* .v-table ::v-deep(.el-input .el-input__inner) {
+  padding: 0 7px;
+} */
+.v-table ::v-deep(.el-table__header th) {
+  /* padding: 0px !important; */
+  background-color: #f8f8f9 !important;
+  font-size: 13px;
+  /* height: 46px; */
+  color: #616161;
+}
+
+.v-table ::v-deep(.el-table__header th.is-sortable) {
+  padding: 3px !important;
+}
+
+.vol-table.text-inline ::v-deep(.el-table__body .cell),
+.vol-table.text-inline ::v-deep(.el-table__header-wrapper .cell) {
+  word-break: inherit !important;
+  white-space: nowrap !important;
+}
+
+/* .v-table  ::v-deep(.el-table__body td) {
+  padding: 9px 0 !important;
+} */
+
+.v-table ::v-deep(.el-table__footer td) {
+  padding: 7px 0 !important;
+}
+
+.vol-table ::v-deep(.el-table-column--selection .cell) {
+  display: inline;
+}
+
+.vol-table.text-inline ::v-deep(.el-table th > .cell) {
+  white-space: nowrap !important;
+}
+
+.vol-table .table-img {
+  height: 40px;
+  border-radius: 5px;
+  margin-right: 10px;
+  width: 40px;
+  object-fit: cover;
+}
+
+.vol-table .table-img:hover {
+  cursor: pointer;
+}
+
+.vol-table ::v-deep(.cell) {
+  padding: 2px 10px;
+}
+
+.vol-table ::v-deep(.cell .el-tag) {
+  padding: 5px 9px;
+}
+
+.table-input {
+  color: rgb(104, 103, 103);
+  padding: 3px 10px;
+  height: 32px;
+  line-height: 32px;
+  width: 100%;
+  border-radius: 4px;
+  border: 1px solid #dcdcdc;
+}
+
+.table-input:focus {
+  outline: 1px solid #49a3fd;
+}
+
+.small-table ::v-deep(.el-pagination .el-input__wrapper) {
+  height: 27px;
+}
+
+.small-table ::v-deep(.el-table__cell) {
+  padding: 6px 0;
+  font-size: 13px;
+
+}
+
+.small-table ::v-deep(.cell-tag) {
+  padding: 0 5px !important;
+  height: 19px;
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolUpload.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolUpload.vue
new file mode 100644
index 0000000..492ff56
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/basic/VolUpload.vue
@@ -0,0 +1,917 @@
+<template>
+  <div class="upload-container">
+    <div>
+      <div class="input-btns" style="margin-bottom: 10px">
+        <input ref="input" type="file" style="display: none" @change="handleChange" :multiple="multiple"
+          :accept="accept ? accept : (img ? 'image/*' : (excel == true ? '.xls,.xlsx' : ''))" />
+        <div v-if="img" class="upload-img">
+          <!-- v-for="(file,index) in fileInfo.length>0?fileInfo: files" -->
+          <div v-for="(file, index) in files" :key="index" class="img-item">
+            <div class="operation">
+              <div class="action">
+                <i class="el-icon-view view" @click="previewImg(index)"></i>
+                <i class="el-icon-delete remove" @click="removeFile(index)"></i>
+              </div>
+              <div class="mask"></div>
+            </div>
+
+            <img :src="getImgSrc(file, index)" @error="handleImageError" />
+          </div>
+          <div v-show="!autoUpload || (autoUpload && files.length < maxFile)" class="img-selector"
+            :class="getSelector()">
+            <div class="selector" @click="handleClick">
+              <i class="el-icon-camera-solid"></i>
+            </div>
+            <div v-if="!autoUpload" class="s-btn" :class="{ readonly: changed }" @click="upload">
+              <div>{{ loadText }}</div>
+            </div>
+          </div>
+        </div>
+        <el-button v-else @click="handleClick">閫夋嫨{{ img ? '鍥剧墖' : '鏂囦欢' }}</el-button>
+
+        <el-button v-if="!autoUpload && !img" type="info" :disabled="changed" @click="upload(true)"
+          :loading="loadingStatus">涓婁紶鏂囦欢</el-button>
+      </div>
+      <slot></slot>
+      <div v-if="desc">
+        <el-alert :title="getText() + '鏂囦欢澶у皬涓嶈秴杩�' + (maxSize || 50) + 'M'" type="info" show-icon>
+        </el-alert>
+      </div>
+      <slot name="content"></slot>
+      <div v-if="!img">
+        <ul class="upload-list" v-show="fileList">
+          <li class="list-file" v-for="(file, index) in files" :key="index">
+            <a>
+              <span @click="fileOnClick(index, file)">
+                <i :class="format(file)"></i>
+                {{ file.name }}
+              </span>
+            </a>
+            <span @click="removeFile(index)" class="file-remove">
+              <i class="el-icon-close"></i>
+            </span>
+          </li>
+        </ul>
+      </div>
+      <slot name="tip"></slot>
+    </div>
+    <vol-image-viewer ref="viewer"></vol-image-viewer>
+  </div>
+</template>
+<script>
+let OSS = {}// require('ali-oss');
+import VolImageViewer from './VolImageViewer.vue';
+export default {
+  components: {
+    'vol-image-viewer': VolImageViewer
+  },
+  props: {
+    desc: {
+      //鏄惁鏄剧ず榛樿浠嬬粛
+      //鏄惁澶氶��
+      type: Boolean,
+      default: false
+    },
+    fileInfo: {
+      //鐢ㄤ簬鎺ユ敹涓婁紶鐨勬枃浠讹紝涔熷彲浠ュ姞浠ラ粯璁ゅ�硷紝鏄剧ず宸蹭笂浼犵殑鏂囦欢锛岀敤鎴蜂笂浼犲悗浼氳鐩栭粯璁ゅ��
+      type: Array,
+      default: () => {
+        return [];
+      } //鏍煎紡[{name:'1.jpg',path:'127.0.01/1.jpg'}]
+    },
+    downLoad: {
+      //鏄惁鍙互鐐瑰嚮鏂囦欢涓嬭浇
+      type: Boolean,
+      default: true
+    },
+    multiple: {
+      //鏄惁澶氶��
+      type: Boolean,
+      default: false
+    },
+    maxFile: {
+      //鏈�澶氬彲閫夋枃浠舵暟閲忥紝蹇呴』multiple=true锛屾墠浼氱敓鏁�
+      type: Number,
+      default: 5
+    },
+    maxSize: {
+      //鏂囦欢闄愬埗澶у皬3M
+      type: Number,
+      default: 50
+    },
+
+    autoUpload: {
+      //閫夋嫨鏂囦欢鍚庢槸鍚﹁嚜鍔ㄤ笂浼�
+      type: Boolean,
+      default: true
+    },
+    img: {
+      //鍥剧墖绫诲瀷  img>excel>fileTypes涓夌鏂囦欢绫诲瀷浼樺厛绾�
+      type: Boolean,
+      default: false
+    },
+    excel: {
+      //excel鏂囦欢
+      type: Boolean,
+      default: false
+    },
+    fileTypes: {
+      //鎸囧畾涓婁紶鏂囦欢鐨勭被鍨�
+      type: Array,
+      default: () => {
+        return [];
+      }
+    },
+    url: {
+      //涓婁紶鐨剈rl
+      type: String,
+      default: ''
+    },
+    uploadBefore: {
+      //杩斿洖false浼氫腑姝㈡墽琛�
+      //涓婁紶鍓�
+      type: Function,
+      default: (files) => {
+        return true;
+      }
+    },
+    uploadAfter: {
+      //杩斿洖false浼氫腑姝㈡墽琛�
+      //涓婁紶鍚�
+      type: Function,
+      default: (result, files) => {
+        return true;
+      }
+    },
+    onChange: {
+      //閫夋嫨鏂囦欢鏃�  //杩斿洖false浼氫腑姝㈡墽琛�
+      type: Function,
+      default: (files) => {
+        return true;
+      }
+    },
+    // clear: {
+    //   //涓婁紶瀹屾垚鍚庢槸鍚︽竻绌烘枃浠跺垪琛�
+    //   type: Boolean,
+    //   default: true
+    // },
+    fileList: {
+      //鏄惁鏄剧ず閫夋嫨鐨勬枃浠跺垪琛�
+      type: Boolean,
+      default: true
+    },
+    fileClick: {
+      //鐐瑰嚮鏂囦欢浜嬩欢
+      type: Function,
+      default: (index, file, files) => {
+        return true;
+      }
+    },
+    removeBefore: {
+      //绉婚櫎鏂囦欢浜嬩欢
+      type: Function,
+      default: (index, file, files) => {
+        return true;
+      }
+    },
+    append: {
+      //姝ゅ睘鎬у凡搴熷純锛屽鏂囦欢涓婁紶锛岄粯璁よ拷鍔犳枃浠�
+      type: Boolean,
+      default: false
+    },
+    compress: {
+      //寮�鍚浘鐗囧帇缂�,鍚庨潰鏍规嵁闇�瑕佸啀瀹屽杽
+      type: Boolean,
+      default: true
+    },
+    compressMinSize: {
+      //鍘嬬缉鐨勬渶灏忔瘮渚�
+      type: Number,
+      default: 0.1
+    },
+    accept: {
+      //鎺ュ彈鐨勬枃浠剁被鍨�
+      type: String,
+      default: ''
+    }
+  },
+  data() {
+    return {
+      defaultImg: new URL('@/assets/imgs/error-img.png', import.meta.url).href,
+      changed: false, //鎵嬪姩涓婁紶鎴愬姛鍚庣姝㈤噸澶嶄笂浼狅紝蹇呴』閲嶆柊閫夋嫨
+      model: true,
+      files: [],
+      bigImg: '',
+      imgTypes: ['gif', 'jpg', 'jpeg', 'png', 'bmp', 'webp', 'jfif'],
+      loadingStatus: false,
+      loadText: '涓婁紶鏂囦欢'
+    };
+  },
+  created() {
+    //榛樿鏈夊浘鐗囩殑绂佹涓婁紶鎿嶄綔
+    if (this.fileInfo) {
+      this.changed = true;
+    }
+    this.cloneFile(this.fileInfo);
+  },
+  watch: {
+    fileInfo: {
+      handler(files) {
+        this.cloneFile(files);
+      },
+      deep: true
+    }
+  },
+  methods: {
+    cloneFile(files) {
+      this.files = files.map((x) => {
+        return {
+          name: x.name || this.getFileName(x.path),
+          path: x.path
+        };
+      });
+    },
+    getFileName(path) {
+      if (!path) {
+        return '鏈畾涔夋枃浠跺悕';
+      }
+      let _index = path.lastIndexOf('/');
+      return path.substring(_index + 1);
+    },
+    previewImg(index) {
+      const imgs = this.files.map(x => { return this.getImgSrc(x) });
+      this.$refs.viewer.show(imgs, index);
+      //  this.base.previewImg(this.getImgSrc(this.files[index]));
+      //  window.open(this.getImgSrc((this.files.length>0?this.files:this.fileInfo)[index]));
+    },
+    getSelector() {
+      if (this.autoUpload) {
+        return 'auto-selector';
+      }
+      return 'submit-selector';
+    },
+    getImgSrc(file, index) {
+      if (file.hasOwnProperty('path')) {
+        if (this.base.isUrl(file.path)) {
+          return file.path;
+        }
+        //2020.12.27澧炲姞base64鍥剧墖鎿嶄綔
+        if (file.path.indexOf('/9j/') != -1) {
+          return 'data:image/jpeg;base64,' + file.path;
+        }
+        if (file.path.substr(0, 1) == '/') {
+          file.path = file.path.substr(1);
+        }
+        return this.http.ipAddress + file.path;
+      }
+      return window.URL.createObjectURL(file);
+    },
+    fileOnClick(index, file) {
+      if (!this.fileClick(index, file, this.files)) {
+        return;
+      }
+      //鐐瑰嚮涓嶄笅杞�
+      if (!this.downLoad) {
+        return;
+      }
+      if (!file.path) {
+        this.$message.error('璇峰厛涓婁紶鏂囦欢');
+        return;
+      }
+      this.base.dowloadFile(
+        file.path,
+        file.name,
+        {
+          Authorization: this.$store.getters.getToken()
+        },
+        this.http.ipAddress
+      );
+    },
+    getText() {
+      if (this.img) {
+        return '鍙兘涓婁紶鍥剧墖,';
+      } else if (this.excel) {
+        return '鍙兘涓婁紶excel鏂囦欢,';
+      }
+    },
+    handleClick() {
+      this.$refs.input.click();
+    },
+    handleChange(e) {
+      //this.compress寮�鍚浘鐗囧帇缂�,鍚庨潰鏍规嵁闇�瑕佸啀瀹屽杽
+      // this.clearFiles();
+      var result = this.checkFile(e.target.files);
+      if (!result) {
+        return;
+      }
+
+      this.changed = false;
+      //濡傛灉浼犲叆浜咶ileInfo闇�瑕佽嚜琛屽鐞嗙Щ闄ileInfo
+      if (!this.onChange(e.target.files)) {
+        return;
+      }
+      for (let index = 0; index < e.target.files.length; index++) {
+        const element = e.target.files[index];
+        element.input = true;
+      }
+      if (!this.multiple) {
+        this.files.splice(0);
+      }
+      this.files.push(...e.target.files);
+
+      this.$refs.input.value = null;
+      if (this.autoUpload && result) {
+        this.upload(false);
+      }
+    },
+    removeFile(index) {
+      //濡傛灉浼犲叆浜咶ileInfo闇�瑕佽嚜琛屽鐞嗙Щ闄ileInfo
+      //t绉婚櫎鏂囦欢
+      let removeFile = this.files[index];
+      //鍒犻櫎鐨勮繕娌′笂浼犵殑鏂囦欢
+      if (removeFile.input) {
+        this.files.splice(index, 1);
+      } else {
+        this.fileInfo.splice(index, 1);
+      }
+      if (!this.removeBefore(index, removeFile, this.fileInfo)) {
+        return;
+      }
+    },
+    clearFiles() {
+      this.files.splice(0);
+    },
+    getFiles() {
+      return this.files;
+    },
+    convertToFile(dataurl, filename) {
+      let arr = dataurl.split(',');
+      let mime = arr[0].match(/:(.*?);/)[1];
+      let suffix = mime.split('/')[1];
+      let bstr = atob(arr[1]);
+      let n = bstr.length;
+      let u8arr = new Uint8Array(n);
+      while (n--) {
+        u8arr[n] = bstr.charCodeAt(n);
+      }
+      // new File杩斿洖File瀵硅薄 绗竴涓弬鏁版槸 ArraryBuffer 鎴� Bolb 鎴朅rrary 绗簩涓弬鏁版槸鏂囦欢鍚�
+      // 绗笁涓弬鏁版槸 瑕佹斁鍒版枃浠朵腑鐨勫唴瀹圭殑 MIME 绫诲瀷
+      return new File([u8arr], `${filename}.${suffix}`, {
+        type: mime,
+        input: true
+      });
+    },
+    async compressImg(file) {
+      let fileSize = file.size / 1024 / 1024;
+      let read = new FileReader();
+      read.readAsDataURL(file);
+      return new Promise((resolve, reject) => {
+        read.onload = (e) => {
+          let img = new Image();
+          img.src = e.target.result;
+          let _this = this;
+          img.onload = function () {
+            //榛樿鎸夋瘮渚嬪帇缂�
+            let w = this.width;
+            let h = this.height;
+            let canvas = document.createElement('canvas');
+            let ctx = canvas.getContext('2d');
+            canvas.setAttribute('width', w);
+            canvas.setAttribute('height', h);
+            ctx.drawImage(this, 0, 0, w, h);
+            let rate = 0.3;
+            if (fileSize > 2) {
+              rate = 0.1;
+            } else if (fileSize > 1) {
+              rate = 0.1;
+            }
+            if (_this.compressMinSize > rate) {
+              rate = _this.compressMinSize;
+            }
+            // rate=1;
+            let base64 = canvas.toDataURL('image/jpeg', rate);
+            resolve(_this.convertToFile(base64, file.name));
+          };
+        };
+      });
+    },
+    async uploadOSS() {
+      await this.http.get('api/alioss/getAccessToken', {}, false).then(async (x) => {
+        if (!x.status) return this.$Message.error(x.message);
+        let client = new OSS({
+          // yourRegion濉啓Bucket鎵�鍦ㄥ湴鍩熴�備互鍗庝笢1锛堟澀宸烇級涓轰緥锛孯egion濉啓涓簅ss-cn-hangzhou銆�
+          region: x.data.region,
+          // 浠嶴TS鏈嶅姟鑾峰彇鐨勪复鏃惰闂瘑閽ワ紙AccessKey ID鍜孉ccessKey Secret锛夈��
+          accessKeyId: x.data.accessKeyId,
+          accessKeySecret: x.data.accessKeySecret,
+          // 浠嶴TS鏈嶅姟鑾峰彇鐨勫畨鍏ㄤ护鐗岋紙SecurityToken锛夈��
+          stsToken: x.data.securityToken,
+          // 濉啓Bucket鍚嶇О銆�
+          bucket: x.data.bucket
+        });
+        console.log(this.files);
+        for (let index = 0; index < this.files.length; index++) {
+          const file = this.files[index];
+          if (file.input) {
+            let result = await client.put(
+              x.data.bucketFolder + '/' + x.data.unique + file.name,
+              file
+            );
+            // 濡傛灉鏈夐厤缃甤dn锛岃繑鍥炵殑url闇�瑕佹嫾鎺dn
+            if (window.oss.ali.cdn) {
+              result.url = new URL(x.data.bucketFolder + '/' + x.data.unique + file.name, window.oss.ali.cdn).toString();
+            }
+            file.path = result.url;
+            file.newName = x.data.unique + file.name;
+          }
+        }
+
+        this.fileInfo.splice(0);
+        // }
+        let _files = this.files.map((file) => {
+          return {
+            name: file.newName || file.name,
+            path: file.path
+          };
+        });
+        this.fileInfo.push(..._files);
+        //2021.09.25淇鏂囦欢涓婁紶鍚庝笉鑳藉悓鏃朵笅杞界殑闂
+        this.files = _files;
+      });
+      return;
+    },
+    async upload(vail) {
+      if (vail && !this.checkFile()) return false;
+      if (!this.url) {
+        return this.$message.error('娌℃湁閰嶇疆濂経rl');
+      }
+      if (!this.files || this.files.length == 0) {
+        return this.$message.error('璇烽�夋嫨鏂囦欢');
+      }
+      //澧炲姞涓婁紶鏃惰嚜瀹氫箟鍙傛暟锛屽悗鍙颁娇鐢ㄨ幏鍙朥tilities.HttpContext.Current.Request.Query["瀛楁"]
+      let params = {};
+      if (!this.uploadBefore(this.files, params)) {
+        return;
+      }
+      let paramText = "";
+      if (Object.keys(params).length) {
+        paramText = "?1=1";
+        for (const key in params) {
+          let value = params[key];
+          if (typeof (value) == 'object') {
+            value = JSON.stringify(value)
+          }
+          paramText += `&${key}=${value}`
+        }
+      }
+
+      this.loadingStatus = true;
+      this.loadText = '涓婁紶涓�..';
+      if (window.oss && window.oss.ali.use) {
+        await this.uploadOSS();
+        this.loadingStatus = false;
+        this.loadText = '涓婁紶鏂囦欢';
+        if (!this.uploadAfter({ status: true }, this.fileInfo, this.files)) {
+          this.changed = false;
+          return;
+        } else {
+          this.changed = true;
+        }
+        this.$message.success('涓婁紶鎴愬姛');
+        return;
+      }
+
+      var forms = new FormData();
+      for (let index = 0; index < this.files.length; index++) {
+        let file = this.files[index];
+        if (file.input) {
+          //2023.07灞忚斀鍥剧墖鍘嬬缉
+          // let name = file.name.split('.');
+          // name = name[name.length - 1].toLocaleLowerCase();
+          // let isImg = this.imgTypes.indexOf(name) != -1;
+          // if (isImg && (name == 'jpg' || name == 'jpeg')) {
+          //   //>200KB鐨勫紑鍚帇缂�
+          //   if (isImg && file.size / 1024 / 1024 > 0.2) {
+          //     console.log('鍘嬬缉鍓�' + file.size);
+          //     file = await this.compressImg(file);
+          //     file.compress = true;
+          //     this.files[index] = file;
+          //     this.files[index].input = true;
+          //     console.log('鍘嬬缉鍚�' + file.size);
+          //   }
+          // }
+          forms.append('fileInput', file, file.name);
+        }
+      }
+      // forms.append("fileInput", this.files);
+
+      this.http
+        .post(this.url + paramText, forms, this.autoUpload ? '姝e湪涓婁紶鏂囦欢' : '',
+          //楂樼増鏈琣xios杩欓噷蹇呴』瑕佹寚瀹歨eader
+          {
+            headers: { 'Content-Type': 'multipart/form-data' }
+          })
+        .then(
+          (x) => {
+            // this.$refs.uploadFile.clearFiles();
+            this.loadingStatus = false;
+            this.loadText = '涓婁紶鏂囦欢';
+            if (!this.uploadAfter(x, this.files)) {
+              this.changed = false;
+              return;
+            } else {
+              this.changed = true;
+            }
+            this.$message.success(x.message);
+            this.changed = x.status;
+            if (!x.status) {
+              // this.files = null;
+              return;
+            }
+            //鍗曢�夋竻闄や互鍓嶇殑鏁版嵁
+            //  if (!this.multiple) {
+            this.fileInfo.splice(0);
+            // }
+            let _files;
+            if (this.multiple && this.base.isUrl(x.data.split(',')[0])) {
+              _files = this.files.filter((file) => { return file.path });
+              _files.push(...x.data.split(',').map(x => {
+                return {
+                  name: x.split('/').pop(),
+                  path: x
+                }
+              }))
+            } else {
+              _files = this.files.map((file) => {
+                if (file.path) {
+                  return file;
+                }
+                return {
+                  name: file.name,
+                  path: file.path || (this.base.isUrl(x.data) ? x.data : (x.data + file.name))
+                };
+              });
+            }
+            this.fileInfo.push(..._files);
+            //2021.09.25淇鏂囦欢涓婁紶鍚庝笉鑳藉悓鏃朵笅杞界殑闂
+            this.files = _files;
+          },
+          (error) => {
+            this.loadText = '涓婁紶鏂囦欢';
+            this.loadingStatus = false;
+          }
+        );
+    },
+    format(file, checkFileType) {
+      const format =
+        file.name
+          .split('.')
+          .pop()
+          .toLocaleLowerCase() || '';
+      let fileIcon = 'el-icon-document';
+      if (this.fileTypes.length > 0 && checkFileType != undefined) {
+        if (this.fileTypes.indexOf(format) != -1) {
+          return true;
+        }
+        return false;
+      }
+      if (
+        checkFileType &&
+        !(checkFileType instanceof Array) &&
+        checkFileType != 'img' &&
+        checkFileType != 'excel'
+      ) {
+        if (checkFileType.indexOf(format) > -1) {
+          return true;
+        } else {
+          return false;
+        }
+      }
+
+      if (checkFileType == 'img' || this.imgTypes.indexOf(format) > -1) {
+        if (checkFileType == 'img') {
+          if (this.imgTypes.indexOf(format) > -1) {
+            return true;
+          } else {
+            return false;
+          }
+        }
+        fileIcon = 'el-icon-picture-outline';
+      }
+      if (
+        ['mp4', 'm3u8', 'rmvb', 'avi', 'swf', '3gp', 'mkv', 'flv'].indexOf(
+          format
+        ) > -1
+      ) {
+        fileIcon = 'el-icon-document';
+      }
+      if (['mp3', 'wav', 'wma', 'ogg', 'aac', 'flac'].indexOf(format) > -1) {
+        fileIcon = 'el-icon-document';
+      }
+      if (['doc', 'txt', 'docx', 'pages', 'epub', 'pdf'].indexOf(format) > -1) {
+        fileIcon = 'el-icon-document';
+      }
+      if (
+        checkFileType == 'excel' ||
+        ['numbers', 'csv', 'xls', 'xlsx'].indexOf(format) > -1
+      ) {
+        if (checkFileType == 'excel') {
+          if (['numbers', 'csv', 'xls', 'xlsx'].indexOf(format) > -1) {
+            return true;
+          } else {
+            return false;
+          }
+        }
+        fileIcon = 'el-icon-document';
+      }
+      return fileIcon;
+    },
+    beforeUpload() { },
+    checkFile(inputFiles) {
+      const files = this.files;
+
+      if (
+        this.multiple &&
+        files.length + (inputFiles || []).length > (this.maxFile || 5)
+      ) {
+        this.$message.error(
+          '鏈�澶氬彧鑳介�夈��' +
+          (this.maxFile || 5) +
+          '銆�' +
+          (this.img ? '寮犲浘鐗�' : '涓枃浠�') +
+          ''
+        );
+        return false;
+      }
+      if (!inputFiles) {
+        inputFiles = this.files.filter((x) => {
+          return x.input;
+        });
+      }
+      let names = [];
+      for (let index = 0; index < inputFiles.length; index++) {
+        const file = inputFiles[index];
+        if (names.indexOf(file.name) != -1) {
+          file.name = '(' + index + ')' + file.name;
+        }
+        names.push(file.name);
+        if (this.img && !this.format(file, 'img')) {
+          this.$message.error('閫夋嫨鐨勬枃浠躲��' + file.name + '銆戝彧鑳芥槸鍥剧墖鏍煎紡');
+          return false;
+        }
+        if (this.excel && !this.format(file, 'excel')) {
+          this.$message.error('閫夋嫨鐨勬枃浠躲��' + file.name + '銆戝彧鑳芥槸excel鏂囦欢');
+          return false;
+        }
+        if (
+          this.fileTypes &&
+          this.fileTypes.length > 0 &&
+          !this.format(file, this.fileTypes)
+        ) {
+          this.$message.error(
+            '閫夋嫨鐨勬枃浠躲��' +
+            file.name +
+            '銆戝彧鑳芥槸銆�' +
+            this.fileTypes.join(',') +
+            '銆戞牸寮�'
+          );
+          return false;
+        }
+        if (file.size > (this.maxSize || 50) * 1024 * 1024) {
+          this.$message.error(
+            '閫夋嫨鐨勬枃浠躲��' +
+            file.name +
+            '銆戜笉鑳借秴杩�:' +
+            (this.maxSize || 50) +
+            'M'
+          );
+          return false;
+        }
+      }
+      return true;
+    },
+    handleImageError($e) {
+      $e.target.src = this.defaultImg;
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+.upload-list {
+  padding-left: 0;
+  list-style: none;
+
+  .list-file {
+    line-height: 20px;
+    padding: 4px;
+    color: #515a6e;
+    border-radius: 4px;
+    transition: background-color 0.2s ease-in-out;
+    overflow: hidden;
+    position: relative;
+
+    font-size: 13px;
+
+    .file-remove {
+      display: none;
+      right: 0;
+      //  margin-left: 50px;
+      color: #0e9286;
+    }
+  }
+
+  .list-file:hover {
+    cursor: pointer;
+
+    .file-remove {
+      display: initial;
+    }
+
+    color: #2d8cf0;
+  }
+}
+
+.upload-container {
+  display: inline-block;
+  width: 100%;
+  // padding: 10px;
+
+  // min-height: 250px;
+  border-radius: 5px;
+
+  .alert {
+    margin-top: 43px;
+  }
+
+  .button-group>* {
+    float: left;
+    margin-right: 10px;
+  }
+
+  .file-info>span {
+    margin-right: 20px;
+  }
+}
+
+.upload-img {
+  display: inline-block;
+
+  .img-item:hover .operation {
+    display: block;
+  }
+
+  .img-item,
+  .img-selector {
+    position: relative;
+    cursor: pointer;
+    margin: 0 10px 10px 0;
+    float: left;
+    width: 65px;
+    height: 65px;
+    border: 1px solid #c7c7c7;
+    overflow: hidden;
+    border-radius: 5px;
+    box-sizing: content-box;
+
+    img {
+      margin: 0;
+      padding: 0;
+      width: 100%;
+      height: 100%;
+      object-fit: cover;
+    }
+
+    .operation {
+      display: none;
+      position: absolute;
+      top: 0;
+      bottom: 0;
+      left: 0;
+      right: 0;
+
+      .action {
+        opacity: 0.6;
+        text-align: center;
+        background: #151515de;
+        font-size: 14px;
+        position: absolute;
+        z-index: 90;
+        width: 100%;
+        bottom: 3px;
+        bottom: 0;
+        color: #ded5d5;
+        padding-right: 7px;
+        padding-bottom: 3px;
+        line-height: 20px;
+
+        .el-icon-view {
+          margin: 0 10px;
+        }
+      }
+
+      .mask {
+        opacity: 0.6;
+        background: #9e9e9e;
+        top: 0;
+        width: 100%;
+        height: 100%;
+        position: absolute;
+      }
+    }
+  }
+
+  .img-selector {
+    font-size: 50px;
+    text-align: center;
+
+    i {
+      position: relative;
+      font-size: 40px;
+      color: #6f6f6f;
+    }
+  }
+
+  .auto-selector {
+    .selector {
+      line-height: 64px;
+    }
+  }
+
+  .selector {
+    color: #a0a0a0;
+  }
+
+  .submit-selector {
+    .s-btn {
+      line-height: 22px;
+      font-size: 12px;
+      top: -6px;
+      // padding: 2px;
+      position: relative;
+      background: #2db7f5;
+      color: white;
+    }
+
+    .selector {
+      line-height: 50px;
+    }
+
+    .readonly {
+      background: #8c8c8c;
+    }
+  }
+}
+
+.big-model {
+  width: 100%;
+  height: 100%;
+  position: relative;
+
+  .m-img {}
+
+  .mask {
+    position: absolute;
+    opacity: 0.6;
+    background: #eee;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    position: absolute;
+  }
+}
+
+.auto-upload {
+  z-index: 9999999;
+  width: 100%;
+  height: 100%;
+  position: fixed;
+  top: 0;
+  left: 0;
+
+  .j-content {
+    text-align: center;
+    font-size: 17px;
+    top: 40%;
+    position: absolute;
+    z-index: 999;
+    left: 0;
+    right: 0;
+    width: 240px;
+    /* height: 100%; */
+    margin: auto;
+    background: white;
+    /* bottom: 30px; */
+    line-height: 50px;
+    border-radius: 6px;
+    border: 1px solid #d2d2d2;
+  }
+
+  .mask {
+    cursor: pointer;
+    opacity: 0.6;
+    width: 100%;
+    height: 100%;
+    background: #101010;
+  }
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/editor/KindEditor.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/editor/KindEditor.vue
new file mode 100644
index 0000000..8c8e704
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/editor/KindEditor.vue
@@ -0,0 +1,13 @@
+<template>
+  
+</template>
+
+<script>
+export default {
+
+}
+</script>
+
+<style>
+
+</style>  
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/editor/VolWangEditor.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/editor/VolWangEditor.vue
new file mode 100644
index 0000000..529d754
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/editor/VolWangEditor.vue
@@ -0,0 +1,231 @@
+<template>
+  <div class="hello" ref="volWangEditor"></div>
+</template>
+
+<script>
+import E from "wangeditor";
+let OSS = {}// require('ali-oss');
+export default {
+  props: {
+    url: {
+      //涓婁紶鍥剧墖鐨剈rl
+      type: String,
+      default: "",
+    },
+    upload: {
+      //涓婁紶鏂规硶
+      type: Function,
+      // (file, insertImgFn) => {}
+      default: null,
+    },
+    uploadCount: {
+      //鏈�澶氬彲浠ヤ笂浼�(鍥剧墖)鐨勬暟閲�
+      type: Number,
+      default: 3,
+    },
+    modelValue: "",
+    width: {
+      type: String,
+      default: "100%",
+    },
+    height: {
+      type: Number,
+      default: 250,
+    },
+    minWidth: {
+      type: Number,
+      default: 650,
+    },
+    minHeight: {
+      type: Number,
+      default: 100,
+    },
+  },
+  name: "wang-editor",
+  data() {
+    return {
+      lastHtml: "",
+      change: false,
+      editor: null,
+      init: false,
+    };
+  },
+  watch: {
+    modelValue(newVal, val) {
+      if (
+        (newVal !== val &&
+          this.lastHtml !== "" &&
+          val === this.lastHtml &&
+          this.editor.txt.html() === this.lastHtml) ||
+        this.editor.txt.html() === ""
+      ) {
+        this.editor.txt.html(newVal);
+      }
+      this.lastHtml = newVal;
+    },
+  },
+  destroyed() {
+    this.editor = null;
+  },
+  mounted() {
+    this.editor = null;
+    let editor = new E(this.$refs.volWangEditor);
+    this.editor = editor;
+    editor.config.zIndex = 500;
+    editor.config.height = this.height;
+    editor.config.onchange = (html) => {
+      if (!this.init && this.lastHtml === "") {
+        this.lastHtml = html;
+        this.init = true;
+      }
+      this.$emit("update:modelValue", html);
+    };
+    // editor.config.uploadFileName = "fileInput";
+    // //璁剧疆header
+    // editor.config.uploadImgHeaders = {
+    //   Accept: "application/json",
+    //   Authorization: this.$store.getters.getToken(),
+    // };
+    //涓婁紶鍦板潃
+    editor.config.uploadImgServer = this.http.ipAddress + this.url;
+    // console.log(editor.config.uploadImgServer);
+    editor.config.customUploadImg = async (resultFiles, insertImgFn) => {
+      // 鑷畾涔変笂浼�
+      if (this.upload) {
+        console.log("璋冪敤鑷畾涔夌殑涓婁紶鏂规硶");
+        console.log(resultFiles);
+        // resultFiles 鏄� input 涓�変腑鐨勬枃浠跺垪琛�
+        // insertImgFn 鏄幏鍙栧浘鐗� url 鍚庯紝鎻掑叆鍒扮紪杈戝櫒鐨勬柟娉�
+        //鏈夊彲鑳戒細涓婁紶澶氬紶鍥剧墖,涓婁紶澶氬紶鍥剧墖灏遍渶瑕佽繘琛岄亶鍘�
+        resultFiles.map((item) => {
+          // _this.getUploadImg(item, insertImgFn);
+          this.upload(item, insertImgFn);
+        });
+      } else {
+        if (window.oss && window.oss.ali.use) {
+          await this.uploadOSS(resultFiles, insertImgFn);
+          this.$message.success('涓婁紶鎴愬姛');
+          return;
+        } else {
+
+          if (!this.url) {
+            this.$message.error("鏈厤缃畊rl");
+            return;
+          }
+          const resultArr = await this.uploadFile(resultFiles);
+          resultArr.forEach(url => {
+            insertImgFn(url);
+          })
+          // this.http.post(this.url, formData, true).then((x) => {
+          //   if (!x.status) {
+          //     return this.$message.error(x.message);
+          //   }
+          //   nameArr.forEach(m => {
+          //     insertImgFn(this.http.ipAddress + x.data + m);
+          //   })
+          // });
+        }
+      }
+    };
+    //Written by DavidZhang
+    //editor.config.uploadVideoServer = '/api/upload-video'; 
+    //editor.config.uploadVideoServer = this.http.ipAddress + this.url; 
+    editor.config.uploadVideoServer = this.http.ipAddress + 'api/CZ_CategoryInformation/upload';
+    editor.config.customUploadVideo = async (resultFiles, insertVideoFn) => {
+      // resultFiles 鏄� input 涓�変腑鐨勬枃浠跺垪琛�
+      // insertVideoFn 鏄幏鍙栬棰� url 鍚庯紝鎻掑叆鍒扮紪杈戝櫒鐨勬柟娉�
+
+      // 涓婁紶瑙嗛锛岃繑鍥炵粨鏋滐紝灏嗚棰戝湴鍧�鎻掑叆鍒扮紪杈戝櫒涓�
+
+      const resultArr = await this.uploadFile(resultFiles);
+      resultArr.forEach(url => {
+        //  insertImgFn(url);
+        insertVideoFn(url)
+      })
+
+    }
+    editor.create();
+    editor.txt.html(this.modelValue);
+  },
+  methods: {
+    async uploadFile(resultFiles) {
+      let formData = new FormData();
+      let nameArr = [];
+      resultFiles.forEach(function (file) {
+        formData.append("fileInput", file, file.name);
+        nameArr.push(file.name);
+      });
+      let resultArr = []
+      await this.http.post(this.url, formData, true,{headers:{ 'Content-Type': 'multipart/form-data' }}).then((x) => {
+        if (!x.status) {
+          return this.$message.error(x.message);
+        }
+        resultArr = nameArr.map(m => {
+          return this.http.ipAddress + x.data + m;
+        })
+        // nameArr.forEach(m => {
+        //   insertImgFn(this.http.ipAddress + x.data + m);
+        // })
+      });
+      return resultArr;
+    },
+    async uploadOSS(resultFiles, insertImgFn) {
+      await this.http.get('api/alioss/getAccessToken', {}, false).then(async (x) => {
+        if (!x.status) return this.$Message.error(x.message);
+        let client = new OSS({
+          // yourRegion濉啓Bucket鎵�鍦ㄥ湴鍩熴�備互鍗庝笢1锛堟澀宸烇級涓轰緥锛孯egion濉啓涓簅ss-cn-hangzhou銆�
+          region: x.data.region,
+          // 浠嶴TS鏈嶅姟鑾峰彇鐨勪复鏃惰闂瘑閽ワ紙AccessKey ID鍜孉ccessKey Secret锛夈��
+          accessKeyId: x.data.accessKeyId,
+          accessKeySecret: x.data.accessKeySecret,
+          // 浠嶴TS鏈嶅姟鑾峰彇鐨勫畨鍏ㄤ护鐗岋紙SecurityToken锛夈��
+          stsToken: x.data.securityToken,
+          // 濉啓Bucket鍚嶇О銆�
+          bucket: x.data.bucket
+        });
+        debugger;
+        console.log(resultFiles);
+        for (let index = 0; index < resultFiles.length; index++) {
+          const file = resultFiles[index];
+          let result = await client.put(
+            x.data.bucketFolder + '/' + x.data.unique + file.name,
+            file
+          );
+          // 濡傛灉鏈夐厤缃甤dn锛岃繑鍥炵殑url闇�瑕佹嫾鎺dn
+          if (window.oss.ali.cdn) {
+            result.url = new URL(x.data.bucketFolder + '/' + x.data.unique + file.name, window.oss.ali.cdn).toString();
+          }
+          console.log(result);
+          file.path = result.url;
+          file.newName = x.data.unique + file.name;
+          insertImgFn(file.path);
+
+        }
+      });
+      return;
+    },
+  }
+};
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+h1,
+h2 {
+  font-weight: normal;
+}
+
+ul {
+  list-style-type: none;
+  padding: 0;
+}
+
+li {
+  display: inline-block;
+  margin: 0 10px;
+}
+
+a {
+  color: #42b983;
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/401.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/401.vue
new file mode 100644
index 0000000..33e44fb
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/401.vue
@@ -0,0 +1,19 @@
+<template>
+  <div style="height: 100%">
+    <redirect-error :text="text" message="璇锋眰纭鏄惁閰嶇疆鏉冮檺" :errorNumber="errorNumber"></redirect-error>
+  </div>
+</template>
+  <script>
+import RedirectError from "./RedirectError";
+export default {
+  components: {
+    RedirectError,
+  },
+  data() {
+    return {
+      errorNumber: "401",
+      text: "鎶辨瓑锛屾偍娌℃湁鏉冮檺杩涜姝ゆ搷浣渵",
+    };
+  },
+};
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/404.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/404.vue
new file mode 100644
index 0000000..bd6db8f
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/404.vue
@@ -0,0 +1,21 @@
+<template>
+  <div style="height:100%;">
+    <redirect-error :text="text" :errorNumber="errorNumber"></redirect-error>
+  </div>
+</template>
+  <script>
+import RedirectError from "./RedirectError";
+export default {
+  components: {
+    RedirectError
+  },
+  data() {
+    return {
+      errorNumber:'404',
+      text: "鎶辨瓑锛岄〉闈㈠ソ鍍忓幓鐏槦浜唦"
+    };
+  }
+};
+</script>
+
+
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/Message.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/Message.vue
new file mode 100644
index 0000000..8952162
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/Message.vue
@@ -0,0 +1,39 @@
+<template>
+  <div class="middle-box">
+    <div class="text-center animated fadeInDown">
+      <i style="font-size: 50px;color: #67c23a;margin-top:40px;" class="el-icon-circle-check"></i>
+      <div style="font-size: 20px;margin-top: 10px;" class="error-desc">{{ text }}</div>
+    </div>
+  </div>
+</template>
+  <script>
+export default {
+  props: {
+    text: {
+      type: String,
+      default: "鎿嶄綔鎴愬姛锛�",
+    },
+  },
+  methods: {
+  },
+};
+</script>
+<style lang="less" scoped>
+body {
+  background-color: #fff;
+}
+.middle-box {
+  text-align: center;
+  padding-top: 80px;
+  height: 100%;
+  // background: #eee;
+  h1 {
+    font-size: 140px;
+    font-weight: 100;
+  }
+  .back {
+    padding: 10px;
+  }
+}
+</style>
+
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/RedirectError.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/RedirectError.vue
new file mode 100644
index 0000000..969a159
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/RedirectError.vue
@@ -0,0 +1,59 @@
+<template>
+  <div class="middle-box">
+    <div class="text-center animated fadeInDown">
+      <h1>{{ errorNumber }}</h1>
+      <h3 class="font-bold">{{ message }}</h3>
+      <slot></slot>
+      <div class="error-desc">{{ text }}</div>
+      <div class="back">
+        <el-button type="primary" @click="backHome" icon="md-arrow-round-back">杩斿洖棣栭〉</el-button>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    errorNumber: {
+      type: String,
+      default: "500",
+    },
+    message: {
+      type: String,
+      default: "椤甸潰鏈壘鍒帮紒",
+    },
+    text: {
+      type: String,
+      default: "鍞�...濂藉儚鍑轰簡鐐归棶棰榽",
+    },
+  },
+  methods: {
+    backHome: function () {
+      this.$router.push({
+        path: "/home",
+      });
+    },
+  },
+};
+</script>
+<style lang="less" scoped>
+body {
+  background-color: #fff;
+}
+
+.middle-box {
+  text-align: center;
+  padding-top: 80px;
+  height: 100%;
+
+  // background: #eee;
+  h1 {
+    font-size: 140px;
+    font-weight: 100;
+  }
+
+  .back {
+    padding: 10px;
+  }
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/coding.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/coding.vue
new file mode 100644
index 0000000..5569483
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/redirect/coding.vue
@@ -0,0 +1,25 @@
+<template>
+  <div style="height:100%;">
+    <redirect-error :text="text" :errorNumber="errorNumber">
+      <div>
+        <router-link to="SellOrder">
+          <Button>鐐瑰嚮鏌ョ湅[娴嬭瘯瀹屾暣绀轰緥]</Button>
+        </router-link>
+      </div>
+    </redirect-error>
+  </div>
+</template>
+  <script>
+import RedirectError from "./RedirectError";
+export default {
+  components: {
+    RedirectError
+  },
+  data() {
+    return {
+      errorNumber: "鐢ㄤ緥姝e湪鏁寸悊涓�",
+      text: "璇︾粏鐢ㄤ緥鍦ㄦ鍑嗗涓�,鐩墠鍙弬鑰僛娴嬭瘯瀹屾暣绀轰緥]鐨勪娇鐢ㄦ柟娉�"
+    };
+  }
+};
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node.vue
new file mode 100644
index 0000000..983cef4
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node.vue
@@ -0,0 +1,100 @@
+<template>
+    <div ref="node" class="node-item" :style="nodeContainerStyle" @click="clickNode" @mouseup="changeNodeSite"
+        :class="nodeContainerClass">
+        <!-- 鏈�宸︿晶鐨勯偅鏉$珫绾� -->
+        <div class="ef-node-left"></div>
+        <!-- 鑺傜偣绫诲瀷鐨勫浘鏍� -->
+        <div class="ef-node-left-ico flow-node-drag">
+            <i :class="nodeIcoClass"></i>
+        </div>
+        <!-- 鑺傜偣鍚嶇О -->
+        <div class="ef-node-text" :show-overflow-tooltip="true">
+            {{ node.name }}
+        </div>
+        <i @click.stop="delNode" v-if="node.type == 'node' && !disabled" style="display: none" class="el-icon-delete"></i>
+        <!-- 鑺傜偣鐘舵�佸浘鏍� -->
+        <div class="ef-node-right-ico">
+            <i class="el-icon-circle-check el-node-state-success" v-show="node.state === 'success'"></i>
+            <i class="el-icon-circle-close el-node-state-error" v-show="node.state === 'error'"></i>
+            <i class="el-icon-warning-outline el-node-state-warning" v-show="node.state === 'warning'"></i>
+            <i class="el-icon-loading el-node-state-running" v-show="node.state === 'running'"></i>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    props: {
+        node: Object,
+        activeElement: Object,
+        disabled: {
+            typeof: Boolean,
+            default: false
+        }
+    },
+    data() {
+        return {}
+    },
+    computed: {
+        nodeContainerClass() {
+            return {
+                'ef-node-container': true,
+                'ef-node-active': this.activeElement.type == 'node' ? this.activeElement.nodeId === this.node.id : false
+            }
+        },
+        // 鑺傜偣瀹瑰櫒鏍峰紡
+        nodeContainerStyle() {
+            return {
+                top: this.node.top,
+                left: this.node.left
+            }
+        },
+        nodeIcoClass() {
+            var nodeIcoClass = {}
+            nodeIcoClass[this.node.ico] = true
+            // 娣诲姞璇lass鍙互鎺ㄦ嫿杩炵嚎鍑烘潵锛寁iewOnly 鍙互鎺у埗鑺傜偣鏄惁杩愯缂栬緫
+            nodeIcoClass['flow-node-drag'] = this.node.viewOnly ? false : true
+            return nodeIcoClass
+        }
+    },
+    methods: {
+        // 鐐瑰嚮鑺傜偣
+        clickNode() {
+            this.$emit('clickNode', this.node.id)
+        },
+        // 榧犳爣绉诲姩鍚庢姮璧�
+        changeNodeSite() {
+            // 閬垮厤鎶栧姩
+            if (this.node.left == this.$refs.node.style.left && this.node.top == this.$refs.node.style.top) {
+                return;
+            }
+            this.$emit('changeNodeSite', {
+                nodeId: this.node.id,
+                left: this.$refs.node.style.left,
+                top: this.$refs.node.style.top,
+            })
+        }, delNode() {
+            this.$emit("delNode");
+        },
+    }
+}
+</script>
+<style  scoped>
+@import "./index.css";
+/* .node-item{
+    position: relative;
+} */
+.node-item:hover .el-icon-delete {
+    display: inline-block !important;
+}
+
+.el-icon-delete {
+    cursor: pointer;
+    position: relative;
+    top: -18px;
+    padding-left: 5px;
+    right: -16px;
+    color: #f61313;
+    height: 20px;
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node_filter.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node_filter.vue
new file mode 100644
index 0000000..83a80fb
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node_filter.vue
@@ -0,0 +1,201 @@
+<template>
+    <div class="node-filter-container">
+        <!-- <div class="add-btn">
+          <span class="name">鏉′欢璁剧疆</span>  <el-button @click="addItem" link><i>+</i>娣诲姞瀛楁</el-button>
+        </div> -->
+        <!-- {{ $store.getters.data().flowTable.WorkTable }} -->
+        <div class="ef-node-pmenu-item" style="display: flex;">
+            <div style="flex:1;">
+                <span class="name"><i class="el-icon-news"></i>鏉′欢璁剧疆</span>
+            </div>
+            <div><el-button link size="small" @click="addItem" type="primary" v-if="!disabled">
+                    + 娣诲姞瀛楁</el-button></div>
+        </div>
+
+        <div>
+            <table>
+                <tr>
+                    <td>瀛楁</td>
+                    <td style="width:90px">鏉′欢</td>
+                    <td class="value">鍊�</td>
+                    <td style="width: 40px;" v-if="!disabled">鎿嶄綔</td>
+                </tr>
+                <tr v-for="(item, index) in filters" :key="index">
+
+                    <td><el-select @change="(field) => { fieldChange(field, index) }" size="small" v-model="item.field"
+                            placeholder="璇烽�夋嫨" :disabled="disabled">
+                            <el-option v-for="data in fieldsOptions" :key="data.field" :label="data.name"
+                                :value="data.field" />
+                        </el-select></td>
+                    <td><el-select size="small" v-model="item.filterType" placeholder="璇烽�夋嫨" :disabled="disabled">
+                            <el-option v-for="data in filterType" :key="data.value" :label="data.name"
+                                :value="data.value" />
+                        </el-select></td>
+                    <td>
+                        <template v-if="item.data">
+                            <el-select v-if="item.data.length >= 300" multiple size="small" v-model="item.value"
+                                placeholder="璇烽�夋嫨">
+                                <el-option v-for="data in item.data" :key="data.key" :label="data.value"
+                                    :value="data.key" :disabled="disabled" />
+                            </el-select>
+                            <el-select-v2 style="width: 100%;" v-else multiple size="small" :options="item.data"
+                                v-model="item.value" placeholder="璇烽�夋嫨" :disabled="disabled">
+                            </el-select-v2>
+                        </template>
+                        <el-input v-else v-model="item.value" size="small" :disabled="disabled"></el-input>
+                    </td>
+                    <td @click="delItem(index)" class="item-del" v-if="!disabled"><i class="el-icon-delete"></i></td>
+                </tr>
+            </table>
+        </div>
+        <!-- <div>
+            <label>鑷畾涔塻ql</label>
+            <div><el-input type="textarea" v-model="customSql"></el-input></div>
+        </div> -->
+    </div>
+</template>
+
+<script>
+let _this = this;
+export default {
+    props: {
+        tableName: {
+            type: String,
+            default: ""
+        },
+        filters: {
+            type: Array,
+            default: () => {
+                return []
+            }
+        },
+        disabled:{
+            typeof:Boolean,
+            default:false
+        }
+    },
+    data() {
+        return {
+            filter: this.$store.getters.data().flowTable,
+            customSql: "",
+            value: "",
+            //{ field: "鍚嶇О", value: "", filterType: "=" },
+            //  filters: [],
+            fieldsOptions: [
+
+            ],
+            t: [],
+            filterType: [{ name: "绛変簬(=)", value: "=" },
+            { name: "涓嶇瓑浜�(!=)", value: "!=" },
+            { name: "澶т簬(>)", value: ">" },
+            { name: "澶т簬绛変簬(>=)", value: ">=" },
+            { name: "灏忎簬(<)", value: "<" },
+            { name: "灏忎簬绛変簬(<=)", value: "<=" },
+            { name: "鍖呮嫭(in)", value: "in" },
+            // { name: "涓嶅寘鎷�(not in)", value: "notin" },
+            { name: "妯$硦鍖归厤(like)", value: "like" },
+            { name: "鎴栬��(or)", value: "or" }
+            ]
+        }
+    },
+    methods: {
+        delItem(index) {
+            this.$confirm('纭瑕佸垹闄ゅ瓧閰嶇疆鏉′欢閰嶇疆鍚�?', '璀﹀憡', {
+                confirmButtonText: '纭畾',
+                cancelButtonText: '鍙栨秷',
+                type: 'warning',
+                center: true
+            }).then(() => {
+                this.filters.splice(index, 1);
+            });
+        },
+        addItem() {
+            this.filters.push({ field: "", value: "", filterType: "", data: null })
+        },
+        fieldChange(field, index) {
+            let option = this.fieldsOptions.find(x => { return x.field == field });
+            this.filters[index].field = option.field;
+            this.filters[index].value = option.data ? [] : null;
+            this.filters[index].data = option.data;;
+        },
+        convertOptions(result) {
+
+        },
+        getOptions(tableName) {
+            const url = 'api/Sys_WorkFlow/getFields?table=' + tableName;
+            this.http.post(url, {}, false).then(result => {
+                result.forEach(c => {
+                    if (c.data && c.data.length < 300) {
+                        c.data = c.data.map(x => {
+                            return {
+                                value: x.key,
+                                label: x.value,
+                                key: x.key
+                            }
+                        })
+                    }
+                })
+                _this.fieldsOptions = result;
+            })
+        }
+    },
+    watch: {
+        'filter.WorkTable': {
+            handler(newvalue, oldvalue) {
+                if (newvalue) {
+                    this.getOptions(newvalue);
+                } else {
+                    //  this.fieldsOptions.splice(0)
+                }
+            }
+        }
+        // deep:true,
+        // filter(newVal,oldVal){
+        //    alert(1)
+        // }
+    },
+    created() {
+        _this = this;
+    },
+}
+</script>
+
+<style lang="less" scoped>
+.node-filter-container {
+    margin-top: 15px;
+
+    table {
+        width: 100%;
+        padding-left: 6px;
+
+        td {
+            font-size: 13px;
+            padding: 5px;
+
+        }
+
+        tr:first-child {
+            font-size: 12px;
+            font-weight: bolder;
+        }
+
+        .item-del {
+            text-align: center;
+            color: rgb(226, 4, 4);
+            cursor: pointer;
+        }
+
+        .value {
+            width: 150px;
+        }
+    }
+
+    .add-btn {
+        text-align: right;
+        padding-right: 10px;
+        border-bottom: 1px solid #e8e8e8;
+        padding-bottom: 5px;
+    }
+
+    .node-filter-item {}
+}</style>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node_form.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node_form.vue
new file mode 100644
index 0000000..2f23f4e
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node_form.vue
@@ -0,0 +1,351 @@
+<template>
+    <div>
+        <div class="ef-node-form">
+            <div class="ef-node-pmenu-item">
+                <div style="flex:1;">
+                    <span class="name"><i class="el-icon-news"></i>鑺傜偣灞炴��</span>
+                    <!-- <span @click="nameClick(1)" :class="{ active: index === 1 }" class="name">瀹℃壒鏉′欢</span> -->
+                </div>
+                <!-- <div><el-button link size="small" type="primary" @click="save"><i class="el-icon-check"></i>
+                        淇濆瓨閰嶇疆</el-button></div> -->
+            </div>
+            <div class="ef-node-form-body">
+                <div class="form-info">
+                    <VolForm ref="form" :select2Count="2000" style="padding:0 10px;" :label-width="130" :loadKey="false" :formFields="node"
+                        :formRules="formRules" :disabled="disabled">
+                    </VolForm>
+                </div>
+                <div>
+                    <node-filter :filters="node.filters" :disabled="disabled" :tableName="tableName" ref="filter">
+                    </node-filter>
+                </div>
+            </div>
+            <!--            <div class="el-node-form-tag"></div>-->
+        </div>
+    </div>
+</template>
+
+<script>
+// import { cloneDeep } from 'lodash'
+import VolForm from '@/components/basic/VolForm.vue';
+import nodeFilter from './node_filter.vue';
+export default {
+    components: {
+        VolForm,
+        'node-filter': nodeFilter
+    },
+    props: {
+        disabled:{
+            typeof:Boolean,
+            default:false
+        }
+        // node: {
+        //     type: Object,
+        //     default: () => {
+        //         return {
+        //             name: '',
+        //             auditType: 1,//瀹℃牳绫诲瀷
+        //             userId: null,
+        //             roleId: null,
+        //             deptId: null,
+        //             auditRefuse: null,//瀹℃牳鏈�氳繃
+        //             auditBack: null, //椹冲洖
+        //             auditMethod: 0,//瀹℃壒鏂瑰紡(浼氱)
+        //             stepValue: null,
+        //             sendMail: 0,
+        //             filters: [] //瀛楁杩囨护鏉′欢
+        //         }
+        //     }
+        // }
+    },
+    created() {
+        this.http.get('api/Sys_WorkFlow/getNodeDic').then((result) => {
+            this.formRules.forEach((options) => {
+                options.forEach((option) => {
+                    if (option.dataKey && !option.data.length) {
+                        option.data = result[option.dataKey] || [];
+                    }
+                });
+            });
+        });
+    },
+    data() {
+        return {
+            tableName: "",
+            index: 1,
+            visible: true,
+            // node 鎴� line
+            type: 'node',
+            node: {},
+            line: {},
+            data: {},
+
+            node: {
+                name: '',
+                auditType: 1,//瀹℃牳绫诲瀷
+                userId: null,
+                roleId: null,
+                deptId: null,
+                auditRefuse: null,//瀹℃牳鏈�氳繃
+                auditBack: null, //椹冲洖
+                auditMethod: 0,//瀹℃壒鏂瑰紡(浼氱)
+                //  nodeValue: null,
+                sendMail: 0,
+                filters: []
+            },
+            formRules: [
+                [
+                    {
+                        title: '鑺傜偣鍚嶇О',
+                        field: 'name',
+                        required: true,
+                        colSize: 12
+                    }],
+                [
+                    {
+                        dataKey: '',
+                        title: '瀹℃壒绫诲瀷',
+                        required: true,
+                        hidden: false,
+                        field: 'auditType',
+                        data: [
+                            { key: 1, value: '鎸夌敤鎴峰鎵�' },
+                            { key: 2, value: '鎸夎鑹插鎵�' },
+                            { key: 3, value: '鎸夐儴闂ㄥ鎵�' }
+                        ],
+                        type: 'select',
+                        onChange: this.nodeTypeChange,
+                        colSize: 12
+                    }
+                ],
+                [
+                    {
+                        dataKey: 'users',
+                        hidden: false,
+                        title: '瀹℃壒鐢ㄦ埛',
+                        required: true,
+                        field: 'userId',
+                        data: [],
+                        type: 'selectList',
+                        colSize: 12
+                    }
+                    ,
+                    {
+                        dataKey: 'roles',
+                        hidden: true,
+                        title: '瑙掕壊淇℃伅',
+                        required: true,
+                        field: 'roleId',
+
+                        data: [],
+                        type: 'select',
+                        colSize: 12
+                    }
+                    ,
+                    {
+                        dataKey: 'dept',
+                        hidden: true,
+                        title: '閮ㄩ棬淇℃伅',
+                        required: true,
+                        field: 'deptId',
+                        data: [],
+                        type: 'select',
+                        colSize: 12
+                    }
+                ], [
+                    {
+                        dataKey: '',
+                        title: '瀹℃壒鏈�氳繃',
+                        required: false,
+                        field: 'auditRefuse',
+                        hidden: false,
+                        data: [
+                            { key: 1, value: '杩斿洖涓婁竴鑺傜偣' },
+                            { key: 2, value: '娴佺▼閲嶆柊寮�濮�' },
+                            { key: 0, value: '娴佺▼缁撴潫' },
+                        ],
+                        type: 'select',
+                        colSize: 6
+                    }
+                    ,
+                    {
+                        dataKey: '',
+                        title: '瀹℃壒椹冲洖',
+                        required: false,
+                        hidden: false,
+                        field: 'auditBack',
+                        data: [
+                            { key: 1, value: '杩斿洖涓婁竴鑺傜偣' },
+                            { key: 2, value: '娴佺▼閲嶆柊寮�濮�' },
+                            { key: 0, value: '娴佺▼缁撴潫' },
+                        ],
+                        type: 'select',
+                        colSize: 6
+
+                    }
+                ],
+                [
+                    {
+                        dataKey: '',
+                        title: '瀹℃牳鍚庡彂閫侀偖浠堕�氱煡',
+                        required: false,
+                        hidden: false,
+                        field: 'sendMail',
+                        data: [
+                            { key: 1, value: '鏄�' },
+                            { key: 0, value: '鍚�' },
+                        ],
+                        type: 'switch'
+                    },
+                    {
+                        dataKey: '',
+                        title: '鍚敤浼氱',
+                        required: false,
+                        hidden: false,
+                        field: 'auditMethod',//瀹℃壒鏂瑰紡
+                        data: [
+                            { key: 1, value: '鏄�' },
+                            { key: 0, value: '鍚�' }
+                        ],
+                        type: 'switch'
+                    }
+                ],
+            ],
+        }
+    },
+    methods: {
+        nameClick(index) {
+            this.index = index;
+        },
+        /**
+         * 琛ㄥ崟淇敼锛岃繖閲屽彲浠ユ牴鎹紶鍏ョ殑ID杩涜涓氬姟淇℃伅鑾峰彇
+         * @param data
+         * @param id
+         */
+        nodeInit(data, id, tableName) {
+            this.tableName = tableName;
+            this.type = 'node'
+            this.data = data;
+            // this.tableName=data.
+            data.nodeList.filter((node) => {
+                if (node.id === id) {
+                    this.formRules.forEach(options => {
+                        options.forEach(c => {
+                            if (c.field != 'name') {
+                                c.hidden = node.type == 'start' || node.type == 'end';
+                            }
+                        })
+                    })
+                    if (!node.filters) {
+                        node.filters = [];
+                    }
+                    this.node = node;// cloneDeep(node)
+                    if (node.type != 'start' && node.type != 'end') {
+                        this.nodeTypeChange(node.auditType);
+                    }
+                }
+            })
+            // data.nodeList.filter((node) => {
+            //     if (node.id === id) {
+            //         let _node = cloneDeep(node);
+            //         _node.roleId = _node.roleId || null;
+            //         _node.userId = _node.userId || null;
+            //         _node.nodeType = (_node.nodeType || 1) * 1;
+            //         if (!node.filters) {
+            //             node.filters = [];
+            //         }
+            //         _node.filters = node.filters;
+            //         this.nodeTypeChange(_node.nodeType);
+            //         Object.assign(this.node, _node);
+            //     }
+            // });
+        },
+        nodeTypeChange(value) {
+            // { key: 1, value: '鎸夌敤鎴峰鎵�' },
+            //   { key: 2, value: '鎸夎鑹插鎵�' },
+            //   { key: 3, value: '鎸夐儴闂ㄥ鎵�' }
+            this.formRules.forEach((options) => {
+                options.forEach((option) => {
+                    if (option.field == 'userId') {
+                        option.hidden = value != 1;
+                    } else if (option.field == 'roleId') {
+                        option.hidden = value != 2;
+                    } else if (option.field == 'deptId') {
+                        option.hidden = value != 3;
+                    }
+                });
+            });
+        },
+        lineInit(line) {
+            this.type = 'line'
+            this.line = line
+        },
+        // 淇敼杩炵嚎
+        saveLine() {
+            this.$emit('setLineLabel', this.line.from, this.line.to, this.line.label)
+        },
+        save() {
+            this.data.nodeList.filter((node) => {
+                if (node.id === this.node.id) {
+                    node.name = this.node.name;
+                    node.left = this.node.left;
+                    node.top = this.node.top;
+                    node.ico = this.node.ico;
+                    node.state = this.node.state;
+                    node.stepValue = this.node.stepValue;
+                    this.$emit('repaintEverything', this.node);
+                }
+
+            });
+            this.$message.success('淇濆瓨鎴愬姛')
+        }
+    }
+}
+</script>
+
+<style lang="less" scoped>
+@import "./index.css";
+.el-node-form-tag {
+    position: absolute;
+    top: 50%;
+    margin-left: -15px;
+    height: 40px;
+    width: 15px;
+    background-color: #fbfbfb;
+    border: 1px solid rgb(220, 227, 232);
+    border-right: none;
+    z-index: 0;
+}
+
+.btns {
+    text-align: center;
+    padding: 10px;
+
+    buttton {
+        flex: 1;
+    }
+}
+
+.ef-node-pmenu-item {
+    display: flex;
+
+    .name {
+        cursor: pointer;
+        margin-right: 15px;
+    }
+
+    .active {
+        color: #0659e8;
+    }
+}
+
+.form-info ::v-deep(.vol-form-item) {
+    display: flex;
+
+    .el-form-item:nth-child(2),
+    .el-form-item:nth-child(3),
+    .el-form-item:nth-child(4) {
+        margin-left: 12px;
+    }
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node_menu.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node_menu.vue
new file mode 100644
index 0000000..8bbf9b2
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/node_menu.vue
@@ -0,0 +1,129 @@
+<template>
+    <div class="flow-menu" ref="tool">
+        <div v-for="menu  in  menuList" :key="menu.id">
+            <div class="ef-node-pmenu-item"><i class="el-icon-notebook-2"></i>鑺傜偣閰嶇疆</div>
+            <ul v-show="menu.open" class="ef-node-menu-ul">
+                <draggable @end="end" @start="move" v-model="menu.children" :options="draggableOptions">
+                    <li v-for="subMenu in menu.children" class="ef-node-menu-li" :key="subMenu.id" :type="subMenu.type">
+                        <i :class="subMenu.ico"></i> {{ subMenu.name }}
+                    </li>
+                </draggable>
+            </ul>
+        </div>
+    </div>
+</template>
+<script>
+import { VueDraggableNext as draggable } from "vue-draggable-next";
+
+var mousePosition = {
+    left: -1,
+    top: -1
+}
+
+export default {
+    data() {
+        return {
+            activeNames: '1',
+            // draggable閰嶇疆鍙傛暟鍙傝�� https://www.cnblogs.com/weixin186/p/10108679.html
+            draggableOptions: {
+                preventOnFilter: false,
+                sort: false,
+                disabled: false,
+                ghostClass: 'tt',
+                // 涓嶄娇鐢℉5鍘熺敓鐨勯厤缃�
+                forceFallback: true,
+                // 鎷栨嫿鐨勬椂鍊欐牱寮�
+                // fallbackClass: 'flow-node-draggable'
+            },
+            // 榛樿鎵撳紑鐨勫乏渚ц彍鍗曠殑id
+            defaultOpeneds: ['1', '2'],
+            menuList: [
+                {
+                    id: '1',
+                    type: 'group',
+                    name: '寮�濮嬭妭鐐�',
+                    ico: 'el-icon-video-play',
+                    open: true,
+                    children: [
+                        {
+                            id: '0',
+                            type: 'start',
+                            name: '娴佺▼寮�濮�',
+                            ico: 'el-icon-time',
+                            // 鑷畾涔夎鐩栨牱寮�
+                            style: {}
+                        },
+                        {
+                            id: '1',
+                            type: 'end',
+                            name: '娴佺▼缁撴潫',
+                            ico: 'el-icon-switch-button',
+                            // 鑷畾涔夎鐩栨牱寮�
+                            style: {}
+                        },   {
+                            id: '2',
+                            type: 'node',
+                            name: '娴佺▼鑺傜偣',
+                            ico: 'el-icon-news',
+                            // 鑷畾涔夎鐩栨牱寮�
+                            style: {}
+                        }
+                    ]
+                }],
+
+            nodeMenu: {}
+        }
+    },
+    components: {
+        draggable
+    },
+    created() {
+        /**
+         * 浠ヤ笅鏄负浜嗚В鍐冲湪鐏嫄娴忚鍣ㄤ笂鎺ㄦ嫿鏃跺脊鍑簍ab椤靛埌鎼滅储闂
+         * @param event
+         */
+        if (this.isFirefox()) {
+            document.body.ondrop = function (event) {
+                // 瑙e喅鐏嫄娴忚鍣ㄦ棤娉曡幏鍙栭紶鏍囨嫋鎷界粨鏉熺殑鍧愭爣闂
+                mousePosition.left = event.layerX
+                mousePosition.top = event.clientY - 50
+                event.preventDefault();
+                event.stopPropagation();
+            }
+        }
+    },
+    methods: {
+        // 鏍规嵁绫诲瀷鑾峰彇宸︿晶鑿滃崟瀵硅薄
+        getMenuByType(type) {
+            for (let i = 0; i < this.menuList.length; i++) {
+                let children = this.menuList[i].children;
+                for (let j = 0; j < children.length; j++) {
+                    if (children[j].type === type) {
+                        return children[j]
+                    }
+                }
+            }
+        },
+        // 鎷栨嫿寮�濮嬫椂瑙﹀彂
+        move(evt, a, b, c) {
+            var type = evt.item.attributes.type.nodeValue
+            this.nodeMenu = this.getMenuByType(type)
+        },
+        // 鎷栨嫿缁撴潫鏃惰Е鍙�
+        end(evt, e) {
+            this.$emit('addNode', evt, this.nodeMenu, mousePosition)
+        },
+        // 鏄惁鏄伀鐙愭祻瑙堝櫒
+        isFirefox() {
+            var userAgent = navigator.userAgent
+            if (userAgent.indexOf("Firefox") > -1) {
+                return true
+            }
+            return false
+        }
+    }
+}
+</script>
+<style lang="less" scoped>
+@import "./index.css";
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/panel.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/panel.vue
new file mode 100644
index 0000000..84d29bc
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/components/workflow/panel.vue
@@ -0,0 +1,612 @@
+<!-- 瀹℃牳娴佺▼鎻掍欢鍩轰簬https://gitee.com/xiaoka2017/easy-flow淇敼-->
+<!--鎰熻阿钀岀骇灏忚彍楦� / easy-flow -->
+<template>
+    <div v-if="easyFlowVisible" class="flow-panel">
+
+        <div style="display: flex;height: 100%;position: relative;">
+            <el-scrollbar style="height: 100%;border-right: 1px solid rgb(220, 227, 232);">
+                <div style="width: 220px;">
+                    <div class="ef-node-pmenu-item"><i class="el-icon-warning-outline"></i>鍩虹淇℃伅</div>
+                    <VolForm ref="form" style="padding: 10px;" :label-width="180" :loadKey="true" :formFields="formFields"
+                        :disabled="disabled" :formRules="formRules"></VolForm>
+                    <node-menu @addNode="addNode" ref="nodeMenu" v-if="!disabled"></node-menu>
+                </div>
+            </el-scrollbar>
+            <div class="tools">
+                <el-button circle @click="zoomAdd"><i class="el-icon-zoom-in"></i></el-button>
+                <el-button circle @click="zoomSub"><i class="el-icon-zoom-out"></i></el-button>
+            </div>
+            <div style="flex: 1;" id="efContainer" ref="efContainer" class="container efContainer" v-flowDrag>
+                <template :key="node.id" v-for="node in data.nodeList">
+                    <flow-node :id="node.id" @delNode="deleteNode(node.id)" :node="node" :activeElement="activeElement"
+                        :disabled="disabled" @changeNodeSite="changeNodeSite" @nodeRightMenu="nodeRightMenu"
+                        @clickNode="clickNode">
+                    </flow-node>
+                </template>
+                <!-- 缁欑敾甯冧竴涓粯璁ょ殑瀹藉害鍜岄珮搴� -->
+                <div style="position:absolute;top: 3000px;left: 4000px;">&nbsp;</div>
+            </div>
+            <!-- 鍙充晶琛ㄥ崟 -->
+            <div style="width: 400px;border-left: 1px solid #dce3e8;background-color: #FBFBFB">
+                <el-scrollbar style="height: 100%;padding-bottom: 10px;">
+                    <flow-node-form @delNode="deleteNode" ref="nodeForm" @setLineLabel="setLineLabel" :disabled="disabled"
+                        @repaintEverything="repaintEverything"></flow-node-form>
+                </el-scrollbar>
+            </div>
+        </div>
+    </div>
+</template>
+
+<script>
+import { VueDraggableNext as draggable } from "vue-draggable-next";
+// import { jsPlumb } from 'jsplumb'
+// 浣跨敤淇敼鍚庣殑jsplumb
+import './jsplumb'
+import { easyFlowMixin } from './mixins'
+import flowNode from './node'
+import nodeMenu from './node_menu'
+import FlowNodeForm from './node_form'
+import lodash from 'lodash'
+// import { getDataA } from './data_A'
+import VolForm from '@/components/basic/VolForm.vue';
+export default {
+    props: {
+        disabled: {
+            typeof: Boolean,
+            default: false
+        }
+    },
+    data() {
+        return {
+            formFields: {
+                WorkName: '',
+                WorkTable: '',
+                WorkTableName: '',
+                Weight: 1,
+                AuditingEdit: 0,
+                Remark: ''
+            },
+            formRules: [
+                [
+                    {
+                        dataKey: '娴佺▼鍚嶇О',
+                        title: '娴佺▼鍚嶇О',
+                        field: 'WorkName',
+                        required: true
+                    }],
+                [{
+                    dataKey: '',
+                    title: '娴佺▼瀹炰緥',
+                    required: true,
+                    field: 'WorkTable',
+                    data: [],
+                    readonly: false,
+                    type: 'select',
+                    onChange: (value, item) => {
+                        this.formRules.forEach((options) => {
+                            options.forEach((option) => {
+                                if (option.field == 'WorkTable') {
+                                    this.formFields.WorkTableName = option.data.find((x) => {
+                                        return x.key == value;
+                                    }).value;
+                                }
+                            });
+                        });
+                    }
+                }],
+                [{
+                    title: '鏉冮噸(鐩稿悓鏉′欢鏉冮噸澶т紭鍏�)',
+                    field: 'Weight',
+                    type: "number",
+                }
+                ],
+                
+                [{
+                    title: '瀹℃牳涓暟鎹槸鍚﹀彲浠ョ紪杈�',
+                    field: 'AuditingEdit',
+                    type: "switch",
+                    data: [{ key: 0, value: "鍚�" }, { key: 1, value: "鏄�" }]
+                }
+                ],
+                [{
+                    title: '澶囨敞',
+                    field: 'Remark'
+                }
+                ]
+            ],
+            // jsPlumb 瀹炰緥
+            jsPlumb: null,
+            // 鎺у埗鐢诲竷閿�姣�
+            easyFlowVisible: true,
+            // 鏄惁鍔犺浇瀹屾瘯鏍囧織浣�
+            loadEasyFlowFinish: false,
+            // 鏁版嵁
+            data: {},
+            // 婵�娲荤殑鍏冪礌銆佸彲鑳芥槸鑺傜偣銆佸彲鑳芥槸杩炵嚎
+            activeElement: {
+                // 鍙�夊�� node 銆乴ine
+                type: undefined,
+                // 鑺傜偣ID
+                nodeId: undefined,
+                // 杩炵嚎ID
+                sourceId: undefined,
+                targetId: undefined
+            },
+            zoom: 1
+        }
+    },
+    // 涓�浜涘熀纭�閰嶇疆绉诲姩璇ユ枃浠朵腑
+    mixins: [easyFlowMixin],
+    components: {
+        draggable, flowNode, nodeMenu, FlowNodeForm, VolForm
+    },
+    directives: {
+        'flowDrag': {
+            mounted(el, binding, vnode, oldNode) {
+                if (!binding) {
+                    return
+                }
+                el.onmousedown = (e) => {
+                    if (e.button == 2) {
+                        // 鍙抽敭涓嶇
+                        return
+                    }
+                    //  榧犳爣鎸変笅锛岃绠楀綋鍓嶅師濮嬭窛绂诲彲瑙嗗尯鐨勯珮搴�
+                    let disX = e.clientX
+                    let disY = e.clientY
+                    el.style.cursor = 'move'
+
+                    document.onmousemove = function (e) {
+                        // 绉诲姩鏃剁姝㈤粯璁や簨浠�
+                        e.preventDefault()
+                        const left = e.clientX - disX
+                        disX = e.clientX
+                        el.scrollLeft += -left
+
+                        const top = e.clientY - disY
+                        disY = e.clientY
+                        el.scrollTop += -top
+                    }
+
+                    document.onmouseup = function (e) {
+                        el.style.cursor = 'auto'
+                        document.onmousemove = null
+                        document.onmouseup = null
+                    }
+                }
+            }
+        }
+    },
+    mounted() {
+        this.jsPlumb = jsPlumb.getInstance()
+        // this.$nextTick(() => {
+        //     // 榛樿鍔犺浇娴佺▼A鐨勬暟鎹�佸湪杩欓噷鍙互鏍规嵁鍏蜂綋鐨勪笟鍔¤繑鍥炵鍚堟祦绋嬫暟鎹牸寮忕殑鏁版嵁鍗冲彲
+        //     this.dataReload(getDataA())
+        // })
+    },
+    created() {
+        this.http.get('api/Sys_WorkFlow/getTableInfo').then((result) => {
+            this.formRules.forEach((options) => {
+                options.forEach((option) => {
+                    if (option.field == 'WorkTable') {
+                        option.data = result;
+                    }
+                });
+            });
+        });
+        this.$store.getters.data().flowTable = this.formFields;
+    },
+    methods: {
+        // 杩斿洖鍞竴鏍囪瘑
+        getUUID() {
+            return Math.random().toString(36).substr(3, 10)
+        },
+        jsPlumbInit() {
+            this.jsPlumb.ready(() => {
+                // 瀵煎叆榛樿閰嶇疆
+                this.jsPlumb.importDefaults(this.jsplumbSetting)
+                // 浼氫娇鏁翠釜jsPlumb绔嬪嵆閲嶇粯銆�
+                this.jsPlumb.setSuspendDrawing(false, true);
+                // 鍒濆鍖栬妭鐐�
+                this.loadEasyFlow()
+                // 鍗曠偣鍑讳簡杩炴帴绾�, https://www.cnblogs.com/ysx215/p/7615677.html
+                this.jsPlumb.bind('click', (conn, originalEvent) => {
+                    this.activeElement.type = 'line'
+                    this.activeElement.sourceId = conn.sourceId
+                    this.activeElement.targetId = conn.targetId
+                    this.$refs.nodeForm.lineInit({
+                        from: conn.sourceId,
+                        to: conn.targetId,
+                        label: conn.getLabel()
+                    })
+                    this.deleteElement();
+                })
+                // 杩炵嚎
+                this.jsPlumb.bind("connection", (evt) => {
+                    let from = evt.source.id
+                    let to = evt.target.id
+                    if (this.loadEasyFlowFinish) {
+                        this.data.lineList.push({ from: from, to: to })
+                    }
+                })
+
+                // 鍒犻櫎杩炵嚎鍥炶皟
+                this.jsPlumb.bind("connectionDetached", (evt) => {
+                    this.deleteLine(evt.sourceId, evt.targetId)
+                })
+
+                // 鏀瑰彉绾跨殑杩炴帴鑺傜偣
+                this.jsPlumb.bind("connectionMoved", (evt) => {
+                    this.changeLine(evt.originalSourceId, evt.originalTargetId)
+                })
+
+                // 杩炵嚎鍙冲嚮
+                this.jsPlumb.bind("contextmenu", (evt) => {
+                    console.log('contextmenu', evt)
+                })
+
+                // 杩炵嚎
+                this.jsPlumb.bind("beforeDrop", (evt) => {
+                    let from = evt.sourceId
+                    let to = evt.targetId
+                    if (from === to) {
+                        this.$message.error('鑺傜偣涓嶆敮鎸佽繛鎺ヨ嚜宸�')
+                        return false
+                    }
+                    if (this.hasLine(from, to)) {
+                        this.$message.error('璇ュ叧绯诲凡瀛樺湪,涓嶅厑璁搁噸澶嶅垱寤�')
+                        return false
+                    }
+                    if (this.hashOppositeLine(from, to)) {
+                        this.$message.error('涓嶆敮鎸佷袱涓妭鐐逛箣闂磋繛绾垮洖鐜�');
+                        return false
+                    }
+                    this.$message.success('杩炴帴鎴愬姛')
+                    setTimeout(() => { this.setLineLabel(from, to, 'x') }, 50)
+                    return true
+                })
+
+                // beforeDetach
+                this.jsPlumb.bind("beforeDetach", (evt) => {
+                    console.log('beforeDetach', evt)
+                })
+                this.jsPlumb.setContainer(this.$refs.efContainer)
+            })
+        },
+        // 鍔犺浇娴佺▼鍥�
+        loadEasyFlow() {
+            // 鍒濆鍖栬妭鐐�
+            for (var i = 0; i < this.data.nodeList.length; i++) {
+                let node = this.data.nodeList[i]
+                if (node.userId && node.userId != '') {
+                    // userId涓烘暟鍊肩被鍨�
+                    if (typeof node.userId == 'number'){
+                        node.userId = [node.userId]
+                    } else {
+                        node.userId = node.userId.split(',').map(Number);
+                    }
+                } else {
+                    node.userId = []
+                }
+                // 璁剧疆婧愮偣锛屽彲浠ユ嫋鍑虹嚎杩炴帴鍏朵粬鑺傜偣
+                this.jsPlumb.makeSource(node.id, lodash.merge(this.jsplumbSourceOptions, {}))
+                // // 璁剧疆鐩爣鐐癸紝鍏朵粬婧愮偣鎷栧嚭鐨勭嚎鍙互杩炴帴璇ヨ妭鐐�
+                this.jsPlumb.makeTarget(node.id, this.jsplumbTargetOptions)
+                if (!node.viewOnly && !this.disabled) {
+                    this.jsPlumb.draggable(node.id, {
+                        containment: 'parent',
+                        stop: function (el) {
+                            // 鎷栨嫿鑺傜偣缁撴潫鍚庣殑瀵硅皟
+                            console.log('鎷栨嫿缁撴潫: ', el)
+                        }
+                    })
+                }
+            }
+            // 鍒濆鍖栬繛绾�
+            for (var i = 0; i < this.data.lineList.length; i++) {
+                let line = this.data.lineList[i]
+                var connParam = {
+                    source: line.from,
+                    target: line.to,
+                    label: this.disabled ? null : (line.label ? line.label : 'x'),
+                    connector: line.connector ? line.connector : '',
+                    anchors: line.anchors ? line.anchors : undefined,
+
+                    paintStyle: line.paintStyle ? line.paintStyle : undefined,
+                }
+                this.jsPlumb.connect(connParam, this.jsplumbConnectOptions)
+            }
+            this.$nextTick(function () {
+                this.loadEasyFlowFinish = true
+            })
+        },
+        // 璁剧疆杩炵嚎鏉′欢
+        setLineLabel(from, to, label) {
+            var conn = this.jsPlumb.getConnections({
+                source: from,
+                target: to
+            })[0]
+            if (!label || label === '') {
+                conn.removeClass('flowLabel ')
+                conn.addClass('emptyFlowLabel')
+            } else {
+                conn.addClass('flowLabel')
+            }
+            conn.setLabel({
+                label: 'x' //label,
+            })
+            this.data.lineList.forEach(function (line) {
+                if (line.from == from && line.to == to) {
+                    line.label = 'x'// label
+                }
+            })
+
+        },
+        // 鍒犻櫎婵�娲荤殑鍏冪礌
+        deleteElement() {
+            if (this.disabled)
+                return
+            if (this.activeElement.type === 'node') {
+                this.deleteNode(this.activeElement.nodeId)
+            } else if (this.activeElement.type === 'line') {
+                this.$confirm('纭畾鍒犻櫎鎵�鐐瑰嚮鐨勭嚎鍚�?', '鎻愮ず', {
+                    confirmButtonText: '纭畾',
+                    cancelButtonText: '鍙栨秷',
+                    type: 'warning'
+                }).then(() => {
+                    var conn = this.jsPlumb.getConnections({
+                        source: this.activeElement.sourceId,
+                        target: this.activeElement.targetId
+                    })[0]
+                    this.jsPlumb.deleteConnection(conn)
+                }).catch(() => {
+                })
+            }
+        },
+        // 鍒犻櫎绾�
+        deleteLine(from, to) {
+            this.data.lineList = this.data.lineList.filter(function (line) {
+                if (line.from == from && line.to == to) {
+                    return false
+                }
+                return true
+            })
+        },
+        // 鏀瑰彉杩炵嚎
+        changeLine(oldFrom, oldTo) {
+            this.deleteLine(oldFrom, oldTo)
+        },
+        // 鏀瑰彉鑺傜偣鐨勪綅缃�
+        changeNodeSite(data) {
+            for (var i = 0; i < this.data.nodeList.length; i++) {
+                let node = this.data.nodeList[i]
+                if (node.id === data.nodeId) {
+                    node.left = data.left
+                    node.top = data.top
+                }
+            }
+        },
+        /**
+         * 鎷栨嫿缁撴潫鍚庢坊鍔犳柊鐨勮妭鐐�
+         * @param evt
+         * @param nodeMenu 琚坊鍔犵殑鑺傜偣瀵硅薄
+         * @param mousePosition 榧犳爣鎷栨嫿缁撴潫鐨勫潗鏍�
+         */
+        addNode(evt, nodeMenu, mousePosition) {
+            if (nodeMenu.type == 'start' && this.data.nodeList.some(x => { return x.type == 'start' })) {
+                this.$message.error('銆愭祦绋嬬粨鏉熴�戣妭鐐瑰凡瀛樺湪,鍙湁閫夋嫨涓�涓祦绋嬪紑濮嬭妭鐐�');
+                return
+            }
+            if (nodeMenu.type == 'end' && this.data.nodeList.some(x => { return x.type == 'end' })) {
+                this.$message.error('銆愭祦绋嬬粨鏉熴�戣妭鐐瑰凡瀛樺湪,鍙湁閫夋嫨涓�涓祦绋嬪紑濮嬭妭鐐�');
+                return
+            }
+            var screenX = evt.originalEvent.clientX, screenY = evt.originalEvent.clientY
+            let efContainer = this.$refs.efContainer
+            var containerRect = efContainer.getBoundingClientRect()
+            var left = screenX, top = screenY
+            // 璁$畻鏄惁鎷栧叆鍒板鍣ㄤ腑
+            if (left < containerRect.x || left > containerRect.width + containerRect.x || top < containerRect.y || containerRect.y > containerRect.y + containerRect.height) {
+                this.$message.error("璇锋妸鑺傜偣鎷栧叆鍒扮敾甯冧腑")
+                return
+            }
+            left = left - containerRect.x + efContainer.scrollLeft
+            top = top - containerRect.y + efContainer.scrollTop
+            // 灞呬腑
+            left -= 85
+            top -= 16
+            var nodeId = this.getUUID()
+            // 鍔ㄦ�佺敓鎴愬悕瀛�
+            var origName = nodeMenu.name
+            var nodeName = origName
+            var index = 1
+            while (index < 10000) {
+                var repeat = false
+                for (var i = 0; i < this.data.nodeList.length; i++) {
+                    let node = this.data.nodeList[i]
+                    if (node.name === nodeName) {
+                        nodeName = origName + index
+                        repeat = true
+                    }
+                }
+                if (repeat) {
+                    index++
+                    continue
+                }
+                break
+            }
+            var node = {
+                id: nodeId,
+                name: nodeName,
+                type: nodeMenu.type,
+                left: left + 'px',
+                top: top + 'px',
+                ico: nodeMenu.ico,
+                state: 'success'
+            }
+            /**
+             * 杩欓噷鍙互杩涜涓氬姟鍒ゆ柇銆佹槸鍚﹁兘澶熸坊鍔犺鑺傜偣
+             */
+            this.data.nodeList.push(node)
+            this.$nextTick(function () {
+                this.jsPlumb.makeSource(nodeId, this.jsplumbSourceOptions)
+                this.jsPlumb.makeTarget(nodeId, this.jsplumbTargetOptions)
+                this.jsPlumb.draggable(nodeId, {
+                    containment: 'parent',
+                    stop: function (el) {
+                        // 鎷栨嫿鑺傜偣缁撴潫鍚庣殑瀵硅皟
+                        console.log('鎷栨嫿缁撴潫: ', el)
+                    }
+                })
+            })
+        },
+        /**
+         * 鍒犻櫎鑺傜偣
+         * @param nodeId 琚垹闄よ妭鐐圭殑ID
+         */
+        deleteNode(nodeId) {
+            this.$confirm('纭畾瑕佸垹闄よ妭鐐�' + nodeId + '?', '鎻愮ず', {
+                confirmButtonText: '纭畾',
+                cancelButtonText: '鍙栨秷',
+                type: 'warning',
+                closeOnClickModal: false
+            }).then(() => {
+                /**
+                 * 杩欓噷闇�瑕佽繘琛屼笟鍔″垽鏂紝鏄惁鍙互鍒犻櫎
+                 */
+                this.data.nodeList = this.data.nodeList.filter(function (node) {
+                    if (node.id === nodeId) {
+                        // 浼垹闄わ紝灏嗚妭鐐归殣钘忥紝鍚﹀垯浼氬鑷翠綅缃敊浣�
+                        // node.show = false
+                        return false
+                    }
+                    return true
+                })
+                this.$nextTick(function () {
+                    this.jsPlumb.removeAllEndpoints(nodeId);
+                })
+            }).catch(() => {
+            })
+            return true
+        },
+        clickNode(nodeId) {
+            this.activeElement.type = 'node'
+            this.activeElement.nodeId = nodeId
+            this.$refs.nodeForm.nodeInit(this.data, nodeId, this.formFields.WorkTable)
+        },
+        // 鏄惁鍏锋湁璇ョ嚎
+        hasLine(from, to) {
+            for (var i = 0; i < this.data.lineList.length; i++) {
+                var line = this.data.lineList[i]
+                if (line.from === from && line.to === to) {
+                    return true
+                }
+            }
+            return false
+        },
+        // 鏄惁鍚湁鐩稿弽鐨勭嚎
+        hashOppositeLine(from, to) {
+            return this.hasLine(to, from)
+        },
+        nodeRightMenu(nodeId, evt) {
+            this.menu.show = true
+            this.menu.curNodeId = nodeId
+            this.menu.left = evt.x + 'px'
+            this.menu.top = evt.y + 'px'
+        },
+        repaintEverything(node) {
+            let _node = this.data.nodeList.find((x) => {
+                return x.id == node.id;
+            });
+            Object.assign(_node, node);
+            console.log(_node);
+            this.jsPlumb.repaint();
+        },
+        // 鍔犺浇娴佺▼鍥�
+        dataReload(data, isAdd) {
+            this.easyFlowVisible = false
+            this.data.nodeList = []
+            this.data.lineList = []
+            this.$nextTick(() => {
+                data = lodash.cloneDeep(data)
+                this.easyFlowVisible = true
+                this.data = data
+                this.$nextTick(() => {
+                    this.jsPlumb = jsPlumb.getInstance()
+                    this.$nextTick(() => {
+                        this.jsPlumbInit()
+                    })
+                })
+            })
+            this.formRules.forEach(options => {
+                options.forEach(option => {
+                    if (option.field == "WorkTable") {
+                        option.readonly = !isAdd;
+                    }
+                })
+            })
+        },
+        zoomAdd() {
+            if (this.zoom >= 1) {
+                return
+            }
+            this.zoom = this.zoom + 0.1
+            this.$refs.efContainer.style.zoom = this.zoom;
+            // this.jsPlumb.setZoom(this.zoom)
+        },
+        zoomSub() {
+            if (this.zoom <= 0) {
+                return
+            }
+            this.zoom = this.zoom - 0.1;
+            if (this.zoom < 0.3) {
+                this.zoom = 0.3;
+            }
+            this.$refs.efContainer.style.zoom = this.zoom;
+            // this.jsPlumb.setZoom(this.zoom)
+        }
+    }
+}
+</script>
+<style scoped lang="less">
+@import './index.css';
+
+.flow-panel {
+    position: absolute;
+    height: 100%;
+    width: 100%;
+}
+
+.flow-panel ::v-deep(.el-form-item__label) {
+    margin-bottom: -2px !important;
+    text-align: left;
+    padding: 0 !important;
+    justify-content: flex-start;
+}
+
+.flow-panel ::v-deep(.el-form-item) {
+    display: flex;
+    flex-direction: column;
+    margin-bottom: 7px !important;
+
+}
+
+.ef-node-menu-form {
+    padding: 0px;
+}
+
+::-webkit-scrollbar {
+    width: 0px;
+    height: 0px;
+}
+
+::-webkit-scrollbar-thumb {
+    border-radius: 0px;
+    background: #e0e3e7;
+    height: 20px;
+}
+
+::-webkit-scrollbar-track {
+    background-color: transparent;
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Dictionary.jsx b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Dictionary.jsx
new file mode 100644
index 0000000..d7a82eb
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Dictionary.jsx
@@ -0,0 +1,75 @@
+import { h, resolveComponent } from 'vue';
+let extension = {
+    components: { //鍔ㄦ�佹墿鍏呯粍浠舵垨缁勪欢璺緞
+        //琛ㄥ崟header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+        //鎵╁睍缁勪欢寮曞叆鏂瑰紡
+        gridHeader: '',
+        gridBody: {
+            render () {
+                return [
+                    h(resolveComponent('el-alert'), {
+                        style: { 'margin-bottom': '12px' },
+                        'show-icon': true, type: 'error',
+                        closable: false, title: '鐣岄潰涓嬫媺妗嗐�佸閫夈�乧heckbox绛夋暟鎹簮閮藉湪姝ゅ缁存姢锛屼篃鏄唬鐮佺敓鎴愬櫒涓殑鏁版嵁婧�'
+                    }, ''),
+                ]
+            }
+        },
+        gridFooter: '',
+        //寮瑰嚭妗�(淇敼銆佺紪杈戙�佹煡鐪�)header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+        modelHeader: '',
+        modelBody: '',
+        modelFooter: ''
+    },
+    buttons: [], //鎵╁睍鐨勬寜閽�
+    methods: { //浜嬩欢鎵╁睍
+        onInit () {
+            //鐐瑰嚮鍗曞厓鏍肩紪杈戜笌缁撴潫缂栬緫(榛樿鏄偣鍑诲崟鍏冩牸缂栬緫锛岄紶鏍囩寮�缁撴潫缂栬緫)
+            this.detailOptions.clickEdit = true;
+            this.editFormOptions.forEach(x => {
+                x.forEach(item => {
+                    if (item.field == 'parentId') {
+                        item.min = 0;
+                    }
+                    if (item.field == "dbSql") {
+                        item.placeholder = "濡傛灉浠庢暟鎹簱鍔犺浇鏁版嵁婧愶紝璇锋寜姝ゆ牸寮忛厤缃畇ql璇彞锛歴elect orderType as key,orderName as value from order  濡傛灉闇�瑕佹牴鎹敤鎴蜂俊鎭姞杞芥暟鎹簮锛岃閰嶇疆濂芥sql,鍐嶄慨鏀瑰悗鍙癉ictionaryHandler.GetCustomDBSql鏂规硶";
+                    }
+                })
+            })
+            this.detailOptions.columns.forEach(x => {
+                if (x.field == 'orderNo') {
+                    x.summary = true;
+                }
+            })
+            //淇濆瓨鍚庝笉鍏抽棴缂栬緫妗�
+            this.boxOptions.saveClose = false;
+        },
+        onInited () {
+            this.boxOptions.height = document.body.clientHeight * 0.87
+            this.height = this.height - 45;
+        },
+        addBefore (formData) {
+            return this.saveBefore(formData);
+        },
+        updateBefore (formData) {
+            return this.saveBefore(formData);
+        },
+        saveBefore (formData) {
+            if (this.editFormFields.DbSql &&
+                (this.editFormFields.DbSql.indexOf('value') == -1 ||
+                    this.editFormFields.DbSql.indexOf('key') == -1)
+            ) {
+                this.$message.error("sql璇彞蹇呴』鍖呮嫭key/value瀛楁,濡�:select orderType as key,orderName as value from order");
+                return false;
+            }
+            return true;
+        },
+        searchBefore (param) {
+            return true;
+        },
+        searchAfter (result) {
+            return true;
+        }
+    }
+};
+export default extension;
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_DictionaryList.jsx b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_DictionaryList.jsx
new file mode 100644
index 0000000..da94487
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_DictionaryList.jsx
@@ -0,0 +1,22 @@
+
+
+let extension = {
+    components: {//鍔ㄦ�佹墿鍏呯粍浠舵垨缁勪欢璺緞
+        //琛ㄥ崟header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+        gridHeader:'',
+        gridbody:'',
+        gridFooter: '',
+        //寮瑰嚭妗�(淇敼銆佺紪杈戙�佹煡鐪�)header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+        modelHeader: '',
+        modelBody: '',
+        modelFooter: ''
+    },
+    buttons: [],//鎵╁睍鐨勬寜閽�
+    methods: {//浜嬩欢鎵╁睍
+        onInit() {
+        },
+        onInited() {
+        }
+    }
+};
+export default extension;
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Log.jsx b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Log.jsx
new file mode 100644
index 0000000..5b05c40
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Log.jsx
@@ -0,0 +1,26 @@
+import { h, resolveComponent } from 'vue';
+let extension = {
+  components: {
+    //鍔ㄦ�佹墿鍏呯粍浠舵垨缁勪欢璺緞
+    //琛ㄥ崟header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+    gridHeader: "", //{ template: "<div>鎵╁睍缁剎x浠�</div>" },
+    gridBody: '',
+    gridFooter: "",
+    //寮瑰嚭妗�(淇敼銆佺紪杈戙�佹煡鐪�)header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+    modelHeader: "",
+    modelBody: "",
+    modelFooter: ""
+  },
+  buttons: [], //鎵╁睍鐨勬寜閽�
+  methods: {
+    //浜嬩欢鎵╁睍
+    onInit() {
+      console.log("sys_log")
+      this.setFiexdSearchForm(true);
+    },
+    onInited() {
+      this.height = this.height - 170;
+    }
+  }
+};
+export default extension;
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role.jsx b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role.jsx
new file mode 100644
index 0000000..c112341
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_Role.jsx
@@ -0,0 +1,61 @@
+
+import { h, resolveComponent } from 'vue';
+let extension = {
+  components: {//鍔ㄦ�佹墿鍏呯粍浠舵垨缁勪欢璺緞
+    //琛ㄥ崟header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+    gridHeader: '',
+    gridBody: {
+      render () {
+          return [
+              h(resolveComponent('el-alert'), {
+                  style: { 'margin-bottom': '12px' },
+                  'show-icon': false, type: 'success',
+                  closable: false, title: '鍏充簬TreeTable浣跨敤'
+              }, ' treetable鍚屾牱鍏ㄩ儴浠g爜鑷姩鐢熸垚锛岄〉闈㈢敓鎴愬悗璁剧疆this.rowKe="xxx" tree涓婚敭瀛楁,鍗冲彲瀹屾垚鏍戝舰table閰嶇疆,鍏蜂綋璇存槑瑙丼ys_Role1.js'),
+          ]
+      }
+  },
+
+    gridFooter: '',
+    //寮瑰嚭妗�(淇敼銆佺紪杈戙�佹煡鐪�)header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+    modelHeader: '',
+    modelBody: '',
+    modelFooter: ''
+  },
+  buttons: [],//鎵╁睍鐨勬寜閽�
+  tableAction:"Sys_Role",
+  methods: {//浜嬩欢鎵╁睍
+    onInited () {
+      this.height = this.height - 80;
+       this.editFormOptions.forEach(x => {
+        x.forEach(item => {
+          if (item.field == 'ParentId') {
+            item.title = "涓婄骇瑙掕壊";
+            //璁剧疆浠绘剰鑺傜偣閮借兘閫変腑(榛樿鍙兘閫変腑鏈�鍚庝竴涓妭鐐�)
+            item.changeOnSelect = true;
+          }
+        })
+      })
+    },
+    onInit() {
+      //璁剧疆treetable鐨勫敮涓�鍊煎瓧娈�(杩欎釜瀛楁鐨勫�煎湪琛ㄩ噷闈㈠繀椤绘槸鍞竴鐨�)
+      this.rowKey="Role_Id";
+    },
+    /***鍔犺浇鍚庡彴鏁版嵁瑙丼ys_RoleController.cs鏂囦欢***/
+    loadTreeChildren(tree, treeNode, resolve) { //鍔犺浇瀛愯妭鐐�
+      let url=`api/Sys_Role/getTreeTableChildrenData?roleId=${tree.Role_Id}`;
+      this.http.post(url,{}).then(result=>{
+        resolve(result.rows)
+      })
+    },
+      /***鍔犺浇鍚庡彴鏁版嵁瑙丼ys_RoleController.cs鏂囦欢***/
+    searchBefore(params){//鍒ゆ柇鍔犺浇鏍硅妭鐐规垨瀛愯妭鐐�
+      //娌℃湁鏌ヨ鏉′欢锛岄粯璁ゆ煡璇㈣繑鍥炴墍鏈夋牴鑺傜偣鏁版嵁
+      if (!params.wheres.length) {
+        params.value=1;
+      }
+      return true;
+    }
+  }
+};
+export default extension;
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User.jsx b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User.jsx
new file mode 100644
index 0000000..9d5b4d7
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User.jsx
@@ -0,0 +1,86 @@
+import {  defineAsyncComponent } from "vue";
+let extension = {
+    components: { //鍔ㄦ�佹墿鍏呯粍浠舵垨缁勪欢璺緞
+        //琛ㄥ崟header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+        gridHeader: defineAsyncComponent(() =>
+            import("./Sys_User/Sys_UserGridHeader.vue")),
+        gridBody: '',
+        gridFooter: '',
+        //寮瑰嚭妗�(淇敼銆佺紪杈戙�佹煡鐪�)header銆乧ontent銆乫ooter瀵瑰簲浣嶇疆鎵╁厖鐨勭粍浠�
+        modelHeader: '',
+        modelBody: '',
+        modelFooter: ''
+    },
+    text: "鍙兘鐪嬪埌褰撳墠瑙掕壊涓嬬殑鎵�鏈夊笎鍙�",
+    buttons: [], //鎵╁睍鐨勬寜閽�
+    methods: { //浜嬩欢鎵╁睍
+        onInit() {
+            this.boxOptions.height = 530;
+            this.columns.push({
+                title: '鎿嶄綔',
+                hidden: false,
+                align: "center",
+                fixed: 'right',
+                width: 120,
+                render: (h, { row, column, index }) => {
+                    return h(
+                        "div", { style: { 'font-size': '13px', 'cursor': 'pointer', 'color': '#409eff' } }, [
+                        h(
+                            "a", {
+                            style: { 'margin-right': '15px' },
+                            onClick: (e) => {
+                                e.stopPropagation()
+                                this.$refs.gridHeader.open(row);
+                            }
+                        }, "淇敼瀵嗙爜"
+                        ),
+                        h(
+                            "a", {
+                            style: {},
+                            onClick: (e) => {
+                                e.stopPropagation()
+                                this.edit(row);
+                            }
+                        },
+                            "缂栬緫"
+                        ),
+                    ])
+                }
+            })
+        },
+        onInited() { },
+        addAfter(result) { //鐢ㄦ埛鏂板缓鍚庯紝鏄剧ず闅忔満鐢熸垚鐨勫瘑鐮�
+            if (!result.status) {
+                return true;
+            }
+            //鏄剧ず鏂板缓鐢ㄦ埛鐨勫瘑鐮�
+            //2020.08.28浼樺寲鏂板缓鎴愬悗鎻愮ず鏂瑰紡
+            this.$confirm(result.message, '鏂板缓鐢ㄦ埛鎴愬姛', {
+                confirmButtonText: '纭畾',
+                type: 'success',
+                center: true
+            }).then(() => { })
+
+            this.boxModel = false;
+            this.refresh();
+            return false;
+        },
+        modelOpenAfter() {
+            //鐐瑰嚮寮瑰嚭妗嗗悗锛屽鏋滄槸缂栬緫鐘舵�侊紝绂佹缂栬緫鐢ㄦ埛鍚嶏紝濡傛灉鏂板缓鐘舵�侊紝灏嗙敤鎴峰悕瀛楁璁剧疆涓哄彲缂栬緫
+            let isEDIT = this.currentAction == this.const.EDIT;
+            this.editFormOptions.forEach(item => {
+                item.forEach(x => {
+                    if (x.field == "userName") {
+                        x.disabled=isEDIT;
+                    }
+                })
+                //涓嶆槸鏂板缓锛屾�у埆榛樿鍊艰缃负鐢�
+                if (!isEDIT) {
+                    this.editFormFields.Gender = "0";
+                }
+            })
+        }
+
+    }
+};
+export default extension;
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User/Sys_UserGridHeader.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User/Sys_UserGridHeader.vue
new file mode 100644
index 0000000..1e907b5
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/Sys_User/Sys_UserGridHeader.vue
@@ -0,0 +1,85 @@
+<template>
+  <div>
+    <vol-box
+      v-model="model"
+      :padding="30"
+      title="淇敼瀵嗙爜"
+      :width="500"
+      :height="250"
+    >
+      <el-alert type="success">
+        <h3>
+          <span>甯愬彿锛歿{ row.userName }}</span>
+          <span>鐢ㄦ埛锛歿{ row.userTrueName }}</span>
+        </h3>
+      </el-alert>
+      <div>
+        <el-input
+          placeholder="璇疯緭鍏ュ瘑鐮�"
+          v-model="password"
+          size="large"
+          style="width: 100%; margin-top: 15px"
+        />
+      </div>
+      <template #footer>
+        <el-button
+          type="primary"
+          @click="savePwd()"
+          >淇敼瀵嗙爜</el-button
+        >
+        <el-button
+          @click="model = false"
+          >鍏抽棴</el-button
+        >
+      </template>
+    </vol-box>
+  </div>
+</template>
+<script>
+import { defineComponent, defineAsyncComponent } from "vue";
+export default defineComponent({
+  components: {
+    VolBox: defineAsyncComponent(() => import("@/components/basic/VolBox.vue"))
+  },
+  data() {
+    return {
+      row: {},
+      password: "",
+      model: false,
+    };
+  },
+  methods: {
+    open(row) {
+      this.password = "";
+      this.row = row;
+      this.model = true;
+    },
+    savePwd() {
+      if (!this.password) return this.$Message.error("璇疯緭瀵嗙爜");
+      if (this.password.length < 6)
+        return this.$Message.error("瀵嗙爜闀垮害鑷冲皯6浣�");
+      let url =
+        "/api/Sys_User/modifyUserPwd?password=" +
+        this.password +
+        "&userName=" +
+        this.row.userName;
+      this.http.post(url, {}, true).then((x) => {
+        if (!x.status) {
+          return this.$message.error(x.message);
+        }
+        this.model = false;
+        this.$Message.success(x.message);
+      });
+    },
+  },
+  created() {},
+})
+</script>
+<style lang="less" scoped>
+h3 {
+  font-weight: 500;
+  > span:last-child {
+    margin-left: 30px;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/system/Sys_Department.jsx b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/system/Sys_Department.jsx
new file mode 100644
index 0000000..e544a82
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/system/system/Sys_Department.jsx
@@ -0,0 +1,153 @@
+
+let extension = {
+  components: {
+    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+    gridHeader: '',
+    gridBody: '',
+    gridFooter: '',
+    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+    modelHeader: '',
+    modelBody: '',
+    modelFooter: ''
+  },
+  tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+  buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+  methods: {
+    //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+    onInit() {
+      this.paginationHide = true;
+      this.lazy = false;
+      
+      //鏍戝舰缁撶偣鐨刬d瀛楁
+      this.rowKey = 'DepartmentId';
+      //鐖剁骇id瀛楁
+      this.rowParentField = "ParentId";
+      //鏄惁灞曞紑鎵�鏈夎妭鐐癸紙榛樿浼氳褰曞睍寮�鐨勮妭鐐癸級
+      //this.defaultExpandAll=true;
+      
+      //榛樿灞曞紑鐨勮妭鐐�
+      // this.expandRowKeys=["id"]
+    },
+
+    /***鍔犺浇鍚庡彴鏁版嵁瑙丼ys_RoleController.cs鏂囦欢***/
+    searchBefore(params) {
+      //鍒ゆ柇鍔犺浇鏍硅妭鐐规垨瀛愯妭鐐�
+      //娌℃湁鏌ヨ鏉′欢锛岄粯璁ゆ煡璇㈣繑鍥炴墍鏈夋牴鑺傜偣鏁版嵁
+      // if (!params.wheres.length) {
+      //   params.value = 1;
+      // }
+      return true;
+    },
+    onInited() {
+      let hasUpdate, hasDel, hasAdd;
+      this.buttons.forEach((x) => {
+        if (x.value == 'Update') {
+          x.hidden = true;
+          hasUpdate = true;
+        } else if (x.value == 'Delete') {
+          hasDel = true;
+          x.hidden = true; //闅愯棌鎸夐挳
+        } else if (x.value == 'Add') {
+          x.type = 'primary';
+          hasAdd = true;
+        }
+      });
+      if (!(hasUpdate || hasDel || hasAdd)) {
+        return;
+      }
+      this.columns.push({
+        title: '鎿嶄綔',
+        field: '鎿嶄綔',
+        width: 100,
+        fixed: 'right',
+        align: 'center',
+        render: (h, { row, column, index }) => {
+          return (
+            <div>
+              {hasAdd ? (
+                <el-button
+                  onClick={($e) => {
+                    this.addBtnClick(row);
+                  }}
+                  type="primary"
+                  link
+                  icon="Plus"
+                ></el-button>
+              ) : (
+                ''
+              )}
+              {hasUpdate ? (
+                <el-button
+                  onClick={($e) => {
+                    this.edit(row);
+                  }}
+                  type="success"
+                  link
+                  icon="Edit"
+                ></el-button>
+              ) : (
+                ''
+              )}
+              {hasDel ? (
+                <el-button
+                  link
+                  onClick={($e) => {
+                    this.del(row);
+                  }}
+                  type="danger"
+                  icon="Delete"
+                ></el-button>
+              ) : (
+                ''
+              )}
+            </div>
+          );
+        }
+      });
+    },
+    addBtnClick(row) {
+      //杩欓噷鏄姩鎬乤ddCurrnetRow灞炴�ц褰曞綋鍓嶇偣鍑荤殑琛屾暟鎹�,涓嬮潰modelOpenAfter璁剧疆榛樿鍊�
+      this.addCurrnetRow = row;
+      this.add();
+    },
+    addAfter() {
+      //娣诲姞鍚庡埛鏂板瓧鍏�
+      this.initDicKeys();
+      return true;
+    },
+    updateAfter() {
+      this.initDicKeys();
+      return true;
+    },
+    delAfter(result) {
+      //鏌ヨ鐣岄潰鐨勮〃鍒犻櫎鍚�
+      this.initDicKeys();
+      return true;
+    },
+    modelOpenAfter(row) {
+      //鐐瑰嚮琛屼笂鐨勬坊鍔犳寜閽簨浠�
+      if (this.addCurrnetRow) {
+        //鑾峰彇褰撳墠缁勭粐鏋勬灦鐨勬墍鏈夌埗绾d,鐢ㄤ簬璁剧疆鏂板缓鏃剁埗绾d鐨勯粯璁ゅ��
+
+        //鑾峰彇鏁版嵁鏁版嵁婧�
+        let data = [];
+        this.editFormOptions.forEach((options) => {
+          options.forEach((option) => {
+            if (option.field == 'ParentId') {
+              data = option.orginData;
+            }
+          });
+        });
+        let parentIds = this.base
+          .getTreeAllParent(this.addCurrnetRow.DepartmentId, data)
+          .map((x) => {
+            return x.id;
+          });
+        //璁剧疆缂栬緫琛ㄥ崟涓婄骇缁勭粐鐨勯粯璁ゅ��
+        this.editFormFields.ParentId = parentIds;
+        this.addCurrnetRow = null;
+      }
+    }
+  }
+};
+export default extension;
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/basicinfo/Dt_LocationInfo.jsx b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/basicinfo/Dt_LocationInfo.jsx
new file mode 100644
index 0000000..a9dcf94
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/basicinfo/Dt_LocationInfo.jsx
@@ -0,0 +1,168 @@
+/*****************************************************************************************
+**  Author:jxx 2022
+**  QQ:283591387
+**瀹屾暣鏂囨。瑙侊細http://v2.volcore.xyz/document/api 銆愪唬鐮佺敓鎴愰〉闈iewGrid銆�
+**甯哥敤绀轰緥瑙侊細http://v2.volcore.xyz/document/vueDev
+**鍚庡彴鎿嶄綔瑙侊細http://v2.volcore.xyz/document/netCoreDev
+*****************************************************************************************/
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+import {  defineAsyncComponent } from "vue";
+let extension = {
+  components: {
+    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+    gridHeader: defineAsyncComponent(() =>
+      import("./demo_Product/LocationChange.vue")),
+    gridBody: '',
+    gridFooter: '',
+    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+    modelHeader: '',
+    modelBody: '',
+    modelFooter: ''
+  },
+  tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+  buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+  methods: {
+     //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+    onInit() {  //妗嗘灦鍒濆鍖栭厤缃墠锛�
+        //绀轰緥锛氬湪鎸夐挳鐨勬渶鍓嶉潰娣诲姞涓�涓寜閽�
+        //   this.buttons.unshift({  //涔熷彲浠ョ敤push鎴栬�卻plice鏂规硶鏉ヤ慨鏀筨uttons鏁扮粍
+        //     name: '鎸夐挳', //鎸夐挳鍚嶇О
+        //     icon: 'el-icon-document', //鎸夐挳鍥炬爣vue2鐗堟湰瑙乮view鏂囨。icon锛寁ue3鐗堟湰瑙乪lement ui鏂囨。icon(娉ㄦ剰涓嶆槸element puls鏂囨。)
+        //     type: 'primary', //鎸夐挳鏍峰紡vue2鐗堟湰瑙乮view鏂囨。button锛寁ue3鐗堟湰瑙乪lement ui鏂囨。button
+        //     onClick: function () {
+        //       this.$Message.success('鐐瑰嚮浜嗘寜閽�');
+        //     }
+        //   });
+        var btninitializeLocation = this.buttons.find(x => x.value == "initializeLocation");
+        if (btninitializeLocation != null) {
+            btninitializeLocation.onClick = () => {
+                let rows = this.$refs.table.getSelected();
+                if (rows.length == 0) return this.$error("璇烽�夋嫨鏁版嵁!");
+                this.http
+                    .post("api/LocationInfo/initializeLocation?locationID="+rows[0].id, "","鏁版嵁澶勭悊涓�...")
+                    .then((x) => {
+                        if (x.status) {
+                            this.$Message.success('鎴愬姛.');
+                            this.refresh();
+                        } else {
+                            return this.$error(x.message);
+                        }
+                    });
+            }
+        }
+
+        var btnEnableLocation = this.buttons.find(x => x.value == "EnableLocation");
+            if (btnEnableLocation != null) {
+                btnEnableLocation.onClick = () => {
+                    let rows = this.$refs.table.getSelected();
+                    if (rows.length == 0) return this.$error("璇烽�夋嫨鏁版嵁!");
+                    var ids = rows.map(x => {
+                        return x.locationID;
+                    })
+                    var param = {
+                        DelKeys: ids, //taskNo
+                        Extra: true
+                    }
+                    this.http
+                        .post("api/Dt_LocationInfo/LocationEnable", param, "鏁版嵁澶勭悊涓�...")
+                        .then((x) => {
+                            if (x.status) {
+                                this.$Message.success('鎴愬姛.');
+                                this.refresh();
+                            } else {
+                                return this.$error(x.message);
+                            }
+                        });
+                }
+            }
+
+            var btnDisableLocation = this.buttons.find(x => x.value == "DisableLocation");
+            if (btnDisableLocation != null) {
+                btnDisableLocation.onClick = () => {
+                    let rows = this.$refs.table.getSelected();
+                    if (rows.length == 0) return this.$error("璇烽�夋嫨鏁版嵁!");
+                    var ids = rows.map(x => {
+                        return x.locationID
+                    })
+                    var param = {
+                        DelKeys: ids, //taskNo
+                        Extra: false
+                    }
+                    this.http
+                        .post("api/Dt_LocationInfo/LocationEnable", param, "鏁版嵁澶勭悊涓�...")
+                        .then((x) => {
+                            if (x.status) {
+                                this.$Message.success('鎴愬姛.');
+                                this.refresh();
+                            } else {
+                                return this.$error(x.message);
+                            }
+                        });
+                }
+            }
+        //绀轰緥锛氳缃慨鏀规柊寤恒�佺紪杈戝脊鍑烘瀛楁鏍囩鐨勯暱搴�
+        this.boxOptions.labelWidth = 150;
+
+        //琛ㄦ牸涓婃坊鍔犺嚜瀹氫箟鎸夐挳
+      this.columns.push({
+        title: "鎿嶄綔",
+        field: "鎿嶄綔",
+        width: 150,
+        align: "left", // 'center',
+        render: (h, { row, column, index }) => {
+          return (
+            <div>
+              <el-button
+                onClick={($e) => {
+                  // this.$refs.table.load();
+                  // console.log(this.$refs.table);
+                  this.$refs.gridHeader.customOpen(row);
+                }}
+                type="primary"
+                plain
+                style="height:26px; padding: 10px !important;"
+              >
+                鐘舵�佸彉鍔ㄨ褰�
+              </el-button> 
+            </div>
+          );
+        },
+      });
+    },
+    onInited() {
+      //妗嗘灦鍒濆鍖栭厤缃悗
+      //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+      //this.detailOptions.columns.forEach(column=>{ });
+    },
+    searchBefore(param) {
+      //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+      //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+      return true;
+    },
+    searchAfter(result) {
+      //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+      return true;
+    },
+    addBefore(formData) {
+      //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+      return true;
+    },
+    updateBefore(formData) {
+      //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+      return true;
+    },
+    rowClick({ row, column, event }) {
+      //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+      // this.$refs.table.$refs.table.toggleRowSelection(row); //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+    },
+    modelOpenAfter(row) {
+      //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+      //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+      //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+      //(3)this.editFormFields.瀛楁='xxx';
+      //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+      //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+    }
+  }
+};
+export default extension;
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/basicinfo/demo_Product/LocationChange.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/basicinfo/demo_Product/LocationChange.vue
new file mode 100644
index 0000000..788d4dc
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/basicinfo/demo_Product/LocationChange.vue
@@ -0,0 +1,142 @@
+<template>
+    <vol-box :lazy="true" v-model="model" title="璐т綅鐘舵�佸彉鍔ㄨ褰�" :width="1820" :padding="5">
+        <div class="table-item">
+            <div class="table-item-header">
+                <div class="table-item-border"></div> <span class="table-item-text">璐т綅鐘舵�佸彉鍔ㄨ褰�</span>
+                <div class="table-item-buttons">
+                    <div>
+                        <el-button type="primary" @click="reload" color="#95d475" plain>鍒锋柊</el-button>
+                    </div>
+                </div>
+            </div>
+            <!-- <el-alert type="success" title="" style="line-height: 12px;">
+                鍔熻兘锛氳〃灏惧悎璁°�佹枃浠朵笂浼犮�佺紪杈戙�乤pi鍔犺浇鏁版嵁銆佽嚜鍔ㄥ垎椤点�佽嚜瀹氫箟鎸夐挳銆佽鐐瑰嚮浜嬩欢銆佸姞杞絣oadBefore鑷畾涔夌瓑銆傘�傘��
+            </el-alert> -->
+            <vol-table @loadBefore="loadBefore" @loadAfter="loadAfter" ref="table" :url="url" index
+                :tableData="tableData" :columns="columns" :height="700" :pagination-hide="false" :load-key="true"
+                :column-index="true"></vol-table>
+        </div>
+        <template #footer>
+            <div>
+                <el-button type="primary" size="small" @click="model = false">纭</el-button>
+                <el-button type="default" size="small" @click="model = false">鍏抽棴</el-button>
+            </div>
+        </template>
+    </vol-box>
+</template>
+<script lang="jsx">
+//濡傛灉鏄嚜瀹氫箟vue椤甸潰浣跨敤鐨勯厤缃紝鍦╲ue椤甸潰鐨剆cript鍚庝竴瀹氳鍔犱笂lang="jsx"
+import VolTable from "@/components/basic/VolTable.vue";
+import VolBox from "@/components/basic/VolBox.vue";
+export default {
+    components: {
+        'vol-table': VolTable,
+        'vol-box': VolBox
+    },
+    data() {
+        return {
+            model: false,
+            locationCode: '',
+            //鎺ュ彛杩斿洖鏁版嵁锛屽彲浠ユ鏋剁敓鎴愮殑鎺ュ彛getPageData
+            //濡傛灉鏄嚜瀹氫箟鐨勬帴鍙o紝闇�瑕佽繑鍥炵殑鏁版嵁鏍煎紡锛歿total:100,rows:[]}
+            url: "api/LocationStatusChangeRecord/getPageData",
+            columns: [{ field: 'Id', title: '涓婚敭', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
+            { field: 'locationId', title: '璐т綅ID', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
+            { field: 'locationCode', title: '璐т綅缂栧彿', type: 'string', width: 110, require: true, align: 'left' },
+            { field: 'beforeStatus', title: '鍙樺姩鍓嶈揣浣嶇姸鎬�', type: 'int', width: 120, align: 'left', bind: { key: "LocationState", data: [] } },
+            { field: 'afterStatus', title: '鍙樺姩鍚庤揣浣嶇姸鎬�', type: 'int', width: 110, require: true, align: 'left', sort: true, bind: { key: "LocationState", data: [] } },
+            { field: 'changeType', title: '鍙樺姩绫诲瀷锛堝嚭搴撱�佸叆搴撱�佹墜鍔ㄨ皟鏁达級', type: 'string', width: 70, align: 'left', bind: { key: "StatusChangeType", data: [] } },
+            { field: 'orderId', title: '鍗曟嵁涓婚敭', type: 'string', width: 70, align: 'left', hidden: true },
+            { field: 'orderNo', title: '鍗曟嵁缂栧彿', type: 'string', width: 110, align: 'left', hidden: true },
+            { field: 'orderDetailId', title: '鍗曟嵁鏄庣粏涓婚敭', type: 'string', width: 110, align: 'left', hidden: true },
+            { field: 'taskNum', title: '浠诲姟鍙�', type: 'string', width: 110, align: 'left' },
+            { field: 'remark', title: '澶囨敞', type: 'int', width: 110, align: 'left', hidden: true },
+            { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, align: 'left', hidden: true },
+            { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+            { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100, align: 'left', hidden: true },
+            { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150, hidden: true, align: 'left', sort: true }
+            ]
+        }
+    },
+    methods: {
+        //鑷畾涔夋寜閽�
+        customOpen(row) {
+            this.locationCode = row.locationCode;
+            this.locationId = row.id;
+            this.model = true;
+            this.$nextTick(() => {
+                this.$refs.table.load(null, true);
+            })
+        },
+
+        loadBefore(params, callBack) {//璋冪敤鍚庡彴鎺ュ彛鍓嶅鐞�
+            //璁剧疆鏌ヨ鏉′欢鍙傛暟
+            params.wheres.push({
+                name: "locationId",
+                value: this.locationId,
+                displayType: "text"//妯$硦鏌ヨ
+            },{
+                name: "locationCode",
+                value: this.locationCode,
+                displayType: "text"//妯$硦鏌ヨ
+            })
+
+            //涔熷彲浠ョ粰value璁剧疆鍊硷紝鍚庡彴鑷繁瑙f瀽
+            // params.value=this.OrderNo
+
+            //鏌ヨ鍓嶆柟娉曚篃鍙互鍔ㄦ�佽缃畊rl鍙傛暟
+            //params.url='api/xxx/xx?鍙傛暟1='+this.xx鍙傛暟
+
+            callBack(true)//false涓嶄細璋冪敤鍚庡彴鎺ュ彛
+        },
+        //鏌ヨ鍚庢柟娉�
+        loadAfter(rows, callBack, result) {
+            //濡傛灉鏈夊悎璁★細鍚庡彴杩斿洖鍚堣鏍煎紡
+            // var data = new {
+            //     rows: [],//杩斿洖鐨勮鏁版嵁
+            //     total: 200,//杩斿洖鐨勬�昏鏁�
+            //     //鍚堣
+            //     summary: { TotalPrice: 100, TotalQty: 200 }
+            // }
+            // callBack(true)
+        },
+        reload() {
+            this.$refs.table.load(null, true);
+            this.$message.success('鏌ヨ鎴愬姛')
+        }
+    }
+}
+</script>
+<style lang="less" scoped>
+.table-item-header {
+    display: flex;
+    align-items: center;
+    padding: 6px;
+
+    .table-item-border {
+        height: 15px;
+        background: rgb(33, 150, 243);
+        width: 5px;
+        border-radius: 10px;
+        position: relative;
+        margin-right: 5px;
+    }
+
+    .table-item-text {
+        font-weight: bolder;
+    }
+
+    .table-item-buttons {
+        flex: 1;
+        text-align: right;
+    }
+
+    .small-text {
+        font-size: 12px;
+        color: #2196F3;
+        margin-left: 10px;
+        position: relative;
+        top: 2px;
+    }
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/invoices/extension/Dt_InboundOrderDetail.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/invoices/extension/Dt_InboundOrderDetail.vue
new file mode 100644
index 0000000..422a707
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/invoices/extension/Dt_InboundOrderDetail.vue
@@ -0,0 +1,102 @@
+<template>
+    <div>
+        <vol-box v-model="showDetialBox" :lazy="true" width="1200px" :padding="15" title="鍏ュ簱鍗曟嵁鏄庣粏">
+                <div style="height: 600px;width:100%">
+                <el-table :data="tableData" border style="width: 100% ;height: 120;" :row-class-name="tableRowClassName">
+                <el-table-column type="index" width="50" label="#"> </el-table-column>
+                <el-table-column prop="inboundNo" label="鍗曟嵁缂栧彿" width="120" ></el-table-column>
+                <el-table-column prop="batchNo" label="鎵规鍙�" width="120" ></el-table-column>
+                <el-table-column prop="inboundType" label="鍗曟嵁绫诲瀷" width="120" ></el-table-column>
+                <el-table-column prop="materialNo" label="鐗╂枡缂栧彿" width="120" ></el-table-column>
+                <el-table-column prop="materialName" label="鐗╂枡鍚嶇О" width="120" ></el-table-column>
+                <el-table-column prop="preInboundQuantity" label="棰勮鍏ュ簱鏁伴噺" width="120" ></el-table-column>
+                <el-table-column prop="actualInboundQuantity" label="瀹為檯鍏ュ簱鏁伴噺" width="120" ></el-table-column>
+                <el-table-column prop="inboundState" label="鍗曟嵁鏄庣粏鐘舵��" width="120" ></el-table-column>
+                <el-table-column prop="unit" label="鍏ュ簱鍗曚綅" width="120" ></el-table-column>
+            </el-table>
+            </div>
+        </vol-box>
+    </div>
+</template>
+
+<script>
+import VolBox from "@/components/basic/VolBox.vue";
+export default {
+    components: { VolBox },
+    data() {
+        return {
+            showDetialBox: false,
+            row: {},
+            tableData: [],
+        };
+    },
+    methods: {
+        open(row) {
+            this.row = row;
+            this.showDetialBox = true;
+            this.getDetailData();
+        },
+        getDetailData() {
+            this.http
+                .post(
+                    "/api/Dt_InboundOrderDetail/GetDetail?InboundOrderID=" + this.row.orderId,
+                    {},
+                    true
+                )
+                .then((x) => {
+                    if (!x.status) return this.$message.error(x.message);
+                    this.tableData = x.data;
+                    console.log(this.tableData);
+                });
+        },
+        tableRowClassName({ row, rowIndex }) {
+            if (row.isNormal) {
+                
+            } else if (row.isManual) {
+                // return "warning-row";
+                return "success-row";
+            }
+            
+        },
+    },
+
+
+    created() { },
+};
+</script>
+
+<style scoped>
+.el-col {
+    border-radius: 4px;
+}
+
+.grid-content {
+    border-radius: 4px;
+    min-height: 36px;
+}
+
+.content-text {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+.right-text {
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+}
+</style>
+<style>
+.el-table .warning-row {
+    background: #e6a23c;
+}
+
+.el-table .success-row {
+    background: #f0f9eb;
+}
+
+.el-table .error-row {
+    background: #f56c6c;
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/stock/Dt_BillGroupStock.jsx b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/stock/Dt_BillGroupStock.jsx
new file mode 100644
index 0000000..8570eb5
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/stock/Dt_BillGroupStock.jsx
@@ -0,0 +1,190 @@
+/*****************************************************************************************
+ **  Author:jxx 2022
+ **  QQ:283591387
+ **瀹屾暣鏂囨。瑙侊細http://v2.volcore.xyz/document/api 銆愪唬鐮佺敓鎴愰〉闈iewGrid銆�
+ **甯哥敤绀轰緥瑙侊細http://v2.volcore.xyz/document/vueDev
+ **鍚庡彴鎿嶄綔瑙侊細http://v2.volcore.xyz/document/netCoreDev
+ *****************************************************************************************/
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+
+// import gridHeader from "./demo_Product/Dt_BillGroupStockDetail.vue";
+import gridBody from "./extend/SupplementationData.vue"
+let extension = {
+  components: {
+    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+    gridHeader: '',
+    gridBody: gridBody,
+    gridFooter: '',
+    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+    modelHeader: '',
+    modelBody: '',
+    modelFooter: ''
+  },
+  tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+  buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+  methods: {
+    //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+    onInit() {
+      //妗嗘灦鍒濆鍖栭厤缃墠锛�
+      let OutBoundBtn = this.buttons.find((x) => x.value == 'OutBound')
+      if (OutBoundBtn) {
+        OutBoundBtn.onClick = function () {
+          // this.$Message.success('鐐瑰嚮浜嗘寜閽�')
+          let row = this.$refs.table.getSelected() //鑾峰彇閫変腑鐨勮
+          if (row <= 0) {
+            //濡傛灉娌℃湁閫変腑琛�
+            this.$Message.error('璇烽�夋嫨涓�琛屾暟鎹�')
+            return
+          }
+          let locationCode = row[0].locationCode
+          let palletCode = row[0].palletCode
+          this.http
+            .get(
+              `/api/Task/CreateAndSendOutboundTask?locationCode=${locationCode}&palletCode=${palletCode}`,
+              {},
+              '姝e湪鍒涘缓浠诲姟'
+            )
+            .then((res) => {
+              //绀轰緥锛氳皟鐢ㄥ悗鍙版帴鍙�
+              if (res.status) {
+                this.$Message.success('鍒涘缓浠诲姟鎴愬姛')
+                this.refresh() //鍒锋柊琛ㄦ牸
+              } else {
+                this.$Message.error(res.message) //閿欒鎻愮ず
+              }
+            })
+        }
+      }
+
+      var btnSupplementationData = this.buttons.find(x => x.value == "SupplementationData");
+            if (btnSupplementationData != null) {
+                btnSupplementationData.onClick = () => {
+                    let rows = this.$refs.table.getSelected();
+                        if (rows.length == 0) {
+                            return this.$error("璇烽�夋嫨鏁版嵁!");
+                        } else if (rows.length > 1) {
+                            return this.$error("鍙兘閫夋嫨鍗曟潯鏁版嵁");
+                        }
+                        this.$refs.gridBody.open(rows[0].palletCode);
+                        this.refresh();
+                    }
+                
+                }
+      //绀轰緥锛氬湪鎸夐挳鐨勬渶鍓嶉潰娣诲姞涓�涓寜閽�
+      // this.buttons.unshift({
+      //   //涔熷彲浠ョ敤push鎴栬�卻plice鏂规硶鏉ヤ慨鏀筨uttons鏁扮粍
+      //   name: '鐩存帴鍑哄簱', //鎸夐挳鍚嶇О
+      //   icon: 'el-icon-document', //鎸夐挳鍥炬爣vue2鐗堟湰瑙乮view鏂囨。icon锛寁ue3鐗堟湰瑙乪lement ui鏂囨。icon(娉ㄦ剰涓嶆槸element puls鏂囨。)
+      //   type: 'primary', //鎸夐挳鏍峰紡vue2鐗堟湰瑙乮view鏂囨。button锛寁ue3鐗堟湰瑙乪lement ui鏂囨。button
+      //   onClick: function () {
+      //     this.$Message.success('鐐瑰嚮浜嗘寜閽�')
+      //     let row = this.$refs.table.getSelected() //鑾峰彇閫変腑鐨勮
+      //     if (row <= 0) {
+      //       //濡傛灉娌℃湁閫変腑琛�
+      //       this.$Message.error('璇烽�夋嫨涓�琛屾暟鎹�')
+      //       return
+      //     }
+      //     let locationCode = row[0].locationCode
+      //     let palletCode = row[0].palletCode
+      //     this.http.get(`/api/Task/CreateAndSendOutboundTask?locationCode=${locationCode}&palletCode=${palletCode}`, {}, "姝e湪鍒涘缓浠诲姟").then((res) => {
+      //       //绀轰緥锛氳皟鐢ㄥ悗鍙版帴鍙�
+      //       if (res.status) {
+      //         this.$Message.success('鍒涘缓浠诲姟鎴愬姛')
+      //       } else {
+      //         this.$Message.error(res.message) //閿欒鎻愮ず
+      //       }
+      //     })
+      //   }
+      // })
+
+      //绀轰緥锛氳缃慨鏀规柊寤恒�佺紪杈戝脊鍑烘瀛楁鏍囩鐨勯暱搴�
+      this.boxOptions.labelWidth = 150
+
+      // this.columns.push({
+      //   title: "鎿嶄綔",
+      //   field: "鎿嶄綔",
+      //   width: 150,
+      //   align: "left", // 'center',
+      //   render: (h, { row, column, index }) => {
+      //     return (
+      //       <div>
+      //         <el-button
+      //           onClick={($e) => {
+      //             this.$refs.gridHeader.openModel1(row);
+      //           }}
+      //           type="primary"
+      //           plain
+      //           style="height:26px; padding: 10px !important;"
+      //         >
+      //           鏌ョ湅搴撳瓨鏄庣粏
+      //         </el-button>
+      //       </div>
+      //     );
+      //   },
+      // });
+
+      this.columns.forEach((column) => {
+        //淇敼棰滆壊
+        if (column.field == 'roadwayNo') {
+          column.formatter = (row) => {
+            // return '<span style="color: #2d8cf0;">' + row?.locationInfo?.roadwayNo + '</span>'
+            return  row?.locationInfo?.roadwayNo 
+          }
+        }
+        //鏍煎紡鍖栨棩鏈�
+        // 妫�鏌ュ綋鍓嶅垪鐨勫瓧娈垫槸鍚︿负 'locationStatus'
+        if (column.field == 'locationStatus') {
+          // 浣跨敤瀵硅薄瀛楅潰閲忔潵鏄犲皠 'locationStatus' 鐨勫�煎拰瀵瑰簲鐨勬枃鏈�
+          const statusMap = {
+            '-1': '鍏ㄩ儴',
+            '0': '绌洪棽',
+            '1': '閿佸畾',
+            '2': '鏈夎揣',
+            '3': '鏈夎揣绂佺敤',
+            '4': '鏃犺揣绂佺敤'
+          };
+          // 瀹氫箟涓�涓牸寮忓寲鍑芥暟锛屾牴鎹� 'locationStatus' 鐨勫�艰繑鍥炵浉搴旂殑鏂囨湰
+          column.formatter = (row) => {
+            // 浣跨敤 statusMap 瀵硅薄鏉ヨ幏鍙栧搴旂殑鏂囨湰锛屽鏋滄病鏈夊尮閰嶅垯杩斿洖 '鏈煡鐘舵��'
+            return statusMap[row?.locationInfo?.locationStatus] || '鏈煡鐘舵��';
+          }
+        }
+      })
+    },
+    onInited() {
+      //妗嗘灦鍒濆鍖栭厤缃悗
+      //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+      //this.detailOptions.columns.forEach(column=>{ });
+    },
+    searchBefore(param) {
+      //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+      //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+      return true
+    },
+    searchAfter(result) {
+      //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+      return true
+    },
+    addBefore(formData) {
+      //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+      return true
+    },
+    updateBefore(formData) {
+      //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+      return true
+    },
+    rowClick({ row, column, event }) {
+      //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+      // this.$refs.table.$refs.table.toggleRowSelection(row) //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+    },
+    modelOpenAfter(row) {
+      //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+      //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+      //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+      //(3)this.editFormFields.瀛楁='xxx';
+      //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+      //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+    }
+  }
+}
+export default extension
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/stock/demo_Product/Dt_BillGroupStockDetail.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/stock/demo_Product/Dt_BillGroupStockDetail.vue
new file mode 100644
index 0000000..c804118
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/stock/demo_Product/Dt_BillGroupStockDetail.vue
@@ -0,0 +1,106 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/stock/Dt_BillGroupStockDetail.js姝ゅ缂栧啓
+ -->
+<template>
+    <vol-box :lazy="true" v-model="model1" title="搴撳瓨鏄庣粏淇℃伅" :width="1820" :padding="5" :onModelClose="onModelClose">
+        <view-grid ref="grid" :columns="columns" :searchFormFields="searchFormFields" :editFormFields="editFormFields"
+            :editFormOptions="editFormOptions" :searchFormOptions="searchFormOptions" :table="table" :extend="extend">
+        </view-grid>
+        <template #footer>
+            <div>
+                <el-button type="primary" size="small" @click="model1 = false">纭</el-button>
+                <el-button type="default" size="small" @click="model1 = false">鍏抽棴</el-button>
+            </div>
+        </template>
+    </vol-box>
+</template>
+<script>
+import extend from "@/extension/widesea_wms/stock/Dt_BillGroupStockDetail.js";
+import VolBox from '@/components/basic/VolBox.vue';
+import { ref, defineComponent, getCurrentInstance } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'id',
+            footer: "Foots",
+            cnName: '搴撳瓨鏄庣粏淇℃伅',
+            name: 'stock/Dt_BillGroupStockDetail',
+            url: "/StockInfoDetail/",
+            sortName: "id"
+        });
+        const editFormFields = ref({
+            "palletCode": "",
+            "materialNo": "",
+        });
+        const editFormOptions = ref([
+            [
+                { "title": "鎵樼洏鍙�", "field": "palletCode", type: "text" },
+                { "title": "鐗╂枡缂栧彿", "field": "materialNo", type: "text" },
+            ]
+        ]);
+        const searchFormFields = ref({
+            "palletCode": "",
+            "materialNo": "",
+            "stockId": 0
+        });
+        const searchFormOptions = ref([
+            [
+                { "title": "鎵樼洏鍙�", "field": "palletCode", type: "text" },
+                { "title": "鐗╂枡缂栧彿", "field": "materialNo", type: "text" },
+            ]
+        ]);
+        const columns = ref([{ field: 'id', title: '搴撳瓨鏄庣粏ID', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
+        { field: 'stockId', title: '澶栧仴', type: 'int', width: 110, hidden: true, align: 'left', sort: true },
+        { field: 'orderNo', title: '鍗曟嵁缂栧彿', type: 'string', width: 110, align: 'left' },
+        { field: 'batchNo', title: '鎵规鍙�', type: 'string', width: 110, align: 'left' },
+        { field: 'materielCode', title: '鐗╂枡缂栧彿', type: 'string', width: 110, align: 'left' },
+        { field: 'materielName', title: '鐗╂枡鍚嶇О', type: 'string', width: 110, align: 'left' },
+        { field: 'serialNumber', title: '搴忓垪鍙�', type: 'string', width: 120, align: 'left' },
+        { field: 'stockQuantity', title: '搴撳瓨鏁伴噺', type: 'string', width: 120, align: 'left' },
+        { field: 'outboundQuantity', title: '鍑哄簱鏁伴噺', type: 'string', width: 120, align: 'left' },
+        { field: 'status', title: '搴撳瓨鐘舵��', type: 'string', width: 110, align: 'left' },
+        { field: 'remark', title: '澶囨敞', type: 'decimal', width: 110, align: 'left' },
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100, align: 'left' },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true }]);
+        const detail = ref({
+            cnName: "#detailCnName",
+            table: "#detailTable",
+            columns: [],
+            sortName: "",
+            key: ""
+        });
+
+        const model1 = ref(false);
+        const palletCode = ref("");
+
+        const openModel1 = (row) => {
+            palletCode.value = row.palletCode;
+            searchFormFields.value.stockId = row.id;
+            model1.value = true;
+        }
+
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+            model1,
+            palletCode,
+            VolBox,
+            openModel1
+        };
+    },
+    components: {
+        'vol-box': VolBox
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/stock/extend/SupplementationData.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/stock/extend/SupplementationData.vue
new file mode 100644
index 0000000..36021ba
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/stock/extend/SupplementationData.vue
@@ -0,0 +1,104 @@
+<template>
+  <vol-box v-model="show" title="琛ュ綍鏁版嵁" :width="800" :height="600">
+    <template #content>
+      <el-form ref="form" :model="form" label-width="90px">
+        <el-form-item label="鎵樼洏鍙�">
+          <el-input type="text" v-model="this.form.palletCode" readonly></el-input>
+        </el-form-item>
+        <el-form-item label="鍑哄簱OR鍏ュ簱" prop="OutIn">
+          <el-select v-model="OutIn" placeholder="璇烽�夋嫨鍑哄簱Or鍏ュ簱">
+            <el-option label="鍑哄簱" value="Out" />
+            <el-option label="鍏ュ簱" value="In" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鍖哄煙" prop="areaID">
+          <el-select v-model="form.areaID" placeholder="璇烽�夋嫨鍖哄煙">
+            <el-option label="闄堝寲" value="1" />
+            <el-option label="闈欑疆" value="2" />
+            <el-option label="鍒嗗" value="3" />
+            <el-option label="楂樻俯" value="4" />
+            <el-option label="甯告俯1" value="5" />
+            <el-option label="甯告俯2" value="6" />
+            <el-option label="甯告俯3" value="7" />
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </template>
+    <template #footer>
+      <div>
+        <el-button type="danger" size="small" plain @click="submit">
+          <i class="el-icon-check">纭</i>
+        </el-button>
+        <el-button size="small" type="primary" plain @click="() => {
+            this.show = false;
+          }
+          ">
+          <i class="el-icon-close">鍏抽棴</i>
+        </el-button>
+      </div>
+    </template>
+  </vol-box>
+</template>
+
+<script>
+import VolBox from "@/components/basic/VolBox.vue";
+export default {
+  components: {
+    "vol-box": VolBox,
+  },
+  data() {
+    return {
+      OutIn:"",
+      form:{
+        areaID:"",
+        palletCode:""
+      },
+      show: false,
+    };
+  },
+  methods: {
+    open(palletCode) {
+      this.show = true;
+      this.form.palletCode=palletCode;
+    },
+    submit() {
+      this.$emit("parentCall", ($vue) => {
+        if (
+          !this.OutIn ||
+          !this.form.areaID ||
+          !this.form.palletCode||
+          this.OutIn==""||
+          this.form.areaID==""||
+          this.form.palletCode==""
+        ) {
+          this.$message.error("鍙傛暟閿欒");
+          return;
+        }
+        if(this.OutIn=="Out"){
+          this.http.post("api/ProcessApply/StockOutDataBack", this.form, "").then((x) => {
+          if (!x.status) {
+            this.$message.error(x.message);
+          } else {
+            this.$Message.success("鎴愬姛");
+            this.show = false;
+            $vue.refresh();
+          }
+        });
+        }else if(this.OutIn=="In"){
+          this.http.post("api/ProcessApply/StockInDataBack", this.form, "").then((x) => {
+          if (!x.status) {
+            this.$message.error(x.message);
+          } else {
+            this.$Message.success("鎴愬姛");
+            this.show = false;
+            $vue.refresh();
+          }
+        });
+        }
+        
+      });
+    },
+  },
+
+};
+</script>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/taskinfo/Dt_Task.jsx b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/taskinfo/Dt_Task.jsx
new file mode 100644
index 0000000..2f9e4b4
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/taskinfo/Dt_Task.jsx
@@ -0,0 +1,150 @@
+/*****************************************************************************************
+ **  Author:jxx 2022
+ **  QQ:283591387
+ **瀹屾暣鏂囨。瑙侊細http://v2.volcore.xyz/document/api 銆愪唬鐮佺敓鎴愰〉闈iewGrid銆�
+ **甯哥敤绀轰緥瑙侊細http://v2.volcore.xyz/document/vueDev
+ **鍚庡彴鎿嶄綔瑙侊細http://v2.volcore.xyz/document/netCoreDev
+ *****************************************************************************************/
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+import gridHeader from './demo_Product/Dt_TaskExecuteDetail.vue'
+let extension = {
+  components: {
+    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+    gridHeader: gridHeader,
+    gridBody: '',
+    gridFooter: '',
+    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+    modelHeader: '',
+    modelBody: '',
+    modelFooter: ''
+  },
+  tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+  buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+  methods: {
+    //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+    onInit() {
+      //妗嗘灦鍒濆鍖栭厤缃墠锛�
+      let TaskHandCompleteBtn=this.buttons.find(x=>x.value=='TaskHandComplete');
+      if(TaskHandCompleteBtn){
+        TaskHandCompleteBtn.onClick=function(){
+          let row = this.$refs.table.getSelected() //鑾峰彇閫変腑鐨勮
+          if (row <= 0) {
+            //濡傛灉娌℃湁閫変腑琛�
+            this.$Message.error('璇烽�夋嫨涓�琛屾暟鎹�')
+            return
+          }
+          let taskNum = row[0].taskNum
+          this.http.get(`/api/Task/CompleteTaskAsync?taskNum=${taskNum}`, {}, "姝e湪瀹屾垚浠诲姟").then((res) => {
+            //绀轰緥锛氳皟鐢ㄥ悗鍙版帴鍙�
+            if (res.status) {
+              this.$Message.success('浠诲姟瀹屾垚');
+              this.refresh();
+            } else {
+              this.$Message.error(res.message) //閿欒鎻愮ず
+              this.refresh();
+            }
+          })
+        }
+      }
+      //绀轰緥锛氬湪鎸夐挳鐨勬渶鍓嶉潰娣诲姞涓�涓寜閽�
+      // this.buttons.unshift({
+      //   //涔熷彲浠ョ敤push鎴栬�卻plice鏂规硶鏉ヤ慨鏀筨uttons鏁扮粍
+      //   name: '浠诲姟瀹屾垚', //鎸夐挳鍚嶇О
+      //   icon: 'el-icon-document', //鎸夐挳鍥炬爣vue2鐗堟湰瑙乮view鏂囨。icon锛寁ue3鐗堟湰瑙乪lement ui鏂囨。icon(娉ㄦ剰涓嶆槸element puls鏂囨。)
+      //   type: 'primary', //鎸夐挳鏍峰紡vue2鐗堟湰瑙乮view鏂囨。button锛寁ue3鐗堟湰瑙乪lement ui鏂囨。button
+      //   onClick: function () {
+      //     // this.$Message.success('鐐瑰嚮浜嗘寜閽�');
+      //     let row = this.$refs.table.getSelected() //鑾峰彇閫変腑鐨勮
+      //     if (row <= 0) {
+      //       //濡傛灉娌℃湁閫変腑琛�
+      //       this.$Message.error('璇烽�夋嫨涓�琛屾暟鎹�')
+      //       return
+      //     }
+      //     let taskNum = row[0].taskNum
+      //     this.http.get(`/api/Task/CompleteTaskAsync?taskNum=${taskNum}`, {}, "姝e湪瀹屾垚浠诲姟").then((res) => {
+      //       //绀轰緥锛氳皟鐢ㄥ悗鍙版帴鍙�
+      //       if (res.status) {
+      //         this.$Message.success('浠诲姟瀹屾垚')
+      //       } else {
+      //         this.$Message.error(res.message) //閿欒鎻愮ず
+      //       }
+      //     })
+      //   }
+      // })
+
+      //绀轰緥锛氳缃慨鏀规柊寤恒�佺紪杈戝脊鍑烘瀛楁鏍囩鐨勯暱搴�
+      this.boxOptions.labelWidth = 150
+
+      //鏄剧ず鎻愮ず
+      this.columns.forEach((col) => {
+        col.showOverflowTooltip = true
+      })
+
+      //绀轰緥锛氳嚜瀹氫箟琛ㄦ牸鍒�
+      //琛ㄦ牸涓婃坊鍔犺嚜瀹氫箟鎸夐挳
+      this.columns.push({
+        title: '鎿嶄綔',
+        field: '鎿嶄綔',
+        width: 150,
+        align: 'left', // 'center',
+        render: (h, { row, column, index }) => {
+          return (
+            <div>
+              <el-button
+                onClick={($e) => {
+                  // this.$refs.table.load();
+                  // console.log(this.$refs.table);
+                  this.$refs.gridHeader.openModel1(row)
+                }}
+                type="primary"
+                plain
+                style="height:26px; padding: 10px !important;"
+              >
+                鏌ョ湅鎵ц淇℃伅
+              </el-button>
+            </div>
+          )
+        }
+      })
+    },
+    btn1Click(row, column, index, $e) {
+      $e.stopPropagation()
+      this.$refs.gridHeader.openModel1(row)
+    },
+    onInited() {
+      //妗嗘灦鍒濆鍖栭厤缃悗
+      //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+      //this.detailOptions.columns.forEach(column=>{ });
+    },
+    searchBefore(param) {
+      //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+      //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+      return true
+    },
+    searchAfter(result) {
+      //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+      return true
+    },
+    addBefore(formData) {
+      //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+      return true
+    },
+    updateBefore(formData) {
+      //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+      return true
+    },
+    rowClick({ row, column, event }) {
+      //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+      // this.$refs.table.$refs.table.toggleRowSelection(row) //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+    },
+    modelOpenAfter(row) {
+      //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+      //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+      //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+      //(3)this.editFormFields.瀛楁='xxx';
+      //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+      //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+    }
+  }
+}
+export default extension
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/taskinfo/Dt_Task_Hty.jsx b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/taskinfo/Dt_Task_Hty.jsx
new file mode 100644
index 0000000..bffd61f
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/taskinfo/Dt_Task_Hty.jsx
@@ -0,0 +1,148 @@
+/*****************************************************************************************
+ **  Author:jxx 2022
+ **  QQ:283591387
+ **瀹屾暣鏂囨。瑙侊細http://v2.volcore.xyz/document/api 銆愪唬鐮佺敓鎴愰〉闈iewGrid銆�
+ **甯哥敤绀轰緥瑙侊細http://v2.volcore.xyz/document/vueDev
+ **鍚庡彴鎿嶄綔瑙侊細http://v2.volcore.xyz/document/netCoreDev
+ *****************************************************************************************/
+//姝s鏂囦欢鏄敤鏉ヨ嚜瀹氫箟鎵╁睍涓氬姟浠g爜锛屽彲浠ユ墿灞曚竴浜涜嚜瀹氫箟椤甸潰鎴栬�呴噸鏂伴厤缃敓鎴愮殑浠g爜
+import gridHeader from './demo_Product/Dt_TaskExecuteDetail.vue'
+let extension = {
+  components: {
+    //鏌ヨ鐣岄潰鎵╁睍缁勪欢
+    gridHeader: gridHeader,
+    gridBody: '',
+    gridFooter: '',
+    //鏂板缓銆佺紪杈戝脊鍑烘鎵╁睍缁勪欢
+    modelHeader: '',
+    modelBody: '',
+    modelFooter: ''
+  },
+  tableAction: '', //鎸囧畾鏌愬紶琛ㄧ殑鏉冮檺(杩欓噷濉啓琛ㄥ悕,榛樿涓嶇敤濉啓)
+  buttons: { view: [], box: [], detail: [] }, //鎵╁睍鐨勬寜閽�
+  methods: {
+    //涓嬮潰杩欎簺鏂规硶鍙互淇濈暀涔熷彲浠ュ垹闄�
+    onInit() {
+      //妗嗘灦鍒濆鍖栭厤缃墠锛�
+      // let TaskHandCompleteBtn=this.buttons.find(x=>x.value=='TaskHandComplete');
+      // if(TaskHandCompleteBtn){
+      //   TaskHandCompleteBtn.onClick=function(){
+      //     let row = this.$refs.table.getSelected() //鑾峰彇閫変腑鐨勮
+      //     if (row <= 0) {
+      //       //濡傛灉娌℃湁閫変腑琛�
+      //       this.$Message.error('璇烽�夋嫨涓�琛屾暟鎹�')
+      //       return
+      //     }
+      //     let taskNum = row[0].taskNum
+      //     this.http.get(`/api/Task/CompleteTaskAsync?taskNum=${taskNum}`, {}, "姝e湪瀹屾垚浠诲姟").then((res) => {
+      //       //绀轰緥锛氳皟鐢ㄥ悗鍙版帴鍙�
+      //       if (res.status) {
+      //         this.$Message.success('浠诲姟瀹屾垚')
+      //       } else {
+      //         this.$Message.error(res.message) //閿欒鎻愮ず
+      //       }
+      //     })
+      //   }
+      // }
+      //绀轰緥锛氬湪鎸夐挳鐨勬渶鍓嶉潰娣诲姞涓�涓寜閽�
+      // this.buttons.unshift({
+      //   //涔熷彲浠ョ敤push鎴栬�卻plice鏂规硶鏉ヤ慨鏀筨uttons鏁扮粍
+      //   name: '浠诲姟瀹屾垚', //鎸夐挳鍚嶇О
+      //   icon: 'el-icon-document', //鎸夐挳鍥炬爣vue2鐗堟湰瑙乮view鏂囨。icon锛寁ue3鐗堟湰瑙乪lement ui鏂囨。icon(娉ㄦ剰涓嶆槸element puls鏂囨。)
+      //   type: 'primary', //鎸夐挳鏍峰紡vue2鐗堟湰瑙乮view鏂囨。button锛寁ue3鐗堟湰瑙乪lement ui鏂囨。button
+      //   onClick: function () {
+      //     // this.$Message.success('鐐瑰嚮浜嗘寜閽�');
+      //     let row = this.$refs.table.getSelected() //鑾峰彇閫変腑鐨勮
+      //     if (row <= 0) {
+      //       //濡傛灉娌℃湁閫変腑琛�
+      //       this.$Message.error('璇烽�夋嫨涓�琛屾暟鎹�')
+      //       return
+      //     }
+      //     let taskNum = row[0].taskNum
+      //     this.http.get(`/api/Task/CompleteTaskAsync?taskNum=${taskNum}`, {}, "姝e湪瀹屾垚浠诲姟").then((res) => {
+      //       //绀轰緥锛氳皟鐢ㄥ悗鍙版帴鍙�
+      //       if (res.status) {
+      //         this.$Message.success('浠诲姟瀹屾垚')
+      //       } else {
+      //         this.$Message.error(res.message) //閿欒鎻愮ず
+      //       }
+      //     })
+      //   }
+      // })
+
+      //绀轰緥锛氳缃慨鏀规柊寤恒�佺紪杈戝脊鍑烘瀛楁鏍囩鐨勯暱搴�
+      this.boxOptions.labelWidth = 150
+
+      //鏄剧ず鎻愮ず
+      this.columns.forEach((col) => {
+        col.showOverflowTooltip = true
+      })
+
+      //绀轰緥锛氳嚜瀹氫箟琛ㄦ牸鍒�
+      //琛ㄦ牸涓婃坊鍔犺嚜瀹氫箟鎸夐挳
+      this.columns.push({
+        title: '鎿嶄綔',
+        field: '鎿嶄綔',
+        width: 150,
+        align: 'left', // 'center',
+        render: (h, { row, column, index }) => {
+          return (
+            <div>
+              <el-button
+                onClick={($e) => {
+                  // this.$refs.table.load();
+                  // console.log(this.$refs.table);
+                  this.$refs.gridHeader.openModel1(row)
+                }}
+                type="primary"
+                plain
+                style="height:26px; padding: 10px !important;"
+              >
+                鏌ョ湅鎵ц淇℃伅
+              </el-button>
+            </div>
+          )
+        }
+      })
+    },
+    btn1Click(row, column, index, $e) {
+      $e.stopPropagation()
+      this.$refs.gridHeader.openModel1(row)
+    },
+    onInited() {
+      //妗嗘灦鍒濆鍖栭厤缃悗
+      //濡傛灉瑕侀厤缃槑缁嗚〃,鍦ㄦ鏂规硶鎿嶄綔
+      //this.detailOptions.columns.forEach(column=>{ });
+    },
+    searchBefore(param) {
+      //鐣岄潰鏌ヨ鍓�,鍙互缁檖aram.wheres娣诲姞鏌ヨ鍙傛暟
+      //杩斿洖false锛屽垯涓嶄細鎵ц鏌ヨ
+      return true
+    },
+    searchAfter(result) {
+      //鏌ヨ鍚庯紝result杩斿洖鐨勬煡璇㈡暟鎹�,鍙互鍦ㄦ樉绀哄埌琛ㄦ牸鍓嶅鐞嗚〃鏍肩殑鍊�
+      return true
+    },
+    addBefore(formData) {
+      //鏂板缓淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛紝鍙互缁欑粰琛ㄥ崟璁剧疆鍊硷紝鑷繁杈撳嚭鐪媐ormData鐨勫��
+      return true
+    },
+    updateBefore(formData) {
+      //缂栬緫淇濆瓨鍓峟ormData涓哄璞★紝鍖呮嫭鏄庣粏琛ㄣ�佸垹闄よ鐨処d
+      return true
+    },
+    rowClick({ row, column, event }) {
+      //鏌ヨ鐣岄潰鐐瑰嚮琛屼簨浠�
+      // this.$refs.table.$refs.table.toggleRowSelection(row) //鍗曞嚮琛屾椂閫変腑褰撳墠琛�;
+    },
+    modelOpenAfter(row) {
+      //鐐瑰嚮缂栬緫銆佹柊寤烘寜閽脊鍑烘鍚庯紝鍙互鍦ㄦ澶勫啓閫昏緫锛屽锛屼粠鍚庡彴鑾峰彇鏁版嵁
+      //(1)鍒ゆ柇鏄紪杈戣繕鏄柊寤烘搷浣滐細 this.currentAction=='Add';
+      //(2)缁欏脊鍑烘璁剧疆榛樿鍊�
+      //(3)this.editFormFields.瀛楁='xxx';
+      //濡傛灉闇�瑕佺粰涓嬫媺妗嗚缃粯璁ゅ�硷紝璇烽亶鍘唗his.editFormOptions鎵惧埌瀛楁閰嶇疆瀵瑰簲data灞炴�х殑key鍊�
+      //鐪嬩笉鎳傚氨鎶婅緭鍑虹湅锛歝onsole.log(this.editFormOptions)
+    }
+  }
+}
+export default extension
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/taskinfo/demo_Product/Dt_TaskExecuteDetail.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/taskinfo/demo_Product/Dt_TaskExecuteDetail.vue
new file mode 100644
index 0000000..2cf0b9d
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/extension/widesea_wms/taskinfo/demo_Product/Dt_TaskExecuteDetail.vue
@@ -0,0 +1,88 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/taskinfo/Dt_TaskExecuteDetail.js姝ゅ缂栧啓
+ -->
+<template>
+    <vol-box :lazy="true" v-model="model1" title="浠诲姟鎵ц鏄庣粏淇℃伅" :width="1820" :padding="5" :onModelClose="onModelClose">
+        <view-grid ref="grid" :columns="columns" :searchFormFields="searchFormFields"
+            :searchFormOptions="searchFormOptions" :table="table" :extend="extend">
+        </view-grid>
+        <template #footer>
+            <div>
+                <el-button type="primary" size="small" @click="model1 = false">纭</el-button>
+                <el-button type="default" size="small" @click="model1 = false">鍏抽棴</el-button>
+            </div>
+        </template>
+    </vol-box>
+</template>
+<script lang="jsx">
+import extend from "@/extension/widesea_wms/taskinfo/Dt_TaskExecuteDetail.js";
+import VolBox from '@/components/basic/VolBox.vue';
+import { ref, defineComponent, getCurrentInstance } from "vue";
+export default defineComponent({
+    setup() {
+        const { ctx: _this } = getCurrentInstance()
+
+        const model1 = ref(false);
+        const TaskNum = ref("");
+
+        const openModel1 = (row) => {
+            TaskNum.value = row.taskNum;
+            model1.value = true;
+
+            _this.$nextTick(() => {
+                _this.$refs.grid.refresh();
+            })
+        }
+
+
+
+        const table = ref({
+            key: 'taskDetailId',
+            footer: "Foots",
+            cnName: '浠诲姟鎵ц淇℃伅',
+            name: 'taskinfo/Dt_TaskExecuteDetail',
+            url: "/TaskExecuteDetail/",
+            sortName: "TaskDetailId"
+        });
+        const searchFormFields = ref({
+            "taskNum": TaskNum,
+            "taskState": ""
+        });
+        const searchFormOptions = ref([
+            [
+                { "title": "浠诲姟鍙�", "field": "taskNum", "type": "like" },
+                { "title": "浠诲姟鐘舵��", "field": "taskState", "type": "select", dataKey: "TaskStatus", data: [] },
+            ],
+        ]);
+        const columns = ref([{ field: 'taskDetailId', title: 'TaskDetailId', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
+        { field: 'taskId', title: '浠诲姟涓婚敭', type: 'int', width: 110, hidden: true, align: 'left', sort: true },
+        { field: 'taskNum', title: '浠诲姟鍙�', type: 'string', width: 60, align: 'left' },
+        { field: 'taskState', title: '浠诲姟鐘舵��', type: 'int', width: 60, align: 'left', bind: { key: "TaskStatus", data: [] } },
+        { field: 'isManual', title: '鏄惁浜哄伐鎿嶄綔', type: 'bool', width: 60, align: 'left', bind: { key: "isManual", data: [{ key: "false", value: "鑷姩鎵ц" }, { key: "true", value: "浜哄伐鎿嶄綔" }] } },
+        { field: 'remark', title: '鎵ц淇℃伅', type: 'string', width: 180, align: 'left' },
+        { field: 'createID', title: '鍒涘缓ID', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'createDate', title: '璁板綍鏃堕棿', type: 'datetime', sort: true, width: 60, align: 'left', sort: true },
+        { field: 'modifyID', title: '淇敼浜篒D', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150, hidden: true, align: 'left', sort: true },]);
+        return {
+            table,
+            extend,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            model1,
+            TaskNum,
+            VolBox,
+            openModel1,
+        };
+    },
+    components: {
+        'vol-box': VolBox
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/Home.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/Home.vue
new file mode 100644
index 0000000..89f5a59
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/Home.vue
@@ -0,0 +1,219 @@
+<template>
+  <div class="home-contianer">
+
+  </div>
+</template>
+<script>
+import { ref, onMounted, onUnmounted } from 'vue';
+export default {
+  components: {},
+  data() {
+    return {
+      
+      n: 90,
+      value1: '1',
+    };
+  },
+  setup() {
+    let open = (item) => {
+      window.open(item.url, '_blank');
+    };
+    let interval;
+    onMounted(() => {
+
+      // interval = setInterval(() => {
+      //   chart2.xAxis[0].data.splice(0, 1);
+      //   let lastYear =
+      //     chart2.xAxis[0].data[chart2.xAxis[0].data.length - 1] * 1 + 1;
+      //   chart2.xAxis[0].data.push(lastYear);
+
+      //   chart2.series[0].data.splice(0, 1);
+      //   chart2.series[0].data.push(~~(Math.random() * 1000));
+
+      //   chart2.series[1].data.splice(0, 1);
+      //   chart2.series[1].data.push(~~(Math.random() * 1000));
+      //   $chart2.setOption(chart2);
+      // }, 2000);
+    });
+    onUnmounted(() => {
+
+    });
+    return { open };
+  },
+  destroyed() {
+  }
+};
+// window.addEventListener("resize", function () {
+//   $chart2.setOption(chart2);
+// });
+</script>
+<style lang="less" scoped>
+.home-contianer {
+  padding: 6px;
+  background: #eee;
+  width: 100%;
+  height: 100%;
+  // max-width: 800px;
+  // position: absolute;
+  top: 0;
+  right: 0;
+  left: 0;
+  margin: 0 auto;
+
+  .h-top {
+    display: flex;
+    .h-top-left {
+      height: 100%;
+      width: 300px;
+      background: white;
+    }
+    height: 300px;
+  }
+  .h-top > div {
+    border: 1px solid #e8e7e7;
+    border-radius: 5px;
+    // margin: 6px;
+  }
+  .h-top-center {
+    height: 100%;
+    background: white;
+    margin: 0 6px;
+    display: flex;
+    flex-direction: column;
+    flex: 1;
+    .item1 .num {
+      padding-top: 28px;
+    }
+    .item2 .num {
+      padding-bottom: 20px;
+    }
+
+    .n-item {
+      width: 100%;
+      height: 100%;
+      text-align: center;
+      cursor: pointer;
+      // display: flex;
+      .item {
+        border-right: 1px solid #e5e5e5;
+        width: 33.3333333%;
+        float: left;
+        height: 50%;
+        border-bottom: 1px solid #e5e5e5;
+        padding: 47px 0;
+        font-size: 13px;
+      }
+      .item:hover {
+        background: #f9f9f9;
+        cursor: pointer;
+      }
+      .item:last-child {
+        border-right: 0;
+      }
+      .item3,
+      .item6 {
+        border-right: 0;
+      }
+      .num {
+        word-break: break-all;
+        color: #282727;
+        font-size: 30px;
+        transition: transform 0.8s;
+      }
+      .num:hover {
+        color: #55ce80;
+        transform: scale(1.2);
+      }
+      .text {
+        font-size: 13px;
+        color: #777;
+      }
+    }
+  }
+  .h-top-right {
+    // flex: 1;
+
+    width: 400px;
+    height: 100%;
+    background: white;
+  }
+  .h3 {
+    padding: 7px 15px;
+    font-weight: 500;
+    background: #fff;
+    border-bottom: 1px dotted #d4d4d4;
+  }
+}
+.task-table {
+  table {
+    width: 100%;
+    .thead {
+      font-weight: bold;
+    }
+    tr {
+      cursor: pointer;
+      td {
+        border-bottom: 1px solid #f3f3f3;
+        padding: 9px 8px;
+        font-size: 12px;
+      }
+    }
+    tr:hover {
+      background: #eee;
+    }
+  }
+}
+.h-chart {
+  height: 340px;
+  margin: 6px 0px;
+  display: flex;
+  .h-left-grid {
+    width: 300px;
+    height: 100%;
+    background: white;
+    display: inline-block;
+    .name {
+      margin-left: 7px;
+    }
+    .item:hover {
+      background: #f9f9f9;
+      cursor: pointer;
+    }
+    .item {
+      padding: 22px 14px;
+      float: left;
+      width: 50%;
+      height: 33.33333%;
+      border-bottom: 1px solid #eee;
+      border-right: 1px solid #eee;
+      i {
+        font-size: 30px;
+      }
+      .desc {
+        font-size: 12px;
+        color: #c3c3c3;
+        padding: 5px 0 0 4px;
+        line-height: 1.5;
+      }
+    }
+  }
+}
+#h-chart2 {
+  border-radius: 3px;
+  background: white;
+  padding-top: 10px;
+  height: 100%;
+  width: 0;
+  flex: 1;
+  margin: 0 7px;
+}
+#h-chart3 {
+  border-radius: 3px;
+  padding: 10px 10px 0 10px;
+  background: white;
+  // padding-top: 10px;
+  height: 100%;
+
+  width: 400px;
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/Index.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/Index.vue
new file mode 100644
index 0000000..d551172
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/Index.vue
@@ -0,0 +1,717 @@
+<template>
+  <div id="vol-container" :class="['vol-theme-' + theme]">
+    <div class="vol-aside" :style="{ width: menuWidth + 'px' }">
+      <div class="header" :style="{ width: menuWidth - 1 + 'px' }">
+        <img v-show="!isCollapse" src="@/assets/imgs/logo.png" />
+        <i @click="toggleLeft" class=" collapse-menu" :class="isCollapse ? 'el-icon-s-unfold' : 'el-icon-s-fold'" />
+      </div>
+      <div class="vol-menu">
+        <el-scrollbar style="height: 100%">
+          <VolMenu :currentMenuId="currentMenuId" :on-select="onSelect" :enable="true" :open-select="false"
+            :isCollapse="isCollapse" :list="menuOptions"></VolMenu>
+        </el-scrollbar>
+      </div>
+    </div>
+    <div class="vol-container" :style="{ left: menuWidth - 1 + 'px' }">
+      <div class="vol-header">
+        <div class="project-name">WIDESEA_WMS</div>
+        <div class="header-text">
+          <div class="h-link">
+            <a href="javascript:void(0)" @click="to(item)" v-for="(item, index) in links.filter((c) => {
+              return !c.icon;
+            })" :key="index">
+              <span v-if="!item.icon"> {{ item.text }}</span>
+              <i v-else :class="item.icon"></i>
+            </a>
+          </div>
+        </div>
+        <div class="header-info">
+          <div class="h-link">
+            <a href="javascript:void(0)" @click="to(item)" v-for="(item, index) in links.filter((c) => {
+              return c.icon;
+            })" :key="index">
+              <span v-if="!item.icon"> {{ item.text }}</span>
+              <i v-else :class="item.icon"></i>
+            </a>
+          </div>
+          <!--娑堟伅绠$悊-->
+          <div class="h-link" @click="messageModel = true">
+            <a><i class="el-icon-message-solid"></i></a>
+          </div>
+          <div>
+            <img class="user-header" :src="userImg" @error="($e) => { $e.target.src = errorImg; }" />
+          </div>
+          <div class="user">
+            <span>{{ userName }}</span>
+            <span id="index-date"></span>
+          </div>
+          <div class="settings">
+            <i style="font-size: 20px" class="el-icon-s-tools" @click="drawer_model = true" />
+          </div>
+        </div>
+      </div>
+      <div class="vol-path">
+        <el-tabs @tab-click="selectNav" @tab-remove="removeNav" @contextmenu.prevent="bindRightClickMenu(false)"
+          type="border-card" class="header-navigation" v-model="selectId" :strtch="false">
+          <el-tab-pane v-for="(item, navIndex) in navigation" type="card" :name="navIndex + ''" :closable="navIndex > 0"
+            :key="navIndex" :label="item.name">
+            <span style="display: none">{{ navIndex }}</span>
+          </el-tab-pane>
+        </el-tabs>
+        <!-- 鍙抽敭鑿滃崟 -->
+        <div v-show="contextMenuVisible">
+          <ul :style="{ left: menuLeft + 'px', top: menuTop + 'px' }" class="contextMenu">
+            <li v-show="visibleItem.all">
+              <el-button link @click="closeTabs()">
+                <i class="el-icon-close"></i>
+                {{
+                  navigation.length == 2 ? "鍏抽棴鑿滃崟" : "鍏抽棴鎵�鏈�"
+                }}</el-button>
+            </li>
+            <li v-show="visibleItem.left">
+              <el-button link @click="closeTabs('left')"><i class="el-icon-back"></i>鍏抽棴宸﹁竟</el-button>
+            </li>
+            <li v-show="visibleItem.right">
+              <el-button link @click="closeTabs('right')">
+                <i class="el-icon-right"></i>鍏抽棴鍙宠竟</el-button>
+            </li>
+            <li v-show="visibleItem.other">
+              <el-button link @click="closeTabs('other')"><i class="el-icon-right"></i>鍏抽棴鍏朵粬
+              </el-button>
+            </li>
+          </ul>
+        </div>
+      </div>
+      <div class="vol-main" id="vol-main">
+        <el-scrollbar style="height: 100%" v-if="permissionInited">
+          <loading v-show="$store.getters.isLoading()"></loading>
+          <router-view v-slot="{ Component }">
+            <keep-alive>
+              <component :is="Component" :key="$route.name"
+                v-if="!$route.meta || ($route.meta && !$route.meta.hasOwnProperty('keepAlive'))" />
+            </keep-alive>
+            <component :is="Component" :key="$route.name"
+              v-if="$route.meta && $route.meta.hasOwnProperty('keepAlive')" />
+          </router-view>
+        </el-scrollbar>
+      </div>
+    </div>
+    <el-drawer title="閫夋嫨涓婚" v-model="drawer_model" direction="rtl" destroy-on-close>
+      <div class="theme-selector">
+        <div @click="changeTheme(item.name)" class="item" v-for="(item, index) in theme_color" :key="index"
+          :style="{ background: item.color }">
+          <div v-show="item.leftColor" :style="{ background: item.leftColor }" style="height: 100%; width: 20px"
+            class="t-left"></div>
+          <div class="t-right"></div>
+        </div>
+      </div>
+    </el-drawer>
+
+    <el-drawer title="娑堟伅鍒楄〃" v-model="messageModel" direction="rtl" destroy-on-close>
+      <Message :list="messageList"></Message>
+    </el-drawer>
+  </div>
+</template>
+<style lang="less" scoped>
+@import "./index/index.less";
+</style>
+<script>
+import loading from "@/components/basic/RouterLoading";
+import VolMenu from "@/components/basic/VolElementMenu.vue";
+import Message from "./index/Message.vue";
+import MessageConfig from "./index/MessageConfig.js";
+// var imgUrl = require("@/assets/imgs/logo.png");
+var $this;
+var $interval;
+var $indexDate;
+import {
+  defineComponent,
+  reactive,
+  ref,
+  watch,
+  onMounted,
+  getCurrentInstance,
+} from "vue";
+import { useRouter, useRoute } from "vue-router";
+import store from "../store/index";
+import http from "@/../src/api/http.js";
+export default defineComponent({
+  components: {
+    VolMenu,
+    loading,
+    Message,
+  },
+
+  data() {
+    return {
+      allTabs: true,
+      leftTabs: true,
+      rightTabs: true,
+      otherTabs: true,
+      menuLeft: 0,
+      menuTop: 0,
+      //  contextMenuVisible: false, // 鍙抽敭鍏抽棴鏄�/闅�
+    };
+  },
+  setup(props, context) {
+    // 鑾峰彇鍏ㄥ眬灞炴�у拰鏂规硶
+    const { proxy } = getCurrentInstance();
+
+    // 鑿滃崟瀵艰埅榛樿瀹藉害
+    const menuWidth = ref(200);
+    const contextMenuVisible = ref(false);
+    const isCollapse = ref(false);
+    const drawer_model = ref(false);
+    const messageModel = ref(false);
+    const theme_color = ref([
+      { name: "blue", color: "rgb(45, 140, 240)" },
+      { name: "blue2", color: "rgb(45, 140, 240)", leftColor: "#0068d6" },
+      { name: "red", color: "rgb(237, 64, 20)" },
+      { name: "red2", color: "rgb(237, 64, 20)", leftColor: "#a90000" },
+      { name: "dark", color: "#272929" },
+      { name: "orange", color: "#ff9900" },
+      { name: "orange2", color: "#ff9900", leftColor: "rgb(232 141 5)" },
+      { name: "green", color: "rgb(25, 190, 107)" },
+      { name: "green2", color: "rgb(25, 190, 107)", leftColor: "#019e4f" },
+      { name: "white", color: "#fff" },
+    ]);
+    const links = ref([
+      //{
+      // text: "妗嗘灦瑙嗛",
+      // path: "https://www.cctalk.com/m/group/90268531",
+      // id: -3,
+      //},
+      //{ text: "澶у睆鏁版嵁", path: "/bigdata", id: -3 },
+      //{
+      //  text: "妗嗘灦鏂囨。",
+      //  path: "http://v2.volcore.xyz/document/guide",
+      //  id: -2,
+      //},   {
+      //  text: "妗嗘灦浼佷笟鐗�",
+      //  path: "http://pro.volcore.xyz/",
+      //  id: 10,
+      //},
+      { text: "涓汉涓績", path: "/UserInfo", id: -1, icon: "el-icon-s-custom" },
+      {
+        text: "瀹夊叏閫�鍑�",
+        path: "/login",
+        id: -4,
+        icon: "el-icon-switch-button",
+      },
+    ]);
+    const errorImg = ref(new URL('@/assets/imgs/default_header.png', import.meta.url).href);
+    const selectId = ref("1");
+    // 銆愰椤点�戞爣绛惧簭鍙�(褰撳墠鍙抽敭閫変腑鐨勮彍鍗�)
+    const selectMenuIndex = ref("0");
+    //2022.05.29澧炲姞tab閫夐」涓庤彍鍗曡仈鍔ㄥ姛鑳�
+    const currentMenuId = ref(0);
+    const userName = ref("--");
+    const userInfo = ref({});
+    const visibleItem = reactive({
+      left: false,
+      right: false,
+      all: false,
+      other: false,
+    });
+    const userImg = ref("");
+    const navigation = reactive([
+      { orderNo: "0", id: "1", name: "棣栭〉", path: "/home" },
+    ]);
+    const logo = ref();
+    const theme = ref("blue2");
+    const menuOptions = ref([]);
+    const permissionInited = ref(false);
+    const messageList = reactive([]);
+    let _config = getCurrentInstance().appContext.config.globalProperties;
+    let router = useRouter();
+    const toggleLeft = () => {
+      isCollapse.value = !isCollapse.value;
+      menuWidth.value = isCollapse.value ? 63 : 200;
+    };
+    //2021.08.28寮�鏀炬墜鍔ㄦ姌鍙犺彍鍗曟柟娉�
+    _config.menu = {
+      show() {
+        toggleLeft();
+      },
+      hide() {
+        toggleLeft();
+      },
+    };
+    const changeTheme = (name) => {
+      if (theme.value != name) {
+        theme.value = name;
+      }
+      localStorage.setItem("vol3_theme", name);
+    };
+    const to = (item) => {
+      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      if (item.path == "#") {
+        window.open("https://github.com/cq-panda/Vue.NetCore");
+        return;
+      }
+      if (item.path.indexOf("http") != -1) {
+        window.open(item.path);
+        return;
+      }
+      if (typeof item == "string" || item.path == "/login") {
+        if (item == "/login" || item.path == "/login") {
+          store.commit("clearUserInfo", "");
+          window.location.href = "/";
+          return;
+        }
+        router.push({ path: item });
+        return;
+      }
+      if (item.path == "#") return;
+      open(item);
+    };
+    const open = (item, useRoute) => {
+      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      let _index = navigation.findIndex((x) => {
+        return x.path == item.path;
+      });
+      if (_index == -1) {
+        navigation.push({
+          //  orderNo: String(navigation.length),// 搴忓彿
+          id: item.id + "",
+          name: item.name || item.text || "鏃犳爣棰�",
+          path: item.path,
+          query: item.query, //2021.03.20淇鑷畾涔変簩娆℃墦寮�$tabs鏃跺弬鏁颁涪澶辩殑闂
+        });
+        //鏂版墦寮�鐨則ab绉昏嚦鏈�鍚庝竴涓�夐」
+        selectId.value = navigation.length - 1 + "";
+      } else {
+        selectId.value = _index + "";
+      }
+      if (useRoute === undefined) {
+        //闈炴爣鍑嗚彍鍗曪紝璁板綍鏈�鍚庝竴娆¤烦杞殑椤甸潰锛岀敤浜庡埛鏂�
+        setItem(item);
+        router.push(item);
+        // this.$router.push(item);
+      }
+      currentMenuId.value = item.id * 1;
+      // tab鑿滃崟缁戝畾鍙抽敭浜嬩欢
+      proxy.$nextTick(function (e) {
+        proxy.bindRightClickMenu(true);
+      });
+    };
+    const close = (path) => {
+      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      let index = navigation.findIndex((x) => {
+        return x.path == path;
+      });
+      if (index == -1) {
+        return _config.$Message.error("鏈壘鍒拌彍鍗�");
+      }
+      removeNav(index);
+    };
+    const setItem = (item) => {
+      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      localStorage.setItem(
+        window.location.origin + "_tabs",
+        JSON.stringify(item)
+      );
+    };
+    const getItem = () => {
+      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      let nav = localStorage.getItem(window.location.origin + "_tabs");
+      return nav ? JSON.parse(nav) : null;
+    };
+    const selectNav = (item) => {
+      //鍗囩骇element姝e紡鐗堜慨鏀�
+      selectId.value = item.props.name;
+      let _path = navigation[item.index].path;
+      currentMenuId.value = (
+        menuOptions.value.find((c) => {
+          return c.path == _path;
+        }) || { id: 0 }
+      ).id;
+
+      router.push({
+        path: navigation[item.index].path,
+        query: navigation[item.index].query,
+      });
+    };
+
+    const removeNav = (_index) => {
+      return new Promise(() => {
+        //鍏抽棴鐨勫綋鍓嶉」,璺宠浆鍒板墠涓�涓〉闈�
+        if (selectId.value == _index + "") {
+          console.log(navigation[_index - 1]);
+          setItem(navigation[_index - 1]);
+          router.push({
+            path: navigation[_index - 1].path,
+            //2022.06.27淇tabs浜屾鍒囨崲鍚庡弬鏁颁涪澶辩殑闂
+            query: navigation[_index - 1].query,
+          });
+          navigation.splice(_index, 1);
+          selectId.value = selectId.value - 1 + "";
+          return;
+        }
+        if (_index < selectId.value) {
+          selectId.value = selectId.value - 1 + "";
+        }
+        navigation.splice(_index, 1);
+        currentMenuId.value = (
+          menuOptions.value.find((c) => {
+            return c.path == navigation[selectId.value * 1].path;
+          }) || { id: 0 }
+        ).id;
+      });
+    };
+
+    const getSelectMenuName = (id) => {
+      return menuOptions.value.find(function (x) {
+        return x.id == id;
+      });
+    };
+    const onSelect = (treeId) => {
+      /* 2020.07.31澧炲姞鎵嬪姩鎵撳紑tabs*/
+      var item = getSelectMenuName(treeId);
+      open(item, false);
+    };
+
+    /**
+     * 鏄剧ず鍙抽敭鑿滃崟
+     * @param {*} e 浜嬩欢瀵硅薄
+     */
+    const openTabsMenu = function (e) {
+      e.preventDefault(); // 闃叉榛樿鑿滃崟寮瑰嚭
+      let tabId = e.target.id.split("-")[1] * 1;
+
+      //璁板綍褰撳墠閫変腑鐨勮彍鍗昳ndex
+      selectMenuIndex.value =
+        document.getElementById("pane-" + tabId).children[0].textContent * 1;
+      //鍙湁棣栭〉鏃朵笉鏄剧ず
+      if (navigation.length == 1) {
+        return;
+      }
+
+      //棣栭〉璁剧疆鏄剧ず鍏抽棴鍙宠竟鑿滃崟
+      if (!selectMenuIndex.value) {
+        visibleItem.all = false;
+        visibleItem.right = true;
+        visibleItem.left = false;
+        visibleItem.other = false;
+      } else {
+        visibleItem.all = true;
+        //涓嶆槸鏈�鍚庝竴涓樉绀哄叧闂彸杈硅彍鍗�
+        visibleItem.right = selectMenuIndex.value != navigation.length - 1;
+        //鍙湁涓や釜鑿滃崟鏃朵笉鏄剧ず鍏抽棴宸﹁竟
+        visibleItem.left = navigation.length != 2;
+        //鍙湁涓や釜鑿滃崟鏃朵笉鏄剧ず鍏抽棴鍏朵粬
+        visibleItem.other = navigation.length != 2;
+      }
+      contextMenuVisible.value = true;
+      // 璁剧疆鍙抽敭鑿滃崟鏄剧ず鐨勪綅缃�
+      proxy.menuLeft =
+        e.target.getBoundingClientRect().left - (isCollapse.value ? 63 : 198); //-e.target.clientWidth
+      proxy.menuTop = 36;
+    };
+
+    /**
+     * 鍏抽棴鍙抽敭鑿滃崟
+     */
+    const closeTabsMenu = () => {
+      contextMenuVisible.value = false;
+    };
+    const toHome = () => {
+      open({
+        text: navigation[0].name,
+        path: navigation[0].path,
+      });
+    };
+    /**
+     * 鍏抽棴鍏跺畠鏍囩椤�
+     * @param {*} par 鍏抽棴绫诲瀷(left,right,other)
+     */
+    const closeTabs = (value) => {
+      let _menuId = navigation[selectId.value * 1].id;
+      let currnetIndex = selectId.value * 1; // navigation.findIndex(c => { return c.id == selectId.value });
+      switch (value) {
+        case "left": {
+          // 鍒犻櫎宸︿晶tab鏍囩
+          navigation.splice(1, currnetIndex - 1); // 鍒犻櫎宸︿晶tab鏍囩
+          break;
+        }
+        case "right": {
+          // 鍒犻櫎鍙充晶tab鏍囩
+          if (selectMenuIndex.value == 0) {
+            navigation.splice(currnetIndex); // 鍒犻櫎鍙充晶tab鏍囩
+            toHome();
+          } else {
+            navigation.splice(currnetIndex + 1); // 鍒犻櫎鍙充晶tab鏍囩
+            if (selectMenuIndex.value < currnetIndex) {
+              navigation.splice(
+                selectMenuIndex.value,
+                currnetIndex - selectMenuIndex.value
+              );
+            }
+          }
+          break;
+        }
+        case "other": {
+          // 鍒犻櫎鍏朵粬鎵�鏈塼ab鏍囩
+          navigation.splice(currnetIndex + 1); // 鍒犻櫎鍙充晶tab鏍囩(杩欓噷蹇呴』鎸夌収鍙斥啋宸﹂『搴忓垹闄�)
+          navigation.splice(1, currnetIndex - 1); // 鍒犻櫎宸︿晶tab鏍囩
+          break;
+        }
+        default: {
+          //鍏抽棴鎵�鏈�
+          navigation.splice(1, navigation.length);
+          toHome();
+          break;
+        }
+      }
+      selectId.value =
+        navigation.findIndex((c) => {
+          return c.id == _menuId;
+        }) + "";
+      closeTabsMenu();
+    };
+
+    watch(
+      () => contextMenuVisible.value,
+      (newVal, oldVal) => {
+        // 鐩戣
+        if (newVal) {
+          document.body.addEventListener("click", closeTabsMenu);
+        } else {
+          document.body.removeEventListener("click", closeTabsMenu);
+        }
+      }
+    );
+
+    /**
+     * 绯荤粺鍒涘缓寮�濮�
+     */
+    const created = () => {
+      let _theme = localStorage.getItem("vol3_theme");
+      if (_theme) {
+        theme.value = _theme;
+      }
+
+      let _userInfo = store.getters.getUserInfo();
+      if (_userInfo) {
+        userName.value = _userInfo.userName;
+        if (_userInfo.img) {
+          userImg.value = _config.base.getImgSrc(_userInfo.img, http.ipAddress);
+        }
+      }
+      Object.assign(_config.$tabs, { open: open, close: close });
+
+      http.get("api/menu/getTreeMenu", {}, true).then((data) => {
+        data.push({ id: "1", name: "棣栭〉", url: "/home" }); // 涓轰簡鑾峰彇閫変腑id浣跨敤
+        data.forEach((d) => {
+          d.path = (d.url || "").replace("/Manager", "");
+          d.to = (d.url || "").replace("/Manager", "");
+          if (!d.icon || d.icon.substring(0, 3) != "el-") {
+            d.icon = "el-icon-menu";
+          }
+        });
+        store.dispatch("setPermission", data);
+        menuOptions.value = data;
+        permissionInited.value = true;
+
+        //寮�鍚秷鎭帹閫侊紙main.js涓缃槸鍚﹀紑鍚痵ignalR锛�2022.05.05
+        if (_config.$global.signalR) {
+          MessageConfig(http, (result) => {
+            messageList.unshift(result);
+            //    console.log(result)
+          });
+        }
+
+        //褰撳墠鍒锋柊鏄笉鏄椤�
+        if (router.currentRoute.value.path != navigation[0].path) {
+          //鏌ユ壘绯荤粺鑿滃崟
+          let item = menuOptions.value.find((x) => {
+            return x.path == router.currentRoute.value.path; //this.$route.path;
+          });
+          if (item) return onSelect(item.id);
+          //鏌ユ壘椤堕儴蹇嵎杩炴帴
+          item = links.value.find((x) => {
+            return x.path == router.currentRoute.value.path; //this.$route.path;
+          });
+          //鏌ユ壘鏈�鍚庝竴娆¤烦杞殑椤甸潰
+          if (!item) {
+            item = getItem();
+          }
+          if (item) {
+            return open(item, false);
+          }
+        }
+        selectId.value = "1";
+      });
+    };
+    created();
+    return {
+      menuWidth,
+      isCollapse,
+      drawer_model,
+      theme_color,
+      errorImg,
+      userInfo,
+      userName,
+      userImg,
+      selectId,
+      selectMenuIndex,
+      navigation,
+      links,
+      onSelect,
+      openTabsMenu,
+      selectNav,
+      getSelectMenuName,
+      removeNav,
+      logo,
+      theme,
+      menuOptions,
+      permissionInited,
+      changeTheme,
+      to,
+      toggleLeft,
+      messageModel,
+      messageList,
+      contextMenuVisible,
+      visibleItem,
+      closeTabsMenu,
+      closeTabs,
+      currentMenuId,
+    };
+  },
+  /**
+   * 鎸傝浇閽╁瓙鍑芥暟
+   */
+  mounted() {
+    let _date = showTime();
+    $indexDate = document.getElementById("index-date");
+    $indexDate.innerText = _date;
+    $interval = setInterval(function () {
+      $indexDate.innerText = showTime();
+    }, 1000);
+
+    this.bindRightClickMenu(true);
+  },
+
+  methods: {
+    /**
+     * 缁戝畾鍙抽敭浜嬩欢
+     * @param {*} enable 鏄惁鍚敤鍙抽敭浜嬩欢[true:鍚敤;false:绂佺敤;]
+     * @param {*} $event 浜嬩欢
+     */
+    bindRightClickMenu(enable) {
+      if (!enable) return;
+      let that = this;
+      // 浣跨敤鍘熺敓js 涓哄崟涓猟om缁戝畾榧犳爣鍙冲嚮浜嬩欢
+      that.$nextTick(() => {
+        let tab_top_dom = Object.assign(
+          [],
+          document.getElementsByClassName("el-tabs__item is-top")
+        );
+        tab_top_dom.forEach((item, index) => {
+          item.oncontextmenu = that.openTabsMenu;
+        });
+      });
+    },
+  },
+
+  /**
+   * 閿�姣侀挬瀛愬嚱鏁�
+   */
+  destroyed() {
+    $this = null;
+    clearInterval($interval);
+  },
+});
+const week = new Array(
+  "鏄熸湡涓�",
+  "鏄熸湡浜�",
+  "鏄熸湡涓�",
+  "鏄熸湡鍥�",
+  "鏄熸湡浜�",
+  "鏄熸湡鍏�",
+  "鏄熸湡鏃�"
+);
+function showTime() {
+  let date = new Date();
+  let year = date.getFullYear();
+  let month = date.getMonth() + 1;
+  let day = date.getDate();
+  let hour = date.getHours();
+  let minutes = date.getMinutes();
+  let second = date.getSeconds();
+
+  return (
+    year +
+    "." +
+    (month < 10 ? "0" + month : month) +
+    "." +
+    (day < 10 ? "0" + day : day) + //202.08.08淇鏃ユ湡澶╂暟灏忎簬10鏃舵坊鍔�0
+    "" +
+    " " +
+    (hour < 10 ? "0" + hour : hour) +
+    ":" +
+    (minutes < 10 ? "0" + minutes : minutes) +
+    ":" +
+    (second < 10 ? "0" + second : second) +
+    " " + //2020.08.30淇棣栭〉鏃ユ湡鏄熸湡澶╀笉鏄剧ず鐨勯棶棰�
+    (week[date.getDay() - 1] || week[6])
+  );
+}
+</script>
+
+<style lang="less" scoped>
+.vol-container .vol-path ::v-deep(.el-tabs__content) {
+  padding: 0;
+}
+
+.contextMenu {
+  width: 120px;
+  margin: 0;
+  border: 1px solid #eaeaea;
+  background: #fff;
+  z-index: 30000;
+  position: absolute;
+  list-style-type: none;
+  padding: 5px 0;
+  border-radius: 4px;
+  font-size: 14px;
+  color: #333;
+  box-shadow: 2px 2px 3px 0 rgb(182 182 182 / 20%);
+
+  i,
+  button {
+    font-size: 14px !important;
+  }
+}
+
+.contextMenu li {
+  margin: 0;
+  padding: 5px 17px;
+}
+
+.contextMenu li:hover {
+  background: #fafafa;
+  cursor: pointer;
+}
+
+.contextMenu li button {
+  color: #626060;
+  font-size: 14px;
+  letter-spacing: 1px;
+}
+
+.el-tabs.el-tabs--top.el-tabs--border-card.header-navigation>.el-tabs__header .el-tabs__item:last-child,
+.el-tabs--top.el-tabs--border-card.header-navigation>.el-tabs__header .el-tabs__item:nth-child(2) {
+  padding: 0;
+}
+
+.header-navigation ::v-deep(.el-tabs__item.is-top) {
+  padding: 0 15px;
+}
+</style>
+<style>
+.horizontal-collapse-transition {
+  transition: 0s width ease-in-out, 0s padding-left ease-in-out,
+    0s padding-right ease-in-out;
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/Login.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/Login.vue
new file mode 100644
index 0000000..5bf8a06
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/Login.vue
@@ -0,0 +1,408 @@
+<template>
+  <div class="login-container">
+    <div class="project-name">WIDESEA_WMS</div>
+    <div class="login-form">
+      <div class="form-user" @keypress="loginPress">
+        <div class="login-text">
+          <div>
+            <div>娆㈣繋鐧诲綍...</div>
+            <div class="login-line"></div>
+          </div>
+          <div style="flex:1;"></div>
+        </div>
+        <div class="login-text-small">WELCOME TO LOGIN</div>
+        <div class="item">
+          <div class="input-icon el-icon-user"></div>
+          <input type="text" v-focus v-model="userInfo.userName" placeholder="璇疯緭鍏ヨ处鍙�" />
+        </div>
+        <div class="item">
+          <div class="input-icon el-icon-lock"></div>
+          <input type="password" v-focus v-model="userInfo.password" placeholder="璇疯緭鍏ュ瘑鐮�" />
+        </div>
+        <div class="item">
+          <div class="input-icon el-icon-mobile"></div>
+
+          <input v-focus type="text" v-model="userInfo.verificationCode" placeholder="杈撳叆楠岃瘉鐮�" />
+          <div class="code" @click="getVierificationCode">
+            <img v-show="codeImgSrc != ''" :src="codeImgSrc" />
+          </div>
+        </div>
+      </div>
+      <div class="flex-center">
+        <el-checkbox v-model="rememberMe" name="rememberMe">
+          璁颁綇瀵嗙爜
+        </el-checkbox>
+      </div>
+      <div class="loging-btn">
+        <el-button size="large" :loading="loading" color="#3a6cd1" :dark="true" @click="login" long>
+          <span v-if="!loading">鐧诲綍</span>
+          <span v-else>姝e湪鐧诲綍...</span>
+        </el-button>
+      </div>
+
+      <!-- 璐﹀彿淇℃伅 -->
+      <!-- <div class="account-info">
+        <p>婕旂ず璐﹀彿锛歛dmin666 &nbsp; &nbsp;瀵嗙爜:123456</p>
+        <p>鏈湴璐﹀彿锛歛dmin &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;瀵嗙爜:123456</p>
+        <p><a href="https://jq.qq.com/?_wv=1027&k=Sqstuy0M" style="text-decoration: none"
+            target="_blank">QQ3缇�:743852316(婊�)</a>
+          &nbsp; &nbsp;&nbsp; &nbsp;
+          <a href="https://qm.qq.com/cgi-bin/qm/qr?k=YRZBbf64qsUeEmh24I65u2aIZFn2C-Ha&jump_from=webapi&qr=1" style="text-decoration: none" target="_blank">QQ4缇わ細959924606</a> -->
+          <!-- <a href="http://v2.volcore.xyz/document/guide" style="text-decoration: none" target="_blank">妗嗘灦鏂囨。</a> -->
+        <!-- </p>
+      </div> -->
+      <!-- 閾炬帴浣嶇疆 -->
+      <!-- <div class="app-link" >
+        <a href="#" style="text-decoration: none">绉诲姩绔壂鐮�</a>
+        <a>
+          <i class="el-icon-chat-dot-round"></i> 灏忕▼搴�
+          <img src="https://app-1256993465.cos.ap-nanjing.myqcloud.com/wechat.jpg" /></a>
+        <a>
+          <i class="el-icon-apple"></i>
+          Android
+          <img src="https://app-1256993465.cos.ap-nanjing.myqcloud.com/Android.png" /></a>
+        <a>
+          <i class="el-icon-document"></i>
+          H5
+          <img src="https://app-1256993465.cos.ap-nanjing.myqcloud.com/H5.png" /></a>
+      </div> -->
+    </div>
+
+    <!-- 椤甸潰搴曢儴 -->
+    <!-- <div class="login-footer">
+      <a style="text-decoration: none" href="https://beian.miit.gov.cn/" target="_blank">浜琁CP澶�19056538鍙�-1</a>
+
+
+      <a href="https://dotnet9.com/" style="text-decoration: none" target="blank">Dotnet9</a>
+      <a href="https://space.bilibili.com/525836469" style="text-decoration: none" target="blank">NET瑙嗛鏁欑▼(寰蒋MVP-ACE褰曞埗)</a>
+      <a href="https://www.cctalk.com/m/group/90268531" style="text-decoration: none" target="blank">VOL妗嗘灦瑙嗛</a>
+      <a href="http://demo.volcore.xyz" style="text-decoration: none" target="blank">瑙嗛婕旂ず鍦板潃</a>
+    </div> -->
+
+    <img class="login-bg" src="/static/login_bg.png" />
+  </div>
+</template>
+
+
+<script >
+import {
+  defineComponent,
+  ref,
+  reactive,
+  toRefs,
+  getCurrentInstance
+} from 'vue';
+import { useRouter, useRoute } from 'vue-router';
+import store from '../store/index';
+import http from '@/../src/api/http.js';
+export default defineComponent({
+  setup(props, context) {
+    store.commit('clearUserInfo', '');
+    const loading = ref(false);
+    const codeImgSrc = ref('');
+    const userInfo = reactive({
+      userName: 'admin',
+      password: '123456',
+      verificationCode: '1234',
+      UUID: undefined
+    });
+
+    const rememberMe = ref(false);
+    const savedForm = localStorage.getItem('loginForm');
+    if (savedForm) {
+      const { userName, password } = JSON.parse(savedForm);
+      userInfo.userName = userName;
+      userInfo.password = password;
+      rememberMe.value = true;
+    }
+    const getVierificationCode = () => {
+      http.get('/api/Sys_User/getVierificationCode').then((x) => {
+        codeImgSrc.value = 'data:image/png;base64,' + x.img;
+        userInfo.UUID = x.uuid;
+      });
+    };
+    getVierificationCode();
+
+    let appContext = getCurrentInstance().appContext;
+    let $message = appContext.config.globalProperties.$message;
+    let router = useRouter();
+
+    const login = () => {
+      if (!userInfo.userName) return $message.error('璇疯緭鍏ョ敤鎴峰悕');
+      if (!userInfo.password) return $message.error('璇疯緭鍏ュ瘑鐮�');
+      if (!userInfo.verificationCode) {
+        return $message.error('璇疯緭鍏ラ獙璇佺爜');
+      }
+      loading.value = true;
+      if (rememberMe.value) {
+        localStorage.setItem('loginForm', JSON.stringify(userInfo));
+        rememberMe.value = true;
+      } else {
+        localStorage.removeItem('loginForm');
+        rememberMe.value = false;
+      }
+      http.post('/api/Sys_User/login', userInfo, '姝e湪鐧诲綍....').then((result) => {
+        if (!result.status) {
+          loading.value = false;
+          getVierificationCode();
+          return $message.error(result.message);
+        }
+        $message.success('鐧诲綍鎴愬姛,姝e湪璺宠浆!');
+        store.commit('setUserInfo', result.data);
+        router.push({ path: '/' });
+      });
+    };
+    const loginPress = (e) => {
+      if (e.keyCode == 13) {
+        login();
+      }
+    };
+    const openUrl = (url) => {
+      window.open(url, '_blank');
+    };
+    return {
+      loading,
+      codeImgSrc,
+      getVierificationCode,
+      login,
+      userInfo,
+      loginPress,
+      openUrl,
+      rememberMe,
+    };
+  },
+  directives: {
+    focus: {
+      inserted: function (el) {
+        el.focus();
+      }
+    }
+  }
+});
+</script>
+<style lang="less" scoped>
+.login-container {
+  display: flex;
+  width: 100%;
+  height: 100%;
+  background: rgb(246, 247, 252);
+  justify-content: flex-end;
+  align-items: center;
+}
+
+.login-form {
+  align-items: center;
+  width: 50%;
+  display: flex;
+  flex-direction: column;
+  // margin-right: 150px;
+  z-index: 999;
+
+  .form-user {
+    // margin: 25px 0;
+
+    .item {
+      border-radius: 5px;
+      border: 1px solid #ececec;
+      display: flex;
+      margin-bottom: 30px;
+      background: #ffff;
+      height: 45px;
+      padding-left: 20px;
+      display: flex;
+
+      .code {
+        position: relative;
+        cursor: pointer;
+        width: 74px;
+        padding: 5px 10px 0 0;
+      }
+
+      .input-icon {
+        line-height: 45px;
+        color: #7a7a7a;
+        padding-right: 20px;
+      }
+    }
+  }
+
+  input:-webkit-autofill {
+    box-shadow: 0 0 0px 1000px white inset;
+    -webkit-box-shadow: 0 0 0px 1000px white inset !important;
+  }
+
+  input {
+    background: white;
+    display: block;
+    box-sizing: border-box;
+    width: 100%;
+    min-width: 0;
+    margin: 0;
+    padding: 0;
+    color: #323233;
+    line-height: inherit;
+    text-align: left;
+    border: 0;
+    outline: none;
+    font-size: 16px;
+    line-height: 20px;
+  }
+}
+
+.form-user,
+.loging-btn {
+  width: 400px;
+}
+
+.loging-btn {
+  box-shadow: 2px 4px 11px #a4c2ff;
+  margin-top: 10px;
+
+  button {
+    padding: 21px;
+    font-size: 14px !important;
+    width: 100%;
+  }
+}
+
+.login-text {
+  font-weight: bolder;
+  font-size: 20px;
+  letter-spacing: 2px;
+
+  position: relative;
+  display: flex;
+
+  .login-line {
+    z-index: -1;
+    padding: 5px;
+    position: relative;
+    top: -8px;
+    width: 100%;
+    background-image: linear-gradient(to right, #6598ff, white);
+  }
+}
+
+.login-text-small {
+  margin-bottom: 20px;
+  font-size: 13px;
+  color: #7d7c7c;
+}
+
+.login-bg {
+  left: 0;
+  position: absolute;
+  height: 100%;
+  width: 50%;
+  z-index: 0;
+}
+
+.project-name {
+  position: absolute;
+  top: 40px;
+  left: 40px;
+  z-index: 9999;
+  font-weight: bolder;
+  background-image: linear-gradient(to right, #1850c1, #9c009c);
+  -webkit-background-clip: text;
+  color: transparent;
+  font-size: 25px;
+}
+</style>
+<style lang="less" scoped>
+.app-link {
+  // font-weight: bolder;
+  text-align: center;
+  padding-top: 5px;
+  font-size: 12px;
+  width: 400px;
+  padding-left: 40px;
+  display: flex;
+
+  a {
+    flex: 1;
+    position: relative;
+    cursor: pointer;
+    width: 70px;
+    color: #666666;
+    margin: 2px 10px 0 0;
+  }
+
+  img {
+    display: none;
+  }
+
+  a:hover {
+    color: #0545f6 !important;
+
+    img {
+      display: block;
+      position: absolute;
+      z-index: 999999999;
+      top: -130px;
+      width: 120px;
+      left: -22px;
+
+      border: 1px solid #b1b1b1;
+    }
+  }
+}
+
+.login-footer {
+  position: absolute;
+  width: 50%;
+  bottom: 0.5rem;
+  font-size: 12px;
+  text-align: center;
+  padding-bottom: 10px;
+  color: #4f4f4f;
+
+  a {
+    margin-right: 10px;
+    font-size: 12px;
+    color: #4f4f4f;
+  }
+
+  div {
+    margin-bottom: 5px;
+  }
+
+  a:hover {
+    cursor: pointer;
+    color: #0540e3 !important;
+  }
+}
+
+.account-info {
+  font-size: 12px;
+  color: #636363;
+  margin-top: 15px;
+}
+</style>
+
+<style lang="less" scoped>
+@media screen and (max-width: 700px) {
+
+  .login-bg,
+  .account-info,
+  .app-link,
+  .login-footer,
+  .project-name {
+    display: none;
+  }
+
+  .login-container {
+    padding: 2rem;
+    justify-content: center;
+  }
+
+  .login-form {
+    width: 100%;
+  }
+
+  .form-user,
+  .loging-btn {
+    width: 100%;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/index/Message.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/index/Message.vue
new file mode 100644
index 0000000..2c77447
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/index/Message.vue
@@ -0,0 +1,45 @@
+<template>
+  <div class="message-container">
+    <div class="item" v-for="(item, index) in list" :key="index">
+      <div class="title">{{ item.title }}({{ item.date }})</div>
+      <div class="content">{{ item.message }}</div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    list: {
+      type: Array,
+      default: () => {
+        return [];
+      }
+    }
+  },
+  created() {
+    if (!this.list.length) {
+      this.list.push({
+        title: '娑堟伅娴嬭瘯鏍囬',
+        message: '娑堟伅娴嬭瘯鍐呭娑堟伅娴嬭瘯鍐呭娑堟伅娴嬭瘯鍐呭娑堟伅娴嬭瘯鍐呭',
+        date: '2022-05-02 03:10'
+      });
+    }
+  }
+};
+</script>
+<style scoped lang="less">
+.message-container {
+  .title {
+    padding-bottom: 10px;
+  }
+  .item {
+    border-bottom: 1px solid #eee;
+    padding: 10px 20px;
+  }
+  .content {
+    color: #7e7e7e;
+    font-size: 13px;
+  }
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/index/index.less b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/index/index.less
new file mode 100644
index 0000000..c872e91
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/index/index.less
@@ -0,0 +1,644 @@
+.vol-aside {
+  height: 100%;
+  position: absolute;
+  float: left;
+  overflow: hidden;
+}
+
+.vol-menu {
+  border: 0 !important;
+}
+
+.vol-aside .tac {
+  text-align: left;
+}
+
+.vol-aside .header {
+  text-align: center;
+  position: absolute;
+  height: 60px;
+  position: relative;
+  line-height: 60px;
+}
+
+.vol-aside .vol-menu {
+  position: absolute;
+  width: 100%;
+  top: 60px;
+  bottom: 0;
+  background: white;
+  border-right: 1px solid #e3e3e3;
+}
+
+.vol-aside .vol-menu ::v-deep(.ivu-menu) {
+  text-align: left;
+  position: unset;
+  width: 100% !important;
+}
+
+.vol-aside .vol-menu ::v-deep(.is-horizontal) {
+  display: none !important;
+}
+
+.vol-aside .vol-menu ::v-deep(.is-vertical) {
+  width: 2px;
+  right: -1px;
+}
+
+.vol-container {
+  min-width: 800px;
+  right: 0;
+  display: inline-block;
+  position: absolute;
+  margin: 0;
+  box-sizing: border-box;
+  height: 100%;
+}
+
+.vol-container .vol-path {
+  position: relative;
+  width: 100%;
+  display: inline-block;
+  border-bottom: 1px solid #eee;
+}
+
+.vol-container .vol-path span {
+  position: relative;
+  margin-right: 10px;
+  color: #969696;
+}
+
+.vol-header {
+  height: 61px;
+  width: 100%;
+  position: relative;
+  display: flex;
+  border-bottom: 1px solid #eee;
+}
+
+.vol-main {
+  border-left: 1px solid #eee;
+  position: absolute;
+  width: 100%;
+  bottom: 0;
+  top: 95px;
+  margin: 0;
+  overflow: auto;
+}
+
+.header {
+  padding: 5px;
+}
+
+.header img {
+  height: 100%;
+  margin-right: 25px;
+}
+
+.header-info {
+  padding-right: 20px;
+  display: inline-block;
+  // position: absolute;
+  height: 100%;
+}
+
+.header-info > div {
+  float: left;
+  height: 100%;
+}
+
+.user-header {
+  background: white;
+  height: 52px;
+  width: 52px;
+  border-radius: 50%;
+  margin-right: 0px;
+  top: 4px;
+  left: 7px;
+  position: relative;
+  border: 1px solid #dfdfdf;
+}
+
+.project-name {
+  line-height: 60px;
+  padding: 0 50px 0 20px;
+  color: #fff;
+  font-size: 16px;
+  letter-spacing: 1px;
+}
+
+.header-text {
+  vertical-align: middle;
+  height: 100%;
+  // position: absolute;
+  flex: 1;
+  text-align: left;
+  font-size: 15px;
+  left: 21px;
+  line-height: 60px;
+  letter-spacing: 1px;
+}
+
+.vol-header .user {
+  text-align: left;
+  padding: 0 12px;
+  position: relative;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  // height: 60px;
+  justify-content: center;
+  span:last-child {
+    font-size: 12px;
+  }
+}
+
+.vol-header .settings {
+  padding-top: 10px;
+  color: #d4d2d2;
+}
+
+.vol-header .user span {
+  position: relative;
+}
+
+.header-info:hover {
+  cursor: pointer;
+}
+
+.header-navigation {
+  cursor: pointer;
+  box-shadow: none;
+  border-bottom: 1px solid #eee;
+  height: 34px;
+  /* overflow: hidden; */
+  line-height: 35px;
+  display: block;
+  margin: 0;
+  padding: 0;
+  outline: 0;
+  list-style: none;
+  position: relative;
+  z-index: 900;
+  font-weight: initial;
+  margin-top: -1px;
+}
+
+.el-tabs--border-card {
+  border: none;
+}
+
+.header-navigation ::v-deep(.el-tabs__item) {
+  height: 34px;
+  font-size: 14px;
+  line-height: 34px;
+  padding-bottom: 6px;
+  color: #525252 !important;
+  position: relative;
+  margin: 0 4px;
+  border: 1px solid #e2e2e2;
+  border-top-right-radius: 4px;
+  border-top-left-radius: 4px;
+  // border-bottom: 0px;
+}
+
+.header-navigation ::v-deep(.el-tabs__item.is-active) {
+  color: #1a81ea !important;
+}
+
+.header-navigation ::v-deep(.el-tabs__nav-prev),
+.header-navigation ::v-deep(.el-tabs__nav-next) {
+  line-height: 35px;
+  padding-left: 4px;
+}
+
+.vol-header .user span:first-child {
+  font-size: 15px;
+  font-weight: bolder;
+}
+
+.h-link {
+  line-height: 59px;
+}
+
+.h-link a {
+  font-size: 14px;
+  text-decoration: none;
+  padding: 0px 15px;
+  /* height: 60px; */
+  display: inline-block;
+}
+
+img[src=''],
+img:not([src]) {
+  opacity: 0;
+}
+
+//榛戣壊
+.vol-theme-dark {
+  .header {
+    background: #101010;
+  }
+
+  .header-text {
+    color: white;
+  }
+
+  .vol-header {
+    background-color: #272929;
+  }
+
+  .h-link a:hover {
+    background: #0c0202;
+  }
+
+  a {
+    color: #f2f2f2;
+  }
+
+  .h-link a:hover {
+    color: #dfdfdf;
+  }
+
+  .h-link .actived {
+    border-bottom: 2px solid white;
+  }
+
+  .h-link .actived a {
+    color: white !important;
+  }
+
+  .vol-header .user {
+    color: #ececec;
+  }
+
+  .vol-header .settings {
+    color: #d4d2d2;
+  }
+
+  .vol-aside .vol-menu {
+    background: black;
+  }
+}
+
+.vol-theme-white .vol-aside ::v-deep(.vol-el-menu-item) {
+  background: #2e333b;
+  color: white;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.vol-menu .el-submenu) {
+  background: black;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.vol-menu .el-sub-menu__title *) {
+  color: #d6d6d6;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.vol-el-menu-item .el-menu-item) {
+  color: #eee;
+  background: #1f1f1f;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.vol-el-menu-item .el-menu-item.is-active),
+.vol-theme-dark .vol-aside ::v-deep(.menu-item-lv1) {
+  background: black;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.menu-item-lv1) {
+  background: black;
+  color: #d6d6d6;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.vol-el-menu-item .el-menu-item:hover) {
+  background: black;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.el-sub-menu__title) {
+  background-color: black;
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.el-sub-menu__title:hover) {
+  background-color: rgb(25, 25, 25);
+}
+
+.vol-theme-dark .vol-aside ::v-deep(.el-sub-menu__title:hover *) {
+  color: white;
+}
+
+.vol-theme-red,
+.vol-theme-red2 {
+  .vol-header {
+    background-color: rgb(237, 64, 20);
+  }
+
+  .header-text {
+    color: #dcdfe6;
+  }
+
+  .h-link a:hover {
+    background: #d71212;
+  }
+
+  .h-link .actived {
+    border-bottom: 2px solid white;
+  }
+
+  .h-link a,
+  .h-link .actived a,
+  .vol-header .settings,
+  .vol-header .user {
+    color: white;
+  }
+
+  .vol-header .header-text {
+    color: #fbfbfb;
+  }
+}
+
+.vol-theme-red {
+  .header {
+    background-color: rgb(237, 64, 20);
+  }
+}
+
+.vol-theme-red2 {
+  .header {
+    background-color: #a90000;
+  }
+}
+
+.vol-theme-orange,
+.vol-theme-orange2 {
+  .header-text {
+    color: #dcdfe6;
+  }
+
+  .vol-header {
+    background-color: rgb(255, 153, 0);
+  }
+
+  .h-link a:hover {
+    background: #c97901;
+  }
+
+  .h-link .actived {
+    border-bottom: 2px solid white;
+  }
+
+  .h-link a,
+  .h-link .actived a,
+  .vol-header .settings,
+  .vol-header .user {
+    color: white;
+  }
+
+  .vol-header .header-text {
+    color: #fbfbfb;
+  }
+}
+
+.vol-theme-orange {
+  .header {
+    background: rgb(255, 153, 0);
+  }
+}
+
+.vol-theme-orange2 {
+  .header {
+    background-color: rgb(232, 141, 5);
+  }
+}
+
+//缁胯壊
+.vol-theme-green,
+.vol-theme-green2 {
+  .header-text {
+    color: #dcdfe6;
+  }
+
+  .vol-header {
+    background-color: rgb(25, 190, 107);
+  }
+
+  .h-link a:hover {
+    background: #329103;
+  }
+
+  .h-link .actived {
+    border-bottom: 2px solid white;
+  }
+
+  .h-link a,
+  .h-link .actived a,
+  .vol-header .settings,
+  .vol-header .user {
+    color: white;
+  }
+
+  .vol-header .header-text {
+    color: #fbfbfb;
+  }
+}
+
+.vol-theme-green {
+  .header {
+    background: rgb(25, 190, 107);
+  }
+}
+
+.vol-theme-green2 {
+  .header {
+    background-color: rgb(1, 158, 79);
+  }
+}
+
+//钃濊壊
+.vol-theme-blue,
+.vol-theme-blue2 {
+  .header-text {
+    color: #dcdfe6;
+  }
+
+  .vol-header {
+    background-color: rgb(45, 140, 240);
+  }
+
+  .h-link a:hover {
+    background: #0170e3;
+  }
+
+  .h-link .actived {
+    border-bottom: 2px solid white;
+  }
+
+  .h-link a,
+  .h-link .actived a,
+  .vol-header .settings,
+  .vol-header .user {
+    color: white;
+  }
+
+  .vol-header .header-text {
+    color: #fbfbfb;
+  }
+}
+
+.vol-theme-blue {
+  .header {
+    background-color: rgb(45, 140, 240);
+  }
+}
+
+.vol-theme-blue2 {
+  .header {
+    background-color: rgb(0, 104, 214);
+  }
+}
+
+//鐧借壊
+.vol-theme-white {
+  .header {
+    background-color: #434956;
+  }
+
+  .h-link a:hover {
+    background: #eeeeee;
+  }
+
+  .h-link a {
+    color: #211f1f;
+  }
+
+  .header-navigation {
+    // box-shadow: -7px 11px 10px -13px #678aa7;
+    border-bottom: 1px solid #eee;
+    height: 32px;
+    overflow: hidden;
+    line-height: 32px;
+    display: block;
+    margin: 0;
+    padding: 0;
+    outline: 0;
+    list-style: none;
+    position: relative;
+    z-index: 900;
+    font-weight: 400;
+  }
+
+  .vol-aside .vol-menu {
+    background: #353941;
+  }
+}
+
+.vol-theme-white .project-name {
+  color: #505050;
+}
+
+.vol-theme-white .vol-aside::v-deep(.vol-el-menu-item .el-menu-item.is-active),
+.vol-theme-white .vol-aside ::v-deep(.menu-item-lv1) {
+  background: #353941;
+}
+
+.vol-theme-white .vol-aside ::v-deep(.menu-item-lv1) {
+  background: #353941;
+  color: #d6d6d6;
+}
+
+.vol-theme-white .vol-aside ::v-deep(.vol-el-menu-item .el-menu-item:hover) {
+  background: #353941;
+}
+
+.vol-theme-white .vol-aside ::v-deep(.el-sub-menu__title) {
+  background-color: #353941;
+}
+
+.vol-theme-white .vol-aside ::v-deep(.el-sub-menu__title:hover) {
+  background-color: rgb(47, 46, 46);
+}
+
+.vol-theme-white .vol-aside ::v-deep(.el-sub-menu__title),
+.vol-theme-white .vol-aside ::v-deep(.el-menu-item),
+.vol-theme-white .vol-aside ::v-deep(.el-sub-menu__title:hover *) {
+  color: #bababa;
+}
+
+// .vol-theme-white .vol-aside ::v-deep(.vol-el-menu-item) {
+//   background: #363e4f;
+//   color: white;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.vol-menu .el-submenu),
+// .vol-theme-white .vol-aside ::v-deep(.menu-item-lv1) {
+//   background: #515a6e;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.vol-menu) {
+//   background: #515a6e;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.vol-menu .el-sub-menu__title *),
+// .vol-theme-white .vol-aside ::v-deep(.menu-item-lv1 *) {
+//   color: #d6d6d6;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.vol-el-menu-item .el-menu-item) {
+//   color: #eee;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.vol-el-menu-item .el-menu-item.is-active),
+// .vol-theme-white .vol-aside ::v-deep(.menu-item-lv1.is-active) {
+//   background: #59647b;
+//   color: #fff;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.vol-el-menu-item .el-menu-item:hover) {
+//   background: #6a758c;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.el-sub-menu__title:hover) {
+//   background-color: #525865;
+// }
+// .vol-theme-white .vol-aside ::v-deep(.el-sub-menu__title:hover *) {
+//   color: white;
+// }
+
+// .vol-theme-red ::v-deep(.el-menu-item.is-active),
+// .vol-theme-red2 ::v-deep(.el-menu-item.is-active)
+// {
+//   background-color: #d71212;
+// }
+// .vol-theme-blue ::v-deep(.el-menu-item.is-active),
+// .vol-theme-blue2 ::v-deep(.el-menu-item.is-active)
+// {
+//   background-color: #2d8cf0;
+// }
+// .vol-theme-orange ::v-deep(.el-menu-item.is-active),
+// .vol-theme-orange2 ::v-deep(.el-menu-item.is-active)
+// {
+//   background-color: #ff9900;
+// }
+
+// .vol-theme-green ::v-deep(.el-menu-item.is-active),
+// .vol-theme-green2 ::v-deep(.el-menu-item.is-active)
+// {
+//   background-color: #19be6b;
+// }
+
+.theme-selector {
+  height: 100%;
+  padding-left: 16px;
+
+  .item {
+    cursor: pointer;
+    width: 60px;
+    height: 60px;
+    border-radius: 5px;
+    margin-bottom: 17px;
+    border: 1px solid #d4d2d2;
+    float: left;
+    margin-right: 13px;
+  }
+}
+
+.collapse-menu {
+  font-size: 21px;
+  color: #fff;
+  line-height: 60px;
+  position: absolute;
+  top: 0;
+  right: 5px;
+  cursor: pointer;
+}
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/signalR/Index.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/signalR/Index.vue
new file mode 100644
index 0000000..1a0a489
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/signalR/Index.vue
@@ -0,0 +1,113 @@
+<template>
+  <div class="message-container">
+    <div style="padding: 0 0 20px 10px">
+      <el-alert title="鍏充簬signalR浣跨敤" type="success" show-icon
+        ><p>
+          1銆佺洰鍓嶅彧鏄敤鏉ュ鐞嗛椤垫秷鎭彂閫�,鍙弬鐓ndex.vue涓嶩omePageMessageHub.cs
+        </p>
+        <p>
+          2銆佹枃妗h锛歨ttps://docs.microsoft.com/zh-cn/aspnet/core/signalr/introduction?view=aspnetcore-3.1
+        </p></el-alert
+      >
+    </div>
+
+    <vol-form
+      ref="form"
+      :formRules="formOptions"
+      :labelWidth="90"
+      :formFields="formFields"
+    >
+    </vol-form>
+    <div class="btns">
+      <el-button
+        type="primary"
+        @click="sendMessage"
+        ><i class="el-icon-chat-line-round"></i>鍙戦�佹秷鎭�</el-button
+      >
+    </div>
+  </div>
+</template>
+
+<script>
+//榛樿涓嶄細鑷姩閲嶈繛锛岄渶鎵嬪姩璋冪敤withAutomaticReconnect
+let connection;
+import * as signalR from '@microsoft/signalr';
+import VolForm from '@/components/basic/VolForm.vue';
+export default {
+  components: {
+    'vol-form': VolForm
+  },
+  data() {
+    return {
+      message: '',
+      size: {
+        minRows: 8,
+        maxRows: 30
+      },
+      formOptions: [
+        [{ title: '鐧婚檰璐﹀彿', required: true, field: 'userName' }],
+        [{ title: '娑堟伅鏍囬', required: true, field: 'title' }],
+        [
+          {
+            title: '娑堟伅鍐呭',
+            required: true,
+            field: 'message',
+            type: 'textarea',
+            minRows: 10
+          }
+        ]
+      ],
+      formFields: {
+        userName: 'admin666',
+        title: '鍙戦�佹爣棰�',
+        message: ''
+      }
+    };
+  },
+  methods: {
+    sendMessage() {
+      connection.invoke(
+        'sendHomeMessage',
+        this.formFields.userName,
+        this.formFields.title,
+        this.formFields.message || '鏃�'
+      );
+      this.$message.success('娑堟伅鍙戦�佹垚鍔�');
+    }
+  },
+  created() {},
+  mounted() {
+    //鑾峰彇褰撳墠鐧婚檰鐨勭敤鎴蜂俊鎭�
+    this.http.post('api/user/GetCurrentUserInfo').then((result) => {
+      connection = new signalR.HubConnectionBuilder()
+        .withAutomaticReconnect()
+        .withUrl(
+          `${this.http.ipAddress}message?userName=${result.data.userName}`
+        )
+        .build();
+      connection.qs = { test: 123 };
+      connection.start().catch((err) => alert(err.message));
+      //鑷姩閲嶈繛鎴愬姛鍚庣殑澶勭悊
+      connection.onreconnected((connectionId) => {
+        console.log(connectionId);
+      });
+      let _this = this;
+      connection.on('ReceiveHomePageMessage', function (message) {
+        _this.$notify.info({
+          title: '娑堟伅',
+          message: message + ''
+        });
+      });
+    });
+  }
+};
+</script>
+<style scoped lang="less">
+.message-container {
+  margin: 20px;
+  .btns {
+    text-align: center;
+    padding: 10px;
+  }
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Permission.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Permission.vue
new file mode 100644
index 0000000..de437a0
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Permission.vue
@@ -0,0 +1,382 @@
+<template>
+  <div class="role-container">
+    <div class="role-tree-left flex-col">
+      <div class="title"><i class="el-icon-user"></i>瑙掕壊鍒楄〃</div>
+      <el-scrollbar class="el-role-list">
+        <el-tree :data="tree" @node-click="nodeClick" node-key="id" :default-expanded-keys="openKeys"
+          :expand-on-click-node="false" style="padding: 5px 0; margin-right: 2px">
+          <template #default="{ data }">
+            <div class="action-group">
+              <div class="action-text">
+                {{ data.roleName }}
+              </div>
+            </div>
+          </template>
+        </el-tree>
+      </el-scrollbar>
+    </div>
+    <div class="role-tree-right flex-col">
+      <div class="title">
+        <div><i class="el-icon-folder-opened"></i>鑿滃崟鏉冮檺</div>
+        <el-button type="primary" @click="save">淇濆瓨</el-button>
+      </div>
+      <el-scrollbar class="el-role-list">
+        <el-tree @check-change="leftCheckChange" @check="nodeCheck" :data="roleTree" :show-checkbox="false"
+          style="padding: 15px" node-key="id" default-expand-all :expand-on-click-node="false">
+          <template #default="{ data }">
+            <div class="action-group">
+              <div class="action-text" :style="{ width: (4 - data.lv) * 18 + 150 + 'px' }">
+                <el-checkbox v-model="data.leftCk" @change="allChange(data)">{{
+          data.text + (data.isApp ? "(app)" : "")
+        }}</el-checkbox>
+              </div>
+              <div class="action-item">
+                <el-checkbox v-for="(item, index) in data.actions" :key="index" v-model="item.checked"
+                  @change="actionChange(data, item.checked, item)">{{ item.text }}</el-checkbox>
+              </div>
+            </div>
+          </template>
+        </el-tree>
+      </el-scrollbar>
+    </div>
+  </div>
+</template>
+
+<script>
+import { defineComponent, ref, reactive, getCurrentInstance } from "vue";
+import http from "@/../src/api/http.js";
+export default defineComponent({
+  setup() {
+    const selectId = ref(-1);
+    const checked = ref(false);
+    const tree = reactive([]);
+    const list = reactive([]);
+    const roles = reactive([]);
+    const roleList = reactive([]);
+    const roleTree = reactive([]);
+    const openKeys = reactive([]);
+
+    const leftCheckChange = (node, selected) => {
+      node.actions.forEach((x, index) => {
+        x.checked = selected;
+      });
+    };
+    const nodeCheck = (node, data) => {
+      let rootData = roleList.find((x) => {
+        return x.id === node.pid;
+      });
+      if (rootData && rootData.actions.length) {
+        rootData.actions[0].checked =
+          node.actions.some((x) => {
+            return x.checked;
+          }) ||
+          data.halfCheckedNodes.some((x) => {
+            return x.id === node.pid;
+          });
+      }
+    };
+
+    const allChange = (data) => {
+      data.actions.forEach((item) => {
+        item.checked = data.leftCk;
+      });
+      if (!data.children) {
+        return;
+      }
+      setChildrenChecked(data, data.leftCk);
+    };
+    const setChildrenChecked = (data, ck) => {
+      data.children.forEach((item) => {
+        item.leftCk = ck;
+        item.actions.forEach((c) => {
+          c.checked = ck;
+        });
+        if (item.children) {
+          setChildrenChecked(item, ck);
+        }
+      });
+    };
+    const actionChange = (data, ck, item) => {
+      ck =
+        data.actions.filter((x) => {
+          return x.checked;
+        }).length == data.actions.length;
+      data.leftCk = ck;
+      // console.log('')
+      if (item.value == 'Search' && item.checked) {
+        setParentCheck(data);
+      }
+    };
+
+    const setParentCheck = (data) => {
+      if (!data.pid) {
+        return
+      }
+      let b = true;
+      let pid = data.pid;
+      let perentData;
+      while (b) {
+        if (!pid) {
+          return false;
+        }
+        perentData = roleList.find(x => { return x.id == pid });
+        if (!perentData || !perentData.actions) {
+          b = false;
+          return false;
+        }
+        pid = perentData.pid;
+        let obj = perentData.actions.find(c => { return c.value == 'Search' });
+        if (obj) {
+          obj.checked = true;
+        }
+      }
+    }
+
+    const load = () => {
+      const url = "api/Sys_Role/getUserChildRoles";
+      http.post(url, {}, true).then((result) => {
+        if (!result.status) return;
+        list.splice(0);
+        list.push(...result.data);
+        list.forEach((x) => {
+          if (x.parentId == 0) {
+            x.lv = 1;
+            x.children = [];
+            tree.push(x);
+            getTree(x.id, x);
+          }
+        });
+        openKeys.push(tree[0].id);
+        selectId.value = openKeys[0];
+      });
+    };
+    const getTree = (id, data) => {
+      list.forEach((x) => {
+        if (x.parentId == id) {
+          x.lv = data.lv + 1;
+          if (!data.children) data.children = [];
+          data.children.push(x);
+          getTree(x.id, x);
+        }
+      });
+    };
+    const nodeClick = (node, selected) => {
+      selectId.value = node.id;
+      getUserRole(node);
+    };
+    const getUserRole = (item) => {
+      selectId.value = item.id;
+      roleList.forEach((x) => {
+        x.actions.forEach((a) => {
+          a.checked = false;
+        });
+      });
+      let url = `/api/Sys_Role/getUserTreePermission?roleId=${item.id}`;
+      http.post(url, {}, true).then((result) => {
+        if (!result.status) return;
+        result.data.forEach((item) => {
+          if (item.actions.length == 0) return;
+          let sourceItem = roleList.find((f) => f.id == item.id);
+          if (!sourceItem) return;
+          item.actions.forEach((actions) => {
+            sourceItem.actions.forEach((soure) => {
+              if (soure.value == actions.value) {
+                soure.checked = true;
+              }
+            });
+          });
+        });
+      });
+    };
+
+    const getRoleTree = (id, data, isRootId) => {
+      roleList.forEach((x) => {
+        if (x.pid == id) {
+          x.lv = data.lv + 1;
+          if (isRootId) {
+            x.rootId = id;
+          }
+          if (!data.children) data.children = [];
+          data.children.push(x);
+          getRoleTree(x.id, x, isRootId);
+        }
+      });
+    };
+
+    const getCurrentTreePermission = () => {
+      let url = "/api/Sys_Role/getCurrentTreePermission";
+      http.post(url, {}, true).then((result) => {
+        if (!result.status) return;
+        roleList.splice(0);
+        roles.splice(0);
+        roleList.push(...result.data.tree);
+        roles.push(...result.data.roles);
+        roleList.forEach((x) => {
+          if (x.pid == 0) {
+            x.lv = 1;
+            x.children = [];
+            roleTree.push(x);
+            getRoleTree(x.id, x);
+          }
+        });
+      });
+    };
+    const { proxy } = getCurrentInstance();
+    let $message =proxy.$message;
+    const save = () => {
+      if (selectId.value <= 0) {
+        return $message.error("璇烽�夋嫨瑙掕壊!");
+      }
+      let userPermissions = [];
+      roleList.forEach((x) => {
+        let checkedPermission = x.actions.filter((f) => {
+          return f.checked;
+        });
+        if (checkedPermission.length > 0) {
+          let actions = checkedPermission.map((m) => {
+            return { text: m.text, value: m.value };
+          });
+          userPermissions.push({
+            id: x.id,
+            actions: actions,
+          });
+        }
+      });
+      let url = `api/Sys_Role/SavePermission?roleId=${selectId.value}`;
+      http.post(url, userPermissions, true).then((result) => {
+        $message[result.status ? "success" : "error"](result.message);
+      });
+    };
+
+    load();
+    getCurrentTreePermission();
+    return {
+      list,
+      nodeClick,
+      checked,
+      tree,
+      selectId,
+      openKeys,
+      getUserRole,
+      roles,
+      roleList,
+      getCurrentTreePermission,
+      leftCheckChange,
+      nodeCheck,
+      roleTree,
+      allChange,
+      actionChange,
+      save,
+      setParentCheck
+    };
+  },
+});
+</script>
+<style lang="less" scoped>
+.role-container {
+  position: absolute;
+  background: #f6f6f6;
+  height: 100%;
+  width: 100%;
+  padding: 10px;
+  display: flex;
+
+  .flex-col {
+    display: flex;
+    flex-direction: column;
+  }
+
+  .role-tree-left {
+    border: 1px solid #f2f2f2;
+    background: #fff;
+    width: 230px;
+    margin-right: 10px;
+
+    .title {
+      i {
+        margin-left: 10px;
+      }
+    }
+  }
+
+  .role-tree-right {
+    background: #fff;
+    border: 1px solid #f2f2f2;
+    width: 0;
+    flex: 1;
+
+    .title {
+      display: flex;
+
+      i {
+        margin-left: 10px;
+      }
+
+      div {
+        flex: 1;
+      }
+    }
+
+    .action-group {
+      display: flex;
+      // line-height: 32px;
+      justify-content: center;
+      align-items: center;
+
+      label {
+        float: left;
+      }
+
+      .action-text {
+        line-height: 33px;
+
+        label {
+          margin-right: 5px;
+        }
+      }
+    }
+  }
+
+  .title {
+    padding: 10px;
+    background: rgb(246 250 255);
+    font-weight: bold;
+    font-size: 14px;
+    letter-spacing: 2px;
+  }
+
+  .el-role-list {
+    flex: 1;
+    height: 0;
+    overflow-x: hidden;
+  }
+}
+
+.role-tree-left ::v-deep(.el-tree-node__content) {
+  cursor: pointer;
+  height: auto;
+  padding: 5px;
+  margin: 2px 10px;
+  font-size: 15px;
+}
+
+.role-tree-left ::v-deep(.el-tree-node__content:hover) {
+  background: #f4f4f4;
+  border-radius: 20px;
+}
+
+.role-tree-left ::v-deep(.is-current > .el-tree-node__content:first-child) {
+  background: #f2f2f2;
+  border-radius: 20px;
+}
+
+.role-tree-right ::v-deep(.el-tree-node__content) {
+  margin-bottom: 5px;
+  height: auto;
+}
+
+.role-tree-right ::v-deep(.el-checkbox__label) {
+  position: relative;
+  top: 2px;
+}
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Permission/RoleTree.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Permission/RoleTree.vue
new file mode 100644
index 0000000..efe1993
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Permission/RoleTree.vue
@@ -0,0 +1,152 @@
+<template>
+  <div class="com-el-tree">
+
+      <div class="m-title"><i class="el-icon-warning-outline"></i>瑙掕壊鍒楄〃</div>
+
+    <el-scrollbar style="height: 100%; width: 200px" class="el-role-tree">
+      <el-tree
+        :data="tree"
+        @node-click="nodeClick"
+        node-key="id"
+        :default-expanded-keys="openKeys"
+        :expand-on-click-node="false"
+        style="padding: 5px 0; margin-right: 2px"
+      >
+        <template #default="{ node, data }">
+          <div class="action-group">
+            <div
+              class="action-text"
+              :class="{
+                actived: data.id == selectId,
+                'node-text': data.parentId !== 0,
+              }"
+              :style="{ width: (4 - data.lv) * 18 + 150 + 'px' }"
+            >
+              <Icon
+                v-if="data.parentId !== 0"
+                :type="data.id == selectId ? 'ios-paper' : 'ios-paper-outline'"
+              />
+              {{ data.roleName }}
+            </div>
+          </div>
+        </template>
+      </el-tree>
+    </el-scrollbar>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    // roles: {
+    //   type: Object,
+    //   default: () => {
+    //     return [];
+    //   }
+    // },
+    onChange: {
+      type: Function,
+      default: (treeId) => {},
+    },
+  },
+  data() {
+    return {
+      selectId: -1,
+      checked: false,
+      openKeys: [],
+      data: [],
+      tree: [],
+    };
+  },
+  created() {
+    this.load();
+  },
+  methods: {
+    load() {
+      this.http.post("/api/role/getUserChildRoles", {}, true).then((result) => {
+        if (!result.status) return this.$message.error(result.message);
+        this.data.splice(0);
+        this.data = result.data;
+        this.data.forEach((x) => {
+          if (x.parentId == 0) {
+            x.lv = 1;
+            x.children = [];
+            this.tree.push(x);
+            this.getTree(x.id, x);
+          }
+        });
+        this.openKeys.push(this.tree[0].id);
+        this.selectId = this.openKeys[0];
+        //榛樿鍔犺浇绗竴涓爲褰㈣彍鍗曚笅闈㈢殑鏁版嵁
+
+        //this.onChange(this.selectId);
+      });
+    },
+    getTree(id, data) {
+      this.data.forEach((x) => {
+        if (x.parentId == id) {
+          x.lv = data.lv + 1;
+          if (!data.children) data.children = [];
+          data.children.push(x);
+          this.getTree(x.id, x);
+        }
+      });
+    },
+    nodeClick(node, selected) {
+      //  console.log(node);
+      this.selectId = node.id;
+      //缂撳瓨褰撳墠閫変腑鐨勮妭鐐�
+      //  this.$store.getters.data().treeDemo1.treeId = node.id;
+      this.onChange(node);
+    },
+  },
+};
+</script>
+<style lang="less" scoped>
+.com-el-tree {
+  //2020.06.03澧炲姞宸︿晶tree鍥哄畾瀹藉害
+  width: 200px;
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+  border-radius: 3px;
+  background: white;
+  .el-role-tree {
+    flex: 1;
+    // border-right: 1px solid #eee;
+  }
+  .actived {
+  }
+  .action-text {
+    font-size: 14px;
+  }
+}
+.role-list {
+  color: white;
+  line-height: 40px;
+  padding: 0 13px;
+  font-size: 16px;
+  top: 2px;
+  width: 200px;
+}
+.m-title {
+  line-height: 30px;
+  font-size: 15px;
+  background: #66b1ff0f;
+  font-weight: bold;
+  padding: 6px 16px;
+  border-bottom: 1px solid #eee;
+  i {
+    padding-right: 5px;
+  }
+}
+.com-el-tree ::v-dee(.el-tree-node) {
+  padding: 3px 0;
+}
+.com-el-tree ::v-dee(.el-scrollbar .el-scrollbar__thumb) {
+  width: 0 !important;
+}
+</style>
+<style scoped>
+
+</style>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Dictionary.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Dictionary.vue
new file mode 100644
index 0000000..a57e4c5
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Dictionary.vue
@@ -0,0 +1,80 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/system/Sys_Dictionary.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend">
+    </view-grid>
+</template>
+<script>
+import extend from "@/extension/system/Sys_Dictionary.jsx";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'dicId',
+            footer: "Foots",
+            cnName: '瀛楀吀鏁版嵁',
+            name: 'Sys_Dictionary',
+            url: "/Sys_Dictionary/",
+            sortName: "dicId"
+        });
+        const editFormFields = ref({ "dicNo": "", "dicName": "", "parentId": "", "orderNo": "", "enable": "", "createDate": "", "dbSql": "", "remark": "" });
+        const editFormOptions = ref([[{ "title": "瀛楀吀缂栧彿", "required": true, "field": "dicNo" },
+        { "title": "瀛楀吀鍚嶇О", "required": true, "field": "dicName" },
+        { "title": "鐖剁骇ID", "required": true, "field": "parentId", "type": "number" }],
+        [{ "title": "鎺掑簭鍙�", "field": "orderNo", "type": "number" },
+        { "dataKey": "enable", "data": [], "title": "鏄惁鍚敤", "required": true, "field": "enable", "type": "select" },
+        { "title": "鍒涘缓鏃堕棿", "field": "createDate", "disabled": true, "type": "datetime" }],
+        [{ "title": "sql璇彞", "field": "dbSql", "colSize": 8, "type": "textarea" },
+        { "title": "澶囨敞", "field": "remark", "type": "textarea" }]]);
+        const searchFormFields = ref({ "dicNo": "", "dicName": "", "parentId": "", "enable": "", "createDate": "", "modifyDate": "" });
+        const searchFormOptions = ref([[{ "title": "瀛楀吀缂栧彿", "field": "dicNo" }, { "title": "瀛楀吀鍚嶇О", "field": "dicName", "type": "textarea" }, { "title": "鐖剁骇ID", "field": "parentId", "type": "number" }], [{ "dataKey": "enable", "data": [], "title": "鏄惁鍚敤", "field": "enable", "type": "select" }, { "title": "鍒涘缓鏃堕棿", "field": "createDate", "type": "datetime" }, { "title": "淇敼鏃堕棿", "field": "modifyDate", "type": "datetime" }]]);
+        const columns = ref([{ field: 'dicID', title: '瀛楀吀ID', type: 'int', width: 90, hidden: true, readonly: true, require: true, align: 'left' },
+        { field: 'dicNo', title: '瀛楀吀缂栧彿', type: 'string', width: 90, require: true, align: 'left', sort: true },
+        { field: 'dicName', title: '瀛楀吀鍚嶇О', type: 'string', link: true, width: 140, require: true, align: 'left' },
+        { field: 'parentId', title: '鐖剁骇ID', type: 'int', width: 90, require: true, align: 'left' },
+        { field: 'config', title: '閰嶇疆椤�', type: 'string', width: 300, hidden: true, align: 'left' },
+        { field: 'dbSql', title: 'sql璇彞', type: 'string', width: 200, align: 'left' },
+        { field: 'dBServer', title: 'DBServer', type: 'string', width: 90, hidden: true, align: 'left' },
+        { field: 'orderNo', title: '鎺掑簭鍙�', type: 'int', width: 90, align: 'left' },
+        { field: 'remark', title: '澶囨敞', type: 'string', width: 90, align: 'left' },
+        { field: 'enable', title: '鏄惁鍚敤', type: 'byte', bind: { key: 'enable', data: [] }, width: 90, require: true, align: 'left' },
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', width: 130, hidden: true, readonly: true, align: 'left' },
+        { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', width: 150, readonly: true, align: 'left', sort: true },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', width: 130, hidden: true, readonly: true, align: 'left' },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', width: 150, readonly: true, align: 'left', sort: true }]);
+        const detail = ref({
+            cnName: "瀛楀吀鏄庣粏",
+            table: "Sys_DictionaryList",
+            columns: [{ field: 'dicListId', title: 'DicList_ID', type: 'int', width: 90, hidden: true, readonly: true, require: true, align: 'left' },
+            { field: 'dicId', title: '鏁版嵁婧怚D', type: 'int', width: 90, readonly: true, align: 'left', sort: true },
+            { field: 'dicValue', title: '鏁版嵁婧怴alue', type: 'string', width: 90, edit: { type: 'text' }, align: 'left' },
+            { field: 'dicName', title: '鏁版嵁婧怲ext', type: 'string', width: 90, edit: { type: 'text' }, align: 'left' },
+            { field: 'orderNo', title: '鎺掑簭鍙�', type: 'int', width: 90, edit: { type: 'text' }, align: 'left' },
+            { field: 'remark', title: '澶囨敞', type: 'string', width: 90, edit: { type: 'text' }, align: 'left' },
+            { field: 'enable', title: '鏄惁鍙敤', type: 'byte', bind: { key: 'enable', data: [] }, width: 90, edit: { type: 'switch' }, align: 'left' },
+            { field: 'creator', title: '鍒涘缓浜�', type: 'string', width: 130, readonly: true, align: 'left' },
+            { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', width: 90, readonly: true, align: 'left', sort: true },
+            { field: 'modifier', title: '淇敼浜�', type: 'string', width: 130, align: 'left' },
+            { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', width: 90, align: 'left', sort: true }],
+            sortName: "dicListId",
+            key: "dicListId"
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_DictionaryList.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_DictionaryList.vue
new file mode 100644
index 0000000..668baf0
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_DictionaryList.vue
@@ -0,0 +1,65 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/system/Sys_DictionaryList.js姝ゅ缂栧啓
+ -->
+<template>
+    <div>
+        <view-grid :columns="columns"
+                   :detail="detail"
+                   :editFormFields="editFormFields"
+                   :editFormOptions="editFormOptions"
+                   :searchFormFields="searchFormFields"
+                   :searchFormOptions="searchFormOptions"
+                   :table="table"
+                   :extend="extend">
+        </view-grid>
+    </div>
+</template>
+
+<script>
+    import extend from "@/extension/system/Sys_DictionaryList.jsx";
+    var vueParam = {
+        data() {
+            return {
+                table: {
+                    key: 'dicList_ID',
+                    footer: "Foots",
+                    cnName: '瀛楀吀鏄庣粏',
+                    name: 'Sys_DictionaryList',
+                    url: "/Sys_DictionaryList/",
+                    sortName: "dicList_ID"
+                },
+                extend: extend,
+                editFormFields: {"dicValue":"","dicName":"","orderNo":"","remark":"","enable":""},
+                editFormOptions: [[{"columnType":"string","title":"鏁版嵁婧怴alue","field":"dicValue","type":"text"},
+                               {"columnType":"string","title":"鏁版嵁婧怲ext","field":"dicName","type":"text"},
+                               {"columnType":"int","title":"鎺掑簭鍙�","field":"orderNo","type":"text"},
+                               {"columnType":"int","title":"澶囨敞","field":"remark","type":"text"},
+                               {"columnType":"byte","dataKey":"enable","title":"鏄惁鍙敤","field":"Enable","type":"switch"}]],
+                searchFormFields: {},
+                searchFormOptions: [],
+                columns: [{field:'DicList_ID',title:'DicList_ID',type:'int',width:90,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'Dic_ID',title:'鏁版嵁婧怚D',type:'int',width:90,readonly:true,align:'left',sortable:true},
+                       {field:'DicValue',title:'鏁版嵁婧怴alue',type:'string',width:90,align:'left'},
+                       {field:'DicName',title:'鏁版嵁婧怲ext',type:'string',width:90,align:'left'},
+                       {field:'OrderNo',title:'鎺掑簭鍙�',type:'int',width:90,align:'left'},
+                       {field:'Remark',title:'澶囨敞',type:'int',width:90,align:'left'},
+                       {field:'Enable',title:'鏄惁鍙敤',type:'byte',bind:{ key:'enable',data:[]},width:90,align:'left'},
+                       {field:'CreateID',title:'CreateID',type:'int',width:90,hidden:true,align:'left'},
+                       {field:'Creator',title:'鍒涘缓浜�',type:'string',width:130,readonly:true,align:'left'},
+                       {field:'CreateDate',title:'鍒涘缓鏃堕棿',type:'datetime',width:90,readonly:true,align:'left',sortable:true},
+                       {field:'ModifyID',title:'ModifyID',type:'int',width:90,hidden:true,align:'left'},
+                       {field:'Modifier',title:'淇敼浜�',type:'string',width:130,align:'left'},
+                       {field:'ModifyDate',title:'淇敼鏃堕棿',type:'datetime',width:90,align:'left',sortable:true}],
+                detail: {
+                    cnName:"#detailCnName",
+                    columns: [],
+                    sortName: "#detailSortName"
+                }
+            };
+        }
+    };
+    export default vueParam;
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Log.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Log.vue
new file mode 100644
index 0000000..ceeac76
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Log.vue
@@ -0,0 +1,70 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/system/Sys_Log.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/system/Sys_Log.jsx";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'Id',
+                footer: "Foots",
+                cnName: '绯荤粺鏃ュ織',
+                name: 'Sys_Log',
+                url: "/Sys_Log/",
+                sortName: "Id"
+            });
+            const editFormFields = ref({});
+            const editFormOptions = ref([]);
+            const searchFormFields = ref({"BeginDate":"","Url":"","LogType":[],"Success":[],"UserIP":"","ServiceIP":"","Role_Id":""});
+            const searchFormOptions = ref([[{"title":"璇锋眰鍦板潃","field":"Url","type":"text"},{"title":"鐢ㄦ埛IP","field":"UserIP","type":"text"},{"title":"鏈嶅姟鍣↖P","field":"ServiceIP","type":"text"}],[{"title":"寮�濮嬫椂闂�","field":"BeginDate","type":"datetime"},{"dataKey":"restatus","data":[],"title":"鍝嶅簲鐘舵��","field":"Success","type":"selectList"},{"dataKey":"roles","data":[],"title":"瑙掕壊ID","field":"Role_Id","type":"select"}],[{"dataKey":"log","data":[],"title":"鏃ュ織绫诲瀷","field":"LogType","colSize":12,"type":"checkbox"}]]);
+            const columns = ref([{field:'Id',title:'Id',type:'int',width:90,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'BeginDate',title:'寮�濮嬫椂闂�',type:'datetime',width:140,align:'left',sortable:true},
+                       {field:'UserName',title:'鐢ㄦ埛鍚嶇О',type:'string',width:90,align:'left'},
+                       {field:'Url',title:'璇锋眰鍦板潃',type:'string',width:110,align:'left'},
+                       {field:'LogType',title:'鏃ュ織绫诲瀷',type:'string',bind:{ key:'log',data:[]},width:80,align:'left'},
+                       {field:'Success',title:'鍝嶅簲鐘舵��',type:'int',bind:{ key:'restatus',data:[]},width:80,align:'left'},
+                       {field:'ElapsedTime',title:'鏃堕暱',type:'int',width:60,align:'left'},
+                       {field:'RequestParameter',title:'璇锋眰鍙傛暟',type:'string',width:70,align:'left'},
+                       {field:'ResponseParameter',title:'鍝嶅簲鍙傛暟',type:'string',width:70,align:'left'},
+                       {field:'ExceptionInfo',title:'寮傚父淇℃伅',type:'string',width:70,align:'left'},
+                       {field:'UserIP',title:'鐢ㄦ埛IP',type:'string',width:90,align:'left'},
+                       {field:'ServiceIP',title:'鏈嶅姟鍣↖P',type:'string',width:90,hidden:true,align:'left'},
+                       {field:'BrowserType',title:'娴忚鍣ㄧ被鍨�',type:'string',width:90,align:'left'},
+                       {field:'User_Id',title:'鐢ㄦ埛ID',type:'int',width:90,hidden:true,align:'left'},
+                       {field:'Role_Id',title:'瑙掕壊ID',type:'int',bind:{ key:'roles',data:[]},width:90,hidden:true,align:'left'},
+                       {field:'EndDate',title:'缁撴潫鏃堕棿',type:'datetime',width:150,hidden:true,align:'left',sortable:true}]);
+            const detail = ref({
+                cnName: "#detailCnName",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Menu.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Menu.vue
new file mode 100644
index 0000000..144852c
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Menu.vue
@@ -0,0 +1,630 @@
+<template>
+  <div class="menu-container">
+    <!-- <el-input/> -->
+    <vol-box :width="940"
+             :mask="true"
+             :height="500"
+             title="鍥炬爣鍒楄〃"
+             v-model="model">
+      <Icons :onSelect="onSelect"></Icons>
+      <template #footer>
+        <el-button type="primary"
+                   size="small"
+                   @click="model = false">纭� 璁�</el-button>
+      </template>
+    </vol-box>
+    <vol-box :width="600"
+             :mask="true"
+             :height="270"
+             title="鍏朵粬鏉冮檺"
+             v-model="actionModel">
+      <vol-form ref="actionForm"
+                :formRules="actionOptions"
+                :formFields="actionFields">
+        <template #header>
+          <div>
+            <el-alert show-icon
+                      type="success">
+              閰嶇疆鐨勫叾浠栨潈闄�
+              <br />1銆佹坊鍔犳柊鐨勬潈闄愬悗璇峰湪vue椤圭洰涓璫onfig鏂囦欢澶逛笅buttns.js娣诲姞姝ゆ潈闄愮殑鎸夐挳銆�
+              <br />2銆佸鏋滄潈闄愬彧鍦ㄦ煇灏戞暟鍑犱釜鍔熻兘涓娇鐢�,鍦╲ue鐨勫搴旈〉闈㈡墿灞昬xtension鏂囦欢鎵惧埌瀵瑰簲js,娣诲姞鍒癳l-buttons瀵硅薄涓�,鏍煎紡鍚宑onfig鏂囦欢澶逛笅buttns.js涓�鏍枫��
+            </el-alert>
+          </div>
+        </template>
+      </vol-form>
+      <template #footer>
+        <el-button type="primary"
+                   size="small"
+                   @click="otherAction">纭� 璁�</el-button>
+      </template>
+    </vol-box>
+
+    <!-- v-if="tree.length" -->
+    <div class="menu-left">
+      <div class="m-title"><i class="el-icon-warning-outline"></i>鑿滃崟鍒楄〃</div>
+      <el-scrollbar style="height: 100%; width: 200px">
+        <VolMenu :onSelect="getTreeItem"
+                 :list="tree"
+                 :isCollapse="false"></VolMenu>
+      </el-scrollbar>
+    </div>
+    <div class="menu-right">
+      <el-scrollbar style="height: 100%">
+        <el-alert title="鑿滃崟閰嶇疆璇存槑"
+                  type="warning"
+                  :closable="false"
+                  show-icon>
+          <div>
+            1銆佸鏋滄槸鐢ㄤ唬鐮佺敓鍣ㄧ敓鎴愮殑Vue椤甸潰,Url涓篤ue椤圭洰涓璼rc->router->viewGrid.js瀵瑰簲琛ㄥ悕鐨刾ath灞炴��
+          </div>
+          <div style="padding-top: 5px">
+            2銆� 濡傛灉鍙槸寤轰竴绾ц彍鍗曟垨绌鸿彍鍗晆rl涓嶇敤濉啓,銆愯鍥�/琛ㄥ悕銆戝~鍐�.鎴栬��/
+          </div>
+        </el-alert>
+        <div style="padding: 0px 30px 0 20px">
+          <vol-form class="form-content"
+                    ref="form"
+                    :formRules="options"
+                    :formFields="fields">
+          </vol-form>
+          <div>
+            <div class="auth-group">
+              <label style="width: 100px">鏉冮檺鎸夐挳锛�</label>
+              <div class="ck">
+                <el-checkbox-group v-model="actions">
+                  <el-checkbox v-for="(item, index) in action"
+                               :key="index"
+                               :label="item.value">{{ item.text + "(" + item.value + ")" }}</el-checkbox>
+                </el-checkbox-group>
+              </div>
+            </div>
+          </div>
+          <div style="padding-left: 100px">
+            <el-button @click="handleCheckAll"
+                       size="small"
+                       type="success"
+                       plain><i class="el-icon-check"></i>鍏� 閫�</el-button>
+            <el-button @click="actionModel = true"
+                       size="small"
+                       type="primary"
+                       plain><i class="el-icon-plus"></i>鍏朵粬鏉冮檺</el-button>
+          </div>
+          <div class="m-btn">
+            <el-button type="primary"
+                       @click="save"><i class="el-icon-check"></i>淇濆瓨</el-button>
+            <el-button type="success"
+                       @click="add"><i class="el-icon-plus"></i>鏂板缓</el-button>
+            <el-button type="warning"
+                       @click="addChild"><i class="el-icon-plus"></i>娣诲姞瀛愮骇</el-button>
+            <el-button type="primary"
+                       plain
+                       @click="addBrother"><i class="el-icon-circle-plus"></i> 娣诲姞鍚岀骇</el-button>
+            <el-button type="warning"
+                       plain
+                       @click="delMenu"><i class="el-icon-delete"></i> 鍒犻櫎鑿滃崟</el-button>
+          </div>
+        </div>
+      </el-scrollbar>
+    </div>
+  </div>
+</template>
+<script type="jsx">
+import VolForm from "@/components/basic/VolForm.vue";
+import VolBox from "@/components/basic/VolBox.vue";
+import Icons from "@/components/basic/Icons.vue";
+import VolMenu from "@/components/basic/VolElementMenu.vue";
+import {
+  defineComponent,
+  reactive,
+  ref,
+  toRefs,
+  onMounted,
+  h,
+  resolveComponent,
+} from "vue";
+
+import http from "@/api/http";
+export default defineComponent({
+  components: {
+    VolForm: VolForm,
+    VolBox: VolBox,
+    Icons: Icons,
+    VolMenu,
+  },
+  methods: {
+    otherAction () {
+      this.$refs.actionForm.validate(() => {
+        let exist = this.action.some((x) => {
+          return (
+            x.text == this.actionFields.name ||
+            x.value == this.actionFields.value
+          );
+        });
+        if (exist) {
+          return this.$message.error("鏉冮檺鍚嶇О鎴栨潈闄愬�煎凡瀛樺湪");
+        }
+        this.actionModel = false;
+        this.action.push({
+          text: this.actionFields.name,
+          value: this.actionFields.value,
+        });
+      });
+    },
+    handleCheckAll () {
+      if (this.actions == this.action.length) {
+        this.checkAll = false;
+      } else {
+        this.checkAll = !this.checkAll;
+      }
+      if (this.checkAll) {
+        this.actions = this.action.map((x) => {
+          return x.value;
+        });
+      } else {
+        this.actions = [];
+      }
+    },
+    checkAllGroupChange (data) {
+      if (data.length === this.action.length) {
+        this.checkAll = true;
+      } else if (data.length > 0) {
+        this.checkAll = false;
+      } else {
+        this.checkAll = false;
+      }
+    },
+    add (obj) {
+      this.$refs.form.reset(
+        Object.assign({ enable: 1 }, obj || { parentId: 0 })
+      );
+      this.icon = "";
+      // this.actions = [];
+      //2020.08.07鏂板缓鑿滃崟鏃讹紝榛樿閫変腑鏌ヨ鎸夐挳鏉冮檺
+      this.actions = ["Search"];
+    },
+    addChild () {
+      if (!this.isSelect()) return;
+      this.add({ parentId: this.fields.menuId });
+    },
+    addBrother () {
+      if (!this.isSelect()) return;
+      this.add({ parentId: this.fields.parentId });
+    },
+    delMenu () {
+      //2020.08.07澧炲姞鑿滃崟鍒犻櫎鍔熻兘
+      if (this.fields.menuId == 0) {
+        return this.$Message.error("璇烽�夋嫨鑿滃崟");
+      }
+
+      let tigger = false;
+      this.$confirm(
+        "纭瑕佸垹闄ゃ��" + this.fields.menuName + "銆戣彍鍗曞悧锛�",
+        "璀﹀憡",
+        {
+          confirmButtonText: "纭畾",
+          cancelButtonText: "鍙栨秷",
+          type: "warning",
+          center: true,
+        }
+      ).then(() => {
+        if (tigger) return;
+        tigger = true;
+        let menuId = this.fields.menuId;
+        this.http
+          .post("/api/menu/delMenu?menuId=" + menuId, {}, "姝e湪鍒犻櫎鏁版嵁....")
+          .then((x) => {
+            if (!x.status) return this.$Message.error(x.message);
+            this.$refs.form.reset();
+            this.$Message.info(x.message);
+            this.initTree();
+          });
+      });
+    },
+    save () {
+      this.$refs.form.validate(() => {
+        this.fields.auth = "";
+        if (this.actions) {
+          this.fields.auth = this.action.filter((x) => {
+            return this.actions.indexOf(x.value) != -1;
+          });
+        }
+        if (
+          this.fields.auth &&
+          this.fields.auth instanceof Array &&
+          this.fields.auth.length > 0
+        ) {
+          this.fields.auth = JSON.stringify(this.fields.auth);
+        } else {
+          this.fields.auth = "";
+        }
+        this.http.post("/api/menu/save", this.fields, true).then((x) => {
+          if (!x.status) {
+            this.$Message.error(x.message);
+            return;
+          }
+
+          this.$Message.info(x.message);
+          if (this.fields.menuId) {
+            this.tree.forEach((t) => {
+              if (t.id == this.fields.menuId) {
+                t.name = this.fields.menuName;
+                t.orderNo = this.fields.orderNo;
+                t.parentId = this.fields.parentId;
+              }
+            });
+            return;
+          }
+          this.fields.menuId = x.data.menuId;
+          this.fields.createDate = x.data.createDate;
+          this.tree.push({
+            id: x.data.menuId,
+            name: this.fields.menuName,
+            orderNo: this.fields.orderNo,
+            parentId: this.fields.parentId,
+          });
+        });
+      });
+    },
+    isSelect () {
+      let id = this.fields.menuId;
+      if (!id) {
+        this.$message.error("璇烽�夋嫨鑺傜偣");
+        return false;
+      }
+      return true;
+    },
+    onSelect (icon) {
+      this.fields.icon = icon;
+      this.$message.info(icon);
+    },
+    onOpenChange (node) {
+      if (node.length == 0) return;
+      this.getTreeItem(node[node.length > 1 ? node.length - 1 : 0]);
+    }
+  },
+  setup () {
+    const tree = ref([]);
+    const actionValues = ref([]);
+    const action = ref([
+      { text: "鏌ヨ", value: "Search" },
+      { text: "鏂板缓", value: "Add" },
+      { text: "鍒犻櫎", value: "Delete" },
+      { text: "缂栬緫", value: "Update" },
+      { text: "瀵煎叆", value: "Import" },
+      { text: "瀵煎嚭", value: "Export" },
+      { text: "涓婁紶", value: "Upload" },
+      { text: "瀹℃牳", value: "Audit" },
+    ]);
+    const actions = ref([]);
+    actionValues.value = action.value.map((x) => {
+      return x.value;
+    });
+    const initTree = () => {
+      http.post("/api/menu/getMenu", {}, true).then((x) => {
+        x.forEach(item=>{
+          item.icon='el-icon-menu';
+          if (item.menuType==1&&!item.parentId) {
+            item.name="(app)"+item.name;
+          }
+        })
+        tree.value = x;
+      });
+    };
+    onMounted(() => {
+      initTree();
+    });
+    const actionModel = ref(false);
+    const checkAll = ref(false);
+    const model = ref(false);
+
+    const fields = ref({
+      menuId: 0,
+      parentId: 0,
+      menuName: "",
+      tableName: "",
+      url: "",
+      auth: "",
+      icon: "",
+      orderNo: "",
+      enable: 1,
+      menuType:null,
+      createDate: "",
+      creator: "",
+      modifyDate: "",
+    });
+
+    const actionFields = ref({
+      name: "",
+      value: "",
+    });
+    const actionOptions = ref([
+      [
+        {
+          title: "鏉冮檺鍚嶇О",
+          field: "name",
+          placeholder: "鏉冮檺鍚嶇О,濡傦細鏂板",
+          required: true,
+        },
+      ],
+      [
+        {
+          title: "鏉� 闄� 鍊�",
+          field: "value",
+          placeholder: "鏉冮檺鍊�,濡傦細Add",
+          required: true,
+        },
+      ],
+    ]);
+
+    const options = ref([
+      [
+        {
+          title: "鑿� 鍗� ID",
+          field: "menuId",
+          placeholder: "鑿滃崟ID",
+          min: 0,
+          disabled: true,
+        },
+        {
+          title: "鐖� 绾� ID",
+          required: true,
+          type: "number",
+          min: 0,
+          field: "parentId",
+          // min: 0, max: 50
+        },
+        {
+          title: "鑿滃崟鍚嶇О",
+          field: "menuName",
+          required: true,
+        },
+      ],
+      [
+        {
+          title: "瑙嗗浘/琛ㄥ悕",
+          field: "tableName",
+          placeholder: "涓庝唬鐮佺敓鎴愬櫒浣跨敤鐨勫悕绉扮浉鍚�",
+          required: true,
+        },
+        {
+          title: "(璺敱)Url",
+          field: "url",
+          placeholder: "瑙�:涓婇潰鑿滃崟閰嶇疆璇存槑",
+        },
+        {
+          title: "鎺掑簭鍙�",
+          field: "orderNo",
+          type: "number",
+          min: 0,
+          placeholder: "鍊艰秺澶ф樉绀鸿秺闈犲墠",
+          required: true,
+        },
+      ],
+      [
+        {
+          title: "鏄惁鍚敤",
+          field: "enable",
+          required: true,
+          type: "select",
+          colSize: 4,
+          data: [
+            { key: 1, value: "鍚敤" },
+            { key: 2, value: "鍚敤涓嶆樉绀�" },
+            { key: 0, value: "绂佺敤" },
+          ],
+        },  
+        {
+          // 2022.03.26澧炵Щ鍔ㄧ鍔犺彍鍗曠被鍨�
+          title: "鑿滃崟绫诲瀷",
+          field: "menuType",
+          required: true,
+          type: "select",
+          colSize: 4,
+          data: [
+            { key: 0, value: "PC鑿滃崟" },
+            { key: 1, value: "绉诲姩绔彍鍗�" }
+          ],
+        },
+        {
+          title: "鍥炬爣Icon",
+          field: "icon",
+          render: (h) => {
+            return h("div", {}, [
+              h("i", {
+                style: {
+                  "font-size": "25px",
+                  margin: "0px 9px",
+                  position: "relative",
+                  top: "4px",
+                },
+                class: [fields.value.icon],
+              }),
+              h(
+                resolveComponent("el-button"),
+                {
+                  size: "small",
+                  style: { padding: "0px 9px" },
+                  type: "primary",
+                  plain: true,
+                  onClick: () => {
+                    model.value = true;
+                  },
+                },
+                "閫夋嫨鍥炬爣"
+              ),
+            ]);
+          },
+        },
+      ],
+    ]);
+    const refForm = ref();
+    const getTreeItem = (node) => {
+      http.post("api/menu/getTreeItem?menuId=" + node, {}, true).then((x) => {
+        try {
+          fields.value.icon = x.icon;
+          if (x.auth) {
+            x.auth = JSON.parse(x.auth);
+            action.value.splice(8, action.value.length);
+
+            actions.value = x.auth.map((element) => {
+              if (actionValues.value.indexOf(element.value) == -1) {
+                action.value.push(element);
+              }
+              return element.value;
+            });
+          } else {
+            action.value.splice(8, action.value.length);
+            x.auth = [];
+            fields.value.icon = "";
+            actions.value = [];
+          }
+        } catch (error) {
+          console.log("鑿滃崟鍔熻兘鏉冮檺杞崲鎴怞SON澶辫触:" + x.auth);
+          x.auth = [];
+          //   this.icon = "";
+          actions.value = [];
+        }
+        refForm.value.reset(x);
+      });
+    };
+    return {
+      tree,
+      initTree,
+      action,
+      actions,
+      actionValues,
+      actionModel,
+      checkAll,
+      model,
+      fields,
+      actionFields,
+      actionOptions,
+      options,
+      form: refForm,
+      getTreeItem
+    };
+  },
+  data () {
+    return {};
+  },
+});
+</script>
+
+<style lang="less" scoped>
+.on-icon {
+  line-height: 20px;
+  position: relative;
+  .remove {
+    display: none;
+    color: red;
+    right: 7px;
+    position: absolute;
+    top: -14px;
+    font-size: 13px;
+  }
+}
+.on-icon:hover {
+  cursor: pointer;
+  .remove {
+    display: block;
+  }
+}
+.action {
+  width: 100%;
+  display: flex;
+
+  margin-bottom: 15px;
+  .ivu-checkbox-wrapper {
+    margin-right: 20px;
+  }
+  .ck {
+    line-height: 33px;
+    display: inline-block;
+    display: flex;
+    label:first-child {
+      min-width: 58px;
+      float: left;
+      margin-top: 1px;
+    }
+    > div {
+      float: left;
+    }
+  }
+}
+
+.menu-container {
+  display: flex;
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  padding: 8px;
+  background: #f7f7f7;
+  .menu-left {
+    height: 100%;
+    width: 201px;
+    border: 1px solid #eee;
+    display: flex;
+    background: white;
+    flex-direction: column;
+    .module-name {
+      border-radius: 0px;
+      /* height: 5%; */
+      line-height: 21px;
+      margin-bottom: 0;
+    }
+  }
+  .menu-right {
+    flex: 1;
+    border-radius: 3px;
+    border: 1px solid #eee;
+    background: white;
+    margin-left: 9px;
+    margin-right: 3px;
+  }
+}
+.m-btn {
+  margin-top: 20px;
+  text-align: center;
+}
+.m-title {
+  line-height: 40px;
+  font-size: 15px;
+  background: #66b1ff0f;
+  font-weight: bold;
+  padding: 6px 16px;
+  border-bottom: 1px solid #eee;
+  i {
+    padding-right: 5px;
+  }
+}
+.form-content {
+  margin-top: 30px;
+}
+.menu-left ::v-deep(.el-scrollbar__bar.is-vertical) {
+  width: 2px;
+}
+.auth-group {
+  display: flex;
+  label {
+    display: inline-block;
+    width: 100px;
+    text-align: right;
+    color: #797979;
+    font-size: 14px;
+  }
+  .ck {
+    flex: 1;
+  }
+  .el-checkbox {
+    min-width: 105px;
+    width: auto !important;
+    margin-right: 5px;
+    display: inline-block;
+    padding-bottom: 10px;
+  }
+}
+.auth-group ::v-deep(.el-checkbox__label) {
+  padding-left: 4px;
+}
+</style>
+
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Role.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Role.vue
new file mode 100644
index 0000000..b5da209
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_Role.vue
@@ -0,0 +1,72 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/system/Sys_Role.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/system/Sys_Role.jsx";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'Role_Id',
+                footer: "Foots",
+                cnName: '瑙掕壊绠$悊',
+                name: 'Sys_Role',
+                url: "/Sys_Role/",
+                sortName: "Role_Id"
+            });
+            const editFormFields = ref({"ParentId":[],"RoleName":"","DeptName":"","Enable":"","Creator":"","CreateDate":"","Modifier":"","ModifyDate":""});
+            const editFormOptions = ref([[{"dataKey":"tree_roles","data":[],"title":"鐖剁骇ID","required":true,"field":"ParentId","type":"cascader"},
+                               {"title":"瑙掕壊鍚嶇О","required":true,"field":"RoleName"}],
+                              [{"title":"閮ㄩ棬鍚嶇О","field":"DeptName"},
+                               {"dataKey":"enable","data":[],"title":"鏄惁鍚敤","field":"Enable","type":"switch"}],
+                              [{"title":"鍒涘缓浜�","field":"Creator","disabled":true},
+                               {"title":"鍒涘缓鏃堕棿","field":"CreateDate","disabled":true,"type":"datetime"}],
+                              [{"title":"淇敼浜�","field":"Modifier","disabled":true},
+                               {"title":"淇敼鏃堕棿","field":"ModifyDate","disabled":true}]]);
+            const searchFormFields = ref({"RoleName":"","DeptName":"","Enable":"","CreateDate":"","ModifyDate":""});
+            const searchFormOptions = ref([[{"title":"瑙掕壊鍚嶇О","field":"RoleName","type":"text"},{"title":"閮ㄩ棬鍚嶇О","field":"DeptName","type":"text"},{"dataKey":"enable","data":[],"title":"鏄惁鍚敤","field":"Enable","type":"select"}],[{"title":"鍒涘缓鏃堕棿","field":"CreateDate","type":"datetime"},{"title":"淇敼鏃堕棿","field":"ModifyDate","type":"datetime"}]]);
+            const columns = ref([{field:'roleId',title:'瑙掕壊ID',type:'int',width:70,readonly:true,require:true,align:'left',sortable:true},
+                       {field:'parentId',title:'鐖剁骇ID',type:'int',bind:{ key:'tree_roles',data:[]},width:70,require:true,align:'left'},
+                       {field:'roleName',title:'瑙掕壊鍚嶇О',type:'string',link:true,width:90,require:true,align:'left'},
+                       {field:'deptId',title:'閮ㄩ棬ID',type:'int',width:90,hidden:true,align:'left'},
+                       {field:'deptName',title:'閮ㄩ棬鍚嶇О',type:'string',width:90,align:'left'},
+                       {field:'enable',title:'鏄惁鍚敤',type:'byte',bind:{ key:'enable',data:[]},width:90,align:'left'},
+                       {field:'orderNo',title:'鎺掑簭',type:'int',width:90,hidden:true,align:'left'},
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',width:130,readonly:true,align:'left'},
+                       {field:'createDate',title:'鍒涘缓鏃堕棿',type:'datetime',width:90,readonly:true,align:'left',sortable:true},
+                       {field:'modifier',title:'淇敼浜�',type:'string',width:130,readonly:true,align:'left'},
+                       {field:'modifyDate',title:'淇敼鏃堕棿',type:'datetime',width:90,readonly:true,align:'left',sortable:true}]);
+            const detail = ref({
+                cnName: "#detailCnName",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_User.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_User.vue
new file mode 100644
index 0000000..bc1efce
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/Sys_User.vue
@@ -0,0 +1,89 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/system/Sys_User.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend">
+    </view-grid>
+</template>
+<script>
+import extend from "@/extension/system/Sys_User.jsx";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'user_Id',
+            footer: "Foots",
+            cnName: '鐢ㄦ埛绠$悊',
+            name: 'Sys_User',
+            url: "/Sys_User/",
+            sortName: "user_Id"
+        });
+        const editFormFields = ref({ "userName": "", "userTrueName": "", "role_Id": [], "deptIds": "", "enable": "", "gender": "", "remark": "", "headImageUrl": "", "systemType": "" });
+        const editFormOptions = ref([[{ "title": "甯愬彿", "required": true, "field": "userName", "disabled": true }],
+        [{ "title": "濮撳悕", "required": true, "field": "userTrueName", "type": "text" }],
+        [{ "dataKey": "tree_roles", "data": [], "title": "瑙掕壊", "required": true, "field": "role_Id", "type": "cascader" }],
+        [{ "dataKey": "缁勭粐鏈烘瀯", "data": [], "title": "缁勭粐鏋勬灦", "field": "deptIds", "colSize": 12, "type": "treeSelect" }],
+        [{ "dataKey": "enable", "data": [], "title": "鏄惁鍙敤", "required": true, "field": "enable", "type": "select" }],
+        [{ "dataKey": "gender", "data": [], "title": "鎬у埆", "field": "gender", "type": "select" }],
+        [{ "title": "澶囨敞", "field": "remark", "colSize": 12, "type": "textarea" }],
+        [{ "title": "澶村儚", "field": "headImageUrl", "type": "img" }],
+        [{ "title": "绯荤粺", "field": "systemType", "type": "text", "required": true }]]);
+        const searchFormFields = ref({ "UserName": "", "UserTrueName": "", "Gender": "", "DeptName": "", "Role_Id": [], "Token": "", "AppType": [], "CreateDate": "", "IsRegregisterPhone": "", "PhoneNo": "", "Enable": "", "LastLoginDate": "", "Address": "", "Email": "" });
+        const searchFormOptions = ref([[{ "title": "甯愬彿", "field": "UserName" }, { "title": "濮撳悕", "field": "UserTrueName" }, { "dataKey": "gender", "data": [], "title": "鎬у埆", "field": "Gender", "type": "select" }], [{ "title": "涓嶇敤", "field": "DeptName" }, { "dataKey": "tree_roles", "data": [], "title": "瑙掕壊", "field": "Role_Id", "type": "select" }, { "title": "Token", "field": "Token" }], [{ "dataKey": "ut", "data": [], "title": "绫诲瀷", "field": "AppType", "type": "selectList" }, { "dataKey": "isphone", "data": [], "title": "鎵嬫満鐢ㄦ埛", "field": "IsRegregisterPhone", "type": "select" }, { "title": "鎵嬫満鍙�", "field": "PhoneNo" }], [{ "dataKey": "enable", "data": [], "title": "鏄惁鍙敤", "field": "Enable", "type": "select" }, { "title": "鍦板潃", "field": "Address" }, { "title": "Email", "field": "Email" }], [{ "title": "娉ㄥ唽鏃堕棿", "field": "CreateDate", "type": "datetime" }, { "title": "鏈�鍚庣櫥闄嗘椂闂�", "field": "LastLoginDate", "type": "datetime" }]]);
+        const columns = ref([{ field: 'user_Id', title: 'User_Id', type: 'int', width: 90, hidden: true, readonly: true, require: true, align: 'left' },
+        { field: 'userName', title: '甯愬彿', type: 'string', link: true, width: 120, readonly: true, require: true, align: 'left', sort: true },
+        { field: 'userTrueName', title: '濮撳悕', type: 'string', width: 120, require: true, align: 'left' },
+        { field: 'gender', title: '鎬у埆', type: 'int', bind: { key: 'gender', data: [] }, width: 80, align: 'left' },
+        { field: 'headImageUrl', title: '澶村儚', type: 'img', width: 90, align: 'left' },
+        { field: 'dept_Id', title: '涓嶇敤', type: 'int', width: 90, hidden: true, align: 'left' },
+        { field: 'deptName', title: '涓嶇敤', type: 'string', width: 150, hidden: true, align: 'left' },
+        { field: 'role_Id', title: '瑙掕壊', type: 'int', bind: { key: 'tree_roles', data: [] }, width: 130, require: true, align: 'left' },
+        { field: 'roleName', title: '涓嶇敤', type: 'string', width: 90, hidden: true, align: 'left' },
+        { field: 'token', title: 'Token', type: 'string', width: 180, hidden: true, align: 'left' },
+        { field: 'appType', title: '绫诲瀷', type: 'int', bind: { key: 'ut', data: [] }, width: 150, hidden: true, align: 'left' },
+        { field: 'deptIds', title: '缁勭粐鏋勬灦', type: 'string', bind: { key: '缁勭粐鏈烘瀯', data: [] }, width: 140, hidden: true, align: 'left' },
+        { field: 'createDate', title: '娉ㄥ唽鏃堕棿', type: 'datetime', width: 150, readonly: true, align: 'left', sort: true },
+        { field: 'isRegregisterPhone', title: '鎵嬫満鐢ㄦ埛', type: 'int', bind: { key: 'isphone', data: [] }, width: 120, hidden: true, align: 'left' },
+        { field: 'phoneNo', title: '鎵嬫満鍙�', type: 'string', width: 150, hidden: true, align: 'left' },
+        { field: 'tel', title: 'Tel', type: 'string', width: 90, hidden: true, align: 'left' },
+        { field: 'createID', title: 'CreateID', type: 'int', width: 90, hidden: true, align: 'left' },
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', width: 130, readonly: true, align: 'left' },
+        { field: 'enable', title: '鏄惁鍙敤', type: 'byte', bind: { key: 'enable', data: [] }, width: 90, require: true, align: 'left' },
+        { field: 'modifyID', title: 'ModifyID', type: 'int', width: 90, hidden: true, align: 'left' },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', width: 130, hidden: true, readonly: true, align: 'left' },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', width: 90, hidden: true, readonly: true, align: 'left', sort: true },
+        { field: 'auditStatus', title: '瀹℃牳鐘舵��', type: 'int', bind: { key: 'audit', data: [] }, width: 90, hidden: true, align: 'left' },
+        { field: 'auditor', title: '瀹℃牳浜�', type: 'string', width: 90, hidden: true, align: 'left' },
+        { field: 'auditDate', title: '瀹℃牳鏃堕棿', type: 'datetime', width: 150, hidden: true, align: 'left', sort: true },
+        { field: 'lastLoginDate', title: '鏈�鍚庣櫥闄嗘椂闂�', type: 'datetime', width: 150, hidden: true, align: 'left', sort: true },
+        { field: 'lastModifyPwdDate', title: '鏈�鍚庡瘑鐮佷慨鏀规椂闂�', type: 'datetime', width: 150, hidden: true, align: 'left', sort: true },
+        { field: 'address', title: '鍦板潃', type: 'string', width: 190, hidden: true, align: 'left' },
+        { field: 'mobile', title: '鐢佃瘽', type: 'string', width: 140, hidden: true, align: 'left' },
+        { field: 'email', title: 'Email', type: 'string', width: 140, hidden: true, align: 'left' },
+        { field: 'remark', title: '澶囨敞', type: 'string', width: 180, hidden: true, align: 'left' },
+        { field: 'orderNo', title: '鎺掑簭鍙�', type: 'int', width: 90, hidden: true, align: 'left' }]);
+        const detail = ref({
+            cnName: "#detailCnName",
+            table: "#detailTable",
+            columns: [],
+            sortName: "",
+            key: ""
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/UserInfo.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/UserInfo.vue
new file mode 100644
index 0000000..5faa0ed
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/UserInfo.vue
@@ -0,0 +1,281 @@
+<template>
+  <input ref="input" type="file" accept=".png, .jpg, .jpeg" style="display: none" @change="handleChange"
+    :multiple="false" />
+  <VolBox :width="500" :height="270" v-model="modifyOptions.model" title="淇敼瀵嗙爜">
+    <div style="padding:10px;20px;">
+      <VolForm ref="pwd" :formRules="modifyOptions.data" :formFields="modifyOptions.fields"></VolForm>
+    </div>
+    <template #footer>
+      <div style="text-align: center;">
+        <el-button type="primary" plain size="mini" long @click="savePwd">淇濆瓨</el-button>
+      </div>
+    </template>
+  </VolBox>
+  <div class="user-info">
+    <div class="user-content">
+      <div class="left">
+        <div>
+          <img class="header-img" @click="showUpload" :src="http.ipAddress + userInfo.headImageUrl" :onerror="errorImg" />
+          <div class="text">
+            <p class="name">
+              <span style="font-size: 13px">{{ userInfo.userName }}</span>
+            </p>
+            <p class="date">
+              <span>娉ㄥ唽鏃ユ湡锛歿{ userInfo.createDate }}</span>
+            </p>
+            <p>
+              <el-button type="error" @click="modifyPwd" size="small" plain long>淇敼瀵嗙爜</el-button>
+              <el-button style="padding: 3px 16px" @click="showUpload" plain type="primary" size="mini"
+                ghost>淇敼澶村儚</el-button>
+            </p>
+          </div>
+        </div>
+      </div>
+      <div class="right">
+        <vol-form ref="form" :load-key="true" :width="500" :formRules="editFormOptions" :formFields="userInfo">
+          <div class="footer">
+            <el-button style="margin-top: 2px" type="primary" size="small" long @click="modifyInfo">淇濆瓨</el-button>
+          </div>
+        </vol-form>
+      </div>
+    </div>
+
+  </div>
+</template>
+<script>
+import VolForm from "@/components/basic/VolForm.vue";
+import VolBox from "@/components/basic/VolBox.vue";
+export default {
+  components: {
+    VolForm,
+    VolBox,
+  },
+  methods: {
+    modifyPwd() {
+      this.modifyOptions.model = true;
+    },
+    savePwd() {
+      if (!this.$refs.pwd.validate()) return;
+      if (
+        this.modifyOptions.fields.newPwd != this.modifyOptions.fields.newPwd1
+      ) {
+        return this.$message.error("涓ゆ瀵嗙爜涓嶄竴鑷�");
+      }
+      let url =
+        "/api/Sys_User/modifyPwd?oldPwd=" +
+        this.modifyOptions.fields.oldPwd +
+        "&newPwd=" +
+        this.modifyOptions.fields.newPwd;
+      this.http.post(url, {}, true).then((x) => {
+        if (!x.status) {
+          return this.$message.error(x.message);
+        }
+        this.modifyOptions.model = false;
+        this.$Message.success(x.message);
+        this.$refs.pwd.reset();
+      });
+    },
+    modifyInfo() {
+      this.$refs.form.validate(() => {
+        this.http.post('api/Sys_User/updateUserInfo', this.userInfo).then(result => {
+          this.$message.success(result);
+          let userInfo = this.$store.getters.getUserInfo();
+          userInfo.img = this.userInfo.headImageUrl;
+          userInfo.userName = this.userInfo.userTrueName;
+          this.$store.commit('setUserInfo', userInfo);
+        })
+      })
+
+    },
+    showUpload() {
+      this.$refs.input.click();
+    },
+    handleChange(e) {
+      var forms = new FormData();
+      let file = e.target.files[0]
+      forms.append('fileInput', file, file.name);
+      const url = 'api/Sys_User/upload'
+      this.http
+        .post(url, forms, true, {
+          headers:{'Content-Type':'multipart/form-data'}
+        })
+        .then(
+          (x) => {
+            this.userInfo.headImageUrl = x.data + file.name;
+            this.modifyInfo();
+          }
+        );
+    }
+  },
+  created() {
+    this.http.post("/api/Sys_User/getCurrentUserInfo", {}, true).then((x) => {
+      if (!x.status) {
+        return this.$message(x.message);
+      }
+      x.data.createDate = (x.data.createDate || "").replace("T", " ");
+      x.data.gender = x.data.gender + "";
+      this.$refs.form.reset(x.data);
+      this.userInfo.img = this.base.getImgSrc(
+        x.data.headImageUrl,
+        this.http.ipAddress
+      );
+      Object.assign(this.userInfo, x.data);
+    });
+  },
+  data() {
+    return {
+      
+      errorImg:new URL('@/assets/imgs/error-img.png', import.meta.url).href,
+      // 'this.src="' + require("@/assets/imgs/error-img.png") + '"',
+      modifyOptions: {
+        model: false,
+        fields: { oldPwd: "", newPwd: "", newPwd1: "" },
+        data: [
+          [
+            {
+              columnType: "string",
+              required: true,
+              type: "password",
+              title: "鏃у瘑鐮�",
+              field: "oldPwd",
+            },
+          ],
+          [
+            {
+              type: "password",
+              required: true,
+              title: "鏂板瘑鐮�",
+              field: "newPwd",
+            },
+          ],
+          [
+            {
+              type: "password",
+              required: true,
+              title: "纭瀵嗙爜",
+              field: "newPwd1",
+            },
+          ],
+        ],
+      },
+      userInfo: {
+        headImageUrl: "",
+        createDate: "--",
+        userName: "--",
+        userTrueName: "",
+        remark: "",
+        email: "",
+        phoneNo: "",
+      },
+      editFormOptions: [
+        [
+          {
+            columnType: "string",
+            title: "璐﹀彿",
+            field: "userName",
+            disabled: true,
+          },
+        ],
+        [
+          {
+            columnType: "string",
+            title: "濮撳悕",
+            field: "userTrueName",
+            required: true,
+            type: "text",
+          },
+        ],
+        [
+          {
+            dataKey: "gender",
+            title: "鎬у埆",
+            field: "gender",
+            data: [],
+            type: "select",
+          },
+        ],
+        [
+          {
+            columnType: "string",
+            title: "澶囨敞",
+            field: "remark",
+            colSize: 12,
+            type: "textarea",
+          },
+        ],
+      ],
+    };
+  },
+};
+</script>
+
+<style lang="less" scoped>
+img[src=""],
+img:not([src]) {
+  opacity: 0;
+}
+
+.user-content {
+  display: flex;
+}
+
+.user-info {
+
+  position: absolute;
+  justify-content: center;
+  align-items: center;
+  display: flex;
+  margin: 0 auto;
+  left: 0;
+  // width: 950px;
+  right: 0;
+  text-align: center;
+  padding: 0px;
+
+  height: 100%;
+
+  .text {
+    padding: 5px;
+
+    .name {
+      font-weight: bolder;
+      font-size: 15px;
+      font-weight: 900;
+    }
+  }
+
+  .header-img {
+    object-fit: cover;
+    height: 150px;
+    width: 150px;
+    border-radius: 50%;
+    margin-right: 0px;
+    top: 4px;
+    position: relative;
+    border: 1px solid #dfdfdf;
+    cursor: pointer;
+  }
+
+  .left {
+    width: 320px;
+    border-right: 1px solid #eee;
+    // box-shadow: #d6d6d6 7px 4px 20px;
+    // flex: 1;
+  }
+
+  .right {
+    padding-left: 30px;
+    width: 400px;
+    // background: #fefefe;
+    // flex: 3;
+  }
+}
+
+.date {
+  letter-spacing: 0px;
+  font-size: 12px;
+  color: #282828;
+}
+</style>
+
+
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/system/Sys_Department.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/system/Sys_Department.vue
new file mode 100644
index 0000000..0266ca6
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/system/Sys_Department.vue
@@ -0,0 +1,71 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/system/system/Sys_Department.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/system/system/Sys_Department.jsx";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'DepartmentId',
+                footer: "Foots",
+                cnName: '缁勭粐鏋舵瀯',
+                name: 'system/Sys_Department',
+                url: "/Sys_Department/",
+                sortName: "CreateDate"
+            });
+            const editFormFields = ref({"DepartmentName":"","DepartmentCode":"","ParentId":[],"Remark":""});
+            const editFormOptions = ref([[{"title":"缁勭粐鍚嶇О","required":true,"field":"DepartmentName"}],
+                              [{"title":"缁勭粐缂栧彿","field":"DepartmentCode"}],
+                              [{"dataKey":"缁勭粐鏈烘瀯","data":[],"title":"涓婄骇缁勭粐","field":"ParentId","type":"cascader"}],
+                              [{"title":"澶囨敞","field":"Remark","type":"textarea"}]]);
+            const searchFormFields = ref({"DepartmentName":"","DepartmentCode":"","Creator":"","CreateDate":""});
+            const searchFormOptions = ref([[{"title":"缁勭粐鍚嶇О","field":"DepartmentName","type":"like"},{"title":"缁勭粐缂栧彿","field":"DepartmentCode"},{"title":"鍒涘缓浜�","field":"Creator"},{"title":"鍒涘缓鏃堕棿","field":"CreateDate","type":"datetime"}]]);
+            const columns = ref([{field:'DepartmentId',title:'DepartmentId',type:'guid',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'DepartmentName',title:'缁勭粐鍚嶇О',type:'string',link:true,width:180,require:true,align:'left',sort:true},
+                       {field:'DepartmentCode',title:'缁勭粐缂栧彿',type:'string',width:90,align:'left'},
+                       {field:'ParentId',title:'涓婄骇缁勭粐',type:'guid',bind:{ key:'缁勭粐鏈烘瀯',data:[]},width:110,hidden:true,align:'left'},
+                       {field:'DepartmentType',title:'缁勭粐绫诲瀷',type:'string',width:110,hidden:true,align:'left'},
+                       {field:'Enable',title:'鏄惁鍙敤',type:'int',width:110,hidden:true,align:'left'},
+                       {field:'Remark',title:'澶囨敞',type:'string',width:100,align:'left'},
+                       {field:'CreateID',title:'CreateID',type:'int',width:100,hidden:true,align:'left'},
+                       {field:'Creator',title:'鍒涘缓浜�',type:'string',width:90,align:'left'},
+                       {field:'CreateDate',title:'鍒涘缓鏃堕棿',type:'datetime',width:145,align:'left',sort:true},
+                       {field:'ModifyID',title:'ModifyID',type:'int',width:100,hidden:true,align:'left'},
+                       {field:'Modifier',title:'淇敼浜�',type:'string',width:90,align:'left'},
+                       {field:'ModifyDate',title:'淇敼鏃堕棿',type:'datetime',width:140,align:'left',sort:true}]);
+            const detail = ref({
+                cnName: "#detailCnName",
+                table: "#detailTable",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/test.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/test.vue
new file mode 100644
index 0000000..64786be
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/system/test.vue
@@ -0,0 +1,18 @@
+<template>
+
+</template>
+
+<script>
+export default {
+  props:{
+        list: {
+      type: Array,
+      default: [],
+    },
+  }
+}
+</script>
+
+<style>
+
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/Extend/Add.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/Extend/Add.vue
new file mode 100644
index 0000000..230e978
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/Extend/Add.vue
@@ -0,0 +1,76 @@
+<template>
+    <div>
+        <vol-box v-model="showDetialBox" :lazy="true" :height="350" :width="600" :padding="15" title="鏂欐灞炴�х淮鎶�">
+            <el-form :inline="true" :model="TrayBarcodePropertys" label-width="auto" class="demo-form-inline">
+                <el-form-item label="鏂欐灞炴��:">
+                    <el-input v-model="TrayBarcodePropertys.TrayBarcodeProperty" placeholder="鏂欐灞炴��" />
+                </el-form-item>
+                <el-form-item label="鎵樼洏瀹归噺:">
+                    <el-input v-model="TrayBarcodePropertys.Capacity" placeholder="鎵樼洏瀹归噺" />
+                </el-form-item>
+                <el-button @click="addProductType" type="primary">娣诲姞浜у搧宸ュ簭</el-button>
+                <el-button @click="save" type="success">鎻愪氦鏁版嵁</el-button>
+                <el-row>
+                    <el-col :span="12">
+                        <el-form-item label="宸ュ簭:" v-for="(input, index) in TrayBarcodePropertys.ProcessCodes"
+                            :key="index">
+                            <el-input v-model="input.ProcessCode" placeholder="宸ュ簭" />
+                        </el-form-item>
+                    </el-col>
+                    <el-col :span="12">
+                        <el-form-item label="浜у搧绫诲瀷:" v-for="(input, index) in TrayBarcodePropertys.ProductTypes"
+                            :key="index">
+                            <el-input v-model="input.ProductType" placeholder="浜у搧绫诲瀷" />
+                        </el-form-item>
+                    </el-col>
+                </el-row>
+            </el-form>
+        </vol-box>
+    </div>
+</template>
+
+<script>
+import VolBox from "@/components/basic/VolBox.vue";
+import http from "@/../src/api/http.js";
+export default {
+    components: { VolBox },
+    data() {
+        return {
+            showDetialBox: false,
+            TrayBarcodePropertys: {
+                TrayBarcodeProperty: '',
+                Capacity: 0,
+                ProcessCodes: [{ ProcessCode: '', }],
+                ProductTypes: [{ ProductType: '', }]
+            }
+        }
+    },
+    methods: {
+        addProductType() {
+            this.TrayBarcodePropertys.ProductTypes.push({ ProductType: '' })
+            this.TrayBarcodePropertys.ProcessCodes.push({ ProcessCode: '' })
+        },
+        open() {
+            this.showDetialBox = true
+        },
+        save() {
+            console.log(this.TrayBarcodePropertys)
+            let data = ({...this.TrayBarcodePropertys, ProcessCodes:JSON.stringify(this.TrayBarcodePropertys.ProcessCodes) , ProductTypes:JSON.stringify(this.TrayBarcodePropertys.ProductTypes)});
+            
+            debugger;
+            http.post('api/Production/AddData', data).then(res => {
+                if (res.code == 200) {
+                    // ElMessage.success(res.msg)
+                    this.$message.success('娣诲姞鎴愬姛')
+                    this.$parent.load();
+                } else {
+                    // ElMessage.error(res.msg)
+                    this.$message.error(x.message)
+                }
+            })
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/ProductionModel.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/ProductionModel.vue
new file mode 100644
index 0000000..1a82e6e
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/ProductionModel.vue
@@ -0,0 +1,68 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/material/Dt_MaterielInfo.js姝ゅ缂栧啓
+ -->
+ <template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend">
+    </view-grid>
+</template>
+<script>
+import extend from "./ProductionModel.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'materielID',
+            footer: "Foots",
+            cnName: '鏂欐灞炴��',
+            name: 'ProductionModel',
+            url: "/Production/",
+            sortName: "MaterielID"
+        });
+        const editFormFields = ref({
+            "TrayBarcodeProperty": "",
+            "Capacity": "",
+
+        });
+        const editFormOptions = ref([
+            [
+                { "title": "鏂欐灞炴��", "field": "TrayBarcodeProperty", type: "text" },
+                { "title": "鎵樼洏瀹归噺", "field": "Capacity", type: "text" },
+            ]
+        ]);
+        const searchFormFields = ref({});
+        const searchFormOptions = ref([
+            [
+                { "title": "鏂欐灞炴��", "field": "TrayBarcodeProperty", type: "text" },
+                { "title": "鎵樼洏瀹归噺", "field": "Capacity", type: "text" },
+            ]
+        ]);
+        const columns = ref([{ field: 'id', title: 'ID', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
+        { field: 'trayBarcodeProperty', title: '鏂欐灞炴��', type: 'string', width: 110, align: 'left', sort: true },
+        { field: 'processCodes', title: '宸ュ簭闆嗗悎', type: 'string', width: 120, align: 'left' },
+        { field: 'productTypes', title: '鐗╂枡缂栫爜/宸ヨ壓鍨嬪彿闆嗗悎', type: 'string', width: 110, align: 'left' },
+        { field: 'capacity', title: '鎵樼洏瀹归噺', type: 'string', width: 110, align: 'left' }]);
+        const detail = ref({
+            cnName: "#detailCnName",
+            table: "#detailTable",
+            columns: [],
+            sortName: "",
+            key: ""
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/momTest.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/momTest.vue
new file mode 100644
index 0000000..f7ad642
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/momTest.vue
@@ -0,0 +1,364 @@
+<template>
+    <div>
+        <el-card>
+
+            <el-row>
+                <el-col :span="24">
+                    <el-form :inline="true" :model="form" label-width="auto" class="demo-form-inline">
+                        <el-form-item label="浼氳瘽ID:">
+                            <el-input v-model="form.SessionId" placeholder="浼氳瘽ID" />
+                        </el-form-item>
+                        <el-form-item label="涓婁綅鏈鸿蒋浠跺悕绉�:">
+                            <el-input v-model="form.Software" placeholder="涓婁綅鏈鸿蒋浠跺悕绉�" />
+                        </el-form-item>
+                        <el-form-item label="璁惧缂栧彿:">
+                            <el-input v-model="form.EquipmentCode" placeholder="璁惧缂栧彿" />
+                        </el-form-item>
+                        <el-form-item label="浜哄憳宸ュ彿:">
+                            <el-input v-model="form.EmployeeNo" placeholder="浜哄憳宸ュ彿" />
+                        </el-form-item>
+                        <el-form-item label="璇锋眰鏃堕棿:">
+                            <el-date-picker v-model="form.RequestTime" type="datetime" placeholder="閫夋嫨鏃堕棿" clearable />
+                        </el-form-item>
+                    </el-form>
+                </el-col>
+            </el-row>
+        </el-card>
+        <el-row>
+            <el-col :span="12">
+                <el-card>
+                    <div class="header">
+                        <el-text> 鎵樼洏鍗曠數鑺В缁�</el-text>&nbsp;&nbsp;
+                        <el-button @click="addTrayCellUnbind" type="primary">娣诲姞鐢佃姱</el-button>
+                        <el-button @click="subimtTrayCellUnbind" type="success">鎻愪氦鏁版嵁</el-button>
+                    </div>
+                    <el-form :inline="true" :model="TrayCellUnbind" label-width="auto" class="demo-form-inline">
+                        <el-form-item label="鎵樼洏缂栧彿:">
+                            <el-input v-model="TrayCellUnbind.TrayBarcode" placeholder="鎵樼洏缂栧彿" />
+                        </el-form-item>
+                        <el-form-item v-for="(input, index) in TrayCellUnbind.SerialNos" :key="index" label="鐢佃姱鍙�:">
+                            <el-input v-model="input.SerialNo" placeholder="鐢佃姱鍙�" />
+                        </el-form-item>
+                    </el-form>
+                </el-card>
+            </el-col>
+            <el-col :span="12">
+                <el-card>
+                    <div class="header">
+                        <el-text> 鏁寸洏鐢佃姱瑙g粦</el-text>&nbsp;&nbsp;
+                        <el-button @click="subimtTrayUnbind" type="success">鎻愪氦鏁版嵁</el-button>
+                    </div>
+                    <el-form :inline="true" :model="TrayUnbind" label-width="auto" class="demo-form-inline">
+                        <el-form-item label="鎿嶄綔妯″紡:">
+                            <el-input v-model="TrayUnbind.OpFlag" placeholder="鎿嶄綔妯″紡" />
+                        </el-form-item>
+                        <el-form-item label="鎵樼洏缂栧彿:">
+                            <el-input v-model="TrayUnbind.TrayBarcode" placeholder="鎵樼洏缂栧彿" />
+                        </el-form-item>
+                    </el-form>
+                </el-card>
+            </el-col>
+        </el-row>
+        <el-row>
+            <el-col :span="12">
+                <el-card>
+                    <div class="header">
+                        <el-text> 鍗曠數鑺睘鎬ц幏鍙�</el-text>&nbsp;&nbsp;
+                        <el-button @click="addCellState" type="primary">娣诲姞鐢佃姱</el-button> <el-button
+                            @click="subimtSerialNoGet" type="success">鎻愪氦鏁版嵁</el-button>
+                    </div>
+                    <el-form :inline="true" :model="CellStateinputs" label-width="auto" class="demo-form-inline">
+                        <el-form-item v-for="(input, index) in CellStateinputs.SerialNos" :key="index" label="鐢佃姱鍙�:">
+                            <el-input v-model="input.SerialNo" placeholder="鐢佃姱鍙�" />
+                        </el-form-item>
+                    </el-form>
+                </el-card>
+            </el-col>
+            <el-col :span="12">
+                <el-card>
+                    <div class="header">
+                        <el-text> 鏁寸洏鐢佃姱灞炴�ц幏鍙�</el-text>&nbsp;&nbsp;
+                        <el-button @click="subimtTrayBarcodeGet" type="success">鎻愪氦鏁版嵁</el-button>
+                    </div>
+                    <el-form :inline="true" :model="TrayCellsStatus" label-width="auto" class="demo-form-inline">
+                        <el-form-item label="鎵樼洏缂栧彿:">
+                            <el-input v-model="TrayCellsStatus.TrayBarcode" placeholder="鎵樼洏缂栧彿" />
+                        </el-form-item>
+                    </el-form>
+                </el-card>
+            </el-col>
+        </el-row>
+        <el-row>
+            <el-col :span="12">
+                <el-row>
+                    <el-col :span="24">
+                        <el-card>
+                            <div class="header">
+                                <el-text> 闈欑疆\闄堝寲鍏ュ簱锛堟暣鎵樼洏锛�</el-text>&nbsp;&nbsp;
+                                <el-button @click="addOCVInput" type="primary">娣诲姞鐢佃姱</el-button> <el-button
+                                    @click="subimtAgingInput" type="success">鎻愪氦鏁版嵁</el-button>
+                            </div>
+                            <el-form :inline="true" :model="OCVinputs" label-width="auto" class="demo-form-inline">
+                                <el-form-item label="鎵樼洏缂栧彿:">
+                                    <el-input v-model="OCVinputs.TrayBarcode" placeholder="鎵樼洏缂栧彿" />
+                                </el-form-item>
+                                <el-form-item label="鎿嶄綔妯″紡:">
+                                    <el-input v-model="OCVinputs.OpFlag" placeholder="鎿嶄綔妯″紡" />
+                                </el-form-item>
+                                <template v-for="(input, index) in OCVinputs.SerialNos" :key="index">
+                                    <el-form-item label="鐢佃姱鍙�:">
+                                        <el-input v-model="input.SerialNo" placeholder="鐢佃姱鍙�" />
+                                    </el-form-item>
+                                    <el-form-item label="閫氶亾鍙�:">
+                                        <el-input v-model="input.PositionNo" placeholder="閫氶亾鍙�" />
+                                    </el-form-item>
+                                    <el-divider />
+                                </template>
+                            </el-form>
+                        </el-card>
+
+                    </el-col>
+
+                    <el-col :span="24">
+                        <el-card>
+                            <div class="header">
+                                <el-text> 宸ヨ壓璺嚎鐢宠</el-text>&nbsp;&nbsp;
+                                <el-button @click="addProcessApply" type="primary">娣诲姞鐢佃姱</el-button>
+                                <el-button @click="subimtProcessApply" type="success">鎻愪氦鏁版嵁</el-button>
+                            </div>
+                            <el-form :inline="true" :model="ProcessApplyinputs" label-width="auto"
+                                class="demo-form-inline">
+                                <el-form-item label="宸ュ崟缂栧彿:">
+                                    <el-input v-model="ProcessApplyinputs.WipOrderNo" placeholder="宸ュ崟缂栧彿" />
+                                </el-form-item>
+                                <el-form-item v-for="(input, index) in ProcessApplyinputs.SerialNos" :key="index"
+                                    label="鐢佃姱鍙�:">
+                                    <el-input v-model="input.SerialNo" placeholder="鐢佃姱鍙�" />
+                                </el-form-item>
+                            </el-form>
+                        </el-card>
+                    </el-col>
+                </el-row>
+            </el-col>
+            <el-col :span="12">
+                <el-card>
+                    <div class="header">
+                        <el-text> 闈欑疆\闄堝寲鍑哄簱锛堟暣鎵樼洏锛�</el-text>&nbsp;&nbsp;
+                        <el-button @click="addAgingOutputinputs" type="primary">娣诲姞鐢佃姱</el-button><el-button
+                            @click="subimtAgingOutput" type="success">鎻愪氦鏁版嵁</el-button>
+                    </div>
+                    <el-form :inline="true" :model="AgingOutputinputs" label-width="auto" class="demo-form-inline">
+                        <el-form-item label="鎵樼洏缂栧彿:">
+                            <el-input v-model="AgingOutputinputs.TrayBarcode" placeholder="鎵樼洏缂栧彿" />
+                        </el-form-item>
+                        <el-form-item label="鎿嶄綔妯″紡:">
+                            <el-input v-model="AgingOutputinputs.OpFlag" placeholder="鎿嶄綔妯″紡" />
+                        </el-form-item>
+                        <template v-for="(input, index) in AgingOutputinputs.SerialNos" :key="index">
+                            <el-form-item label="鐢佃姱鍙�:">
+                                <el-input v-model="input.SerialNo" placeholder="鐢佃姱鍙�" />
+                            </el-form-item>
+                            <el-form-item label="閫氶亾鍙�:">
+                                <el-input v-model="input.SlotNo" placeholder="閫氶亾鍙�" />
+                            </el-form-item>
+                            <el-form-item label="鐢佃姱缁撴灉:">
+                                <el-input v-model="input.SerialNoResult" placeholder="鐢佃姱缁撴灉" />
+                            </el-form-item>
+                            <template v-for="(inputPar, index) in input.ParameterInfo" :key="index">
+                                <el-form-item label="鍙傛暟缂栫爜:">
+                                    <el-input v-model="inputPar.ParamterCode" placeholder="鍙傛暟缂栫爜" />
+                                </el-form-item>
+                                <el-form-item label="鍙傛暟鎻忚堪 :">
+                                    <el-input v-model="inputPar.ParameterDesc" placeholder="鍙傛暟鎻忚堪" />
+                                </el-form-item>
+                                <el-form-item label="瀹為檯鍊� :">
+                                    <el-input v-model="inputPar.Value" placeholder="瀹為檯鍊�" />
+                                </el-form-item>
+                                <el-form-item label="涓婇檺:">
+                                    <el-input v-model="inputPar.UpperLimit" placeholder="涓婇檺" />
+                                </el-form-item>
+                                <el-form-item label="涓嬮檺:">
+                                    <el-input v-model="inputPar.LowerLomit" placeholder="涓嬮檺" />
+                                </el-form-item>
+                                <el-form-item label="鐩爣鍊� :">
+                                    <el-input v-model="inputPar.TargetValue" placeholder="鐩爣鍊�" />
+                                </el-form-item>
+                                <el-form-item label="缁撴灉:">
+                                    <el-input v-model="inputPar.ParameterResult" placeholder="缁撴灉" />
+                                </el-form-item>
+                                <el-form-item label="缂洪櫡浠g爜 :">
+                                    <el-input v-model="inputPar.DefectCode" placeholder="缂洪櫡浠g爜 " />
+                                </el-form-item>
+                                <el-divider />
+                            </template>
+                        </template>
+                    </el-form>
+                </el-card>
+            </el-col>
+        </el-row>
+        <el-row>
+        </el-row>
+    </div>
+</template>
+
+<script lang="ts" setup>
+import { reactive } from 'vue'
+import http from "@/../src/api/http.js";
+
+// do not use same name with ref
+const form = reactive({
+    SessionId: '1',
+    RequestTime: '2023-10-11 10:10:10',
+    Software: '2',
+    EquipmentCode: '3',
+    EmployeeNo: '4',
+})
+
+
+//#region 鎵樼洏鍗曠數鑺В缁�
+const subimtTrayCellUnbind = () => {
+    let input = ({ ...form, ...TrayCellUnbind })
+    console.log(input)
+    http.post('api/Unbind/TrayCellUnbind', input).then(res => {
+        console.log(input)
+    })
+}
+
+const addTrayCellUnbind = () => {
+    TrayCellUnbind.SerialNos.push({ SerialNo: '' })
+}
+
+const TrayCellUnbind = reactive({
+    TrayBarcode: '',
+    SerialNos: [{ SerialNo: '' }]
+})
+//#endregion
+
+//#region 鏁寸洏鐢佃姱瑙g粦
+const TrayUnbind = reactive({
+    OpFlag: '',
+    TrayBarcode: '',
+})
+
+const subimtTrayUnbind = () => {
+    let input = ({ ...form, ...TrayUnbind })
+    console.log(input)
+    http.post('api/Unbind/TrayUnbind', input).then(res => {
+        console.log(input)
+    })
+}
+//#endregion
+
+//#region 鍗曠數鑺睘鎬ц幏鍙�
+const subimtSerialNoGet = () => {
+    let input = ({ ...form, ...CellStateinputs })
+    console.log(input)
+    http.post('api/CellState/GetCellState', input).then(res => {
+        console.log(input)
+    })
+}
+
+const CellStateinputs = reactive({
+    SerialNos: [{ SerialNo: '', }]
+})
+
+const addCellState = () => {
+    CellStateinputs.SerialNos.push({ SerialNo: '' })
+}
+//#endregion
+
+//#region 鏁寸洏鐢佃姱灞炴�ц幏鍙�
+
+const subimtTrayBarcodeGet = () => {
+    let input = ({ ...form, ...TrayCellsStatus })
+    console.log(input)
+    http.post('api/CellState/GetTrayCellState', input).then(res => {
+        console.log(input)
+    })
+}
+
+const TrayCellsStatus = reactive({
+    TrayBarcode: '',
+})
+//#endregion
+
+//#region 闈欑疆\闄堝寲鍏ュ簱锛堟暣鎵樼洏锛�
+const subimtAgingInput = () => {
+    let input = ({ ...form, ...OCVinputs })
+    console.log(input)
+    http.post('api/AgingInOrOut/OCVInput', input).then(res => {
+        console.log(input)
+    })
+}
+
+const addOCVInput = () => {
+    OCVinputs.SerialNos.push({
+        SerialNo: '', PositionNo: ''
+    })
+}
+
+const OCVinputs = reactive({
+    OpFlag: '', TrayBarcode: '',
+    SerialNos: [{
+        SerialNo: '', PositionNo: ''
+    }]
+})
+//#endregion
+
+//#region 闈欑疆\闄堝寲鍑哄簱锛堟暣鎵樼洏锛�
+const subimtAgingOutput = () => {
+    let input = ({ ...form, ...AgingOutputinputs })
+    console.log(input)
+    http.post('api/AgingInOrOut/OCVOutput', input).then(res => {
+        console.log(input)
+    })
+}
+
+const addAgingOutputinputs = () => {
+    AgingOutputinputs.SerialNos.push({
+        SerialNo: '', SlotNo: '', SerialNoResult: '',
+        ParameterInfo: [{ ParamterCode: '', ParameterDesc: '', Value: '', UpperLimit: '', LowerLomit: '', TargetValue: '', ParameterResult: '', DefectCode: '' }]
+    })
+}
+const AgingOutputinputs = reactive({
+    OpFlag: '', TrayBarcode: '',
+    SerialNos: [{
+        SerialNo: '', SlotNo: '', SerialNoResult: '',
+        ParameterInfo: [{ ParamterCode: '', ParameterDesc: '', Value: '', UpperLimit: '', LowerLomit: '', TargetValue: '', ParameterResult: '', DefectCode: '' }]
+    }]
+})
+//#endregion
+
+//#region 宸ヨ壓璺嚎鐢宠
+const subimtProcessApply = () => {
+    let input = ({ ...form, ...ProcessApplyinputs })
+    console.log(input)
+    http.post('api/ProcessApply/ProcessApply', input).then(res => {
+        console.log(input)
+    })
+}
+
+const ProcessApplyinputs = reactive({
+    WipOrderNo: '',
+    SerialNos: [{ SerialNo: '', }]
+})
+
+const addProcessApply = () => {
+    ProcessApplyinputs.SerialNos.push({ SerialNo: '' })
+}
+// #endregion
+</script>
+
+<style>
+.demo-form-inline .el-input {
+    --el-input-width: 220px;
+}
+
+.demo-form-inline .el-select {
+    --el-select-width: 220px;
+}
+
+.header {
+    margin-bottom: 10px;
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/zzzz.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/zzzz.vue
new file mode 100644
index 0000000..f7ad642
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/MOM/zzzz.vue
@@ -0,0 +1,364 @@
+<template>
+    <div>
+        <el-card>
+
+            <el-row>
+                <el-col :span="24">
+                    <el-form :inline="true" :model="form" label-width="auto" class="demo-form-inline">
+                        <el-form-item label="浼氳瘽ID:">
+                            <el-input v-model="form.SessionId" placeholder="浼氳瘽ID" />
+                        </el-form-item>
+                        <el-form-item label="涓婁綅鏈鸿蒋浠跺悕绉�:">
+                            <el-input v-model="form.Software" placeholder="涓婁綅鏈鸿蒋浠跺悕绉�" />
+                        </el-form-item>
+                        <el-form-item label="璁惧缂栧彿:">
+                            <el-input v-model="form.EquipmentCode" placeholder="璁惧缂栧彿" />
+                        </el-form-item>
+                        <el-form-item label="浜哄憳宸ュ彿:">
+                            <el-input v-model="form.EmployeeNo" placeholder="浜哄憳宸ュ彿" />
+                        </el-form-item>
+                        <el-form-item label="璇锋眰鏃堕棿:">
+                            <el-date-picker v-model="form.RequestTime" type="datetime" placeholder="閫夋嫨鏃堕棿" clearable />
+                        </el-form-item>
+                    </el-form>
+                </el-col>
+            </el-row>
+        </el-card>
+        <el-row>
+            <el-col :span="12">
+                <el-card>
+                    <div class="header">
+                        <el-text> 鎵樼洏鍗曠數鑺В缁�</el-text>&nbsp;&nbsp;
+                        <el-button @click="addTrayCellUnbind" type="primary">娣诲姞鐢佃姱</el-button>
+                        <el-button @click="subimtTrayCellUnbind" type="success">鎻愪氦鏁版嵁</el-button>
+                    </div>
+                    <el-form :inline="true" :model="TrayCellUnbind" label-width="auto" class="demo-form-inline">
+                        <el-form-item label="鎵樼洏缂栧彿:">
+                            <el-input v-model="TrayCellUnbind.TrayBarcode" placeholder="鎵樼洏缂栧彿" />
+                        </el-form-item>
+                        <el-form-item v-for="(input, index) in TrayCellUnbind.SerialNos" :key="index" label="鐢佃姱鍙�:">
+                            <el-input v-model="input.SerialNo" placeholder="鐢佃姱鍙�" />
+                        </el-form-item>
+                    </el-form>
+                </el-card>
+            </el-col>
+            <el-col :span="12">
+                <el-card>
+                    <div class="header">
+                        <el-text> 鏁寸洏鐢佃姱瑙g粦</el-text>&nbsp;&nbsp;
+                        <el-button @click="subimtTrayUnbind" type="success">鎻愪氦鏁版嵁</el-button>
+                    </div>
+                    <el-form :inline="true" :model="TrayUnbind" label-width="auto" class="demo-form-inline">
+                        <el-form-item label="鎿嶄綔妯″紡:">
+                            <el-input v-model="TrayUnbind.OpFlag" placeholder="鎿嶄綔妯″紡" />
+                        </el-form-item>
+                        <el-form-item label="鎵樼洏缂栧彿:">
+                            <el-input v-model="TrayUnbind.TrayBarcode" placeholder="鎵樼洏缂栧彿" />
+                        </el-form-item>
+                    </el-form>
+                </el-card>
+            </el-col>
+        </el-row>
+        <el-row>
+            <el-col :span="12">
+                <el-card>
+                    <div class="header">
+                        <el-text> 鍗曠數鑺睘鎬ц幏鍙�</el-text>&nbsp;&nbsp;
+                        <el-button @click="addCellState" type="primary">娣诲姞鐢佃姱</el-button> <el-button
+                            @click="subimtSerialNoGet" type="success">鎻愪氦鏁版嵁</el-button>
+                    </div>
+                    <el-form :inline="true" :model="CellStateinputs" label-width="auto" class="demo-form-inline">
+                        <el-form-item v-for="(input, index) in CellStateinputs.SerialNos" :key="index" label="鐢佃姱鍙�:">
+                            <el-input v-model="input.SerialNo" placeholder="鐢佃姱鍙�" />
+                        </el-form-item>
+                    </el-form>
+                </el-card>
+            </el-col>
+            <el-col :span="12">
+                <el-card>
+                    <div class="header">
+                        <el-text> 鏁寸洏鐢佃姱灞炴�ц幏鍙�</el-text>&nbsp;&nbsp;
+                        <el-button @click="subimtTrayBarcodeGet" type="success">鎻愪氦鏁版嵁</el-button>
+                    </div>
+                    <el-form :inline="true" :model="TrayCellsStatus" label-width="auto" class="demo-form-inline">
+                        <el-form-item label="鎵樼洏缂栧彿:">
+                            <el-input v-model="TrayCellsStatus.TrayBarcode" placeholder="鎵樼洏缂栧彿" />
+                        </el-form-item>
+                    </el-form>
+                </el-card>
+            </el-col>
+        </el-row>
+        <el-row>
+            <el-col :span="12">
+                <el-row>
+                    <el-col :span="24">
+                        <el-card>
+                            <div class="header">
+                                <el-text> 闈欑疆\闄堝寲鍏ュ簱锛堟暣鎵樼洏锛�</el-text>&nbsp;&nbsp;
+                                <el-button @click="addOCVInput" type="primary">娣诲姞鐢佃姱</el-button> <el-button
+                                    @click="subimtAgingInput" type="success">鎻愪氦鏁版嵁</el-button>
+                            </div>
+                            <el-form :inline="true" :model="OCVinputs" label-width="auto" class="demo-form-inline">
+                                <el-form-item label="鎵樼洏缂栧彿:">
+                                    <el-input v-model="OCVinputs.TrayBarcode" placeholder="鎵樼洏缂栧彿" />
+                                </el-form-item>
+                                <el-form-item label="鎿嶄綔妯″紡:">
+                                    <el-input v-model="OCVinputs.OpFlag" placeholder="鎿嶄綔妯″紡" />
+                                </el-form-item>
+                                <template v-for="(input, index) in OCVinputs.SerialNos" :key="index">
+                                    <el-form-item label="鐢佃姱鍙�:">
+                                        <el-input v-model="input.SerialNo" placeholder="鐢佃姱鍙�" />
+                                    </el-form-item>
+                                    <el-form-item label="閫氶亾鍙�:">
+                                        <el-input v-model="input.PositionNo" placeholder="閫氶亾鍙�" />
+                                    </el-form-item>
+                                    <el-divider />
+                                </template>
+                            </el-form>
+                        </el-card>
+
+                    </el-col>
+
+                    <el-col :span="24">
+                        <el-card>
+                            <div class="header">
+                                <el-text> 宸ヨ壓璺嚎鐢宠</el-text>&nbsp;&nbsp;
+                                <el-button @click="addProcessApply" type="primary">娣诲姞鐢佃姱</el-button>
+                                <el-button @click="subimtProcessApply" type="success">鎻愪氦鏁版嵁</el-button>
+                            </div>
+                            <el-form :inline="true" :model="ProcessApplyinputs" label-width="auto"
+                                class="demo-form-inline">
+                                <el-form-item label="宸ュ崟缂栧彿:">
+                                    <el-input v-model="ProcessApplyinputs.WipOrderNo" placeholder="宸ュ崟缂栧彿" />
+                                </el-form-item>
+                                <el-form-item v-for="(input, index) in ProcessApplyinputs.SerialNos" :key="index"
+                                    label="鐢佃姱鍙�:">
+                                    <el-input v-model="input.SerialNo" placeholder="鐢佃姱鍙�" />
+                                </el-form-item>
+                            </el-form>
+                        </el-card>
+                    </el-col>
+                </el-row>
+            </el-col>
+            <el-col :span="12">
+                <el-card>
+                    <div class="header">
+                        <el-text> 闈欑疆\闄堝寲鍑哄簱锛堟暣鎵樼洏锛�</el-text>&nbsp;&nbsp;
+                        <el-button @click="addAgingOutputinputs" type="primary">娣诲姞鐢佃姱</el-button><el-button
+                            @click="subimtAgingOutput" type="success">鎻愪氦鏁版嵁</el-button>
+                    </div>
+                    <el-form :inline="true" :model="AgingOutputinputs" label-width="auto" class="demo-form-inline">
+                        <el-form-item label="鎵樼洏缂栧彿:">
+                            <el-input v-model="AgingOutputinputs.TrayBarcode" placeholder="鎵樼洏缂栧彿" />
+                        </el-form-item>
+                        <el-form-item label="鎿嶄綔妯″紡:">
+                            <el-input v-model="AgingOutputinputs.OpFlag" placeholder="鎿嶄綔妯″紡" />
+                        </el-form-item>
+                        <template v-for="(input, index) in AgingOutputinputs.SerialNos" :key="index">
+                            <el-form-item label="鐢佃姱鍙�:">
+                                <el-input v-model="input.SerialNo" placeholder="鐢佃姱鍙�" />
+                            </el-form-item>
+                            <el-form-item label="閫氶亾鍙�:">
+                                <el-input v-model="input.SlotNo" placeholder="閫氶亾鍙�" />
+                            </el-form-item>
+                            <el-form-item label="鐢佃姱缁撴灉:">
+                                <el-input v-model="input.SerialNoResult" placeholder="鐢佃姱缁撴灉" />
+                            </el-form-item>
+                            <template v-for="(inputPar, index) in input.ParameterInfo" :key="index">
+                                <el-form-item label="鍙傛暟缂栫爜:">
+                                    <el-input v-model="inputPar.ParamterCode" placeholder="鍙傛暟缂栫爜" />
+                                </el-form-item>
+                                <el-form-item label="鍙傛暟鎻忚堪 :">
+                                    <el-input v-model="inputPar.ParameterDesc" placeholder="鍙傛暟鎻忚堪" />
+                                </el-form-item>
+                                <el-form-item label="瀹為檯鍊� :">
+                                    <el-input v-model="inputPar.Value" placeholder="瀹為檯鍊�" />
+                                </el-form-item>
+                                <el-form-item label="涓婇檺:">
+                                    <el-input v-model="inputPar.UpperLimit" placeholder="涓婇檺" />
+                                </el-form-item>
+                                <el-form-item label="涓嬮檺:">
+                                    <el-input v-model="inputPar.LowerLomit" placeholder="涓嬮檺" />
+                                </el-form-item>
+                                <el-form-item label="鐩爣鍊� :">
+                                    <el-input v-model="inputPar.TargetValue" placeholder="鐩爣鍊�" />
+                                </el-form-item>
+                                <el-form-item label="缁撴灉:">
+                                    <el-input v-model="inputPar.ParameterResult" placeholder="缁撴灉" />
+                                </el-form-item>
+                                <el-form-item label="缂洪櫡浠g爜 :">
+                                    <el-input v-model="inputPar.DefectCode" placeholder="缂洪櫡浠g爜 " />
+                                </el-form-item>
+                                <el-divider />
+                            </template>
+                        </template>
+                    </el-form>
+                </el-card>
+            </el-col>
+        </el-row>
+        <el-row>
+        </el-row>
+    </div>
+</template>
+
+<script lang="ts" setup>
+import { reactive } from 'vue'
+import http from "@/../src/api/http.js";
+
+// do not use same name with ref
+const form = reactive({
+    SessionId: '1',
+    RequestTime: '2023-10-11 10:10:10',
+    Software: '2',
+    EquipmentCode: '3',
+    EmployeeNo: '4',
+})
+
+
+//#region 鎵樼洏鍗曠數鑺В缁�
+const subimtTrayCellUnbind = () => {
+    let input = ({ ...form, ...TrayCellUnbind })
+    console.log(input)
+    http.post('api/Unbind/TrayCellUnbind', input).then(res => {
+        console.log(input)
+    })
+}
+
+const addTrayCellUnbind = () => {
+    TrayCellUnbind.SerialNos.push({ SerialNo: '' })
+}
+
+const TrayCellUnbind = reactive({
+    TrayBarcode: '',
+    SerialNos: [{ SerialNo: '' }]
+})
+//#endregion
+
+//#region 鏁寸洏鐢佃姱瑙g粦
+const TrayUnbind = reactive({
+    OpFlag: '',
+    TrayBarcode: '',
+})
+
+const subimtTrayUnbind = () => {
+    let input = ({ ...form, ...TrayUnbind })
+    console.log(input)
+    http.post('api/Unbind/TrayUnbind', input).then(res => {
+        console.log(input)
+    })
+}
+//#endregion
+
+//#region 鍗曠數鑺睘鎬ц幏鍙�
+const subimtSerialNoGet = () => {
+    let input = ({ ...form, ...CellStateinputs })
+    console.log(input)
+    http.post('api/CellState/GetCellState', input).then(res => {
+        console.log(input)
+    })
+}
+
+const CellStateinputs = reactive({
+    SerialNos: [{ SerialNo: '', }]
+})
+
+const addCellState = () => {
+    CellStateinputs.SerialNos.push({ SerialNo: '' })
+}
+//#endregion
+
+//#region 鏁寸洏鐢佃姱灞炴�ц幏鍙�
+
+const subimtTrayBarcodeGet = () => {
+    let input = ({ ...form, ...TrayCellsStatus })
+    console.log(input)
+    http.post('api/CellState/GetTrayCellState', input).then(res => {
+        console.log(input)
+    })
+}
+
+const TrayCellsStatus = reactive({
+    TrayBarcode: '',
+})
+//#endregion
+
+//#region 闈欑疆\闄堝寲鍏ュ簱锛堟暣鎵樼洏锛�
+const subimtAgingInput = () => {
+    let input = ({ ...form, ...OCVinputs })
+    console.log(input)
+    http.post('api/AgingInOrOut/OCVInput', input).then(res => {
+        console.log(input)
+    })
+}
+
+const addOCVInput = () => {
+    OCVinputs.SerialNos.push({
+        SerialNo: '', PositionNo: ''
+    })
+}
+
+const OCVinputs = reactive({
+    OpFlag: '', TrayBarcode: '',
+    SerialNos: [{
+        SerialNo: '', PositionNo: ''
+    }]
+})
+//#endregion
+
+//#region 闈欑疆\闄堝寲鍑哄簱锛堟暣鎵樼洏锛�
+const subimtAgingOutput = () => {
+    let input = ({ ...form, ...AgingOutputinputs })
+    console.log(input)
+    http.post('api/AgingInOrOut/OCVOutput', input).then(res => {
+        console.log(input)
+    })
+}
+
+const addAgingOutputinputs = () => {
+    AgingOutputinputs.SerialNos.push({
+        SerialNo: '', SlotNo: '', SerialNoResult: '',
+        ParameterInfo: [{ ParamterCode: '', ParameterDesc: '', Value: '', UpperLimit: '', LowerLomit: '', TargetValue: '', ParameterResult: '', DefectCode: '' }]
+    })
+}
+const AgingOutputinputs = reactive({
+    OpFlag: '', TrayBarcode: '',
+    SerialNos: [{
+        SerialNo: '', SlotNo: '', SerialNoResult: '',
+        ParameterInfo: [{ ParamterCode: '', ParameterDesc: '', Value: '', UpperLimit: '', LowerLomit: '', TargetValue: '', ParameterResult: '', DefectCode: '' }]
+    }]
+})
+//#endregion
+
+//#region 宸ヨ壓璺嚎鐢宠
+const subimtProcessApply = () => {
+    let input = ({ ...form, ...ProcessApplyinputs })
+    console.log(input)
+    http.post('api/ProcessApply/ProcessApply', input).then(res => {
+        console.log(input)
+    })
+}
+
+const ProcessApplyinputs = reactive({
+    WipOrderNo: '',
+    SerialNos: [{ SerialNo: '', }]
+})
+
+const addProcessApply = () => {
+    ProcessApplyinputs.SerialNos.push({ SerialNo: '' })
+}
+// #endregion
+</script>
+
+<style>
+.demo-form-inline .el-input {
+    --el-input-width: 220px;
+}
+
+.demo-form-inline .el-select {
+    --el-select-width: 220px;
+}
+
+.header {
+    margin-bottom: 10px;
+}
+</style>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_AreaInfo.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_AreaInfo.vue
new file mode 100644
index 0000000..6bce614
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_AreaInfo.vue
@@ -0,0 +1,92 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/basicinfo/Dt_AreaInfo.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend">
+    </view-grid>
+</template>
+<script>
+import extend from "@/extension/widesea_wms/basicinfo/Dt_AreaInfo.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'areaID',
+            footer: "Foots",
+            cnName: '鍖哄煙淇℃伅',
+            name: 'basicinfo/Dt_AreaInfo',
+            url: "/Dt_AreaInfo/",
+            sortName: "AreaCode"
+        });
+        const editFormFields = ref({
+            "areaCode": "",
+            "areaName": "",
+            "areaType": "",
+            "areaStatus": "",
+            "areaDesc": ""
+        });
+        const editFormOptions = ref([
+            [
+                { "title": "鍖哄煙缂栫爜", "field": "areaCode", type: "text" },
+                { "title": "鍖哄煙鍚嶇О", "field": "areaName", type: "text" },
+                { "title": "鍖哄煙鎻忚堪", "field": "areaDesc", type: "text" },
+            ],
+            [
+                { "title": "鍖哄煙绫诲瀷", "field": "areaType", type: "text" },
+                { "title": "鍖哄煙鐘舵��", "field": "areaStatus", type: "text" },
+            ]
+        ]);
+        const searchFormFields = ref({});
+        const searchFormOptions = ref([
+            [
+                { "title": "鍖哄煙缂栫爜", "field": "areaCode", type: "text" },
+                { "title": "鍖哄煙鍚嶇О", "field": "areaName", type: "text" },
+                { "title": "鍖哄煙鎻忚堪", "field": "areaDesc", type: "text" },
+            ],
+            [
+                { "title": "鍖哄煙绫诲瀷", "field": "areaType", type: "text" },
+                { "title": "鍖哄煙鐘舵��", "field": "areaStatus", type: "text" },
+            ]
+        ]);
+        const columns = ref([{ field: 'areaID', title: '鍖哄煙ID', type: 'int', sort: true, hidden: true, width: 110, readonly: true, require: true, align: 'left' },
+        { field: 'areaCode', title: '鍖哄煙缂栧彿', type: 'string', sort: true, width: 110, require: true, align: 'left', sort: true },
+        { field: 'areaName', title: '鍖哄煙鍚嶇О', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'areaType', title: '鍖哄煙绫诲瀷', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'areaStatus', title: '鍖哄煙鐘舵��', type: 'int', sort: true, width: 110, align: 'left', bind: { key: "status", data: [] }  },
+        { field: 'areaDesc', title: '鍖哄煙鎻忚堪', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'createID', title: '鍒涘缓ID', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'modifyID', title: '淇敼浜篒D', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150, hidden: true, align: 'left', sort: true },
+        { field: 'spare1', title: 'Spare1', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare2', title: 'Spare2', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare3', title: 'Spare3', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare4', title: 'Spare4', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare5', title: 'Spare5', type: 'string', sort: true, width: 110, hidden: true, align: 'left' }]);
+        const detail = ref({
+            cnName: "#detailCnName",
+            table: "#detailTable",
+            columns: [],
+            sortName: "",
+            key: ""
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_LocationInfo.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_LocationInfo.vue
new file mode 100644
index 0000000..d70940b
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_LocationInfo.vue
@@ -0,0 +1,85 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/basicinfo/Dt_LocationInfo.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend">
+    </view-grid>
+</template>
+<script>
+import extend from "@/extension/widesea_wms/basicinfo/Dt_LocationInfo.jsx";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'id',
+            footer: "Foots",
+            cnName: '璐т綅淇℃伅',
+            name: 'basicinfo/Dt_LocationInfo',
+            url: "/LocationInfo/",
+            sortName: "id"
+        });
+        const editFormFields = ref({ "locationStatus": "" });
+        const editFormOptions = ref([
+            [
+                { "title": "璐т綅鐘舵��", "field": "locationStatus", "type": "select", dataKey: "LocationState", data: [] }, 
+                { "title": "鏄惁绂佺敤", "field": "enalbeStatus", "type": "select", dataKey: "EnalbeStatus", data: [] }, 
+            ]
+        ]);
+        const searchFormFields = ref({ "LocationID": "",roadWayNO:"" });
+        const searchFormOptions = ref([
+            [
+                { "title": "璐т綅缂栧彿", "field": "locationCode", type: "text" },
+                { "title": "璐т綅鐘舵��", "field": "locationStatus", "type": "select", dataKey: "LocationState", data: [] },
+                { "title": "宸烽亾缂栧彿", "field": "roadWayNO", type: "text" },
+            ],
+            [
+                { "title": "琛�", "field": "row", type: "text" },
+                { "title": "鍒�", "field": "column", "type": "text" },
+                { "title": "灞�", "field": "layer", type: "text" },
+            ]
+        ]);
+        const columns = ref([{ field: 'locationID', title: '璐т綅ID', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
+        { field: 'locationCode', title: '璐т綅缂栧彿', type: 'string', width: 110, require: true, align: 'left' },
+        { field: 'locationName', title: '璐т綅鍚嶇О', type: 'string', width: 120, align: 'left' },
+        { field: 'roadwayNo', title: '宸烽亾鍙�', type: 'string', width: 110, require: true, align: 'left', sort: true },
+        { field: 'row', title: '琛�', type: 'string', width: 70, align: 'left' },
+        { field: 'column', title: '鍒�', type: 'string', width: 70, align: 'left' },
+        { field: 'layer', title: '灞�', type: 'string', width: 110, align: 'left' },
+        { field: 'depth', title: '娣卞害', type: 'string', width: 110, align: 'left', hidden: true  },
+        { field: 'scNo', title: '瀵瑰簲鍫嗗灈鏈哄彿', type: 'string', width: 110, align: 'left', hidden: true },
+        { field: 'locationType', title: '璐т綅绫诲瀷', type: 'int', width: 110, align: 'left',bind: { key: "LocationType", data: [] } },
+        { field: 'locationStatus', title: '璐т綅鐘舵��', type: 'int', width: 110, align: 'left', bind: { key: "LocationState", data: [] } },
+        { field: 'enalbeStatus', title: '鏄惁绂佺敤', type: 'int', width: 75, align: 'left', bind: { key: "EnalbeStatus", data: [] }}, 
+        // { field: 'isLocked', title: '鏄惁閿佸畾', type: 'bool', width: 110, align: 'left', bind: { key: "IsLocked", data: [] } },
+        { field: 'locationDesc', title: '璐т綅鎻忚堪', type: 'string', width: 110, align: 'left', hidden: true },
+        { field: 'remark', title: '妫�娴嬫煖鍏佽', type: 'string', width: 110, align: 'left' ,bind: { key: "AllowStatus", data: [] }},
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100, align: 'left' },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+    ]);
+        const detail = ref({
+            cnName: "#detailCnName",
+            table: "#detailTable",
+            columns: [],
+            sortName: "",
+            key: ""
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_RoadWayInfo.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_RoadWayInfo.vue
new file mode 100644
index 0000000..4c448ec
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_RoadWayInfo.vue
@@ -0,0 +1,85 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/basicinfo/Dt_RoadWayInfo.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/widesea_wms/basicinfo/Dt_RoadWayInfo.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'roadwayID',
+                footer: "Foots",
+                cnName: '宸烽亾淇℃伅',
+                name: 'basicinfo/Dt_RoadWayInfo',
+                url: "/Dt_RoadWayInfo/",
+                sortName: "RoadwayID"
+            });
+            const editFormFields = ref({
+                "roadWayNO":"",
+                "wareAreaID":""
+            });
+            const editFormOptions = ref([
+            [
+                { "title": "宸烽亾鍙�", "field": "roadWayNO", type: "text" },
+                { "title": "搴撳尯鍚嶇О", "field": "wareAreaName", type: "text" },
+            ]
+            ]);
+            const searchFormFields = ref({});
+            const searchFormOptions = ref([
+            [
+                { "title": "宸烽亾鍙�", "field": "roadWayNO", type: "text" },
+                { "title": "搴撳尯鍚嶇О", "field": "wareAreaName", type: "text" },
+            ]
+            ]);
+            const columns = ref([{field:'roadwayID',title:'宸烽亾ID',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'roadWayNO',title:'宸烽亾鍙�',type:'string',width:110,align:'left',sort:true},
+                       {field:'wareAreaName',title:'搴撳尯鍚嶇О',type:'string',width:110,align:'left'},
+                       {field:'wareAreaID',title:'搴撳尯ID',type:'int',width:110,hidden:true,align:'left'},
+                       {field:'isEnable',title:'鏄惁鍚敤',type:'bool',width:110,align:'left'},
+                       {field:'remark',title:'澶囨敞',type:'string',width:120,align:'left'},
+                       {field:'createID',title:'鍒涘缓ID',type:'int',sort:true,width:100,hidden:true,align:'left'},
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',sort:true,width:110,align:'left'},
+                       {field:'createDate',title:'鍒涘缓鏃堕棿',type:'datetime',sort:true,width:150,align:'left',sort:true},
+                       {field:'modifyID',title:'淇敼浜篒D',type:'int',sort:true,width:100,hidden:true,align:'left'},
+                       {field:'modifier',title:'淇敼浜�',type:'string',sort:true,width:100,hidden:true,align:'left'},
+                       {field:'modifyDate',title:'淇敼鏃堕棿',type:'datetime',sort:true,width:150,hidden:true,align:'left',sort:true},
+                       {field:'spare1',title:'Spare1',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare2',title:'Spare2',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare3',title:'Spare3',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare4',title:'Spare4',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare5',title:'Spare5',type:'string',sort:true,width:110,hidden:true,align:'left'}]);
+            const detail = ref({
+                cnName: "#detailCnName",
+                table: "#detailTable",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_StationManager.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_StationManager.vue
new file mode 100644
index 0000000..adc64e9
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_StationManager.vue
@@ -0,0 +1,88 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/basicinfo/Dt_AreaInfo.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend">
+    </view-grid>
+</template>
+<script>
+import extend from "@/extension/widesea_wms/basicinfo/Dt_StationManager.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'areaID',
+            footer: "Foots",
+            cnName: '绔欏彴淇℃伅',
+            name: 'basicinfo/Dt_StationManager',
+            url: "/Dt_StationManager/",
+            sortName: "AreaCode"
+        });
+        const editFormFields = ref({
+            
+        });
+        const editFormOptions = ref([
+            
+        ]);
+        const searchFormFields = ref({});
+        const searchFormOptions = ref([
+            [
+                { "title": "绔欏彴绫诲瀷", "field": "stationType", type: "text" },
+                { "title": "鎵�灞濸LC", "field": "stationPLC", type: "text" },
+                { "title": "宸烽亾鍙�", "field": "roadway", type: "text" },
+               
+            ],
+            [
+                { "title": "璁惧鍖哄煙", "field": "stationArea", type: "text" },
+                { "title": "MOM璁惧缂栧彿", "field": "stationEquipMOM", type: "text" },
+                { "title": "NG瀛愯澶囩紪鍙�", "field": "stationNGChildCode", type: "text" },
+                
+            ],
+            [
+                { "title": "NG瀛愯澶囧潗鏍�", "field": "remark", type: "text" },
+                { "title": "绾夸綋缂栧彿", "field": "stationChildCode", type: "text" },
+                { "title": "浜х嚎", "field": "productLine", type: "text" },
+                
+            ]
+        ]);
+        const columns = ref([{ field: 'stationID', title: '涓婚敭', type: 'int', sort: true, hidden: true, width: 110, readonly: true, require: true, align: 'left' },
+        { field: 'stationType', title: '绔欏彴绫诲瀷', type: 'int', sort: true, width: 110, require: true, align: 'left', sort: true },
+        { field: 'stationPLC', title: '鎵�灞濸LC', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'roadway', title: '宸烽亾鍙�', type: 'string', sort: true, width: 110, align: 'left' },   
+        { field: 'stationChildCode', title: '绾夸綋缂栧彿(瀛愯澶囩紪鍙�)', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'stationArea', title: '璁惧鍖哄煙', type: 'int', sort: true, width: 100,  align: 'left' },
+        { field: 'stationEquipMOM', title: 'MOM璁惧缂栧彿', type: 'string', sort: true, width: 150,  align: 'left' },
+        { field: 'stationNGChildCode', title: 'NG瀛愯澶囩紪鍙�', type: 'string', sort: true, width: 110,  align: 'left' },
+        { field: 'productLine', title: '浜х嚎', type: 'string', sort: true, width: 110,  align: 'left' },
+        { field: 'remark', title: 'NG瀛愯澶囧潗鏍�', type: 'string', sort: true, width: 110,  align: 'left' },
+        { field: 'stationRemark', title: '澶囨敞', type: 'int', sort: true, width: 110, align: 'left',  },
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100,  align: 'left' },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150,  align: 'left', sort: true },
+        ]);
+        const detail = ref({
+            cnName: "#detailCnName",
+            table: "#detailTable",
+            columns: [],
+            sortName: "",
+            key: ""
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_Strategy.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_Strategy.vue
new file mode 100644
index 0000000..0b7aecc
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_Strategy.vue
@@ -0,0 +1,86 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/basicinfo/Dt_Strategy.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/widesea_wms/basicinfo/Dt_Strategy.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'strategyId',
+                footer: "Foots",
+                cnName: '绛栫暐淇℃伅',
+                name: 'basicinfo/Dt_Strategy',
+                url: "/Dt_Strategy/",
+                sortName: "StrategyId"
+            });
+            const editFormFields = ref({
+                "strategyType":""
+            });
+            const editFormOptions = ref([
+            [
+                { "title": "绛栫暐绫诲瀷", "field": "strategyType", type: "text" },
+            ]
+            ]);
+            const searchFormFields = ref({});
+            const searchFormOptions = ref([
+            [
+                { "title": "绛栫暐绫诲瀷", "field": "strategyType", type: "text" },
+            ]
+            ]);
+            const columns = ref([{field:'strategyId',title:'StrategyId',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'strategyCode',title:'绛栫暐缂栧彿',type:'string',width:110,align:'left',sort:true},
+                       {field:'strategyName',title:'绛栫暐鍚嶇О',type:'string',width:110,align:'left'},
+                       {field:'strategyType',title:'绛栫暐绫诲瀷',type:'string',width:110,align:'left'},
+                       {field:'filedSource',title:'瀛楁鏉ユ簮',type:'string',width:110,align:'left'},
+                       {field:'fieldName',title:'瑙勫垯瀛楁',type:'string',width:110,align:'left'},
+                       {field:'executionOrder',title:'瑙勫垯鎵ц椤哄簭',type:'int',width:110,align:'left'},
+                       {field:'sordOrder',title:'鎺掑簭鏂瑰紡',type:'string',width:110,align:'left'},
+                       {field:'isPreset',title:'鏄惁棰勮',type:'bool',width:110,align:'left'},
+                       {field:'remark',title:'澶囨敞',type:'string',width:120,align:'left'},
+                       {field:'createID',title:'鍒涘缓ID',type:'int',sort:true,width:100,hidden:true,align:'left'},
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',sort:true,width:110,align:'left'},
+                       {field:'createDate',title:'鍒涘缓鏃堕棿',type:'datetime',sort:true,width:150,align:'left',sort:true},
+                       {field:'modifyID',title:'淇敼浜篒D',type:'int',sort:true,width:100,hidden:true,align:'left'},
+                       {field:'modifier',title:'淇敼浜�',type:'string',sort:true,width:100,hidden:true,align:'left'},
+                       {field:'modifyDate',title:'淇敼鏃堕棿',type:'datetime',sort:true,width:150,hidden:true,align:'left',sort:true},
+                       {field:'spare1',title:'Spare1',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare2',title:'Spare2',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare3',title:'Spare3',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare4',title:'Spare4',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare5',title:'Spare5',type:'string',sort:true,width:110,hidden:true,align:'left'}]);
+            const detail = ref({
+                cnName: "#detailCnName",
+                table: "#detailTable",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_UnitInfo.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_UnitInfo.vue
new file mode 100644
index 0000000..603def5
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_UnitInfo.vue
@@ -0,0 +1,84 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/basicinfo/Dt_UnitInfo.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/widesea_wms/basicinfo/Dt_UnitInfo.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'unitID',
+                footer: "Foots",
+                cnName: '鍗曚綅淇℃伅',
+                name: 'basicinfo/Dt_UnitInfo',
+                url: "/Dt_UnitInfo/",
+                sortName: "UnitID"
+            });
+            const editFormFields = ref({"unitCode":"","unitName":""});
+            const editFormOptions = ref([
+            [
+               {"title":"鍗曚綅浠g爜","required":true,"field":"unitCode","type":"text"},
+               {"title":"鍗曚綅鍚嶇О","required":true,"field":"unitName","type":"text"},
+            ]
+            ]);
+            const searchFormFields = ref({});
+            const searchFormOptions = ref([
+            [
+            
+              { "title": "鍗曚綅鍚嶇О", "field": "unitName", "type": "like" },
+            ]
+            ]);
+            const columns = ref([{field:'unitID',title:'涓婚敭',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'unitCode',title:'鍗曚綅缂栧彿',type:'string',width:110,align:'left',sort:true},
+                       {field:'unitName',title:'鍗曚綅鍚嶇О',type:'string',width:110,align:'left'},
+                       {field:'packUnit',title:'鍖呰鍗曚綅',type:'string',width:110,align:'left'},
+                       {field:'packUnitNum',title:'鍖呰鍗曚綅閲�',type:'decimal',width:110,align:'left'},
+                       {field:'minUnitNum',title:'鏈�灏忓崟浣嶉噺',type:'decimal',width:110,align:'left'},
+                       {field:'unitDesc',title:'鎻忚堪',type:'string',width:110,align:'left'},
+                       {field:'remark',title:'澶囨敞',type:'string',width:110,hidden:true,align:'left'},
+                       {field:'createID',title:'鍒涘缓ID',type:'int',sort:true,width:100,hidden:true,align:'left'},
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',sort:true,width:110,align:'left'},
+                       {field:'createDate',title:'鍒涘缓鏃堕棿',type:'datetime',sort:true,width:150,align:'left',sort:true},
+                       {field:'modifyID',title:'淇敼浜篒D',type:'int',sort:true,width:100,hidden:true,align:'left'},
+                       {field:'modifier',title:'淇敼浜�',type:'string',sort:true,width:100,hidden:true,align:'left'},
+                       {field:'modifyDate',title:'淇敼鏃堕棿',type:'datetime',sort:true,width:150,hidden:true,align:'left',sort:true},
+                       {field:'spare1',title:'Spare1',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare2',title:'Spare2',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare3',title:'Spare3',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare4',title:'Spare4',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare5',title:'Spare5',type:'string',sort:true,width:110,hidden:true,align:'left'}]);
+            const detail = ref({
+                cnName: "#detailCnName",
+                table: "#detailTable",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_WareAreaInfo.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_WareAreaInfo.vue
new file mode 100644
index 0000000..47e2b83
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_WareAreaInfo.vue
@@ -0,0 +1,86 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/basicinfo/Dt_WareAreaInfo.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend">
+    </view-grid>
+</template>
+<script>
+import extend from "@/extension/widesea_wms/basicinfo/Dt_WareAreaInfo.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'wareAreaID',
+            footer: "Foots",
+            cnName: '搴撳尯淇℃伅',
+            name: 'basicinfo/Dt_WareAreaInfo',
+            url: "/Dt_WareAreaInfo/",
+            sortName: "WareAreaID"
+        });
+        const editFormFields = ref({
+            "wareAreaName": "",
+            "areaID": "",
+            "wareAreaType": "",
+            "wareAreaCode": ""
+        });
+        const editFormOptions = ref([
+            [
+                { "title": "搴撳尯鍚嶇О", "field": "wareAreaName", type: "text" },
+                { "title": "搴撳尯浠g爜", "field": "wareAreaCode", type: "text" },
+                { "title": "搴撳尯缂栧彿", "field": "wareAreaCode", type: "text" },
+                { "title": "搴撳尯绫诲瀷", "field": "wareAreaType", type: "text" },
+            ]
+        ]);
+        const searchFormFields = ref({});
+        const searchFormOptions = ref([
+            [
+                { "title": "搴撳尯鍚嶇О", "field": "wareAreaName", type: "text" },
+                { "title": "搴撳尯浠g爜", "field": "wareAreaCode", type: "text" },
+                { "title": "搴撳尯缂栧彿", "field": "wareAreaCode", type: "text" },
+                { "title": "搴撳尯绫诲瀷", "field": "wareAreaType", type: "text" },
+            ]
+        ]);
+        const columns = ref([{ field: 'wareAreaID', title: '涓婚敭', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
+        { field: 'areaID', title: '搴撳尯ID', type: 'int', width: 110, hidden: true, align: 'left', sort: true, hidden: true },
+        { field: 'wareAreaCode', title: '搴撳尯缂栧彿', type: 'string', width: 110, require: true, align: 'left' },
+        { field: 'wareAreaName', title: '搴撳尯鍚嶇О', type: 'string', width: 110, align: 'left' },
+        { field: 'wareAreaType', title: '搴撳尯绫诲瀷', type: 'string', width: 110, align: 'left' },
+        { field: 'status', title: '搴撳尯鐘舵��', type: 'int', width: 110, align: 'left', bind: { key: "status", data: [] } },
+        { field: 'wareAreaDesc', title: '搴撳尯鎻忚堪', type: 'string', width: 110, align: 'left' },
+        { field: 'createID', title: '鍒涘缓ID', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'modifyID', title: '淇敼浜篒D', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150, hidden: true, align: 'left', sort: true },
+        { field: 'spare1', title: 'Spare1', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare2', title: 'Spare2', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare3', title: 'Spare3', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare4', title: 'Spare4', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare5', title: 'Spare5', type: 'string', sort: true, width: 110, hidden: true, align: 'left' }]);
+        const detail = ref({
+            cnName: "#detailCnName",
+            table: "#detailTable",
+            columns: [],
+            sortName: "",
+            key: ""
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_needBarcode.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_needBarcode.vue
new file mode 100644
index 0000000..24b6e62
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/Dt_needBarcode.vue
@@ -0,0 +1,90 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/basicinfo/Dt_AreaInfo.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend">
+    </view-grid>
+</template>
+<script>
+import extend from "@/extension/widesea_wms/basicinfo/Dt_needBarcode.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'areaID',
+            footer: "Foots",
+            cnName: '鍦ㄩ�旀暟鎹�',
+            name: 'basicinfo/dt_needBarcode',
+            url: "/dt_needBarcode/",
+            sortName: "AreaCode"
+        });
+        const editFormFields = ref({
+            // "toArea": "",
+            // "fromArea": "",
+            // "barcodeType": "",
+            "productLine": "",
+            "inLineNum": "",
+            "cacheNum":""
+        });
+        const editFormOptions = ref([
+            // [
+            //     { "title": "鐩爣搴撳尯", "field": "toArea", type: "text" },
+            //     { "title": "鏉ユ簮搴撳尯", "field": "fromArea", type: "text" },
+            //     { "title": "鎵樼洏绫诲瀷", "field": "barcodeType", type: "text" },
+            // ],
+            [
+                { "title": "鎵�灞炰骇绾�", "field": "productLine", type: "text" },
+                { "title": "鍦ㄩ�旀暟閲�", "field": "inLineNum", type: "text" },
+                { "title": "鍙紦瀛樻暟閲�", "field": "cacheNum", type: "text" },
+            ]
+        ]);
+        const searchFormFields = ref({});
+        const searchFormOptions = ref([
+            // [
+            //     { "title": "鐩爣搴撳尯", "field": "toArea", type: "text" },
+            //     { "title": "鏉ユ簮搴撳尯", "field": "fromArea", type: "text" },
+            //     { "title": "鎵樼洏绫诲瀷", "field": "barcodeType", type: "text" },
+            // ],
+            [
+                { "title": "鎵�灞炰骇绾�", "field": "productLine", type: "text" },
+                { "title": "鍦ㄩ�旀暟閲�", "field": "inLineNum", type: "text" },
+                { "title": "鍙紦瀛樻暟閲�", "field": "cacheNum", type: "text" },
+            ]
+        ]);
+        const columns = ref([{ field: 'ID', title: '涓婚敭', type: 'int', sort: true, hidden: true, width: 110, readonly: true, require: true, align: 'left' },
+        //{ field: 'toArea', title: '鐩爣搴撳尯', type: 'string', sort: true, width: 110, require: true, align: 'left', sort: true },
+        //{ field: 'fromArea', title: '鏉ユ簮搴撳尯', type: 'string', sort: true, width: 110, align: 'left' },
+        //{ field: 'barcodeType', title: '鎵樼洏绫诲瀷', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'productLine', title: '鎵�灞炰骇绾�', type: 'string', sort: true, width: 110, align: 'left',},
+        { field: 'inLineNum', title: '鍦ㄩ�旀暟閲�', type: 'int', sort: true, width: 110, align: 'left' },
+        { field: 'cacheNum', title: '鍙紦瀛樻暟閲�', type: 'int', sort: true, width: 100,  align: 'left' },
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100,  align: 'left' },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150,  align: 'left', sort: true },
+        ]);
+        const detail = ref({
+            cnName: "#detailCnName",
+            table: "#detailTable",
+            columns: [],
+            sortName: "",
+            key: ""
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/LocationStatusChange.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/LocationStatusChange.vue
new file mode 100644
index 0000000..7325de3
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/LocationStatusChange.vue
@@ -0,0 +1,71 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/basicinfo/Dt_LocationInfo.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend">
+    </view-grid>
+</template>
+<script>
+import extend from "@/extension/widesea_wms/basicinfo/LocationStatusChange.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'locationID',
+            footer: "Foots",
+            cnName: '璐т綅鐘舵�佸彉鍔ㄨ褰�',
+            name: 'LocationStatusChange',
+            url: "/LocationStatusChangeRecord/",
+            sortName: "LocationID"
+        });
+        const editFormFields = ref({});
+        const editFormOptions = ref([]);
+        const searchFormFields = ref({});
+        const searchFormOptions = ref([
+            [
+                { "title": "璐т綅缂栧彿", "field": "locationCode", type: "text" },
+                { "title": "鍙樺姩鍓嶈揣浣嶇姸鎬�", "field": "BeforeStatus", "type": "select", dataKey: "LocationState", data: [] },
+                { "title": "鍙樺姩鍚庤揣浣嶇姸鎬�", "field": "AfterStatus", "type": "select", dataKey: "LocationState", data: [] },
+                { "title": "鍙樺姩绫诲瀷", "field": "changeType", type: "select", dataKey: "StatusChangeType", data: []  },
+            ]
+        ]);
+        const columns = ref([{ field: 'Id', title: '涓婚敭', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
+        { field: 'locationId', title: '璐т綅ID', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
+        { field: 'locationCode', title: '璐т綅缂栧彿', type: 'string', width: 110, require: true, align: 'left' },
+        { field: 'beforeStatus', title: '鍙樺姩鍓嶈揣浣嶇姸鎬�', type: 'int', width: 120, align: 'left', bind: { key: "LocationState", data: [] } },
+        { field: 'afterStatus', title: '鍙樺姩鍚庤揣浣嶇姸鎬�', type: 'int', width: 110, require: true, align: 'left', sort: true, bind: { key: "LocationState", data: [] } },
+        { field: 'changeType', title: '鍙樺姩绫诲瀷锛堝嚭搴撱�佸叆搴撱�佹墜鍔ㄨ皟鏁�...锛�', type: 'string', width: 70, align: 'left', bind: { key: "StatusChangeType", data: [] }  },
+        { field: 'orderId', title: '鍗曟嵁涓婚敭', type: 'string', width: 70, align: 'left' },
+        { field: 'orderNo', title: '鍗曟嵁缂栧彿', type: 'string', width: 110, align: 'left' },
+        { field: 'orderDetailId', title: '鍗曟嵁鏄庣粏涓婚敭', type: 'string', width: 110, align: 'left' },
+        { field: 'taskNum', title: '浠诲姟鍙�', type: 'string', width: 110, align: 'left' },
+        { field: 'remark', title: '澶囨敞', type: 'int', width: 110, align: 'left' },
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100, align: 'left' },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true }]);
+        const detail = ref({
+            cnName: "#detailCnName",
+            table: "#detailTable",
+            columns: [],
+            sortName: "",
+            key: ""
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/PointStackerRelation.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/PointStackerRelation.vue
new file mode 100644
index 0000000..58d4eea
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/basicinfo/PointStackerRelation.vue
@@ -0,0 +1,81 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/basicinfo/PointStackerRelation.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend">
+    </view-grid>
+</template>
+<script>
+import extend from "@/extension/widesea_wms/basicinfo/PointStackerRelation.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'PointID',
+            footer: "Foots",
+            cnName: '鍒嗛厤鍖哄煙鍏崇郴',
+            name: 'PointStackerRelation',
+            url: "/PointStackerRelation/",
+            sortName: "PointID"
+        });
+        const editFormFields = ref({
+            "pointCode": "",
+            "stackerCode": "",
+            "direction": "",
+            "area": "",
+        });
+        const editFormOptions = ref([
+            [
+                { "title": "绔欏彴缂栧彿", "field": "pointCode", type: "text" },
+                { "title": "鍫嗗灈鏈虹紪鍙�", "field": "stackerCode", type: "text" },
+            ],
+            [
+                { "title": "鍏崇郴鐨勬柟鍚�", "field": "direction", type: "text" },
+                { "title": "鍏崇郴鐨勫尯鍩�", "field": "area", type: "text" },
+            ]
+        ]);
+        const searchFormFields = ref({});
+        const searchFormOptions = ref([
+            [
+                { "title": "绔欏彴缂栧彿", "field": "pointCode", type: "text" },
+                { "title": "鍫嗗灈鏈虹紪鍙�", "field": "stackerCode", type: "text" },
+            ],
+            [
+                { "title": "鍏崇郴鐨勬柟鍚�", "field": "direction", type: "text" },
+                { "title": "鍏崇郴鐨勫尯鍩�", "field": "area", type: "text" },
+            ]
+        ]);
+        const columns = ref([{ field: 'PointID', title: '涓婚敭', type: 'int', sort: true, hidden: true, width: 110, readonly: true, require: true, align: 'left' },
+        { field: 'pointCode', title: '绔欏彴缂栧彿', type: 'string', sort: true, width: 110, require: true, align: 'left', sort: true },
+        { field: 'stackerCode', title: '鍫嗗灈鏈虹紪鍙�', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'direction', title: '鍏崇郴鐨勬柟鍚�(P 鎴� S)', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'area', title: '鍏崇郴鐨勫尯鍩�', type: 'int', sort: true, width: 110, align: 'left' },
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150, hidden: true, align: 'left', sort: true },])
+        const detail = ref({
+            cnName: "#detailCnName",
+            table: "#detailTable",
+            columns: [],
+            sortName: "",
+            key: ""
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_InboundOrder.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_InboundOrder.vue
new file mode 100644
index 0000000..f71b29a
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_InboundOrder.vue
@@ -0,0 +1,113 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/invoices/Dt_InboundOrder.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend">
+    </view-grid>
+</template>
+<script>
+import extend from "@/extension/widesea_wms/invoices/Dt_InboundOrder.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'orderId',
+            footer: "Foots",
+            cnName: '鍗曟嵁淇℃伅',
+            name: 'invoices/Dt_InboundOrder',
+            url: "/Dt_InboundOrder/",
+            sortName: "orderId"
+        });
+        const editFormFields = ref({
+            "inboundNo": "",
+            "inboundUpperNo": "",
+            "inboundState": "",
+            "batchNo": "",
+            "inboundDate": "",
+            "inboundType": "",
+        });
+        const editFormOptions = ref([
+            [
+                { "title": "鍗曟嵁缂栧彿", "field": "inboundNo", type: "text" },
+                { "title": "涓婃父鍗曟嵁缂栧彿", "field": "inboundUpperNo", type: "text" },
+                { "title": "鍗曟嵁鐘舵��", "field": "inboundState", type: "select",dataKey:"InboundState",data:[] },
+                { "title": "涓婃父鍗曟嵁绫诲瀷", "field": "inboundType", type: "select",dataKey:"InOrderType",data:[]  },
+
+            ], [
+                { "title": "鎵规鍙�", "field": "batchNo", type: "text" },
+                { "title": "鍗曟嵁鏃ユ湡", "field": "inboundDate", type: "datetime" },
+
+            ]
+        ]);
+        const searchFormFields = ref({});
+        const searchFormOptions = ref([
+            [
+                { "title": "鍗曟嵁缂栧彿", "field": "inboundNo", type: "text" },
+                { "title": "涓婃父鍗曟嵁缂栧彿", "field": "inboundUpperNo", type: "text" },
+                { "title": "鍗曟嵁鐘舵��", "field": "inboundState", type: "select", dataKey: "InboundState", data: [] },
+            ]
+        ]);
+        const columns = ref([{ field: 'orderId', title: '鍏ュ簱鍗旾D', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
+        { field: 'inboundNo', title: '鍗曟嵁缂栧彿', link: true, type: 'string', width: 110, align: 'left', sort: true },
+        { field: 'batchNo', title: '鎵规鍙�', type: 'string', width: 110, align: 'left' },
+        { field: 'inboundDate', title: '鍗曟嵁鏃ユ湡', type: 'datetime', width: 150, align: 'left', sort: true },
+        { field: 'inboundState', title: '鍗曟嵁鐘舵��', type: 'int', width: 110, align: 'left', bind: { key: "InboundState", data: [] } },
+        { field: 'inboundUpperNo', title: '涓婃父鍗曟嵁缂栧彿', type: 'string', width: 110, align: 'left' },
+        { field: 'inboundType', title: '涓婃父鍗曟嵁绫诲瀷', type: 'int', width: 110, align: 'left', bind: { key: "InOrderType", data: [] } },
+        { field: 'remark', title: '澶囨敞', type: 'string', width: 120, hidden: true, align: 'left' },
+        { field: 'createID', title: '鍒涘缓ID', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'modifyID', title: '淇敼浜篒D', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100, align: 'left' },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'spare1', title: 'Spare1', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare2', title: 'Spare2', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare3', title: 'Spare3', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare4', title: 'Spare4', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare5', title: 'Spare5', type: 'string', sort: true, width: 110, hidden: true, align: 'left' }]);
+
+        const detail = ref({
+            cnName: "鍗曟嵁鏄庣粏淇℃伅",
+            table: "Dt_InboundOrderDetail",
+            columns: [
+                { field: 'orderDetailId', title: '鍏ュ簱鍗曟槑缁咺D', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
+                { field: 'orderId', title: '鍏ュ簱鍗旾D', type: 'int', width: 110, hidden: true, align: 'left', sort: true, edit: { type: "" } },
+                { field: 'inboundNo', title: '鍗曟嵁缂栧彿', type: 'string', width: 110, align: 'left', edit: { type: "" } },
+                { field: 'batchNo', title: '鎵规鍙�', type: 'string', width: 110, align: 'left', edit: { type: "" } },
+                { field: 'inboundType', title: '鍗曟嵁绫诲瀷', type: 'int', width: 110, align: 'left', bind: { key: "InOrderType", data: [] }, edit: { type: "select" } },
+                { field: 'inboundState', title: '鍗曟嵁鏄庣粏鐘舵��', type: 'int', width: 110, align: 'left', bind: { key: "InboundState", data: [] }, edit: { type: "select" } },
+                { field: 'materialNo', title: '鐗╂枡缂栧彿', type: 'string', width: 110, align: 'left', edit: { type: "number" } },
+                { field: 'materialName', title: '鐗╂枡鍚嶇О', type: 'string', width: 110, align: 'left', edit: { type: "" } },
+                { field: 'preInboundQuantity', title: '棰勮鍏ュ簱鏁伴噺', type: 'string', width: 110, align: 'left', edit: { type: "" } },
+                { field: 'actualInboundQuantity', title: '瀹為檯鍏ュ簱鏁伴噺', type: 'string', width: 110, align: 'left', edit: { type: "" } },
+                { field: 'unit', title: '鍏ュ簱鍗曚綅', type: 'string', width: 110, align: 'left', edit: { type: "" } },
+                { field: 'remark', title: '澶囨敞', type: 'string', width: 120, align: 'left', edit: { type: "" } },
+                { field: 'createID', title: '鍒涘缓ID', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },
+                { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+                { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, hidden: true, align: 'left', sort: true },
+                { field: 'modifyID', title: '淇敼浜篒D', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },
+                { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100, hidden: true, align: 'left' },
+                { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150, hidden: true, align: 'left', sort: true },
+            ],
+            sortName: "orderId",
+            key: "orderDetailId"
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_InboundOrderDetail.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_InboundOrderDetail.vue
new file mode 100644
index 0000000..efa310c
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_InboundOrderDetail.vue
@@ -0,0 +1,94 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/invoices/Dt_InboundOrderDetail.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/widesea_wms/invoices/Dt_InboundOrderDetail.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'orderDetailId',
+                footer: "Foots",
+                cnName: '鍏ュ簱鍗曟槑缁�',
+                name: 'invoices/Dt_InboundOrderDetail',
+                url: "/Dt_InboundOrderDetail/",
+                sortName: "OrderId"
+            });
+            const editFormFields = ref({
+                "inboundNo":"",
+                "materialNo":""
+            });
+            const editFormOptions = ref([
+            [
+                { "title": "鍗曟嵁缂栧彿", "field": "inboundNo", type: "text" },
+                { "title": "鐗╂枡缂栧彿", "field": "materialNo", type: "text" },
+                { "title": "鍗曟嵁绫诲瀷", "field": "inboundType", type: "select" ,dataKey:"InOrderType",data:[]},
+                { "title": "鍗曟嵁鏄庣粏鐘舵��", "field": "inboundState", type: "select",dataKey:"InboundState",data:[]},
+            ]
+            ]);
+            const searchFormFields = ref({
+                "inboundNo":"",
+                "materialNo":""
+            });
+            const searchFormOptions = ref([
+            [
+                { "title": "鍗曟嵁缂栧彿", "field": "InboundNo", type: "text" },
+                {"title" : "鐗╂枡缂栧彿", "field": "MaterialNo","type":"text"},
+                { "title": "鍗曟嵁绫诲瀷", "field": "inboundType", type: "select" ,dataKey:"InOrderType",data:[]},
+                { "title": "鍗曟嵁鏄庣粏鐘舵��", "field": "inboundState", type: "select",dataKey:"InboundState",data:[]},
+            ]
+            ]);
+            const columns = ref([{field:'orderDetailId',title:'鍏ュ簱鍗曟槑缁咺D',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'orderId',title:'鍏ュ簱鍗旾D',type:'int',width:110,hidden:true,align:'left',sort:true},
+                       {field:'inboundNo',title:'鍗曟嵁缂栧彿',type:'string',width:110,align:'left'},
+                       {field:'batchNo',title:'鎵规鍙�',type:'string',width:110,align:'left'},
+                       {field:'inboundType',title:'鍗曟嵁绫诲瀷',type:'int',width:110,align:'left', bind: { key: "InOrderType", data: [] },},
+                       {field:'inboundState',title:'鍗曟嵁鏄庣粏鐘舵��',type:'int',width:110,align:'left', bind: { key: "InboundState", data: [] },},
+                       {field:'materialNo',title:'鐗╂枡缂栧彿',type:'string',width:110,align:'left'},
+                       {field:'materialName',title:'鐗╂枡鍚嶇О',type:'string',width:110,align:'left'},
+                       {field:'preInboundQuantity',title:'棰勮鍏ュ簱鏁伴噺',type:'string',width:110,align:'left'},
+                       {field:'actualInboundQuantity',title:'瀹為檯鍏ュ簱鏁伴噺',type:'string',width:110,align:'left'},
+                       {field:'unit',title:'鍏ュ簱鍗曚綅',type:'string',width:110,align:'left'},
+                       {field:'remark',title:'澶囨敞',type:'string',width:120,align:'left'},
+                       {field:'createID',title:'鍒涘缓ID',type:'int',sort:true,width:100,hidden:true,align:'left'},
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'createDate',title:'鍒涘缓鏃堕棿',type:'datetime',sort:true,width:150,hidden:true,align:'left',sort:true},
+                       {field:'modifyID',title:'淇敼浜篒D',type:'int',sort:true,width:100,hidden:true,align:'left'},
+                       {field:'modifier',title:'淇敼浜�',type:'string',sort:true,width:100,hidden:true,align:'left'},
+                       {field:'modifyDate',title:'淇敼鏃堕棿',type:'datetime',sort:true,width:150,hidden:true,align:'left',sort:true},
+                       ]);
+            const detail = ref({
+                cnName: "#detailCnName",
+                table: "#detailTable",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrder.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrder.vue
new file mode 100644
index 0000000..a306d1c
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrder.vue
@@ -0,0 +1,116 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/invoices/Dt_OutOrder.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/widesea_wms/invoices/Dt_OutOrder.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'id',
+                footer: "Foots",
+                cnName: '鍑哄簱璁㈠崟',
+                name: 'invoices/Dt_OutOrder',
+                url: "/Dt_OutOrder/",
+                sortName: "Id"
+            });
+            const editFormFields = ref({
+                "orderNumber":"",
+                "status":"",
+                "orderDate":"",
+                "warehouseId":"",
+                "upperOutOrderId":"",
+                "remarks":"",
+
+            });
+            const editFormOptions = ref([
+            [
+                { "title": "鍑哄簱鍗曞彿", "field": "orderNumber", "type": "text" },
+                { "title": "鍑哄簱鏃ユ湡", "field": "orderDate", "type": "datetime" },
+                { "title": "鍗曟嵁鐘舵��", "field": "status", "type": "select",dataKey:"OutOrderType",data:[] },
+            ],
+            [
+                { "title": "浠撳簱ID", "field": "warehouseId", "type": "text" },
+                { "title": "涓婃湁绯荤粺鍗曟嵁ID", "field": "upperOutOrderId", "type": "text" },
+                { "title": "澶囨敞", "field": "remarks", "type": "text" },
+            ],
+            ]);
+            const searchFormFields = ref({});
+            const searchFormOptions = ref([
+            [
+                { "title": "鍑哄簱鍗曞彿", "field": "orderNumber", "type": "text" },
+                { "title": "鍗曟嵁鐘舵��", "field": "status", "type": "text" },
+                { "title": "浠撳簱ID", "field": "warehouseId", "type": "text" },
+                { "title": "鍑哄簱鏃ユ湡", "field": "orderDate", "type": "datetime" },
+            ],
+            ]);
+            const columns = ref([{field:'Id',title:'涓婚敭锛岃嚜鍔ㄥ闀�',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'orderNumber',title:'鍑哄簱鍗曞彿',type:'string',width:220,require:true,align:'left',sort:true},
+                       {field:'orderDate',title:'鍑哄簱鏃ユ湡',type:'datetime',width:150,require:true,align:'left',sort:true},
+                       {field:'warehouseId',title:'浠撳簱ID',type:'int',width:110,require:true,align:'left'},
+                       {field:'status',title:'鍗曟嵁鐘舵��',type:'string',width:220,require:true,align:'left',bind: { key: "OutOrderType", data: []}},
+                       {field:'upperOutOrderId',title:'涓婃湁绯荤粺鍗曟嵁ID',type:'int',width:110,require:true,align:'left'},
+                       {field:'remarks',title:'	澶囨敞',type:'string',width:220,require:true,align:'left'},
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',sort:true,width:110,align:'left'},
+                       {field:'createDate',title:'鍒涘缓鏃堕棿',type:'datetime',sort:true,width:150,align:'left',sort:true},
+                       {field:'modifier',title:'淇敼浜�',type:'string',sort:true,width:100,align:'left'},
+                       {field:'modifyDate',title:'淇敼鏃堕棿',type:'datetime',sort:true,width:150,align:'left',sort:true},
+                       ]);
+            const detail = ref({
+                cnName: "鍑哄簱鏄庣粏璁㈠崟",
+                table: "#detailTable",
+                columns: [
+                {field:'id',title:'涓婚敭',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'outOrderId',title:'鍑哄簱鍗旾D',type:'int',width:110,hidden:true,require:true,align:'left',sort:true},
+                       {field:'materialId',title:'鐗╂枡ID',type:'int',width:110,hidden:true,require:true,align:'left',edit: { type: "" }},
+                       {field:'inboundNo',title:'鍗曟嵁缂栧彿',type:'string',width:110,align:'left',edit: { type: "" }},
+                       {field:'materialNo',title:'鐗╂枡缂栧彿',type:'string',width:110,align:'left',edit: { type: "" }},
+                       {field:'materialName',title:'鐗╂枡鍚嶇О',type:'string',width:220,require:true,align:'left',edit: { type: "" }},
+                       {field:'batchNumber',title:'鎵规鍙�',type:'string',width:220,require:true,align:'left',edit: { type: "" }},
+                       {field:'outboundQuantity',title:'鍑哄簱鏁伴噺',type:'decimal',width:110,require:true,align:'left',edit: { type: "" }},
+                       {field:'allocatedQuantity',title:'鍒嗛厤鏁伴噺',type:'decimal',width:110,align:'left',edit: { type: "" }},
+                       {field:'completedQuantity',title:'瀹屾垚鏁伴噺',type:'decimal',width:110,align:'left',edit: { type: "" }},
+                       {field:'unitPrice',title:'鍗曚环',type:'decimal',width:110,align:'left',edit: { type: "" }},
+                       {field:'totalPrice',title:'鎬讳环',type:'decimal',width:110,align:'left',edit: { type: "" }},
+                       {field:'remarks',title:'澶囨敞',type:'string',width:220,align:'left',edit: { type: "" }},
+                       {field:'spareField1',title:'澶囩敤瀛楁1',type:'string',width:220,hidden:true,align:'left'},
+                       {field:'spareField2',title:'澶囩敤瀛楁2',type:'string',width:220,hidden:true,align:'left'},
+                       {field:'spareField3',title:'澶囩敤瀛楁3',type:'string',width:220,hidden:true,align:'left'},
+                       {field:'spareField4',title:'澶囩敤瀛楁4',type:'string',width:220,hidden:true,align:'left'},
+                       {field:'spareField5',title:'澶囩敤瀛楁5',type:'string',width:220,hidden:true,align:'left'},
+                       {field:'createDate',title:'	鍒涘缓鏃ユ湡',type:'datetime',width:150,hidden:true,require:true,align:'left',sort:true},
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',width:220,hidden:true,require:true,align:'left'},
+                       {field:'modifyDate',title:'淇敼鏃ユ湡',type:'datetime',width:150,hidden:true,align:'left',sort:true},
+                       {field:'modifier',title:'淇敼浜�',type:'string',width:100,hidden:true,align:'left'}
+                ],
+                sortName: "id",
+                key: "outOrderId"
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderAndStock.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderAndStock.vue
new file mode 100644
index 0000000..4031baf
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderAndStock.vue
@@ -0,0 +1,85 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/invoices/Dt_OutOrderAndStock.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/widesea_wms/invoices/Dt_OutOrderAndStock.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'id',
+                footer: "Foots",
+                cnName: '鍑哄簱璁㈠崟搴撳瓨鏁版嵁鏄庣粏',
+                name: 'invoices/Dt_OutOrderAndStock',
+                url: "/Dt_OutOrderAndStock/",
+                sortName: "Id"
+            });
+            const editFormFields = ref({
+                "locationCode":"",
+            });
+            const editFormOptions = ref([
+            [
+                { "title": "璐т綅缂栧彿", "field": "locationCode", "type": "text" },
+            ],
+            ]);
+            const searchFormFields = ref({});
+            const searchFormOptions = ref([
+            [
+                { "title": "璐т綅缂栧彿", "field": "locationCode", "type": "like" },
+            ],
+            ]);
+            const columns = ref([{field:'id',title:'涓婚敭ID',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'outOrderId',title:'鍑哄簱璁㈠崟澶碔D',type:'int',width:130,require:true,align:'left',sort:true},
+                       {field:'outOrderDetailId',title:'鍑哄簱璁㈠崟鏄庣粏ID',type:'int',width:130,require:true,align:'left'},
+                       {field:'groupId',title:'搴撳瓨澶碔D',type:'int',width:110,require:true,align:'left'},
+                       {field:'groupDetailId',title:'搴撳瓨鏄庣粏ID',type:'int',width:110,require:true,align:'left'},
+                       {field:'locationCode',title:'璐т綅缂栧彿',type:'string',width:220,require:true,align:'left'},
+                       {field:'orderNumber',title:'璁㈠崟缂栧彿',type:'string',width:220,require:true,align:'left'},
+                       {field:'batchNumber',title:'鎵规鍙�',type:'string',width:220,require:true,align:'left'},
+                       {field:'outboundQuantity',title:'鍑哄簱鏁伴噺',type:'decimal',width:110,require:true,align:'left'},
+                       {field:'allocatedQuantity',title:'鍒嗛厤鏁伴噺',type:'decimal',width:110,require:true,align:'left'},
+                       {field:'completedQuantity',title:'瀹屾垚鏁伴噺',type:'decimal',width:110,require:true,align:'left'},
+                       {field:'palletCode',title:'鎵樼洏鍙�',type:'string',width:220,require:true,align:'left'},
+                       {field:'materialNo',title:'鐗╂枡缂栧彿',type:'string',width:220,require:true,align:'left'},
+                       {field:'materialName',title:'鐗╂枡鍚嶇О',type:'string',width:220,require:true,align:'left'},
+                       {field:'state',title:'搴撳瓨鐘舵��',type:'string',width:220,require:true,align:'left'},
+                       {field:'palletQuantity',title:'搴撳瓨鏁伴噺',type:'decimal',width:110,require:true,align:'left'},
+                       {field:'creater',title:'鍒涘缓鑰�',type:'string',width:220,require:true,align:'left'},
+                       {field:'createDate',title:'鍒涘缓鏃堕棿',type:'datetime',width:150,require:true,align:'left',sort:true},
+                       {field:'modifier',title:'淇敼浜�',type:'string',width:100,align:'left'},
+                       {field:'modifyDate',title:'淇敼鏃ユ湡',type:'datetime',width:150,align:'left',sort:true}]);
+            const detail = ref({
+                cnName: "#detailCnName",
+                table: "#detailTable",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderDetail.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderDetail.vue
new file mode 100644
index 0000000..f53ea1e
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderDetail.vue
@@ -0,0 +1,90 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/invoices/Dt_OutOrderDetail.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/widesea_wms/invoices/Dt_OutOrderDetail.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'id',
+                footer: "Foots",
+                cnName: '鍑哄簱鍗曟槑缁�',
+                name: 'invoices/Dt_OutOrderDetail',
+                url: "/Dt_OutOrderDetail/",
+                sortName: "Id"
+            });
+            const editFormFields = ref({
+                "outOrderId":"",
+                "materialName":""
+            });
+            const editFormOptions = ref([
+            [
+                { "title": "鍗曟嵁缂栧彿", "field": "inboundNo", "type": "text" },
+                { "title": "鐗╂枡鍚嶇О", "field": "materialName", "type": "text" },
+            ],
+            ]);
+            const searchFormFields = ref({});
+            const searchFormOptions = ref([
+            [
+                { "title": "鍗曟嵁缂栧彿", "field": "inboundNo", "type": "like" },
+                { "title": "鐗╂枡鍚嶇О", "field": "materialName", "type": "like" },
+            ],
+            ]);
+            const columns = ref([{field:'id',title:'涓婚敭',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'outOrderId',title:'鍑哄簱鍗旾D',type:'int',width:110,hidden:true,require:true,align:'left',sort:true},
+                       {field:'materialId',title:'鐗╂枡ID',type:'int',width:110,hidden:true,require:true,align:'left'},
+                       {field:'inboundNo',title:'鍗曟嵁缂栧彿',type:'string',width:110,align:'left'},
+                       {field:'materialNo',title:'鐗╂枡缂栧彿',type:'string',width:110,align:'left'},
+                       {field:'materialName',title:'鐗╂枡鍚嶇О',type:'string',width:220,require:true,align:'left'},
+                       {field:'batchNumber',title:'鎵规鍙�',type:'string',width:220,require:true,align:'left'},
+                       {field:'outboundQuantity',title:'鍑哄簱鏁伴噺',type:'decimal',width:110,require:true,align:'left'},
+                       {field:'allocatedQuantity',title:'鍒嗛厤鏁伴噺',type:'decimal',width:110,align:'left'},
+                       {field:'completedQuantity',title:'瀹屾垚鏁伴噺',type:'decimal',width:110,align:'left'},
+                       {field:'unitPrice',title:'鍗曚环',type:'decimal',width:110,align:'left'},
+                       {field:'totalPrice',title:'鎬讳环',type:'decimal',width:110,align:'left'},
+                       {field:'remarks',title:'澶囨敞',type:'string',width:220,align:'left'},
+                       {field:'spareField1',title:'澶囩敤瀛楁1',type:'string',width:220,hidden:true,align:'left'},
+                       {field:'spareField2',title:'澶囩敤瀛楁2',type:'string',width:220,hidden:true,align:'left'},
+                       {field:'spareField3',title:'澶囩敤瀛楁3',type:'string',width:220,hidden:true,align:'left'},
+                       {field:'spareField4',title:'澶囩敤瀛楁4',type:'string',width:220,hidden:true,align:'left'},
+                       {field:'spareField5',title:'澶囩敤瀛楁5',type:'string',width:220,hidden:true,align:'left'},
+                       {field:'createDate',title:'	鍒涘缓鏃ユ湡',type:'datetime',width:150,hidden:true,require:true,align:'left',sort:true},
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',width:220,hidden:true,require:true,align:'left'},
+                       {field:'modifyDate',title:'淇敼鏃ユ湡',type:'datetime',width:150,hidden:true,align:'left',sort:true},
+                       {field:'modifier',title:'淇敼浜�',type:'string',width:100,hidden:true,align:'left'}]);
+            const detail = ref({
+                cnName: "#detailCnName",
+                table: "#detailTable",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderProduction.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderProduction.vue
new file mode 100644
index 0000000..8912293
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderProduction.vue
@@ -0,0 +1,104 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/invoices/Dt_OutOrderProduction.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/widesea_wms/invoices/Dt_OutOrderProduction.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'id',
+                footer: "Foots",
+                cnName: '鐢熶骇鍑哄簱鍗�',
+                name: 'invoices/Dt_OutOrderProduction',
+                url: "/Dt_OutOrderProduction/",
+                sortName: "Id"
+            });
+            const editFormFields = ref({
+                "orderNumber":"",
+                "status":"",
+                "warehouseId":"",
+                "orderDate":""
+            });
+            const editFormOptions = ref([
+            [
+                { "title": "鍗曟嵁缂栧彿", "field": "orderNumber", "type": "text" },
+                { "title": "鍗曟嵁鐘舵��", "field": "status", "type": "select",dataKey:"OutOrderType",data:[] },
+            ],
+            [
+                { "title": "浠撳簱ID", "field": "warehouseId", "type": "text" },
+                { "title": "鍗曟嵁鏃ユ湡", "field": "orderDate", "type": "datetime" },
+            ],
+            ]);
+            const searchFormFields = ref({});
+            const searchFormOptions = ref([
+            [
+                { "title": "鍗曟嵁缂栧彿", "field": "orderNumber", "type": "text" },
+                { "title": "鍗曟嵁鐘舵��", "field": "status", "type": "select",dataKey:"OutOrderType",data:[] },
+            ],
+            [
+                { "title": "浠撳簱ID", "field": "warehouseId", "type": "text" },
+                { "title": "鍗曟嵁鏃ユ湡", "field": "orderDate", "type": "datetime" },
+            ],
+            ]);
+            const columns = ref([{field:'id',title:'涓婚敭',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'orderNumber',title:'鍗曟嵁缂栧彿',type:'string',width:220,require:true,align:'left',sort:true},
+                       {field:'orderDate',title:'鍗曟嵁鏃ユ湡',type:'datetime',width:150,require:true,align:'left',sort:true},
+                       {field:'warehouseId',title:'浠撳簱ID',type:'int',width:110,require:true,align:'left'},
+                       {field:'status',title:'鍗曟嵁鐘舵��',type:'int',width:220,require:true,align:'left',bind: { key: "OutOrderType", data: []}},
+                       {field:'remarks',title:'澶囨敞',type:'string',width:220,align:'left'},
+                       {field:'createDate',title:'鍒涘缓鏃ユ湡',type:'datetime',width:150,require:true,align:'left',sort:true},
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',width:220,require:true,align:'left'},
+                       {field:'modifyDate',title:'淇敼鏃ユ湡',type:'datetime',width:150,align:'left',sort:true},
+                       {field:'modifier',title:'淇敼浜�',type:'string',width:100,align:'left'}]);
+            const detail = ref({
+                cnName: "鐢熶骇鍑哄簱璁㈠崟鏄庣粏",
+                table: "#detailTable",
+                columns: [
+                       {field:'id',title:'涓婚敭',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'inboundNo',title:'鍗曟嵁缂栧彿',type:'string',width:110,align:'left',sort:true,edit: { type: "" }},
+                       {field:'materialNo',title:'鐗╂枡缂栧彿',type:'string',width:110,align:'left',edit: { type: "" }},
+                       {field:'materialName',title:'鐗╂枡鍚嶇О',type:'string',width:110,align:'left',edit: { type: "" }},
+                       {field:'batchNumber',title:'鎵规鍙�',type:'string',width:220,require:true,align:'left',edit: { type: "" }},
+                       {field:'productionOutOrderId',title:'鐢熶骇鍑哄簱鍗旾D',type:'int',width:130,hidden:true,require:true,align:'left',sort:true,edit: { type: "" }},
+                       {field:'materialId',title:'鐗╂枡ID',type:'int',width:110,hidden:true,require:true,align:'left',edit: { type: "" }},
+                       {field:'quantity',title:'鏁伴噺',type:'decimal',width:110,require:true,align:'left',edit: { type: "" }},
+                       {field:'unitPrice',title:'鍗曚环',type:'decimal',width:110,align:'left',edit: { type: "" }},
+                       {field:'totalPrice',title:'鎬讳环',type:'decimal',width:110,align:'left',edit: { type: "" }},
+                       {field:'remarks',title:'澶囨敞',type:'string',width:220,align:'left',edit: { type: "" }},    
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',width:220,require:true,align:'left'},                  
+                       {field:'createDate',title:'鍒涘缓鏃堕棿',type:'datetime',width:150,require:true,align:'left',sort:true}, 
+                       {field:'modifier',title:'淇敼浜�',type:'string',width:100,align:'left'},                   
+                       {field:'modifyDate',title:'淇敼鏃堕棿',type:'datetime',width:150,align:'left',sort:true}
+                ],
+                sortName: "id",
+                key: "productionOutOrderId"
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderProductionDetail.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderProductionDetail.vue
new file mode 100644
index 0000000..8b4893a
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderProductionDetail.vue
@@ -0,0 +1,83 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/invoices/Dt_OutOrderProductionDetail.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/widesea_wms/invoices/Dt_OutOrderProductionDetail.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'id',
+                footer: "Foots",
+                cnName: '鐢熶骇鍑哄簱鍗曟槑缁�',
+                name: 'invoices/Dt_OutOrderProductionDetail',
+                url: "/Dt_OutOrderProductionDetail/",
+                sortName: "Id"
+            });
+            const editFormFields = ref({
+                "materialId":"",
+                "quantity":""
+            });
+            const editFormOptions = ref([
+            [
+                { "title": "鐗╂枡ID", "field": "materialId", "type": "text" },
+                { "title": "鏁伴噺", "field": "quantity", "type": "text" },
+            ],
+            ]);
+            const searchFormFields = ref({});
+            const searchFormOptions = ref([
+            [
+                { "title": "鐗╂枡ID", "field": "materialId", "type": "like" },
+                { "title": "鏁伴噺", "field": "quantity", "type": "like" },
+            ],
+            ]);
+            const columns = ref([{field:'id',title:'涓婚敭',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'inboundNo',title:'鍗曟嵁缂栧彿',type:'string',width:110,align:'left',sort:true},
+                       {field:'materialNo',title:'鐗╂枡缂栧彿',type:'string',width:110,align:'left'},
+                       {field:'materialName',title:'鐗╂枡鍚嶇О',type:'string',width:110,align:'left'},
+                       {field:'batchNumber',title:'鎵规鍙�',type:'string',width:220,require:true,align:'left'},
+                       {field:'productionOutOrderId',title:'鐢熶骇鍑哄簱鍗旾D',type:'int',width:130,hidden:true,require:true,align:'left',sort:true},
+                       {field:'materialId',title:'鐗╂枡ID',type:'int',width:110,hidden:true,require:true,align:'left'},
+                       {field:'quantity',title:'鏁伴噺',type:'decimal',width:110,require:true,align:'left'},
+                       {field:'unitPrice',title:'鍗曚环',type:'decimal',width:110,align:'left'},
+                       {field:'totalPrice',title:'鎬讳环',type:'decimal',width:110,align:'left'},
+                       {field:'remarks',title:'澶囨敞',type:'string',width:220,align:'left'},    
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',width:220,require:true,align:'left'},                  
+                       {field:'createDate',title:'鍒涘缓鏃堕棿',type:'datetime',width:150,require:true,align:'left',sort:true}, 
+                       {field:'modifier',title:'淇敼浜�',type:'string',width:100,align:'left'},                   
+                       {field:'modifyDate',title:'淇敼鏃堕棿',type:'datetime',width:150,align:'left',sort:true}]);                       
+            const detail = ref({
+                cnName: "#detailCnName",
+                table: "#detailTable",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderSorting.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderSorting.vue
new file mode 100644
index 0000000..91c6d33
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderSorting.vue
@@ -0,0 +1,99 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/invoices/Dt_OutOrderSorting.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/widesea_wms/invoices/Dt_OutOrderSorting.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'sortingID',
+                footer: "Foots",
+                cnName: '鍒嗘嫞鍗�',
+                name: 'invoices/Dt_OutOrderSorting',
+                url: "/Dt_OutOrderSorting/",
+                sortName: "SortingID"
+            });
+            const editFormFields = ref({
+                "orderID":"",
+                "sortingStatus":""
+            });
+            const editFormOptions = ref([
+            [
+                { "title": "璁㈠崟鍙�", "field": "orderID", "type": "text" },
+                { "title": "鍒嗘嫞鐘舵��", "field": "sortingStatus", "type": "text" },
+            ],
+            ]);
+            const searchFormFields = ref({});
+            const searchFormOptions = ref([
+            [
+                { "title": "璁㈠崟鍙�", "field": "materialId", "type": "like" },
+                { "title": "鍒嗘嫞鐘舵��", "field": "sortingStatus", "type": "like" },
+            ],
+            ]);
+            const columns = ref([{field:'sortingID',title:'鍒嗘嫞鍗曞彿',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'orderID',title:'璁㈠崟鍙�',type:'string',width:110,require:true,align:'left',sort:true},
+                       {field:'customerName',title:'瀹㈡埛鍚嶇О',type:'string',width:120,align:'left'},
+                       {field:'materialNo',title:'鐗╂枡缂栧彿',type:'string',width:110,align:'left'},
+                       {field:'materialName',title:'鐗╂枡鍚嶇О',type:'string',width:110,align:'left'},
+                       {field:'specification',title:'瑙勬牸',type:'string',width:120,align:'left'},
+                       {field:'unit',title:'鍗曚綅',type:'string',width:110,align:'left'},
+                       {field:'requiredQuantity',title:'闇�姹傛暟閲�',type:'int',width:110,align:'left'},
+                       {field:'stockLocation',title:'搴撳瓨浣嶇疆',type:'string',width:110,align:'left'},
+                       {field:'sortedQuantity',title:'鍒嗘嫞鏁伴噺',type:'int',width:110,align:'left'},
+                       {field:'sortingOrder',title:'鍒嗘嫞椤哄簭',type:'int',width:110,align:'left'},
+                       {field:'sortingZone',title:'鍒嗘嫞鍖哄煙',type:'string',width:110,align:'left'},
+                       {field:'sortingMethod',title:'鍒嗘嫞鏂瑰紡',type:'string',width:110,align:'left'},
+                       {field:'sortingDate',title:'鍒嗘嫞鏃ユ湡',type:'datetime',width:150,align:'left',sort:true},
+                       {field:'picker',title:'鍒嗘嫞鍛�',type:'string',width:110,align:'left'},
+                       {field:'sortingStatus',title:'鍒嗘嫞鐘舵��',type:'string',width:110,align:'left'},
+                       {field:'sortingCompletionTime',title:'鍒嗘嫞瀹屾垚鏃堕棿',type:'datetime',width:150,align:'left',sort:true},
+                       {field:'sortingDifference',title:'鍒嗘嫞宸紓',type:'int',width:110,align:'left'},
+                       {field:'differenceReason',title:'宸紓鍘熷洜',type:'string',width:220,align:'left'},
+                       {field:'sortingRemarks',title:'鍒嗘嫞澶囨敞',type:'string',width:220,align:'left'},
+                       {field:'reviewer',title:'澶嶆牳鍛�',type:'string',width:110,align:'left'},
+                       {field:'reviewResult',title:'澶嶆牳缁撴灉',type:'string',width:110,align:'left'},
+                       {field:'materielCode',title:'浜у搧缂栫爜',type:'string',width:110,hidden:true,require:true,align:'left'},
+                       {field:'materielName',title:'浜у搧鍚嶇О',type:'string',width:120,hidden:true,align:'left'},
+                       {field:'comments',title:'澶囨敞',type:'string',width:220,hidden:true,align:'left'},
+                       {field:'createID',title:'鍒涘缓鑰匢D',type:'int',width:100,hidden:true,require:true,align:'left'},
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',width:220,require:true,align:'left'},
+                       {field:'createDate',title:'鍒涘缓鏃堕棿',type:'datetime',width:150,require:true,align:'left',sort:true},
+                       {field:'modifyID',title:'淇敼浜篒D',type:'int',width:100,hidden:true,align:'left'},
+                       {field:'modifier',title:'淇敼浜�',type:'string',width:100,align:'left'},
+                       {field:'modifyDate',title:'淇敼鏃ユ湡',type:'datetime',width:150,align:'left',sort:true}]);
+            const detail = ref({
+                cnName: "#detailCnName",
+                table: "#detailTable",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderTransfer.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderTransfer.vue
new file mode 100644
index 0000000..884063f
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderTransfer.vue
@@ -0,0 +1,104 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/invoices/Dt_OutOrderTransfer.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/widesea_wms/invoices/Dt_OutOrderTransfer.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'id',
+                footer: "Foots",
+                cnName: '璋冩嫧鍑哄簱鍗�',
+                name: 'invoices/Dt_OutOrderTransfer',
+                url: "/Dt_OutOrderTransfer/",
+                sortName: "Id"
+            });
+            const editFormFields = ref({
+                "orderNumber":"",
+                "status":"",
+                "sourceWarehouse":"",
+                "destinationWarehouse":"",
+                "orderDate":""
+            });
+            const editFormOptions = ref([
+            [
+                { "title": "鍗曟嵁缂栧彿", "field": "orderNumber", "type": "text" },
+                { "title": "鍘熶粨搴�", "field": "sourceWarehouse", "type": "text" },
+                { "title": "鍗曟嵁鐘舵��", "field": "status", "type": "select",dataKey:"OutOrderType",data:[] },
+            ],
+            [
+                { "title": "鐩爣浠撳簱", "field": "destinationWarehouse", "type": "text" },
+                { "title": "鍗曟嵁鏃ユ湡", "field": "orderDate", "type": "datetime" },
+            ],
+            ]);
+            const searchFormFields = ref({});
+            const searchFormOptions = ref([
+            [
+                { "title": "鍗曟嵁缂栧彿", "field": "orderNumber", "type": "like" },
+                { "title": "鍗曟嵁鐘舵��", "field": "status", "type": "select",dataKey:"OutOrderType",data:[] },
+                { "title": "鍘熶粨搴�", "field": "sourceWarehouse", "type": "like" },
+                { "title": "鐩爣浠撳簱", "field": "destinationWarehouse", "type": "like" },
+            ],
+            ]);
+            const columns = ref([{field:'id',title:'涓婚敭',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'orderNumber',title:'鍗曟嵁缂栧彿',type:'string',width:220,require:true,align:'left',sort:true},
+                       {field:'sourceWarehouse',title:'鍘熶粨搴�',type:'int',width:110,require:true,align:'left'},
+                       {field:'destinationWarehouse',title:'鐩爣浠撳簱',type:'int',width:110,require:true,align:'left'},
+                       {field:'orderDate',title:'鍗曟嵁鏃ユ湡',type:'datetime',width:150,require:true,align:'left',sort:true},
+                       {field:'status',title:'鍗曟嵁鐘舵��',type:'int',width:220,require:true,align:'left',bind: { key: "OutOrderType", data: []}},
+                       {field:'remarks',title:'澶囨敞',type:'string',width:220,align:'left'},
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',width:220,require:true,align:'left'},
+                       {field:'createDate',title:'	鍒涘缓鏃堕棿',type:'datetime',width:150,require:true,align:'left',sort:true},
+                       {field:'modifier',title:'淇敼浜�',type:'string',width:100,align:'left'},
+                       {field:'modifyDate',title:'淇敼鏃堕棿',type:'datetime',width:150,align:'left',sort:true}]);
+            const detail = ref({
+                cnName: "璋冩嫧鍑哄簱鍗曟槑缁�",
+                table: "#detailTable",
+                columns: [
+                {field:'id',title:'涓婚敭',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'transferOutOrderId',title:'璋冩嫧鍑哄簱鍗旾D',type:'int',width:130,hidden:true,require:true,align:'left',sort:true},
+                       {field:'materialNo',title:'鐗╂枡缂栧彿',type:'string',width:110,align:'left',edit: { type: "" }},
+                       {field:'materialName',title:'鐗╂枡鍚嶇О',type:'string',width:110,align:'left',edit: { type: "" }},
+                       {field:'batchNumber',title:'鎵规鍙�',type:'string',width:220,require:true,align:'left',edit: { type: "" }},
+                       {field:'materialId',title:'鐗╂枡ID',type:'int',width:110,hidden:true,require:true,align:'left',edit: { type: "" }},
+                       {field:'quantity',title:'鏁伴噺',type:'decimal',width:110,require:true,align:'left',edit: { type: "" }},
+                       {field:'unitPrice',title:'鍗曚环',type:'decimal',width:110,align:'left',edit: { type: "" }},
+                       {field:'totalPrice',title:'鎬讳环',type:'decimal',width:110,align:'left',edit: { type: "" }},
+                       {field:'remarks',title:'澶囨敞',type:'string',width:220,align:'left',edit: { type: "" }},
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',width:220,require:true,align:'left'},
+                       {field:'createDate',title:'鍒涘缓鏃堕棿',type:'datetime',width:150,require:true,align:'left',sort:true},
+                       {field:'modifier',title:'淇敼浜�',type:'string',width:100,align:'left'},
+                       {field:'modifyDate',title:'淇敼鏃堕棿',type:'datetime',width:150,align:'left',sort:true}
+                ],
+                sortName: "id",
+                key: "transferOutOrderId"
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderTransferDetail.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderTransferDetail.vue
new file mode 100644
index 0000000..807c080
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/invoices/Dt_OutOrderTransferDetail.vue
@@ -0,0 +1,82 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/invoices/Dt_OutOrderTransferDetail.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/widesea_wms/invoices/Dt_OutOrderTransferDetail.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'id',
+                footer: "Foots",
+                cnName: '璋冩嫧鍑哄簱鍗曟槑缁�',
+                name: 'invoices/Dt_OutOrderTransferDetail',
+                url: "/Dt_OutOrderTransferDetail/",
+                sortName: "Id"
+            });
+            const editFormFields = ref({
+                "materialId":"",
+                "quantity":""
+            });
+            const editFormOptions = ref([
+            [
+                { "title": "鐗╂枡ID", "field": "materialId", "type": "text" },
+                { "title": "鏁伴噺", "field": "quantity", "type": "text" },
+            ],
+            ]);
+            const searchFormFields = ref({});
+            const searchFormOptions = ref([
+            [
+                { "title": "鐗╂枡ID", "field": "materialId", "type": "like" },
+                { "title": "鏁伴噺", "field": "quantity", "type": "like" },
+            ],
+            ]);
+            const columns = ref([{field:'id',title:'涓婚敭',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'transferOutOrderId',title:'璋冩嫧鍑哄簱鍗旾D',type:'int',width:130,hidden:true,require:true,align:'left',sort:true},
+                       {field:'materialNo',title:'鐗╂枡缂栧彿',type:'string',width:110,align:'left'},
+                       {field:'materialName',title:'鐗╂枡鍚嶇О',type:'string',width:110,align:'left'},
+                       {field:'batchNumber',title:'鎵规鍙�',type:'string',width:220,require:true,align:'left'},
+                       {field:'materialId',title:'鐗╂枡ID',type:'int',width:110,hidden:true,require:true,align:'left'},
+                       {field:'quantity',title:'鏁伴噺',type:'decimal',width:110,require:true,align:'left'},
+                       {field:'unitPrice',title:'鍗曚环',type:'decimal',width:110,align:'left'},
+                       {field:'totalPrice',title:'鎬讳环',type:'decimal',width:110,align:'left'},
+                       {field:'remarks',title:'澶囨敞',type:'string',width:220,align:'left'},
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',width:220,require:true,align:'left'},
+                       {field:'createDate',title:'鍒涘缓鏃堕棿',type:'datetime',width:150,require:true,align:'left',sort:true},
+                       {field:'modifier',title:'淇敼浜�',type:'string',width:100,align:'left'},
+                       {field:'modifyDate',title:'淇敼鏃堕棿',type:'datetime',width:150,align:'left',sort:true}]);
+            const detail = ref({
+                cnName: "#detailCnName",
+                table: "#detailTable",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/material/Dt_MaterielAttribute.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/material/Dt_MaterielAttribute.vue
new file mode 100644
index 0000000..1e12c14
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/material/Dt_MaterielAttribute.vue
@@ -0,0 +1,86 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/material/Dt_MaterielAttribute.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid"
+               :columns="columns"
+               :detail="detail"
+               :editFormFields="editFormFields"
+               :editFormOptions="editFormOptions"
+               :searchFormFields="searchFormFields"
+               :searchFormOptions="searchFormOptions"
+               :table="table"
+               :extend="extend">
+    </view-grid>
+</template>
+<script>
+    import extend from "@/extension/widesea_wms/material/Dt_MaterielAttribute.js";
+    import { ref, defineComponent } from "vue";
+    export default defineComponent({
+        setup() {
+            const table = ref({
+                key: 'attributeID',
+                footer: "Foots",
+                cnName: '鐗╂枡灞炴��',
+                name: 'material/Dt_MaterielAttribute',
+                url: "/Dt_MaterielAttribute/",
+                sortName: "AttributeID"
+            });
+            const editFormFields = ref({"attributeName":"","attributeDesc":"","stroagecon":""});
+            const editFormOptions = ref([
+            [
+            { "title": "鐗╂枡灞炴�у悕绉�", "field": "attributeName", type: "text" },
+                { "title": "鐗╂枡灞炴�ф弿杩�", "field": "attributeDesc", type: "text" },
+                { "title": "瀛樺偍鏉′欢", "field": "stroagecon", type: "text" },
+            ]
+            ]);
+            const searchFormFields = ref({});
+            const searchFormOptions = ref([
+            [
+                { "title": "鐗╂枡灞炴�у悕绉�", "field": "attributeName", type: "text" },
+                { "title": "鐗╂枡灞炴�ф弿杩�", "field": "attributeDesc", type: "text" },
+                { "title": "瀛樺偍鏉′欢", "field": "stroagecon", type: "text" },
+            ]
+            ]);
+            const columns = ref([{field:'attributeID',title:'灞炴�D',type:'int',width:110,hidden:true,readonly:true,require:true,align:'left'},
+                       {field:'materielID',title:'鐗╂枡ID',type:'int',width:110,align:'left',sort:true,hidden:true},
+                       {field:'attributeCode',title:'灞炴�х紪鍙�',type:'string',width:110,align:'left'},
+                       {field:'attributeName',title:'灞炴�у悕绉�',type:'string',width:110,align:'left'},
+                       {field:'stroagecon',title:'瀛樺偍鏉′欢',type:'string',width:110,align:'left'},
+                       {field:'transpcon',title:'杩愯緭鏉′欢',type:'string',width:110,align:'left'},
+                       {field:'attributeDesc',title:'灞炴�ф弿杩�',type:'string',width:110,align:'left'},
+                       {field:'remark',title:'澶囨敞',type:'string',width:110,hidden:true,align:'left'},
+                       {field:'createID',title:'鍒涘缓ID',type:'int',sort:true,width:100,hidden:true,align:'left'},
+                       {field:'creater',title:'鍒涘缓浜�',type:'string',sort:true,width:110,align:'left'},
+                       {field:'createDate',title:'鍒涘缓鏃堕棿',type:'datetime',sort:true,width:150,align:'left',sort:true},
+                       {field:'modifyID',title:'淇敼浜篒D',type:'int',sort:true,width:100,hidden:true,align:'left'},
+                       {field:'modifier',title:'淇敼浜�',type:'string',sort:true,width:100,hidden:true,align:'left'},
+                       {field:'modifyDate',title:'淇敼鏃堕棿',type:'datetime',sort:true,width:150,hidden:true,align:'left',sort:true},
+                       {field:'spare1',title:'Spare1',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare2',title:'Spare2',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare3',title:'Spare3',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare4',title:'Spare4',type:'string',sort:true,width:110,hidden:true,align:'left'},
+                       {field:'spare5',title:'Spare5',type:'string',sort:true,width:110,hidden:true,align:'left'}]);
+            const detail = ref({
+                cnName: "#detailCnName",
+                table: "#detailTable",
+                columns: [],
+                sortName: "",
+                key: ""
+            });
+            return {
+                table,
+                extend,
+                editFormFields,
+                editFormOptions,
+                searchFormFields,
+                searchFormOptions,
+                columns,
+                detail,
+            };
+        },
+    });
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/material/Dt_MaterielInfo.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/material/Dt_MaterielInfo.vue
new file mode 100644
index 0000000..d554784
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/material/Dt_MaterielInfo.vue
@@ -0,0 +1,95 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/material/Dt_MaterielInfo.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend">
+    </view-grid>
+</template>
+<script>
+import extend from "@/extension/widesea_wms/material/Dt_MaterielInfo.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'materielID',
+            footer: "Foots",
+            cnName: '鐗╂枡淇℃伅',
+            name: 'material/Dt_MaterielInfo',
+            url: "/Dt_MaterielInfo/",
+            sortName: "MaterielID"
+        });
+        const editFormFields = ref({
+            "materielCode": "",
+            "materielName": "",
+            "packspes": "",
+
+        });
+        const editFormOptions = ref([
+            [
+                { "title": "鐗╂枡缂栫爜", "field": "materielCode", type: "text" },
+                { "title": "鐗╂枡鍚嶇О", "field": "materielName", type: "text" },
+                { "title": "鍖呰瑙勬牸", "field": "packspes", type: "text" },
+            ]
+        ]);
+        const searchFormFields = ref({});
+        const searchFormOptions = ref([
+            [
+                { "title": "鐗╂枡ID", "field": "materielID", type: "text" },
+                { "title": "鐗╂枡缂栫爜", "field": "materielCode", type: "text" },
+                { "title": "鐗╂枡鍚嶇О", "field": "materielName", type: "text" },
+                { "title": "鍖呰瑙勬牸", "field": "packspes", type: "text" },
+            ]
+        ]);
+        const columns = ref([{ field: 'materielID', title: '鐗╂枡ID', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
+        { field: 'materielCode', title: '鐗╂枡缂栧彿', type: 'string', width: 110, align: 'left', sort: true },
+        { field: 'materielName', title: '鐗╂枡鍚嶇О', type: 'string', width: 120, align: 'left' },
+        { field: 'packspes', title: '瑙勬牸', type: 'string', width: 110, align: 'left' },
+        { field: 'attribute', title: '灞炴��', type: 'string', width: 110, align: 'left' },
+        { field: 'unit', title: '鍗曚綅', type: 'string', width: 110, align: 'left' },
+        { field: 'wareAreaCode', title: '鎵�灞炲簱鍖�', type: 'string', width: 110, align: 'left' },
+        { field: 'minpackQty', title: '鏈�灏忓寘瑁�', type: 'decimal', width: 110, align: 'left' },
+        { field: 'netweight', title: '鍑�閲�', type: 'decimal', width: 110, align: 'left' },
+        { field: 'grossweight', title: '姣涢噸', type: 'decimal', width: 110, align: 'left' },
+        { field: 'status', title: '褰撳墠鐘舵��', type: 'int', width: 110, align: 'left' },
+        { field: 'validity', title: '鏈夋晥鏈�', type: 'int', width: 110, align: 'left' },
+        { field: 'safety', title: '瀹夊叏搴撳瓨', type: 'decimal', width: 110, align: 'left' },
+        { field: 'mfacturer', title: '鐢熶骇鍟�', type: 'string', width: 120, align: 'left' },
+        { field: 'supplier', title: '渚涘簲鍟�', type: 'string', width: 120, align: 'left' },
+        { field: 'remark', title: '澶囨敞', type: 'string', width: 120, align: 'left' },
+        { field: 'materielDesc', title: '鐗╂枡鎻忚堪', type: 'string', width: 110, align: 'left', hidden: true },
+        { field: 'createID', title: '鍒涘缓ID', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'modifyID', title: '淇敼浜篒D', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150, hidden: true, align: 'left', sort: true },
+        { field: 'spare1', title: 'Spare1', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare2', title: 'Spare2', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare3', title: 'Spare3', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare4', title: 'Spare4', type: 'string', sort: true, width: 110, hidden: true, align: 'left' },
+        { field: 'spare5', title: 'Spare5', type: 'string', sort: true, width: 110, hidden: true, align: 'left' }]);
+        const detail = ref({
+            cnName: "#detailCnName",
+            table: "#detailTable",
+            columns: [],
+            sortName: "",
+            key: ""
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/stock/DtBoxingInfo.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/stock/DtBoxingInfo.vue
new file mode 100644
index 0000000..4e275f8
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/stock/DtBoxingInfo.vue
@@ -0,0 +1,82 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/invoices/Dt_InboundOrder.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend">
+    </view-grid>
+</template>
+<script>
+import extend from "@/extension/widesea_wms/stock/DtBoxingInfo.js";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'id',
+            footer: "Foots",
+            cnName: '缁勭洏淇℃伅',
+            name: 'stock/DtBoxingInfo',
+            url: "/BoxingInfo/",
+            sortName: "id"
+        });
+        const editFormFields = ref({
+
+        });
+        const editFormOptions = ref([
+
+        ]);
+        const searchFormFields = ref({});
+        const searchFormOptions = ref([
+            [
+                { "title": "鎵樼洏鏉$爜", "field": "palletCode", type: "text" },
+                { "title": "鐗╂枡缂栧彿", "field": "materielCode", type: "text" },
+                { "title": "搴撳瓨鐘舵��", "field": "status", type: "select", dataKey: "StockState", data: [] },
+                { "title": "缁勭洏绫诲瀷", "field": "groupType", type: "select", dataKey: "GroupType", data: [] },
+            ],
+            [
+            { "title": "鐢熶骇浜х嚎", "field": "productionLine", type: "select", dataKey: "ProductionLine", data: [] },
+                
+            ]
+        ]);
+        const columns = ref([
+            { field: 'id', title: '搴撳瓨ID', type: 'int', width: 110, readonly: true, hidden: true, require: true, align: 'left' },
+            { field: 'palletCode', title: '鎵樼洏鏉$爜', type: 'string', width: 110, align: 'left', sort: true, link: true, },
+            { field: 'locationCode', title: '搴撲綅', type: 'string', width: 110, align: 'left' },
+            { field: 'isFull', title: '鏄惁婊$洏', type: 'bool', width: 110, align: 'left' },
+            // { field: 'state', title: '搴撳瓨鐘舵��', type: 'int', width: 110, align: 'left', bind: { key: "StockState", data: [] } },
+            { field: 'remark', title: '澶囨敞', type: 'string', width: 120, align: 'left' },
+            { field: 'productionLine', title: '浜х嚎', type: 'string', width: 70, align: 'left' , bind: { key: "ProductionLine", data: [] } },
+            { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'int', sort: true, width: 100, align: 'left' },
+        ]);
+
+        const detail = ref({
+            cnName: "缁勭洏鏄庣粏淇℃伅",
+            table: "DtBoxingInfoDetail",
+            columns: [
+                { title: "鐢佃姱搴忓垪鍙�", field: "serialNumber", type: "text"},
+                { title: "鐗╂枡缂栧彿", field: "materielCode",type: "text" },
+                { title: "鐗╂枡鍚嶇О", field: "materielName", type: "text" },
+                { title: "搴撳瓨鐘舵��", field: "status", type: "text" },
+                { title: "缁勭洏鏁伴噺", field: "stockQuantity", type: "text" },
+                { title: "鍒涘缓鏃堕棿", field: "createDate", type: "text" },
+            ],
+            sortName: "id",
+            key: "BoxingInfoId"
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/stock/Dt_BillGroupStock.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/stock/Dt_BillGroupStock.vue
new file mode 100644
index 0000000..0f033c5
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/stock/Dt_BillGroupStock.vue
@@ -0,0 +1,93 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/stock/Dt_BillGroupStock.js姝ゅ缂栧啓
+ -->
+
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend">
+    </view-grid>
+</template>
+<script>
+import extend from "@/extension/widesea_wms/stock/Dt_BillGroupStock.jsx";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'id',
+            footer: "Foots",
+            cnName: '搴撳瓨淇℃伅',
+            name: 'stock/Dt_BillGroupStock',
+            url: "/StockInfo/",
+            sortName: "createDate"
+        });
+        const editFormFields = ref({
+            "palletCode": "",
+            "productionLine": "",
+            "outboundTime": "",
+            // "groupType": ""
+        });
+        const editFormOptions = ref([
+            [
+                { "title": "鎵樼洏鏉$爜", "field": "palletCode", type: "text" },
+                { "title": "鐢熶骇浜х嚎", "field": "productionLine", type: "text" },
+                { "title": "搴斿嚭搴撴椂闂�", "field": "outboundTime", type: "datetime" },
+                // { "title": "缁勭洏绫诲瀷", "field": "groupType", type: "select", dataKey: "GroupType", data: [] },
+            ]
+        ]);
+        const searchFormFields = ref({});
+        const searchFormOptions = ref([
+            [
+                { "title": "鎵樼洏鏉$爜", "field": "palletCode", type: "text" },
+                { "title": "鐢熶骇浜х嚎", "field": "productionLine", type: "select", dataKey: "ProductionLine", data: [] },
+                { "title": "搴撳尯", "field": "areaCode", type: "select", dataKey: "AreaType", data: [] },
+                { "title": "搴撳瓨绫诲瀷", "field": "isFull", type: "select", dataKey: "isFull", data: [] },
+            ], [
+                { "title": "搴撲綅鍙�", "field": "locationCode", type: "text" },
+                { "title": "宸烽亾", "field": "roadwayNo", type: "text" },
+                { "title": "璐т綅鐘舵��", "field": "locationStatus", type: "select", dataKey: "LocationState", data: [] },
+                { "title": "鍑哄簱鏃堕棿", "field": "outboundTime", type: "datetime"},
+            ]
+        ]);
+        const columns = ref(
+            [{ field: 'id', title: '搴撳瓨ID', type: 'int', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
+            { field: 'locationCode', title: '搴撲綅', type: 'string', width: 100, align: 'left', },
+            { field: 'palletCode', title: '鎵樼洏鏉$爜', type: 'string', width: 110, align: 'left', },
+            { field: 'isFull', title: '搴撳瓨绫诲瀷', type: 'bool', width: 80, align: 'left', bind: { key: "isFull", data: [{ key: false, value: '绌虹洏' }, { key: true, value: '瀹炵洏' }] }, },
+            { field: 'linedProcessFeedbackTime', title: '宸ヨ壓寮�濮嬫椂闂�', type: 'string', width: 110, align: 'left', },
+            { field: 'roadwayNo', title: '宸烽亾', type: 'string', width: 60, align: 'left', sort: true },
+            { field: 'locationStatus', title: '璐т綅鐘舵��', type: 'int', width: 60, align: 'left', bind: { key: "LocationState", data: [] } },
+            { field: 'specialParameterDuration', title: '宸ヨ壓鏃堕暱', type: 'string', width: 60, align: 'left', sort: true },
+            { field: 'outboundTime', title: '搴斿嚭搴撴椂闂�', type: 'string', width: 110, align: 'left', sort: true },
+            { field: 'productionLine', title: '鐢熶骇浜х嚎', type: 'string', width: 60, align: 'left', bind: { key: "ProductionLine", data: [] }  },
+            { field: 'areaCode', title: '搴撳尯', type: 'string', width: 60, align: 'left', bind: { key: "AreaType", data: [] } },
+            { field: 'remark', title: '鐢佃姱鏁伴噺', type: 'string', width: 60, align: 'left', },
+            { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, align: 'left', hidden: true },
+            { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', },
+            { field: 'modifier', title: '鏈�鍚庝慨鏀逛汉', type: 'string', sort: true, width: 100, hidden: true, align: 'left' },
+                // { field: 'modifyDate', title: '鏈�鍚庝慨鏀规椂闂�', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+            ]
+        );
+        const detail = ref({
+            cnName: "#detailCnName",
+            table: "#detailTable",
+            columns: [],
+            sortName: "",
+            key: ""
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/taskinfo/Dt_Task.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/taskinfo/Dt_Task.vue
new file mode 100644
index 0000000..c7af286
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/taskinfo/Dt_Task.vue
@@ -0,0 +1,102 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/taskinfo/Dt_Task.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend" />
+</template>
+<script>
+import extend from "@/extension/widesea_wms/taskinfo/Dt_Task.jsx";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'taskId',
+            footer: "Foots",
+            cnName: '浠诲姟淇℃伅',
+            name: 'taskinfo/Dt_Task',
+            url: "/Task/",
+            sortName: "TaskId"
+        });
+        const editFormFields = ref({
+            "grade": "",
+        });
+        const editFormOptions = ref([
+            [
+                { "title": "浼樺厛绾�", "field": "grade", type: "text" },
+            ],
+        ]);
+        const searchFormFields = ref({
+        });
+        const searchFormOptions = ref([
+            [
+                { "title": "浠诲姟鍙�", "field": "taskNum", "type": "text" },
+                { "title": "鎵樼洏鍙�", "field": "palletCode", "type": "text" },
+                { "title": "浠诲姟绫诲瀷", "field": "taskType", "type": "select", dataKey: "TaskType", data: [] },
+                { "title": "浠诲姟鐘舵��", "field": "taskState", "type": "select", dataKey: "TaskStatus", data: [] },
+
+            ],
+            [
+                { "title": "璧峰浣嶇疆", "field": "sourceAddress", type: "text" },
+                { "title": "褰撳墠浣嶇疆", "field": "currentAddress", type: "text" },
+                { "title": "涓嬩竴浣嶇疆", "field": "nextAddress", type: "text" },
+                { "title": "鐩爣浣嶇疆", "field": "targetAddress", type: "text" },
+            ],
+            [
+                { "title": "宸烽亾", "field": "roadway", type: "text" },
+                { "title": "鐢熶骇浜х嚎", "field": "productionLine", type: "select", dataKey: "ProductionLine", data: [] },
+                { "title": "鍒涘缓浜�", "field": "creater", type: "text" },
+                { "title": "鍒涘缓鏃堕棿", "field": "createDate", type: "datetime" },
+            ],
+        ]);
+        const columns = ref([{ field: 'TaskId', title: '涓婚敭', type: 'string', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
+        { field: 'taskNum', title: '浠诲姟鍙�', type: 'int', width: 110, align: 'left', sort: true },
+        { field: 'palletCode', title: '鎵樼洏鍙�', type: 'string', width: 180, align: 'left' },
+        { field: 'pnboundNo', title: '鍗曟嵁鍙�', type: 'string', width: 110, align: 'left',hidden:true },
+        { field: 'groupID', title: '搴撳瓨ID', type: 'int', width: 110, hidden: true, align: 'left' },
+        { field: 'groupDetailId', title: '缁勭洏鏄庣粏ID', type: 'int', width: 110, hidden: true, align: 'left' },
+        { field: 'roadway', title: '宸烽亾', type: 'string', width: 110, align: 'left' },
+        { field: 'taskType', title: '浠诲姟绫诲瀷', type: 'int', width: 110, align: 'left', bind: { key: "TaskType", data: [] } },
+        { field: 'taskState', title: '浠诲姟鐘舵��', type: 'int', width: 110, align: 'left', bind: { key: "TaskStatus", data: [] } },
+        { field: 'sourceAddress', title: '璧峰浣嶇疆', type: 'string', width: 110, align: 'left' },
+        { field: 'currentAddress', title: '褰撳墠浣嶇疆', type: 'string', width: 110, align: 'left' },
+        { field: 'nextAddress', title: '涓嬩竴浣嶇疆', type: 'string', width: 110, align: 'left' },
+        { field: 'targetAddress', title: '鐩爣浣嶇疆', type: 'string', width: 110, align: 'left' },
+        { field: 'grade', title: '浼樺厛绾�', type: 'int', width: 60, align: 'left' },
+        { field: 'productionLine', title: '浜х嚎', type: 'string', width: 70, align: 'left', bind: { key: "ProductionLine", data: [] }  },
+        { field: 'processCode', title: '宸ュ簭', type: 'string', width: 90, align: 'left' },
+        { field: 'dispatchertime', title: '浠诲姟涓嬪彂鏃堕棿', type: 'datetime', width: 150, align: 'left', sort: true },
+        { field: 'remark', title: '澶囨敞', type: 'string', width: 110, align: 'left',hidden: true, },
+        { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100, align: 'left' },
+        { field: 'locationCode', title: '璐т綅鍙�', type: 'string', width: 110, hidden: true, align: 'left' },
+        { field: 'materialNo', title: '鐗╂枡缂栧彿', type: 'string', width: 110, hidden: true, align: 'left' },
+        { field: 'targetAddress', title: '鐩爣鍦板潃', type: 'string', width: 110, hidden: true, align: 'left' },
+        { field: 'createID', title: '鍒涘缓ID', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'modifyID', title: '淇敼浜篒D', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },]);
+        const detail = ref({
+            cnName: "#detailCnName",
+            table: "#detailTable",
+            columns: [],
+            sortName: "",
+            key: ""
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/taskinfo/Dt_Task_Hty.vue b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/taskinfo/Dt_Task_Hty.vue
new file mode 100644
index 0000000..3b78f15
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/src/views/widesea_wms/taskinfo/Dt_Task_Hty.vue
@@ -0,0 +1,114 @@
+<!--
+*Author锛歫xx
+ *Contact锛�283591387@qq.com
+ *浠g爜鐢辨鏋剁敓鎴�,浠讳綍鏇存敼閮藉彲鑳藉鑷磋浠g爜鐢熸垚鍣ㄨ鐩�
+ *涓氬姟璇峰湪@/extension/widesea_wms/taskinfo/Dt_Task.js姝ゅ缂栧啓
+ -->
+<template>
+    <view-grid ref="grid" :columns="columns" :detail="detail" :editFormFields="editFormFields"
+        :editFormOptions="editFormOptions" :searchFormFields="searchFormFields" :searchFormOptions="searchFormOptions"
+        :table="table" :extend="extend" />
+</template>
+<script>
+import extend from "@/extension/widesea_wms/taskinfo/Dt_Task_Hty.jsx";
+import { ref, defineComponent } from "vue";
+export default defineComponent({
+    setup() {
+        const table = ref({
+            key: 'taskId',
+            footer: "Foots",
+            cnName: '浠诲姟淇℃伅',
+            name: 'taskinfo/Dt_Task_Hty',
+            url: "/Task_Hty/",
+            sortName: "TaskId"
+        });
+        const editFormFields = ref({
+            "taskNum": "",
+            "palletCode": ""
+        });
+        const editFormOptions = ref([
+            [
+                { "title": "浠诲姟鍙�", "field": "taskNum", "type": "text" },
+                { "title": "鎵樼洏鍙�", "field": "palletCode", "type": "text" },
+                { "title": "浠诲姟绫诲瀷", "field": "taskType", "type": "select", dataKey: "TaskType", data: [] },
+                { "title": "浠诲姟鐘舵��", "field": "taskState", "type": "select", dataKey: "TaskStatus", data: [] },
+
+            ],
+            [
+                { "title": "璧峰浣嶇疆", "field": "sourceAddress", type: "text" },
+                { "title": "褰撳墠浣嶇疆", "field": "currentAddress", type: "text" },
+                { "title": "涓嬩竴浣嶇疆", "field": "nextAddress", type: "text" },
+                { "title": "鐩爣浣嶇疆", "field": "targetAddress", type: "text" },
+            ],
+        ]);
+        const searchFormFields = ref({
+        });
+        const searchFormOptions = ref([
+            [
+                { "title": "浠诲姟鍙�", "field": "taskNum", "type": "text" },
+                { "title": "鎵樼洏鍙�", "field": "palletCode", "type": "text" },
+                { "title": "浠诲姟绫诲瀷", "field": "taskType", "type": "select", dataKey: "TaskType", data: [] },
+                { "title": "浠诲姟鐘舵��", "field": "taskState", "type": "select", dataKey: "TaskStatus", data: [] },
+
+            ],
+            [
+                { "title": "璧峰浣嶇疆", "field": "sourceAddress", type: "text" },
+                { "title": "褰撳墠浣嶇疆", "field": "currentAddress", type: "text" },
+                { "title": "涓嬩竴浣嶇疆", "field": "nextAddress", type: "text" },
+                { "title": "鐩爣浣嶇疆", "field": "targetAddress", type: "text" },
+            ],
+            [
+                { "title": "宸烽亾", "field": "roadway", type: "text" },
+                { "title": "鐢熶骇浜х嚎", "field": "productionLine", type: "select", dataKey: "ProductionLine", data: [] },
+                { "title": "鍒涘缓浜�", "field": "creater", type: "text" },
+                { "title": "鍒涘缓鏃堕棿", "field": "createDate", type: "datetime" },
+            ],
+        ]);
+        const columns = ref([{ field: 'TaskId', title: '涓婚敭', type: 'string', width: 110, hidden: true, readonly: true, require: true, align: 'left' },
+        { field: 'taskNum', title: '浠诲姟鍙�', type: 'int', width: 110, align: 'left', sort: true },
+        { field: 'palletCode', title: '鎵樼洏鍙�', type: 'string', width: 150, align: 'left' },
+        { field: 'pnboundNo', title: '鍗曟嵁鍙�', type: 'string', width: 110, align: 'left' ,hidden: true},
+        { field: 'groupID', title: '搴撳瓨ID', type: 'int', width: 110, hidden: true, align: 'left' },
+        { field: 'groupDetailId', title: '缁勭洏鏄庣粏ID', type: 'int', width: 110, hidden: true, align: 'left' },
+        { field: 'roadway', title: '宸烽亾', type: 'string', width: 110, align: 'left' },
+        { field: 'taskType', title: '浠诲姟绫诲瀷', type: 'int', width: 110, align: 'left', bind: { key: "TaskType", data: [] } },
+        { field: 'taskState', title: '浠诲姟鐘舵��', type: 'int', width: 110, align: 'left', bind: { key: "TaskStatus", data: [] } },
+        { field: 'sourceAddress', title: '璧峰浣嶇疆', type: 'string', width: 110, align: 'left' },
+        { field: 'currentAddress', title: '褰撳墠浣嶇疆', type: 'string', width: 110, align: 'left' },
+        { field: 'nextAddress', title: '涓嬩竴浣嶇疆', type: 'string', width: 110, align: 'left' },
+        { field: 'targetAddress', title: '鐩爣浣嶇疆', type: 'string', width: 110, align: 'left' },
+        { field: 'grade', title: '浼樺厛绾�', type: 'int', width: 60, align: 'left' },
+        { field: 'productionLine', title: '浜х嚎', type: 'string', width: 70, align: 'left', bind: { key: "ProductionLine", data: [] }  },
+        { field: 'processCode', title: '宸ュ簭', type: 'string', width: 90, align: 'left' },
+        { field: 'dispatchertime', title: '浠诲姟涓嬪彂鏃堕棿', type: 'datetime', width: 150, align: 'left', sort: true },
+        { field: 'operateType', title: '鎿嶄綔绫诲瀷', type: 'string', width: 110, align: 'left', bind: { key: "operateType", data: [] }},
+        { field: 'remark', title: '澶囨敞', type: 'string', width: 110, align: 'left',hidden: true, },
+        { field: 'createDate', title: '鍒涘缓鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'modifyDate', title: '淇敼鏃堕棿', type: 'datetime', sort: true, width: 150, align: 'left', sort: true },
+        { field: 'creater', title: '鍒涘缓浜�', type: 'string', sort: true, width: 110, align: 'left' },
+        { field: 'modifier', title: '淇敼浜�', type: 'string', sort: true, width: 100, align: 'left' },
+        { field: 'locationCode', title: '璐т綅鍙�', type: 'string', width: 110, hidden: true, align: 'left' },
+        { field: 'materialNo', title: '鐗╂枡缂栧彿', type: 'string', width: 110, hidden: true, align: 'left' },
+        { field: 'targetAddress', title: '鐩爣鍦板潃', type: 'string', width: 110, hidden: true, align: 'left' },
+        { field: 'createID', title: '鍒涘缓ID', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },
+        { field: 'modifyID', title: '淇敼浜篒D', type: 'int', sort: true, width: 100, hidden: true, align: 'left' },]);
+        const detail = ref({
+            cnName: "#detailCnName",
+            table: "#detailTable",
+            columns: [],
+            sortName: "",
+            key: ""
+        });
+        return {
+            table,
+            extend,
+            editFormFields,
+            editFormOptions,
+            searchFormFields,
+            searchFormOptions,
+            columns,
+            detail,
+        };
+    },
+});
+</script>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/vite.config.ts b/3F/Code Management/WMS/WIDESEA_WMSClient/vite.config.ts
new file mode 100644
index 0000000..bc53b3d
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/vite.config.ts
@@ -0,0 +1,82 @@
+import { fileURLToPath } from 'node:url'
+import commonjs from 'vite-plugin-commonjs'
+
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+import vueJsx from '@vitejs/plugin-vue-jsx'
+import { visualizer } from 'rollup-plugin-visualizer'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+  plugins: [
+    commonjs(),
+    // commonjs({
+    //   // 杩欓噷鍙互閰嶇疆鎻掍欢鐨勯�夐」锛屼緥濡傛寚瀹氶渶瑕佽浆鎹㈢殑妯″潡绛�
+    //   include: 'node_modules/**', // 鍖呭惈node_modules涓嬬殑鎵�鏈夋ā鍧�
+    // }),
+    vue(),
+    vueJsx(),
+    visualizer({
+      filename: 'report_form_rollup-plugin-visualizer.html'
+    }),
+    //寮曠敤鍚庢彁绀猴細
+    // requireTransform({
+    //   fileRegex: /.js$|.ts$/
+    // })
+  ],
+  define: {
+  },
+  optimizeDeps: {
+    exclude: ['vue']
+  },
+  build: {
+    commonjsOptions: {
+      transformMixedEsModules: true
+    },
+    rollupOptions: {
+      output: {
+        //姣忎釜node_modules妯″潡鍒嗘垚涓�涓猨s鏂囦欢
+        manualChunks(id) {
+          if (id.includes('node_modules')) {
+            return id.toString().split('node_modules/')[1].split('/')[0].toString()
+          }
+        },
+        // 鐢ㄤ簬浠庡叆鍙g偣鍒涘缓鐨勫潡鐨勬墦鍖呰緭鍑烘牸寮廩name]琛ㄧず鏂囦欢鍚�,[hash]琛ㄧず璇ユ枃浠跺唴瀹筯ash鍊�
+        // entryFileNames: 'assets/js/[name].[hash].js', // 鐢ㄤ簬鍛藉悕浠g爜鎷嗗垎鏃跺垱寤虹殑鍏变韩鍧楃殑杈撳嚭鍛藉悕
+        // chunkFileNames: 'assets/js/[name].[hash].js', // 鐢ㄤ簬杈撳嚭闈欐�佽祫婧愮殑鍛藉悕锛孾ext]琛ㄧず鏂囦欢鎵╁睍鍚�
+        // assetFileNames: 'assets/[ext]/[name].[hash].[ext]'
+        entryFileNames: 'assets/js/[hash].js', // 鐢ㄤ簬鍛藉悕浠g爜鎷嗗垎鏃跺垱寤虹殑鍏变韩鍧楃殑杈撳嚭鍛藉悕
+        chunkFileNames: 'assets/js/[hash].js', // 鐢ㄤ簬杈撳嚭闈欐�佽祫婧愮殑鍛藉悕锛孾ext]琛ㄧず鏂囦欢鎵╁睍鍚�
+        assetFileNames: 'assets/[ext]/[hash].[ext]'
+      }
+    },
+    // outDir: 'dist', // 杈撳嚭鐩綍锛岄粯璁や负 'dist'
+    // rollupOptions: {
+    //   input: {
+    //     main: 'src/main.js', // 浣犵殑鍏ュ彛鏂囦欢
+    //   }
+    // },
+    sourcemap: false //鐢熸垚婧愭槧灏勬枃浠�
+  },
+  publicDir: 'public', // 杩欓噷鎸囧畾浜� public 鏂囦欢澶圭殑浣嶇疆
+  css: {
+    //鏌ョ湅CSS灞炰簬鍝釜css鏂囦欢
+    devSourcemap: false
+  },
+  server: {
+    port: 8081
+    // proxy: {
+    //   '/api': {
+    //     target: 'http://xxxx.com',
+    //     changeOrigin: true,
+    //     rewrite: (path) => path.replace(/^\/api/, '')
+    //   }
+    // }
+  },
+  resolve: {
+    extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue', '.mjs'],
+    alias: {
+      '@': fileURLToPath(new URL('./src', import.meta.url))
+    }
+  }
+})
diff --git a/3F/Code Management/WMS/WIDESEA_WMSClient/yarn.lock b/3F/Code Management/WMS/WIDESEA_WMSClient/yarn.lock
new file mode 100644
index 0000000..31ea9dc
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSClient/yarn.lock
@@ -0,0 +1,4710 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@aashutoshrathi/word-wrap@^1.2.3":
+  version "1.2.6"
+  resolved "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz"
+  integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
+
+"@adobe/css-tools@^4.0.1":
+  version "4.3.3"
+  resolved "https://registry.npmmirror.com/@adobe/css-tools/-/css-tools-4.3.3.tgz"
+  integrity sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==
+
+"@amap/amap-jsapi-loader@^1.0.1":
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz"
+  integrity sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw==
+
+"@ampproject/remapping@^2.2.0":
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz"
+  integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
+  dependencies:
+    "@jridgewell/gen-mapping" "^0.3.5"
+    "@jridgewell/trace-mapping" "^0.3.24"
+
+"@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2":
+  version "7.24.2"
+  resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.24.2.tgz"
+  integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==
+  dependencies:
+    "@babel/highlight" "^7.24.2"
+    picocolors "^1.0.0"
+
+"@babel/compat-data@^7.23.5":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.24.1.tgz"
+  integrity sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==
+
+"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.0", "@babel/core@^7.23.3":
+  version "7.24.3"
+  resolved "https://registry.npmmirror.com/@babel/core/-/core-7.24.3.tgz"
+  integrity sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==
+  dependencies:
+    "@ampproject/remapping" "^2.2.0"
+    "@babel/code-frame" "^7.24.2"
+    "@babel/generator" "^7.24.1"
+    "@babel/helper-compilation-targets" "^7.23.6"
+    "@babel/helper-module-transforms" "^7.23.3"
+    "@babel/helpers" "^7.24.1"
+    "@babel/parser" "^7.24.1"
+    "@babel/template" "^7.24.0"
+    "@babel/traverse" "^7.24.1"
+    "@babel/types" "^7.24.0"
+    convert-source-map "^2.0.0"
+    debug "^4.1.0"
+    gensync "^1.0.0-beta.2"
+    json5 "^2.2.3"
+    semver "^6.3.1"
+
+"@babel/eslint-parser@^7.21.3":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz"
+  integrity sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==
+  dependencies:
+    "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1"
+    eslint-visitor-keys "^2.1.0"
+    semver "^6.3.1"
+
+"@babel/generator@^7.22.5", "@babel/generator@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.24.1.tgz"
+  integrity sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==
+  dependencies:
+    "@babel/types" "^7.24.0"
+    "@jridgewell/gen-mapping" "^0.3.5"
+    "@jridgewell/trace-mapping" "^0.3.25"
+    jsesc "^2.5.1"
+
+"@babel/helper-annotate-as-pure@^7.22.5":
+  version "7.22.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz"
+  integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
+"@babel/helper-compilation-targets@^7.23.6":
+  version "7.23.6"
+  resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz"
+  integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==
+  dependencies:
+    "@babel/compat-data" "^7.23.5"
+    "@babel/helper-validator-option" "^7.23.5"
+    browserslist "^4.22.2"
+    lru-cache "^5.1.1"
+    semver "^6.3.1"
+
+"@babel/helper-create-class-features-plugin@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz"
+  integrity sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.22.5"
+    "@babel/helper-environment-visitor" "^7.22.20"
+    "@babel/helper-function-name" "^7.23.0"
+    "@babel/helper-member-expression-to-functions" "^7.23.0"
+    "@babel/helper-optimise-call-expression" "^7.22.5"
+    "@babel/helper-replace-supers" "^7.24.1"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+    "@babel/helper-split-export-declaration" "^7.22.6"
+    semver "^6.3.1"
+
+"@babel/helper-environment-visitor@^7.22.20":
+  version "7.22.20"
+  resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz"
+  integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
+
+"@babel/helper-function-name@^7.23.0":
+  version "7.23.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz"
+  integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
+  dependencies:
+    "@babel/template" "^7.22.15"
+    "@babel/types" "^7.23.0"
+
+"@babel/helper-hoist-variables@^7.22.5":
+  version "7.22.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz"
+  integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
+"@babel/helper-member-expression-to-functions@^7.23.0":
+  version "7.23.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz"
+  integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==
+  dependencies:
+    "@babel/types" "^7.23.0"
+
+"@babel/helper-module-imports@^7.22.15":
+  version "7.24.3"
+  resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz"
+  integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==
+  dependencies:
+    "@babel/types" "^7.24.0"
+
+"@babel/helper-module-imports@~7.22.15":
+  version "7.22.15"
+  resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz"
+  integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==
+  dependencies:
+    "@babel/types" "^7.22.15"
+
+"@babel/helper-module-transforms@^7.23.3":
+  version "7.23.3"
+  resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz"
+  integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==
+  dependencies:
+    "@babel/helper-environment-visitor" "^7.22.20"
+    "@babel/helper-module-imports" "^7.22.15"
+    "@babel/helper-simple-access" "^7.22.5"
+    "@babel/helper-split-export-declaration" "^7.22.6"
+    "@babel/helper-validator-identifier" "^7.22.20"
+
+"@babel/helper-optimise-call-expression@^7.22.5":
+  version "7.22.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz"
+  integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
+"@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0":
+  version "7.24.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz"
+  integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==
+
+"@babel/helper-replace-supers@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz"
+  integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==
+  dependencies:
+    "@babel/helper-environment-visitor" "^7.22.20"
+    "@babel/helper-member-expression-to-functions" "^7.23.0"
+    "@babel/helper-optimise-call-expression" "^7.22.5"
+
+"@babel/helper-simple-access@^7.22.5":
+  version "7.22.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz"
+  integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.22.5":
+  version "7.22.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz"
+  integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
+"@babel/helper-split-export-declaration@^7.22.6":
+  version "7.22.6"
+  resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz"
+  integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
+"@babel/helper-string-parser@^7.23.4":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz"
+  integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==
+
+"@babel/helper-validator-identifier@^7.22.20":
+  version "7.22.20"
+  resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz"
+  integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+
+"@babel/helper-validator-option@^7.23.5":
+  version "7.23.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz"
+  integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==
+
+"@babel/helpers@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.24.1.tgz"
+  integrity sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==
+  dependencies:
+    "@babel/template" "^7.24.0"
+    "@babel/traverse" "^7.24.1"
+    "@babel/types" "^7.24.0"
+
+"@babel/highlight@^7.24.2":
+  version "7.24.2"
+  resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.24.2.tgz"
+  integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.22.20"
+    chalk "^2.4.2"
+    js-tokens "^4.0.0"
+    picocolors "^1.0.0"
+
+"@babel/parser@^7.22.5", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.1.tgz"
+  integrity sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==
+
+"@babel/plugin-syntax-jsx@^7.23.3":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz"
+  integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-syntax-typescript@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz"
+  integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-typescript@^7.23.3":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.1.tgz"
+  integrity sha512-liYSESjX2fZ7JyBFkYG78nfvHlMKE6IpNdTVnxmlYUR+j5ZLsitFbaAE+eJSK2zPPkNWNw4mXL51rQ8WrvdK0w==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.22.5"
+    "@babel/helper-create-class-features-plugin" "^7.24.1"
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/plugin-syntax-typescript" "^7.24.1"
+
+"@babel/runtime-corejs3@^7.11.2":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/runtime-corejs3/-/runtime-corejs3-7.24.1.tgz"
+  integrity sha512-T9ko/35G+Bkl+win48GduaPlhSlOjjE5s1TeiEcD+QpxlLQnoEfb/nO/T+TQqkm+ipFwORn+rB8w14iJ/uD0bg==
+  dependencies:
+    core-js-pure "^3.30.2"
+    regenerator-runtime "^0.14.0"
+
+"@babel/runtime@^7.11.2":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.24.1.tgz"
+  integrity sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==
+  dependencies:
+    regenerator-runtime "^0.14.0"
+
+"@babel/template@^7.22.15", "@babel/template@^7.23.9", "@babel/template@^7.24.0":
+  version "7.24.0"
+  resolved "https://registry.npmmirror.com/@babel/template/-/template-7.24.0.tgz"
+  integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==
+  dependencies:
+    "@babel/code-frame" "^7.23.5"
+    "@babel/parser" "^7.24.0"
+    "@babel/types" "^7.24.0"
+
+"@babel/traverse@^7.22.5", "@babel/traverse@^7.23.9", "@babel/traverse@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.24.1.tgz"
+  integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==
+  dependencies:
+    "@babel/code-frame" "^7.24.1"
+    "@babel/generator" "^7.24.1"
+    "@babel/helper-environment-visitor" "^7.22.20"
+    "@babel/helper-function-name" "^7.23.0"
+    "@babel/helper-hoist-variables" "^7.22.5"
+    "@babel/helper-split-export-declaration" "^7.22.6"
+    "@babel/parser" "^7.24.1"
+    "@babel/types" "^7.24.0"
+    debug "^4.3.1"
+    globals "^11.1.0"
+
+"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.9", "@babel/types@^7.24.0":
+  version "7.24.0"
+  resolved "https://registry.npmmirror.com/@babel/types/-/types-7.24.0.tgz"
+  integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==
+  dependencies:
+    "@babel/helper-string-parser" "^7.23.4"
+    "@babel/helper-validator-identifier" "^7.22.20"
+    to-fast-properties "^2.0.0"
+
+"@ctrl/tinycolor@^3.4.1":
+  version "3.6.1"
+  resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz"
+  integrity sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==
+
+"@element-plus/icons-vue@^2.3.1":
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz"
+  integrity sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==
+
+"@esbuild/win32-x64@0.18.20":
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz"
+  integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==
+
+"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
+  version "4.4.0"
+  resolved "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz"
+  integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+  dependencies:
+    eslint-visitor-keys "^3.3.0"
+
+"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1":
+  version "4.10.0"
+  resolved "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz"
+  integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==
+
+"@eslint/eslintrc@^2.1.4":
+  version "2.1.4"
+  resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz"
+  integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
+  dependencies:
+    ajv "^6.12.4"
+    debug "^4.3.2"
+    espree "^9.6.0"
+    globals "^13.19.0"
+    ignore "^5.2.0"
+    import-fresh "^3.2.1"
+    js-yaml "^4.1.0"
+    minimatch "^3.1.2"
+    strip-json-comments "^3.1.1"
+
+"@eslint/js@8.57.0":
+  version "8.57.0"
+  resolved "https://registry.npmmirror.com/@eslint/js/-/js-8.57.0.tgz"
+  integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==
+
+"@floating-ui/core@^1.0.0":
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.0.tgz"
+  integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==
+  dependencies:
+    "@floating-ui/utils" "^0.2.1"
+
+"@floating-ui/dom@^1.0.1":
+  version "1.6.3"
+  resolved "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.3.tgz"
+  integrity sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==
+  dependencies:
+    "@floating-ui/core" "^1.0.0"
+    "@floating-ui/utils" "^0.2.0"
+
+"@floating-ui/utils@^0.2.0", "@floating-ui/utils@^0.2.1":
+  version "0.2.1"
+  resolved "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.1.tgz"
+  integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==
+
+"@humanwhocodes/config-array@^0.11.14":
+  version "0.11.14"
+  resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz"
+  integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==
+  dependencies:
+    "@humanwhocodes/object-schema" "^2.0.2"
+    debug "^4.3.1"
+    minimatch "^3.0.5"
+
+"@humanwhocodes/module-importer@^1.0.1":
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz"
+  integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/object-schema@^2.0.2":
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz"
+  integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
+
+"@isaacs/cliui@^8.0.2":
+  version "8.0.2"
+  resolved "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz"
+  integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
+  dependencies:
+    string-width "^5.1.2"
+    string-width-cjs "npm:string-width@^4.2.0"
+    strip-ansi "^7.0.1"
+    strip-ansi-cjs "npm:strip-ansi@^6.0.1"
+    wrap-ansi "^8.1.0"
+    wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
+
+"@jridgewell/gen-mapping@^0.3.5":
+  version "0.3.5"
+  resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz"
+  integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
+  dependencies:
+    "@jridgewell/set-array" "^1.2.1"
+    "@jridgewell/sourcemap-codec" "^1.4.10"
+    "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
+  integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/set-array@^1.2.1":
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz"
+  integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15":
+  version "1.4.15"
+  resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz"
+  integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+  version "0.3.25"
+  resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz"
+  integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+  dependencies:
+    "@jridgewell/resolve-uri" "^3.1.0"
+    "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@microsoft/signalr@^7.0.3":
+  version "7.0.14"
+  resolved "https://registry.npmmirror.com/@microsoft/signalr/-/signalr-7.0.14.tgz"
+  integrity sha512-dnS7gSJF5LxByZwJaj82+F1K755ya7ttPT+JnSeCBef3sL8p8FBkHePXphK8NSuOquIb7vsphXWa28A+L2SPpw==
+  dependencies:
+    abort-controller "^3.0.0"
+    eventsource "^2.0.2"
+    fetch-cookie "^2.0.3"
+    node-fetch "^2.6.7"
+    ws "^7.4.5"
+
+"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1":
+  version "5.1.1-v1"
+  resolved "https://registry.npmmirror.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz"
+  integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==
+  dependencies:
+    eslint-scope "5.1.1"
+
+"@nodelib/fs.scandir@2.1.5":
+  version "2.1.5"
+  resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz"
+  integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+  dependencies:
+    "@nodelib/fs.stat" "2.0.5"
+    run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
+  version "2.0.5"
+  resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
+  integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
+  version "1.2.8"
+  resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
+  integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+  dependencies:
+    "@nodelib/fs.scandir" "2.1.5"
+    fastq "^1.6.0"
+
+"@one-ini/wasm@0.1.1":
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/@one-ini/wasm/-/wasm-0.1.1.tgz"
+  integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==
+
+"@pkgjs/parseargs@^0.11.0":
+  version "0.11.0"
+  resolved "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz"
+  integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
+
+"@popperjs/core@npm:@sxzz/popperjs-es@^2.11.7":
+  version "2.11.7"
+  resolved "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz"
+  integrity sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==
+
+"@rollup/rollup-win32-x64-msvc@4.14.0":
+  version "4.14.0"
+  resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.0.tgz"
+  integrity sha512-aGg7iToJjdklmxlUlJh/PaPNa4PmqHfyRMLunbL3eaMO0gp656+q1zOKkpJ/CVe9CryJv6tAN1HDoR8cNGzkag==
+
+"@rushstack/eslint-patch@^1.2.0":
+  version "1.10.1"
+  resolved "https://registry.npmmirror.com/@rushstack/eslint-patch/-/eslint-patch-1.10.1.tgz"
+  integrity sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg==
+
+"@tootallnate/once@2":
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz"
+  integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==
+
+"@types/chai-subset@^1.3.3":
+  version "1.3.5"
+  resolved "https://registry.npmmirror.com/@types/chai-subset/-/chai-subset-1.3.5.tgz"
+  integrity sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==
+  dependencies:
+    "@types/chai" "*"
+
+"@types/chai@*", "@types/chai@^4.3.4":
+  version "4.3.14"
+  resolved "https://registry.npmmirror.com/@types/chai/-/chai-4.3.14.tgz"
+  integrity sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==
+
+"@types/estree@*", "@types/estree@1.0.5":
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz"
+  integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
+
+"@types/jsdom@^21.1.0":
+  version "21.1.6"
+  resolved "https://registry.npmmirror.com/@types/jsdom/-/jsdom-21.1.6.tgz"
+  integrity sha512-/7kkMsC+/kMs7gAYmmBR9P0vGTnOoLhQhyhQJSlXGI5bzTHp6xdo0TtKWQAsz6pmSAeVqKSbqeyP6hytqr9FDw==
+  dependencies:
+    "@types/node" "*"
+    "@types/tough-cookie" "*"
+    parse5 "^7.0.0"
+
+"@types/json-schema@^7.0.9":
+  version "7.0.15"
+  resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz"
+  integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+
+"@types/lodash-es@*", "@types/lodash-es@^4.17.6":
+  version "4.17.12"
+  resolved "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz"
+  integrity sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==
+  dependencies:
+    "@types/lodash" "*"
+
+"@types/lodash@*", "@types/lodash@^4.14.182":
+  version "4.17.0"
+  resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.0.tgz"
+  integrity sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==
+
+"@types/node@*", "@types/node@^18.14.2", "@types/node@>= 14":
+  version "18.19.29"
+  resolved "https://registry.npmmirror.com/@types/node/-/node-18.19.29.tgz"
+  integrity sha512-5pAX7ggTmWZdhUrhRWLPf+5oM7F80bcKVCBbr0zwEkTNzTJL2CWQjznpFgHYy6GrzkYi2Yjy7DHKoynFxqPV8g==
+  dependencies:
+    undici-types "~5.26.4"
+
+"@types/semver@^7.3.12":
+  version "7.5.8"
+  resolved "https://registry.npmmirror.com/@types/semver/-/semver-7.5.8.tgz"
+  integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==
+
+"@types/tough-cookie@*":
+  version "4.0.5"
+  resolved "https://registry.npmmirror.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz"
+  integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==
+
+"@types/web-bluetooth@^0.0.16":
+  version "0.0.16"
+  resolved "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz"
+  integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==
+
+"@typescript-eslint/eslint-plugin@^5.59.1":
+  version "5.62.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz"
+  integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==
+  dependencies:
+    "@eslint-community/regexpp" "^4.4.0"
+    "@typescript-eslint/scope-manager" "5.62.0"
+    "@typescript-eslint/type-utils" "5.62.0"
+    "@typescript-eslint/utils" "5.62.0"
+    debug "^4.3.4"
+    graphemer "^1.4.0"
+    ignore "^5.2.0"
+    natural-compare-lite "^1.4.0"
+    semver "^7.3.7"
+    tsutils "^3.21.0"
+
+"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.59.1":
+  version "5.62.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.62.0.tgz"
+  integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==
+  dependencies:
+    "@typescript-eslint/scope-manager" "5.62.0"
+    "@typescript-eslint/types" "5.62.0"
+    "@typescript-eslint/typescript-estree" "5.62.0"
+    debug "^4.3.4"
+
+"@typescript-eslint/scope-manager@5.62.0":
+  version "5.62.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz"
+  integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==
+  dependencies:
+    "@typescript-eslint/types" "5.62.0"
+    "@typescript-eslint/visitor-keys" "5.62.0"
+
+"@typescript-eslint/type-utils@5.62.0":
+  version "5.62.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz"
+  integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==
+  dependencies:
+    "@typescript-eslint/typescript-estree" "5.62.0"
+    "@typescript-eslint/utils" "5.62.0"
+    debug "^4.3.4"
+    tsutils "^3.21.0"
+
+"@typescript-eslint/types@5.62.0":
+  version "5.62.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.62.0.tgz"
+  integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==
+
+"@typescript-eslint/typescript-estree@5.62.0":
+  version "5.62.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz"
+  integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==
+  dependencies:
+    "@typescript-eslint/types" "5.62.0"
+    "@typescript-eslint/visitor-keys" "5.62.0"
+    debug "^4.3.4"
+    globby "^11.1.0"
+    is-glob "^4.0.3"
+    semver "^7.3.7"
+    tsutils "^3.21.0"
+
+"@typescript-eslint/utils@5.62.0":
+  version "5.62.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.62.0.tgz"
+  integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==
+  dependencies:
+    "@eslint-community/eslint-utils" "^4.2.0"
+    "@types/json-schema" "^7.0.9"
+    "@types/semver" "^7.3.12"
+    "@typescript-eslint/scope-manager" "5.62.0"
+    "@typescript-eslint/types" "5.62.0"
+    "@typescript-eslint/typescript-estree" "5.62.0"
+    eslint-scope "^5.1.1"
+    semver "^7.3.7"
+
+"@typescript-eslint/visitor-keys@5.62.0":
+  version "5.62.0"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz"
+  integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==
+  dependencies:
+    "@typescript-eslint/types" "5.62.0"
+    eslint-visitor-keys "^3.3.0"
+
+"@ungap/structured-clone@^1.2.0":
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz"
+  integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
+
+"@vitejs/plugin-vue-jsx@^3.0.0":
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.1.0.tgz"
+  integrity sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==
+  dependencies:
+    "@babel/core" "^7.23.3"
+    "@babel/plugin-transform-typescript" "^7.23.3"
+    "@vue/babel-plugin-jsx" "^1.1.5"
+
+"@vitejs/plugin-vue@^4.0.0":
+  version "4.6.2"
+  resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz"
+  integrity sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==
+
+"@vitest/expect@0.29.8":
+  version "0.29.8"
+  resolved "https://registry.npmmirror.com/@vitest/expect/-/expect-0.29.8.tgz"
+  integrity sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==
+  dependencies:
+    "@vitest/spy" "0.29.8"
+    "@vitest/utils" "0.29.8"
+    chai "^4.3.7"
+
+"@vitest/runner@0.29.8":
+  version "0.29.8"
+  resolved "https://registry.npmmirror.com/@vitest/runner/-/runner-0.29.8.tgz"
+  integrity sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==
+  dependencies:
+    "@vitest/utils" "0.29.8"
+    p-limit "^4.0.0"
+    pathe "^1.1.0"
+
+"@vitest/spy@0.29.8":
+  version "0.29.8"
+  resolved "https://registry.npmmirror.com/@vitest/spy/-/spy-0.29.8.tgz"
+  integrity sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==
+  dependencies:
+    tinyspy "^1.0.2"
+
+"@vitest/utils@0.29.8":
+  version "0.29.8"
+  resolved "https://registry.npmmirror.com/@vitest/utils/-/utils-0.29.8.tgz"
+  integrity sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==
+  dependencies:
+    cli-truncate "^3.1.0"
+    diff "^5.1.0"
+    loupe "^2.3.6"
+    pretty-format "^27.5.1"
+
+"@volar/language-core@~1.11.1", "@volar/language-core@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.11.1.tgz"
+  integrity sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==
+  dependencies:
+    "@volar/source-map" "1.11.1"
+
+"@volar/source-map@~1.11.1", "@volar/source-map@1.11.1":
+  version "1.11.1"
+  resolved "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.11.1.tgz"
+  integrity sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==
+  dependencies:
+    muggle-string "^0.3.1"
+
+"@volar/typescript@~1.11.1":
+  version "1.11.1"
+  resolved "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.11.1.tgz"
+  integrity sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==
+  dependencies:
+    "@volar/language-core" "1.11.1"
+    path-browserify "^1.0.1"
+
+"@vue/babel-helper-vue-transform-on@1.2.2":
+  version "1.2.2"
+  resolved "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.2.tgz"
+  integrity sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw==
+
+"@vue/babel-plugin-jsx@^1.1.5":
+  version "1.2.2"
+  resolved "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.2.tgz"
+  integrity sha512-nYTkZUVTu4nhP199UoORePsql0l+wj7v/oyQjtThUVhJl1U+6qHuoVhIvR3bf7eVKjbCK+Cs2AWd7mi9Mpz9rA==
+  dependencies:
+    "@babel/helper-module-imports" "~7.22.15"
+    "@babel/helper-plugin-utils" "^7.22.5"
+    "@babel/plugin-syntax-jsx" "^7.23.3"
+    "@babel/template" "^7.23.9"
+    "@babel/traverse" "^7.23.9"
+    "@babel/types" "^7.23.9"
+    "@vue/babel-helper-vue-transform-on" "1.2.2"
+    "@vue/babel-plugin-resolve-type" "1.2.2"
+    camelcase "^6.3.0"
+    html-tags "^3.3.1"
+    svg-tags "^1.0.0"
+
+"@vue/babel-plugin-resolve-type@1.2.2":
+  version "1.2.2"
+  resolved "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.2.tgz"
+  integrity sha512-EntyroPwNg5IPVdUJupqs0CFzuf6lUrVvCspmv2J1FITLeGnUCuoGNNk78dgCusxEiYj6RMkTJflGSxk5aIC4A==
+  dependencies:
+    "@babel/code-frame" "^7.23.5"
+    "@babel/helper-module-imports" "~7.22.15"
+    "@babel/helper-plugin-utils" "^7.22.5"
+    "@babel/parser" "^7.23.9"
+    "@vue/compiler-sfc" "^3.4.15"
+
+"@vue/compiler-core@3.4.21":
+  version "3.4.21"
+  resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.21.tgz"
+  integrity sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==
+  dependencies:
+    "@babel/parser" "^7.23.9"
+    "@vue/shared" "3.4.21"
+    entities "^4.5.0"
+    estree-walker "^2.0.2"
+    source-map-js "^1.0.2"
+
+"@vue/compiler-dom@^3.3.0", "@vue/compiler-dom@3.4.21":
+  version "3.4.21"
+  resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz"
+  integrity sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==
+  dependencies:
+    "@vue/compiler-core" "3.4.21"
+    "@vue/shared" "3.4.21"
+
+"@vue/compiler-sfc@^3.4.15", "@vue/compiler-sfc@3.4.21":
+  version "3.4.21"
+  resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz"
+  integrity sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==
+  dependencies:
+    "@babel/parser" "^7.23.9"
+    "@vue/compiler-core" "3.4.21"
+    "@vue/compiler-dom" "3.4.21"
+    "@vue/compiler-ssr" "3.4.21"
+    "@vue/shared" "3.4.21"
+    estree-walker "^2.0.2"
+    magic-string "^0.30.7"
+    postcss "^8.4.35"
+    source-map-js "^1.0.2"
+
+"@vue/compiler-ssr@3.4.21":
+  version "3.4.21"
+  resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz"
+  integrity sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==
+  dependencies:
+    "@vue/compiler-dom" "3.4.21"
+    "@vue/shared" "3.4.21"
+
+"@vue/devtools-api@^6.0.0-beta.11", "@vue/devtools-api@^6.5.0", "@vue/devtools-api@^6.5.1":
+  version "6.6.1"
+  resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.1.tgz"
+  integrity sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==
+
+"@vue/eslint-config-prettier@^7.1.0":
+  version "7.1.0"
+  resolved "https://registry.npmmirror.com/@vue/eslint-config-prettier/-/eslint-config-prettier-7.1.0.tgz"
+  integrity sha512-Pv/lVr0bAzSIHLd9iz0KnvAr4GKyCEl+h52bc4e5yWuDVtLgFwycF7nrbWTAQAS+FU6q1geVd07lc6EWfJiWKQ==
+  dependencies:
+    eslint-config-prettier "^8.3.0"
+    eslint-plugin-prettier "^4.0.0"
+
+"@vue/eslint-config-typescript@^11.0.2":
+  version "11.0.3"
+  resolved "https://registry.npmmirror.com/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.3.tgz"
+  integrity sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==
+  dependencies:
+    "@typescript-eslint/eslint-plugin" "^5.59.1"
+    "@typescript-eslint/parser" "^5.59.1"
+    vue-eslint-parser "^9.1.1"
+
+"@vue/language-core@1.8.27":
+  version "1.8.27"
+  resolved "https://registry.npmmirror.com/@vue/language-core/-/language-core-1.8.27.tgz"
+  integrity sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==
+  dependencies:
+    "@volar/language-core" "~1.11.1"
+    "@volar/source-map" "~1.11.1"
+    "@vue/compiler-dom" "^3.3.0"
+    "@vue/shared" "^3.3.0"
+    computeds "^0.0.1"
+    minimatch "^9.0.3"
+    muggle-string "^0.3.1"
+    path-browserify "^1.0.1"
+    vue-template-compiler "^2.7.14"
+
+"@vue/reactivity@3.4.21":
+  version "3.4.21"
+  resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.21.tgz"
+  integrity sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==
+  dependencies:
+    "@vue/shared" "3.4.21"
+
+"@vue/runtime-core@3.4.21":
+  version "3.4.21"
+  resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.21.tgz"
+  integrity sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==
+  dependencies:
+    "@vue/reactivity" "3.4.21"
+    "@vue/shared" "3.4.21"
+
+"@vue/runtime-dom@3.4.21":
+  version "3.4.21"
+  resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz"
+  integrity sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==
+  dependencies:
+    "@vue/runtime-core" "3.4.21"
+    "@vue/shared" "3.4.21"
+    csstype "^3.1.3"
+
+"@vue/server-renderer@3.4.21":
+  version "3.4.21"
+  resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.21.tgz"
+  integrity sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==
+  dependencies:
+    "@vue/compiler-ssr" "3.4.21"
+    "@vue/shared" "3.4.21"
+
+"@vue/shared@^3.3.0", "@vue/shared@3.4.21":
+  version "3.4.21"
+  resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.21.tgz"
+  integrity sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==
+
+"@vue/test-utils@^2.3.0":
+  version "2.4.5"
+  resolved "https://registry.npmmirror.com/@vue/test-utils/-/test-utils-2.4.5.tgz"
+  integrity sha512-oo2u7vktOyKUked36R93NB7mg2B+N7Plr8lxp2JBGwr18ch6EggFjixSCdIVVLkT6Qr0z359Xvnafc9dcKyDUg==
+  dependencies:
+    js-beautify "^1.14.9"
+    vue-component-type-helpers "^2.0.0"
+
+"@vue/tsconfig@^0.1.3":
+  version "0.1.3"
+  resolved "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.1.3.tgz"
+  integrity sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==
+
+"@vueuse/core@^9.1.0":
+  version "9.13.0"
+  resolved "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz"
+  integrity sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==
+  dependencies:
+    "@types/web-bluetooth" "^0.0.16"
+    "@vueuse/metadata" "9.13.0"
+    "@vueuse/shared" "9.13.0"
+    vue-demi "*"
+
+"@vueuse/metadata@9.13.0":
+  version "9.13.0"
+  resolved "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz"
+  integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==
+
+"@vueuse/shared@9.13.0":
+  version "9.13.0"
+  resolved "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz"
+  integrity sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==
+  dependencies:
+    vue-demi "*"
+
+abab@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.npmmirror.com/abab/-/abab-2.0.6.tgz"
+  integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==
+
+abbrev@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/abbrev/-/abbrev-2.0.0.tgz"
+  integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==
+
+abort-controller@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/abort-controller/-/abort-controller-3.0.0.tgz"
+  integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+  dependencies:
+    event-target-shim "^5.0.0"
+
+acorn-globals@^7.0.0:
+  version "7.0.1"
+  resolved "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-7.0.1.tgz"
+  integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==
+  dependencies:
+    acorn "^8.1.0"
+    acorn-walk "^8.0.2"
+
+acorn-jsx@^5.3.2:
+  version "5.3.2"
+  resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
+  integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn-walk@^8.0.2, acorn-walk@^8.2.0:
+  version "8.3.2"
+  resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.2.tgz"
+  integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==
+
+"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.1.0, acorn@^8.10.0, acorn@^8.11.3, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0:
+  version "8.11.3"
+  resolved "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz"
+  integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
+
+address@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.npmmirror.com/address/-/address-1.2.2.tgz"
+  integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==
+
+agent-base@6:
+  version "6.0.2"
+  resolved "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz"
+  integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+  dependencies:
+    debug "4"
+
+agentkeepalive@^3.4.1:
+  version "3.5.2"
+  resolved "https://registry.npmmirror.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz"
+  integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==
+  dependencies:
+    humanize-ms "^1.2.1"
+
+ajv@^6.12.4:
+  version "6.12.6"
+  resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz"
+  integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+  dependencies:
+    fast-deep-equal "^3.1.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
+ali-oss@^6.17.1:
+  version "6.20.0"
+  resolved "https://registry.npmmirror.com/ali-oss/-/ali-oss-6.20.0.tgz"
+  integrity sha512-TzFXgGlw81sy2JvcCveSYsa2b2+6kv+HA6WTc+cXg6bu8nUAmVPfncRGbn3x2getSOniOFA+TyGy3V4l3Fks+Q==
+  dependencies:
+    address "^1.2.2"
+    agentkeepalive "^3.4.1"
+    bowser "^1.6.0"
+    copy-to "^2.0.1"
+    dateformat "^2.0.0"
+    debug "^4.3.4"
+    destroy "^1.0.4"
+    end-or-error "^1.0.1"
+    get-ready "^1.0.0"
+    humanize-ms "^1.2.0"
+    is-type-of "^1.4.0"
+    js-base64 "^2.5.2"
+    jstoxml "^2.0.0"
+    lodash "^4.17.21"
+    merge-descriptors "^1.0.1"
+    mime "^2.4.5"
+    platform "^1.3.1"
+    pump "^3.0.0"
+    qs "^6.4.0"
+    sdk-base "^2.0.1"
+    stream-http "2.8.2"
+    stream-wormhole "^1.0.4"
+    urllib "2.41.0"
+    utility "^1.18.0"
+    xml2js "^0.6.2"
+
+ansi-regex@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz"
+  integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-regex@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz"
+  integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
+
+ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz"
+  integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+  dependencies:
+    color-convert "^1.9.0"
+
+ansi-styles@^4.0.0:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz"
+  integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+  dependencies:
+    color-convert "^2.0.1"
+
+ansi-styles@^4.1.0:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz"
+  integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+  dependencies:
+    color-convert "^2.0.1"
+
+ansi-styles@^5.0.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz"
+  integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
+
+ansi-styles@^6.0.0:
+  version "6.2.1"
+  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz"
+  integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+
+ansi-styles@^6.1.0:
+  version "6.2.1"
+  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz"
+  integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+
+any-promise@^1.0.0, any-promise@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz"
+  integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==
+
+argparse@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz"
+  integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+array-buffer-byte-length@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz"
+  integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==
+  dependencies:
+    call-bind "^1.0.5"
+    is-array-buffer "^3.0.4"
+
+array-union@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz"
+  integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+arraybuffer.prototype.slice@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz"
+  integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==
+  dependencies:
+    array-buffer-byte-length "^1.0.1"
+    call-bind "^1.0.5"
+    define-properties "^1.2.1"
+    es-abstract "^1.22.3"
+    es-errors "^1.2.1"
+    get-intrinsic "^1.2.3"
+    is-array-buffer "^3.0.4"
+    is-shared-array-buffer "^1.0.2"
+
+assertion-error@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/assertion-error/-/assertion-error-1.1.0.tgz"
+  integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
+
+async-validator@^4.2.5:
+  version "4.2.5"
+  resolved "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz"
+  integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz"
+  integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+available-typed-arrays@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz"
+  integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
+  dependencies:
+    possible-typed-array-names "^1.0.0"
+
+axios@^1.3.4:
+  version "1.6.8"
+  resolved "https://registry.npmmirror.com/axios/-/axios-1.6.8.tgz"
+  integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==
+  dependencies:
+    follow-redirects "^1.15.6"
+    form-data "^4.0.0"
+    proxy-from-env "^1.1.0"
+
+balanced-match@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz"
+  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+boolbase@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz"
+  integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
+
+bowser@^1.6.0:
+  version "1.9.4"
+  resolved "https://registry.npmmirror.com/bowser/-/bowser-1.9.4.tgz"
+  integrity sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==
+
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz"
+  integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+brace-expansion@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz"
+  integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+  dependencies:
+    balanced-match "^1.0.0"
+
+braces@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz"
+  integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+  dependencies:
+    fill-range "^7.0.1"
+
+browserslist@^4.22.2, "browserslist@>= 4.21.0":
+  version "4.23.0"
+  resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.23.0.tgz"
+  integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==
+  dependencies:
+    caniuse-lite "^1.0.30001587"
+    electron-to-chromium "^1.4.668"
+    node-releases "^2.0.14"
+    update-browserslist-db "^1.0.13"
+
+builtin-status-codes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz"
+  integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==
+
+cac@^6.7.14:
+  version "6.7.14"
+  resolved "https://registry.npmmirror.com/cac/-/cac-6.7.14.tgz"
+  integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==
+
+call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz"
+  integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
+  dependencies:
+    es-define-property "^1.0.0"
+    es-errors "^1.3.0"
+    function-bind "^1.1.2"
+    get-intrinsic "^1.2.4"
+    set-function-length "^1.2.1"
+
+callsites@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz"
+  integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camelcase@^6.3.0:
+  version "6.3.0"
+  resolved "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz"
+  integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+caniuse-lite@^1.0.30001587:
+  version "1.0.30001605"
+  resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz"
+  integrity sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ==
+
+chai@^4.3.7:
+  version "4.4.1"
+  resolved "https://registry.npmmirror.com/chai/-/chai-4.4.1.tgz"
+  integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==
+  dependencies:
+    assertion-error "^1.1.0"
+    check-error "^1.0.3"
+    deep-eql "^4.1.3"
+    get-func-name "^2.0.2"
+    loupe "^2.3.6"
+    pathval "^1.1.1"
+    type-detect "^4.0.8"
+
+chalk@^2.4.1, chalk@^2.4.2:
+  version "2.4.2"
+  resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz"
+  integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+chalk@^4.0.0:
+  version "4.1.2"
+  resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz"
+  integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+  dependencies:
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
+
+check-error@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/check-error/-/check-error-1.0.3.tgz"
+  integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==
+  dependencies:
+    get-func-name "^2.0.2"
+
+cli-truncate@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-3.1.0.tgz"
+  integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==
+  dependencies:
+    slice-ansi "^5.0.0"
+    string-width "^5.0.0"
+
+cliui@^8.0.1:
+  version "8.0.1"
+  resolved "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz"
+  integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+  dependencies:
+    string-width "^4.2.0"
+    strip-ansi "^6.0.1"
+    wrap-ansi "^7.0.0"
+
+color-convert@^1.9.0:
+  version "1.9.3"
+  resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz"
+  integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+  dependencies:
+    color-name "1.1.3"
+
+color-convert@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz"
+  integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+  dependencies:
+    color-name "~1.1.4"
+
+color-name@~1.1.4:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz"
+  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+color-name@1.1.3:
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz"
+  integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+combined-stream@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz"
+  integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commander@^10.0.0:
+  version "10.0.1"
+  resolved "https://registry.npmmirror.com/commander/-/commander-10.0.1.tgz"
+  integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
+
+computeds@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.npmmirror.com/computeds/-/computeds-0.0.1.tgz"
+  integrity sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz"
+  integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+config-chain@^1.1.13:
+  version "1.1.13"
+  resolved "https://registry.npmmirror.com/config-chain/-/config-chain-1.1.13.tgz"
+  integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==
+  dependencies:
+    ini "^1.3.4"
+    proto-list "~1.2.1"
+
+content-type@^1.0.2:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz"
+  integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
+
+convert-source-map@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz"
+  integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+copy-anything@^2.0.1:
+  version "2.0.6"
+  resolved "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz"
+  integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==
+  dependencies:
+    is-what "^3.14.1"
+
+copy-to@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/copy-to/-/copy-to-2.0.1.tgz"
+  integrity sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==
+
+core-js-pure@^3.30.2:
+  version "3.36.1"
+  resolved "https://registry.npmmirror.com/core-js-pure/-/core-js-pure-3.36.1.tgz"
+  integrity sha512-NXCvHvSVYSrewP0L5OhltzXeWFJLo2AL2TYnj6iLV3Bw8mM62wAQMNgUCRI6EBu6hVVpbCxmOPlxh1Ikw2PfUA==
+
+core-js@^3.29.0:
+  version "3.36.1"
+  resolved "https://registry.npmmirror.com/core-js/-/core-js-3.36.1.tgz"
+  integrity sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==
+
+core-util-is@^1.0.2, core-util-is@~1.0.0:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz"
+  integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
+cross-spawn@^6.0.5:
+  version "6.0.5"
+  resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz"
+  integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+  dependencies:
+    nice-try "^1.0.4"
+    path-key "^2.0.1"
+    semver "^5.5.0"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cross-spawn@^7.0.0, cross-spawn@^7.0.2:
+  version "7.0.3"
+  resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz"
+  integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+  dependencies:
+    path-key "^3.1.0"
+    shebang-command "^2.0.0"
+    which "^2.0.1"
+
+cssesc@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz"
+  integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+cssstyle@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/cssstyle/-/cssstyle-3.0.0.tgz"
+  integrity sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==
+  dependencies:
+    rrweb-cssom "^0.6.0"
+
+csstype@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz"
+  integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+
+data-urls@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/data-urls/-/data-urls-4.0.0.tgz"
+  integrity sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==
+  dependencies:
+    abab "^2.0.6"
+    whatwg-mimetype "^3.0.0"
+    whatwg-url "^12.0.0"
+
+data-view-buffer@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz"
+  integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==
+  dependencies:
+    call-bind "^1.0.6"
+    es-errors "^1.3.0"
+    is-data-view "^1.0.1"
+
+data-view-byte-length@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz"
+  integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==
+  dependencies:
+    call-bind "^1.0.7"
+    es-errors "^1.3.0"
+    is-data-view "^1.0.1"
+
+data-view-byte-offset@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz"
+  integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==
+  dependencies:
+    call-bind "^1.0.6"
+    es-errors "^1.3.0"
+    is-data-view "^1.0.1"
+
+dateformat@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/dateformat/-/dateformat-2.2.0.tgz"
+  integrity sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==
+
+dayjs@^1.11.3:
+  version "1.11.10"
+  resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.10.tgz"
+  integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==
+
+de-indent@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz"
+  integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==
+
+debug@^2.6.9:
+  version "2.6.9"
+  resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz"
+  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+  dependencies:
+    ms "2.0.0"
+
+debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@4:
+  version "4.3.4"
+  resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz"
+  integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+  dependencies:
+    ms "2.1.2"
+
+decimal.js@^10.4.3:
+  version "10.4.3"
+  resolved "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.4.3.tgz"
+  integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==
+
+deep-eql@^4.1.3:
+  version "4.1.3"
+  resolved "https://registry.npmmirror.com/deep-eql/-/deep-eql-4.1.3.tgz"
+  integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==
+  dependencies:
+    type-detect "^4.0.0"
+
+deep-is@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz"
+  integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+default-user-agent@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/default-user-agent/-/default-user-agent-1.0.0.tgz"
+  integrity sha512-bDF7bg6OSNcSwFWPu4zYKpVkJZQYVrAANMYB8bc9Szem1D0yKdm4sa/rOCs2aC9+2GMqQ7KnwtZRvDhmLF0dXw==
+  dependencies:
+    os-name "~1.0.3"
+
+define-data-property@^1.0.1, define-data-property@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz"
+  integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+  dependencies:
+    es-define-property "^1.0.0"
+    es-errors "^1.3.0"
+    gopd "^1.0.1"
+
+define-lazy-prop@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz"
+  integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
+
+define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz"
+  integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+  dependencies:
+    define-data-property "^1.0.1"
+    has-property-descriptors "^1.0.0"
+    object-keys "^1.1.1"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz"
+  integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+destroy@^1.0.4:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz"
+  integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
+diff@^5.1.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/diff/-/diff-5.2.0.tgz"
+  integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==
+
+digest-header@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/digest-header/-/digest-header-1.1.0.tgz"
+  integrity sha512-glXVh42vz40yZb9Cq2oMOt70FIoWiv+vxNvdKdU8CwjLad25qHM3trLxhl9bVjdr6WaslIXhWpn0NO8T/67Qjg==
+
+dir-glob@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz"
+  integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+  dependencies:
+    path-type "^4.0.0"
+
+doctrine@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz"
+  integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+  dependencies:
+    esutils "^2.0.2"
+
+domexception@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/domexception/-/domexception-4.0.0.tgz"
+  integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==
+  dependencies:
+    webidl-conversions "^7.0.0"
+
+eastasianwidth@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz"
+  integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+
+echarts@^5.4.1:
+  version "5.5.0"
+  resolved "https://registry.npmmirror.com/echarts/-/echarts-5.5.0.tgz"
+  integrity sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==
+  dependencies:
+    tslib "2.3.0"
+    zrender "5.5.0"
+
+editorconfig@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/editorconfig/-/editorconfig-1.0.4.tgz"
+  integrity sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==
+  dependencies:
+    "@one-ini/wasm" "0.1.1"
+    commander "^10.0.0"
+    minimatch "9.0.1"
+    semver "^7.5.3"
+
+ee-first@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz"
+  integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
+electron-to-chromium@^1.4.668:
+  version "1.4.724"
+  resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.724.tgz"
+  integrity sha512-RTRvkmRkGhNBPPpdrgtDKvmOEYTrPlXDfc0J/Nfq5s29tEahAwhiX4mmhNzj6febWMleulxVYPh7QwCSL/EldA==
+
+element-plus@^2.2.32:
+  version "2.6.3"
+  resolved "https://registry.npmmirror.com/element-plus/-/element-plus-2.6.3.tgz"
+  integrity sha512-U4L/mr+1r+EmAUYUHrs0V/8hHMdBGP07rPymSC72LZCN4jK1UwygQYICegTQ5us4mxeqBvW6wfoEfo003fwCqw==
+  dependencies:
+    "@ctrl/tinycolor" "^3.4.1"
+    "@element-plus/icons-vue" "^2.3.1"
+    "@floating-ui/dom" "^1.0.1"
+    "@popperjs/core" "npm:@sxzz/popperjs-es@^2.11.7"
+    "@types/lodash" "^4.14.182"
+    "@types/lodash-es" "^4.17.6"
+    "@vueuse/core" "^9.1.0"
+    async-validator "^4.2.5"
+    dayjs "^1.11.3"
+    escape-html "^1.0.3"
+    lodash "^4.17.21"
+    lodash-es "^4.17.21"
+    lodash-unified "^1.0.2"
+    memoize-one "^6.0.0"
+    normalize-wheel-es "^1.2.0"
+
+emoji-regex@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz"
+  integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emoji-regex@^9.2.2:
+  version "9.2.2"
+  resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz"
+  integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+
+end-of-stream@^1.1.0:
+  version "1.4.4"
+  resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz"
+  integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+  dependencies:
+    once "^1.4.0"
+
+end-or-error@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/end-or-error/-/end-or-error-1.0.1.tgz"
+  integrity sha512-OclLMSug+k2A0JKuf494im25ANRBVW8qsjmwbgX7lQ8P82H21PQ1PWkoYwb9y5yMBS69BPlwtzdIFClo3+7kOQ==
+
+entities@^4.4.0, entities@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz"
+  integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
+errno@^0.1.1:
+  version "0.1.8"
+  resolved "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz"
+  integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
+  dependencies:
+    prr "~1.0.1"
+
+error-ex@^1.3.1:
+  version "1.3.2"
+  resolved "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz"
+  integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+  dependencies:
+    is-arrayish "^0.2.1"
+
+es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2:
+  version "1.23.3"
+  resolved "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.23.3.tgz"
+  integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==
+  dependencies:
+    array-buffer-byte-length "^1.0.1"
+    arraybuffer.prototype.slice "^1.0.3"
+    available-typed-arrays "^1.0.7"
+    call-bind "^1.0.7"
+    data-view-buffer "^1.0.1"
+    data-view-byte-length "^1.0.1"
+    data-view-byte-offset "^1.0.0"
+    es-define-property "^1.0.0"
+    es-errors "^1.3.0"
+    es-object-atoms "^1.0.0"
+    es-set-tostringtag "^2.0.3"
+    es-to-primitive "^1.2.1"
+    function.prototype.name "^1.1.6"
+    get-intrinsic "^1.2.4"
+    get-symbol-description "^1.0.2"
+    globalthis "^1.0.3"
+    gopd "^1.0.1"
+    has-property-descriptors "^1.0.2"
+    has-proto "^1.0.3"
+    has-symbols "^1.0.3"
+    hasown "^2.0.2"
+    internal-slot "^1.0.7"
+    is-array-buffer "^3.0.4"
+    is-callable "^1.2.7"
+    is-data-view "^1.0.1"
+    is-negative-zero "^2.0.3"
+    is-regex "^1.1.4"
+    is-shared-array-buffer "^1.0.3"
+    is-string "^1.0.7"
+    is-typed-array "^1.1.13"
+    is-weakref "^1.0.2"
+    object-inspect "^1.13.1"
+    object-keys "^1.1.1"
+    object.assign "^4.1.5"
+    regexp.prototype.flags "^1.5.2"
+    safe-array-concat "^1.1.2"
+    safe-regex-test "^1.0.3"
+    string.prototype.trim "^1.2.9"
+    string.prototype.trimend "^1.0.8"
+    string.prototype.trimstart "^1.0.8"
+    typed-array-buffer "^1.0.2"
+    typed-array-byte-length "^1.0.1"
+    typed-array-byte-offset "^1.0.2"
+    typed-array-length "^1.0.6"
+    unbox-primitive "^1.0.2"
+    which-typed-array "^1.1.15"
+
+es-define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz"
+  integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
+  dependencies:
+    get-intrinsic "^1.2.4"
+
+es-errors@^1.2.1, es-errors@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz"
+  integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-module-lexer@^1.2.1:
+  version "1.5.0"
+  resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.5.0.tgz"
+  integrity sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==
+
+es-object-atoms@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz"
+  integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==
+  dependencies:
+    es-errors "^1.3.0"
+
+es-set-tostringtag@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz"
+  integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==
+  dependencies:
+    get-intrinsic "^1.2.4"
+    has-tostringtag "^1.0.2"
+    hasown "^2.0.1"
+
+es-to-primitive@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz"
+  integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+  dependencies:
+    is-callable "^1.1.4"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.2"
+
+esbuild@^0.18.10:
+  version "0.18.20"
+  resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz"
+  integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==
+  optionalDependencies:
+    "@esbuild/android-arm" "0.18.20"
+    "@esbuild/android-arm64" "0.18.20"
+    "@esbuild/android-x64" "0.18.20"
+    "@esbuild/darwin-arm64" "0.18.20"
+    "@esbuild/darwin-x64" "0.18.20"
+    "@esbuild/freebsd-arm64" "0.18.20"
+    "@esbuild/freebsd-x64" "0.18.20"
+    "@esbuild/linux-arm" "0.18.20"
+    "@esbuild/linux-arm64" "0.18.20"
+    "@esbuild/linux-ia32" "0.18.20"
+    "@esbuild/linux-loong64" "0.18.20"
+    "@esbuild/linux-mips64el" "0.18.20"
+    "@esbuild/linux-ppc64" "0.18.20"
+    "@esbuild/linux-riscv64" "0.18.20"
+    "@esbuild/linux-s390x" "0.18.20"
+    "@esbuild/linux-x64" "0.18.20"
+    "@esbuild/netbsd-x64" "0.18.20"
+    "@esbuild/openbsd-x64" "0.18.20"
+    "@esbuild/sunos-x64" "0.18.20"
+    "@esbuild/win32-arm64" "0.18.20"
+    "@esbuild/win32-ia32" "0.18.20"
+    "@esbuild/win32-x64" "0.18.20"
+
+escalade@^3.1.1:
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz"
+  integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
+
+escape-html@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz"
+  integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
+escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+  integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
+  integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+escodegen@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz"
+  integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==
+  dependencies:
+    esprima "^4.0.1"
+    estraverse "^5.2.0"
+    esutils "^2.0.2"
+  optionalDependencies:
+    source-map "~0.6.1"
+
+eslint-config-prettier@^8.3.0:
+  version "8.10.0"
+  resolved "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz"
+  integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==
+
+eslint-plugin-prettier@^4.0.0:
+  version "4.2.1"
+  resolved "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz"
+  integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==
+  dependencies:
+    prettier-linter-helpers "^1.0.0"
+
+eslint-plugin-vue@^9.0.0, eslint-plugin-vue@^9.9.0:
+  version "9.24.0"
+  resolved "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.24.0.tgz"
+  integrity sha512-9SkJMvF8NGMT9aQCwFc5rj8Wo1XWSMSHk36i7ZwdI614BU7sIOR28ZjuFPKp8YGymZN12BSEbiSwa7qikp+PBw==
+  dependencies:
+    "@eslint-community/eslint-utils" "^4.4.0"
+    globals "^13.24.0"
+    natural-compare "^1.4.0"
+    nth-check "^2.1.1"
+    postcss-selector-parser "^6.0.15"
+    semver "^7.6.0"
+    vue-eslint-parser "^9.4.2"
+    xml-name-validator "^4.0.0"
+
+eslint-scope@^5.1.1, eslint-scope@5.1.1:
+  version "5.1.1"
+  resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz"
+  integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+  dependencies:
+    esrecurse "^4.3.0"
+    estraverse "^4.1.1"
+
+eslint-scope@^7.1.1:
+  version "7.2.2"
+  resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz"
+  integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
+  dependencies:
+    esrecurse "^4.3.0"
+    estraverse "^5.2.0"
+
+eslint-scope@^7.2.2:
+  version "7.2.2"
+  resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz"
+  integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
+  dependencies:
+    esrecurse "^4.3.0"
+    estraverse "^5.2.0"
+
+eslint-visitor-keys@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz"
+  integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
+
+eslint-visitor-keys@^3.3.0:
+  version "3.4.3"
+  resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
+  integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint-visitor-keys@^3.4.1:
+  version "3.4.3"
+  resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
+  integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint-visitor-keys@^3.4.3:
+  version "3.4.3"
+  resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
+  integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint@*, "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^6.2.0 || ^7.0.0 || ^8.0.0", "eslint@^7.5.0 || ^8.0.0", eslint@^8.36.0, "eslint@>= 7.28.0", eslint@>=6.0.0, eslint@>=7.0.0, eslint@>=7.28.0:
+  version "8.57.0"
+  resolved "https://registry.npmmirror.com/eslint/-/eslint-8.57.0.tgz"
+  integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==
+  dependencies:
+    "@eslint-community/eslint-utils" "^4.2.0"
+    "@eslint-community/regexpp" "^4.6.1"
+    "@eslint/eslintrc" "^2.1.4"
+    "@eslint/js" "8.57.0"
+    "@humanwhocodes/config-array" "^0.11.14"
+    "@humanwhocodes/module-importer" "^1.0.1"
+    "@nodelib/fs.walk" "^1.2.8"
+    "@ungap/structured-clone" "^1.2.0"
+    ajv "^6.12.4"
+    chalk "^4.0.0"
+    cross-spawn "^7.0.2"
+    debug "^4.3.2"
+    doctrine "^3.0.0"
+    escape-string-regexp "^4.0.0"
+    eslint-scope "^7.2.2"
+    eslint-visitor-keys "^3.4.3"
+    espree "^9.6.1"
+    esquery "^1.4.2"
+    esutils "^2.0.2"
+    fast-deep-equal "^3.1.3"
+    file-entry-cache "^6.0.1"
+    find-up "^5.0.0"
+    glob-parent "^6.0.2"
+    globals "^13.19.0"
+    graphemer "^1.4.0"
+    ignore "^5.2.0"
+    imurmurhash "^0.1.4"
+    is-glob "^4.0.0"
+    is-path-inside "^3.0.3"
+    js-yaml "^4.1.0"
+    json-stable-stringify-without-jsonify "^1.0.1"
+    levn "^0.4.1"
+    lodash.merge "^4.6.2"
+    minimatch "^3.1.2"
+    natural-compare "^1.4.0"
+    optionator "^0.9.3"
+    strip-ansi "^6.0.1"
+    text-table "^0.2.0"
+
+espree@^9.3.1, espree@^9.6.0, espree@^9.6.1:
+  version "9.6.1"
+  resolved "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz"
+  integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
+  dependencies:
+    acorn "^8.9.0"
+    acorn-jsx "^5.3.2"
+    eslint-visitor-keys "^3.4.1"
+
+esprima@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz"
+  integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.4.0, esquery@^1.4.2:
+  version "1.5.0"
+  resolved "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz"
+  integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
+  dependencies:
+    estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz"
+  integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+  dependencies:
+    estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz"
+  integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0:
+  version "5.3.0"
+  resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz"
+  integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+estraverse@^5.2.0:
+  version "5.3.0"
+  resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz"
+  integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+estree-walker@^0.6.1:
+  version "0.6.1"
+  resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-0.6.1.tgz"
+  integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==
+
+estree-walker@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz"
+  integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
+
+esutils@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz"
+  integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+event-target-shim@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/event-target-shim/-/event-target-shim-5.0.1.tgz"
+  integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
+eventsource@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/eventsource/-/eventsource-2.0.2.tgz"
+  integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==
+
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz"
+  integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==
+  dependencies:
+    is-extendable "^0.1.0"
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
+  integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-diff@^1.1.2:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.3.0.tgz"
+  integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==
+
+fast-glob@^3.2.12, fast-glob@^3.2.9:
+  version "3.3.2"
+  resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz"
+  integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+  dependencies:
+    "@nodelib/fs.stat" "^2.0.2"
+    "@nodelib/fs.walk" "^1.2.3"
+    glob-parent "^5.1.2"
+    merge2 "^1.3.0"
+    micromatch "^4.0.4"
+
+fast-json-stable-stringify@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
+  integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
+  integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fastq@^1.6.0:
+  version "1.17.1"
+  resolved "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz"
+  integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
+  dependencies:
+    reusify "^1.0.4"
+
+fetch-cookie@^2.0.3:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/fetch-cookie/-/fetch-cookie-2.2.0.tgz"
+  integrity sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ==
+  dependencies:
+    set-cookie-parser "^2.4.8"
+    tough-cookie "^4.0.0"
+
+file-entry-cache@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz"
+  integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+  dependencies:
+    flat-cache "^3.0.4"
+
+fill-range@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz"
+  integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+  dependencies:
+    to-regex-range "^5.0.1"
+
+find-up@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz"
+  integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+  dependencies:
+    locate-path "^6.0.0"
+    path-exists "^4.0.0"
+
+flat-cache@^3.0.4:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz"
+  integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
+  dependencies:
+    flatted "^3.2.9"
+    keyv "^4.5.3"
+    rimraf "^3.0.2"
+
+flatted@^3.2.9:
+  version "3.3.1"
+  resolved "https://registry.npmmirror.com/flatted/-/flatted-3.3.1.tgz"
+  integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==
+
+follow-redirects@^1.15.6:
+  version "1.15.6"
+  resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.6.tgz"
+  integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
+
+for-each@^0.3.3:
+  version "0.3.3"
+  resolved "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz"
+  integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+  dependencies:
+    is-callable "^1.1.3"
+
+foreground-child@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.1.1.tgz"
+  integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==
+  dependencies:
+    cross-spawn "^7.0.0"
+    signal-exit "^4.0.1"
+
+form-data@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz"
+  integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.8"
+    mime-types "^2.1.12"
+
+formstream@^1.1.0:
+  version "1.3.1"
+  resolved "https://registry.npmmirror.com/formstream/-/formstream-1.3.1.tgz"
+  integrity sha512-FkW++ub+VbE5dpwukJVDizNWhSgp8FhmhI65pF7BZSVStBqe6Wgxe2Z9/Vhsn7l7nXCPwP+G1cyYlX8VwWOf0g==
+  dependencies:
+    destroy "^1.0.4"
+    mime "^2.5.2"
+    pause-stream "~0.0.11"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz"
+  integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+function-bind@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz"
+  integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+function.prototype.name@^1.1.6:
+  version "1.1.6"
+  resolved "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz"
+  integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+    functions-have-names "^1.2.3"
+
+functions-have-names@^1.2.3:
+  version "1.2.3"
+  resolved "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz"
+  integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+gensync@^1.0.0-beta.2:
+  version "1.0.0-beta.2"
+  resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz"
+  integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz"
+  integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-func-name@^2.0.1, get-func-name@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/get-func-name/-/get-func-name-2.0.2.tgz"
+  integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==
+
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz"
+  integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
+  dependencies:
+    es-errors "^1.3.0"
+    function-bind "^1.1.2"
+    has-proto "^1.0.1"
+    has-symbols "^1.0.3"
+    hasown "^2.0.0"
+
+get-ready@^1.0.0, get-ready@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/get-ready/-/get-ready-1.0.0.tgz"
+  integrity sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==
+
+get-symbol-description@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz"
+  integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==
+  dependencies:
+    call-bind "^1.0.5"
+    es-errors "^1.3.0"
+    get-intrinsic "^1.2.4"
+
+glob-parent@^5.1.2:
+  version "5.1.2"
+  resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz"
+  integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+  dependencies:
+    is-glob "^4.0.1"
+
+glob-parent@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz"
+  integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+  dependencies:
+    is-glob "^4.0.3"
+
+glob@^10.3.3:
+  version "10.3.12"
+  resolved "https://registry.npmmirror.com/glob/-/glob-10.3.12.tgz"
+  integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==
+  dependencies:
+    foreground-child "^3.1.0"
+    jackspeak "^2.3.6"
+    minimatch "^9.0.1"
+    minipass "^7.0.4"
+    path-scurry "^1.10.2"
+
+glob@^7.1.3:
+  version "7.2.3"
+  resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz"
+  integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.1.1"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@^7.1.6:
+  version "7.2.3"
+  resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz"
+  integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.1.1"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@^9.2.0:
+  version "9.3.5"
+  resolved "https://registry.npmmirror.com/glob/-/glob-9.3.5.tgz"
+  integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==
+  dependencies:
+    fs.realpath "^1.0.0"
+    minimatch "^8.0.2"
+    minipass "^4.2.4"
+    path-scurry "^1.6.1"
+
+globals@^11.1.0:
+  version "11.12.0"
+  resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz"
+  integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^13.19.0:
+  version "13.24.0"
+  resolved "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz"
+  integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
+  dependencies:
+    type-fest "^0.20.2"
+
+globals@^13.24.0:
+  version "13.24.0"
+  resolved "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz"
+  integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
+  dependencies:
+    type-fest "^0.20.2"
+
+globalthis@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz"
+  integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
+  dependencies:
+    define-properties "^1.1.3"
+
+globby@^11.1.0:
+  version "11.1.0"
+  resolved "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz"
+  integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+  dependencies:
+    array-union "^2.1.0"
+    dir-glob "^3.0.1"
+    fast-glob "^3.2.9"
+    ignore "^5.2.0"
+    merge2 "^1.4.1"
+    slash "^3.0.0"
+
+gopd@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz"
+  integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+  dependencies:
+    get-intrinsic "^1.1.3"
+
+graceful-fs@^4.1.2:
+  version "4.2.11"
+  resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz"
+  integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+graphemer@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz"
+  integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz"
+  integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz"
+  integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz"
+  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz"
+  integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
+  dependencies:
+    es-define-property "^1.0.0"
+
+has-proto@^1.0.1, has-proto@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz"
+  integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz"
+  integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz"
+  integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
+  dependencies:
+    has-symbols "^1.0.3"
+
+hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz"
+  integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+  dependencies:
+    function-bind "^1.1.2"
+
+he@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/he/-/he-1.2.0.tgz"
+  integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+hosted-git-info@^2.1.4:
+  version "2.8.9"
+  resolved "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz"
+  integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+html-encoding-sniffer@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz"
+  integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==
+  dependencies:
+    whatwg-encoding "^2.0.0"
+
+html-tags@^3.3.1:
+  version "3.3.1"
+  resolved "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.1.tgz"
+  integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==
+
+http-proxy-agent@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz"
+  integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==
+  dependencies:
+    "@tootallnate/once" "2"
+    agent-base "6"
+    debug "4"
+
+https-proxy-agent@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz"
+  integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
+  dependencies:
+    agent-base "6"
+    debug "4"
+
+humanize-ms@^1.2.0, humanize-ms@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/humanize-ms/-/humanize-ms-1.2.1.tgz"
+  integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==
+  dependencies:
+    ms "^2.0.0"
+
+iconv-lite@^0.4.15:
+  version "0.4.24"
+  resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz"
+  integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.6.3, iconv-lite@0.6.3:
+  version "0.6.3"
+  resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz"
+  integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3.0.0"
+
+ignore@^5.2.0:
+  version "5.3.1"
+  resolved "https://registry.npmmirror.com/ignore/-/ignore-5.3.1.tgz"
+  integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==
+
+image-size@~0.5.0:
+  version "0.5.5"
+  resolved "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz"
+  integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==
+
+import-fresh@^3.2.1:
+  version "3.3.0"
+  resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz"
+  integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+  dependencies:
+    parent-module "^1.0.0"
+    resolve-from "^4.0.0"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz"
+  integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz"
+  integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@^2.0.1, inherits@~2.0.3, inherits@2:
+  version "2.0.4"
+  resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz"
+  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ini@^1.3.4:
+  version "1.3.8"
+  resolved "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz"
+  integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+internal-slot@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.7.tgz"
+  integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==
+  dependencies:
+    es-errors "^1.3.0"
+    hasown "^2.0.0"
+    side-channel "^1.0.4"
+
+ip@^1.1.5:
+  version "1.1.9"
+  resolved "https://registry.npmmirror.com/ip/-/ip-1.1.9.tgz"
+  integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==
+
+is-array-buffer@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz"
+  integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==
+  dependencies:
+    call-bind "^1.0.2"
+    get-intrinsic "^1.2.1"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz"
+  integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-bigint@^1.0.1:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz"
+  integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+  dependencies:
+    has-bigints "^1.0.1"
+
+is-boolean-object@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz"
+  integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+  dependencies:
+    call-bind "^1.0.2"
+    has-tostringtag "^1.0.0"
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
+  version "1.2.7"
+  resolved "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz"
+  integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-class-hotfix@~0.0.6:
+  version "0.0.6"
+  resolved "https://registry.npmmirror.com/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz"
+  integrity sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==
+
+is-core-module@^2.13.0:
+  version "2.13.1"
+  resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz"
+  integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
+  dependencies:
+    hasown "^2.0.0"
+
+is-data-view@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/is-data-view/-/is-data-view-1.0.1.tgz"
+  integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==
+  dependencies:
+    is-typed-array "^1.1.13"
+
+is-date-object@^1.0.1:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz"
+  integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+  dependencies:
+    has-tostringtag "^1.0.0"
+
+is-docker@^2.0.0, is-docker@^2.1.1:
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz"
+  integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-extendable@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz"
+  integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==
+
+is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz"
+  integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-fullwidth-code-point@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
+  integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-fullwidth-code-point@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz"
+  integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz"
+  integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+  dependencies:
+    is-extglob "^2.1.1"
+
+is-negative-zero@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz"
+  integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
+
+is-number-object@^1.0.4:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz"
+  integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+  dependencies:
+    has-tostringtag "^1.0.0"
+
+is-number@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz"
+  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-path-inside@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz"
+  integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
+is-potential-custom-element-name@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz"
+  integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
+
+is-reference@^1.1.2:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/is-reference/-/is-reference-1.2.1.tgz"
+  integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==
+  dependencies:
+    "@types/estree" "*"
+
+is-regex@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz"
+  integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+  dependencies:
+    call-bind "^1.0.2"
+    has-tostringtag "^1.0.0"
+
+is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz"
+  integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==
+  dependencies:
+    call-bind "^1.0.7"
+
+is-string@^1.0.5, is-string@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz"
+  integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+  dependencies:
+    has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz"
+  integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+  dependencies:
+    has-symbols "^1.0.2"
+
+is-type-of@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/is-type-of/-/is-type-of-1.4.0.tgz"
+  integrity sha512-EddYllaovi5ysMLMEN7yzHEKh8A850cZ7pykrY1aNRQGn/CDjRDE9qEWbIdt7xGEVJmjBXzU/fNnC4ABTm8tEQ==
+  dependencies:
+    core-util-is "^1.0.2"
+    is-class-hotfix "~0.0.6"
+    isstream "~0.1.2"
+
+is-typed-array@^1.1.13:
+  version "1.1.13"
+  resolved "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.13.tgz"
+  integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==
+  dependencies:
+    which-typed-array "^1.1.14"
+
+is-weakref@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz"
+  integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+  dependencies:
+    call-bind "^1.0.2"
+
+is-what@^3.14.1:
+  version "3.14.1"
+  resolved "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz"
+  integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==
+
+is-wsl@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz"
+  integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+  dependencies:
+    is-docker "^2.0.0"
+
+isarray@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz"
+  integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz"
+  integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz"
+  integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz"
+  integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==
+
+jackspeak@^2.3.6:
+  version "2.3.6"
+  resolved "https://registry.npmmirror.com/jackspeak/-/jackspeak-2.3.6.tgz"
+  integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==
+  dependencies:
+    "@isaacs/cliui" "^8.0.2"
+  optionalDependencies:
+    "@pkgjs/parseargs" "^0.11.0"
+
+js-base64@^2.5.2:
+  version "2.6.4"
+  resolved "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz"
+  integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
+
+js-beautify@^1.14.9:
+  version "1.15.1"
+  resolved "https://registry.npmmirror.com/js-beautify/-/js-beautify-1.15.1.tgz"
+  integrity sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==
+  dependencies:
+    config-chain "^1.1.13"
+    editorconfig "^1.0.4"
+    glob "^10.3.3"
+    js-cookie "^3.0.5"
+    nopt "^7.2.0"
+
+js-cookie@^3.0.5:
+  version "3.0.5"
+  resolved "https://registry.npmmirror.com/js-cookie/-/js-cookie-3.0.5.tgz"
+  integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==
+
+js-tokens@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz"
+  integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz"
+  integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+  dependencies:
+    argparse "^2.0.1"
+
+jsdom@*, jsdom@^21.1.0:
+  version "21.1.2"
+  resolved "https://registry.npmmirror.com/jsdom/-/jsdom-21.1.2.tgz"
+  integrity sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ==
+  dependencies:
+    abab "^2.0.6"
+    acorn "^8.8.2"
+    acorn-globals "^7.0.0"
+    cssstyle "^3.0.0"
+    data-urls "^4.0.0"
+    decimal.js "^10.4.3"
+    domexception "^4.0.0"
+    escodegen "^2.0.0"
+    form-data "^4.0.0"
+    html-encoding-sniffer "^3.0.0"
+    http-proxy-agent "^5.0.0"
+    https-proxy-agent "^5.0.1"
+    is-potential-custom-element-name "^1.0.1"
+    nwsapi "^2.2.4"
+    parse5 "^7.1.2"
+    rrweb-cssom "^0.6.0"
+    saxes "^6.0.0"
+    symbol-tree "^3.2.4"
+    tough-cookie "^4.1.2"
+    w3c-xmlserializer "^4.0.0"
+    webidl-conversions "^7.0.0"
+    whatwg-encoding "^2.0.0"
+    whatwg-mimetype "^3.0.0"
+    whatwg-url "^12.0.1"
+    ws "^8.13.0"
+    xml-name-validator "^4.0.0"
+
+jsesc@^2.5.1:
+  version "2.5.2"
+  resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz"
+  integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+json-buffer@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz"
+  integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-parse-better-errors@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz"
+  integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+
+json-schema-traverse@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
+  integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+  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==
+
+json5@^2.2.3:
+  version "2.2.3"
+  resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz"
+  integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+jsonc-parser@^3.2.0:
+  version "3.2.1"
+  resolved "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.1.tgz"
+  integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==
+
+jstoxml@^2.0.0:
+  version "2.2.9"
+  resolved "https://registry.npmmirror.com/jstoxml/-/jstoxml-2.2.9.tgz"
+  integrity sha512-OYWlK0j+roh+eyaMROlNbS5cd5R25Y+IUpdl7cNdB8HNrkgwQzIS7L9MegxOiWNBj9dQhA/yAxiMwCC5mwNoBw==
+
+keyv@^4.5.3:
+  version "4.5.4"
+  resolved "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz"
+  integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+  dependencies:
+    json-buffer "3.0.1"
+
+less@*, less@^4.1.3:
+  version "4.2.0"
+  resolved "https://registry.npmmirror.com/less/-/less-4.2.0.tgz"
+  integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==
+  dependencies:
+    copy-anything "^2.0.1"
+    parse-node-version "^1.0.1"
+    tslib "^2.3.0"
+  optionalDependencies:
+    errno "^0.1.1"
+    graceful-fs "^4.1.2"
+    image-size "~0.5.0"
+    make-dir "^2.1.0"
+    mime "^1.4.1"
+    needle "^3.1.0"
+    source-map "~0.6.0"
+
+levn@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz"
+  integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+  dependencies:
+    prelude-ls "^1.2.1"
+    type-check "~0.4.0"
+
+load-json-file@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/load-json-file/-/load-json-file-4.0.0.tgz"
+  integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^4.0.0"
+    pify "^3.0.0"
+    strip-bom "^3.0.0"
+
+local-pkg@^0.4.2:
+  version "0.4.3"
+  resolved "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.3.tgz"
+  integrity sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==
+
+locate-path@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz"
+  integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+  dependencies:
+    p-locate "^5.0.0"
+
+lodash-es@*, lodash-es@^4.17.21:
+  version "4.17.21"
+  resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz"
+  integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
+lodash-unified@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz"
+  integrity sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==
+
+lodash.merge@^4.6.2:
+  version "4.6.2"
+  resolved "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz"
+  integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash@*, lodash@^4.17.21:
+  version "4.17.21"
+  resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz"
+  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+loupe@^2.3.6:
+  version "2.3.7"
+  resolved "https://registry.npmmirror.com/loupe/-/loupe-2.3.7.tgz"
+  integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==
+  dependencies:
+    get-func-name "^2.0.1"
+
+lru-cache@^10.2.0:
+  version "10.2.0"
+  resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.2.0.tgz"
+  integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==
+
+lru-cache@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz"
+  integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+  dependencies:
+    yallist "^3.0.2"
+
+lru-cache@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz"
+  integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+  dependencies:
+    yallist "^4.0.0"
+
+magic-string@^0.25.2:
+  version "0.25.9"
+  resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz"
+  integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==
+  dependencies:
+    sourcemap-codec "^1.4.8"
+
+magic-string@^0.30.1, magic-string@^0.30.7:
+  version "0.30.8"
+  resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.8.tgz"
+  integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==
+  dependencies:
+    "@jridgewell/sourcemap-codec" "^1.4.15"
+
+make-dir@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz"
+  integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
+  dependencies:
+    pify "^4.0.1"
+    semver "^5.6.0"
+
+memoize-one@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz"
+  integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==
+
+memorystream@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz"
+  integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==
+
+merge-descriptors@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz"
+  integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==
+
+merge2@^1.3.0, merge2@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz"
+  integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^4.0.4:
+  version "4.0.5"
+  resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz"
+  integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+  dependencies:
+    braces "^3.0.2"
+    picomatch "^2.3.1"
+
+mime-db@1.52.0:
+  version "1.52.0"
+  resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz"
+  integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12:
+  version "2.1.35"
+  resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz"
+  integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+  dependencies:
+    mime-db "1.52.0"
+
+mime@^1.4.1:
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz"
+  integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mime@^2.4.5, mime@^2.5.2:
+  version "2.6.0"
+  resolved "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz"
+  integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
+
+minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz"
+  integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimatch@^8.0.2:
+  version "8.0.4"
+  resolved "https://registry.npmmirror.com/minimatch/-/minimatch-8.0.4.tgz"
+  integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==
+  dependencies:
+    brace-expansion "^2.0.1"
+
+minimatch@^9.0.1:
+  version "9.0.4"
+  resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.4.tgz"
+  integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==
+  dependencies:
+    brace-expansion "^2.0.1"
+
+minimatch@^9.0.3:
+  version "9.0.4"
+  resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.4.tgz"
+  integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==
+  dependencies:
+    brace-expansion "^2.0.1"
+
+minimatch@9.0.1:
+  version "9.0.1"
+  resolved "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.1.tgz"
+  integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==
+  dependencies:
+    brace-expansion "^2.0.1"
+
+minimist@^1.1.0, minimist@^1.2.6:
+  version "1.2.8"
+  resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz"
+  integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+minipass@^4.2.4:
+  version "4.2.8"
+  resolved "https://registry.npmmirror.com/minipass/-/minipass-4.2.8.tgz"
+  integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==
+
+"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4:
+  version "7.0.4"
+  resolved "https://registry.npmmirror.com/minipass/-/minipass-7.0.4.tgz"
+  integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==
+
+mkdirp@^0.5.1:
+  version "0.5.6"
+  resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz"
+  integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
+  dependencies:
+    minimist "^1.2.6"
+
+mlly@^1.1.0, mlly@^1.2.0:
+  version "1.6.1"
+  resolved "https://registry.npmmirror.com/mlly/-/mlly-1.6.1.tgz"
+  integrity sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==
+  dependencies:
+    acorn "^8.11.3"
+    pathe "^1.1.2"
+    pkg-types "^1.0.3"
+    ufo "^1.3.2"
+
+ms@^2.0.0, ms@2.1.2:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz"
+  integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz"
+  integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+muggle-string@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.3.1.tgz"
+  integrity sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==
+
+mz@^2.7.0:
+  version "2.7.0"
+  resolved "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz"
+  integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
+  dependencies:
+    any-promise "^1.0.0"
+    object-assign "^4.0.1"
+    thenify-all "^1.0.0"
+
+nanoid@^3.3.7:
+  version "3.3.7"
+  resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz"
+  integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+
+natural-compare-lite@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz"
+  integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==
+
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz"
+  integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+needle@^3.1.0:
+  version "3.3.1"
+  resolved "https://registry.npmmirror.com/needle/-/needle-3.3.1.tgz"
+  integrity sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==
+  dependencies:
+    iconv-lite "^0.6.3"
+    sax "^1.2.4"
+
+nice-try@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz"
+  integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+node-fetch@^2.6.7:
+  version "2.7.0"
+  resolved "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.7.0.tgz"
+  integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
+  dependencies:
+    whatwg-url "^5.0.0"
+
+node-releases@^2.0.14:
+  version "2.0.14"
+  resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz"
+  integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
+
+nopt@^7.2.0:
+  version "7.2.0"
+  resolved "https://registry.npmmirror.com/nopt/-/nopt-7.2.0.tgz"
+  integrity sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==
+  dependencies:
+    abbrev "^2.0.0"
+
+normalize-package-data@^2.3.2:
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz"
+  integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+  dependencies:
+    hosted-git-info "^2.1.4"
+    resolve "^1.10.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-wheel-es@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz"
+  integrity sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==
+
+npm-run-all@^4.1.5:
+  version "4.1.5"
+  resolved "https://registry.npmmirror.com/npm-run-all/-/npm-run-all-4.1.5.tgz"
+  integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==
+  dependencies:
+    ansi-styles "^3.2.1"
+    chalk "^2.4.1"
+    cross-spawn "^6.0.5"
+    memorystream "^0.3.1"
+    minimatch "^3.0.4"
+    pidtree "^0.3.0"
+    read-pkg "^3.0.0"
+    shell-quote "^1.6.1"
+    string.prototype.padend "^3.0.0"
+
+nth-check@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz"
+  integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
+  dependencies:
+    boolbase "^1.0.0"
+
+nwsapi@^2.2.4:
+  version "2.2.7"
+  resolved "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.7.tgz"
+  integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==
+
+object-assign@^4.0.1:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz"
+  integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-inspect@^1.13.1:
+  version "1.13.1"
+  resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz"
+  integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
+
+object-keys@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz"
+  integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.5:
+  version "4.1.5"
+  resolved "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.5.tgz"
+  integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==
+  dependencies:
+    call-bind "^1.0.5"
+    define-properties "^1.2.1"
+    has-symbols "^1.0.3"
+    object-keys "^1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz"
+  integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+  dependencies:
+    wrappy "1"
+
+open@^8.4.0:
+  version "8.4.2"
+  resolved "https://registry.npmmirror.com/open/-/open-8.4.2.tgz"
+  integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==
+  dependencies:
+    define-lazy-prop "^2.0.0"
+    is-docker "^2.1.1"
+    is-wsl "^2.2.0"
+
+optionator@^0.9.3:
+  version "0.9.3"
+  resolved "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz"
+  integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
+  dependencies:
+    "@aashutoshrathi/word-wrap" "^1.2.3"
+    deep-is "^0.1.3"
+    fast-levenshtein "^2.0.6"
+    levn "^0.4.1"
+    prelude-ls "^1.2.1"
+    type-check "^0.4.0"
+
+os-name@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/os-name/-/os-name-1.0.3.tgz"
+  integrity sha512-f5estLO2KN8vgtTRaILIgEGBoBrMnZ3JQ7W9TMZCnOIGwHe8TRGSpcagnWDo+Dfhd/z08k9Xe75hvciJJ8Qaew==
+  dependencies:
+    osx-release "^1.0.0"
+    win-release "^1.0.0"
+
+osx-release@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/osx-release/-/osx-release-1.1.0.tgz"
+  integrity sha512-ixCMMwnVxyHFQLQnINhmIpWqXIfS2YOXchwQrk+OFzmo6nDjQ0E4KXAyyUh0T0MZgV4bUhkRrAbVqlE4yLVq4A==
+  dependencies:
+    minimist "^1.1.0"
+
+p-limit@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz"
+  integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+  dependencies:
+    yocto-queue "^0.1.0"
+
+p-limit@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/p-limit/-/p-limit-4.0.0.tgz"
+  integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==
+  dependencies:
+    yocto-queue "^1.0.0"
+
+p-locate@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz"
+  integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+  dependencies:
+    p-limit "^3.0.2"
+
+parent-module@^1.0.0:
+  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==
+  dependencies:
+    callsites "^3.0.0"
+
+parse-json@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz"
+  integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==
+  dependencies:
+    error-ex "^1.3.1"
+    json-parse-better-errors "^1.0.1"
+
+parse-node-version@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz"
+  integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==
+
+parse5@^7.0.0, parse5@^7.1.2:
+  version "7.1.2"
+  resolved "https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz"
+  integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==
+  dependencies:
+    entities "^4.4.0"
+
+path-browserify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz"
+  integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
+
+path-exists@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz"
+  integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
+  integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz"
+  integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==
+
+path-key@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz"
+  integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz"
+  integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-scurry@^1.10.2, path-scurry@^1.6.1:
+  version "1.10.2"
+  resolved "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.10.2.tgz"
+  integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==
+  dependencies:
+    lru-cache "^10.2.0"
+    minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
+
+path-type@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/path-type/-/path-type-3.0.0.tgz"
+  integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
+  dependencies:
+    pify "^3.0.0"
+
+path-type@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz"
+  integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+pathe@^1.1.0, pathe@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz"
+  integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==
+
+pathval@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/pathval/-/pathval-1.1.1.tgz"
+  integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==
+
+pause-stream@~0.0.11:
+  version "0.0.11"
+  resolved "https://registry.npmmirror.com/pause-stream/-/pause-stream-0.0.11.tgz"
+  integrity sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==
+  dependencies:
+    through "~2.3"
+
+picocolors@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz"
+  integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.3.1:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz"
+  integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pidtree@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.npmmirror.com/pidtree/-/pidtree-0.3.1.tgz"
+  integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==
+
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz"
+  integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==
+
+pify@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz"
+  integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+pinia@^2.0.32:
+  version "2.1.7"
+  resolved "https://registry.npmmirror.com/pinia/-/pinia-2.1.7.tgz"
+  integrity sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==
+  dependencies:
+    "@vue/devtools-api" "^6.5.0"
+    vue-demi ">=0.14.5"
+
+pkg-types@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.0.3.tgz"
+  integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==
+  dependencies:
+    jsonc-parser "^3.2.0"
+    mlly "^1.2.0"
+    pathe "^1.1.0"
+
+platform@^1.3.1:
+  version "1.3.6"
+  resolved "https://registry.npmmirror.com/platform/-/platform-1.3.6.tgz"
+  integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==
+
+possible-typed-array-names@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz"
+  integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==
+
+postcss-selector-parser@^6.0.15:
+  version "6.0.16"
+  resolved "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz"
+  integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==
+  dependencies:
+    cssesc "^3.0.0"
+    util-deprecate "^1.0.2"
+
+postcss@^8.4.27, postcss@^8.4.35:
+  version "8.4.38"
+  resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.38.tgz"
+  integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
+  dependencies:
+    nanoid "^3.3.7"
+    picocolors "^1.0.0"
+    source-map-js "^1.2.0"
+
+prelude-ls@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz"
+  integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+prettier-linter-helpers@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz"
+  integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==
+  dependencies:
+    fast-diff "^1.1.2"
+
+prettier@^2.8.4, "prettier@>= 2.0.0", prettier@>=2.0.0:
+  version "2.8.8"
+  resolved "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz"
+  integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
+
+pretty-format@^27.5.1:
+  version "27.5.1"
+  resolved "https://registry.npmmirror.com/pretty-format/-/pretty-format-27.5.1.tgz"
+  integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
+  dependencies:
+    ansi-regex "^5.0.1"
+    ansi-styles "^5.0.0"
+    react-is "^17.0.1"
+
+process-nextick-args@~2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
+  integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+proto-list@~1.2.1:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/proto-list/-/proto-list-1.2.4.tgz"
+  integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==
+
+proxy-from-env@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz"
+  integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
+prr@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz"
+  integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==
+
+psl@^1.1.33:
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz"
+  integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+
+pump@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz"
+  integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz"
+  integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+qs@^6.4.0:
+  version "6.12.0"
+  resolved "https://registry.npmmirror.com/qs/-/qs-6.12.0.tgz"
+  integrity sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==
+  dependencies:
+    side-channel "^1.0.6"
+
+querystringify@^2.1.1:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz"
+  integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
+
+queue-microtask@^1.2.2:
+  version "1.2.3"
+  resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz"
+  integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+react-is@^17.0.1:
+  version "17.0.2"
+  resolved "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz"
+  integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
+
+read-pkg@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/read-pkg/-/read-pkg-3.0.0.tgz"
+  integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==
+  dependencies:
+    load-json-file "^4.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^3.0.0"
+
+readable-stream@^2.3.6:
+  version "2.3.8"
+  resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz"
+  integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.1.1"
+    util-deprecate "~1.0.1"
+
+regenerator-runtime@^0.14.0:
+  version "0.14.1"
+  resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz"
+  integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+
+regexp.prototype.flags@^1.5.2:
+  version "1.5.2"
+  resolved "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz"
+  integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==
+  dependencies:
+    call-bind "^1.0.6"
+    define-properties "^1.2.1"
+    es-errors "^1.3.0"
+    set-function-name "^2.0.1"
+
+require-directory@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz"
+  integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+requires-port@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz"
+  integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
+
+resolve-from@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz"
+  integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve@^1.10.0, resolve@^1.11.0:
+  version "1.22.8"
+  resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz"
+  integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+  dependencies:
+    is-core-module "^2.13.0"
+    path-parse "^1.0.7"
+    supports-preserve-symlinks-flag "^1.0.0"
+
+reusify@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz"
+  integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz"
+  integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+  dependencies:
+    glob "^7.1.3"
+
+rimraf@^4.1.2:
+  version "4.4.1"
+  resolved "https://registry.npmmirror.com/rimraf/-/rimraf-4.4.1.tgz"
+  integrity sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==
+  dependencies:
+    glob "^9.2.0"
+
+rollup-plugin-commonjs@^10.1.0:
+  version "10.1.0"
+  resolved "https://registry.npmmirror.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz"
+  integrity sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==
+  dependencies:
+    estree-walker "^0.6.1"
+    is-reference "^1.1.2"
+    magic-string "^0.25.2"
+    resolve "^1.11.0"
+    rollup-pluginutils "^2.8.1"
+
+rollup-plugin-visualizer@^5.9.0:
+  version "5.12.0"
+  resolved "https://registry.npmmirror.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.12.0.tgz"
+  integrity sha512-8/NU9jXcHRs7Nnj07PF2o4gjxmm9lXIrZ8r175bT9dK8qoLlvKTwRMArRCMgpMGlq8CTLugRvEmyMeMXIU2pNQ==
+  dependencies:
+    open "^8.4.0"
+    picomatch "^2.3.1"
+    source-map "^0.7.4"
+    yargs "^17.5.1"
+
+rollup-pluginutils@^2.8.1:
+  version "2.8.2"
+  resolved "https://registry.npmmirror.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz"
+  integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==
+  dependencies:
+    estree-walker "^0.6.1"
+
+rollup@^3.27.1:
+  version "3.29.4"
+  resolved "https://registry.npmmirror.com/rollup/-/rollup-3.29.4.tgz"
+  integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==
+  optionalDependencies:
+    fsevents "~2.3.2"
+
+rollup@>=1.12.0, "rollup@2.x || 3.x || 4.x":
+  version "4.14.0"
+  resolved "https://registry.npmmirror.com/rollup/-/rollup-4.14.0.tgz"
+  integrity sha512-Qe7w62TyawbDzB4yt32R0+AbIo6m1/sqO7UPzFS8Z/ksL5mrfhA0v4CavfdmFav3D+ub4QeAgsGEe84DoWe/nQ==
+  dependencies:
+    "@types/estree" "1.0.5"
+  optionalDependencies:
+    "@rollup/rollup-android-arm-eabi" "4.14.0"
+    "@rollup/rollup-android-arm64" "4.14.0"
+    "@rollup/rollup-darwin-arm64" "4.14.0"
+    "@rollup/rollup-darwin-x64" "4.14.0"
+    "@rollup/rollup-linux-arm-gnueabihf" "4.14.0"
+    "@rollup/rollup-linux-arm64-gnu" "4.14.0"
+    "@rollup/rollup-linux-arm64-musl" "4.14.0"
+    "@rollup/rollup-linux-powerpc64le-gnu" "4.14.0"
+    "@rollup/rollup-linux-riscv64-gnu" "4.14.0"
+    "@rollup/rollup-linux-s390x-gnu" "4.14.0"
+    "@rollup/rollup-linux-x64-gnu" "4.14.0"
+    "@rollup/rollup-linux-x64-musl" "4.14.0"
+    "@rollup/rollup-win32-arm64-msvc" "4.14.0"
+    "@rollup/rollup-win32-ia32-msvc" "4.14.0"
+    "@rollup/rollup-win32-x64-msvc" "4.14.0"
+    fsevents "~2.3.2"
+
+rrweb-cssom@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.npmmirror.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz"
+  integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==
+
+run-parallel@^1.1.9:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz"
+  integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+  dependencies:
+    queue-microtask "^1.2.2"
+
+safe-array-concat@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz"
+  integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==
+  dependencies:
+    call-bind "^1.0.7"
+    get-intrinsic "^1.2.4"
+    has-symbols "^1.0.3"
+    isarray "^2.0.5"
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.2"
+  resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz"
+  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-regex-test@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz"
+  integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==
+  dependencies:
+    call-bind "^1.0.6"
+    es-errors "^1.3.0"
+    is-regex "^1.1.4"
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0":
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz"
+  integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@^1.2.4, sax@>=0.6.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/sax/-/sax-1.3.0.tgz"
+  integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==
+
+sax@~1.2.4:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz"
+  integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+saxes@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz"
+  integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==
+  dependencies:
+    xmlchars "^2.2.0"
+
+sdk-base@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/sdk-base/-/sdk-base-2.0.1.tgz"
+  integrity sha512-eeG26wRwhtwYuKGCDM3LixCaxY27Pa/5lK4rLKhQa7HBjJ3U3Y+f81MMZQRsDw/8SC2Dao/83yJTXJ8aULuN8Q==
+  dependencies:
+    get-ready "~1.0.0"
+
+semver@^5.0.1:
+  version "5.7.2"
+  resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz"
+  integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+semver@^5.5.0:
+  version "5.7.2"
+  resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz"
+  integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+semver@^5.6.0:
+  version "5.7.2"
+  resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz"
+  integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+semver@^6.3.1:
+  version "6.3.1"
+  resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz"
+  integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.3.6:
+  version "7.6.0"
+  resolved "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz"
+  integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
+  dependencies:
+    lru-cache "^6.0.0"
+
+semver@^7.3.7:
+  version "7.6.0"
+  resolved "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz"
+  integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
+  dependencies:
+    lru-cache "^6.0.0"
+
+semver@^7.5.3:
+  version "7.6.0"
+  resolved "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz"
+  integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
+  dependencies:
+    lru-cache "^6.0.0"
+
+semver@^7.5.4:
+  version "7.6.0"
+  resolved "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz"
+  integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
+  dependencies:
+    lru-cache "^6.0.0"
+
+semver@^7.6.0:
+  version "7.6.0"
+  resolved "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz"
+  integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
+  dependencies:
+    lru-cache "^6.0.0"
+
+"semver@2 || 3 || 4 || 5":
+  version "5.7.2"
+  resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz"
+  integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+set-cookie-parser@^2.4.8:
+  version "2.6.0"
+  resolved "https://registry.npmmirror.com/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz"
+  integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==
+
+set-function-length@^1.2.1:
+  version "1.2.2"
+  resolved "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz"
+  integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
+  dependencies:
+    define-data-property "^1.1.4"
+    es-errors "^1.3.0"
+    function-bind "^1.1.2"
+    get-intrinsic "^1.2.4"
+    gopd "^1.0.1"
+    has-property-descriptors "^1.0.2"
+
+set-function-name@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz"
+  integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
+  dependencies:
+    define-data-property "^1.1.4"
+    es-errors "^1.3.0"
+    functions-have-names "^1.2.3"
+    has-property-descriptors "^1.0.2"
+
+shebang-command@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz"
+  integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==
+  dependencies:
+    shebang-regex "^1.0.0"
+
+shebang-command@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz"
+  integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+  dependencies:
+    shebang-regex "^3.0.0"
+
+shebang-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz"
+  integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==
+
+shebang-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz"
+  integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shell-quote@^1.6.1:
+  version "1.8.1"
+  resolved "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.1.tgz"
+  integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==
+
+side-channel@^1.0.4, side-channel@^1.0.6:
+  version "1.0.6"
+  resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.6.tgz"
+  integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==
+  dependencies:
+    call-bind "^1.0.7"
+    es-errors "^1.3.0"
+    get-intrinsic "^1.2.4"
+    object-inspect "^1.13.1"
+
+siginfo@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/siginfo/-/siginfo-2.0.0.tgz"
+  integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==
+
+signal-exit@^4.0.1:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz"
+  integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+
+slash@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz"
+  integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slice-ansi@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-5.0.0.tgz"
+  integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==
+  dependencies:
+    ansi-styles "^6.0.0"
+    is-fullwidth-code-point "^4.0.0"
+
+sortablejs@^1.14.0:
+  version "1.15.2"
+  resolved "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.2.tgz"
+  integrity sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA==
+
+source-map-js@^1.0.2, source-map-js@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz"
+  integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
+
+source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz"
+  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+source-map@^0.7.3:
+  version "0.7.4"
+  resolved "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz"
+  integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==
+
+source-map@^0.7.4:
+  version "0.7.4"
+  resolved "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz"
+  integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==
+
+sourcemap-codec@^1.4.8:
+  version "1.4.8"
+  resolved "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz"
+  integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
+
+spdx-correct@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz"
+  integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==
+  dependencies:
+    spdx-expression-parse "^3.0.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz"
+  integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==
+
+spdx-expression-parse@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz"
+  integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+  dependencies:
+    spdx-exceptions "^2.1.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+  version "3.0.17"
+  resolved "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz"
+  integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==
+
+stackback@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.npmmirror.com/stackback/-/stackback-0.0.2.tgz"
+  integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==
+
+statuses@^1.3.1:
+  version "1.5.0"
+  resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz"
+  integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
+
+std-env@^3.3.1:
+  version "3.7.0"
+  resolved "https://registry.npmmirror.com/std-env/-/std-env-3.7.0.tgz"
+  integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==
+
+stream-http@2.8.2:
+  version "2.8.2"
+  resolved "https://registry.npmmirror.com/stream-http/-/stream-http-2.8.2.tgz"
+  integrity sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==
+  dependencies:
+    builtin-status-codes "^3.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.3.6"
+    to-arraybuffer "^1.0.0"
+    xtend "^4.0.0"
+
+stream-wormhole@^1.0.4:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/stream-wormhole/-/stream-wormhole-1.1.0.tgz"
+  integrity sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==
+
+string_decoder@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz"
+  integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+  dependencies:
+    safe-buffer "~5.1.0"
+
+"string-width-cjs@npm:string-width@^4.2.0":
+  version "4.2.3"
+  resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz"
+  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+  dependencies:
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.1"
+
+string-width@^4.1.0, string-width@^4.2.0:
+  version "4.2.3"
+  resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz"
+  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+  dependencies:
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.1"
+
+string-width@^4.2.3:
+  version "4.2.3"
+  resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz"
+  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+  dependencies:
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.1"
+
+string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2:
+  version "5.1.2"
+  resolved "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz"
+  integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
+  dependencies:
+    eastasianwidth "^0.2.0"
+    emoji-regex "^9.2.2"
+    strip-ansi "^7.0.1"
+
+string.prototype.padend@^3.0.0:
+  version "3.1.6"
+  resolved "https://registry.npmmirror.com/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz"
+  integrity sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==
+  dependencies:
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.2"
+    es-object-atoms "^1.0.0"
+
+string.prototype.trim@^1.2.9:
+  version "1.2.9"
+  resolved "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz"
+  integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==
+  dependencies:
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.0"
+    es-object-atoms "^1.0.0"
+
+string.prototype.trimend@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz"
+  integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==
+  dependencies:
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-object-atoms "^1.0.0"
+
+string.prototype.trimstart@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz"
+  integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
+  dependencies:
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-object-atoms "^1.0.0"
+
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz"
+  integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+  dependencies:
+    ansi-regex "^5.0.1"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz"
+  integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+  dependencies:
+    ansi-regex "^5.0.1"
+
+strip-ansi@^7.0.1:
+  version "7.1.0"
+  resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz"
+  integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
+  dependencies:
+    ansi-regex "^6.0.1"
+
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz"
+  integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+
+strip-json-comments@^3.1.1:
+  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==
+
+strip-literal@^1.0.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/strip-literal/-/strip-literal-1.3.0.tgz"
+  integrity sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==
+  dependencies:
+    acorn "^8.10.0"
+
+stylus@*, stylus@^0.59.0:
+  version "0.59.0"
+  resolved "https://registry.npmmirror.com/stylus/-/stylus-0.59.0.tgz"
+  integrity sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==
+  dependencies:
+    "@adobe/css-tools" "^4.0.1"
+    debug "^4.3.2"
+    glob "^7.1.6"
+    sax "~1.2.4"
+    source-map "^0.7.3"
+
+supports-color@^5.3.0:
+  version "5.5.0"
+  resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz"
+  integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+  dependencies:
+    has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+  version "7.2.0"
+  resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz"
+  integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+  dependencies:
+    has-flag "^4.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
+  integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+svg-tags@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz"
+  integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==
+
+symbol-tree@^3.2.4:
+  version "3.2.4"
+  resolved "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz"
+  integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
+text-table@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz"
+  integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+thenify-all@^1.0.0:
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz"
+  integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==
+  dependencies:
+    thenify ">= 3.1.0 < 4"
+
+"thenify@>= 3.1.0 < 4":
+  version "3.3.1"
+  resolved "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz"
+  integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==
+  dependencies:
+    any-promise "^1.0.0"
+
+through@~2.3:
+  version "2.3.8"
+  resolved "https://registry.npmmirror.com/through/-/through-2.3.8.tgz"
+  integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
+
+tinybench@^2.3.1:
+  version "2.6.0"
+  resolved "https://registry.npmmirror.com/tinybench/-/tinybench-2.6.0.tgz"
+  integrity sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==
+
+tinypool@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.npmmirror.com/tinypool/-/tinypool-0.4.0.tgz"
+  integrity sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==
+
+tinyspy@^1.0.2:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/tinyspy/-/tinyspy-1.1.1.tgz"
+  integrity sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==
+
+to-arraybuffer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz"
+  integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==
+
+to-fast-properties@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
+  integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-regex-range@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz"
+  integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+  dependencies:
+    is-number "^7.0.0"
+
+tough-cookie@^4.0.0, tough-cookie@^4.1.2:
+  version "4.1.3"
+  resolved "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.3.tgz"
+  integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==
+  dependencies:
+    psl "^1.1.33"
+    punycode "^2.1.1"
+    universalify "^0.2.0"
+    url-parse "^1.5.3"
+
+tr46@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/tr46/-/tr46-4.1.1.tgz"
+  integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==
+  dependencies:
+    punycode "^2.3.0"
+
+tr46@~0.0.3:
+  version "0.0.3"
+  resolved "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz"
+  integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+
+tslib@^1.8.1:
+  version "1.14.1"
+  resolved "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz"
+  integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@^2.1.0, tslib@^2.3.0, tslib@2.3.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz"
+  integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
+
+tsutils@^3.21.0:
+  version "3.21.0"
+  resolved "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz"
+  integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
+  dependencies:
+    tslib "^1.8.1"
+
+type-check@^0.4.0, type-check@~0.4.0:
+  version "0.4.0"
+  resolved "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz"
+  integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+  dependencies:
+    prelude-ls "^1.2.1"
+
+type-detect@^4.0.0, type-detect@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.npmmirror.com/type-detect/-/type-detect-4.0.8.tgz"
+  integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.20.2:
+  version "0.20.2"
+  resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz"
+  integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+typed-array-buffer@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz"
+  integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==
+  dependencies:
+    call-bind "^1.0.7"
+    es-errors "^1.3.0"
+    is-typed-array "^1.1.13"
+
+typed-array-byte-length@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz"
+  integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==
+  dependencies:
+    call-bind "^1.0.7"
+    for-each "^0.3.3"
+    gopd "^1.0.1"
+    has-proto "^1.0.3"
+    is-typed-array "^1.1.13"
+
+typed-array-byte-offset@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz"
+  integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==
+  dependencies:
+    available-typed-arrays "^1.0.7"
+    call-bind "^1.0.7"
+    for-each "^0.3.3"
+    gopd "^1.0.1"
+    has-proto "^1.0.3"
+    is-typed-array "^1.1.13"
+
+typed-array-length@^1.0.6:
+  version "1.0.6"
+  resolved "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.6.tgz"
+  integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==
+  dependencies:
+    call-bind "^1.0.7"
+    for-each "^0.3.3"
+    gopd "^1.0.1"
+    has-proto "^1.0.3"
+    is-typed-array "^1.1.13"
+    possible-typed-array-names "^1.0.0"
+
+typescript@*, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.4.4, typescript@~4.8.4:
+  version "4.8.4"
+  resolved "https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz"
+  integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==
+
+ufo@^1.3.2:
+  version "1.5.3"
+  resolved "https://registry.npmmirror.com/ufo/-/ufo-1.5.3.tgz"
+  integrity sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==
+
+unbox-primitive@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz"
+  integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+  dependencies:
+    call-bind "^1.0.2"
+    has-bigints "^1.0.2"
+    has-symbols "^1.0.3"
+    which-boxed-primitive "^1.0.2"
+
+undici-types@~5.26.4:
+  version "5.26.5"
+  resolved "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz"
+  integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
+unescape@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/unescape/-/unescape-1.0.1.tgz"
+  integrity sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==
+  dependencies:
+    extend-shallow "^2.0.1"
+
+universalify@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz"
+  integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
+
+update-browserslist-db@^1.0.13:
+  version "1.0.13"
+  resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz"
+  integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==
+  dependencies:
+    escalade "^3.1.1"
+    picocolors "^1.0.0"
+
+uri-js@^4.2.2:
+  version "4.4.1"
+  resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz"
+  integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+  dependencies:
+    punycode "^2.1.0"
+
+url-parse@^1.5.3:
+  version "1.5.10"
+  resolved "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz"
+  integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
+  dependencies:
+    querystringify "^2.1.1"
+    requires-port "^1.0.0"
+
+urllib@2.41.0:
+  version "2.41.0"
+  resolved "https://registry.npmmirror.com/urllib/-/urllib-2.41.0.tgz"
+  integrity sha512-pNXdxEv52L67jahLT+/7QE+Fup1y2Gc6EdmrAhQ6OpQIC2rl14oWwv9hvk1GXOZqEnJNwRXHABuwgPOs1CtL7g==
+  dependencies:
+    any-promise "^1.3.0"
+    content-type "^1.0.2"
+    debug "^2.6.9"
+    default-user-agent "^1.0.0"
+    digest-header "^1.0.0"
+    ee-first "~1.1.1"
+    formstream "^1.1.0"
+    humanize-ms "^1.2.0"
+    iconv-lite "^0.4.15"
+    ip "^1.1.5"
+    pump "^3.0.0"
+    qs "^6.4.0"
+    statuses "^1.3.1"
+    utility "^1.16.1"
+
+util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz"
+  integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+utility@^1.16.1, utility@^1.18.0:
+  version "1.18.0"
+  resolved "https://registry.npmmirror.com/utility/-/utility-1.18.0.tgz"
+  integrity sha512-PYxZDA+6QtvRvm//++aGdmKG/cI07jNwbROz0Ql+VzFV1+Z0Dy55NI4zZ7RHc9KKpBePNFwoErqIuqQv/cjiTA==
+  dependencies:
+    copy-to "^2.0.1"
+    escape-html "^1.0.3"
+    mkdirp "^0.5.1"
+    mz "^2.7.0"
+    unescape "^1.0.1"
+
+validate-npm-package-license@^3.0.1:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz"
+  integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+  dependencies:
+    spdx-correct "^3.0.0"
+    spdx-expression-parse "^3.0.0"
+
+vite-node@0.29.8:
+  version "0.29.8"
+  resolved "https://registry.npmmirror.com/vite-node/-/vite-node-0.29.8.tgz"
+  integrity sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==
+  dependencies:
+    cac "^6.7.14"
+    debug "^4.3.4"
+    mlly "^1.1.0"
+    pathe "^1.1.0"
+    picocolors "^1.0.0"
+    vite "^3.0.0 || ^4.0.0"
+
+vite-plugin-commonjs@^0.10.1:
+  version "0.10.1"
+  resolved "https://registry.npmmirror.com/vite-plugin-commonjs/-/vite-plugin-commonjs-0.10.1.tgz"
+  integrity sha512-taP8R9kYGlCW5OzkVR0UIWRCnG6rSxeWWuA7tnU5b9t5MniibOnDY219NhisTeDhJAeGT8cEnrhVWZ9A5yD+vg==
+  dependencies:
+    acorn "^8.8.2"
+    fast-glob "^3.2.12"
+    magic-string "^0.30.1"
+    vite-plugin-dynamic-import "^1.5.0"
+
+vite-plugin-dynamic-import@^1.5.0:
+  version "1.5.0"
+  resolved "https://registry.npmmirror.com/vite-plugin-dynamic-import/-/vite-plugin-dynamic-import-1.5.0.tgz"
+  integrity sha512-Qp85c+AVJmLa8MLni74U4BDiWpUeFNx7NJqbGZyR2XJOU7mgW0cb7nwlAMucFyM4arEd92Nfxp4j44xPi6Fu7g==
+  dependencies:
+    acorn "^8.8.2"
+    es-module-lexer "^1.2.1"
+    fast-glob "^3.2.12"
+    magic-string "^0.30.1"
+
+vite-plugin-require-transform@^1.0.21:
+  version "1.0.21"
+  resolved "https://registry.npmmirror.com/vite-plugin-require-transform/-/vite-plugin-require-transform-1.0.21.tgz"
+  integrity sha512-A3SrHhVg9tCW35O7E8kcuB71YTEdVd3EaM1zh6gbH4zxy4WzXSfcNf0UiWmaHHhr6wdFhiiAGdpR6S0SUxXkGQ==
+  dependencies:
+    "@babel/generator" "^7.22.5"
+    "@babel/parser" "^7.22.5"
+    "@babel/traverse" "^7.22.5"
+    "@babel/types" "^7.22.5"
+
+"vite@^3.0.0 || ^4.0.0", "vite@^4.0.0 || ^5.0.0", vite@^4.2.0:
+  version "4.5.3"
+  resolved "https://registry.npmmirror.com/vite/-/vite-4.5.3.tgz"
+  integrity sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==
+  dependencies:
+    esbuild "^0.18.10"
+    postcss "^8.4.27"
+    rollup "^3.27.1"
+  optionalDependencies:
+    fsevents "~2.3.2"
+
+vitest@^0.29.1:
+  version "0.29.8"
+  resolved "https://registry.npmmirror.com/vitest/-/vitest-0.29.8.tgz"
+  integrity sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==
+  dependencies:
+    "@types/chai" "^4.3.4"
+    "@types/chai-subset" "^1.3.3"
+    "@types/node" "*"
+    "@vitest/expect" "0.29.8"
+    "@vitest/runner" "0.29.8"
+    "@vitest/spy" "0.29.8"
+    "@vitest/utils" "0.29.8"
+    acorn "^8.8.1"
+    acorn-walk "^8.2.0"
+    cac "^6.7.14"
+    chai "^4.3.7"
+    debug "^4.3.4"
+    local-pkg "^0.4.2"
+    pathe "^1.1.0"
+    picocolors "^1.0.0"
+    source-map "^0.6.1"
+    std-env "^3.3.1"
+    strip-literal "^1.0.0"
+    tinybench "^2.3.1"
+    tinypool "^0.4.0"
+    tinyspy "^1.0.2"
+    vite "^3.0.0 || ^4.0.0"
+    vite-node "0.29.8"
+    why-is-node-running "^2.2.2"
+
+vue-component-type-helpers@^2.0.0:
+  version "2.0.7"
+  resolved "https://registry.npmmirror.com/vue-component-type-helpers/-/vue-component-type-helpers-2.0.7.tgz"
+  integrity sha512-7e12Evdll7JcTIocojgnCgwocX4WzIYStGClBQ+QuWPinZo/vQolv2EMq4a3lg16TKfwWafLimG77bxb56UauA==
+
+vue-demi@*:
+  version "0.14.7"
+  resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.7.tgz"
+  integrity sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==
+
+vue-demi@>=0.14.5:
+  version "0.14.7"
+  resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.7.tgz"
+  integrity sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==
+
+vue-draggable-next@^2.1.1:
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/vue-draggable-next/-/vue-draggable-next-2.2.1.tgz"
+  integrity sha512-EAMS1IRHF0kZO0o5PMOinsQsXIqsrKT1hKmbICxG3UEtn7zLFkLxlAtajcCcUTisNvQ6TtCB5COjD9a1raNADw==
+
+vue-eslint-parser@^9.1.1, vue-eslint-parser@^9.4.2:
+  version "9.4.2"
+  resolved "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz"
+  integrity sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==
+  dependencies:
+    debug "^4.3.4"
+    eslint-scope "^7.1.1"
+    eslint-visitor-keys "^3.3.0"
+    espree "^9.3.1"
+    esquery "^1.4.0"
+    lodash "^4.17.21"
+    semver "^7.3.6"
+
+vue-router@^4.1.6:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/vue-router/-/vue-router-4.3.0.tgz"
+  integrity sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ==
+  dependencies:
+    "@vue/devtools-api" "^6.5.1"
+
+vue-template-compiler@^2.7.14:
+  version "2.7.16"
+  resolved "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz"
+  integrity sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==
+  dependencies:
+    de-indent "^1.0.2"
+    he "^1.2.0"
+
+vue-tsc@^1.2.0:
+  version "1.8.27"
+  resolved "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.8.27.tgz"
+  integrity sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==
+  dependencies:
+    "@volar/typescript" "~1.11.1"
+    "@vue/language-core" "1.8.27"
+    semver "^7.5.4"
+
+"vue@^2.6.14 || ^3.3.0", vue@^3.0.0, "vue@^3.0.0-0 || ^2.6.0", vue@^3.2.0, vue@^3.2.2, vue@^3.2.25, vue@^3.2.47, vue@3.4.21:
+  version "3.4.21"
+  resolved "https://registry.npmmirror.com/vue/-/vue-3.4.21.tgz"
+  integrity sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==
+  dependencies:
+    "@vue/compiler-dom" "3.4.21"
+    "@vue/compiler-sfc" "3.4.21"
+    "@vue/runtime-dom" "3.4.21"
+    "@vue/server-renderer" "3.4.21"
+    "@vue/shared" "3.4.21"
+
+vuex@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/vuex/-/vuex-4.1.0.tgz"
+  integrity sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==
+  dependencies:
+    "@vue/devtools-api" "^6.0.0-beta.11"
+
+w3c-xmlserializer@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz"
+  integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==
+  dependencies:
+    xml-name-validator "^4.0.0"
+
+wangeditor@^4.7.15:
+  version "4.7.15"
+  resolved "https://registry.npmmirror.com/wangeditor/-/wangeditor-4.7.15.tgz"
+  integrity sha512-aPTdREd8BxXVyJ5MI+LU83FQ7u1EPd341iXIorRNYSOvoimNoZ4nPg+yn3FGbB93/owEa6buLw8wdhYnMCJQLg==
+  dependencies:
+    "@babel/runtime" "^7.11.2"
+    "@babel/runtime-corejs3" "^7.11.2"
+    tslib "^2.1.0"
+
+webidl-conversions@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz"
+  integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
+
+webidl-conversions@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz"
+  integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
+
+whatwg-encoding@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz"
+  integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==
+  dependencies:
+    iconv-lite "0.6.3"
+
+whatwg-mimetype@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz"
+  integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==
+
+whatwg-url@^12.0.0, whatwg-url@^12.0.1:
+  version "12.0.1"
+  resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-12.0.1.tgz"
+  integrity sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==
+  dependencies:
+    tr46 "^4.1.1"
+    webidl-conversions "^7.0.0"
+
+whatwg-url@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz"
+  integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
+  dependencies:
+    tr46 "~0.0.3"
+    webidl-conversions "^3.0.0"
+
+which-boxed-primitive@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz"
+  integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+  dependencies:
+    is-bigint "^1.0.1"
+    is-boolean-object "^1.1.0"
+    is-number-object "^1.0.4"
+    is-string "^1.0.5"
+    is-symbol "^1.0.3"
+
+which-typed-array@^1.1.14, which-typed-array@^1.1.15:
+  version "1.1.15"
+  resolved "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.15.tgz"
+  integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==
+  dependencies:
+    available-typed-arrays "^1.0.7"
+    call-bind "^1.0.7"
+    for-each "^0.3.3"
+    gopd "^1.0.1"
+    has-tostringtag "^1.0.2"
+
+which@^1.2.9:
+  version "1.3.1"
+  resolved "https://registry.npmmirror.com/which/-/which-1.3.1.tgz"
+  integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+  dependencies:
+    isexe "^2.0.0"
+
+which@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz"
+  integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+  dependencies:
+    isexe "^2.0.0"
+
+why-is-node-running@^2.2.2:
+  version "2.2.2"
+  resolved "https://registry.npmmirror.com/why-is-node-running/-/why-is-node-running-2.2.2.tgz"
+  integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==
+  dependencies:
+    siginfo "^2.0.0"
+    stackback "0.0.2"
+
+win-release@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/win-release/-/win-release-1.1.1.tgz"
+  integrity sha512-iCRnKVvGxOQdsKhcQId2PXV1vV3J/sDPXKA4Oe9+Eti2nb2ESEsYHRYls/UjoUW3bIc5ZDO8dTH50A/5iVN+bw==
+  dependencies:
+    semver "^5.0.1"
+
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
+  integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
+wrap-ansi@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
+  integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
+wrap-ansi@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz"
+  integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
+  dependencies:
+    ansi-styles "^6.1.0"
+    string-width "^5.0.1"
+    strip-ansi "^7.0.1"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz"
+  integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+ws@^7.4.5:
+  version "7.5.9"
+  resolved "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz"
+  integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==
+
+ws@^8.13.0:
+  version "8.16.0"
+  resolved "https://registry.npmmirror.com/ws/-/ws-8.16.0.tgz"
+  integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==
+
+xml-name-validator@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz"
+  integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==
+
+xml2js@^0.6.2:
+  version "0.6.2"
+  resolved "https://registry.npmmirror.com/xml2js/-/xml2js-0.6.2.tgz"
+  integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==
+  dependencies:
+    sax ">=0.6.0"
+    xmlbuilder "~11.0.0"
+
+xmlbuilder@~11.0.0:
+  version "11.0.1"
+  resolved "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz"
+  integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
+
+xmlchars@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz"
+  integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+
+xtend@^4.0.0:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz"
+  integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+y18n@^5.0.5:
+  version "5.0.8"
+  resolved "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz"
+  integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yallist@^3.0.2:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz"
+  integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz"
+  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@^21.1.1:
+  version "21.1.1"
+  resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz"
+  integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs@^17.5.1:
+  version "17.7.2"
+  resolved "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz"
+  integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+  dependencies:
+    cliui "^8.0.1"
+    escalade "^3.1.1"
+    get-caller-file "^2.0.5"
+    require-directory "^2.1.1"
+    string-width "^4.2.3"
+    y18n "^5.0.5"
+    yargs-parser "^21.1.1"
+
+yocto-queue@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz"
+  integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
+yocto-queue@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-1.0.0.tgz"
+  integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==
+
+zrender@5.5.0:
+  version "5.5.0"
+  resolved "https://registry.npmmirror.com/zrender/-/zrender-5.5.0.tgz"
+  integrity sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==
+  dependencies:
+    tslib "2.3.0"
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/ProjectEvaluation/widesea_wmsserver.metadata.v7.bin b/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/ProjectEvaluation/widesea_wmsserver.metadata.v7.bin
new file mode 100644
index 0000000..d8957b0
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/ProjectEvaluation/widesea_wmsserver.metadata.v7.bin
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/ProjectEvaluation/widesea_wmsserver.projects.v7.bin b/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/ProjectEvaluation/widesea_wmsserver.projects.v7.bin
new file mode 100644
index 0000000..e8629af
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/ProjectEvaluation/widesea_wmsserver.projects.v7.bin
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/DesignTimeBuild/.dtbcache.v2 b/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/DesignTimeBuild/.dtbcache.v2
new file mode 100644
index 0000000..b17ba3f
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/DesignTimeBuild/.dtbcache.v2
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/.futdcache.v2 b/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/.futdcache.v2
new file mode 100644
index 0000000..f95a1a6
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/.futdcache.v2
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/.suo b/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/.suo
new file mode 100644
index 0000000..966bd14
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/.suo
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/fileList.bin b/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/fileList.bin
new file mode 100644
index 0000000..5f43bb0
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/v17/fileList.bin
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/LogLibrary/LogLibrary.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/LogLibrary/LogLibrary.csproj
new file mode 100644
index 0000000..552ea92
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/LogLibrary/LogLibrary.csproj
@@ -0,0 +1,47 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <OutputType>Library</OutputType>
+    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <Configurations>Debug;Release;Dev</Configurations>
+    <Platforms>AnyCPU;x86</Platforms>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'">
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <DebugType>embedded</DebugType>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Dev|x86'">
+    <OutputPath>bin\x86\Debug\</OutputPath>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'">
+    <OutputPath>bin\x86\Release\</OutputPath>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <DebugType>embedded</DebugType>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Dev|AnyCPU'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Dev\</OutputPath>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <DebugType>embedded</DebugType>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Dev|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\Dev\</OutputPath>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Dev|x86'">
+    <DebugSymbols>true</DebugSymbols>
+    <OutputPath>bin\x86\Dev\</OutputPath>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+    <DebugType>embedded</DebugType>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
+    <DebugType>embedded</DebugType>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
+    <DebugType>embedded</DebugType>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_BusinessServices/WIDESEA_BusinessServices.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_BusinessServices/WIDESEA_BusinessServices.csproj
new file mode 100644
index 0000000..a900279
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_BusinessServices/WIDESEA_BusinessServices.csproj
@@ -0,0 +1,20 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_BusinessesRepository\WIDESEA_BusinessesRepository.csproj" />
+    <ProjectReference Include="..\WIDESEA_Core\WIDESEA_Core.csproj" />
+    <ProjectReference Include="..\WIDESEA_IBusinessesRepository\WIDESEA_IBusinessesRepository.csproj" />
+    <ProjectReference Include="..\WIDESEA_IBusinessServices\WIDESEA_IBusinessServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_IStorageBasicService\WIDESEA_IStorageBasicServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_IStorageTaskService\WIDESEA_IStorageTaskServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_Model\WIDESEA_Model.csproj" />
+    <ProjectReference Include="..\WIDESEA_Services\WIDESEA_Services.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_BusinessesRepository/WIDESEA_BusinessesRepository.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_BusinessesRepository/WIDESEA_BusinessesRepository.csproj
new file mode 100644
index 0000000..42aa7da
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_BusinessesRepository/WIDESEA_BusinessesRepository.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_IBusinessesRepository\WIDESEA_IBusinessesRepository.csproj" />
+    <ProjectReference Include="..\WIDESEA_Model\WIDESEA_Model.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Common/WIDESEA_Common.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Common/WIDESEA_Common.csproj
new file mode 100644
index 0000000..d9b9bc4
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Common/WIDESEA_Common.csproj
@@ -0,0 +1,23 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Compile Remove="Location\**" />
+    <EmbeddedResource Remove="Location\**" />
+    <None Remove="Location\**" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\LogLibrary\LogLibrary.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Core/WIDESEA_Core.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Core/WIDESEA_Core.csproj
new file mode 100644
index 0000000..ebc0ae3
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Core/WIDESEA_Core.csproj
@@ -0,0 +1,41 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+    <Version>1.0.1</Version>
+    <Authors>test</Authors>
+    <Description>dddddddddddddddddddddddddddddddddddd</Description>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Autofac" Version="8.0.0" />
+    <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="9.0.0" />
+    <PackageReference Include="Autofac.Extras.DynamicProxy" Version="7.1.0" />
+    <PackageReference Include="AutoMapper" Version="13.0.1" />
+    <PackageReference Include="Furion.Extras.ObjectMapper.Mapster" Version="4.9.5.8" />
+    <PackageReference Include="log4net" Version="2.0.17" />
+    <PackageReference Include="Magicodes.IE.EPPlus" Version="2.7.5.2" />
+    <PackageReference Include="Magicodes.IE.Excel" Version="2.7.5.2" />
+    <PackageReference Include="MailKit" Version="4.7.1.1" />
+    <PackageReference Include="Masuit.Tools.Core" Version="2024.5.6" />
+    <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.29" />
+    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
+    <PackageReference Include="MiniProfiler.AspNetCore.Mvc" Version="4.3.8" />
+    <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
+    <PackageReference Include="OfficeOpenXml.Core.ExcelPackage" Version="1.0.0" />
+    <PackageReference Include="SkiaSharp" Version="2.88.8" />
+    <PackageReference Include="SqlSugarCore" Version="5.1.4.152" />
+    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.7.0" />
+    <PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="7.0.5" />
+    <PackageReference Include="Swashbuckle.AspNetCore.Newtonsoft" Version="6.5.0" />
+    <PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Folder Include="Attribute\" />
+    <Folder Include="ServiceExtensions\" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/WIDESEA_DTO.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/WIDESEA_DTO.csproj
new file mode 100644
index 0000000..3c9bb11
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/WIDESEA_DTO.csproj
@@ -0,0 +1,13 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_Model\WIDESEA_Model.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IBusinessServices/WIDESEA_IBusinessServices.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IBusinessServices/WIDESEA_IBusinessServices.csproj
new file mode 100644
index 0000000..2bd4746
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IBusinessServices/WIDESEA_IBusinessServices.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_BusinessesRepository\WIDESEA_BusinessesRepository.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IBusinessesRepository/WIDESEA_IBusinessesRepository.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IBusinessesRepository/WIDESEA_IBusinessesRepository.csproj
new file mode 100644
index 0000000..17d93c8
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IBusinessesRepository/WIDESEA_IBusinessesRepository.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_Core\WIDESEA_Core.csproj" />
+    <ProjectReference Include="..\WIDESEA_Model\WIDESEA_Model.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IRepository/WIDESEA_IRepository.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IRepository/WIDESEA_IRepository.csproj
new file mode 100644
index 0000000..a70161f
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IRepository/WIDESEA_IRepository.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_DTO\WIDESEA_DTO.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IServices/WIDESEA_IServices.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IServices/WIDESEA_IServices.csproj
new file mode 100644
index 0000000..1867b89
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IServices/WIDESEA_IServices.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_Repository\WIDESEA_Repository.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStoragIntegrationServices/WIDESEA_IStoragIntegrationServices.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStoragIntegrationServices/WIDESEA_IStoragIntegrationServices.csproj
new file mode 100644
index 0000000..a70161f
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStoragIntegrationServices/WIDESEA_IStoragIntegrationServices.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_DTO\WIDESEA_DTO.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageBasicRepository/WIDESEA_IStorageBasicRepository.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageBasicRepository/WIDESEA_IStorageBasicRepository.csproj
new file mode 100644
index 0000000..a70161f
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageBasicRepository/WIDESEA_IStorageBasicRepository.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_DTO\WIDESEA_DTO.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageBasicService/WIDESEA_IStorageBasicServices.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageBasicService/WIDESEA_IStorageBasicServices.csproj
new file mode 100644
index 0000000..e8322b3
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageBasicService/WIDESEA_IStorageBasicServices.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_StorageBasicRepository\WIDESEA_StorageBasicRepository.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageOutOrderRepository/WIDESEA_IStorageOutOrderRepository.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageOutOrderRepository/WIDESEA_IStorageOutOrderRepository.csproj
new file mode 100644
index 0000000..8b9ba57
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageOutOrderRepository/WIDESEA_IStorageOutOrderRepository.csproj
@@ -0,0 +1,13 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_DTO\WIDESEA_DTO.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageOutOrderService/WIDESEA_IStorageOutOrderServices.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageOutOrderService/WIDESEA_IStorageOutOrderServices.csproj
new file mode 100644
index 0000000..fd4d5b0
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageOutOrderService/WIDESEA_IStorageOutOrderServices.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_StorageOutOrderRepository\WIDESEA_StorageOutOrderRepository.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageTaskRepository/WIDESEA_IStorageTaskRepository.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageTaskRepository/WIDESEA_IStorageTaskRepository.csproj
new file mode 100644
index 0000000..a70161f
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageTaskRepository/WIDESEA_IStorageTaskRepository.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_DTO\WIDESEA_DTO.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageTaskService/WIDESEA_IStorageTaskServices.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageTaskService/WIDESEA_IStorageTaskServices.csproj
new file mode 100644
index 0000000..ceba40d
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStorageTaskService/WIDESEA_IStorageTaskServices.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_StorageTaskRepository\WIDESEA_StorageTaskRepository.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Model/WIDESEA_Model.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Model/WIDESEA_Model.csproj
new file mode 100644
index 0000000..30ce2d7
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Model/WIDESEA_Model.csproj
@@ -0,0 +1,22 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="System.Text.RegularExpressions" Version="4.3.1" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_Common\WIDESEA_Common.csproj" />
+    <ProjectReference Include="..\WIDESEA_Core\WIDESEA_Core.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Folder Include="Models\Inbound\" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Repository/WIDESEA_Repository.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Repository/WIDESEA_Repository.csproj
new file mode 100644
index 0000000..3311fdb
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Repository/WIDESEA_Repository.csproj
@@ -0,0 +1,17 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="AutoMapper" Version="13.0.1" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_IRepository\WIDESEA_IRepository.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Services/WIDESEA_Services.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Services/WIDESEA_Services.csproj
new file mode 100644
index 0000000..4944b62
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Services/WIDESEA_Services.csproj
@@ -0,0 +1,24 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
+    <WarningLevel>0</WarningLevel>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
+    <WarningLevel>0</WarningLevel>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\LogLibrary\LogLibrary.csproj" />
+    <ProjectReference Include="..\WIDESEA_IBusinessesRepository\WIDESEA_IBusinessesRepository.csproj" />
+    <ProjectReference Include="..\WIDESEA_IBusinessServices\WIDESEA_IBusinessServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_IServices\WIDESEA_IServices.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/WIDESEA_StoragIntegrationServices.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/WIDESEA_StoragIntegrationServices.csproj
new file mode 100644
index 0000000..0c382c9
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/WIDESEA_StoragIntegrationServices.csproj
@@ -0,0 +1,17 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\LogLibrary\LogLibrary.csproj" />
+    <ProjectReference Include="..\WIDESEA_Common\WIDESEA_Common.csproj" />
+    <ProjectReference Include="..\WIDESEA_IStoragIntegrationServices\WIDESEA_IStoragIntegrationServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_Services\WIDESEA_Services.csproj" />
+    <ProjectReference Include="..\WIDESEA_StorageBasicServices\WIDESEA_StorageBasicServices.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicRepository/WIDESEA_StorageBasicRepository.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicRepository/WIDESEA_StorageBasicRepository.csproj
new file mode 100644
index 0000000..cc6dc03
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicRepository/WIDESEA_StorageBasicRepository.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_IStorageBasicRepository\WIDESEA_IStorageBasicRepository.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicServices/WIDESEA_StorageBasicServices.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicServices/WIDESEA_StorageBasicServices.csproj
new file mode 100644
index 0000000..973ce58
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageBasicServices/WIDESEA_StorageBasicServices.csproj
@@ -0,0 +1,26 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
+    <NoWarn>1701;1702;8602;8629;8603;8604;8601;</NoWarn>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
+    <NoWarn>1701;1702;8602;8629;8603;8604;8601;</NoWarn>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_IBusinessServices\WIDESEA_IBusinessServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_IServices\WIDESEA_IServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_IStorageBasicService\WIDESEA_IStorageBasicServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_IStorageOutOrderService\WIDESEA_IStorageOutOrderServices.csproj" />
+    <ProjectReference Include="..\LogLibrary\LogLibrary.csproj" />
+    <ProjectReference Include="..\WIDESEA_IStorageTaskService\WIDESEA_IStorageTaskServices.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderRepository/WIDESEA_StorageOutOrderRepository.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderRepository/WIDESEA_StorageOutOrderRepository.csproj
new file mode 100644
index 0000000..3b3b363
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderRepository/WIDESEA_StorageOutOrderRepository.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_IStorageOutOrderRepository\WIDESEA_IStorageOutOrderRepository.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderServices/WIDESEA_StorageOutOrderServices.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderServices/WIDESEA_StorageOutOrderServices.csproj
new file mode 100644
index 0000000..4d460a6
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageOutOrderServices/WIDESEA_StorageOutOrderServices.csproj
@@ -0,0 +1,25 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
+    <NoWarn>1701;1702;8602;8629;8603;8604;8601;</NoWarn>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
+    <NoWarn>1701;1702;8602;8629;8603;8604;8601;</NoWarn>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\LogLibrary\LogLibrary.csproj" />
+    <ProjectReference Include="..\WIDESEA_IBusinessServices\WIDESEA_IBusinessServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_IStorageBasicService\WIDESEA_IStorageBasicServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_IStorageOutOrderService\WIDESEA_IStorageOutOrderServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_IStorageTaskService\WIDESEA_IStorageTaskServices.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskRepository/WIDESEA_StorageTaskRepository.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskRepository/WIDESEA_StorageTaskRepository.csproj
new file mode 100644
index 0000000..20acbba
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskRepository/WIDESEA_StorageTaskRepository.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\WIDESEA_IStorageTaskRepository\WIDESEA_IStorageTaskRepository.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/WIDESEA_StorageTaskServices.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/WIDESEA_StorageTaskServices.csproj
new file mode 100644
index 0000000..8b2f84d
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/WIDESEA_StorageTaskServices.csproj
@@ -0,0 +1,26 @@
+锘�<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
+    <NoWarn>1701;1702;8602;8629;8603;8604;8601;</NoWarn>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
+    <NoWarn>1701;1702;8602;8629;8603;8604;8601;</NoWarn>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\LogLibrary\LogLibrary.csproj" />
+    <ProjectReference Include="..\WIDESEA_IBusinessServices\WIDESEA_IBusinessServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_IStorageBasicService\WIDESEA_IStorageBasicServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_IStorageOutOrderService\WIDESEA_IStorageOutOrderServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_IStorageTaskService\WIDESEA_IStorageTaskServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_StoragIntegrationServices\WIDESEA_StoragIntegrationServices.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Tasks/WIDESEA_Tasks.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Tasks/WIDESEA_Tasks.csproj
new file mode 100644
index 0000000..132c02c
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Tasks/WIDESEA_Tasks.csproj
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer.sln b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer.sln
new file mode 100644
index 0000000..bb25daf
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer.sln
@@ -0,0 +1,474 @@
+锘�
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.9.34701.34
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_WMSServer", "WIDESEA_WMSServer\WIDESEA_WMSServer.csproj", "{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_Core", "WIDESEA_Core\WIDESEA_Core.csproj", "{111BD7AA-9749-4506-9772-79F9EF14754C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_Common", "WIDESEA_Common\WIDESEA_Common.csproj", "{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_Model", "WIDESEA_Model\WIDESEA_Model.csproj", "{00CE9885-9F24-4B6C-A7E8-0DE8C9ED7128}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_IRepository", "WIDESEA_IRepository\WIDESEA_IRepository.csproj", "{B5C7DC02-077C-4255-A369-600D033A4C23}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_Repository", "WIDESEA_Repository\WIDESEA_Repository.csproj", "{41C50E65-7C73-4BD0-9773-2A74F1587EE2}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_IServices", "WIDESEA_IServices\WIDESEA_IServices.csproj", "{1C8F84A9-7812-4435-B833-FF26A9A3DD4C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_Services", "WIDESEA_Services\WIDESEA_Services.csproj", "{F512AFDB-D45D-4979-BC8C-0BA7FBE8F583}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_Tasks", "WIDESEA_Tasks\WIDESEA_Tasks.csproj", "{3BDEBC2A-BDE6-439B-B0E4-DB8AC7709FF1}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Service", "Service", "{60DE2920-37C6-4C2B-A053-6B1B2DAF047A}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Repository", "Repository", "{56D014A3-EB8D-4EF5-A751-3BAA084519D0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_DTO", "WIDESEA_DTO\WIDESEA_DTO.csproj", "{929DF936-042C-4EEC-8722-A831FC2F0AEA}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LogLibrary", "LogLibrary\LogLibrary.csproj", "{992DA9CB-143C-426B-B27D-E4DA3B863A99}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_IBusinessesRepository", "WIDESEA_IBusinessesRepository\WIDESEA_IBusinessesRepository.csproj", "{FBC88231-BC8E-4AA8-BD60-0A13FE463EF1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_BusinessesRepository", "WIDESEA_BusinessesRepository\WIDESEA_BusinessesRepository.csproj", "{3DF4C096-7431-4484-BE38-28FAD8CA1540}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_IBusinessServices", "WIDESEA_IBusinessServices\WIDESEA_IBusinessServices.csproj", "{1E26EB6C-4AD1-4140-83FE-777218EE9DF5}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_BusinessServices", "WIDESEA_BusinessServices\WIDESEA_BusinessServices.csproj", "{BA78CC65-6D17-4C76-8285-DC6B6165DA17}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_IStorageOutOrderRepository", "WIDESEA_IStorageOutOrderRepository\WIDESEA_IStorageOutOrderRepository.csproj", "{9AA688B0-B3B1-49B9-A6E0-060E266E6EAE}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_StorageOutOrderRepository", "WIDESEA_StorageOutOrderRepository\WIDESEA_StorageOutOrderRepository.csproj", "{ABFDA4F8-921E-46D6-8F13-2588759B7F59}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IService", "IService", "{A73C1AFF-FF92-4825-B607-2E908077EBA4}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Service", "Service", "{8498AA9D-CDC4-4FD2-81AE-DE6AD78F75ED}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "IRepository", "IRepository", "{B131DEBD-A555-490B-B448-46425298E427}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Repository", "Repository", "{798C4C07-A3B2-47AD-A69C-922D5217B5CA}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_IStorageOutOrderServices", "WIDESEA_IStorageOutOrderService\WIDESEA_IStorageOutOrderServices.csproj", "{2BB1F129-E90F-40B2-9487-FEA102EE48C4}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_StorageOutOrderServices", "WIDESEA_StorageOutOrderServices\WIDESEA_StorageOutOrderServices.csproj", "{B26D44F5-C265-4A24-BC9F-2261075A6F69}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_IStorageBasicRepository", "WIDESEA_IStorageBasicRepository\WIDESEA_IStorageBasicRepository.csproj", "{6EED8D59-8AF2-4B2E-81E9-92E2547F1B2D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_IStorageTaskRepository", "WIDESEA_IStorageTaskRepository\WIDESEA_IStorageTaskRepository.csproj", "{CCF1C1DE-C80D-4476-B35F-1BF068E4185E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_StorageBasicRepository", "WIDESEA_StorageBasicRepository\WIDESEA_StorageBasicRepository.csproj", "{40B47F57-BBC7-42D5-ABE4-11F0E469DF30}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_StorageTaskRepository", "WIDESEA_StorageTaskRepository\WIDESEA_StorageTaskRepository.csproj", "{1614316C-827D-4C2C-B9D3-A62E25AF1827}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_IStorageBasicServices", "WIDESEA_IStorageBasicService\WIDESEA_IStorageBasicServices.csproj", "{B8B1C352-0398-4A54-B202-D774D48367EB}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_IStorageTaskServices", "WIDESEA_IStorageTaskService\WIDESEA_IStorageTaskServices.csproj", "{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_StorageBasicServices", "WIDESEA_StorageBasicServices\WIDESEA_StorageBasicServices.csproj", "{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WIDESEA_StorageTaskServices", "WIDESEA_StorageTaskServices\WIDESEA_StorageTaskServices.csproj", "{9912BD12-4CF7-4A91-8203-47C9C125004C}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{9BA96018-EF8A-4D84-8E72-DA697FA5EAF8}"
+	ProjectSection(SolutionItems) = preProject
+		.editorconfig = .editorconfig
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WIDESEA_StoragIntegrationServices", "WIDESEA_StoragIntegrationServices\WIDESEA_StoragIntegrationServices.csproj", "{55326F38-372A-4606-B7FB-8C01BBAEC4FC}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WIDESEA_IStoragIntegrationServices", "WIDESEA_IStoragIntegrationServices\WIDESEA_IStoragIntegrationServices.csproj", "{94D572FA-810E-4897-B673-AF988FD4019E}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Debug|x86 = Debug|x86
+		Dev|Any CPU = Dev|Any CPU
+		Dev|x86 = Dev|x86
+		Release|Any CPU = Release|Any CPU
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}.Debug|x86.Build.0 = Debug|Any CPU
+		{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}.Dev|x86.Build.0 = Debug|Any CPU
+		{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}.Release|x86.ActiveCfg = Release|Any CPU
+		{D81A65B5-47D1-40C1-8FDE-7D24FF003F51}.Release|x86.Build.0 = Release|Any CPU
+		{111BD7AA-9749-4506-9772-79F9EF14754C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{111BD7AA-9749-4506-9772-79F9EF14754C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{111BD7AA-9749-4506-9772-79F9EF14754C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{111BD7AA-9749-4506-9772-79F9EF14754C}.Debug|x86.Build.0 = Debug|Any CPU
+		{111BD7AA-9749-4506-9772-79F9EF14754C}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{111BD7AA-9749-4506-9772-79F9EF14754C}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{111BD7AA-9749-4506-9772-79F9EF14754C}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{111BD7AA-9749-4506-9772-79F9EF14754C}.Dev|x86.Build.0 = Debug|Any CPU
+		{111BD7AA-9749-4506-9772-79F9EF14754C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{111BD7AA-9749-4506-9772-79F9EF14754C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{111BD7AA-9749-4506-9772-79F9EF14754C}.Release|x86.ActiveCfg = Release|Any CPU
+		{111BD7AA-9749-4506-9772-79F9EF14754C}.Release|x86.Build.0 = Release|Any CPU
+		{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}.Debug|x86.Build.0 = Debug|Any CPU
+		{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}.Dev|x86.Build.0 = Debug|Any CPU
+		{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}.Release|x86.ActiveCfg = Release|Any CPU
+		{AF8F3D65-1D75-4B8F-AFD9-4150E591C44D}.Release|x86.Build.0 = Release|Any CPU
+		{00CE9885-9F24-4B6C-A7E8-0DE8C9ED7128}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{00CE9885-9F24-4B6C-A7E8-0DE8C9ED7128}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{00CE9885-9F24-4B6C-A7E8-0DE8C9ED7128}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{00CE9885-9F24-4B6C-A7E8-0DE8C9ED7128}.Debug|x86.Build.0 = Debug|Any CPU
+		{00CE9885-9F24-4B6C-A7E8-0DE8C9ED7128}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{00CE9885-9F24-4B6C-A7E8-0DE8C9ED7128}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{00CE9885-9F24-4B6C-A7E8-0DE8C9ED7128}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{00CE9885-9F24-4B6C-A7E8-0DE8C9ED7128}.Dev|x86.Build.0 = Debug|Any CPU
+		{00CE9885-9F24-4B6C-A7E8-0DE8C9ED7128}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{00CE9885-9F24-4B6C-A7E8-0DE8C9ED7128}.Release|Any CPU.Build.0 = Release|Any CPU
+		{00CE9885-9F24-4B6C-A7E8-0DE8C9ED7128}.Release|x86.ActiveCfg = Release|Any CPU
+		{00CE9885-9F24-4B6C-A7E8-0DE8C9ED7128}.Release|x86.Build.0 = Release|Any CPU
+		{B5C7DC02-077C-4255-A369-600D033A4C23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B5C7DC02-077C-4255-A369-600D033A4C23}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B5C7DC02-077C-4255-A369-600D033A4C23}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{B5C7DC02-077C-4255-A369-600D033A4C23}.Debug|x86.Build.0 = Debug|Any CPU
+		{B5C7DC02-077C-4255-A369-600D033A4C23}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{B5C7DC02-077C-4255-A369-600D033A4C23}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{B5C7DC02-077C-4255-A369-600D033A4C23}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{B5C7DC02-077C-4255-A369-600D033A4C23}.Dev|x86.Build.0 = Debug|Any CPU
+		{B5C7DC02-077C-4255-A369-600D033A4C23}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B5C7DC02-077C-4255-A369-600D033A4C23}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B5C7DC02-077C-4255-A369-600D033A4C23}.Release|x86.ActiveCfg = Release|Any CPU
+		{B5C7DC02-077C-4255-A369-600D033A4C23}.Release|x86.Build.0 = Release|Any CPU
+		{41C50E65-7C73-4BD0-9773-2A74F1587EE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{41C50E65-7C73-4BD0-9773-2A74F1587EE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{41C50E65-7C73-4BD0-9773-2A74F1587EE2}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{41C50E65-7C73-4BD0-9773-2A74F1587EE2}.Debug|x86.Build.0 = Debug|Any CPU
+		{41C50E65-7C73-4BD0-9773-2A74F1587EE2}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{41C50E65-7C73-4BD0-9773-2A74F1587EE2}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{41C50E65-7C73-4BD0-9773-2A74F1587EE2}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{41C50E65-7C73-4BD0-9773-2A74F1587EE2}.Dev|x86.Build.0 = Debug|Any CPU
+		{41C50E65-7C73-4BD0-9773-2A74F1587EE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{41C50E65-7C73-4BD0-9773-2A74F1587EE2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{41C50E65-7C73-4BD0-9773-2A74F1587EE2}.Release|x86.ActiveCfg = Release|Any CPU
+		{41C50E65-7C73-4BD0-9773-2A74F1587EE2}.Release|x86.Build.0 = Release|Any CPU
+		{1C8F84A9-7812-4435-B833-FF26A9A3DD4C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1C8F84A9-7812-4435-B833-FF26A9A3DD4C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1C8F84A9-7812-4435-B833-FF26A9A3DD4C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{1C8F84A9-7812-4435-B833-FF26A9A3DD4C}.Debug|x86.Build.0 = Debug|Any CPU
+		{1C8F84A9-7812-4435-B833-FF26A9A3DD4C}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{1C8F84A9-7812-4435-B833-FF26A9A3DD4C}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{1C8F84A9-7812-4435-B833-FF26A9A3DD4C}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{1C8F84A9-7812-4435-B833-FF26A9A3DD4C}.Dev|x86.Build.0 = Debug|Any CPU
+		{1C8F84A9-7812-4435-B833-FF26A9A3DD4C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1C8F84A9-7812-4435-B833-FF26A9A3DD4C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1C8F84A9-7812-4435-B833-FF26A9A3DD4C}.Release|x86.ActiveCfg = Release|Any CPU
+		{1C8F84A9-7812-4435-B833-FF26A9A3DD4C}.Release|x86.Build.0 = Release|Any CPU
+		{F512AFDB-D45D-4979-BC8C-0BA7FBE8F583}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{F512AFDB-D45D-4979-BC8C-0BA7FBE8F583}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{F512AFDB-D45D-4979-BC8C-0BA7FBE8F583}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{F512AFDB-D45D-4979-BC8C-0BA7FBE8F583}.Debug|x86.Build.0 = Debug|Any CPU
+		{F512AFDB-D45D-4979-BC8C-0BA7FBE8F583}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{F512AFDB-D45D-4979-BC8C-0BA7FBE8F583}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{F512AFDB-D45D-4979-BC8C-0BA7FBE8F583}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{F512AFDB-D45D-4979-BC8C-0BA7FBE8F583}.Dev|x86.Build.0 = Debug|Any CPU
+		{F512AFDB-D45D-4979-BC8C-0BA7FBE8F583}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{F512AFDB-D45D-4979-BC8C-0BA7FBE8F583}.Release|Any CPU.Build.0 = Release|Any CPU
+		{F512AFDB-D45D-4979-BC8C-0BA7FBE8F583}.Release|x86.ActiveCfg = Release|Any CPU
+		{F512AFDB-D45D-4979-BC8C-0BA7FBE8F583}.Release|x86.Build.0 = Release|Any CPU
+		{3BDEBC2A-BDE6-439B-B0E4-DB8AC7709FF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3BDEBC2A-BDE6-439B-B0E4-DB8AC7709FF1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3BDEBC2A-BDE6-439B-B0E4-DB8AC7709FF1}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{3BDEBC2A-BDE6-439B-B0E4-DB8AC7709FF1}.Debug|x86.Build.0 = Debug|Any CPU
+		{3BDEBC2A-BDE6-439B-B0E4-DB8AC7709FF1}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{3BDEBC2A-BDE6-439B-B0E4-DB8AC7709FF1}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{3BDEBC2A-BDE6-439B-B0E4-DB8AC7709FF1}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{3BDEBC2A-BDE6-439B-B0E4-DB8AC7709FF1}.Dev|x86.Build.0 = Debug|Any CPU
+		{3BDEBC2A-BDE6-439B-B0E4-DB8AC7709FF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3BDEBC2A-BDE6-439B-B0E4-DB8AC7709FF1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3BDEBC2A-BDE6-439B-B0E4-DB8AC7709FF1}.Release|x86.ActiveCfg = Release|Any CPU
+		{3BDEBC2A-BDE6-439B-B0E4-DB8AC7709FF1}.Release|x86.Build.0 = Release|Any CPU
+		{929DF936-042C-4EEC-8722-A831FC2F0AEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{929DF936-042C-4EEC-8722-A831FC2F0AEA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{929DF936-042C-4EEC-8722-A831FC2F0AEA}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{929DF936-042C-4EEC-8722-A831FC2F0AEA}.Debug|x86.Build.0 = Debug|Any CPU
+		{929DF936-042C-4EEC-8722-A831FC2F0AEA}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{929DF936-042C-4EEC-8722-A831FC2F0AEA}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{929DF936-042C-4EEC-8722-A831FC2F0AEA}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{929DF936-042C-4EEC-8722-A831FC2F0AEA}.Dev|x86.Build.0 = Debug|Any CPU
+		{929DF936-042C-4EEC-8722-A831FC2F0AEA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{929DF936-042C-4EEC-8722-A831FC2F0AEA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{929DF936-042C-4EEC-8722-A831FC2F0AEA}.Release|x86.ActiveCfg = Release|Any CPU
+		{929DF936-042C-4EEC-8722-A831FC2F0AEA}.Release|x86.Build.0 = Release|Any CPU
+		{992DA9CB-143C-426B-B27D-E4DA3B863A99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{992DA9CB-143C-426B-B27D-E4DA3B863A99}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{992DA9CB-143C-426B-B27D-E4DA3B863A99}.Debug|x86.ActiveCfg = Debug|x86
+		{992DA9CB-143C-426B-B27D-E4DA3B863A99}.Debug|x86.Build.0 = Debug|x86
+		{992DA9CB-143C-426B-B27D-E4DA3B863A99}.Dev|Any CPU.ActiveCfg = Dev|Any CPU
+		{992DA9CB-143C-426B-B27D-E4DA3B863A99}.Dev|Any CPU.Build.0 = Dev|Any CPU
+		{992DA9CB-143C-426B-B27D-E4DA3B863A99}.Dev|x86.ActiveCfg = Dev|x86
+		{992DA9CB-143C-426B-B27D-E4DA3B863A99}.Dev|x86.Build.0 = Dev|x86
+		{992DA9CB-143C-426B-B27D-E4DA3B863A99}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{992DA9CB-143C-426B-B27D-E4DA3B863A99}.Release|Any CPU.Build.0 = Release|Any CPU
+		{992DA9CB-143C-426B-B27D-E4DA3B863A99}.Release|x86.ActiveCfg = Release|x86
+		{992DA9CB-143C-426B-B27D-E4DA3B863A99}.Release|x86.Build.0 = Release|x86
+		{FBC88231-BC8E-4AA8-BD60-0A13FE463EF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{FBC88231-BC8E-4AA8-BD60-0A13FE463EF1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{FBC88231-BC8E-4AA8-BD60-0A13FE463EF1}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{FBC88231-BC8E-4AA8-BD60-0A13FE463EF1}.Debug|x86.Build.0 = Debug|Any CPU
+		{FBC88231-BC8E-4AA8-BD60-0A13FE463EF1}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{FBC88231-BC8E-4AA8-BD60-0A13FE463EF1}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{FBC88231-BC8E-4AA8-BD60-0A13FE463EF1}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{FBC88231-BC8E-4AA8-BD60-0A13FE463EF1}.Dev|x86.Build.0 = Debug|Any CPU
+		{FBC88231-BC8E-4AA8-BD60-0A13FE463EF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{FBC88231-BC8E-4AA8-BD60-0A13FE463EF1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{FBC88231-BC8E-4AA8-BD60-0A13FE463EF1}.Release|x86.ActiveCfg = Release|Any CPU
+		{FBC88231-BC8E-4AA8-BD60-0A13FE463EF1}.Release|x86.Build.0 = Release|Any CPU
+		{3DF4C096-7431-4484-BE38-28FAD8CA1540}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{3DF4C096-7431-4484-BE38-28FAD8CA1540}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{3DF4C096-7431-4484-BE38-28FAD8CA1540}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{3DF4C096-7431-4484-BE38-28FAD8CA1540}.Debug|x86.Build.0 = Debug|Any CPU
+		{3DF4C096-7431-4484-BE38-28FAD8CA1540}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{3DF4C096-7431-4484-BE38-28FAD8CA1540}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{3DF4C096-7431-4484-BE38-28FAD8CA1540}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{3DF4C096-7431-4484-BE38-28FAD8CA1540}.Dev|x86.Build.0 = Debug|Any CPU
+		{3DF4C096-7431-4484-BE38-28FAD8CA1540}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{3DF4C096-7431-4484-BE38-28FAD8CA1540}.Release|Any CPU.Build.0 = Release|Any CPU
+		{3DF4C096-7431-4484-BE38-28FAD8CA1540}.Release|x86.ActiveCfg = Release|Any CPU
+		{3DF4C096-7431-4484-BE38-28FAD8CA1540}.Release|x86.Build.0 = Release|Any CPU
+		{1E26EB6C-4AD1-4140-83FE-777218EE9DF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1E26EB6C-4AD1-4140-83FE-777218EE9DF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1E26EB6C-4AD1-4140-83FE-777218EE9DF5}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{1E26EB6C-4AD1-4140-83FE-777218EE9DF5}.Debug|x86.Build.0 = Debug|Any CPU
+		{1E26EB6C-4AD1-4140-83FE-777218EE9DF5}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{1E26EB6C-4AD1-4140-83FE-777218EE9DF5}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{1E26EB6C-4AD1-4140-83FE-777218EE9DF5}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{1E26EB6C-4AD1-4140-83FE-777218EE9DF5}.Dev|x86.Build.0 = Debug|Any CPU
+		{1E26EB6C-4AD1-4140-83FE-777218EE9DF5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1E26EB6C-4AD1-4140-83FE-777218EE9DF5}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1E26EB6C-4AD1-4140-83FE-777218EE9DF5}.Release|x86.ActiveCfg = Release|Any CPU
+		{1E26EB6C-4AD1-4140-83FE-777218EE9DF5}.Release|x86.Build.0 = Release|Any CPU
+		{BA78CC65-6D17-4C76-8285-DC6B6165DA17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{BA78CC65-6D17-4C76-8285-DC6B6165DA17}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{BA78CC65-6D17-4C76-8285-DC6B6165DA17}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{BA78CC65-6D17-4C76-8285-DC6B6165DA17}.Debug|x86.Build.0 = Debug|Any CPU
+		{BA78CC65-6D17-4C76-8285-DC6B6165DA17}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{BA78CC65-6D17-4C76-8285-DC6B6165DA17}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{BA78CC65-6D17-4C76-8285-DC6B6165DA17}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{BA78CC65-6D17-4C76-8285-DC6B6165DA17}.Dev|x86.Build.0 = Debug|Any CPU
+		{BA78CC65-6D17-4C76-8285-DC6B6165DA17}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{BA78CC65-6D17-4C76-8285-DC6B6165DA17}.Release|Any CPU.Build.0 = Release|Any CPU
+		{BA78CC65-6D17-4C76-8285-DC6B6165DA17}.Release|x86.ActiveCfg = Release|Any CPU
+		{BA78CC65-6D17-4C76-8285-DC6B6165DA17}.Release|x86.Build.0 = Release|Any CPU
+		{9AA688B0-B3B1-49B9-A6E0-060E266E6EAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9AA688B0-B3B1-49B9-A6E0-060E266E6EAE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9AA688B0-B3B1-49B9-A6E0-060E266E6EAE}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{9AA688B0-B3B1-49B9-A6E0-060E266E6EAE}.Debug|x86.Build.0 = Debug|Any CPU
+		{9AA688B0-B3B1-49B9-A6E0-060E266E6EAE}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{9AA688B0-B3B1-49B9-A6E0-060E266E6EAE}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{9AA688B0-B3B1-49B9-A6E0-060E266E6EAE}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{9AA688B0-B3B1-49B9-A6E0-060E266E6EAE}.Dev|x86.Build.0 = Debug|Any CPU
+		{9AA688B0-B3B1-49B9-A6E0-060E266E6EAE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9AA688B0-B3B1-49B9-A6E0-060E266E6EAE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9AA688B0-B3B1-49B9-A6E0-060E266E6EAE}.Release|x86.ActiveCfg = Release|Any CPU
+		{9AA688B0-B3B1-49B9-A6E0-060E266E6EAE}.Release|x86.Build.0 = Release|Any CPU
+		{ABFDA4F8-921E-46D6-8F13-2588759B7F59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{ABFDA4F8-921E-46D6-8F13-2588759B7F59}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{ABFDA4F8-921E-46D6-8F13-2588759B7F59}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{ABFDA4F8-921E-46D6-8F13-2588759B7F59}.Debug|x86.Build.0 = Debug|Any CPU
+		{ABFDA4F8-921E-46D6-8F13-2588759B7F59}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{ABFDA4F8-921E-46D6-8F13-2588759B7F59}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{ABFDA4F8-921E-46D6-8F13-2588759B7F59}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{ABFDA4F8-921E-46D6-8F13-2588759B7F59}.Dev|x86.Build.0 = Debug|Any CPU
+		{ABFDA4F8-921E-46D6-8F13-2588759B7F59}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{ABFDA4F8-921E-46D6-8F13-2588759B7F59}.Release|Any CPU.Build.0 = Release|Any CPU
+		{ABFDA4F8-921E-46D6-8F13-2588759B7F59}.Release|x86.ActiveCfg = Release|Any CPU
+		{ABFDA4F8-921E-46D6-8F13-2588759B7F59}.Release|x86.Build.0 = Release|Any CPU
+		{2BB1F129-E90F-40B2-9487-FEA102EE48C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2BB1F129-E90F-40B2-9487-FEA102EE48C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2BB1F129-E90F-40B2-9487-FEA102EE48C4}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{2BB1F129-E90F-40B2-9487-FEA102EE48C4}.Debug|x86.Build.0 = Debug|Any CPU
+		{2BB1F129-E90F-40B2-9487-FEA102EE48C4}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{2BB1F129-E90F-40B2-9487-FEA102EE48C4}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{2BB1F129-E90F-40B2-9487-FEA102EE48C4}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{2BB1F129-E90F-40B2-9487-FEA102EE48C4}.Dev|x86.Build.0 = Debug|Any CPU
+		{2BB1F129-E90F-40B2-9487-FEA102EE48C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2BB1F129-E90F-40B2-9487-FEA102EE48C4}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2BB1F129-E90F-40B2-9487-FEA102EE48C4}.Release|x86.ActiveCfg = Release|Any CPU
+		{2BB1F129-E90F-40B2-9487-FEA102EE48C4}.Release|x86.Build.0 = Release|Any CPU
+		{B26D44F5-C265-4A24-BC9F-2261075A6F69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B26D44F5-C265-4A24-BC9F-2261075A6F69}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B26D44F5-C265-4A24-BC9F-2261075A6F69}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{B26D44F5-C265-4A24-BC9F-2261075A6F69}.Debug|x86.Build.0 = Debug|Any CPU
+		{B26D44F5-C265-4A24-BC9F-2261075A6F69}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{B26D44F5-C265-4A24-BC9F-2261075A6F69}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{B26D44F5-C265-4A24-BC9F-2261075A6F69}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{B26D44F5-C265-4A24-BC9F-2261075A6F69}.Dev|x86.Build.0 = Debug|Any CPU
+		{B26D44F5-C265-4A24-BC9F-2261075A6F69}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B26D44F5-C265-4A24-BC9F-2261075A6F69}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B26D44F5-C265-4A24-BC9F-2261075A6F69}.Release|x86.ActiveCfg = Release|Any CPU
+		{B26D44F5-C265-4A24-BC9F-2261075A6F69}.Release|x86.Build.0 = Release|Any CPU
+		{6EED8D59-8AF2-4B2E-81E9-92E2547F1B2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6EED8D59-8AF2-4B2E-81E9-92E2547F1B2D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6EED8D59-8AF2-4B2E-81E9-92E2547F1B2D}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{6EED8D59-8AF2-4B2E-81E9-92E2547F1B2D}.Debug|x86.Build.0 = Debug|Any CPU
+		{6EED8D59-8AF2-4B2E-81E9-92E2547F1B2D}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{6EED8D59-8AF2-4B2E-81E9-92E2547F1B2D}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{6EED8D59-8AF2-4B2E-81E9-92E2547F1B2D}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{6EED8D59-8AF2-4B2E-81E9-92E2547F1B2D}.Dev|x86.Build.0 = Debug|Any CPU
+		{6EED8D59-8AF2-4B2E-81E9-92E2547F1B2D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6EED8D59-8AF2-4B2E-81E9-92E2547F1B2D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{6EED8D59-8AF2-4B2E-81E9-92E2547F1B2D}.Release|x86.ActiveCfg = Release|Any CPU
+		{6EED8D59-8AF2-4B2E-81E9-92E2547F1B2D}.Release|x86.Build.0 = Release|Any CPU
+		{CCF1C1DE-C80D-4476-B35F-1BF068E4185E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{CCF1C1DE-C80D-4476-B35F-1BF068E4185E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{CCF1C1DE-C80D-4476-B35F-1BF068E4185E}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{CCF1C1DE-C80D-4476-B35F-1BF068E4185E}.Debug|x86.Build.0 = Debug|Any CPU
+		{CCF1C1DE-C80D-4476-B35F-1BF068E4185E}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{CCF1C1DE-C80D-4476-B35F-1BF068E4185E}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{CCF1C1DE-C80D-4476-B35F-1BF068E4185E}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{CCF1C1DE-C80D-4476-B35F-1BF068E4185E}.Dev|x86.Build.0 = Debug|Any CPU
+		{CCF1C1DE-C80D-4476-B35F-1BF068E4185E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{CCF1C1DE-C80D-4476-B35F-1BF068E4185E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{CCF1C1DE-C80D-4476-B35F-1BF068E4185E}.Release|x86.ActiveCfg = Release|Any CPU
+		{CCF1C1DE-C80D-4476-B35F-1BF068E4185E}.Release|x86.Build.0 = Release|Any CPU
+		{40B47F57-BBC7-42D5-ABE4-11F0E469DF30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{40B47F57-BBC7-42D5-ABE4-11F0E469DF30}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{40B47F57-BBC7-42D5-ABE4-11F0E469DF30}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{40B47F57-BBC7-42D5-ABE4-11F0E469DF30}.Debug|x86.Build.0 = Debug|Any CPU
+		{40B47F57-BBC7-42D5-ABE4-11F0E469DF30}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{40B47F57-BBC7-42D5-ABE4-11F0E469DF30}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{40B47F57-BBC7-42D5-ABE4-11F0E469DF30}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{40B47F57-BBC7-42D5-ABE4-11F0E469DF30}.Dev|x86.Build.0 = Debug|Any CPU
+		{40B47F57-BBC7-42D5-ABE4-11F0E469DF30}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{40B47F57-BBC7-42D5-ABE4-11F0E469DF30}.Release|Any CPU.Build.0 = Release|Any CPU
+		{40B47F57-BBC7-42D5-ABE4-11F0E469DF30}.Release|x86.ActiveCfg = Release|Any CPU
+		{40B47F57-BBC7-42D5-ABE4-11F0E469DF30}.Release|x86.Build.0 = Release|Any CPU
+		{1614316C-827D-4C2C-B9D3-A62E25AF1827}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1614316C-827D-4C2C-B9D3-A62E25AF1827}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1614316C-827D-4C2C-B9D3-A62E25AF1827}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{1614316C-827D-4C2C-B9D3-A62E25AF1827}.Debug|x86.Build.0 = Debug|Any CPU
+		{1614316C-827D-4C2C-B9D3-A62E25AF1827}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{1614316C-827D-4C2C-B9D3-A62E25AF1827}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{1614316C-827D-4C2C-B9D3-A62E25AF1827}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{1614316C-827D-4C2C-B9D3-A62E25AF1827}.Dev|x86.Build.0 = Debug|Any CPU
+		{1614316C-827D-4C2C-B9D3-A62E25AF1827}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1614316C-827D-4C2C-B9D3-A62E25AF1827}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1614316C-827D-4C2C-B9D3-A62E25AF1827}.Release|x86.ActiveCfg = Release|Any CPU
+		{1614316C-827D-4C2C-B9D3-A62E25AF1827}.Release|x86.Build.0 = Release|Any CPU
+		{B8B1C352-0398-4A54-B202-D774D48367EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B8B1C352-0398-4A54-B202-D774D48367EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B8B1C352-0398-4A54-B202-D774D48367EB}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{B8B1C352-0398-4A54-B202-D774D48367EB}.Debug|x86.Build.0 = Debug|Any CPU
+		{B8B1C352-0398-4A54-B202-D774D48367EB}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{B8B1C352-0398-4A54-B202-D774D48367EB}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{B8B1C352-0398-4A54-B202-D774D48367EB}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{B8B1C352-0398-4A54-B202-D774D48367EB}.Dev|x86.Build.0 = Debug|Any CPU
+		{B8B1C352-0398-4A54-B202-D774D48367EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B8B1C352-0398-4A54-B202-D774D48367EB}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B8B1C352-0398-4A54-B202-D774D48367EB}.Release|x86.ActiveCfg = Release|Any CPU
+		{B8B1C352-0398-4A54-B202-D774D48367EB}.Release|x86.Build.0 = Release|Any CPU
+		{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}.Debug|x86.Build.0 = Debug|Any CPU
+		{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}.Dev|x86.Build.0 = Debug|Any CPU
+		{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}.Release|Any CPU.Build.0 = Release|Any CPU
+		{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}.Release|x86.ActiveCfg = Release|Any CPU
+		{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1}.Release|x86.Build.0 = Release|Any CPU
+		{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}.Debug|x86.Build.0 = Debug|Any CPU
+		{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}.Dev|x86.Build.0 = Debug|Any CPU
+		{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}.Release|x86.ActiveCfg = Release|Any CPU
+		{4BDE58B2-5B2E-480B-932F-D63C2A7D557C}.Release|x86.Build.0 = Release|Any CPU
+		{9912BD12-4CF7-4A91-8203-47C9C125004C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{9912BD12-4CF7-4A91-8203-47C9C125004C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{9912BD12-4CF7-4A91-8203-47C9C125004C}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{9912BD12-4CF7-4A91-8203-47C9C125004C}.Debug|x86.Build.0 = Debug|Any CPU
+		{9912BD12-4CF7-4A91-8203-47C9C125004C}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{9912BD12-4CF7-4A91-8203-47C9C125004C}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{9912BD12-4CF7-4A91-8203-47C9C125004C}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{9912BD12-4CF7-4A91-8203-47C9C125004C}.Dev|x86.Build.0 = Debug|Any CPU
+		{9912BD12-4CF7-4A91-8203-47C9C125004C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{9912BD12-4CF7-4A91-8203-47C9C125004C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{9912BD12-4CF7-4A91-8203-47C9C125004C}.Release|x86.ActiveCfg = Release|Any CPU
+		{9912BD12-4CF7-4A91-8203-47C9C125004C}.Release|x86.Build.0 = Release|Any CPU
+		{55326F38-372A-4606-B7FB-8C01BBAEC4FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{55326F38-372A-4606-B7FB-8C01BBAEC4FC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{55326F38-372A-4606-B7FB-8C01BBAEC4FC}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{55326F38-372A-4606-B7FB-8C01BBAEC4FC}.Debug|x86.Build.0 = Debug|Any CPU
+		{55326F38-372A-4606-B7FB-8C01BBAEC4FC}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{55326F38-372A-4606-B7FB-8C01BBAEC4FC}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{55326F38-372A-4606-B7FB-8C01BBAEC4FC}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{55326F38-372A-4606-B7FB-8C01BBAEC4FC}.Dev|x86.Build.0 = Debug|Any CPU
+		{55326F38-372A-4606-B7FB-8C01BBAEC4FC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{55326F38-372A-4606-B7FB-8C01BBAEC4FC}.Release|Any CPU.Build.0 = Release|Any CPU
+		{55326F38-372A-4606-B7FB-8C01BBAEC4FC}.Release|x86.ActiveCfg = Release|Any CPU
+		{55326F38-372A-4606-B7FB-8C01BBAEC4FC}.Release|x86.Build.0 = Release|Any CPU
+		{94D572FA-810E-4897-B673-AF988FD4019E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{94D572FA-810E-4897-B673-AF988FD4019E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{94D572FA-810E-4897-B673-AF988FD4019E}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{94D572FA-810E-4897-B673-AF988FD4019E}.Debug|x86.Build.0 = Debug|Any CPU
+		{94D572FA-810E-4897-B673-AF988FD4019E}.Dev|Any CPU.ActiveCfg = Debug|Any CPU
+		{94D572FA-810E-4897-B673-AF988FD4019E}.Dev|Any CPU.Build.0 = Debug|Any CPU
+		{94D572FA-810E-4897-B673-AF988FD4019E}.Dev|x86.ActiveCfg = Debug|Any CPU
+		{94D572FA-810E-4897-B673-AF988FD4019E}.Dev|x86.Build.0 = Debug|Any CPU
+		{94D572FA-810E-4897-B673-AF988FD4019E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{94D572FA-810E-4897-B673-AF988FD4019E}.Release|Any CPU.Build.0 = Release|Any CPU
+		{94D572FA-810E-4897-B673-AF988FD4019E}.Release|x86.ActiveCfg = Release|Any CPU
+		{94D572FA-810E-4897-B673-AF988FD4019E}.Release|x86.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(NestedProjects) = preSolution
+		{B5C7DC02-077C-4255-A369-600D033A4C23} = {B131DEBD-A555-490B-B448-46425298E427}
+		{41C50E65-7C73-4BD0-9773-2A74F1587EE2} = {798C4C07-A3B2-47AD-A69C-922D5217B5CA}
+		{1C8F84A9-7812-4435-B833-FF26A9A3DD4C} = {A73C1AFF-FF92-4825-B607-2E908077EBA4}
+		{F512AFDB-D45D-4979-BC8C-0BA7FBE8F583} = {8498AA9D-CDC4-4FD2-81AE-DE6AD78F75ED}
+		{FBC88231-BC8E-4AA8-BD60-0A13FE463EF1} = {B131DEBD-A555-490B-B448-46425298E427}
+		{3DF4C096-7431-4484-BE38-28FAD8CA1540} = {798C4C07-A3B2-47AD-A69C-922D5217B5CA}
+		{1E26EB6C-4AD1-4140-83FE-777218EE9DF5} = {A73C1AFF-FF92-4825-B607-2E908077EBA4}
+		{BA78CC65-6D17-4C76-8285-DC6B6165DA17} = {8498AA9D-CDC4-4FD2-81AE-DE6AD78F75ED}
+		{9AA688B0-B3B1-49B9-A6E0-060E266E6EAE} = {B131DEBD-A555-490B-B448-46425298E427}
+		{ABFDA4F8-921E-46D6-8F13-2588759B7F59} = {798C4C07-A3B2-47AD-A69C-922D5217B5CA}
+		{A73C1AFF-FF92-4825-B607-2E908077EBA4} = {60DE2920-37C6-4C2B-A053-6B1B2DAF047A}
+		{8498AA9D-CDC4-4FD2-81AE-DE6AD78F75ED} = {60DE2920-37C6-4C2B-A053-6B1B2DAF047A}
+		{B131DEBD-A555-490B-B448-46425298E427} = {56D014A3-EB8D-4EF5-A751-3BAA084519D0}
+		{798C4C07-A3B2-47AD-A69C-922D5217B5CA} = {56D014A3-EB8D-4EF5-A751-3BAA084519D0}
+		{2BB1F129-E90F-40B2-9487-FEA102EE48C4} = {A73C1AFF-FF92-4825-B607-2E908077EBA4}
+		{B26D44F5-C265-4A24-BC9F-2261075A6F69} = {8498AA9D-CDC4-4FD2-81AE-DE6AD78F75ED}
+		{6EED8D59-8AF2-4B2E-81E9-92E2547F1B2D} = {B131DEBD-A555-490B-B448-46425298E427}
+		{CCF1C1DE-C80D-4476-B35F-1BF068E4185E} = {B131DEBD-A555-490B-B448-46425298E427}
+		{40B47F57-BBC7-42D5-ABE4-11F0E469DF30} = {798C4C07-A3B2-47AD-A69C-922D5217B5CA}
+		{1614316C-827D-4C2C-B9D3-A62E25AF1827} = {798C4C07-A3B2-47AD-A69C-922D5217B5CA}
+		{B8B1C352-0398-4A54-B202-D774D48367EB} = {A73C1AFF-FF92-4825-B607-2E908077EBA4}
+		{986CA639-B3B4-4D4F-B12B-3D8FBA48B2B1} = {A73C1AFF-FF92-4825-B607-2E908077EBA4}
+		{4BDE58B2-5B2E-480B-932F-D63C2A7D557C} = {8498AA9D-CDC4-4FD2-81AE-DE6AD78F75ED}
+		{9912BD12-4CF7-4A91-8203-47C9C125004C} = {8498AA9D-CDC4-4FD2-81AE-DE6AD78F75ED}
+		{55326F38-372A-4606-B7FB-8C01BBAEC4FC} = {8498AA9D-CDC4-4FD2-81AE-DE6AD78F75ED}
+		{94D572FA-810E-4897-B673-AF988FD4019E} = {A73C1AFF-FF92-4825-B607-2E908077EBA4}
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {599A7267-7402-4143-84AE-9B407FC2BB69}
+	EndGlobalSection
+EndGlobal
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Properties/PublishProfiles/FolderProfile.pubxml b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Properties/PublishProfiles/FolderProfile.pubxml
new file mode 100644
index 0000000..36847ea
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Properties/PublishProfiles/FolderProfile.pubxml
@@ -0,0 +1,17 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<!--
+https://go.microsoft.com/fwlink/?LinkID=208121.
+-->
+<Project>
+  <PropertyGroup>
+    <DeleteExistingFiles>false</DeleteExistingFiles>
+    <ExcludeApp_Data>false</ExcludeApp_Data>
+    <LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
+    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
+    <LastUsedPlatform>Any CPU</LastUsedPlatform>
+    <PublishProvider>FileSystem</PublishProvider>
+    <PublishUrl>bin\Release\net6.0\publish\</PublishUrl>
+    <WebPublishMethod>FileSystem</WebPublishMethod>
+    <_TargetId>Folder</_TargetId>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Properties/PublishProfiles/FolderProfile.pubxml.user b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Properties/PublishProfiles/FolderProfile.pubxml.user
new file mode 100644
index 0000000..7cbcd56
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -0,0 +1,11 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<!--
+https://go.microsoft.com/fwlink/?LinkID=208121.
+-->
+<Project>
+  <PropertyGroup>
+    <_PublishTargetUrl>E:\GIT\鐧炬鍐犲畤\BaiBuLiKu\Code Management\WMS\WIDESEA_WMSServer\WIDESEA_WMSServer\bin\Release\net6.0\publish\</_PublishTargetUrl>
+    <History>True|2025-02-18T07:09:13.0567844Z;True|2025-02-18T10:30:45.6690625+08:00;True|2025-02-17T00:17:57.1953767+08:00;True|2025-02-17T00:08:49.8489825+08:00;True|2025-02-17T00:00:57.5511029+08:00;True|2025-02-15T14:45:50.0466371+08:00;True|2025-02-15T14:26:18.9252196+08:00;True|2025-02-15T14:22:56.6840183+08:00;True|2025-02-15T13:37:28.7588867+08:00;True|2025-02-15T13:11:23.1821094+08:00;True|2025-02-14T14:03:21.8968201+08:00;True|2025-02-10T16:52:59.9322253+08:00;</History>
+    <LastFailureDetails />
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj
new file mode 100644
index 0000000..6091c76
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj
@@ -0,0 +1,44 @@
+锘�<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>net6.0</TargetFramework>
+    <Nullable>enable</Nullable>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <GenerateDocumentationFile>True</GenerateDocumentationFile>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
+    <NoWarn>1701;1702;1591;1573;1570</NoWarn>
+  </PropertyGroup>
+
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
+    <NoWarn>1701;1702;1591;1573;1570</NoWarn>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <Content Remove="wwwroot\WIDESEA_DB.DBSeed.Json\Sys_Tenant.tsv" />
+  </ItemGroup>
+
+	<ItemGroup>
+		<None Include="wwwroot\WIDESEA_DB.DBSeed.Json\Sys_Tenant.tsv" />
+		<None Include="wwwroot\WIDESEA_DB.DBSeed.Json\Sys_User.tsv" />
+	</ItemGroup>
+
+	<ItemGroup>
+		<None Remove="index.html" />
+	</ItemGroup>
+	
+	<ItemGroup>
+		<EmbeddedResource Include="index.html" />
+	</ItemGroup>
+	
+	<ItemGroup>
+	  <ProjectReference Include="..\WIDESEA_BusinessServices\WIDESEA_BusinessServices.csproj" />
+	  <ProjectReference Include="..\WIDESEA_Services\WIDESEA_Services.csproj" />
+	  <ProjectReference Include="..\WIDESEA_IServices\WIDESEA_IServices.csproj" />
+	  <ProjectReference Include="..\WIDESEA_StorageBasicServices\WIDESEA_StorageBasicServices.csproj" />
+	  <ProjectReference Include="..\WIDESEA_StorageOutOrderServices\WIDESEA_StorageOutOrderServices.csproj" />
+	  <ProjectReference Include="..\WIDESEA_StorageTaskServices\WIDESEA_StorageTaskServices.csproj" />
+	  <ProjectReference Include="..\WIDESEA_StoragIntegrationServices\WIDESEA_StoragIntegrationServices.csproj" />
+	</ItemGroup>
+</Project>
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj.user b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj.user
new file mode 100644
index 0000000..16aa98e
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj.user
@@ -0,0 +1,6 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <NameOfLastUsedPublishProfile>E:\GIT\鐧炬鍐犲畤\BaiBuLiKu\Code Management\WMS\WIDESEA_WMSServer\WIDESEA_WMSServer\Properties\PublishProfiles\FolderProfile.pubxml</NameOfLastUsedPublishProfile>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git "a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/bin/Debug/net6.0/ExcelExport/\345\272\223\345\255\230\344\277\241\346\201\257.xlsx" "b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/bin/Debug/net6.0/ExcelExport/\345\272\223\345\255\230\344\277\241\346\201\257.xlsx"
new file mode 100644
index 0000000..f490e5c
--- /dev/null
+++ "b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/bin/Debug/net6.0/ExcelExport/\345\272\223\345\255\230\344\277\241\346\201\257.xlsx"
Binary files differ
diff --git a/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/obj/Debug/net6.0/WIDESEA_WMSServer.csproj.CopyComplete b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/obj/Debug/net6.0/WIDESEA_WMSServer.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/3F/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/obj/Debug/net6.0/WIDESEA_WMSServer.csproj.CopyComplete
diff --git a/Code Management/WCS/WIDESEAWCS_Client/src/api/http.js b/Code Management/WCS/WIDESEAWCS_Client/src/api/http.js
index cf41fd2..10258dc 100644
--- a/Code Management/WCS/WIDESEAWCS_Client/src/api/http.js
+++ b/Code Management/WCS/WIDESEAWCS_Client/src/api/http.js
@@ -20,7 +20,7 @@
 }
 
 else if (process.env.NODE_ENV == 'production') {
-    axios.defaults.baseURL = 'http://192.168.5.251:9291/';
+    axios.defaults.baseURL = 'http://192.168.20.251:9291/';
 }
 if (!axios.defaults.baseURL.endsWith('/')) {
     axios.defaults.baseURL+="/";
diff --git a/Code Management/WCS/WIDESEAWCS_Client/src/views/basicinfo/Dt_needBarcode.vue b/Code Management/WCS/WIDESEAWCS_Client/src/views/basicinfo/Dt_needBarcode.vue
index 5f2514f..287deaa 100644
--- a/Code Management/WCS/WIDESEAWCS_Client/src/views/basicinfo/Dt_needBarcode.vue
+++ b/Code Management/WCS/WIDESEAWCS_Client/src/views/basicinfo/Dt_needBarcode.vue
@@ -24,6 +24,7 @@
             sortName: "AreaCode"
         });
         const editFormFields = ref({
+            "id":"",
             "toArea": "",
             "fromArea": "",
             "barcodeType": "",
@@ -33,17 +34,19 @@
         });
         const editFormOptions = ref([
             [
-                { "title": "鐩爣搴撳尯", "field": "toArea", type: "text" },
-                { "title": "鏉ユ簮搴撳尯", "field": "fromArea", type: "text" },
-                { "title": "鎵樼洏绫诲瀷", "field": "barcodeType", type: "text" },
-            ],
-            [
-                { "title": "鎵�灞炰骇绾�", "field": "productLine", type: "text" },
                 { "title": "鍦ㄩ�旀暟閲�", "field": "inLineNum", type: "text" },
                 { "title": "鍙紦瀛樻暟閲�", "field": "cacheNum", type: "text" },
             ]
         ]);
-        const searchFormFields = ref({});
+        const searchFormFields = ref({
+            "iD":"",
+            "toArea": "",
+            "fromArea": "",
+            "barcodeType": "",
+            "productLine": "",
+            "inLineNum": "",
+            "cacheNum":""
+        });
         const searchFormOptions = ref([
             [
                 { "title": "鐩爣搴撳尯", "field": "toArea", type: "text" },
@@ -56,7 +59,7 @@
                 { "title": "鍙紦瀛樻暟閲�", "field": "cacheNum", type: "text" },
             ]
         ]);
-        const columns = ref([{ field: 'ID', title: '涓婚敭', type: 'int', sort: true, hidden: true, width: 110, readonly: true, require: true, align: 'left' },
+        const columns = ref([{ field: 'iD', title: '涓婚敭', type: 'int', sort: true, hidden: true, width: 110, readonly: true, require: true, align: 'left' },
         { field: 'toArea', title: '鐩爣搴撳尯', type: 'string', sort: true, width: 110, require: true, align: 'left', sort: true },
         { field: 'fromArea', title: '鏉ユ簮搴撳尯', type: 'string', sort: true, width: 110, align: 'left' },
         { field: 'barcodeType', title: '鎵樼洏绫诲瀷', type: 'string', sort: true, width: 110, align: 'left' },
diff --git a/Code Management/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue b/Code Management/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue
index 9a53652..df216d1 100644
--- a/Code Management/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue
+++ b/Code Management/WCS/WIDESEAWCS_Client/src/views/taskinfo/task.vue
@@ -40,6 +40,7 @@
       creater: "",
       createDate: "",
       grade: "",
+      productionLine:""
     });
     const editFormOptions = ref([[{ title: "浼樺厛绾�", field: "grade", type: "int" },]]);
     const searchFormFields = ref({
diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/BaseServices/ServiceBase.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/BaseServices/ServiceBase.cs
index ee18736..7b5b5b2 100644
--- a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/BaseServices/ServiceBase.cs
+++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/BaseServices/ServiceBase.cs
@@ -225,7 +225,10 @@
                 {
                     return WebResponseContent.Instance.Error("浼犲弬閿欒,鍙傛暟涓嶈兘涓虹┖");
                 }
-                string validResult = typeof(TEntity).ValidateDicInEntity(saveModel.MainData, true, TProperties);
+
+                var x = saveModel.MainData;
+
+                string validResult = typeof(TEntity).ValidateDicInEntity(x, true, TProperties);
 
                 if (!string.IsNullOrEmpty(validResult))
                 {
diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Utilities/EntityProperties.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Utilities/EntityProperties.cs
index dec0451..91dacd8 100644
--- a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Utilities/EntityProperties.cs
+++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Core/Utilities/EntityProperties.cs
@@ -152,7 +152,7 @@
             if (dic == null || dic.Count == 0) { return "鍙傛暟鏃犳晥"; }
 
             // 涓嶅瓨鍦ㄧ殑瀛楁鐩存帴绉婚櫎
-            dic.Where(x => !propertyInfo.Any(p => p.Name == x.Key.FirstLetterToUpper())).Select(s => s.Key).ToList().ForEach(f =>
+            dic.Where(x => !propertyInfo.Any(p => p.Name.ToUpper() == x.Key.ToUpper())).Select(s => s.Key).ToList().ForEach(f =>
             {
                 dic.Remove(f);
             });
diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/dt_needBarcode.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/dt_needBarcode.cs
index 7e70e6f..970c257 100644
--- a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/dt_needBarcode.cs
+++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/BasicInfo/dt_needBarcode.cs
@@ -1,4 +1,5 @@
-锘縰sing SqlSugar;
+锘縰sing Magicodes.ExporterAndImporter.Core;
+using SqlSugar;
 using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
@@ -13,43 +14,57 @@
     public class dt_needBarcode : BaseEntity
     {
         [Key]
-        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "涓婚敭")]
+        [ImporterHeader(IsIgnore = true)]
+        [ExporterHeader(DisplayName = "涓婚敭")]
+        [SugarColumn(IsIdentity = true, IsNullable = true, IsPrimaryKey = true, ColumnDescription = "涓婚敭")]
         public int id { get; set; }
 
         /// <summary>
         /// 鐩爣搴撳尯
         /// </summary>
-        [SugarColumn(IsNullable = false, Length = 20, ColumnDescription = "鐩爣搴撳尯")]
+        [ImporterHeader(Name = "鐩爣搴撳尯")]
+        [ExporterHeader(DisplayName = "鐩爣搴撳尯")]
+        [SugarColumn(IsNullable = true, ColumnDescription = "鐩爣搴撳尯")]
         public string toArea { get; set; }
 
         /// <summary>
         /// 鏉ユ簮搴撳尯
         /// </summary>
-        [SugarColumn(IsNullable = false, Length = 10, ColumnDescription = "鏉ユ簮搴撳尯")]
+        [ImporterHeader(Name = "鏉ユ簮搴撳尯")]
+        [ExporterHeader(DisplayName = "鏉ユ簮搴撳尯")]
+        [SugarColumn(IsNullable = true, ColumnDescription = "鏉ユ簮搴撳尯")]
         public string fromArea { get; set; }
 
         /// <summary>
         /// 鎵樼洏绫诲瀷
         /// </summary>
-        [SugarColumn(IsNullable = false, Length = 10, ColumnDescription = "鎵樼洏绫诲瀷")]
+        [ImporterHeader(Name = "鎵樼洏绫诲瀷")]
+        [ExporterHeader(DisplayName = "鎵樼洏绫诲瀷")]
+        [SugarColumn(IsNullable = true, ColumnDescription = "鎵樼洏绫诲瀷")]
         public string barcodeType { get; set; }
 
         /// <summary>
         /// 浜х嚎
         /// </summary>
-        [SugarColumn(IsNullable = false, Length = 10, ColumnDescription = "鎵�灞炰骇绾�")]
+        [ImporterHeader(Name = "浜х嚎")]
+        [ExporterHeader(DisplayName = "浜х嚎")]
+        [SugarColumn(IsNullable = true, ColumnDescription = "浜х嚎")]
         public string productLine {  get; set; }
 
         /// <summary>
         /// 鍦ㄩ�旀暟閲�
         /// </summary>
-        [SugarColumn(IsNullable = false, Length = 10, ColumnDescription = "鍦ㄩ�旀暟閲�")]
+        [ImporterHeader(Name = "鍦ㄩ�旀暟閲�")]
+        [ExporterHeader(DisplayName = "鍦ㄩ�旀暟閲�")]
+        [SugarColumn(IsNullable = true, ColumnDescription = "鍦ㄩ�旀暟閲�")]
         public int inLineNum { get; set; }
 
         /// <summary>
         /// 鐩爣缂撳瓨鏁伴噺
         /// </summary>
-        [SugarColumn(IsNullable = false, Length = 10, ColumnDescription = "鍙紦瀛樻暟閲�")]
+        [ImporterHeader(Name = "鍙紦瀛樻暟閲�")]
+        [ExporterHeader(DisplayName = "鍙紦瀛樻暟閲�")]
+        [SugarColumn(IsNullable = true, ColumnDescription = "鍙紦瀛樻暟閲�")]
         public int cacheNum { get; set; } = 0;
 
 
diff --git a/Code Management/WMS/WIDESEA_WMSClient/src/api/http.js b/Code Management/WMS/WIDESEA_WMSClient/src/api/http.js
index e977aca..68b5797 100644
--- a/Code Management/WMS/WIDESEA_WMSClient/src/api/http.js
+++ b/Code Management/WMS/WIDESEA_WMSClient/src/api/http.js
@@ -19,7 +19,7 @@
 }
 else if (process.env.NODE_ENV == 'production') {
   // axios.defaults.baseURL = 'http://127.0.0.1:5000/';
-  axios.defaults.baseURL = 'http://192.168.5.251:5000/';
+  axios.defaults.baseURL = 'http://192.168.20.251:5000/';
 }
 
 //axios.defaults.baseURL = 'http://api.volcore.xyz/';
diff --git a/Code Management/WMS/WIDESEA_WMSClient/vite.config.ts b/Code Management/WMS/WIDESEA_WMSClient/vite.config.ts
index 6bca086..bc53b3d 100644
--- a/Code Management/WMS/WIDESEA_WMSClient/vite.config.ts
+++ b/Code Management/WMS/WIDESEA_WMSClient/vite.config.ts
@@ -64,7 +64,7 @@
     devSourcemap: false
   },
   server: {
-    port: 9990
+    port: 8081
     // proxy: {
     //   '/api': {
     //     target: 'http://xxxx.com',
diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
index 9583158..cb3bae6 100644
--- a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/appsettings.json
@@ -11,11 +11,11 @@
   //杩炴帴瀛楃涓�
   //"ConnectionString": "HTI6FB1H05Krd07mNm9yBCNhofW6edA5zLs9TY~MNthRYW3kn0qKbMIsGp~3yyPDF1YZUCPBQx8U0Jfk4PH~ajNFXVIwlH85M3F~v_qKYQ3CeAz3q1mLVDn8O5uWt1~3Ut2V3KRkEwYHvW2oMDN~QIDXPxDgXN0R2oTIhc9dNu7QNaLEknblqmHhjaNSSpERdDVZIgHnMKejU_SL49tralBkZmDNi0hmkbL~837j1NWe37u9fJKmv91QPb~16JsuI9uu0EvNZ06g6PuZfOSAeFH9GMMIZiketdcJG3tHelo=",
   //"ConnectionString": "Data Source=192.168.5.251;Initial Catalog=WIDESEA_WMSDB_BBMain;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
-  "ConnectionString": "Data Source=127.0.0.1;Initial Catalog=WIDESEA_WMS2F08;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
+  "ConnectionString": "Data Source=127.0.0.1;Initial Catalog=WIDESEA_WMSDB;User ID=sa;Password=sa123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
   //"ConnectionString": "Data Source=.\\LIULEI;Initial Catalog=WIDESEA_WMSDB_BBMain;User ID=sa;Password=123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
   //"ConnectionString": "Data Source=192.168.20.251;Initial Catalog=WIDESEA_WMSDB;User ID=sa;Password=123456@gy;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
   //"ConnectionStringWCS": "Data Source=192.168.5.251;Initial Catalog=WIDESEAWCS_TEST;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
-  "ConnectionStringWCS": "Data Source=127.0.0.1;Initial Catalog=WIDESEA_WCS2F08;User ID=sa;Password=P@ssw0rd;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
+  "ConnectionStringWCS": "Data Source=127.0.0.1;Initial Catalog=WIDESEA_WCSDB;User ID=sa;Password=sa123456;Integrated Security=False;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",
   //璺ㄥ煙
   "Cors": {
     "PolicyName": "CorsIpAccess", //绛栫暐鍚嶇О
diff --git "a/\351\241\271\347\233\256\350\265\204\346\226\231/\351\241\271\347\233\256\345\233\276\347\272\270/\347\224\265\350\212\2573\346\245\274\345\233\276\347\272\270\344\270\216\347\224\265\346\260\224\347\274\226\345\217\267\345\257\271\347\205\247\357\274\21008\351\241\271\347\233\256\347\224\265\350\212\2573\346\245\274\344\273\216\346\263\250\346\266\262\345\274\200\345\247\213\357\274\211/\347\224\265\350\212\2573F\345\270\203\345\261\200\345\233\2760805.dwl" "b/\351\241\271\347\233\256\350\265\204\346\226\231/\351\241\271\347\233\256\345\233\276\347\272\270/\347\224\265\350\212\2573\346\245\274\345\233\276\347\272\270\344\270\216\347\224\265\346\260\224\347\274\226\345\217\267\345\257\271\347\205\247\357\274\21008\351\241\271\347\233\256\347\224\265\350\212\2573\346\245\274\344\273\216\346\263\250\346\266\262\345\274\200\345\247\213\357\274\211/\347\224\265\350\212\2573F\345\270\203\345\261\200\345\233\2760805.dwl"
new file mode 100644
index 0000000..a5a34db
--- /dev/null
+++ "b/\351\241\271\347\233\256\350\265\204\346\226\231/\351\241\271\347\233\256\345\233\276\347\272\270/\347\224\265\350\212\2573\346\245\274\345\233\276\347\272\270\344\270\216\347\224\265\346\260\224\347\274\226\345\217\267\345\257\271\347\205\247\357\274\21008\351\241\271\347\233\256\347\224\265\350\212\2573\346\245\274\344\273\216\346\263\250\346\266\262\345\274\200\345\247\213\357\274\211/\347\224\265\350\212\2573F\345\270\203\345\261\200\345\233\2760805.dwl"
@@ -0,0 +1,3 @@
+玛卡巴卡
+DESKTOP-9EVT5GR
+2025-02-19星期三 13:26:04
\ No newline at end of file
diff --git "a/\351\241\271\347\233\256\350\265\204\346\226\231/\351\241\271\347\233\256\345\233\276\347\272\270/\347\224\265\350\212\2573\346\245\274\345\233\276\347\272\270\344\270\216\347\224\265\346\260\224\347\274\226\345\217\267\345\257\271\347\205\247\357\274\21008\351\241\271\347\233\256\347\224\265\350\212\2573\346\245\274\344\273\216\346\263\250\346\266\262\345\274\200\345\247\213\357\274\211/\347\224\265\350\212\2573F\345\270\203\345\261\200\345\233\2760805.dwl2" "b/\351\241\271\347\233\256\350\265\204\346\226\231/\351\241\271\347\233\256\345\233\276\347\272\270/\347\224\265\350\212\2573\346\245\274\345\233\276\347\272\270\344\270\216\347\224\265\346\260\224\347\274\226\345\217\267\345\257\271\347\205\247\357\274\21008\351\241\271\347\233\256\347\224\265\350\212\2573\346\245\274\344\273\216\346\263\250\346\266\262\345\274\200\345\247\213\357\274\211/\347\224\265\350\212\2573F\345\270\203\345\261\200\345\233\2760805.dwl2"
new file mode 100644
index 0000000..c0fa9ca
--- /dev/null
+++ "b/\351\241\271\347\233\256\350\265\204\346\226\231/\351\241\271\347\233\256\345\233\276\347\272\270/\347\224\265\350\212\2573\346\245\274\345\233\276\347\272\270\344\270\216\347\224\265\346\260\224\347\274\226\345\217\267\345\257\271\347\205\247\357\274\21008\351\241\271\347\233\256\347\224\265\350\212\2573\346\245\274\344\273\216\346\263\250\346\266\262\345\274\200\345\247\213\357\274\211/\347\224\265\350\212\2573F\345\270\203\345\261\200\345\233\2760805.dwl2"
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8">
+<whprops>
+<username>玛卡巴卡</username>
+<machinename>DESKTOP-9EVT5GR</machinename>
+<fullname></fullname>
+<datetime>2025-02-19星期三 13:26:04</datetime></whprops>
\ No newline at end of file

--
Gitblit v1.9.3