From 754f9b186f9ce43c730d2a80728daba74951e0bf Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Fri, 16 Jan 2026 16:15:43 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 applications/task-work-order/src/assets/images/no-data-bg.png                                              |    0 
 applications/task-work-order/src/utils/cesium/DrawPolygon.js                                               |  301 +
 applications/task-work-order/src/utils/cesium/createRouteLine.js                                           |  923 ++++--
 applications/task-work-order/src/views/system/user/FormDiaLog.vue                                          |  451 +++
 applications/drone-command/src/assets/images/dataCockpit/device-wrj.svg                                    |   49 
 applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/index.vue                     |   13 
 applications/drone-command/src/views/detectionCountermeasure/taskSchedule/index.vue                        |   17 
 applications/task-work-order/src/utils/cesium/compressImage.js                                             |   55 
 applications/task-work-order/src/store/modules/user.js                                                     |    4 
 applications/task-work-order/src/views/dataCockpit/components/EmptyState.vue                               |   59 
 applications/task-work-order/src/views/dataCockpit/components/LeftContainer.vue                            |  219 +
 applications/drone-command/src/assets/images/dataCockpit/device-fz.svg                                     |   66 
 applications/task-work-order/src/utils/cesium/kmz.js                                                       |   10 
 applications/drone-command/src/views/basicManage/deviceScrap/index.vue                                     |   75 
 applications/task-work-order/src/utils/cesium/publicCesium.js                                              |  168 
 applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/FormDiaLog.vue                |   16 
 applications/task-work-order/src/utils/cesium/common.js                                                    |    8 
 applications/drone-command/src/views/recordManage/historyTracks/TrajectoryDiaLog.vue                       |   40 
 applications/task-work-order/src/assets/images/aiNowFly/flying.png                                         |    0 
 applications/task-work-order/src/assets/images/aiNowFly/starting.png                                       |    0 
 applications/task-work-order/src/utils/cesium/frustum/CoordinateTranslate.js                               |  229 +
 applications/task-work-order/env/.env.development                                                          |   12 
 applications/task-work-order/src/components/map-container/device-map-container.vue                         |  437 +++
 applications/task-work-order/src/utils/cesium/Material/index.js                                            |   18 
 applications/task-work-order/src/components/map-container/mapContainer.vue                                 |    2 
 applications/task-work-order/src/views/dataCockpit/components/RightContainer.vue                           |  288 ++
 applications/task-work-order/src/views/wel/index.vue                                                       |  212 -
 applications/task-work-order/src/utils/cesium/use-kmz-tsa.js                                               |  675 ++++
 applications/drone-command/package.json                                                                    |    1 
 applications/task-work-order/src/views/dataCockpit/components/DeviceHistoryDialog.vue                      |  208 +
 applications/drone-command/src/views/basicManage/deviceStock/DeviceScrapDiaLog.vue                         |    2 
 applications/task-work-order/src/components/map-container/mapContainer-copy.vue                            |   10 
 applications/task-work-order/src/views/dataCockpit/components/RealWarning.vue                              |  109 
 applications/task-work-order/src/assets/images/dataCockpit/left-btn.png                                    |    0 
 applications/task-work-order/src/views/dataCockpit/index.vue                                               |   96 
 applications/task-work-order/src/router/views/index.js                                                     |   11 
 applications/task-work-order/src/views/dataCockpit/components/templateComponents/HistoryTemplate.vue       |  149 +
 applications/task-work-order/src/assets/images/dataCockpit/zcsb.png                                        |    0 
 applications/task-work-order/src/assets/images/dataCockpit/equipment.png                                   |    0 
 applications/task-work-order/src/assets/images/dataCockpit/fzsb.png                                        |    0 
 applications/task-work-order/src/views/dataCockpit/components/HistoryWarning.vue                           |  123 
 applications/drone-command/src/views/detectionCountermeasure/detectionRange/index.vue                      |   41 
 applications/task-work-order/src/utils/cesium/compressImage2.js                                            |   46 
 applications/drone-command/src/views/basicManage/maintainRecord/MaintenanceDiaLog.vue                      |   24 
 applications/task-work-order/src/assets/images/dataCockpit/layerControl.png                                |    0 
 applications/task-work-order/src/assets/images/dataCockpit/warning.png                                     |    0 
 applications/task-work-order/src/utils/cesium/mapUtil.js                                                   |  207 +
 applications/task-work-order/src/views/dataCockpit/components/templateComponents/RealTemplate.vue          |  245 +
 applications/drone-command/src/assets/images/dataCockpit/device-zhd.svg                                    |   63 
 applications/task-work-order/src/views/dataCockpit/components/templateComponents/RealEquipmentTemplate.vue |  213 +
 applications/task-work-order/src/views/dataCockpit/components/templateComponents/TitleTemplate.vue         |   43 
 applications/task-work-order/src/views/resource/components/spotDetails.vue                                 |    2 
 applications/task-work-order/src/utils/cesium/useBoundary.js                                               |  210 +
 applications/task-work-order/src/assets/images/aiNowFly/full-charge.svg                                    |   13 
 applications/task-work-order/src/assets/images/aiNowFly/Frame.png                                          |    0 
 applications/task-work-order/src/assets/images/dataCockpit/right-btn.png                                   |    0 
 applications/task-work-order/src/config/website.js                                                         |   20 
 applications/task-work-order/src/views/dataCockpit/components/CenterContainer.vue                          |  237 +
 applications/task-work-order/src/api/dataCockpit/index.js                                                  |   54 
 applications/task-work-order/src/views/system/menu.vue                                                     |    4 
 applications/task-work-order/src/views/dataCockpit/components/EquipmentWarning.vue                         |  101 
 applications/task-work-order/src/utils/cesium/frustum/CesiumVideoFrustum.js                                |  712 ++++
 applications/task-work-order/src/assets/images/aiNowFly/medium-battery.svg                                 |    6 
 applications/task-work-order/package.json                                                                  |    1 
 applications/task-work-order/src/assets/images/aiNowFly/fly.png                                            |    0 
 applications/task-work-order/src/views/dataCockpit/components/templateComponents/EquipmentTemplate.vue     |  171 +
 /dev/null                                                                                                  |  303 --
 applications/task-work-order/src/views/system/user/index.vue                                               |  504 +++
 applications/drone-command/src/assets/images/dataCockpit/device-zc.svg                                     |   76 
 applications/drone-command/src/views/basicManage/deviceStock/index.vue                                     |   19 
 applications/task-work-order/src/assets/images/dataCockpit/title-bg.png                                    |    0 
 applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue       |  196 +
 applications/task-work-order/src/assets/images/dataCockpit/map/equipment.png                               |    0 
 applications/mobile-web-view/package.json                                                                  |    1 
 applications/task-work-order/src/assets/images/aiNowFly/low-battery.svg                                    |    6 
 75 files changed, 7,318 insertions(+), 1,256 deletions(-)

diff --git a/applications/drone-command/package.json b/applications/drone-command/package.json
index 287ccae..75c3b88 100644
--- a/applications/drone-command/package.json
+++ b/applications/drone-command/package.json
@@ -73,7 +73,6 @@
     "@vitejs/plugin-vue": "catalog:",
     "@vue/compiler-sfc": "catalog:",
     "postcss-pxtorem": "catalog:",
-    "prettier": "catalog:",
     "sass": "catalog:",
     "terser": "catalog:",
     "unplugin-auto-import": "catalog:",
diff --git a/applications/drone-command/src/assets/images/dataCockpit/device-fz.svg b/applications/drone-command/src/assets/images/dataCockpit/device-fz.svg
new file mode 100644
index 0000000..3b8dc64
--- /dev/null
+++ b/applications/drone-command/src/assets/images/dataCockpit/device-fz.svg
@@ -0,0 +1,66 @@
+<svg width="30" height="42" viewBox="0 0 30 42" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Group 2136637024">
+<g id="Group 2136636871">
+<g id="Ellipse 115">
+<g filter="url(#filter0_i_201_2895)">
+<circle cx="15.0204" cy="14.9795" r="14.9795" fill="#082389"/>
+<circle cx="15.0204" cy="14.9795" r="14.9795" fill="url(#paint0_linear_201_2895)" style="mix-blend-mode:overlay"/>
+<circle cx="15.0204" cy="14.9795" r="14.9795" fill="url(#paint1_linear_201_2895)" style="mix-blend-mode:overlay"/>
+</g>
+<circle cx="15.0204" cy="14.9795" r="14.4795" stroke="white" style="mix-blend-mode:overlay"/>
+</g>
+<g id="Frame">
+<path id="Vector" d="M22.3395 20.5666C22.3395 21.2157 21.8137 21.7416 21.1644 21.7416H9.414C8.76486 21.7416 8.23898 21.2157 8.23898 20.5666V17.3352C8.23898 16.686 8.76488 16.1601 9.41401 16.1601H14.611V13.0757C14.611 12.6703 14.94 12.3412 15.3453 12.3412C15.7507 12.3412 16.0797 12.6703 16.0797 13.0757V16.1601H21.1644C21.8135 16.1601 22.3394 16.686 22.3394 17.3353L22.3395 20.5666ZM20.8707 18.9509C20.8707 18.5455 20.5417 18.2165 20.1362 18.2165C19.7309 18.2165 19.4019 18.5455 19.4019 18.9509C19.4019 19.3562 19.7309 19.6853 20.1362 19.6853C20.5417 19.6853 20.8707 19.3562 20.8707 18.9509ZM18.2268 18.9509C18.2268 18.5455 17.8978 18.2165 17.4925 18.2165C17.0871 18.2165 16.758 18.5455 16.758 18.9509C16.758 19.3562 17.0871 19.6853 17.4924 19.6853C17.8978 19.6853 18.2268 19.3562 18.2268 18.9509ZM15.3454 9.99116C17.0492 9.99116 18.4298 11.3719 18.4298 13.0757C18.4298 13.4811 18.1008 13.8101 17.6954 13.8101C17.29 13.8101 16.9611 13.4811 16.9611 13.0757C16.9611 12.1826 16.2384 11.46 15.3453 11.46C14.4523 11.46 13.7297 12.1826 13.7297 13.0757C13.7297 13.4811 13.4006 13.8101 12.9953 13.8101C12.5899 13.8101 12.2609 13.4811 12.2609 13.0757C12.2608 11.3719 13.6415 9.99116 15.3454 9.99116ZM15.3454 7.64111C18.3476 7.64111 20.7799 10.0735 20.7799 13.0757C20.7799 13.4811 20.451 13.8101 20.0455 13.8101C19.6401 13.8101 19.3111 13.4811 19.3111 13.0757C19.3111 10.8842 17.5368 9.10997 15.3454 9.10997C13.154 9.10997 11.3796 10.8842 11.3796 13.0757C11.3796 13.4811 11.0505 13.8101 10.6452 13.8101C10.2398 13.8101 9.91081 13.4811 9.91081 13.0757C9.91081 10.0735 12.3429 7.64111 15.3454 7.64111Z" fill="url(#paint2_linear_201_2895)"/>
+</g>
+</g>
+<g id="Group 2136637016">
+<g id="&#232;&#183;&#175;&#229;&#190;&#132;">
+<g filter="url(#filter1_i_201_2895)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M14.959 36C12.4796 36 10.4713 36.8438 10.4713 37.875C10.4713 38.9062 12.4796 39.75 14.959 39.75C17.4385 39.75 19.4468 38.9062 19.4468 37.875C19.4468 36.8438 17.4385 36 14.959 36Z" fill="#0A3BFF" fill-opacity="0.588235"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M14.959 36C12.4796 36 10.4713 36.8438 10.4713 37.875C10.4713 38.9062 12.4796 39.75 14.959 39.75C17.4385 39.75 19.4468 38.9062 19.4468 37.875C19.4468 36.8438 17.4385 36 14.959 36Z" stroke="#518EFF" stroke-width="0.4"/>
+</g>
+<path id="&#232;&#183;&#175;&#229;&#190;&#132;_2" opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M14.9591 33.75C6.6942 33.75 0 35.598 0 37.875C0 40.152 6.6942 42 14.9591 42C23.224 42 29.9182 40.152 29.9182 37.875C29.9182 35.598 23.224 33.75 14.9591 33.75V33.75Z" stroke="#518EFF" stroke-width="0.6"/>
+<path id="&#232;&#183;&#175;&#229;&#190;&#132;_3" fill-rule="evenodd" clip-rule="evenodd" d="M14.9591 35.25C9.58694 35.25 5.23572 36.4225 5.23572 37.875C5.23572 39.3275 9.58694 40.5 14.9591 40.5C20.3313 40.5 24.6825 39.3275 24.6825 37.875C24.6825 36.4225 20.3313 35.25 14.9591 35.25V35.25Z" stroke="#518EFF" stroke-width="0.6"/>
+<path id="&#232;&#183;&#175;&#229;&#190;&#132;_4" fill-rule="evenodd" clip-rule="evenodd" d="M14.2111 31.5V37.5H15.707V31.5H14.2111Z" fill="url(#paint3_linear_201_2895)"/>
+</g>
+</g>
+<defs>
+<filter id="filter0_i_201_2895" x="0.0408936" y="0" width="29.9591" height="29.9591" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset/>
+<feGaussianBlur stdDeviation="4.5"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
+<feBlend mode="overlay" in2="shape" result="effect1_innerShadow_201_2895"/>
+</filter>
+<filter id="filter1_i_201_2895" x="10.2714" y="35.8" width="9.37537" height="5.1499" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="0.5"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.005478 0 0 0 0 0.0928216 0 0 0 0 0.379808 0 0 0 0.239216 0"/>
+<feBlend mode="normal" in2="shape" result="effect1_innerShadow_201_2895"/>
+</filter>
+<linearGradient id="paint0_linear_201_2895" x1="15.0204" y1="0" x2="15.0204" y2="29.9591" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint1_linear_201_2895" x1="15.0204" y1="0" x2="15.0204" y2="29.9591" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint2_linear_201_2895" x1="15.2892" y1="7.64111" x2="15.2892" y2="21.7416" gradientUnits="userSpaceOnUse">
+<stop stop-color="white"/>
+<stop offset="1" stop-color="#A2F2FB"/>
+</linearGradient>
+<linearGradient id="paint3_linear_201_2895" x1="17.2029" y1="37.5" x2="17.2029" y2="31.5" gradientUnits="userSpaceOnUse">
+<stop stop-color="#0A3BFF" stop-opacity="0.01"/>
+<stop offset="1" stop-color="#0A3BFF"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/applications/drone-command/src/assets/images/dataCockpit/device-wrj.svg b/applications/drone-command/src/assets/images/dataCockpit/device-wrj.svg
new file mode 100644
index 0000000..68ff1a2
--- /dev/null
+++ b/applications/drone-command/src/assets/images/dataCockpit/device-wrj.svg
@@ -0,0 +1,49 @@
+<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Group 2136637030">
+<g id="Ellipse 120">
+<g filter="url(#filter0_i_205_3058)">
+<circle cx="15" cy="15" r="15" fill="#38100A"/>
+<circle cx="15" cy="15" r="15" fill="url(#paint0_linear_205_3058)" style="mix-blend-mode:overlay"/>
+<circle cx="15" cy="15" r="15" fill="url(#paint1_linear_205_3058)" style="mix-blend-mode:overlay"/>
+</g>
+<circle cx="15" cy="15" r="14.5" stroke="white" style="mix-blend-mode:overlay"/>
+</g>
+<g id="Frame" clip-path="url(#clip0_205_3058)">
+<g id="Group 1321318248">
+<path id="Vector" d="M24.5173 11.5642C24.5173 11.3706 22.2846 11.2128 21.1002 11.1927V11.0749C21.1002 10.9977 21.0731 10.9237 21.0248 10.8691C20.9766 10.8145 20.9111 10.7838 20.8429 10.7838C20.7747 10.7838 20.7092 10.8145 20.661 10.8691C20.6128 10.9237 20.5856 10.9977 20.5856 11.0749V11.1927C19.4013 11.2128 17.1686 11.3706 17.1686 11.5642C17.1686 11.7585 19.4013 11.9163 20.5856 11.9365V13.1597H17.7198C17.5046 12.786 17.1361 12.5313 16.7065 12.5313H13.735C13.3054 12.5313 12.937 12.786 12.7217 13.1597H9.85593V11.9364C11.0403 11.9163 13.273 11.7585 13.273 11.5642C13.273 11.3706 11.0403 11.2127 9.85593 11.1926V11.0749C9.85593 10.9977 9.82883 10.9237 9.78058 10.8691C9.73233 10.8145 9.66689 10.7838 9.59866 10.7838C9.53043 10.7838 9.46499 10.8145 9.41674 10.8691C9.3685 10.9237 9.34139 10.9977 9.34139 11.0749V11.1926C8.15702 11.2127 5.92432 11.3706 5.92432 11.5642C5.92432 11.7585 8.15702 11.9163 9.34139 11.9365V13.1597H8.47017C8.14381 13.1597 8.07472 13.6794 8.38594 13.7889L11.8782 15.2562L10.5511 18.2921C10.4722 18.4763 10.4543 18.6865 10.5008 18.8844C10.5473 19.0823 10.6648 19.1999 10.8044 19.3702C11.1129 19.7465 11.6502 19.9449 11.6502 19.9449C11.8782 20.104 12.068 20.0383 12.1534 19.8333C12.2251 19.6612 12.1546 19.4577 12.0381 19.3702L11.4005 18.8852C11.3548 18.8495 11.3219 18.7965 11.3076 18.7358C11.2934 18.675 11.2988 18.6105 11.3228 18.5539L12.6151 15.5043L12.6835 15.5282L12.9112 16.9647C12.92 17.0479 12.9471 17.1272 12.99 17.1955C13.0328 17.2638 13.0901 17.3188 13.1567 17.3556L15.0273 18.386C15.0875 18.4194 15.1537 18.4368 15.2207 18.4368C15.2878 18.4368 15.354 18.4194 15.4142 18.386L17.2849 17.3555C17.3514 17.3187 17.4087 17.2637 17.4516 17.1954C17.4944 17.1271 17.5215 17.0478 17.5303 16.9646L17.7579 15.5281L17.8264 15.5042L19.1187 18.5538C19.1429 18.6103 19.1484 18.6747 19.1342 18.7354C19.1199 18.7961 19.0868 18.849 19.041 18.8844L18.3593 19.4159C18.237 19.5113 18.1613 19.7578 18.2497 19.9449C18.3642 20.1871 18.8003 20.0514 18.9369 19.9449L19.727 19.4159C19.8764 19.3003 19.9841 19.128 20.0307 18.9302C20.0773 18.7324 20.0597 18.5222 19.981 18.3378L18.6581 15.2225L22.0555 13.7889C22.3668 13.6794 22.2977 13.1597 21.9713 13.1597H21.1001V11.9364C22.2845 11.9163 24.5173 11.7585 24.5173 11.5642ZM15.2207 17.1954C14.5733 17.1954 14.0587 16.6417 14.0587 16.0131C14.0587 15.432 14.579 14.851 15.2208 14.851C15.8626 14.851 16.3964 15.3714 16.3828 16.0131C16.3695 16.6416 15.8681 17.1954 15.2207 17.1954Z" fill="url(#paint2_linear_205_3058)"/>
+<path id="Vector_2" d="M14.6398 16.013C14.6398 16.0893 14.6548 16.1649 14.684 16.2354C14.7132 16.3059 14.756 16.3699 14.8099 16.4239C14.8639 16.4778 14.9279 16.5206 14.9984 16.5498C15.0689 16.579 15.1445 16.5941 15.2208 16.5941C15.2971 16.5941 15.3727 16.579 15.4432 16.5498C15.5137 16.5206 15.5777 16.4778 15.6317 16.4239C15.6856 16.3699 15.7284 16.3059 15.7576 16.2354C15.7868 16.1649 15.8018 16.0893 15.8018 16.013C15.8018 15.9367 15.7868 15.8612 15.7576 15.7907C15.7284 15.7202 15.6856 15.6561 15.6317 15.6022C15.5777 15.5482 15.5137 15.5054 15.4432 15.4762C15.3727 15.447 15.2971 15.432 15.2208 15.432C15.1445 15.432 15.0689 15.447 14.9984 15.4762C14.9279 15.5054 14.8639 15.5482 14.8099 15.6022C14.756 15.6561 14.7132 15.7202 14.684 15.7907C14.6548 15.8612 14.6398 15.9367 14.6398 16.013Z" fill="url(#paint3_linear_205_3058)"/>
+</g>
+</g>
+</g>
+<defs>
+<filter id="filter0_i_205_3058" x="0" y="0" width="30" height="30" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset/>
+<feGaussianBlur stdDeviation="4.5"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
+<feBlend mode="overlay" in2="shape" result="effect1_innerShadow_205_3058"/>
+</filter>
+<linearGradient id="paint0_linear_205_3058" x1="15" y1="0" x2="15" y2="30" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint1_linear_205_3058" x1="15" y1="0" x2="15" y2="30" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint2_linear_205_3058" x1="15.2208" y1="20.0803" x2="15.2208" y2="10.7838" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FCFEFF"/>
+<stop offset="1" stop-color="#FBB6A5"/>
+</linearGradient>
+<linearGradient id="paint3_linear_205_3058" x1="15.2208" y1="16.5941" x2="15.2208" y2="15.432" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FCFEFF"/>
+<stop offset="1" stop-color="#FBB6A5"/>
+</linearGradient>
+<clipPath id="clip0_205_3058">
+<rect width="18.75" height="18.75" fill="white" transform="matrix(-1 0 0 1 24.6997 5.44312)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/applications/drone-command/src/assets/images/dataCockpit/device-zc.svg b/applications/drone-command/src/assets/images/dataCockpit/device-zc.svg
new file mode 100644
index 0000000..22cb68c
--- /dev/null
+++ b/applications/drone-command/src/assets/images/dataCockpit/device-zc.svg
@@ -0,0 +1,76 @@
+<svg width="30" height="42" viewBox="0 0 30 42" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Group 2136637029">
+<g id="Group 2136636871">
+<g id="Ellipse 115">
+<g filter="url(#filter0_i_205_3029)">
+<circle cx="15.0204" cy="14.9795" r="14.9795" fill="#002624"/>
+<circle cx="15.0204" cy="14.9795" r="14.9795" fill="url(#paint0_linear_205_3029)" style="mix-blend-mode:overlay"/>
+<circle cx="15.0204" cy="14.9795" r="14.9795" fill="url(#paint1_linear_205_3029)" style="mix-blend-mode:overlay"/>
+</g>
+<circle cx="15.0204" cy="14.9795" r="14.4795" stroke="white" style="mix-blend-mode:overlay"/>
+</g>
+<g id="Frame">
+<g id="Frame_2" clip-path="url(#clip0_205_3029)">
+<g id="Frame_3" clip-path="url(#clip1_205_3029)">
+<path id="Vector" d="M14.9991 16.3575L10.7982 21.959H19.2L14.9991 16.3575ZM20.1788 9.3562L19.1438 10.2984C20.0832 11.3285 20.6029 12.673 20.6007 14.0671C20.6027 15.461 20.083 16.805 19.1438 17.8349L20.1797 18.7762C21.3533 17.4889 22.0027 15.8091 22.0004 14.0671C22.0004 12.2531 21.3104 10.5993 20.1788 9.3562ZM9.81942 9.3562C8.64503 10.6438 7.9952 12.3244 7.99786 14.0671C7.99525 15.809 8.64435 17.4887 9.81755 18.7762L10.8544 17.834C9.91548 16.8043 9.39579 15.4606 9.39755 14.0671C9.39555 12.6733 9.91527 11.3292 10.8544 10.2993L9.81849 9.3562H9.81942ZM18.1069 11.2406L17.071 12.1828C17.5397 12.6984 17.8004 13.3696 17.7994 14.0662C17.7994 14.7918 17.5238 15.4528 17.071 15.9506L18.1079 16.8928C18.812 16.1203 19.2016 15.1124 19.2 14.0671C19.2 12.9778 18.7857 11.9859 18.1079 11.2406H18.1069ZM11.8904 11.2406C11.186 12.0133 10.7964 13.0216 10.7982 14.0671C10.7965 15.1121 11.1861 16.1198 11.8904 16.8918L12.9263 15.9506C12.4575 15.435 12.1979 14.7637 12.1988 14.0662C12.1988 13.3415 12.4744 12.6806 12.9263 12.1837L11.8904 11.2415V11.2406ZM14.9991 12.6675C14.8122 12.6626 14.6262 12.6953 14.4521 12.7634C14.278 12.8316 14.1193 12.934 13.9854 13.0645C13.8515 13.195 13.745 13.351 13.6724 13.5233C13.5997 13.6955 13.5623 13.8806 13.5623 14.0676C13.5623 14.2546 13.5997 14.4397 13.6724 14.612C13.745 14.7842 13.8515 14.9402 13.9854 15.0707C14.1193 15.2012 14.278 15.3036 14.4521 15.3718C14.6262 15.44 14.8122 15.4726 14.9991 15.4678C15.3642 15.4583 15.7111 15.3067 15.966 15.0451C16.2209 14.7836 16.3635 14.4328 16.3635 14.0676C16.3635 13.7024 16.2209 13.3517 15.966 13.0901C15.7111 12.8286 15.3642 12.6769 14.9991 12.6675Z" fill="url(#paint2_linear_205_3029)"/>
+</g>
+</g>
+</g>
+</g>
+<g id="Group 2136637016">
+<g id="&#232;&#183;&#175;&#229;&#190;&#132;">
+<g filter="url(#filter1_i_205_3029)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M14.959 36C12.4796 36 10.4713 36.8438 10.4713 37.875C10.4713 38.9062 12.4796 39.75 14.959 39.75C17.4385 39.75 19.4468 38.9062 19.4468 37.875C19.4468 36.8438 17.4385 36 14.959 36Z" fill="#159DAD" fill-opacity="0.588235"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M14.959 36C12.4796 36 10.4713 36.8438 10.4713 37.875C10.4713 38.9062 12.4796 39.75 14.959 39.75C17.4385 39.75 19.4468 38.9062 19.4468 37.875C19.4468 36.8438 17.4385 36 14.959 36Z" stroke="#01DEF7" stroke-width="0.4"/>
+</g>
+<path id="&#232;&#183;&#175;&#229;&#190;&#132;_2" opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M14.9591 33.75C6.6942 33.75 0 35.598 0 37.875C0 40.152 6.6942 42 14.9591 42C23.224 42 29.9182 40.152 29.9182 37.875C29.9182 35.598 23.224 33.75 14.9591 33.75V33.75Z" stroke="#01DEF7" stroke-width="0.6"/>
+<path id="&#232;&#183;&#175;&#229;&#190;&#132;_3" fill-rule="evenodd" clip-rule="evenodd" d="M14.9591 35.25C9.58694 35.25 5.23572 36.4225 5.23572 37.875C5.23572 39.3275 9.58694 40.5 14.9591 40.5C20.3313 40.5 24.6825 39.3275 24.6825 37.875C24.6825 36.4225 20.3313 35.25 14.9591 35.25V35.25Z" stroke="#01DEF7" stroke-width="0.6"/>
+<path id="&#232;&#183;&#175;&#229;&#190;&#132;_4" fill-rule="evenodd" clip-rule="evenodd" d="M14.2111 31.5V37.5H15.707V31.5H14.2111Z" fill="url(#paint3_linear_205_3029)"/>
+</g>
+</g>
+<defs>
+<filter id="filter0_i_205_3029" x="0.0408936" y="0" width="29.9591" height="29.9591" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset/>
+<feGaussianBlur stdDeviation="4.5"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0"/>
+<feBlend mode="overlay" in2="shape" result="effect1_innerShadow_205_3029"/>
+</filter>
+<filter id="filter1_i_205_3029" x="10.2714" y="35.8" width="9.37537" height="5.1499" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="0.5"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.005478 0 0 0 0 0.0928216 0 0 0 0 0.379808 0 0 0 0.239216 0"/>
+<feBlend mode="normal" in2="shape" result="effect1_innerShadow_205_3029"/>
+</filter>
+<linearGradient id="paint0_linear_205_3029" x1="15.0204" y1="0" x2="15.0204" y2="29.9591" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint1_linear_205_3029" x1="15.0204" y1="0" x2="15.0204" y2="29.9591" gradientUnits="userSpaceOnUse">
+<stop stop-color="white" stop-opacity="0"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+<linearGradient id="paint2_linear_205_3029" x1="14.9991" y1="21.959" x2="14.9991" y2="9.3562" gradientUnits="userSpaceOnUse">
+<stop stop-color="#ABF3FB"/>
+<stop offset="1" stop-color="#FCFEFF"/>
+</linearGradient>
+<linearGradient id="paint3_linear_205_3029" x1="17.2029" y1="37.5" x2="17.2029" y2="31.5" gradientUnits="userSpaceOnUse">
+<stop stop-color="#01DEF7" stop-opacity="0.01"/>
+<stop offset="1" stop-color="#01DEF7"/>
+</linearGradient>
+<clipPath id="clip0_205_3029">
+<rect width="15" height="15" fill="white" transform="translate(7.5 8.25)"/>
+</clipPath>
+<clipPath id="clip1_205_3029">
+<rect width="15" height="15" fill="white" transform="matrix(-1 0 0 1 22.5 8.25)"/>
+</clipPath>
+</defs>
+</svg>
diff --git a/applications/drone-command/src/assets/images/dataCockpit/device-zhd.svg b/applications/drone-command/src/assets/images/dataCockpit/device-zhd.svg
new file mode 100644
index 0000000..81a6b2b
--- /dev/null
+++ b/applications/drone-command/src/assets/images/dataCockpit/device-zhd.svg
@@ -0,0 +1,63 @@
+<svg width="40" height="56" viewBox="0 0 40 56" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Group 2136637022">
+<g id="Group 2136637020">
+<path id="&#232;&#183;&#175;&#229;&#190;&#132;" opacity="0.5" fill-rule="evenodd" clip-rule="evenodd" d="M20 45.7333C8.95 45.7333 0 48.033 0 50.8666C0 53.7002 8.95 55.9999 20 55.9999C31.05 55.9999 40 53.7002 40 50.8666C40 48.033 31.05 45.7333 20 45.7333V45.7333Z" stroke="#1EF9FD" stroke-width="0.6"/>
+<path id="&#232;&#183;&#175;&#229;&#190;&#132;_2" fill-rule="evenodd" clip-rule="evenodd" d="M20 48C12.8175 48 7 49.34 7 51C7 52.66 12.8175 54 20 54C27.1825 54 33 52.66 33 51C33 49.34 27.1825 48 20 48V48Z" stroke="#1EF9FD" stroke-width="0.6"/>
+<path id="&#232;&#183;&#175;&#229;&#190;&#132;_3" fill-rule="evenodd" clip-rule="evenodd" d="M19 42V50H21V42H19Z" fill="url(#paint0_linear_201_2906)"/>
+<g id="&#232;&#183;&#175;&#229;&#190;&#132;_4">
+<g filter="url(#filter0_i_201_2906)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M20 49C16.685 49 14 49.9 14 51C14 52.1 16.685 53 20 53C23.315 53 26 52.1 26 51C26 49.9 23.315 49 20 49Z" fill="#3DB4C2" fill-opacity="0.588235"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M20 49C16.685 49 14 49.9 14 51C14 52.1 16.685 53 20 53C23.315 53 26 52.1 26 51C26 49.9 23.315 49 20 49Z" stroke="#02E3FC" stroke-width="0.4"/>
+</g>
+</g>
+<g id="Frame 2136637015">
+<g id="Group 2136637019">
+<g id="Group 2136637018">
+<g id="Group 2136637017">
+<path id="&#229;&#189;&#162;&#231;&#138;&#182;_1" fill-rule="evenodd" clip-rule="evenodd" d="M21.1865 37.8053C20.8879 37.9788 20.5662 38.0656 20.2213 38.0656C19.8764 38.0656 19.5547 37.9788 19.2562 37.8053L5.40778 29.76C5.10909 29.5861 4.87354 29.349 4.70118 29.0486C4.52881 28.7482 4.44263 28.4247 4.44263 28.078V11.9873C4.44256 11.6406 4.52875 11.317 4.70114 11.0166C4.87351 10.7163 5.10906 10.4792 5.40778 10.3056L19.2562 2.26025C19.5547 2.08674 19.8764 2 20.2213 2C20.5662 2 20.8879 2.08674 21.1865 2.26025L35.0349 10.3056C35.3335 10.4792 35.569 10.7161 35.7414 11.0165C35.9138 11.3169 36 11.6405 36 11.9873V28.0793C35.9997 28.4258 35.9134 28.7491 35.741 29.0493C35.5687 29.3494 35.3333 29.5863 35.0349 29.76L21.1865 37.8053Z" fill="url(#paint1_linear_201_2906)" stroke="url(#paint2_linear_201_2906)" stroke-width="3"/>
+<path id="&#229;&#189;&#162;&#231;&#138;&#182;_1_&#230;&#139;&#183;&#232;&#180;&#157;_2" opacity="0.3" fill-rule="evenodd" clip-rule="evenodd" d="M21.3504 35.512C21.0899 35.6631 20.8091 35.7387 20.5082 35.7387C20.2072 35.7387 19.9264 35.6631 19.666 35.512L7.57987 28.5045C7.31925 28.3533 7.11374 28.1469 6.96331 27.8854C6.81289 27.6239 6.73767 27.3422 6.73767 27.0403V13.0253C6.7377 12.7234 6.81291 12.4417 6.96334 12.1801C7.11377 11.9186 7.31928 11.7123 7.57987 11.5611L19.666 4.55336C19.9265 4.4023 20.2072 4.32678 20.5082 4.32678C20.8091 4.32678 21.0898 4.4023 21.3504 4.55336L33.4364 11.5611C33.6971 11.7123 33.9026 11.9187 34.053 12.1802C34.2034 12.4417 34.2787 12.7234 34.2787 13.0253V27.0403C34.2786 27.3422 34.2034 27.6239 34.053 27.8854C33.9026 28.147 33.697 28.3533 33.4364 28.5045L21.3504 35.512Z" fill="url(#paint3_linear_201_2906)"/>
+</g>
+</g>
+<g id="Group 2136637018_2">
+<g id="Group 2136637017_2">
+<path id="Vector" d="M23.3913 19.6115C23.7642 19.9799 24.3236 19.9799 24.6966 19.6115L27.4937 16.8484C27.8667 16.48 27.8667 15.9273 27.4937 15.5589L24.6966 12.7958C24.3236 12.4274 23.7642 12.4274 23.3913 12.7958L20.5941 15.5589C20.2212 15.9273 20.2212 16.48 20.5941 16.8484L23.3913 19.6115ZM18.7294 12.7432H13.6146C13.1085 12.7432 12.6823 13.1643 12.6823 13.6642V18.7431C12.6823 19.243 13.1085 19.6641 13.6146 19.6641H18.756C19.2622 19.6641 19.6884 19.243 19.6884 18.7431V13.6642C19.6618 13.1643 19.2355 12.7432 18.7294 12.7432ZM18.7294 20.5851H13.6146C13.1085 20.5851 12.6823 21.0062 12.6823 21.5061V26.585C12.6823 27.085 13.1085 27.506 13.6146 27.506H18.756C19.2622 27.506 19.6884 27.085 19.6884 26.585V21.5061C19.6618 21.0062 19.2355 20.5851 18.7294 20.5851ZM26.6679 20.5851H21.5265C21.0204 20.5851 20.5941 21.0062 20.5941 21.5061V26.585C20.5941 27.085 21.0204 27.506 21.5265 27.506H26.6679C27.1741 27.506 27.6003 27.085 27.6003 26.585V21.5061C27.6003 21.0062 27.1741 20.5851 26.6679 20.5851Z" fill="url(#paint4_linear_201_2906)"/>
+</g>
+</g>
+</g>
+</g>
+</g>
+<defs>
+<filter id="filter0_i_201_2906" x="13.8" y="48.8" width="12.3999" height="5.3999" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="1"/>
+<feGaussianBlur stdDeviation="0.5"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0.005478 0 0 0 0 0.0928216 0 0 0 0 0.379808 0 0 0 0.239216 0"/>
+<feBlend mode="normal" in2="shape" result="effect1_innerShadow_201_2906"/>
+</filter>
+<linearGradient id="paint0_linear_201_2906" x1="23" y1="50" x2="23" y2="42" gradientUnits="userSpaceOnUse">
+<stop stop-color="#02E3FC" stop-opacity="0.01"/>
+<stop offset="1" stop-color="#01F7F7"/>
+</linearGradient>
+<linearGradient id="paint1_linear_201_2906" x1="35.9969" y1="38.0655" x2="35.9969" y2="2.00703" gradientUnits="userSpaceOnUse">
+<stop stop-color="#08393C"/>
+<stop offset="0.994" stop-color="#007874"/>
+<stop offset="1" stop-color="#007874"/>
+</linearGradient>
+<linearGradient id="paint2_linear_201_2906" x1="35.9969" y1="38.0655" x2="35.9969" y2="2.00703" gradientUnits="userSpaceOnUse">
+<stop stop-color="#1A6B6C"/>
+<stop offset="1" stop-color="#C3FFFE"/>
+</linearGradient>
+<linearGradient id="paint3_linear_201_2906" x1="34.2787" y1="35.7411" x2="34.2787" y2="4.32907" gradientUnits="userSpaceOnUse">
+<stop stop-color="#0C656E" stop-opacity="0.01"/>
+<stop offset="1"/>
+</linearGradient>
+<linearGradient id="paint4_linear_201_2906" x1="20.2278" y1="12.5195" x2="20.2278" y2="27.506" gradientUnits="userSpaceOnUse">
+<stop stop-color="#4AB8B5"/>
+<stop offset="1" stop-color="#DAFAFB"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/applications/drone-command/src/views/basicManage/deviceScrap/index.vue b/applications/drone-command/src/views/basicManage/deviceScrap/index.vue
index d843ada..7ab4213 100644
--- a/applications/drone-command/src/views/basicManage/deviceScrap/index.vue
+++ b/applications/drone-command/src/views/basicManage/deviceScrap/index.vue
@@ -2,22 +2,45 @@
 	<basic-container>
 		<el-form ref="queryParamsRef" :model="searchParams" class="ztzf-page-history-search">
 			<el-form-item label="设备名称" prop="deviceName">
-				<el-input class="ztzf-data-cockpit-search-input" v-model="searchParams.deviceName" placeholder="请输入"
-					clearable @clear="handleSearch" />
+				<el-input
+					class="ztzf-data-cockpit-search-input"
+					v-model="searchParams.deviceName"
+					placeholder="请输入"
+					clearable
+					@clear="handleSearch"
+				/>
 			</el-form-item>
 
 			<el-form-item label="设备类型" prop="deviceType">
-				<el-select class="ztzf-data-cockpit-select" popper-class="ztzf-data-cockpit-select-popper"
-					v-model="searchParams.deviceType" placeholder="请选择" clearable @change="handleSearch">
-					<el-option v-for="item in dictObj.deviceType" :key="item.dictKey" :label="item.dictValue"
-						:value="item.dictKey" />
+				<el-select
+					class="ztzf-data-cockpit-select"
+					popper-class="ztzf-data-cockpit-select-popper"
+					v-model="searchParams.deviceType"
+					placeholder="请选择"
+					clearable
+					@change="handleSearch"
+				>
+					<el-option
+						v-for="item in dictObj.deviceType"
+						:key="item.dictKey"
+						:label="item.dictValue"
+						:value="item.dictKey"
+					/>
 				</el-select>
 			</el-form-item>
 
 			<el-form-item label="所属部门" prop="belongDept">
-				<el-tree-select class="ztzf-data-cockpit-select" popper-class="ztzf-data-cockpit-tree-select-popper"
-					v-model="searchParams.belongDept" :data="deptTree" :props="treeProps" node-key="id" check-strictly
-					clearable @change="handleSearch" />
+				<el-tree-select
+					class="ztzf-data-cockpit-select"
+					popper-class="ztzf-data-cockpit-tree-select-popper"
+					v-model="searchParams.belongDept"
+					:data="deptTree"
+					:props="treeProps"
+					node-key="id"
+					check-strictly
+					clearable
+					@change="handleSearch"
+				/>
 			</el-form-item>
 
 			<el-form-item class="history-search-actions">
@@ -42,7 +65,11 @@
 					<el-table-column prop="source" show-overflow-tooltip label="来源" />
 					<el-table-column prop="belongDeptName" show-overflow-tooltip label="所属部门" />
 					<el-table-column prop="charger" show-overflow-tooltip label="负责人" />
-					<el-table-column prop="scrapTime" show-overflow-tooltip label="报废时间" />
+					<el-table-column prop="scrapTime" show-overflow-tooltip label="报废时间">
+						<template v-slot="{ row }">
+							{{dayjs(row.scrapTime).format('YYYY-MM-DD')}}
+						</template>
+					</el-table-column>
 					<el-table-column prop="scrapReason" show-overflow-tooltip label="报废原因" />
 					<el-table-column prop="disposeWay" show-overflow-tooltip label="处置方式" />
 					<el-table-column label="操作" class-name="operation-btns">
@@ -54,9 +81,14 @@
 			</div>
 
 			<div class="ztzf-table-pagination">
-				<el-pagination popper-class="ztzf-data-cockpit-select-popper"
-					v-model:current-page="searchParams.current" v-model:page-size="searchParams.size"
-					layout="total, prev, pager, next, sizes" :total="total" @change="getList" />
+				<el-pagination
+					popper-class="ztzf-data-cockpit-select-popper"
+					v-model:current-page="searchParams.current"
+					v-model:page-size="searchParams.size"
+					layout="total, prev, pager, next, sizes"
+					:total="total"
+					@change="getList"
+				/>
 			</div>
 		</div>
 
@@ -73,6 +105,7 @@
 import FormDiaLog from './FormDiaLog.vue'
 import MaintenanceDiaLog from '@/views/basicManage/maintainRecord/MaintenanceDiaLog.vue'
 import { fwDeviceScrapPageApi } from '@/views/basicManage/deviceStock/fwDeviceScrapApi'
+import dayjs from 'dayjs'
 
 const initSearchParams = () => ({
 	deviceName: '', // 设备名称
@@ -106,7 +139,7 @@
 provide('planCycleOptions', planCycleOptions)
 
 // 获取列表
-async function getList () {
+async function getList() {
 	loading.value = true
 	try {
 		const res = await fwDeviceScrapPageApi(searchParams.value)
@@ -118,43 +151,43 @@
 }
 
 // 查询
-function handleSearch () {
+function handleSearch() {
 	searchParams.value.current = 1
 	getList()
 }
 
 // 重置查询
-function resetForm () {
+function resetForm() {
 	queryParamsRef.value?.resetFields()
 	searchParams.value.current = 1
 	getList()
 }
 
 // 查看
-function handleView (row) {
+function handleView(row) {
 	dialogRef.value?.open({ mode: 'view', row: { ...row } })
 }
 
 // 获取字典
-function getDictList () {
+function getDictList() {
 	getDictionaryByCode('deviceType,deviceAtt').then(res => {
 		dictObj.value = res.data.data
 	})
 }
 
 // 获取部门树
-function getDeptTreeFun () {
+function getDeptTreeFun() {
 	getDeptTree().then(res => {
 		deptTree.value = res.data.data
 	})
 }
 
 // 新增
-function handleAdd () {
+function handleAdd() {
 	dialogRef.value?.open({ mode: 'add' })
 }
 
-function getPlanCycleLabel (row) {
+function getPlanCycleLabel(row) {
 	const item = planCycleOptions.find(option => option.value === row.planCycleType)
 	return item?.label + '-' + row.planCycleValue.join(',')
 }
diff --git a/applications/drone-command/src/views/basicManage/deviceStock/DeviceScrapDiaLog.vue b/applications/drone-command/src/views/basicManage/deviceStock/DeviceScrapDiaLog.vue
index 49bb872..a31d43e 100644
--- a/applications/drone-command/src/views/basicManage/deviceStock/DeviceScrapDiaLog.vue
+++ b/applications/drone-command/src/views/basicManage/deviceStock/DeviceScrapDiaLog.vue
@@ -16,7 +16,7 @@
 					<el-form-item label="报废时间" prop="scrapTime">
 						<el-date-picker class="ztzf-data-cockpit-date-picker" popper-class="ztzf-data-cockpit-date-picker-popper"
 							v-model="formData.scrapTime"
-							type="date"
+							type="datetime"
 							placeholder="选择日期"
 							value-format="YYYY-MM-DD HH:mm:ss"
 							clearable
diff --git a/applications/drone-command/src/views/basicManage/deviceStock/index.vue b/applications/drone-command/src/views/basicManage/deviceStock/index.vue
index 8874ad0..b97c497 100644
--- a/applications/drone-command/src/views/basicManage/deviceStock/index.vue
+++ b/applications/drone-command/src/views/basicManage/deviceStock/index.vue
@@ -48,21 +48,6 @@
 					@change="handleSearch"
 				/>
 			</el-form-item>
-
-			<el-form-item label="时间">
-				<el-date-picker
-					popper-class="ztzf-data-cockpit-date-picker-popper"
-					class="ztzf-data-cockpit-date-picker"
-					v-model="dateRange"
-					type="daterange"
-					range-separator="至"
-					start-placeholder="开始日期"
-					end-placeholder="结束日期"
-					value-format="YYYY-MM-DD HH:mm:ss"
-					@change="handleSearch"
-				/>
-			</el-form-item>
-
 			<el-form-item class="history-search-actions">
 				<el-button :icon="RefreshRight" @click="resetForm"></el-button>
 				<el-button class="search-btn" :icon="Search" @click="handleSearch"></el-button>
@@ -71,7 +56,6 @@
 
 		<div class="ztzf-table-toolbar">
 			<el-button :icon="Plus" color="#284FE3" type="primary" @click="handleAdd">设备建档</el-button>
-			<el-button :icon="Download" color="#1A2652" type="primary" @click="exportFile" :loading="exportLoading">导出</el-button>
 			<!--			<el-button type="danger" :disabled="!selectedIds.length" @click="handleDelete()">删除</el-button>-->
 		</div>
 
@@ -91,7 +75,7 @@
 					<el-table-column prop="manufacturer" show-overflow-tooltip width="130" label="生产厂商" />
 					<el-table-column prop="createTime" show-overflow-tooltip width="96" label="入库时间">
 						<template v-slot="{ row }">
-							{{ formatDateToSlash(row.createTime) }}
+							{{ dayjs(row.createTime).format('YYYY-MM-DD') }}
 						</template>
 					</el-table-column>
 					<el-table-column prop="source" show-overflow-tooltip width="112" label="来源" />
@@ -147,6 +131,7 @@
 import DeviceChart1 from '@/views/basicManage/deviceStock/DeviceChart1.vue'
 import DeviceChart2 from '@/views/basicManage/deviceStock/DeviceChart2.vue'
 import DeviceChart3 from '@/views/basicManage/deviceStock/DeviceChart3.vue'
+import dayjs from 'dayjs'
 
 const initSearchParams = () => ({
 	deviceName: '', // 设备名称
diff --git a/applications/drone-command/src/views/basicManage/maintainRecord/MaintenanceDiaLog.vue b/applications/drone-command/src/views/basicManage/maintainRecord/MaintenanceDiaLog.vue
index 52af6f6..ab5d00c 100644
--- a/applications/drone-command/src/views/basicManage/maintainRecord/MaintenanceDiaLog.vue
+++ b/applications/drone-command/src/views/basicManage/maintainRecord/MaintenanceDiaLog.vue
@@ -1,6 +1,11 @@
 <template>
-	<el-dialog class="ztzf-page-view-dialog" v-model="visible" :title="titleEnum[dialogMode]" @closed="handleClosed"
-		destroy-on-close>
+	<el-dialog
+		class="ztzf-page-view-dialog"
+		v-model="visible"
+		:title="titleEnum[dialogMode]"
+		@closed="handleClosed"
+		destroy-on-close
+	>
 		<div class="detail-container" v-if="dialogReadonly">
 			<div class="detail-title">设备详情</div>
 			<el-row>
@@ -14,8 +19,15 @@
 				</el-col>
 			</el-row>
 		</div>
-		<el-form class="dialog-form" v-else ref="formRef" :model="formData" :rules="rules"
-			:disabled="dialogReadonly" label-width="110px">
+		<el-form
+			class="dialog-form"
+			v-else
+			ref="formRef"
+			:model="formData"
+			:rules="rules"
+			:disabled="dialogReadonly"
+			label-width="110px"
+		>
 			<el-row>
 				<el-col :span="24">
 					<el-form-item label="维护内容" prop="maintainContent">
@@ -47,7 +59,7 @@
 							class="ztzf-data-cockpit-date-picker"
 							popper-class="ztzf-data-cockpit-date-picker-popper"
 							v-model="formData.maintainTime"
-							type="date"
+							type="datetime"
 							placeholder="选择日期"
 							value-format="YYYY-MM-DD HH:mm:ss"
 							clearable
@@ -102,7 +114,7 @@
 const deviceList = ref([]) // 设备列表
 
 const dialogReadonly = computed(() => dialogMode.value === 'view')
-const titleEnum = ref({ edit: '编辑', view: '查看', add: '维护计划' })
+const titleEnum = ref({ edit: '维护', view: '查看', add: '维护计划' })
 
 const planCycleLabel = computed(() => {
 	const item = planCycleOptions.find(option => option.value === formData.value.planCycleType)
diff --git a/applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue b/applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue
index 8d026e2..c03f4ae 100644
--- a/applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue
+++ b/applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue
@@ -1,6 +1,12 @@
 <template>
-	<el-dialog v-model="visible" class="ztzf-page-map-view-dialog" :show-close="false" :close-on-click-modal="false"
-		destroy-on-close @closed="handleClosed">
+	<el-dialog
+		v-model="visible"
+		class="ztzf-page-map-view-dialog"
+		:show-close="false"
+		:close-on-click-modal="false"
+		destroy-on-close
+		@closed="handleClosed"
+	>
 		<div class="dialog-container">
 			<div class="left-container">
 				<div class="leftMap ztzf-cesium" id="detectionRangeMap"></div>
@@ -32,52 +38,90 @@
 							<div class="val">{{ formData.deviceModel || '-' }}</div>
 						</el-col>
 						<el-col :span="24">
-							<div class="label">覆盖范围</div>
+							<div class="label">覆盖范围(m)</div>
 							<div class="val">{{ formatRange(formData.effectiveRangeKm) }}</div>
 						</el-col>
 					</el-row>
 				</div>
 
-				<el-form v-else ref="formRef" class="dialog-form" :model="formData" :rules="rules" label-width="96px">
+				<el-form v-else ref="formRef" class="dialog-form" :model="formData" :rules="rules" label-width="110px">
 					<el-form-item label="侦测设备" prop="deviceId">
-						<el-select class="ztzf-data-cockpit-select" popper-class="ztzf-data-cockpit-select-popper"
-							v-model="formData.deviceId" placeholder="请选择" clearable @change="handleDeviceChange">
-							<el-option v-for="item in deviceOptions" :key="item.value" :label="item.label"
-								:value="item.value" />
+						<el-select
+							class="ztzf-data-cockpit-select"
+							popper-class="ztzf-data-cockpit-select-popper"
+							v-model="formData.deviceId"
+							placeholder="请选择"
+							clearable
+							@change="handleDeviceChange"
+						>
+							<el-option v-for="item in deviceOptions" :key="item.value" :label="item.label" :value="item.value" />
 						</el-select>
 					</el-form-item>
 					<el-form-item label="设备类型" prop="deviceType">
-						<el-select class="ztzf-data-cockpit-select" popper-class="ztzf-data-cockpit-select-popper"
-							v-model="formData.deviceType" placeholder="请选择" clearable>
-							<el-option v-for="item in dictObj.deviceType" :key="item.dictKey" :label="item.dictValue"
-								:value="item.dictKey" />
+						<el-select
+							class="ztzf-data-cockpit-select"
+							popper-class="ztzf-data-cockpit-select-popper"
+							v-model="formData.deviceType"
+							placeholder="请选择"
+							clearable
+						>
+							<el-option
+								v-for="item in dictObj.deviceType"
+								:key="item.dictKey"
+								:label="item.dictValue"
+								:value="item.dictKey"
+							/>
 						</el-select>
 					</el-form-item>
 					<el-form-item label="设备位置" prop="deployLocation">
-						<el-input class="ztzf-data-cockpit-search-input" v-model="formData.deployLocation"
-							placeholder="请选择位置">
+						<el-input
+							class="ztzf-data-cockpit-search-input"
+							v-model="formData.deployLocation"
+							disabled
+							placeholder="请选择位置"
+						>
 							<template #suffix>
 								<span class="suffix-action">地图选点</span>
 							</template>
 						</el-input>
 					</el-form-item>
 					<el-form-item label="设备编号" prop="deviceSn">
-						<el-input class="ztzf-data-cockpit-search-input" v-model="formData.deviceSn" placeholder="请输入"
-							clearable />
+						<el-input
+							class="ztzf-data-cockpit-search-input"
+							v-model="formData.deviceSn"
+							placeholder="请输入"
+							clearable
+						/>
 					</el-form-item>
 					<el-form-item label="设备型号" prop="deviceModel">
-						<el-input class="ztzf-data-cockpit-search-input" v-model="formData.deviceModel"
-							placeholder="请输入" clearable />
+						<el-input
+							class="ztzf-data-cockpit-search-input"
+							v-model="formData.deviceModel"
+							placeholder="请输入"
+							clearable
+						/>
 					</el-form-item>
-					<el-form-item label="覆盖范围" prop="effectiveRangeKm">
-						<el-input-number class="ztzf-data-cockpit-search-input" v-model="formData.effectiveRangeKm" :min="0" :precision="2" :controls="false"
-							placeholder="请输入" />
+					<el-form-item label="覆盖范围(m)" prop="effectiveRangeKm">
+						<el-input-number
+							class="ztzf-data-cockpit-search-input"
+							v-model="formData.effectiveRangeKm"
+							:min="0"
+							:precision="2"
+							:controls="false"
+							placeholder="请输入"
+						/>
 					</el-form-item>
 				</el-form>
 				<div class="footer">
 					<el-button color="#2B2B4C" @click="handleCancel">{{ dialogReadonly ? '关闭' : '取消' }}</el-button>
-					<el-button color="#284FE3" v-if="!dialogReadonly" type="primary" :loading="submitting"
-						:disabled="submitting" @click="handleSubmit">
+					<el-button
+						color="#284FE3"
+						v-if="!dialogReadonly"
+						type="primary"
+						:loading="submitting"
+						:disabled="submitting"
+						@click="handleSubmit"
+					>
 						保存
 					</el-button>
 				</div>
@@ -87,7 +131,7 @@
 </template>
 
 <script setup>
-import { computed, inject, nextTick, ref } from 'vue'
+import { computed, inject, nextTick, ref, watch } from 'vue'
 import { ElMessage } from 'element-plus'
 import {
 	detectionRangeDetailApi,
@@ -96,6 +140,7 @@
 } from '@/api/detectionCountermeasure/detectionRange'
 import { PublicCesium } from '@/utils/cesium/publicCesium'
 import * as Cesium from 'cesium'
+import deviceZcImg from '@/assets/images/dataCockpit/device-zc.svg'
 
 const initForm = () => ({
 	deviceId: '', // 侦测设备ID
@@ -111,13 +156,14 @@
 const emit = defineEmits(['success'])
 const formRef = ref(null) // 表单实例
 const formData = ref(initForm()) // 表单数据
-const visible = ref(false) // 弹框显隐
+const visible = defineModel() // 弹框显隐
 const dialogMode = ref('add') // 弹框模式
 const submitting = ref(false) // 提交中
 const deviceOptions = ref([])
 const dialogReadonly = computed(() => dialogMode.value === 'view')
 let viewer
 let redPointEntity
+let rangeCircleEntity
 const formTitle = computed(() => {
 	if (dialogMode.value === 'edit') {
 		return '编辑侦测范围'
@@ -135,7 +181,7 @@
 	effectiveRangeKm: [{ required: true, message: '请输入覆盖范围', trigger: ['blur', 'change'] }],
 }
 
-function handleDeviceChange (value) {
+function handleDeviceChange(value) {
 	const target = deviceOptions.value.find(item => item.value === value)
 	const raw = target?.raw
 	if (!raw) return
@@ -148,24 +194,24 @@
 		raw.deployLocation ?? raw.address ?? raw.location ?? raw.deployAddress ?? formData.value.deployLocation
 }
 
-function getDeviceTypeLabel (value) {
+function getDeviceTypeLabel(value) {
 	const list = dictObj?.deviceType ?? []
 	const target = list.find(item => item.dictKey === value)
 	return target?.dictValue ?? value ?? '-'
 }
 
-function formatRange (value) {
+function formatRange(value) {
 	if (value == null || value === '') return '-'
-	return `${value}km`
+	return `${value}`
 }
 
 // 关闭弹框
-function handleCancel () {
+function handleCancel() {
 	visible.value = false
 }
 
 // 提交新增/编辑
-async function handleSubmit () {
+async function handleSubmit() {
 	const isValid = await formRef.value?.validate().catch(() => false)
 	if (!isValid) return
 	submitting.value = true
@@ -186,13 +232,13 @@
 }
 
 // 加载详情
-async function loadDetail (id) {
+async function loadDetail(id) {
 	if (!id) return null
 	const res = await detectionRangeDetailApi({ id })
 	return res?.data?.data ?? null
 }
 
-async function loadDeviceOptions () {
+async function loadDeviceOptions() {
 	const res = await detectionRangePageApi({
 		current: 1,
 		size: 200,
@@ -207,34 +253,38 @@
 }
 
 // 关闭后重置
-function handleClosed () {
+function handleClosed() {
 	formData.value = initForm()
+	clearRangeCircle()
 	viewer = null
 	redPointEntity = null
+	rangeCircleEntity = null
 }
 
-function setMapPoint (longitude, latitude) {
+function setMapPoint(longitude, latitude) {
 	if (!viewer || longitude == null || latitude == null) return
 	if (!redPointEntity) {
 		redPointEntity = viewer.entities.add({
 			position: Cesium.Cartesian3.fromDegrees(longitude, latitude),
-			point: {
-				color: Cesium.Color.RED,
-				pixelSize: 10,
+			billboard: {
+				image: deviceZcImg, // 这里替换为你的图片路径或变量 deviceZcImg
+				width: 30, // 可选:设置图片宽度
+				height: 42, // 可选:设置图片高度
+				verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 设置图片底部对齐坐标点
 			},
 			label: {
 				text: `${longitude.toFixed(6)}, ${latitude.toFixed(6)}`,
-				font: '14px',
+				font: '16px',
 				fillColor: Cesium.Color.WHITE,
 				backgroundColor: Cesium.Color.BLACK.withAlpha(0.45),
 				backgroundPadding: new Cesium.Cartesian2(5, 5),
-				pixelOffset: new Cesium.Cartesian2(0, -20),
 				showBackground: true,
 				style: Cesium.LabelStyle.FILL_AND_OUTLINE,
 				horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
 				verticalOrigin: Cesium.VerticalOrigin.CENTER,
 				outlineWidth: 1,
 				outlineColor: Cesium.Color.WHITE,
+				pixelOffset: new Cesium.Cartesian2(0, -60),
 				eyeOffset: new Cesium.Cartesian3(0, 0, -20),
 			},
 		})
@@ -242,9 +292,51 @@
 		redPointEntity.position = Cesium.Cartesian3.fromDegrees(longitude, latitude)
 		redPointEntity.label.text = `${longitude.toFixed(6)}, ${latitude.toFixed(6)}`
 	}
+	updateRangeCircle(longitude, latitude, formData.value.effectiveRangeKm)
 }
 
-function initMap () {
+function parseDeployLocation(value) {
+	if (!value) return null
+	const [longitude, latitude] = value.split(',').map(item => Number(item.trim()))
+	if (Number.isNaN(longitude) || Number.isNaN(latitude)) return null
+	return { longitude, latitude }
+}
+
+function clearRangeCircle() {
+	if (viewer && rangeCircleEntity) {
+		viewer.entities.remove(rangeCircleEntity)
+	}
+}
+
+function updateRangeCircle(longitude, latitude, range) {
+	if (!viewer || longitude == null || latitude == null) return
+	const rangeMeters = Number(range)
+	if (!Number.isFinite(rangeMeters) || rangeMeters <= 0) {
+		clearRangeCircle()
+		rangeCircleEntity = null
+		return
+	}
+	const position = Cesium.Cartesian3.fromDegrees(longitude, latitude)
+	if (!rangeCircleEntity) {
+		rangeCircleEntity = viewer.entities.add({
+			position,
+			ellipse: {
+				semiMajorAxis: rangeMeters,
+				semiMinorAxis: rangeMeters,
+				material: Cesium.Color.fromCssColorString('#6b9ca8').withAlpha(0.6),
+				outline: true,
+				outlineColor: Cesium.Color.fromCssColorString('#6b9ca8').withAlpha(0.6),
+				heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+			},
+		})
+		return
+	}
+	rangeCircleEntity.position = position
+	rangeCircleEntity.ellipse.semiMajorAxis = rangeMeters
+	rangeCircleEntity.ellipse.semiMinorAxis = rangeMeters
+}
+
+function initMap() {
 	if (viewer) return
 	const publicCesiumInstance = new PublicCesium({
 		dom: 'detectionRangeMap',
@@ -259,7 +351,7 @@
 	viewer = publicCesiumInstance.getViewer()
 }
 
-function handleMapClick (click) {
+function handleMapClick(click) {
 	const pos = click.position
 	const cartesian3 = viewer.camera.pickEllipsoid(pos, viewer.scene.globe.ellipsoid)
 	if (!cartesian3) return
@@ -271,9 +363,8 @@
 }
 
 // 打开弹框
-async function open ({ mode, row } = {}) {
+async function open({ mode, row } = {}) {
 	dialogMode.value = mode || 'add'
-	visible.value = true
 	await nextTick()
 	initMap()
 	if (dialogMode.value === 'add') {
@@ -286,6 +377,7 @@
 		const detail = await loadDetail(row?.id)
 		formData.value = detail ?? row
 	}
+	formData.value.deployLocation = `${formData.value.longitude}, ${formData.value.latitude}`
 	formData.value.deviceId = formData.value.id ?? formData.value.deviceId
 	await loadDeviceOptions()
 	const currentName = formData.value.deviceName
@@ -295,14 +387,24 @@
 	}
 	const location = formData.value.deployLocation
 	if (location) {
-		const [longitude, latitude] = location.split(',').map(item => Number(item.trim()))
-		if (!Number.isNaN(longitude) && !Number.isNaN(latitude)) {
-			setMapPoint(longitude, latitude)
+		const parsed = parseDeployLocation(location)
+		if (parsed) {
+			setMapPoint(parsed.longitude, parsed.latitude)
+			viewer.flyTo(redPointEntity, { duration: 0 })
 		}
 	}
 }
 
 defineExpose({ open })
+
+watch(
+	() => formData.value.effectiveRangeKm,
+	value => {
+		const parsed = parseDeployLocation(formData.value.deployLocation)
+		if (!parsed) return
+		updateRangeCircle(parsed.longitude, parsed.latitude, value)
+	}
+)
 </script>
 
 <style scoped lang="scss"></style>
diff --git a/applications/drone-command/src/views/detectionCountermeasure/detectionRange/index.vue b/applications/drone-command/src/views/detectionCountermeasure/detectionRange/index.vue
index f6bbaab..dcb3507 100644
--- a/applications/drone-command/src/views/detectionCountermeasure/detectionRange/index.vue
+++ b/applications/drone-command/src/views/detectionCountermeasure/detectionRange/index.vue
@@ -1,7 +1,7 @@
 <template>
 	<basic-container>
 		<el-form ref="queryParamsRef" :model="searchParams" class="ztzf-page-history-search">
-			<el-form-item label="名称" prop="deviceName">
+			<el-form-item label="设备名称" prop="deviceName">
 				<el-input
 					class="ztzf-data-cockpit-search-input"
 					v-model="searchParams.deviceName"
@@ -11,7 +11,7 @@
 				/>
 			</el-form-item>
 
-			<el-form-item label="类型" prop="deviceType">
+			<el-form-item label="设备类型" prop="deviceType">
 				<el-select
 					class="ztzf-data-cockpit-select"
 					popper-class="ztzf-data-cockpit-select-popper"
@@ -55,7 +55,7 @@
 						</template>
 					</el-table-column>
 					<el-table-column prop="deviceModel" show-overflow-tooltip label="型号" />
-					<el-table-column show-overflow-tooltip label="覆盖范围">
+					<el-table-column show-overflow-tooltip label="覆盖范围(m)">
 						<template v-slot="{ row }">
 							{{ formatRange(row) }}
 						</template>
@@ -87,7 +87,7 @@
 			</div>
 		</div>
 
-		<DetectionRangeDialog ref="dialogRef" @success="getList" />
+		<DetectionRangeDialog ref="dialogRef" @success="getList" v-model="visible" v-if="visible" />
 	</basic-container>
 </template>
 <script setup>
@@ -115,7 +115,7 @@
 const dictObj = ref({
 	deviceType: [], // 设备类型
 })
-
+const visible = ref(false)
 provide('dictObj', dictObj)
 
 // 获取列表
@@ -145,17 +145,26 @@
 
 // 新增
 function handleAdd() {
-	dialogRef.value?.open({ mode: 'add' })
+	visible.value = true
+	nextTick(() => {
+		dialogRef.value?.open({ mode: 'add' })
+	})
 }
 
 // 查看
 function handleView(row) {
-	dialogRef.value?.open({ mode: 'view', row: { ...row } })
+	visible.value = true
+	nextTick(() => {
+		dialogRef.value?.open({ mode: 'view', row: { ...row } })
+	})
 }
 
 // 编辑
 function handleEdit(row) {
-	dialogRef.value?.open({ mode: 'edit', row: { ...row } })
+	visible.value = true
+	nextTick(() => {
+		dialogRef.value?.open({ mode: 'edit', row: { ...row } })
+	})
 }
 
 // 删除
@@ -179,20 +188,8 @@
 }
 
 function formatDeployLocation(row) {
-	if (!row) return '-'
-	const location = row.deployLocation ?? row.address ?? row.location ?? row.deployAddress
-	if (Array.isArray(location) && location.length) {
-		return location.filter(value => value !== null && value !== undefined).join(',')
-	}
-	if (typeof location === 'string' && location.trim()) {
-		return location
-	}
-	const longitude = row.deployLongitude ?? row.longitude
-	const latitude = row.deployLatitude ?? row.latitude
-	if (longitude != null || latitude != null) {
-		return `${longitude ?? '-'},${latitude ?? '-'}`
-	}
-	return '-'
+	if (!row.longitude || !row.latitude) return ''
+	return `${row.longitude}, ${row.latitude}`
 }
 
 function formatRange(row) {
diff --git a/applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/FormDiaLog.vue b/applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/FormDiaLog.vue
index aaff6ae..5d0420c 100644
--- a/applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/FormDiaLog.vue
+++ b/applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/FormDiaLog.vue
@@ -45,8 +45,9 @@
 			</el-row>
 		</div>
 
-		<el-form v-else ref="formRef" :model="formData" :rules="rules" label-width="120px" class="dialog-form">
+		<el-form v-else ref="formRef" :model="formData" :rules="rules" label-width="120" class="dialog-form">
 			<el-row>
+				<el-col :span="24"><h3 style="color: #ffffff">工作模式</h3></el-col>
 				<el-col :span="12">
 					<el-form-item label="起始扇区" prop="startSector">
 						<el-input
@@ -93,6 +94,7 @@
 						/>
 					</el-form-item>
 				</el-col>
+				<el-col :span="24"><h3 style="color: #ffffff">工作模式</h3></el-col>
 				<el-col :span="12">
 					<el-form-item label="伺服模式" prop="servoMode">
 						<el-select
@@ -169,7 +171,7 @@
 <script setup>
 import { computed, ref } from 'vue'
 import { ElMessage } from 'element-plus'
-import { fwDeviceConfigSubmitApi } from './deviceAppConfigApi'
+import { fwDeviceConfigDetailApi, fwDeviceConfigSubmitApi } from './deviceAppConfigApi'
 import { fieldRules } from '@ztzf/utils'
 
 const configKeys = [
@@ -204,7 +206,7 @@
 const dialogMode = ref('view') // 弹框模式
 const submitting = ref(false) // 提交中
 const readonly = computed(() => dialogMode.value === 'view')
-const titleEnum = ref({ edit: '编辑', view: '查看' })
+const titleEnum = ref({ edit: '配置接口', view: '查看' })
 
 const searchModeOptions = [
 	{ label: '0', value: '0' },
@@ -267,10 +269,18 @@
 	}
 }
 
+function loadingDetails() {
+	fwDeviceConfigDetailApi({ deviceId: formData.value.deviceId }).then(res => {
+		const configJson = res.data.data ? JSON.parse(res.data.data.configJson) : {}
+		formData.value = { ...formData.value, ...configJson }
+	})
+}
+
 // 打开弹框
 async function open({ mode, row } = {}) {
 	dialogMode.value = mode || 'view'
 	formData.value = { ...initForm(), deviceId: row.id }
+	loadingDetails()
 }
 
 defineExpose({ open })
diff --git a/applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/index.vue b/applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/index.vue
index b61874a..ab870aa 100644
--- a/applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/index.vue
+++ b/applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/index.vue
@@ -78,17 +78,17 @@
 					<el-table-column prop="manufacturer" show-overflow-tooltip label="厂商" />
 					<el-table-column prop="contactPhone" show-overflow-tooltip label="联系方式" />
 					<el-table-column prop="sceneName" show-overflow-tooltip label="所属场景" />
-					<el-table-column label="设置配置" class-name="operation-btns">
+					<el-table-column label="操作" class-name="operation-btns">
 						<template v-slot="{ row }">
 							<el-link @click="openForm('edit', row)" type="warning">配置接口</el-link>
 						</template>
 					</el-table-column>
-					<el-table-column label="操作" class-name="operation-btns">
+					<!--					<el-table-column label="操作" class-name="operation-btns">
 						<template v-slot="{ row }">
 							<el-link @click="handleEdit(row)">编辑</el-link>
 							<el-link @click="handleDelete(row)" type="danger">删除</el-link>
 						</template>
-					</el-table-column>
+					</el-table-column>-->
 				</el-table>
 			</div>
 
@@ -210,11 +210,8 @@
 }
 
 function formatDeployLocation(row) {
-	if (!row) return ''
-	const longitude = row.deployLongitude ?? row.longitude
-	const latitude = row.deployLatitude ?? row.latitude
-	if (longitude == null || latitude == null) return ''
-	return `${longitude}, ${latitude}`
+	if (!row.longitude || !row.latitude) return ''
+	return `${row.longitude}, ${row.latitude}`
 }
 
 onMounted(() => {
diff --git a/applications/drone-command/src/views/detectionCountermeasure/taskSchedule/index.vue b/applications/drone-command/src/views/detectionCountermeasure/taskSchedule/index.vue
index b61784c..6998603 100644
--- a/applications/drone-command/src/views/detectionCountermeasure/taskSchedule/index.vue
+++ b/applications/drone-command/src/views/detectionCountermeasure/taskSchedule/index.vue
@@ -15,11 +15,11 @@
 				</el-select>
 			</el-form-item>
 
-			<el-form-item label="设备状态" prop="deviceStatus">
+			<el-form-item label="设备状态" prop="status">
 				<el-select
 					class="ztzf-data-cockpit-select"
 					popper-class="ztzf-data-cockpit-select-popper"
-					v-model="searchParams.deviceStatus"
+					v-model="searchParams.status"
 					placeholder="请选择"
 					clearable
 					@clear="handleSearch"
@@ -34,7 +34,7 @@
 				</el-select>
 			</el-form-item>
 
-			<el-form-item label="设备编号" prop="deviceSn">
+			<el-form-item label="设备编码" prop="deviceSn">
 				<el-input
 					class="ztzf-data-cockpit-search-input"
 					v-model="searchParams.deviceSn"
@@ -62,9 +62,9 @@
 					<el-table-column type="index" show-overflow-tooltip width="64" label="序号" />
 					<el-table-column prop="deviceName" show-overflow-tooltip width="140" label="设备名称" />
 					<el-table-column prop="deviceSn" show-overflow-tooltip width="140" label="设备编码" />
-					<el-table-column prop="deviceStatus" show-overflow-tooltip width="100" label="设备状态">
+					<el-table-column prop="status" show-overflow-tooltip width="100" label="设备状态">
 						<template v-slot="{ row }">
-							{{ getDictLabel(row.deviceStatus, dictObj.deviceStatus) }}
+							{{ formatDeployLocation(row) }}
 						</template>
 					</el-table-column>
 					<el-table-column prop="areaName" show-overflow-tooltip width="120" label="区域" />
@@ -127,7 +127,7 @@
 // 初始化查询参数
 const initSearchParams = () => ({
 	deviceId: '', // 设备名称
-	deviceStatus: '', // 设备状态
+	status: '', // 设备状态
 	deviceSn: '', // 设备编号
 	current: 1, // 当前页
 	size: 10, // 每页大小
@@ -157,7 +157,10 @@
 	}
 	return row.dispatchStartTime || row.dispatchEndTime || ''
 }
-
+function formatDeployLocation(row) {
+	if (!row.longitude || !row.latitude) return ''
+	return `${row.longitude}, ${row.latitude}`
+}
 // 获取列表
 async function getList() {
 	loading.value = true
diff --git a/applications/drone-command/src/views/recordManage/historyTracks/TrajectoryDiaLog.vue b/applications/drone-command/src/views/recordManage/historyTracks/TrajectoryDiaLog.vue
index 8fb9ea7..0a2ce06 100644
--- a/applications/drone-command/src/views/recordManage/historyTracks/TrajectoryDiaLog.vue
+++ b/applications/drone-command/src/views/recordManage/historyTracks/TrajectoryDiaLog.vue
@@ -1,6 +1,12 @@
 <template>
-	<el-dialog class="ztzf-page-map-view-dialog" v-model="visible" :show-close="false"
-		:close-on-click-modal="false" @closed="handleClosed" destroy-on-close>
+	<el-dialog
+		class="ztzf-page-map-view-dialog"
+		v-model="visible"
+		:show-close="false"
+		:close-on-click-modal="false"
+		@closed="handleClosed"
+		destroy-on-close
+	>
 		<div class="dialog-container">
 			<div class="left-container">
 				<div class="leftMap ztzf-cesium" id="leftMapContainer"></div>
@@ -59,6 +65,7 @@
 import { PublicCesium } from '@/utils/cesium/publicCesium'
 import * as Cesium from 'cesium'
 import { flyVisual } from '@/utils/cesium/mapUtil'
+import { ArrowLineMaterialProperty } from '@/utils/cesium/Material'
 
 const initForm = () => ({
 	droneName: '',
@@ -84,12 +91,12 @@
 })
 
 // 关闭弹框
-function handleCancel () {
+function handleCancel() {
 	visible.value = false
 }
 
 // 加载详情
-async function loadDetail () {
+async function loadDetail() {
 	if (!formData.value.id) return
 	const res = await fwDroneFlightRecordDetailApi({ id: formData.value.id })
 	const res1 = await fwDroneFlightRecordDetailPageApi({ flightRecordId: formData.value.id })
@@ -98,28 +105,35 @@
 	formData.value = res?.data?.data ?? {}
 }
 
+let arrowLineMaterialProperty = new ArrowLineMaterialProperty({
+	color: new Cesium.Color(128 / 255, 215 / 255, 255 / 255, 1),
+	directionColor: new Cesium.Color(1, 1, 1, 1),
+	outlineColor: new Cesium.Color(1, 1, 1, 1),
+	outlineWidth: 0,
+	speed: 5,
+})
+
 // 角度转c3
-function degreesToC3 ({ longitude, latitude, height = 0 }) {
+function degreesToC3({ longitude, latitude, height = 0 }) {
 	return Cesium.Cartesian3.fromDegrees(longitude, latitude, height)
 }
 // 渲染航线
-function drawFlightPath () {
+function drawFlightPath() {
 	const positions = list.value.map(p => degreesToC3(p))
 	droneLineEntity && geometricSource.entities.remove(droneLineEntity)
-	const color = Cesium.Color.fromCssColorString('#00D690')
 	droneLineEntity = geometricSource.entities.add({
 		polyline: {
+			width: 4,
 			positions: positions,
-			width: 3,
-			material: new Cesium.PolylineOutlineMaterialProperty({ color }),
+			material: arrowLineMaterialProperty,
 			clampToGround: false,
 		},
 	})
-	viewer.flyTo(droneLineEntity)
+	viewer.flyTo(droneLineEntity, { duration: 0 })
 }
 
 // 关闭后重置
-function handleClosed () {
+function handleClosed() {
 	formData.value = initForm()
 	list.value = []
 	viewer = null
@@ -128,7 +142,7 @@
 }
 
 let viewer, geometricSource, droneLineEntity
-function initMap () {
+function initMap() {
 	if (viewer) return
 	const publicCesiumInstance = new PublicCesium({
 		dom: 'leftMapContainer',
@@ -143,7 +157,7 @@
 }
 
 // 打开弹框
-async function open ({ mode, row } = {}) {
+async function open({ mode, row } = {}) {
 	dialogMode.value = mode || 'add'
 	visible.value = true
 	await nextTick()
diff --git a/applications/drone-command/src/views/recordManage/index.vue b/applications/drone-command/src/views/recordManage/index.vue
deleted file mode 100644
index d305540..0000000
--- a/applications/drone-command/src/views/recordManage/index.vue
+++ /dev/null
@@ -1,12 +0,0 @@
-<template>
-  <div class="page">
-    <el-card header="记录管理"></el-card>
-  </div>
-</template>
-<script setup>
-</script>
-<style scoped lang="scss">
-.page {
-  padding: 16px;
-}
-</style>
diff --git a/applications/mobile-web-view/package.json b/applications/mobile-web-view/package.json
index 3d8fc06..5ccaa3c 100644
--- a/applications/mobile-web-view/package.json
+++ b/applications/mobile-web-view/package.json
@@ -77,7 +77,6 @@
 		"@vitejs/plugin-vue": "catalog:",
 		"@vue/compiler-sfc": "catalog:",
 		"postcss-pxtorem": "catalog:",
-		"prettier": "catalog:",
 		"sass": "catalog:",
 		"terser": "catalog:",
 		"unplugin-auto-import": "catalog:",
diff --git a/applications/task-work-order/env/.env.development b/applications/task-work-order/env/.env.development
index 5efa25f..9155aea 100644
--- a/applications/task-work-order/env/.env.development
+++ b/applications/task-work-order/env/.env.development
@@ -1,3 +1,13 @@
+###
+ # @Author       : yuan
+ # @Date         : 2026-01-07 14:58:30
+ # @LastEditors  : yuan
+ # @LastEditTime : 2026-01-16 11:02:24
+ # @FilePath     : \applications\task-work-order\env\.env.development
+ # @Description  : 
+ # Copyright 2026 OBKoro1, All Rights Reserved. 
+ # 2026-01-07 14:58:30
+### 
 NODE_ENV = 'development'
 
 #开发环境配置
@@ -5,7 +15,7 @@
 
 #开发环境代理地址(推荐本地新建文件 .env.development.local 来进行覆盖)
 # VITE_APP_URL = https://wrj.shuixiongit.com/api
-VITE_APP_URL= http://192.168.1.33:81
+VITE_APP_URL= http://192.168.1.204
 
 #新大屏地址
 VITE_APP_DASHBOARD_URL = 'https://wrj.shuixiongit.com/command-center-dashboard/'
diff --git a/applications/task-work-order/package.json b/applications/task-work-order/package.json
index 34449d8..db23ece 100644
--- a/applications/task-work-order/package.json
+++ b/applications/task-work-order/package.json
@@ -72,7 +72,6 @@
     "@vitejs/plugin-vue": "catalog:",
     "@vue/compiler-sfc": "catalog:",
     "postcss-pxtorem": "catalog:",
-    "prettier": "catalog:",
     "sass": "catalog:",
     "terser": "catalog:",
     "unplugin-auto-import": "catalog:",
diff --git a/applications/task-work-order/src/api/dataCockpit/index.js b/applications/task-work-order/src/api/dataCockpit/index.js
new file mode 100644
index 0000000..553d692
--- /dev/null
+++ b/applications/task-work-order/src/api/dataCockpit/index.js
@@ -0,0 +1,54 @@
+/*
+ * @Author       : yuan
+ * @Date         : 2026-01-09 11:14:04
+ * @LastEditors  : yuan
+ * @LastEditTime : 2026-01-09 11:35:14
+ * @FilePath     : \applications\drone-command\src\api\dataCockpit\index.js
+ * @Description  : 
+ * Copyright 2026 OBKoro1, All Rights Reserved. 
+ * 2026-01-09 11:14:04
+ */
+import request from '@/axios'
+
+// 设备查询
+export const deviceSearchApi = (params) => {
+	return request({
+		url: '/drone-fw/cockpit/dataCockpit/deviceSearch',
+		method: 'get',
+		params
+	})
+}
+
+// 历史告警/实时告警
+export const alarmLogApi = (params) => {
+	return request({
+		url: '/drone-fw/cockpit/dataCockpit/alarmLog',
+		method: 'get',
+		params
+	})
+}
+
+// 告警记录统计
+export const alarmStatisticsApi = () => {
+	return request({
+		url: '/drone-fw/cockpit/dataCockpit/alarmStatistics',
+		method: 'get'
+	})
+}
+
+// 信号干扰/诱导驱离
+export const interferenceAndExpulsionApi = (data) => {
+	return request({
+		url: '/drone-fw/cockpit/dataCockpit/interferenceAndExpulsion',
+		method: 'post',
+		data
+	})
+}
+
+// 设备统计
+export const deviceStatisticsApi = () => {
+	return request({
+		url: '/drone-fw/cockpit/dataCockpit/deviceStatistics',
+		method: 'get'
+	})
+}
diff --git a/applications/task-work-order/src/assets/images/aiNowFly/Frame.png b/applications/task-work-order/src/assets/images/aiNowFly/Frame.png
new file mode 100644
index 0000000..c1d6816
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/aiNowFly/Frame.png
Binary files differ
diff --git a/applications/task-work-order/src/assets/images/aiNowFly/fly.png b/applications/task-work-order/src/assets/images/aiNowFly/fly.png
new file mode 100644
index 0000000..6872ae0
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/aiNowFly/fly.png
Binary files differ
diff --git a/applications/task-work-order/src/assets/images/aiNowFly/flying.png b/applications/task-work-order/src/assets/images/aiNowFly/flying.png
new file mode 100644
index 0000000..80dc6ae
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/aiNowFly/flying.png
Binary files differ
diff --git a/applications/task-work-order/src/assets/images/aiNowFly/full-charge.svg b/applications/task-work-order/src/assets/images/aiNowFly/full-charge.svg
new file mode 100644
index 0000000..700d544
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/aiNowFly/full-charge.svg
@@ -0,0 +1,13 @@
+<svg width="28" height="48" viewBox="0 0 28 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Vector">
+<path d="M16.5455 0C16.7126 0 16.8781 0.0326726 17.0325 0.0961522C17.1869 0.159632 17.3272 0.252675 17.4454 0.36997C17.5636 0.487265 17.6573 0.626515 17.7213 0.779768C17.7853 0.933022 17.8182 1.09728 17.8182 1.26316V2.52632H24.1818C25.1945 2.52632 26.1656 2.92556 26.8817 3.63623C27.5977 4.34689 28 5.31076 28 6.31579V44.2105C28 45.2156 27.5977 46.1794 26.8817 46.8901C26.1656 47.6008 25.1945 48 24.1818 48H3.81818C2.80554 48 1.83437 47.6008 1.11832 46.8901C0.402272 46.1794 0 45.2156 0 44.2105V6.31579C0 5.31076 0.402272 4.34689 1.11832 3.63623C1.83437 2.92556 2.80554 2.52632 3.81818 2.52632H10.1818V1.26316C10.1818 0.928148 10.3159 0.606858 10.5546 0.36997C10.7933 0.133082 11.117 0 11.4545 0H16.5455ZM24.1818 5.05263H3.81818C3.48063 5.05263 3.15691 5.18571 2.91823 5.4226C2.67954 5.65949 2.54545 5.98078 2.54545 6.31579V44.2105C2.54545 44.5455 2.67954 44.8668 2.91823 45.1037C3.15691 45.3406 3.48063 45.4737 3.81818 45.4737H24.1818C24.5194 45.4737 24.8431 45.3406 25.0818 45.1037C25.3205 44.8668 25.4545 44.5455 25.4545 44.2105V6.31579C25.4545 5.98078 25.3205 5.65949 25.0818 5.4226C24.8431 5.18571 24.5194 5.05263 24.1818 5.05263Z" fill="url(#paint0_linear_1519_1955)"/>
+<path d="M22.909 42.9474V8.33691H5.09082V42.9474H22.909Z" fill="#40FF5C"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_1519_1955" x1="14" y1="0" x2="14" y2="48" gradientUnits="userSpaceOnUse">
+<stop offset="0.25" stop-color="#00FFF2"/>
+<stop offset="0.514423" stop-color="#00FFF2"/>
+<stop offset="0.721154" stop-color="#00FFF2"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/applications/task-work-order/src/assets/images/aiNowFly/low-battery.svg b/applications/task-work-order/src/assets/images/aiNowFly/low-battery.svg
new file mode 100644
index 0000000..ac76800
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/aiNowFly/low-battery.svg
@@ -0,0 +1,6 @@
+<svg width="28" height="48" viewBox="0 0 28 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Group 1321316190">
+<path id="Vector" d="M16.3293 0C16.4942 0 16.6576 0.03249 16.81 0.0956148C16.9624 0.15874 17.1008 0.251263 17.2175 0.367902C17.3341 0.484542 17.4266 0.623013 17.4897 0.77541C17.5529 0.927807 17.5854 1.09114 17.5854 1.2561V2.5122H23.8659C24.8653 2.5122 25.8237 2.90921 26.5304 3.6159C27.2371 4.32259 27.6341 5.28107 27.6341 6.28049V43.9634C27.6341 44.9628 27.2371 45.9213 26.5304 46.628C25.8237 47.3347 24.8653 47.7317 23.8659 47.7317H3.76829C2.76888 47.7317 1.8104 47.3347 1.10371 46.628C0.397016 45.9213 0 44.9628 0 43.9634V6.28049C0 5.28107 0.397016 4.32259 1.10371 3.6159C1.8104 2.90921 2.76888 2.5122 3.76829 2.5122H10.0488V1.2561C10.0488 0.92296 10.1811 0.603466 10.4167 0.367902C10.6522 0.132338 10.9717 0 11.3049 0H16.3293ZM23.8659 5.02439H3.76829C3.43515 5.02439 3.11566 5.15673 2.8801 5.39229C2.64453 5.62786 2.5122 5.94735 2.5122 6.28049V43.9634C2.5122 44.2966 2.64453 44.616 2.8801 44.8516C3.11566 45.0872 3.43515 45.2195 3.76829 45.2195H23.8659C24.199 45.2195 24.5185 45.0872 24.754 44.8516C24.9896 44.616 25.122 44.2966 25.122 43.9634V6.28049C25.122 5.94735 24.9896 5.62786 24.754 5.39229C24.5185 5.15673 24.199 5.02439 23.8659 5.02439Z" fill="#00FFF2"/>
+<path id="Vector_2" d="M22.6098 42.707V37.6826H5.02441V42.707H22.6098Z" fill="#F20303"/>
+</g>
+</svg>
diff --git a/applications/task-work-order/src/assets/images/aiNowFly/medium-battery.svg b/applications/task-work-order/src/assets/images/aiNowFly/medium-battery.svg
new file mode 100644
index 0000000..283a52f
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/aiNowFly/medium-battery.svg
@@ -0,0 +1,6 @@
+<svg width="28" height="48" viewBox="0 0 28 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g id="Vector">
+<path d="M16.5455 0C16.7126 0 16.8781 0.0326726 17.0325 0.0961522C17.1869 0.159632 17.3272 0.252675 17.4454 0.36997C17.5636 0.487265 17.6573 0.626515 17.7213 0.779768C17.7853 0.933022 17.8182 1.09728 17.8182 1.26316V2.52632H24.1818C25.1945 2.52632 26.1656 2.92556 26.8817 3.63623C27.5977 4.34689 28 5.31076 28 6.31579V44.2105C28 45.2156 27.5977 46.1794 26.8817 46.8901C26.1656 47.6008 25.1945 48 24.1818 48H3.81818C2.80554 48 1.83437 47.6008 1.11832 46.8901C0.402272 46.1794 0 45.2156 0 44.2105V6.31579C0 5.31076 0.402272 4.34689 1.11832 3.63623C1.83437 2.92556 2.80554 2.52632 3.81818 2.52632H10.1818V1.26316C10.1818 0.928148 10.3159 0.606858 10.5546 0.36997C10.7933 0.133082 11.117 0 11.4545 0H16.5455ZM24.1818 5.05263H3.81818C3.48063 5.05263 3.15691 5.18571 2.91823 5.4226C2.67954 5.65949 2.54545 5.98078 2.54545 6.31579V44.2105C2.54545 44.5455 2.67954 44.8668 2.91823 45.1037C3.15691 45.3406 3.48063 45.4737 3.81818 45.4737H24.1818C24.5194 45.4737 24.8431 45.3406 25.0818 45.1037C25.3205 44.8668 25.4545 44.5455 25.4545 44.2105V6.31579C25.4545 5.98078 25.3205 5.65949 25.0818 5.4226C24.8431 5.18571 24.5194 5.05263 24.1818 5.05263Z" fill="#00FFF2"/>
+<path d="M22.9091 42.9474V23.4947H5.09091V42.9474H22.9091Z" fill="#00EEFF"/>
+</g>
+</svg>
diff --git a/applications/task-work-order/src/assets/images/aiNowFly/starting.png b/applications/task-work-order/src/assets/images/aiNowFly/starting.png
new file mode 100644
index 0000000..e8eaa93
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/aiNowFly/starting.png
Binary files differ
diff --git a/applications/task-work-order/src/assets/images/dataCockpit/equipment.png b/applications/task-work-order/src/assets/images/dataCockpit/equipment.png
new file mode 100644
index 0000000..afae523
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/dataCockpit/equipment.png
Binary files differ
diff --git a/applications/task-work-order/src/assets/images/dataCockpit/fzsb.png b/applications/task-work-order/src/assets/images/dataCockpit/fzsb.png
new file mode 100644
index 0000000..163088c
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/dataCockpit/fzsb.png
Binary files differ
diff --git a/applications/task-work-order/src/assets/images/dataCockpit/layerControl.png b/applications/task-work-order/src/assets/images/dataCockpit/layerControl.png
new file mode 100644
index 0000000..b6ea5b9
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/dataCockpit/layerControl.png
Binary files differ
diff --git a/applications/task-work-order/src/assets/images/dataCockpit/left-btn.png b/applications/task-work-order/src/assets/images/dataCockpit/left-btn.png
new file mode 100644
index 0000000..738ba8a
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/dataCockpit/left-btn.png
Binary files differ
diff --git a/applications/task-work-order/src/assets/images/dataCockpit/map/equipment.png b/applications/task-work-order/src/assets/images/dataCockpit/map/equipment.png
new file mode 100644
index 0000000..f07291b
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/dataCockpit/map/equipment.png
Binary files differ
diff --git a/applications/task-work-order/src/assets/images/dataCockpit/right-btn.png b/applications/task-work-order/src/assets/images/dataCockpit/right-btn.png
new file mode 100644
index 0000000..56bd4bf
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/dataCockpit/right-btn.png
Binary files differ
diff --git a/applications/task-work-order/src/assets/images/dataCockpit/title-bg.png b/applications/task-work-order/src/assets/images/dataCockpit/title-bg.png
new file mode 100644
index 0000000..5a67cc0
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/dataCockpit/title-bg.png
Binary files differ
diff --git a/applications/task-work-order/src/assets/images/dataCockpit/warning.png b/applications/task-work-order/src/assets/images/dataCockpit/warning.png
new file mode 100644
index 0000000..a1af17e
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/dataCockpit/warning.png
Binary files differ
diff --git a/applications/task-work-order/src/assets/images/dataCockpit/zcsb.png b/applications/task-work-order/src/assets/images/dataCockpit/zcsb.png
new file mode 100644
index 0000000..7476a30
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/dataCockpit/zcsb.png
Binary files differ
diff --git a/applications/task-work-order/src/assets/images/no-data-bg.png b/applications/task-work-order/src/assets/images/no-data-bg.png
new file mode 100644
index 0000000..3f902b6
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/no-data-bg.png
Binary files differ
diff --git a/applications/task-work-order/src/components/map-container/device-map-container.vue b/applications/task-work-order/src/components/map-container/device-map-container.vue
new file mode 100644
index 0000000..888edaf
--- /dev/null
+++ b/applications/task-work-order/src/components/map-container/device-map-container.vue
@@ -0,0 +1,437 @@
+<template>
+	<div class="ztzf-cesium map-container" :id="props.containerId"></div>
+	<div v-if="props.showLayerControl" class="layer-control-root" :class="{ collapsed: props.leftCollapsed }">
+		<div class="layer-control-wrap" ref="layerWrapRef">
+			<div class="layer-control" @click="toggleLayerPanel">
+				<img :src="layerControlIcon" alt="图层控制" />
+			</div>
+			<div v-if="showLayerPanel" class="layer-panel">
+				<div class="panel-title">图层管理</div>
+
+				<div class="panel-content">
+					<el-tree
+						:data="layerTree"
+						show-checkbox
+						default-expand-all
+						node-key="key"
+						:props="layerTreeProps"
+						:default-checked-keys="defaultCheckedKeys"
+					/>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script setup>
+import * as Cesium from 'cesium'
+import { PublicCesium } from '@/utils/cesium/publicCesium'
+import layerControlIcon from '@/assets/images/dataCockpit/layerControl.png'
+import equipmentIcon from '@/assets/images/dataCockpit/map/equipment.png'
+
+const props = defineProps({
+	onlineDevices: {
+		type: Array,
+		default: () => [],
+	},
+	leftCollapsed: {
+		type: Boolean,
+		default: false,
+	},
+	containerId: {
+		type: String,
+		default: 'device-map-container',
+	},
+	showLayerControl: {
+		type: Boolean,
+		default: true,
+	},
+})
+
+let viewInstance = null
+let viewer = null
+const deviceEntityIds = new Set()
+const showLayerPanel = ref(false)
+const layerWrapRef = ref(null)
+const layerTreeProps = {
+	label: 'label',
+	children: 'children',
+}
+const defaultCheckedKeys = ['global', 'city-base']
+const layerTree = ref([
+	{
+		key: 'base',
+		label: '地理信息图层',
+		children: [
+			{ key: 'global', label: '全球地形' },
+			{ key: 'admin', label: '行政区划' },
+		],
+	},
+	{
+		key: 'city',
+		label: '城市CIM图层',
+		children: [
+			{ key: 'city-base', label: '皖山白模' },
+			{ key: 'city-grid', label: '皖山白模光栅网格' },
+			{ key: 'city-tilt', label: '皖山倾斜摄影' },
+			{ key: 'city-tilt-grid', label: '皖山倾斜摄影网格' },
+		],
+	},
+	{
+		key: 'sky',
+		label: '空域要素图层',
+		children: [
+			{ key: 'airspace', label: '空域边界' },
+			{ key: 'route', label: '飞行航路' },
+		],
+	},
+])
+
+const getDevicePosition = item => {
+	const longitudeRaw = item.longitude ?? item.lng ?? item.lon
+	const latitudeRaw = item.latitude ?? item.lat
+	if (longitudeRaw == null || latitudeRaw == null) return null
+	const longitude = Number(longitudeRaw)
+	const latitude = Number(latitudeRaw)
+	if (!Number.isFinite(longitude) || !Number.isFinite(latitude)) return null
+	return { longitude, latitude }
+}
+
+const clearDeviceEntities = () => {
+	if (!viewer) return
+	deviceEntityIds.forEach(id => {
+		viewer.entities.removeById(id)
+	})
+	deviceEntityIds.clear()
+}
+
+const RING_STYLES = [
+	{ inner: 0, outer: 5000, gradient: ['#FF361C', '#360B00'] },
+	{ inner: 5000, outer: 8000, gradient: ['#FFC609', '#583300'] },
+	{ inner: 8000, outer: 10000, gradient: ['#2AEDBF', '#012B11'] },
+]
+
+const MATERIAL_TYPE = 'RadialGradientMaterial'
+let materialRegistered = false
+
+const registerRadialGradientMaterial = () => {
+	if (materialRegistered || !Cesium?.Material) return
+	materialRegistered = true
+	Cesium.Material._materialCache.addMaterial(MATERIAL_TYPE, {
+		fabric: {
+			type: MATERIAL_TYPE,
+			uniforms: {
+				color1: new Cesium.Color(1.0, 1.0, 1.0, 1.0),
+				color2: new Cesium.Color(0.0, 0.0, 0.0, 1.0),
+			},
+			source: `
+				czm_material czm_getMaterial(czm_materialInput materialInput) {
+					czm_material material = czm_getDefaultMaterial(materialInput);
+					vec2 st = materialInput.st - vec2(0.5);
+					float t = clamp(length(st) * 2.0, 0.0, 1.0);
+					vec4 color = mix(color1, color2, t);
+					material.diffuse = color.rgb;
+					material.alpha = color.a;
+					return material;
+				}
+			`,
+		},
+		translucent: () => true,
+	})
+}
+
+const buildCirclePositions = (center, radiusMeters, steps = 64) => {
+	const positions = []
+	const latRad = Cesium.Math.toRadians(center.latitude)
+	const metersToLat = 1 / 111320
+	const metersToLon = 1 / (111320 * Math.cos(latRad))
+	for (let i = 0; i <= steps; i += 1) {
+		const angle = Cesium.Math.toRadians((i / steps) * 360)
+		const dx = radiusMeters * Math.cos(angle)
+		const dy = radiusMeters * Math.sin(angle)
+		const lon = center.longitude + dx * metersToLon
+		const lat = center.latitude + dy * metersToLat
+		positions.push(Cesium.Cartesian3.fromDegrees(lon, lat))
+	}
+	return positions
+}
+
+const addDeviceRings = (center, baseId) => {
+	RING_STYLES.forEach((ring, index) => {
+		const outerPositions = buildCirclePositions(center, ring.outer)
+		const holes = ring.inner
+			? [new Cesium.PolygonHierarchy(buildCirclePositions(center, ring.inner))]
+			: []
+		const entityId = `${baseId}-ring-${index}`
+		deviceEntityIds.add(entityId)
+		registerRadialGradientMaterial()
+		const [startColor, endColor] = ring.gradient
+		const color1 = Cesium.Color.fromCssColorString(startColor).withAlpha(0.34)
+		const color2 = Cesium.Color.fromCssColorString(endColor).withAlpha(0.34)
+		const material = new RadialGradientMaterialProperty(color1, color2)
+		viewer.entities.add({
+			id: entityId,
+			polygon: {
+				hierarchy: new Cesium.PolygonHierarchy(outerPositions, holes),
+				material,
+			},
+		})
+	})
+}
+
+class RadialGradientMaterialProperty {
+	constructor(color1, color2) {
+		this._definitionChanged = new Cesium.Event()
+		this.color1 = color1
+		this.color2 = color2
+	}
+
+	get isConstant() {
+		return true
+	}
+
+	get definitionChanged() {
+		return this._definitionChanged
+	}
+
+	getType() {
+		return MATERIAL_TYPE
+	}
+
+	getValue(time, result) {
+		const target = result || {}
+		target.color1 = this.color1
+		target.color2 = this.color2
+		return target
+	}
+
+	equals(other) {
+		return (
+			other instanceof RadialGradientMaterialProperty &&
+			Cesium.Color.equals(this.color1, other.color1) &&
+			Cesium.Color.equals(this.color2, other.color2)
+		)
+	}
+}
+
+const renderDeviceEntities = devices => {
+	if (!viewer) return
+	clearDeviceEntities()
+	devices.forEach((item, index) => {
+		const position = getDevicePosition(item)
+		if (!position) return
+		const entityId = `online-device-${item.id ?? index}`
+		deviceEntityIds.add(entityId)
+		addDeviceRings(position, entityId)
+		viewer.entities.add({
+			id: entityId,
+			position: Cesium.Cartesian3.fromDegrees(position.longitude, position.latitude, 0),
+			billboard: {
+				image: equipmentIcon,
+				width: 40.34,
+				height: 40.34,
+			},
+		})
+	})
+}
+
+watch(
+	() => props.onlineDevices,
+	devices => {
+		renderDeviceEntities(devices || [])
+	},
+	{ deep: true }
+)
+
+watch(
+	() => props.leftCollapsed,
+	isCollapsed => {
+		if (isCollapsed) showLayerPanel.value = false
+	}
+)
+
+const toggleLayerPanel = () => {
+	if (!props.showLayerControl) return
+	showLayerPanel.value = !showLayerPanel.value
+}
+
+const handleClickOutside = event => {
+	if (!showLayerPanel.value) return
+	const target = event.target
+	if (layerWrapRef.value?.contains(target)) return
+	showLayerPanel.value = false
+}
+
+onMounted(() => {
+	document.addEventListener('click', handleClickOutside)
+	viewInstance = new PublicCesium({
+		dom: props.containerId,
+		flatMode: false,
+		terrain: false,
+		layerMode: 4,
+		contour: false,
+	})
+
+	viewer = viewInstance.getViewer()
+	renderDeviceEntities(props.onlineDevices)
+})
+
+onBeforeUnmount(() => {
+	document.removeEventListener('click', handleClickOutside)
+	clearDeviceEntities()
+	if (viewInstance) {
+		viewInstance?.viewerDestroy()
+		viewInstance = null
+	}
+
+	viewer = null
+})
+</script>
+
+<style lang="scss" scoped>
+.map-container {
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+}
+
+.layer-control-root {
+	position: absolute;
+	left: 411px;
+	bottom: 22px;
+	z-index: 9;
+	transition: transform 0.3s ease-in-out;
+	pointer-events: none;
+
+	&.collapsed {
+		transform: translateX(-401px);
+	}
+}
+
+.layer-control-wrap {
+	position: relative;
+	display: flex;
+	align-items: flex-end;
+	pointer-events: auto;
+}
+
+.layer-control {
+	width: 34px;
+	height: 34px;
+	cursor: pointer;
+
+	img {
+		width: 100%;
+		height: 100%;
+		display: block;
+	}
+}
+
+.layer-panel {
+	display: flex;
+	flex-direction: column;
+	position: absolute;
+	left: 46px;
+	bottom: 0;
+	width: 160px;
+	max-height: 442px;
+	background: #191932;
+	border-radius: 8px 8px 8px 8px;
+
+	.panel-title {
+		padding: 0 16px;
+		line-height: 42px;
+		font-family: 'Open Sans', Open Sans;
+		font-weight: 400;
+		font-size: 12px;
+		color: #ffffff;
+		text-align: left;
+		font-style: normal;
+		text-transform: none;
+		border-bottom: 1px solid rgba(70, 70, 100, 0.5);
+		box-sizing: border-box;
+	}
+
+	.panel-content {
+		padding: 0 16px;
+		height: 0;
+		flex: 1;
+		overflow: auto;
+	}
+
+	::v-deep(.el-tree) {
+		background: transparent;
+		color: #c3c3dd;
+		font-size: 12px;
+
+		.el-tree-node {
+			line-height: 30px !important;
+
+			.el-tree-node__content {
+				display: flex;
+				align-items: center;
+				height: 40px !important;
+				line-height: 40px !important;
+				border-bottom: 1px solid rgba(70, 70, 100, 0.5);
+				box-sizing: border-box;
+			}
+
+			.el-tree-node__children {
+				.el-tree-node__content {
+					border: none;
+				}
+			}
+		}
+	}
+}
+
+.layer-panel :deep(.el-tree-node__label) {
+	color: #c3c3dd;
+}
+
+.layer-panel :deep(.el-tree-node__expand-icon) {
+	order: 3;
+	margin-left: auto;
+}
+
+.layer-panel :deep(.el-tree-node__expand-icon.is-leaf) {
+	visibility: hidden;
+}
+
+.layer-panel :deep(.el-checkbox) {
+	order: 1;
+}
+
+.layer-panel :deep(.el-tree-node__label) {
+	order: 2;
+}
+
+.layer-panel :deep(.el-tree-node__expand-icon:not(.is-leaf) ~ .el-checkbox) {
+	display: none;
+}
+
+.layer-panel :deep(.el-tree-node__content:hover) {
+	background: transparent !important;
+}
+
+.layer-panel :deep(.el-tree-node.is-current > .el-tree-node__content) {
+	background: transparent !important;
+	color: #ffffff;
+}
+
+.layer-panel :deep(.el-tree-node.is-current > .el-tree-node__content .el-tree-node__label) {
+	color: #ffffff;
+}
+
+.layer-panel :deep(.el-checkbox__input.is-checked .el-checkbox__inner) {
+	background-color: #023aff;
+	border-color: #023aff;
+}
+
+.layer-panel :deep(.el-checkbox__inner) {
+	background-color: transparent;
+	border-color: #a1a3d4;
+}
+</style>
diff --git a/applications/task-work-order/src/components/map-container/mapContainer-copy.vue b/applications/task-work-order/src/components/map-container/mapContainer-copy.vue
index 94d60cd..66d1b89 100644
--- a/applications/task-work-order/src/components/map-container/mapContainer-copy.vue
+++ b/applications/task-work-order/src/components/map-container/mapContainer-copy.vue
@@ -3,10 +3,10 @@
  * @Date: 2024-10-25 15:07:51
  * @LastEditors: shuishen 1109946754@qq.com
  * @LastEditTime: 2025-04-28 11:34:40
- * @FilePath: \drone-web-manage\src\components\map-container\mapContainer.vue
- * @Description: 
- * 
- * Copyright (c) 2024 by shuishen, All Rights Reserved. 
+ * @FilePath: \drone-command\src\components\map-container\mapContainer.vue
+ * @Description:
+ *
+ * Copyright (c) 2024 by shuishen, All Rights Reserved.
 -->
 <template>
   <div class="map-container">
@@ -261,4 +261,4 @@
   height: 120%;
   transform: translate(-50%, -50%);
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/applications/task-work-order/src/components/map-container/mapContainer.vue b/applications/task-work-order/src/components/map-container/mapContainer.vue
index 46b1703..c65706d 100644
--- a/applications/task-work-order/src/components/map-container/mapContainer.vue
+++ b/applications/task-work-order/src/components/map-container/mapContainer.vue
@@ -3,7 +3,7 @@
  * @Date: 2024-10-25 15:07:51
  * @LastEditors: shuishen 1109946754@qq.com
  * @LastEditTime: 2025-04-28 11:34:40
- * @FilePath: \drone-web-manage\src\components\map-container\mapContainer.vue
+ * @FilePath: \drone-command\src\components\map-container\mapContainer.vue
  * @Description:
  *
  * Copyright (c) 2024 by shuishen, All Rights Reserved.
diff --git a/applications/task-work-order/src/config/website.js b/applications/task-work-order/src/config/website.js
index 8c44f0a..1fc7403 100644
--- a/applications/task-work-order/src/config/website.js
+++ b/applications/task-work-order/src/config/website.js
@@ -1,13 +1,23 @@
+/*
+ * @Author       : yuan
+ * @Date         : 2026-01-06 09:47:27
+ * @LastEditors  : yuan
+ * @LastEditTime : 2026-01-16 11:12:30
+ * @FilePath     : \applications\task-work-order\src\config\website.js
+ * @Description  : 
+ * Copyright 2026 OBKoro1, All Rights Reserved. 
+ * 2026-01-06 09:47:27
+ */
 /**
  * 全局配置文件
  */
 export default {
   title: 'saber',
   logo: 'S',
-  key: 'saber', //配置主键,目前用于存储
+  key: 'work', //配置主键,目前用于存储
   indexTitle: '',
-  clientId: 'drone', // 客户端id
-  clientSecret: 'drone_secret', // 客户端密钥
+  clientId: 'saber', // 客户端id
+  clientSecret: 'saber_secret', // 客户端密钥
   tenantMode: true, // 是否开启租户模式
   tenantId: '000000', // 管理组租户编号
   captchaMode: true, // 是否开启验证码模式
@@ -32,8 +42,8 @@
     menu: true,
   },
   fistPage: {
-    name: '个人工作台',
-    path: '/wel/index',
+    name: '数据驾驶舱',
+    path: '/dataCockpit/index',
     // path: '/tickets/ticket',
 
   },
diff --git a/applications/task-work-order/src/router/views/index.js b/applications/task-work-order/src/router/views/index.js
index 9b208fb..e01e37a 100644
--- a/applications/task-work-order/src/router/views/index.js
+++ b/applications/task-work-order/src/router/views/index.js
@@ -15,16 +15,7 @@
           i18n: 'dashboard',
         },
         component: () => import(/* webpackChunkName: "views" */ '@/views/wel/index.vue'),
-      },
-      {
-        path: 'dashboard',
-        name: '控制台',
-        meta: {
-          i18n: 'dashboard',
-          menu: false,
-        },
-        component: () => import(/* webpackChunkName: "views" */ '@/views/wel/dashboard.vue'),
-      },
+      }
     ],
   },
   // 事件工单
diff --git a/applications/task-work-order/src/store/modules/user.js b/applications/task-work-order/src/store/modules/user.js
index 181b52d..3950b41 100644
--- a/applications/task-work-order/src/store/modules/user.js
+++ b/applications/task-work-order/src/store/modules/user.js
@@ -280,7 +280,7 @@
         })
       }
       return new Promise(resolve => {
-        getRoutes({tenantId,sysType: 1}).then(res => {
+        getRoutes({tenantId,sysType: 5}).then(res => {
           const data = res.data.data;
           let menu = deepClone(data);
           if (!res.data?.data?.length){
@@ -299,7 +299,7 @@
     },
     GetButtons({ commit }) {
       return new Promise(resolve => {
-        getButtons({sysType: 1}).then(res => {
+        getButtons({sysType: 5}).then(res => {
           const data = res.data.data;
           commit('SET_PERMISSION', data);
           resolve();
diff --git a/applications/task-work-order/src/views/layerManagement/components/utils.js b/applications/task-work-order/src/utils/cesium/DrawPolygon.js
similarity index 65%
rename from applications/task-work-order/src/views/layerManagement/components/utils.js
rename to applications/task-work-order/src/utils/cesium/DrawPolygon.js
index 7001570..6c37a35 100644
--- a/applications/task-work-order/src/views/layerManagement/components/utils.js
+++ b/applications/task-work-order/src/utils/cesium/DrawPolygon.js
@@ -1,7 +1,8 @@
 import * as Cesium from 'cesium'
-import _, { cloneDeep, throttle } from 'lodash'
 import * as turf from '@turf/turf'
 import { boxTransformScale } from '@/utils/turfFunc'
+import { ElMessage } from 'element-plus'
+import { flyVisual, getPointPositionsHeight } from '@/utils/cesium/mapUtil'
 
 /**
  * 多边形绘制与编辑工具类
@@ -14,8 +15,6 @@
  */
 export class DrawPolygon {
 	constructor() {
-		// 是否绘制
-		this.whetherToDraw =false
 		// 图斑预览模式标记
 		this.isPureSpotPreview = false
 		// 是否删除测区
@@ -39,6 +38,8 @@
 		// 存储端点的 DataSource
 		this.editPolygonDataSource = null
 		this.editPolygonPointDataSource = null
+		// 存储中点(边中点)的 DataSource:用于编辑态插入新端点
+		this.editPolygonMidPointDataSource = null
 		// 鼠标事件处理器
 		this.handler = null
 		// 右键菜单 DOM
@@ -63,15 +64,17 @@
 		this.delPoint = this.delPoint.bind(this)
 		// 外部订阅者
 		this.listeners = []
-		
 	}
 
 	// 实体命名常量
 	static ENTITY_NAMES = {
 		POLYGON: '区域-面',
 		POINT: '区域-端点',
+		// 编辑态中点(用于快速插入新端点)
+		MID_POINT: '区域-中点',
 		POLYGON_ID: 'planar-route-polygon',
 		POINT_ID_PREFIX: 'planar-route-point',
+		MID_POINT_ID_PREFIX: 'planar-route-mid-point',
 	}
 
 	// 颜色常量
@@ -98,10 +101,20 @@
 	// 编辑图斑
 	editThePatch(data) {
 		this.isPreviewMode = data
-	}
-	// 绘制
-	drawTheArea(data){
-		this.whetherToDraw = data		
+		// 关闭编辑能力时隐藏端点/中点,并清空中点,避免残留交互
+		if (!this.isPreviewMode) {
+			this.editPolygonPointDataSource && (this.editPolygonPointDataSource.entities.show = false)
+			this.editPolygonMidPointDataSource && (this.editPolygonMidPointDataSource.entities.show = false)
+			this.editPolygonMidPointDataSource?.entities?.removeAll?.()
+			return
+		}
+
+		if (this.editingMode) {
+			this.editPolygonPointDataSource && (this.editPolygonPointDataSource.entities.show = true)
+			this.editPolygonMidPointDataSource && (this.editPolygonMidPointDataSource.entities.show = true)
+			this.rebuildEditPoints()
+			this.rebuildMidPoints()
+		}
 	}
 	// 删除测区
 	deleteTheArea(data) {
@@ -110,12 +123,6 @@
 
 	// 开始绘制
 	startDrawing() {
-		if (!this.whetherToDraw) {
-		
-			return;
-		  }
-		 
-		  
 		this.drawingMode = true
 		this.curPolygon = new Cesium.PolygonHierarchy()
 
@@ -130,9 +137,16 @@
 			this.viewer?.dataSources.add(this.editPolygonPointDataSource)
 		}
 
+		// 中点数据源:编辑模式下用于“边上插点”
+		if (!this.editPolygonMidPointDataSource) {
+			this.editPolygonMidPointDataSource = new Cesium.CustomDataSource('editPolygonMidPointDataSource')
+			this.viewer?.dataSources.add(this.editPolygonMidPointDataSource)
+		}
+
 		// 清空之前的点
 		this.editPolygonDataSource?.entities.removeAll()
 		this.editPolygonPointDataSource?.entities.removeAll()
+		this.editPolygonMidPointDataSource?.entities.removeAll()
 	}
 
 	// 创建多边形实体(含边界线)
@@ -177,10 +191,162 @@
 				ind: pointIndex, // 索引记录
 			},
 		})
-	
-		
 	}
 
+	createMidPointEntity(startInd, position) {
+		// 使用 CallbackProperty 让中点位置随端点拖拽实时计算
+		// startInd 表示该中点属于边:(startInd) -> (startInd + 1)
+		const updatePosition = () => {
+			const positions = this.curPolygon?.positions
+			if (!positions || positions.length < 2) return position
+
+			const n = positions.length
+			const p1 = positions[startInd]
+			const p2 = positions[(startInd + 1) % n]
+			if (!p1 || !p2) return position
+
+			return Cesium.Cartesian3.midpoint(p1, p2, new Cesium.Cartesian3())
+		}
+
+		this.editPolygonMidPointDataSource.entities.add({
+			name: DrawPolygon.ENTITY_NAMES.MID_POINT,
+			id: `${DrawPolygon.ENTITY_NAMES.MID_POINT_ID_PREFIX}${startInd}`,
+			position: new Cesium.CallbackProperty(updatePosition, false),
+			point: {
+				pixelSize: 10,
+				color: Cesium.Color.fromCssColorString('rgba(255, 255, 255, .7)'),
+				heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+				disableDepthTestDistance: Number.POSITIVE_INFINITY,
+			},
+			customData: {
+				startInd,
+			},
+		})
+	}
+
+	rebuildEditPoints() {
+		// 插入/删除端点后:端点实体 id 与 customData.ind 需要全量重建,保证索引与 positions 一致
+		if (!this.isPreviewMode) return
+		if (!this.editPolygonPointDataSource || !this.curPolygon?.positions) return
+
+		this.editPolygonPointDataSource.entities.removeAll()
+		this.curPolygon.positions.forEach((position, index) => {
+			this.editPolygonPointDataSource.entities.add({
+				name: DrawPolygon.ENTITY_NAMES.POINT,
+				id: `${DrawPolygon.ENTITY_NAMES.POINT_ID_PREFIX}${index}`,
+				position: position.clone(),
+				point: {
+					pixelSize: 14,
+					color: Cesium.Color.WHITE,
+					heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+					disableDepthTestDistance: Number.POSITIVE_INFINITY,
+				},
+				customData: {
+					ind: index,
+				},
+			})
+		})
+	}
+
+	rebuildMidPoints() {
+		// 仅在“顶点数量变化/切换编辑态”时维护中点实体数量
+		// 拖拽过程中中点位置由 CallbackProperty 自动更新,不需要重建
+		if (!this.isPreviewMode) return
+		if (!this.editPolygonMidPointDataSource || !this.curPolygon?.positions) return
+
+		const positions = this.curPolygon.positions
+		const n = positions.length
+		const entities = this.editPolygonMidPointDataSource.entities
+
+		if (!this.editingMode || n < 2) {
+			entities.removeAll()
+			return
+		}
+
+		const neededIds = new Set()
+		for (let i = 0; i < n; i += 1) {
+			const id = `${DrawPolygon.ENTITY_NAMES.MID_POINT_ID_PREFIX}${i}`
+			neededIds.add(id)
+			// 缺少则补齐:保证每条边都有一个中点实体
+			if (!entities.getById(id)) {
+				const p1 = positions[i]
+				const p2 = positions[(i + 1) % n]
+				if (!p1 || !p2) continue
+				const mid = Cesium.Cartesian3.midpoint(p1, p2, new Cesium.Cartesian3())
+				this.createMidPointEntity(i, mid)
+			}
+		}
+
+		entities.values.slice().forEach(entity => {
+			if (entity?.name !== DrawPolygon.ENTITY_NAMES.MID_POINT) return
+			// 多余则移除:例如删除端点导致边数量减少
+			if (!neededIds.has(entity.id)) {
+				entities.remove(entity)
+			}
+		})
+	}
+
+	insertPointFromMidPoint(midPointEntity) {
+		// 点击中点:在对应边上插入一个新端点(白点),并立即进入拖拽态
+		if (!this.isPreviewMode) return
+		if (!this.editingMode) return
+		if (!midPointEntity?.customData) return
+
+		const startInd = midPointEntity.customData.startInd
+		// 中点位置可能是 CallbackProperty,需要取当前时刻的值
+		const positionProperty = midPointEntity.position
+		const entityPosition = positionProperty?.getValue
+			? positionProperty.getValue(Cesium.JulianDate.now())
+			: positionProperty
+		if (!entityPosition) return
+
+		// 插入到 startInd 与 startInd+1 之间
+		const insertIndex = Math.min(Math.max(startInd + 1, 0), this.curPolygon.positions.length)
+		this.curPolygon.positions.splice(insertIndex, 0, entityPosition.clone ? entityPosition.clone() : entityPosition)
+
+		this.rebuildEditPoints()
+		this.rebuildMidPoints()
+
+		const newPointEntity = this.editPolygonPointDataSource?.entities?.getById(
+			`${DrawPolygon.ENTITY_NAMES.POINT_ID_PREFIX}${insertIndex}`
+		)
+		if (newPointEntity) {
+			this.isDragging = true
+			this.draggedEntity = newPointEntity
+			this.currentDragPointPosition = this.curPolygon.positions[insertIndex]
+			this.disableMapControl()
+		}
+		this.notify('getPolygonPositions', this.curPolygon.positions)
+	}
+	// 清除不在范围内的点
+	removeLastInvalidPoint() {
+		const posLen = this.curPolygon.positions.length
+		if (posLen === 0) return
+
+		let targetPointId = ''
+		let removeCount = 0
+
+		if (posLen === 2) {
+			removeCount = 2
+			targetPointId = `${DrawPolygon.ENTITY_NAMES.POINT_ID_PREFIX}0`
+		} else if (posLen > 2) {
+			removeCount = 1
+			const pointIndex = posLen - 2
+			targetPointId = `${DrawPolygon.ENTITY_NAMES.POINT_ID_PREFIX}${pointIndex}`
+		}
+
+		this.curPolygon.positions.splice(posLen - removeCount, removeCount)
+
+		const invalidPoint = this.editPolygonPointDataSource.entities.getById(targetPointId)
+		if (invalidPoint) {
+			this.editPolygonPointDataSource.entities.remove(invalidPoint)
+		}
+
+		if (this.curPolygon.positions.length === 0 && this.polygonEntity) {
+			this.editPolygonDataSource.entities.remove(this.polygonEntity)
+			this.polygonEntity = null
+		}
+	}
 	// 添加一个点
 	addPosition(position, isAdd = true) {
 		// 第一个点要重复压入一次,形成动态绘制效果
@@ -211,12 +377,18 @@
 
 		const pickedEntity = this.viewer.scene.pick(movement.position)?.id
 		const isPoint = pickedEntity?.name === DrawPolygon.ENTITY_NAMES.POINT
+		const isMidPoint = pickedEntity?.name === DrawPolygon.ENTITY_NAMES.MID_POINT
 
 		if (pickedEntity && isPoint) {
 			this.isDragging = true
 			this.draggedEntity = pickedEntity
 			this.currentDragPointPosition = this.curPolygon.positions[this.draggedEntity?.customData.ind]
 			this.disableMapControl() // 禁止地图交互
+			return
+		}
+
+		if (pickedEntity && isMidPoint) {
+			this.insertPointFromMidPoint(pickedEntity)
 		}
 	}
 
@@ -249,6 +421,7 @@
 			this.isDragging = false
 			this.draggedEntity = null
 			this.enableMapControl()
+			this.rebuildMidPoints()
 		}
 	}
 
@@ -262,7 +435,7 @@
 		// 编辑模式下,拖拽点实时更新
 		if (this.editingMode && this.draggedEntity?.customData) {
 			this.draggedEntity.position = cartesian
-			this.curPolygon.positions[this.draggedEntity?.customData.ind] = cartesian			
+			this.curPolygon.positions[this.draggedEntity?.customData.ind] = cartesian
 		}
 
 		// 绘制模式下,实时更新最后一个点
@@ -293,27 +466,28 @@
 	// 鼠标左键点击
 	handleLeftClick(click) {
 		this.removeMenuPopup()
+
 		const pickedAllEntity = this.viewer.scene.drillPick(click.position).filter(i => i.id)
+		const isStartPoint = pickedAllEntity.find(i => i.id.name === '起飞点')
 		const isPolygonPoint = pickedAllEntity.find(i => i.id.name === DrawPolygon.ENTITY_NAMES.POINT)
 		const isPolygon = pickedAllEntity.find(i => i.id.name === DrawPolygon.ENTITY_NAMES.POLYGON)
-		if (this.drawingMode && !this.whetherToDraw) {
-		
-			return; // 阻断后续绘制逻辑
-		  }
+
+		if (isStartPoint) return
+
 		// 如果不是绘制模式
 		if (!this.drawingMode) {
 			if (!isPolygon) {
-				
-				
 				this.editingMode = false
 				this.editPolygonPointDataSource.entities.show = false
+				this.editPolygonMidPointDataSource && (this.editPolygonMidPointDataSource.entities.show = false)
 				return
 			}
 
 			if (isPolygon) {
-			
 				this.editingMode = true
 				this.editPolygonPointDataSource.entities.show = true
+				this.editPolygonMidPointDataSource && (this.editPolygonMidPointDataSource.entities.show = true)
+				this.rebuildMidPoints()
 			}
 			return
 		}
@@ -334,13 +508,22 @@
 		const cartesian = this.viewer.scene.pickPosition(click.position)
 		if (!cartesian) return
 
+		let arr = [...this.curPolygon.positions]
+		arr.pop()
+		// 校验多边形是否自交
+		if (arr.length > 2 && !this.curDragPointIsValid([...arr, cartesian])) {
+			ElMessage.warning('测区不支持交叉绘制,请重新绘制')
+			return
+		}
+
 		this.addPosition(cartesian)
 	}
 
 	// 鼠标右键点击(弹出菜单)
-	handleRightClick(click) {		
+	handleRightClick(click) {
 		const that = this
 		if (that.drawingMode) return
+
 		that.removeMenuPopup()
 
 		const pickedAllEntity = that.viewer.scene.drillPick(click.position).filter(i => i.id)
@@ -351,16 +534,14 @@
 		} = click
 
 		let pickedEntity, tooltipEvent, menuType
-		if (isPolygon) {
-			pickedEntity = isPolygon
-			tooltipEvent = that.delPolygon
-			menuType = 'polygon'
-		
-		} else if (isEditPoint) {
+		if (isEditPoint) {
 			pickedEntity = isEditPoint
 			tooltipEvent = that.delPoint
 			menuType = 'edit-point'
-			
+		} else if (isPolygon) {
+			pickedEntity = isPolygon
+			tooltipEvent = that.delPolygon
+			menuType = 'polygon'
 		}
 
 		if (pickedEntity && this.isDeleteTheArea) {
@@ -385,6 +566,11 @@
 			this.editPolygonPointDataSource.entities.removeAll()
 			this.editPolygonPointDataSource = null
 		}
+
+		if (this.editPolygonMidPointDataSource) {
+			this.editPolygonMidPointDataSource.entities.removeAll()
+			this.editPolygonMidPointDataSource = null
+		}
 		this.editingMode = false
 		this.polygonEntity = null
 		this.curPolygon = null
@@ -398,6 +584,8 @@
 			this.drawingMode = false
 			this.editingMode = true
 			this.editPolygonPointDataSource.entities.show = true
+			this.editPolygonMidPointDataSource && (this.editPolygonMidPointDataSource.entities.show = true)
+			this.rebuildMidPoints()
 
 			if (!this.curDragPointIsValid(this.curPolygon.positions)) {
 				this.isShowWaringTip = true
@@ -421,7 +609,12 @@
 		this.notify('getPolygonPositions', [])
 		this.startDrawing()
 	}
-
+	// 删除图斑
+	delSpot() {
+		this.removeEntities()
+		this.isPreviewMode = true
+		this.startDrawing()
+	}
 	// 删除端点
 	delPoint() {
 		if (this.curPolygon.positions.length <= 3) {
@@ -431,13 +624,9 @@
 		if (!this.delPolygonPoint) return
 
 		this.curPolygon.positions.splice(this.delPolygonPoint.customData.ind, 1)
-		this.editPolygonPointDataSource.entities.remove(this.delPolygonPoint)
 		this.removeMenuPopup()
-
-		// 更新剩余点索引
-		this.editPolygonPointDataSource.entities.values.forEach((item, index) => {
-			item.customData.ind = index
-		})
+		this.rebuildEditPoints()
+		this.rebuildMidPoints()
 
 		this.notify('getPolygonPositions', this.curPolygon.positions)
 	}
@@ -454,7 +643,6 @@
 		menuPopup.id = 'planarPolygonEditMenu'
 		menuPopup.className = 'planar-polygon-edit-menu'
 
-
 		const menuItems =
 			type === 'polygon'
 				? [{ title: '删除测区', class: 'del-planar-polygon' }]
@@ -466,7 +654,6 @@
 			titleDiv.className = item.class
 			menuPopup.appendChild(titleDiv)
 		})
-	
 		this.isPreviewMode = true
 		menuPopupVBox.appendChild(menuPopup)
 		return menuPopupVBox
@@ -522,23 +709,18 @@
 
 		return intersections.features.length === 0
 	}
-
 	// 初始化已有多边形
-	initPolygon(viewer, positions, isPurePreview = false) {
+	async initPolygon(viewer, positions, isPurePreview = false) {
 		this.initHandler(viewer)
-	
-		if (this.whetherToDraw) {
-			this.startDrawing();
-		  } else {
-			// 新增:不允许绘制时,确保绘制模式为 false,避免误触发
-			this.drawingMode = false;
-		
-		  }
-		
+		this.isPureSpotPreview = isPurePreview
+		this.startDrawing()
 		let newPosition = positions.map(item => {
-			return Cesium.Cartesian3.fromDegrees(Number(item.lng), Number(item.lat), Number(item.height))
+			return Cesium.Cartesian3.fromDegrees(Number(item.lng), Number(item.lat), Number(item?.height || 0))
 		})
-		
+		// 预览航线的时候调用
+		if (!this.isPureSpotPreview) {
+			this.notify('getPolygonPositions', newPosition)
+		}
 
 		newPosition.forEach(item => {
 			this.addPosition(item, false)
@@ -555,17 +737,20 @@
 			duration: 0.5,
 		})
 
+		let pointList = await getPointPositionsHeight(positions, viewer)
+		flyVisual({ positionsData: pointList.map(item => [item.lng, item.lat, item.ASL]), viewer })
+
 		this.drawingMode = false
 		this.editingMode = true
+		this.editPolygonPointDataSource && (this.editPolygonPointDataSource.entities.show = true)
+		this.editPolygonMidPointDataSource && (this.editPolygonMidPointDataSource.entities.show = true)
+		this.rebuildMidPoints()
 	}
 
 	// 初始化事件处理器
 	initHandler(viewer) {
 		this.viewer = viewer
-
-		if(this.whetherToDraw){
-			this.startDrawing()
-		}
+		this.startDrawing()
 
 		if (!this.handler) {
 			this.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
diff --git a/applications/task-work-order/src/utils/cesium/Material/index.js b/applications/task-work-order/src/utils/cesium/Material/index.js
index f96f7a8..d5aff41 100644
--- a/applications/task-work-order/src/utils/cesium/Material/index.js
+++ b/applications/task-work-order/src/utils/cesium/Material/index.js
@@ -54,6 +54,7 @@
     this._opacity = undefined
     this._alphaPower = undefined
     this._speed = undefined
+    this._xRepeatCount = undefined
 
     this.color = options.color || Cesium.Color.fromBytes(0, 255, 255, 255)
     this.glowPower = .25
@@ -64,6 +65,9 @@
     this.opacity = options.opacity || 0.5
     this.alphaPower = options.alphaPower || 1.5
     this.speed = options.speed || 5
+    this.xRepeatCount = options.xRepeatCount || 1
+
+
   }
 
   get isConstant () {
@@ -132,15 +136,17 @@
       color: new Cesium.Color(1.0, 1.0, 0.0, 0.7),
       bgColor: new Cesium.Color(0.0, 1.0, 0.0, 0.0),
       speed: 5,
-      globalAlpha: 1.0
+      globalAlpha: 1.0,
+      xRepeatCount: 1.0
     },
     source: `
           uniform vec4 bgColor;
           uniform vec4 color;
           uniform float speed;
           uniform float globalAlpha;
+          uniform float xRepeatCount; // 新增的 uniform 在着色器中
 
-          czm_material czm_getMaterial(czm_materialInput materialInput) {
+           czm_material czm_getMaterial(czm_materialInput materialInput) {
               czm_material material = czm_getDefaultMaterial(materialInput);
               vec2 st = materialInput.st;
               float time = fract(czm_frameNumber * speed / 1000.0);
@@ -150,7 +156,7 @@
                   colorMars3D = vec3(1.0);
               }
 
-              material.alpha = color.a * 1.5 * smoothstep(0.0, 1.0, fract(st.s - time));
+              material.alpha = color.a * 1.5 * smoothstep(0.0, 1.0, fract(st.s * xRepeatCount - time)); // 使用 xRepeatCount 来调整纹理重复
               material.diffuse = max(colorMars3D.rgb * material.alpha, colorMars3D.rgb);
 
               if (material.alpha < bgColor.a) {
@@ -182,6 +188,8 @@
     result.color = Cesium.Property.getValueOrUndefined(this._color, time)
     result.globalAlpha = Cesium.Property.getValueOrUndefined(this._opacity, time)
     result.speed = Cesium.Property.getValueOrUndefined(this._speed, time)
+    result.xRepeatCount = Cesium.Property.getValueOrUndefined(this._xRepeatCount, time)
+
     return result
   }
 
@@ -191,7 +199,8 @@
       (other instanceof LineTrailMaterial &&
         Cesium.Property.equals(this._color, other._color) &&
         Cesium.Property.equals(this._opacity, other._opacity) &&
-        Cesium.Property.equals(this._speed, other._speed))
+        Cesium.Property.equals(this._speed, other._speed) &&
+        Cesium.Property.equals(this._xRepeatCount, other._xRepeatCount))
     )
   }
 }
@@ -200,6 +209,7 @@
   color: Cesium.createPropertyDescriptor('color'),
   opacity: Cesium.createPropertyDescriptor('opacity'),
   speed: Cesium.createPropertyDescriptor('speed'),
+  xRepeatCount: Cesium.createPropertyDescriptor('xRepeatCount'),
 })
 
 
diff --git a/applications/task-work-order/src/utils/cesium/common.js b/applications/task-work-order/src/utils/cesium/common.js
index 0e1aefc..5c8ce3e 100644
--- a/applications/task-work-order/src/utils/cesium/common.js
+++ b/applications/task-work-order/src/utils/cesium/common.js
@@ -131,22 +131,22 @@
 	let newLat = lat
 
 	switch (direction) {
-		case 'W': // 向前(heading 方向)
+		case 'KeyW': // 向前(heading 方向)
 			newLon += moveStep * Math.sin(headingRad)
 			newLat += moveStep * Math.cos(headingRad)
 			break
 
-		case 'S': // 向后(反方向)
+		case 'KeyS': // 向后(反方向)
 			newLon -= moveStep * Math.sin(headingRad)
 			newLat -= moveStep * Math.cos(headingRad)
 			break
 
-		case 'D': // 向右(heading + 90°)
+		case 'KeyD': // 向右(heading + 90°)
 			newLon += moveStep * Math.cos(headingRad)
 			newLat -= moveStep * Math.sin(headingRad)
 			break
 
-		case 'A': // 向左(heading - 90°)
+		case 'KeyA': // 向左(heading - 90°)
 			newLon -= moveStep * Math.cos(headingRad)
 			newLat += moveStep * Math.sin(headingRad)
 			break
diff --git a/applications/task-work-order/src/utils/cesium/compressImage.js b/applications/task-work-order/src/utils/cesium/compressImage.js
new file mode 100644
index 0000000..0b09680
--- /dev/null
+++ b/applications/task-work-order/src/utils/cesium/compressImage.js
@@ -0,0 +1,55 @@
+/**
+ * @description: 图片压缩
+ * @param {*} src 图片地址
+ * @param {*} quality 压缩质量
+ * @param {*} maxWidth 最大宽度
+ * @param {*} callback 回调函数
+ * @return {*}
+ */
+function compressImage(src, quality, maxWidth, callback) {
+	const img = new Image()
+	img.setAttribute('crossOrigin', 'Anonymous')
+	img.onload = function () {
+		const canvas = document.createElement('canvas')
+		const ctx = canvas.getContext('2d')
+		let width = img.width
+		let height = img.height
+
+		if (width > maxWidth) {
+			height *= maxWidth / width
+			width = maxWidth
+		}
+
+		canvas.width = width
+		canvas.height = height
+		ctx.drawImage(img, 0, 0, width, height)
+
+		const newData = canvas.toDataURL('image/jpeg', quality)
+		// 使用atob()将base64转换为二进制字符串
+		const binaryString = window.atob(newData.split(',')[1])
+		const mimeString = newData.split(',')[0].split(':')[1].split(';')[0]
+		// 创建Blob对象
+		const array = []
+		for (let i = 0; i < binaryString.length; i++) {
+			array.push(binaryString.charCodeAt(i))
+		}
+		const blob = new Blob([new Uint8Array(array)], { type: mimeString })
+
+		callback(blob)
+	}
+	img.src = src
+
+	return src
+}
+
+export default function imageCompress(src, quality, maxWidth) {
+	// 使用例子
+	return compressImage(src, quality, maxWidth, function (blob) {
+		// 创建一个新的图片URL
+		const imageUrl = URL.createObjectURL(blob)
+		// 可以在这里使用imageUrl,比如设置为img元素的src
+		// document.getElementById('your-image-element').src = imageUrl;
+		// 当不需要这个URL的时候,释放它
+		URL.revokeObjectURL(imageUrl)
+	})
+}
diff --git a/applications/task-work-order/src/utils/cesium/compressImage2.js b/applications/task-work-order/src/utils/cesium/compressImage2.js
new file mode 100644
index 0000000..e28a427
--- /dev/null
+++ b/applications/task-work-order/src/utils/cesium/compressImage2.js
@@ -0,0 +1,46 @@
+/*
+ * @Author: GuLiMmo 2820890765@qq.com
+ * @Date: 2024-05-21 10:14:11
+ * @LastEditors: GuLiMmo 2820890765@qq.com
+ * @LastEditTime: 2024-05-21 10:20:34
+ * @FilePath: /bigScreen/src/utils/cesium/compressImage2.js
+ * @Description:
+ * Copyright (c) 2024 by GuLiMmo, All Rights Reserved.
+ */
+export default function compressImage(
+	src,
+	maxWidth,
+	maxHeight,
+	outputFormat = 'image/jpeg',
+	quality = 0.7
+) {
+	return new Promise((resolve, reject) => {
+		const image = new Image()
+		image.setAttribute('crossOrigin', 'Anonymous')
+		image.src = src
+		image.onload = () => {
+			let width = image.width
+			let height = image.height
+
+			if (width > maxWidth) {
+				height *= maxWidth / width
+				width = maxWidth
+			}
+
+			if (height > maxHeight) {
+				width *= maxHeight / height
+				height = maxHeight
+			}
+
+			const canvas = document.createElement('canvas')
+			canvas.width = width
+			canvas.height = height
+			const ctx = canvas.getContext('2d')
+			ctx.drawImage(image, 0, 0, width, height)
+
+			const newDataUrl = canvas.toDataURL(outputFormat, quality)
+			resolve(newDataUrl)
+		}
+		image.onerror = reject
+	})
+}
diff --git a/applications/task-work-order/src/utils/cesium/createRouteLine.js b/applications/task-work-order/src/utils/cesium/createRouteLine.js
index 2c8195e..6ec1c1f 100644
--- a/applications/task-work-order/src/utils/cesium/createRouteLine.js
+++ b/applications/task-work-order/src/utils/cesium/createRouteLine.js
@@ -2,17 +2,16 @@
 import { Decimal } from 'decimal.js'
 import _, { cloneDeep, throttle } from 'lodash'
 import { v4 as uuidv4 } from 'uuid'
-
 import { render } from 'vue'
-
+import { analysisPointLineKmz, handlePointListForKmz } from '@/views/newRoutePlan/Waypoint/pointWayLineUtils'
 import HistoryDronePopup from '@/components/DeviceJobDetails/HistoryDronePopup.vue'
 
-import { getNewPolygonData } from '@/views/RoutePlan/PlanarAirLine/planarRouteUtils'
+import {
+	getNewPolygonData,
+} from '@/views/newRoutePlan/routeUtils'
 
 import { analyzeKmzFile, removeTextKey, XMLToJSON } from '@/utils/cesium/kmz'
-
-import { ArrowLineMaterialProperty, LineTrailMaterial, PolylineGlowMaterial, } from '@/utils/cesium/Material'
-
+import { ArrowLineMaterialProperty, LineTrailMaterial, PolylineGlowMaterial } from '@/utils/cesium/Material'
 import CreateFrustum from '@/utils/cesium/frustum/CreateFrustum'
 import { ElMessage } from 'element-plus'
 
@@ -23,61 +22,21 @@
 import aircraftGltf from '@/assets/gltf/aircraft.gltf'
 import newNumPoint from '@/assets/images/newStartPoint.png'
 
-import {
-	getPolyLine,
-} from '@/views/RoutePlan/PointAirLine/pointWayLineUtils'
+import { getPolyLine } from '@/views/newRoutePlan/Waypoint/pointWayLineUtils'
 import store from '@/store/index'
+import newStartPoint from '@/assets/images/newStartPoint.png'
+import newStartPointMore from '@/assets/images/newStartPointMore.png'
+import {
+	arrowLineMaterialProperty, arrowLineMaterialPropertyGray, arrowLineMaterialPropertyGrayT,
+	arrowLineMaterialPropertyGreen,
+	arrowLineMaterialPropertyOrange,
+} from '@/hooks/useMorePointLine/useMorePointLine'
 
-let arrowLineMaterialProperty = new ArrowLineMaterialProperty({
-	color: new Cesium.Color(128 / 255, 215 / 255, 255 / 255, 1),
-	directionColor: new Cesium.Color(1, 1, 1, 1),
-	outlineColor: new Cesium.Color(1, 1, 1, 1),
-	outlineWidth: 0,
-	speed: 5
-})
 
-let arrowLineMaterialPropertyOrange = new ArrowLineMaterialProperty({
-	color: new Cesium.Color(255 / 255, 185 / 255, 58 / 255, 1),
-	directionColor: new Cesium.Color(1, 1, 1, 1),
-	outlineColor: new Cesium.Color(1, 1, 1, 1),
-	outlineWidth: 0,
-	speed: 5,
-})
-
-let arrowLineMaterialPropertyGreen = new ArrowLineMaterialProperty({
-	color: new Cesium.Color(6 / 255, 217 / 255, 87 / 255, 1),
-	directionColor: new Cesium.Color(1, 1, 1, 1),
-	outlineColor: new Cesium.Color(1, 1, 1, 1),
-	outlineWidth: 0,
-	speed: 5,
-})
-
-// 记录index
-let indexLog = 0
-// 颜色
-function getLineColor(lineNumber) {
-	// 颜色顺序: 蓝(0), 黄(1), 绿(2)
-	const colors = [arrowLineMaterialProperty, arrowLineMaterialPropertyOrange, arrowLineMaterialPropertyGreen]
-	// 计算颜色索引 (从0开始)
-	const colorIndex = (lineNumber - 1) % 3
-	// 返回对应颜色
-	return colors[colorIndex]
-}
-
-let runningLineMaterial = new LineTrailMaterial({
-	color: Cesium.Color.fromCssColorString('#1FFF69'),
-	opacity: 1,
-	speed: 10,
-})
 let runningTextColor = Cesium.Color.fromCssColorString('#1FFF69')
 let runningTextOffset = new Cesium.Cartesian2(0, -32)
-
-let pendingLineMaterial = new PolylineGlowMaterial({
-	color: Cesium.Color.fromCssColorString('#FFB81D'),
-})
 let pendingTextColor = Cesium.Color.fromCssColorString('#FFB81D')
 let pendingTextOffset = new Cesium.Cartesian2(0, 32)
-
 let MapPopUpBox = HistoryDronePopup
 
 function getZoomFactor (camerasInfo, type) {
@@ -95,10 +54,108 @@
 
 	return zoom_factor
 }
+// 记录index
+let indexLog = 0
+// 颜色
+function getPendingExecutionLineColor (lineNumber) {
+	// 颜色顺序: 蓝(灰), 更灰
+	const colors = [arrowLineMaterialPropertyGray, arrowLineMaterialPropertyGrayT]
+	// 计算颜色索引 (从0开始)
+	const colorIndex = (lineNumber - 1) % 2
+	// 返回对应颜色
+	return colors[colorIndex]
+}
+
+function getLineColor (lineNumber) {
+	// 颜色顺序: 蓝(0), 黄(1), 绿(2)
+	const colors = [arrowLineMaterialProperty, arrowLineMaterialPropertyOrange, arrowLineMaterialPropertyGreen]
+	// 计算颜色索引 (从0开始)
+	const colorIndex = (lineNumber - 1) % 3
+	// 返回对应颜色
+	return colors[colorIndex]
+}
+
+function getBase64Image (imgUrl) {
+	const img = new Image()
+	const canvas = document.createElement('canvas')
+	const ctx = canvas.getContext('2d')
+
+	return new Promise(resolve => {
+		img.onload = function () {
+			canvas.width = img.width
+			canvas.height = img.height
+			ctx.drawImage(img, 0, 0)
+			const base64 = canvas.toDataURL('image/png')
+			resolve(base64)
+		}
+		img.src = imgUrl
+	})
+}
+async function createCombinedSVG (index, billboardImageUrl) {
+	const base64Image = await getBase64Image(billboardImageUrl)
+	const svg = `
+	  <svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
+		<image href="${base64Image}" x="10" y="10" width="80" height="80"/>
+		<text x="50" y="54" font-size="26" fill="white" text-anchor="middle" dominant-baseline="middle">
+		  ${index + 1}
+		</text>
+	  </svg>
+	`
+	return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`
+}
+
+function findHeightByCoordinates (data, targetLng, targetLat) {
+	// 展平二维数组,然后查找第一个匹配的点
+	const allPoints = data.flat()
+	const point = allPoints.find(point =>
+		point.longitude === targetLng && point.latitude === targetLat
+	)
+
+	return point ? point.height : null
+}
+
+function renderingMachineNest (options) {
+	const { viewer, dockTransformPosition, dockPosition, data } = options
+	viewer.entities.add({
+		name: 'work-drone-route-point-dock',
+		position: dockTransformPosition,
+		billboard: {
+			image: endingOnlineImg,
+			width: 50,
+			height: 50,
+			disableDepthTestDistance: Number.POSITIVE_INFINITY,
+		},
+		customData: {
+			data,
+		},
+	})
+	viewer.entities.add({
+		name: 'work-drone-route--point-polyline',
+		position: dockTransformPosition,
+		polyline: getPolyLine(viewer, { value: [dockPosition] }, 0),
+	})
+}
+
+function renderingStartingPoint (options) {
+	const { viewer, startPosition, data } = options
+	viewer.entities.add({
+		name: 'work-drone-route-point-start',
+		position: startPosition,
+		billboard: {
+			image: rwqfdImg,
+			width: 50,
+			height: 50,
+			disableDepthTestDistance: Number.POSITIVE_INFINITY,
+		},
+		customData: {
+			data,
+		},
+	})
+}
 
 export default class CreateRouteLine {
 	/**
-	 * 
+	 *
 	 * @param {*} options 参数
 	 */
 	constructor(options) {
@@ -119,10 +176,9 @@
 
 	/**
 	 * 初始化viewer
-	 * @param {*} viewer 
+	 * @param {*} viewer
 	 */
 	initCreateRoute (viewer) {
-		indexLog = 0
 		this.viewer = viewer
 	}
 
@@ -138,24 +194,27 @@
 			const currentWaypointIndex = output?.ext['current_waypoint_index']
 
 			this.updataMultiNestData(sn, {
-				currentWaypointIndex
+				currentWaypointIndex,
 			})
 		}
 	}
 
 	/**
-	 * 请求航线文件数据并解析处理
+	 * 请求航线文件数据并绘制解析处理
 	 * @param {*} data 包含文件url等信息
-	 * @param {*} dronePosition 无人机位置
-	 * @returns  
+	 * @param {*} dockPosition 无人机位置
+	 * @returns
 	 */
-	async parsingFiles (data, dronePosition = null, isShowDock = false, isShowPointBillboard = true) {
+	async parsingFiles (data, dockPosition = null, isShowDock = false, isShowPointBillboard = true) {
+		console.log(data,'888')
 		const { url, wayline_type, device_sn } = data
-
-		if (!url) return dronePosition != null ? {
-			dronePosition: [{ lng: dronePosition.longitude, lat: dronePosition.latitude, alt: dronePosition.height }]
-		} : {}
-
+		indexLog = 0
+		if (!url)
+			return dockPosition != null
+				? {
+					dronePosition: [{ lng: dockPosition.longitude, lat: dockPosition.latitude, alt: dockPosition.height }],
+				}
+				: {}
 		this.updataMultiNestData(device_sn)
 
 		const res = await analyzeKmzFile(`${url}?_t=${new Date().getTime()}`)
@@ -178,16 +237,16 @@
 		const missionConfig = removeTextKey(waylinesXmlJson.missionConfig)
 		const waylinesXMLObj = removeTextKey(waylinesXmlJson.Folder)
 
-		if (templateType === "mapping3d") {
+		if (templateType === 'mapping3d') {
 			if (!waylinesXMLObj[0].Placemark.length) return ElMessage.error('没有航线点位')
 		} else {
 			if (!waylinesXMLObj.Placemark.length) return ElMessage.error('没有航线点位')
 		}
 
-		if ([2, 4, 5, 6, 7, 10].includes(Number(wayline_type))) {
-			if (templateType === "mapping3d") {
+		if ([2, 4, 5, 7, 10].includes(Number(wayline_type))) {
+			if (templateType === 'mapping3d') {
 				let morePolygonData = waylinesXMLObj.map(i => ({
-					data: i.Placemark
+					data: i.Placemark,
 				}))
 
 				let newPolygonData = getNewPolygonData(morePolygonData)
@@ -214,7 +273,7 @@
 					waylinesXMLObj[0],
 					missionConfig,
 					templateXmlJson,
-					dronePosition,
+					dockPosition,
 					data,
 					startPoint,
 					isShowDock,
@@ -227,7 +286,7 @@
 				waylinesXMLObj,
 				missionConfig,
 				templateXmlJson,
-				dronePosition,
+				dockPosition,
 				data,
 				startPoint,
 				isShowDock,
@@ -238,7 +297,7 @@
 			return this.drawPointRoute(
 				waylinesXMLObj,
 				missionConfig,
-				dronePosition,
+				dockPosition,
 				data,
 				startPoint,
 				isShowDock,
@@ -248,50 +307,231 @@
 		}
 	}
 
+	// 拆分航线
+	async splitWayLine (data, dronePosition = null, isShowDock = false, isShowPointBillboard = true) {
+		const {
+			pointPlacemark,
+			polygonList,
+			pointList,
+			templateType,
+			startPoint,
+			execute_height_mode,
+			auto_flight_speed,
+			take_off_security_height,
+			buffer_distance_meters,
+			missionConfig,
+			waylinesXMLObjR,
+		} = await analysisPointLineKmz(`${data.domain_url}${data.object_key}`)
+		const { positionArray, filePositions } = this.disposeData(
+			waylinesXMLObjR,
+			missionConfig,
+			null,
+			data,
+			startPoint,
+			0
+		)
+		let bigPointList = handlePointListForKmz({
+			placemark: pointPlacemark,
+			startPoint: startPoint,
+			execute_height_mode: execute_height_mode,
+			auto_flight_speed: auto_flight_speed,
+		})
+		// 路径线
+		let entityConfig
+		bigPointList.shift()
+		let flyPositions = bigPointList.map(i => [Number(i.longitude), Number(i.latitude), Number(i.height)])
+		// 渲染多个点
+		let firstTopPosition = null
+		let resultPosotions = []
+		await Promise.all(data.wayline_file_list.map(async (item, index) => {
+			// 小航线渲染线
+			const kmzUrl = import.meta.env.VITE_APP_AIRLINE_URL + item.object_key
+			const { pointList } = await analysisPointLineKmz(kmzUrl)
+			resultPosotions.push(pointList)
+		})).then(res => {
+			// 目的是区分大航线点属于哪条小航线
+			bigPointList.forEach(bigObj => {
+				let foundIndex = -1
+				// 遍历 resultPositions 查找匹配项
+				resultPosotions.some((subArray, subIndex) => {
+					const found = subArray.some(obj =>
+						obj.latitude === bigObj.latitude &&
+						obj.longitude === bigObj.longitude
+					)
+					if (found) {
+						foundIndex = subIndex
+						return true // 找到就停止搜索
+					}
+					return false
+				})
+				// 如果找到了,给 bigPointList 的对象添加标记
+				if (foundIndex !== -1) {
+					bigObj.log = foundIndex // 或 bigObj.index = foundIndex
+				}
+			})
+			console.log(bigPointList, '查看结果值') // 现在 bigPointList 会有 log 属性
+			bigPointList.map(async (i, index) => {
+				firstTopPosition = i
+				const position = Cesium.Cartesian3.fromDegrees(Number(i.longitude), Number(i.latitude), Number(findHeightByCoordinates(resultPosotions, i.longitude, i.latitude)))
+				const combinedImage = await createCombinedSVG(index, i.log % 2 ? newStartPoint : newStartPointMore)
+
+				entityConfig = {
+					name: 'work-drone-route-point-split',
+					position: position,
+					billboard: {
+						disableDepthTestDistance: Number.POSITIVE_INFINITY,
+						image: combinedImage,
+						width: 50,
+						height: 50,
+						verticalOrigin: Cesium.VerticalOrigin.CENTER,
+						horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
+					}
+				}
+
+				// 只在第一个点添加 label
+				if (index === 0) {
+					entityConfig.label = {
+						text: data.task_name || '',
+						font: 'bold 16px sans-serif',
+						fillColor: data.status === 2 ? runningTextColor : pendingTextColor,
+						pixelOffset: data.status === 2 ? runningTextOffset : pendingTextOffset,
+						style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+						outlineWidth: 2,
+						outlineColor: Cesium.Color.BLACK,
+						disableDepthTestDistance: Number.POSITIVE_INFINITY,
+					}
+				}
+
+				this.viewer.entities.add(entityConfig)
+			})
+		})
+
+		// 渲染航线
+		data.wayline_file_list.map(async (item, index) => {
+			// 小航线渲染线
+			const kmzUrl = import.meta.env.VITE_APP_AIRLINE_URL + item.object_key
+			const { pointList } = await analysisPointLineKmz(kmzUrl)
+			// if (curRouteLineData.value.droneData && splitLines.length === 1) {
+			// 	// 把pointList的第一个点替换为无人机位置
+			// 	pointList[0] = curRouteLineData.value.droneData[0]
+			// }
+			if (take_off_security_height + pointList[0].height > firstTopPosition.height) {
+				// 安全高度+机巢高度 > 第一个点高度
+				const positionTest = {
+					longitude: pointList[0].longitude,
+					latitude: pointList[0].latitude,
+					height: take_off_security_height + pointList[0].height,
+				}
+
+				const positionTest1 = {
+					longitude: pointList[1].longitude,
+					latitude: pointList[1].latitude,
+					height: take_off_security_height + pointList[0].height,
+				}
+				pointList.splice(1, 0, positionTest)
+				// 往数组中插入元素
+				pointList.splice(2, 0, positionTest1)
+				// console.log(pointList, 'pointList')
+			} else if (take_off_security_height + pointList[0].height < firstTopPosition.height) {
+				const positionTest = {
+					longitude: pointList[0].longitude,
+					latitude: pointList[0].latitude,
+					height: firstTopPosition.height,
+				}
+				pointList.splice(1, 0, positionTest)
+			}
+			const routePositions = pointList.map(i =>
+				Cesium.Cartesian3.fromDegrees(Number(i.longitude), Number(i.latitude), Number(i.height))
+			)
+
+			this.viewer.entities.add({
+				name: 'work-drone-route-line-split',
+				polyline: {
+					width: 4,
+					positions: routePositions,
+					material: data.status === 1 ? arrowLineMaterialPropertyGray : getLineColor(index + 1),
+					clampToGround: false,
+				},
+			})
+		})
+			// 落点线
+			; (bigPointList || [])?.forEach((item, index) => {
+				const topPosition = Cesium.Cartesian3.fromDegrees(
+					Number(item.longitude),
+					Number(item.latitude),
+					Number(item.height)
+				)
+				let setting = {
+					name: 'work-drone-route--planar-polyline-split',
+					position: topPosition,
+					polyline: getPolyLine(this.viewer, { value: bigPointList }, index),
+				}
+				this.viewer.entities.add(setting)
+			})
+		return {
+			entity: entityConfig,
+			routeLinePositions: positionArray,
+			filePositions:
+				dronePosition != null
+					? [{ lng: dronePosition.longitude, lat: dronePosition.latitude, alt: dronePosition.height }, ...filePositions]
+					: filePositions,
+		}
+	}
+
 	/**
 	 * 绘制面状航线
 	 * @param {*} lineObj 航线文件中的
 	 * @param {*} missionConfig 航线文件中的
 	 * @param {*} templateXmlJson 航线文件中的
-	 * @param {*} dronePosition 无人机位置
-	 * @param {*} data 
-	 * @param {*} startPoint 
-	 * @param {*} isShowPointBillboard 是否显示,航线起飞点,终点等标注
-	 * @returns 
+	 * @param {*} dockPosition 无人机位置
+	 * @param {*} data
+	 * @param {*} startPoint
+	 * @returns
 	 */
-	async drawPlanarRoute (lineObj, missionConfig, templateXmlJson, dronePosition, data, startPoint, isShowDock, isShowPointBillboard, wayline_type) {
-		const { positionArray, filePositions } = this.disposeData(lineObj, missionConfig, dronePosition, data, startPoint, wayline_type)
+	async drawPlanarRoute (
+		lineObj,
+		missionConfig,
+		templateXmlJson,
+		dockPosition,
+		data,
+		startPoint,
+		isShowDock,
+		isShowPointBillboard,
+		wayline_type
+	) {
+		const { positionArray, filePositions } = this.disposeData(
+			lineObj,
+			missionConfig,
+			dockPosition,
+			data,
+			startPoint,
+			wayline_type
+		)
 		const { device_sn } = data
 
-		const droneTransformPosition = Cesium.Cartesian3.fromDegrees(
-			Number(dronePosition.longitude),
-			Number(dronePosition.latitude),
-			Number(dronePosition.height),
+		const dockTransformPosition = Cesium.Cartesian3.fromDegrees(
+			Number(dockPosition.longitude),
+			Number(dockPosition.latitude),
+			Number(dockPosition.height)
 		)
 
 		let coordArr = null
 
 		const placemark = templateXmlJson.Folder?.Placemark
 		// 取出点位
-		const coordinates =
-			placemark.Polygon?.outerBoundaryIs.LinearRing.coordinates?.[
-				'#text'
-			]?.split('\n') || []
-
+		const coordinates = placemark.Polygon?.outerBoundaryIs.LinearRing.coordinates?.['#text']?.split('\n') || []
 		// 数组转换
-		coordArr = coordinates.map((coordinate) =>
+		coordArr = coordinates.map(coordinate =>
 			coordinate
 				.replace(/\s+/g, '')
 				.split(',')
-				.map((v) => Number(v)),
+				.map(v => Number(v))
 		)
 
 		// 获取当前经纬度绝对高度
-		let newCoordArr = coordArr.map(item => ([item[0], item[1], 0]))
-
+		let newCoordArr = coordArr.map(item => [item[0], item[1], 0])
 		let planarRouteEntity = this.viewer.entities.add({
 			name: 'work-drone-route-planar-polyline',
-
 			polyline: {
 				width: 3,
 				positions: positionArray,
@@ -300,30 +540,30 @@
 			},
 
 			customData: {
-				data
-			}
+				data,
+			},
 		})
 
 		let droppointPositions = (filePositions || [])?.map(i => ({
 			longitude: Number(i.lng),
 			latitude: Number(i.lat),
 			height: Number(i.alt),
-		}));
+		}))
 
-		// 落点线
-		(droppointPositions || [])?.forEach((item, index) => {
-			const topPosition = Cesium.Cartesian3.fromDegrees(
-				Number(item.longitude),
-				Number(item.latitude),
-				Number(item.height)
-			)
-			let setting = {
-				name: 'work-drone-route-planar-polyline',
-				position: topPosition,
-				polyline: getPolyLine(this.viewer, { value: droppointPositions }, index),
-			}
-			this.viewer.entities.add(setting)
-		})
+			// 落点线
+			; (droppointPositions || [])?.forEach((item, index) => {
+				const topPosition = Cesium.Cartesian3.fromDegrees(
+					Number(item.longitude),
+					Number(item.latitude),
+					Number(item.height)
+				)
+				let setting = {
+					name: 'work-drone-route--planar-polyline',
+					position: topPosition,
+					polyline: getPolyLine(this.viewer, { value: droppointPositions }, index),
+				}
+				this.viewer.entities.add(setting)
+			})
 
 		// 面状航线第一个点突出展示
 		isShowPointBillboard && this.startingIncreasePoint(positionArray)
@@ -340,9 +580,7 @@
 			name: 'work-drone-route-planar-border',
 
 			polyline: {
-				positions: Cesium.Cartesian3.fromDegreesArrayHeights(
-					cloneCoordArr.flat(),
-				),
+				positions: Cesium.Cartesian3.fromDegreesArrayHeights(cloneCoordArr.flat()),
 				width: 4,
 				material: new Cesium.PolylineOutlineMaterialProperty({
 					color: new Cesium.Color.fromBytes(74, 138, 233),
@@ -357,11 +595,8 @@
 		// 绘制面状地块--------------------
 		this.viewer.entities.add({
 			name: 'work-drone-route-planar-polygon',
-
 			polygon: {
-				hierarchy: Cesium.Cartesian3.fromDegreesArrayHeights(
-					newCoordArr.flat(),
-				),
+				hierarchy: Cesium.Cartesian3.fromDegreesArrayHeights(newCoordArr.flat()),
 				material: new Cesium.Color.fromBytes(75, 159, 221, 100),
 				outline: true,
 				outlineColor: new Cesium.Color.fromBytes(35, 85, 216, 255),
@@ -384,7 +619,7 @@
 
 				label: {
 					text: data.job_name || '',
-					font: 'bold 16px YouSheBiaoTiHei',
+					font: 'bold 16px sans-serif',
 					fillColor: Cesium.Color.WHITE,
 					pixelOffset: new Cesium.Cartesian2(0, -50),
 					style: Cesium.LabelStyle.FILL_AND_OUTLINE,
@@ -395,64 +630,31 @@
 			})
 		} else {
 			// 显示机巢位置
-			if (isShowDock) {
-				// 起点
-				this.viewer.entities.add({
-					name: 'work-drone-route-point-dock',
-
-					position: droneTransformPosition,
-
-					billboard: {
-						image: endingOnlineImg,
-						width: 50,
-						height: 50,
-						disableDepthTestDistance: Number.POSITIVE_INFINITY,
-					},
-
-					customData: {
-						data
-					}
-				})
-
-				this.viewer.entities.add({
-					name: 'work-drone-route--point-polyline',
-					position: droneTransformPosition,
-					polyline: getPolyLine(this.viewer, { value: [dronePosition] }, 0),
-				})
-			}
-
-			const startPosition = Cesium.Cartesian3.fromDegrees(
-				Number(filePositions[0].lng),
-				Number(filePositions[0].lat),
-				Number(filePositions[0].alt)
-			)
-
+			isShowDock && renderingMachineNest({
+				viewer: this.viewer,
+				dockTransformPosition,
+				dockPosition,
+				data
+			})
 			// 起点
-			isShowPointBillboard && this.viewer.entities.add({
-				name: 'work-drone-route-point-start',
-
-				position: startPosition,
-
-				billboard: {
-					image: rwqfdImg,
-					width: 50,
-					height: 50,
-					disableDepthTestDistance: Number.POSITIVE_INFINITY,
-				},
-
-				customData: {
-					data
-				}
+			isShowPointBillboard && renderingStartingPoint({
+				viewer: this.viewer,
+				startPosition: Cesium.Cartesian3.fromDegrees(
+					Number(filePositions[0].lng),
+					Number(filePositions[0].lat),
+					Number(filePositions[0].alt)
+				),
+				data
 			})
 		}
 
 		return {
 			entity: planarRouteEntity,
 			routeLinePositions: positionArray,
-			filePositions: dronePosition != null ? [
-				{ lng: dronePosition.longitude, lat: dronePosition.latitude, alt: dronePosition.height },
-				...filePositions
-			] : filePositions
+			filePositions:
+				dockPosition != null
+					? [{ lng: dockPosition.longitude, lat: dockPosition.latitude, alt: dockPosition.height }, ...filePositions]
+					: filePositions,
 		}
 	}
 
@@ -472,9 +674,7 @@
 
 		let setting = {
 			name: 'work-drone-route-planar-start',
-
 			position: positions,
-
 			billboard: {
 				image: this.planarBillboard('#2D8CF0'),
 				pixelOffset: new Cesium.Cartesian2(146, 72),
@@ -489,35 +689,48 @@
 	 * 绘制点航线
 	 * @param {*} lineObj 航线文件中的
 	 * @param {*} missionConfig 航线文件中的
-	 * @param {*} dronePosition 无人机位置
+	 * @param {*} dockPosition 无人机位置
 	 * @param {*} data 任务信息,航线地址等
-	 * @param {*} startPoint 
+	 * @param {*} startPoint
 	 * @param {*} isShowDock 是否显示机巢位置
-	 * @param {*} isShowPointBillboard 是否显示,航线起飞点,终点等标注
-	 * @returns 
+	 * @returns
 	 */
-	async drawPointRoute (lineObj, missionConfig, dronePosition, data, startPoint, isShowDock, isShowPointBillboard, wayline_type) {
-		const { positionArray, filePositions } = this.disposeData(lineObj, missionConfig, dronePosition, data, startPoint, wayline_type)
-		
-		const droneTransformPosition = Cesium.Cartesian3.fromDegrees(
-			Number(dronePosition.longitude),
-			Number(dronePosition.latitude),
-			Number(dronePosition.height),
+	async drawPointRoute (
+		lineObj,
+		missionConfig,
+		dockPosition,
+		data,
+		startPoint,
+		isShowDock,
+		isShowPointBillboard,
+		wayline_type
+	) {
+		const { positionArray, filePositions } = this.disposeData(
+			lineObj,
+			missionConfig,
+			dockPosition,
+			data,
+			startPoint,
+			wayline_type
 		)
 
+		const dockTransformPosition = Cesium.Cartesian3.fromDegrees(
+			Number(dockPosition.longitude),
+			Number(dockPosition.latitude),
+			Number(dockPosition.height)
+		)
 		// 路径线
 		let polyline
-		
+
+		indexLog = indexLog + 1
 
 		if (this.type === 'clusterScheduling') {
 			filePositions.forEach((item, index) => {
 				let position = Cesium.Cartesian3.fromDegrees(item.lng, item.lat, item.alt)
-
 				if (index === 0) {
 					this.viewer.entities.add({
 						name: 'work-drone-route-point-start',
 						position,
-
 						billboard: {
 							image: rwqfdImg,
 							outlineWidth: 0,
@@ -525,10 +738,9 @@
 							height: 50,
 							disableDepthTestDistance: Number.POSITIVE_INFINITY,
 						},
-
 						label: {
 							text: data.job_name || '',
-							font: 'bold 16px YouSheBiaoTiHei',
+							font: 'bold 16px sans-serif',
 							fillColor: data.type === 2 ? runningTextColor : pendingTextColor,
 							pixelOffset: data.type === 2 ? runningTextOffset : pendingTextOffset,
 							style: Cesium.LabelStyle.FILL_AND_OUTLINE,
@@ -540,9 +752,7 @@
 				} else if (index === filePositions.length - 1) {
 					this.viewer.entities.add({
 						name: 'work-drone-route-point-end',
-
 						position,
-
 						billboard: {
 							image: newEndPointImg,
 							outlineWidth: 0,
@@ -556,9 +766,7 @@
 				} else {
 					this.viewer.entities.add({
 						name: 'work-drone-route-point-approach',
-
 						position,
-
 						billboard: {
 							image: newNumPoint,
 							width: 50,
@@ -577,96 +785,56 @@
 					})
 				}
 			})
-
 			polyline = this.viewer.entities.add({
 				name: 'work-drone-route-point-polyline',
-
 				polyline: {
 					width: 4,
 					positions: positionArray,
-					material: data.type === 2 ? runningLineMaterial : pendingLineMaterial,
+					material: data.type === 2 ? getLineColor(indexLog) : arrowLineMaterialPropertyGray,
 					clampToGround: false,
-				}
+				},
 			})
 		} else {
 			// 显示机巢位置
-			if (isShowDock) {
-				// 起点
-				this.viewer.entities.add({
-					name: 'work-drone-route-point-dock',
-
-					position: droneTransformPosition,
-
-					billboard: {
-						image: endingOnlineImg,
-						width: 50,
-						height: 50,
-						disableDepthTestDistance: Number.POSITIVE_INFINITY,
-					},
-
-					customData: {
-						data
-					}
-				})
-
-				this.viewer.entities.add({
-					name: 'work-drone-route--point-polyline',
-					position: droneTransformPosition,
-					polyline: getPolyLine(this.viewer, { value: [dronePosition] }, 0),
-				})
-			}
-
-			const startPosition = Cesium.Cartesian3.fromDegrees(
-				Number(filePositions[0].lng),
-				Number(filePositions[0].lat),
-				Number(filePositions[0].alt)
-			)
-
+			isShowDock && renderingMachineNest({
+				viewer: this.viewer,
+				dockTransformPosition,
+				dockPosition
+			})
 			// 起点
-			isShowPointBillboard && this.viewer.entities.add({
-				name: 'work-drone-route-point-start',
-
-				position: startPosition,
-
-				billboard: {
-					image: rwqfdImg,
-					width: 50,
-					height: 50,
-					disableDepthTestDistance: Number.POSITIVE_INFINITY,
-				},
-
-				customData: {
-					data
-				}
+			isShowPointBillboard && renderingStartingPoint({
+				viewer: this.viewer,
+				startPosition: Cesium.Cartesian3.fromDegrees(
+					Number(filePositions[0].lng),
+					Number(filePositions[0].lat),
+					Number(filePositions[0].alt)
+				),
+				data
 			})
-
 			// 终点
-			isShowPointBillboard && this.viewer.entities.add({
-				name: 'work-drone-route-point-end',
-
-				position: positionArray[positionArray.length - 1],
-
-				billboard: {
-					image: new Cesium.ConstantProperty(endPointImg),
-					width: 30,
-					height: 30,
-					verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 底部对齐
-				},
-			})
-
+			isShowPointBillboard &&
+				this.viewer.entities.add({
+					name: 'work-drone-route-point-end',
+					position: positionArray[positionArray.length - 1],
+					billboard: {
+						image: new Cesium.ConstantProperty(endPointImg),
+						width: 30,
+						height: 30,
+						verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 底部对齐
+					},
+				})
+			console.log(data.status, '失败')
 			polyline = this.viewer.entities.add({
 				name: 'work-drone-route-point-polyline',
-
 				polyline: {
 					width: 4,
 					positions: positionArray,
-					material: getLineColor(indexLog),
+					material: data.status === 5 ? arrowLineMaterialPropertyGray : getLineColor(indexLog),
 					clampToGround: false,
 				},
-
 				customData: {
-					data
-				}
+					data,
+				},
 			})
 		}
 
@@ -674,47 +842,45 @@
 			longitude: Number(i.lng),
 			latitude: Number(i.lat),
 			height: Number(i.alt),
-		}));
+		}))
 
-		// 落点线
-		(droppointPositions || [])?.forEach((item, index) => {
-			const topPosition = Cesium.Cartesian3.fromDegrees(
-				Number(item.longitude),
-				Number(item.latitude),
-				Number(item.height)
-			)
+			// 落点线
+			; (droppointPositions || [])?.forEach((item, index) => {
+				const topPosition = Cesium.Cartesian3.fromDegrees(
+					Number(item.longitude),
+					Number(item.latitude),
+					Number(item.height)
+				)
 
-			let setting = {
-				name: 'work-drone-route-point-polyline',
-				position: topPosition,
-				polyline: getPolyLine(this.viewer, { value: droppointPositions }, index),
-			}
-			this.viewer.entities.add(setting)
-		})
+				let setting = {
+					name: 'work-drone-route--point-polyline',
+					position: topPosition,
+					polyline: getPolyLine(this.viewer, { value: droppointPositions }, index),
+				}
+				this.viewer.entities.add(setting)
+			})
 
 		return {
 			entity: polyline,
 			routeLinePositions: positionArray,
-			filePositions: dronePosition != null ? [
-				{ lng: dronePosition.longitude, lat: dronePosition.latitude, alt: dronePosition.height },
-				...filePositions
-			] : filePositions,
+			filePositions:
+				dockPosition !== null
+					? [{ lng: dockPosition.longitude, lat: dockPosition.latitude, alt: dockPosition.height }, ...filePositions]
+					: filePositions,
 		}
 	}
 
 	/**
 	 * 通用处理数据
-	 * @param {*} lineObj 
-	 * @param {*} missionConfig 
-	 * @param {*} dronePosition 
-	 * @param {*} startPoint 
+	 * @param {*} lineObj
+	 * @param {*} missionConfig
+	 * @param {*} dronePosition
+	 * @param {*} startPoint
 	 * @returns {} {positionArray: 带拼接点位置, filePositions:光航线点位置}
 	 */
 	disposeData (lineObj, missionConfig, dronePosition, data, startPoint, wayline_type) {
-		indexLog = indexLog + 1
 		const { device_sn } = data
-
-		const executeHeightMode = lineObj.executeHeightMode === "WGS84"
+		const executeHeightMode = lineObj.executeHeightMode === 'WGS84'
 
 		let filePositions = lineObj.Placemark.map(item => {
 			const [lng, lat] = item.Point.coordinates.split(',')
@@ -730,12 +896,14 @@
 		let safetyHeight
 
 		if (executeHeightMode) {
-			let startHeight = new Decimal(missionConfig.takeOffSecurityHeight)
-				.plus(dronePosition.height).toNumber()
+			let startHeight = new Decimal(missionConfig.takeOffSecurityHeight).plus(dronePosition?.height || 0).toNumber()
 
 			safetyHeight = startHeight < filePositions[0].alt ? filePositions[0].alt : startHeight
 		} else {
-			safetyHeight = missionConfig.takeOffSecurityHeight < filePositions[0].alt ? filePositions[0].alt : missionConfig.takeOffSecurityHeight
+			safetyHeight =
+				missionConfig.takeOffSecurityHeight < filePositions[0].alt
+					? filePositions[0].alt
+					: missionConfig.takeOffSecurityHeight
 		}
 
 		let safetyPositions = []
@@ -773,28 +941,38 @@
 		})
 
 		this.updataMultiNestData(device_sn, {
-			currentRoutePositions
+			currentRoutePositions,
 		})
 
 		if ([0].includes(wayline_type)) {
-			let startHeight = executeHeightMode ? filePositions[0].alt : filePositions[0].alt + (dronePosition != null ? dronePosition.height : 0)
-			let endHeight = executeHeightMode ? filePositions[1].alt : filePositions[1].alt + (dronePosition != null ? dronePosition.height : 0)
+			let startHeight = executeHeightMode
+				? filePositions[0].alt
+				: filePositions[0].alt + (dronePosition != null ? dronePosition.height : 0)
+			let endHeight = executeHeightMode
+				? filePositions[1].alt
+				: filePositions[1].alt + (dronePosition != null ? dronePosition.height : 0)
 
 			this.updataMultiNestData(device_sn, {
 				showPopupPosition: Cesium.Cartesian3.midpoint(
 					Cesium.Cartesian3.fromDegrees(filePositions[0].lng, filePositions[0].lat, startHeight),
 					Cesium.Cartesian3.fromDegrees(filePositions[1].lng, filePositions[1].lat, endHeight),
-					new Cesium.Cartesian3())
+					new Cesium.Cartesian3()
+				),
 			})
 		} else {
-			let startHeight = executeHeightMode ? safetyPositions[1].alt : safetyPositions[1].alt + (dronePosition != null ? dronePosition.height : 0)
-			let endHeight = executeHeightMode ? safetyPositions[2].alt : safetyPositions[2].alt + (dronePosition != null ? dronePosition.height : 0)
+			let startHeight = executeHeightMode
+				? safetyPositions[1].alt
+				: safetyPositions[1].alt + (dronePosition != null ? dronePosition.height : 0)
+			let endHeight = executeHeightMode
+				? safetyPositions[2].alt
+				: safetyPositions[2].alt + (dronePosition != null ? dronePosition.height : 0)
 
 			this.updataMultiNestData(device_sn, {
 				showPopupPosition: Cesium.Cartesian3.midpoint(
 					Cesium.Cartesian3.fromDegrees(safetyPositions[1].lng, safetyPositions[1].lat, startHeight),
 					Cesium.Cartesian3.fromDegrees(safetyPositions[2].lng, safetyPositions[2].lat, endHeight),
-					new Cesium.Cartesian3())
+					new Cesium.Cartesian3()
+				),
 			})
 		}
 
@@ -805,9 +983,9 @@
 
 				return {
 					...item,
-					alt: Number(height)
+					alt: Number(height),
 				}
-			})
+			}),
 		}
 	}
 
@@ -819,9 +997,10 @@
 			return i?.name && i?.name.includes('work-drone-route-')
 		})
 
-		Array.isArray(entities) && entities.forEach(item => {
-			this.viewer?.entities.remove(item)
-		})
+		Array.isArray(entities) &&
+			entities.forEach(item => {
+				this.viewer?.entities.remove(item)
+			})
 	}
 
 	// 当前无人机视椎体相关
@@ -847,11 +1026,22 @@
 				['wide', 'ir', 'zoom'].includes(curDroneData?.camera_type)
 			) {
 				if (curDroneData.camera_type === 'wide') {
-					fov = 60
+					fov = 65
 				} else {
-					const diffFocal = zoomFactor.value[curDroneData.camera_type].max - getZoomFactor(host?.cameras?.[0], curDroneData.camera_type)
-
-					fov = (60 / zoomFactor.value[curDroneData.camera_type].max) * (diffFocal === 0 ? 1 : diffFocal)
+					const cameraMultiplier = getZoomFactor(host?.cameras?.[0], curDroneData.camera_type)
+					switch (cameraMultiplier) {
+						case 2: fov = 30; break
+						case 3: fov = 19; break
+						case 4: fov = 15; break
+						case 5: fov = 13; break
+						case 6: fov = 11; break
+						case 7: fov = 9; break
+						case 8: fov = 8.34; break
+						case 9: fov = 7.68; break
+						case 10: fov = 6.9; break
+						case 14: fov = 5; break
+						default: fov = 55.946 * Math.exp(-0.4504 * cameraMultiplier) + 6.323
+					}
 				}
 			}
 
@@ -871,8 +1061,8 @@
 					pitch: 0,
 					heading: attitude_head,
 
-					isShowVideoPlan: this.isShowVideoPlan
-				})
+					isShowVideoPlan: this.isShowVideoPlan,
+				}),
 			})
 		}
 	}
@@ -882,7 +1072,7 @@
 
 		if (device_sn && live_status) {
 			this.updataMultiNestData(device_sn, {
-				camera_type: live_status?.[0].video_type || 'wide'
+				camera_type: live_status?.[0].video_type || 'wide',
 			})
 		}
 	}
@@ -897,14 +1087,9 @@
 		}
 	}
 
+	// 设置当前无人机视椎体信息面板
 	setFrustumInfoDetails (data) {
-		const {
-			dock_sn,
-			distance_to_airport,
-			distance_to_next_point,
-			estimated_time_to_next_point,
-			plane_mileage
-		} = data
+		const { dock_sn, distance_to_airport, distance_to_next_point, estimated_time_to_next_point, plane_mileage } = data
 
 		if (dock_sn) {
 			const aircraftEntity = this.viewer?.entities.values.find(i => {
@@ -924,7 +1109,9 @@
 				}
 
 				aircraftEntity.label = new Cesium.LabelGraphics({
-					text: `离机场平面距离:${distance_to_airport}m\n离下个航点平面距离:${Math.round(distance_to_next_point)}m\n到达下个航点剩余时间:${arrivalTime}\n航线总平面里程:${Math.round(plane_mileage)}m`,
+					text: `离机场平面距离:${distance_to_airport}m\n离下个航点平面距离:${Math.round(
+						distance_to_next_point
+					)}m\n到达下个航点剩余时间:${arrivalTime}\n航线总平面里程:${Math.round(plane_mileage)}m`,
 					font: '13px monospace',
 					showBackground: true,
 					horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
@@ -936,7 +1123,6 @@
 
 				return
 			}
-
 		}
 	}
 
@@ -954,8 +1140,10 @@
 		}
 	}
 
+	// 设置无人机模型
 	setAircraftGltf (host) {
 		const parent_sn = host?.parent_sn
+		const attitude_head = Number(host?.payloads?.[0]?.gimbal_yaw) - 90 || 0
 
 		if (parent_sn) {
 			const aircraftEntity = this.viewer?.entities.values.find(i => {
@@ -963,9 +1151,18 @@
 			})
 
 			const position = Cesium.Cartesian3.fromDegrees(host?.longitude, host?.latitude, host?.height)
+			// ✅ 新增:Heading / Pitch / Roll(单位:度 -> 弧度)
+			const heading = Cesium.Math.toRadians(attitude_head) // 航向角
+			const pitch = Cesium.Math.toRadians(0)     // 俯仰角
+			const roll = Cesium.Math.toRadians(0)       // 横滚角
+
+			// ✅ 新增:构造 HeadingPitchRoll 和 四元数
+			const hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll)
+			const orientation = Cesium.Transforms.headingPitchRollQuaternion(position, hpr)
 
 			if (aircraftEntity) {
 				aircraftEntity.position = new Cesium.ConstantPositionProperty(position)
+				aircraftEntity.orientation = new Cesium.ConstantProperty(orientation)
 
 				return
 			}
@@ -974,18 +1171,35 @@
 				this.viewer?.entities.add({
 					name: `aircraft-glf-${parent_sn}`,
 					position,
+					orientation,
 					label: {},
 					model: {
 						uri: aircraftGltf, // 或 .glb
-						scale: 1.0, // 缩放比例
+						scale: 64, // 缩放比例
 						minimumPixelSize: 64, // 最小像素尺寸(保证模型远处可见)
-						maximumScale: 128, // 最大缩放(可选)
+						maximumScale: 64, // 最大缩放(可选)
 					},
 				})
 			}
 		}
 	}
 
+	// 移除无人机模型
+	removeAircraftGltf (host) {
+		const parent_sn = host?.parent_sn
+
+		if (parent_sn) {
+			const aircraftEntity = this.viewer?.entities.values.find(i => {
+				return i?.name && i?.name.includes(`aircraft-glf-${parent_sn}`)
+			})
+
+			if (aircraftEntity) {
+				this.viewer?.entities.remove(aircraftEntity)
+			}
+		}
+	}
+
+	// 移除所有无人机视椎体
 	removeViewInfoFrustum () {
 		this.multiNestData.forEach(item => {
 			if ('viewInfoFrustum' in item && item.viewInfoFrustum) {
@@ -1010,9 +1224,10 @@
 				return i?.name && i?.name.includes(`aircraft-glf-${parent_sn}`)
 			})
 
-			Array.isArray(entities) && entities.forEach(item => {
-				this.viewer?.entities.remove(item)
-			})
+			Array.isArray(entities) &&
+				entities.forEach(item => {
+					this.viewer?.entities.remove(item)
+				})
 		}
 	}
 
@@ -1021,13 +1236,15 @@
 			return i?.name && i?.name.includes(`aircraft-glf-`)
 		})
 
-		Array.isArray(entities) && entities.forEach(item => {
-			this.viewer?.entities.remove(item)
-		})
+		Array.isArray(entities) &&
+			entities.forEach(item => {
+				this.viewer?.entities.remove(item)
+			})
 
-		this.multiNestData.length > 0 && (this.multiNestData.forEach(item => {
-			item.viewInfoFrustum?.clear()
-		}))
+		this.multiNestData.length > 0 &&
+			this.multiNestData.forEach(item => {
+				item.viewInfoFrustum?.clear()
+			})
 	}
 
 	/**
@@ -1043,19 +1260,19 @@
 			this.multiNestData[isHaveInd] = {
 				...this.multiNestData[isHaveInd],
 
-				...data
+				...data,
 			}
 		} else {
 			this.multiNestData.push({
 				device_sn,
-				...data
+				...data,
 			})
 		}
 	}
 
 	/**
 	 * 根据机巢sn获取当前机巢对应的相关信息
-	 * @param {*} device_sn 
+	 * @param {*} device_sn
 	 */
 	getCurDroneData (device_sn) {
 		const isHave = this.multiNestData.find(item => item.device_sn === device_sn)
@@ -1071,14 +1288,16 @@
 			return {
 				...item,
 				show: true,
-				uuid: uuidv4()
+				uuid: uuidv4(),
 			}
 		})
 		this.viewer.scene.postRender.addEventListener(that.labelBoxRenderHandler)
 	}
 
 	showSingleDetailMapPopup (data) {
-		this.detailsMapPopupData.forEach(i => i.job_id === data.job_id && i.device_sn === data.device_sn && (i.show = true))
+		this.detailsMapPopupData.forEach(
+			i => i?.job_id === data?.job_id && i?.device_sn === data?.device_sn && (i.show = true)
+		)
 	}
 
 	getLabelDom (data) {
@@ -1090,28 +1309,30 @@
 		tooltipContainer.style.position = 'absolute'
 		tooltipContainer.style.transform = 'translate(-50%,10%)'
 		tooltipContainer.style.pointerEvents = 'none'
-		document.querySelector('.content-map-popups')?.append(tooltipContainer)
+		document.querySelector('.content-map-popups').append(tooltipContainer)
 		render(vNode, tooltipContainer)
 		return tooltipContainer
 	}
 
 	labelBoxRender () {
-		this.detailsMapPopupData.filter(i => i.show === true).forEach(item => {
-			const { showPopupPosition } = this.getCurDroneData(item.device_sn)
+		this.detailsMapPopupData
+			.filter(i => i.show === true)
+			.forEach(item => {
+				const { showPopupPosition } = this.getCurDroneData(item.device_sn)
 
-			let dom = document.querySelector(`[id="${item.uuid}"]`)
+				let dom = document.querySelector(`[id="${item.uuid}"]`)
 
-			if (!dom) {
-				dom = this.getLabelDom(item)
-			}
+				if (!dom) {
+					dom = this.getLabelDom(item)
+				}
 
-			const screenPosition = this.viewer?.scene.cartesianToCanvasCoordinates(showPopupPosition)
-			if (screenPosition) {
-				dom.style.left = `${screenPosition.x}px`
-				dom.style.top = `${screenPosition.y}px`
-				dom.style.display = 'block'
-			}
-		})
+				const screenPosition = this.viewer?.scene.cartesianToCanvasCoordinates(showPopupPosition)
+				if (screenPosition) {
+					dom.style.left = `${screenPosition.x}px`
+					dom.style.top = `${screenPosition.y}px`
+					dom.style.display = 'block'
+				}
+			})
 	}
 
 	// 移除弹框标签
@@ -1137,4 +1358,4 @@
 		const that = this
 		that.viewer?.scene.postRender.removeEventListener(that.labelBoxRenderHandler)
 	}
-}
\ No newline at end of file
+}
diff --git a/applications/task-work-order/src/utils/cesium/eventBus.js b/applications/task-work-order/src/utils/cesium/eventBus.js
deleted file mode 100644
index 674e1dc..0000000
--- a/applications/task-work-order/src/utils/cesium/eventBus.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import mitt from 'mitt'
-
-const emitter = mitt()
-
-export default emitter
diff --git a/applications/task-work-order/src/utils/cesium/frustum/CesiumVideoFrustum.js b/applications/task-work-order/src/utils/cesium/frustum/CesiumVideoFrustum.js
new file mode 100644
index 0000000..6dd75b8
--- /dev/null
+++ b/applications/task-work-order/src/utils/cesium/frustum/CesiumVideoFrustum.js
@@ -0,0 +1,712 @@
+/*
+ * @Author       : yuan
+ * @Date         : 2025-08-16 17:01:46
+ * @LastEditors  : yuan
+ * @LastEditTime : 2025-09-26 16:27:20
+ * @FilePath     : \src\utils\cesium\frustum\CesiumVideoFrustum.js
+ * @Description  :
+ * Copyright 2025 OBKoro1, All Rights Reserved.
+ * 2025-08-16 17:01:46
+ */
+import * as Cesium from 'cesium'
+
+var videoShed3dShader = `
+uniform float ztzf_frustum_opacity;
+
+uniform sampler2D ztzf_frustum_videoTexture;
+uniform sampler2D ztzf_frustum_maskTexture;
+uniform vec4 ztzf_frustum_hiddenAreaColor;
+
+uniform sampler2D shadowMap_texture;
+uniform mat4 shadowMap_matrix;
+uniform vec4 shadowMap_lightPositionEC;
+uniform vec4 shadowMap_texelSizeDepthBias;
+uniform vec4 shadowMap_normalOffsetScale;
+uniform bool ztzf_frustum_flipx;
+uniform bool ztzf_frustum_flipy;
+
+// 新增边框参数
+uniform vec4 ztzf_frustum_borderColor;  // 边框颜色(RGBA)
+uniform float ztzf_frustum_borderWidth; // 边框宽度(0.0-1.0)
+
+uniform sampler2D colorTexture;
+uniform sampler2D depthTexture;
+in vec2 v_textureCoordinates;
+
+vec4 toEye(in vec2 uv, in float depth) {
+  vec2 xy = vec2((uv.x * 2.0 - 1.0), (uv.y * 2.0 - 1.0));
+  vec4 posInCamera = czm_inverseProjection * vec4(xy, depth, 1.0);
+  posInCamera = posInCamera / posInCamera.w;
+  return posInCamera;
+}
+
+float getDepthMars3D(in vec4 depth) {
+  float z_window = czm_unpackDepth(depth);
+  z_window = czm_reverseLogDepth(z_window);
+  float n_range = czm_depthRange.near;
+  float f_range = czm_depthRange.far;
+  return (2.0 * z_window - n_range - f_range) / (f_range - n_range);
+}
+float _czm_sampleShadowMap(sampler2D shadowMap, vec2 uv) {
+  return texture(shadowMap, uv).r;
+}
+float _czm_shadowDepthCompare(sampler2D shadowMap, vec2 uv, float depth) {
+  return step(depth, _czm_sampleShadowMap(shadowMap, uv));
+}
+float _czm_shadowVisibility(sampler2D shadowMap, czm_shadowParameters shadowParameters) {
+  float depthBias = shadowParameters.depthBias;
+  float depth = shadowParameters.depth;
+  float nDotL = shadowParameters.nDotL;
+  float normalShadingSmooth = shadowParameters.normalShadingSmooth;
+  float darkness = shadowParameters.darkness;
+  vec2 uv = shadowParameters.texCoords;
+  depth -= depthBias;
+  vec2 texelStepSize = shadowParameters.texelStepSize;
+  float radius = 1.0;
+  float dx0 = -texelStepSize.x * radius;
+  float dy0 = -texelStepSize.y * radius;
+  float dx1 = texelStepSize.x * radius;
+  float dy1 = texelStepSize.y * radius;
+  float visibility = (_czm_shadowDepthCompare(shadowMap, uv, depth) +
+    _czm_shadowDepthCompare(shadowMap, uv + vec2(dx0, dy0), depth) +
+    _czm_shadowDepthCompare(shadowMap, uv + vec2(0.0, dy0), depth) +
+    _czm_shadowDepthCompare(shadowMap, uv + vec2(dx1, dy0), depth) +
+    _czm_shadowDepthCompare(shadowMap, uv + vec2(dx0, 0.0), depth) +
+    _czm_shadowDepthCompare(shadowMap, uv + vec2(dx1, 0.0), depth) +
+    _czm_shadowDepthCompare(shadowMap, uv + vec2(dx0, dy1), depth) +
+    _czm_shadowDepthCompare(shadowMap, uv + vec2(0.0, dy1), depth) +
+    _czm_shadowDepthCompare(shadowMap, uv + vec2(dx1, dy1), depth)) * (1.0 / 9.0);
+  return visibility;
+}
+
+vec3 pointProjectOnPlane(in vec3 planeNormal, in vec3 planeOrigin, in vec3 point) {
+  vec3 v01 = point - planeOrigin;
+  float d = dot(planeNormal, v01);
+  return (point - planeNormal * d);
+}
+float ptm(vec3 pt) {
+  return sqrt(pt.x * pt.x + pt.y * pt.y + pt.z * pt.z);
+}
+
+void main() {
+  const float PI = 3.141592653589793;
+  vec4 color = texture(colorTexture, v_textureCoordinates);
+  vec4 currD = texture(depthTexture, v_textureCoordinates);
+
+  float depth = getDepthMars3D(currD);
+  vec4 positionEC = toEye(v_textureCoordinates, depth);
+  vec3 normalEC = vec3(1.0);
+  czm_shadowParameters shadowParameters;
+  shadowParameters.texelStepSize = shadowMap_texelSizeDepthBias.xy;
+  shadowParameters.depthBias = shadowMap_texelSizeDepthBias.z;
+  shadowParameters.normalShadingSmooth = shadowMap_texelSizeDepthBias.w;
+  shadowParameters.darkness = shadowMap_normalOffsetScale.w;
+  shadowParameters.depthBias *= max(depth * 0.01, 1.0);
+
+  vec3 directionEC = normalize(positionEC.xyz - shadowMap_lightPositionEC.xyz);
+  float nDotL = clamp(dot(normalEC, -directionEC), 0.0, 1.0);
+  vec4 shadowPosition = shadowMap_matrix * positionEC;
+  shadowPosition /= shadowPosition.w;
+  if(any(lessThan(shadowPosition.xyz, vec3(0.0))) || any(greaterThan(shadowPosition.xyz, vec3(1.0)))) {
+    out_FragColor = color;
+    return;
+  }
+
+  shadowParameters.texCoords = shadowPosition.xy;
+  shadowParameters.depth = shadowPosition.z;
+  shadowParameters.nDotL = nDotL;
+  float visibility = _czm_shadowVisibility(shadowMap_texture, shadowParameters);
+
+  //视频投射
+  if(visibility == 1.0) {
+    if(ztzf_frustum_flipx){
+      shadowPosition.x = shadowPosition.x + (0.5 - shadowPosition.x) * 2.0;
+    }
+    if(ztzf_frustum_flipy){
+      shadowPosition.y = shadowPosition.y + (0.5 - shadowPosition.y) * 2.0;
+    }
+
+    vec4 videoColor = texture(ztzf_frustum_videoTexture, shadowPosition.xy);
+    vec4 maskColor = texture(ztzf_frustum_maskTexture, shadowPosition.xy);
+    videoColor *= maskColor;
+    
+    // 计算到边缘的距离
+    float distToEdge = min(
+        min(shadowPosition.x, 1.0 - shadowPosition.x),
+        min(shadowPosition.y, 1.0 - shadowPosition.y)
+    );
+    
+    // 混合视频颜色和背景
+    vec4 finalColor = mix(color, vec4(videoColor.xyz, 1.0), ztzf_frustum_opacity * videoColor.a);
+    
+    // 添加边框效果
+    if(distToEdge < ztzf_frustum_borderWidth && videoColor.a > 0.0) {
+        float borderFactor = smoothstep(0.0, ztzf_frustum_borderWidth, distToEdge);
+        finalColor = mix(ztzf_frustum_borderColor, finalColor, borderFactor);
+    }
+    
+    out_FragColor = finalColor;
+  } else {
+    if(abs(shadowPosition.z - 0.0) < 0.01) {
+      return;
+    }
+    out_FragColor = vec4(mix(color.rgb, ztzf_frustum_hiddenAreaColor.rgb, ztzf_frustum_hiddenAreaColor.a), ztzf_frustum_hiddenAreaColor.a);
+  }
+}
+    `
+
+class CesiumVideoFrustum {
+    constructor(viewer, param) {
+        this.param = param
+
+        var option = this._initCameraParam()
+
+        if (option || (option = {}), this.viewer = viewer, this._cameraPosition = option.cameraPosition, this._position = option.position,
+            this.type = option.type, this._alpha = option.alpha || 0, this.element = option.element, this.color = option.color,
+            this._debugFrustum = Cesium.defaultValue(option.debugFrustum, !0), this._aspectRatio = option.aspectRatio || this._getWinWidHei(),
+            this._camerafov = option.fov || Cesium.Math.toDegrees(this.viewer.scene.camera.frustum.fov),
+            this._isShadowMap = option.isShadowMap || false,
+            this.texture = option.texture || new Cesium.Texture({
+                context: this.viewer.scene.context,
+                source: {
+                    width: 1,
+                    height: 1,
+                    arrayBufferView: new Uint8Array([255, 255, 255, 255])
+                },
+                flipY: !1
+            }), this.defaultShow = Cesium.defaultValue(option.show, !0), !this.cameraPosition || !this.position) return void console.log('初始化失败:请确认相机位置与视点位置正确!')
+
+        this.activeVideo()
+        this._createShadowMap()
+        this._getOrientation()
+        this._addCameraFrustum()
+        this._addPostProcess()
+        this.viewer.scene.primitives.add(this)
+    }
+
+    get alpha () {
+        return this._alpha
+    }
+
+    set alpha (e) {
+        this._alpha = e
+        this._changeViewPos()
+    }
+
+    get aspectRatio () {
+        return this._aspectRatio
+    }
+
+    set aspectRatio (e) {
+        this._aspectRatio = e
+        this._changeVideoWidHei()
+    }
+
+    get debugFrustum () {
+        return this._debugFrustum
+    }
+
+    set debugFrustum (e) {
+        this._debugFrustum = e
+        this.cameraFrustum.show = e
+        this.cameraFrustumOutline.show = e
+    }
+
+    get fov () {
+        return this._camerafov
+    }
+
+    set fov (e) {
+        this._camerafov = e
+        this._changeCameraFov()
+    }
+
+    get cameraPosition () {
+        return this._cameraPosition
+    }
+
+    set cameraPosition (e) {
+        e && (this._cameraPosition = e, this._changeCameraPos())
+    }
+
+    get isShadowMap () {
+        return this._isShadowMap
+    }
+
+    set isShadowMap (e) {
+        this._isShadowMap = e
+        this._changeCameraIsShadowMap()
+    }
+
+    get position () {
+        return this._position
+    }
+
+    set position (e) {
+        e && (this._position = e, this._changeViewPos())
+    }
+
+    get params () {
+        var t = {}
+        return t.element = this.element,
+            t.position = this.position,
+            t.cameraPosition = this.cameraPosition,
+            t.fov = this.fov,
+            t.isShadowMap = this.isShadowMap,
+            t.aspectRatio = this.aspectRatio,
+            t.alpha = this.alpha,
+            t.debugFrustum = this.debugFrustum,
+            t.show = this.show
+    }
+
+    get show () {
+        return this.defaultShow
+    }
+
+    set show (e) {
+        this.defaultShow = Boolean(e),
+            this._switchShow()
+    }
+
+    isDestroyed () {
+        return false
+    }
+
+    _initCameraParam () {
+        var cameraPosition = Cesium.Cartesian3.fromDegrees(this.param.position.x * 1, this.param.position.y * 1, this.param.position.z * 1)
+
+        const hpr = Cesium.HeadingPitchRoll.fromDegrees(this.param.rotation.y * 1, this.param.rotation.x * 1, 0)
+        const orientation = Cesium.Transforms.headingPitchRollQuaternion(cameraPosition, hpr)
+
+        let matrix = Cesium.Matrix3.fromQuaternion(
+            orientation,
+            new Cesium.Matrix3()
+        )
+
+        let direction = Cesium.Matrix3.getColumn(matrix, 2, new Cesium.Cartesian3())
+
+        let frontDirect = Cesium.Cartesian3.multiplyByScalar(
+            direction,
+            250,
+            new Cesium.Cartesian3()
+        )
+        let position = Cesium.Cartesian3.add(cameraPosition, frontDirect, new Cesium.Cartesian3())
+
+        return {
+            cameraPosition: cameraPosition,
+            position: position,
+            alpha: this.param.alpha,
+            near: this.param.near,
+            fov: this.param.fov,
+            isShadowMap: this.param.isShadowMap,
+            debugFrustum: this.param.debugFrustum,
+            aspectRatio: this.param.aspectRatio,
+            element: this.param.element,
+        }
+    }
+
+    _changeAlpha (e) {
+        this.alpha = e
+    }
+
+    _changeAspectRatio (e) {
+        this.aspectRatio = e
+    }
+
+    _changeRotation (e) {
+        if (e) {
+            this.param.rotation = e
+            var option = this._initCameraParam()
+            this.position = option.position
+        }
+    }
+
+    _changeCameraPosition (e) {
+        if (e) {
+            this.param.position = e
+            var option = this._initCameraParam()
+            this.cameraPosition = option.cameraPosition
+        }
+    }
+
+    _changeFov (e) {
+        if (e) {
+            this.param.fov = e
+            var option = this._initCameraParam()
+            this.fov = option.fov
+        }
+    }
+
+    _changeIsShadowMap (e) {
+        this.param.isShadowMap = e
+        var option = this._initCameraParam()
+        this.isShadowMap = option.isShadowMap
+    }
+
+    _changeFar (e) {
+        if (e) {
+            this.param.far = e
+            var option = this._initCameraParam()
+            this.position = option.position
+        }
+    }
+
+    _changeNear (e) {
+        if (e) {
+            this.param.near = e
+            this.near = this.param.near
+            this._changeCameraPos()
+        }
+    }
+
+    _getWinWidHei () {
+        var viewer = this.viewer.scene
+        return viewer.canvas.clientWidth / viewer.canvas.clientHeight
+    }
+
+    _changeCameraFov () {
+        this.postProcess && this.viewer.scene.postProcessStages.remove(this.postProcess)
+
+        this.viewer.scene.primitives.remove(this.cameraFrustum),
+            this.viewer.scene.primitives.remove(this.cameraFrustumOutline),
+            this._createShadowMap(this.cameraPosition, this.position),
+            this._getOrientation(),
+            this._addCameraFrustum(),
+            this._addPostProcess()
+    }
+
+    _changeCameraIsShadowMap () {
+        this.postProcess && this.viewer.scene.postProcessStages.remove(this.postProcess)
+
+        this.viewShadowMap && this.viewShadowMap.destroy()
+        this.viewShadowMap = null
+
+        this.viewer.scene.primitives.remove(this.cameraFrustum),
+            this.viewer.scene.primitives.remove(this.cameraFrustumOutline),
+            this._createShadowMap(this.cameraPosition, this.position),
+            this._getOrientation(),
+            this._addCameraFrustum(),
+            this._addPostProcess()
+    }
+
+    _changeVideoWidHei () {
+        this.postProcess && this.viewer.scene.postProcessStages.remove(this.postProcess)
+
+        this.viewer.scene.primitives.remove(this.cameraFrustum),
+            this.viewer.scene.primitives.remove(this.cameraFrustumOutline),
+            this._createShadowMap(this.cameraPosition, this.position),
+            this._getOrientation(),
+            this._addCameraFrustum(),
+            this._addPostProcess()
+    }
+
+    _changeCameraPos () {
+        this.postProcess && this.viewer.scene.postProcessStages.remove(this.postProcess)
+
+        this.viewShadowMap && this.viewShadowMap.destroy()
+        this.viewShadowMap = null
+
+        this.viewer.scene.primitives.remove(this.cameraFrustum),
+            this.viewer.scene.primitives.remove(this.cameraFrustumOutline),
+            // this.cameraFrustum.destroy(),
+            this._createShadowMap(this.cameraPosition, this.position),
+            this._getOrientation(),
+            this._addCameraFrustum(),
+            this._addPostProcess()
+    }
+
+    _changeViewPos () {
+        this.postProcess && this.viewer.scene.postProcessStages.remove(this.postProcess)
+
+        this.viewShadowMap && this.viewShadowMap.destroy()
+        this.viewShadowMap = null
+
+        this.viewer.scene.primitives.remove(this.cameraFrustum),
+            this.viewer.scene.primitives.remove(this.cameraFrustumOutline),
+            // this.cameraFrustum.destroy(),
+            this._createShadowMap(this.cameraPosition, this.position),
+            this._getOrientation(),
+            this._addCameraFrustum(),
+            this._addPostProcess()
+    }
+
+    _switchShow () {
+        this.show ? !this.postProcess && this._addPostProcess() : (this.postProcess && this.viewer.scene.postProcessStages.remove(this.postProcess), delete this.postProcess, this.postProcess = null),
+            this.cameraFrustum.show = this.show,
+            this.cameraFrustumOutline.show = this.show
+    }
+
+    activeVideo () {
+        var video = this.element,
+            that = this
+        if (video) {
+            var viewer = this.viewer
+            this.activeVideoListener || (this.activeVideoListener = function () {
+                that.videoTexture && that.videoTexture.destroy(),
+                    that.videoTexture = new Cesium.Texture({
+                        context: viewer.scene.context,
+                        source: video,
+                        width: 1,
+                        height: 1,
+                        pixelFormat: Cesium.PixelFormat.RGBA,
+                        pixelDatatype: Cesium.PixelDatatype.UNSIGNED_BYTE
+                    })
+            }),
+                viewer.clock.onTick.addEventListener(this.activeVideoListener)
+        }
+    }
+
+    locate () {
+        var cameraPosition = Cesium.clone(this.cameraPosition),
+            position = Cesium.clone(this.position)
+        this.viewer.Camera.position = cameraPosition,
+            this.viewer.camera.direction = Cesium.Cartesian3.subtract(position, cameraPosition, new Cesium.Cartesian3(0, 0, 0)),
+            this.viewer.camera.up = Cesium.Cartesian3.normalize(cameraPosition, new Cesium.Cartesian3(0, 0, 0))
+    }
+
+    update (e) {
+        this.viewShadowMap && this.viewer.scene.frameState.shadowMaps.push(this.viewShadowMap) // *重点* 多投影
+    }
+
+    _createShadowMap () {
+        var e = Cesium.Cartesian3.fromDegrees(this.param.position.x * 1, this.param.position.y * 1, this.param.position.z * 1)
+        var t = this.position
+        var i = this.viewer.scene
+        var a = new Cesium.Camera(i)
+        a.position = e
+
+        this.customFrustum = new Cesium.PerspectiveFrustum({
+            fov: Cesium.Math.toRadians(this.fov),
+            aspectRatio: this.aspectRatio,
+            near: this.near,
+            far: 250
+        })
+
+        a.frustum = new Cesium.PerspectiveFrustum({
+            fov: Cesium.Math.toRadians(this.fov),
+            aspectRatio: this.aspectRatio,
+            near: this.near,
+            far: 250
+        })
+
+        let curOrientation = {}
+
+        const headingPitchRoll = new Cesium.HeadingPitchRoll(
+            Cesium.Math.toRadians(this.param.rotation.y, 0),
+            Cesium.Math.toRadians(this.param.rotation.x, 0),
+            Cesium.Math.toRadians(0),
+        )
+
+        curOrientation['heading'] = headingPitchRoll['heading']
+        curOrientation['pitch'] = headingPitchRoll['pitch']
+        curOrientation['roll'] = headingPitchRoll['roll']
+
+        let curDestination = {}
+
+        curDestination.destination = e
+        curDestination.orientation = curOrientation
+
+        a.setView(curDestination)
+
+        var n = Cesium.Cartesian3.distance(t, e)
+        this.viewDis = n
+
+        if (!this.isShadowMap) return
+
+        this.viewShadowMap = new Cesium.ShadowMap({
+            lightCamera: a,
+            enable: !1,
+            isPointLight: !1,
+            isSpotLight: !0,
+            cascadesEnabled: !1,
+            context: i.context,
+            pointLightRadius: n,
+        })
+    }
+
+    _getOrientation () {
+        const hpr = Cesium.HeadingPitchRoll.fromDegrees(180 + this.param.rotation.y * 1, 0, 90 - this.param.rotation.x * 1 || 0)
+        const orientation = Cesium.Transforms.headingPitchRollQuaternion(this.cameraPosition, hpr)
+
+        return this.orientation = orientation,
+            orientation
+    }
+
+    _addCameraFrustum () {
+        var e = this
+
+        this.cameraFrustum = new Cesium.Primitive({
+            geometryInstances: new Cesium.GeometryInstance({
+                geometry: new Cesium.FrustumGeometry({
+                    origin: e.cameraPosition,
+                    orientation: e.orientation,
+                    frustum: e.customFrustum,
+                    _drawNearPlane: !0
+                }),
+                attributes: {
+                    color: Cesium.ColorGeometryInstanceAttribute.fromColor(
+                        Cesium.Color.fromBytes(0, 213, 144, 20)
+                    ),
+                }
+            }),
+            releaseGeometryInstances: false,
+            appearance: new Cesium.PerInstanceColorAppearance({
+                translucent: true,
+                flat: !0,
+                closed: true,
+            }),
+            asynchronous: false,
+            show: this.debugFrustum && this.show
+        })
+
+        this.cameraFrustumOutline = new Cesium.Primitive({
+            geometryInstances: new Cesium.GeometryInstance({
+                geometry: new Cesium.FrustumOutlineGeometry({
+                    origin: e.cameraPosition,
+                    orientation: e.orientation,
+                    frustum: e.customFrustum,
+                    _drawNearPlane: !0
+                }),
+                attributes: {
+                    color: Cesium.ColorGeometryInstanceAttribute.fromColor(
+                        Cesium.Color.fromBytes(0, 213, 144, 255)
+                    ),
+                }
+            }),
+            appearance: new Cesium.PerInstanceColorAppearance({
+                closed: true,
+                flat: true,
+                translucent: true
+            }),
+            asynchronous: false,
+            show: this.debugFrustum && this.show
+        })
+
+        this.viewer.scene.primitives.add(this.cameraFrustum)
+        this.viewer.scene.primitives.add(this.cameraFrustumOutline)
+    }
+
+    _addPostProcess () {
+        if (!this.isShadowMap) return
+
+        var e = this,
+            t = videoShed3dShader
+
+        const i = e.viewShadowMap['_primitiveBias']
+
+        this.postProcess = new Cesium.PostProcessStage({
+            fragmentShader: t,
+            uniforms: {
+                ztzf_frustum_videoTexture: function () {
+                    return e.videoTexture
+                },
+
+                ztzf_frustum_maskTexture: function () {
+                    return new Cesium['Texture']({
+                        'context': e.viewer.scene.context,
+                        'source': {
+                            'width': 0x1,
+                            'height': 0x1,
+                            'arrayBufferView': new Uint8Array([255, 255, 255, 255])
+                        },
+                        'flipY': ![]
+                    })
+                },
+
+                ztzf_frustum_opacity: function () {
+                    return e.alpha
+                },
+
+                ztzf_frustum_hiddenAreaColor: () => {
+                    return new Cesium.Color(0, 0, 0, 0.5)
+                },
+
+                shadowMap_texture: function () {
+                    if (!e.viewShadowMap || !e.viewShadowMap['_shadowMapTexture'] || e.viewShadowMap['_shadowMapTexture']['isDestroyed']()) {
+                        return new Cesium['Texture']({
+                            'context': e.viewer.scene.context,
+                            'source': {
+                                'width': 0x1,
+                                'height': 0x1,
+                                'arrayBufferView': new Uint8Array([0x0, 0x0, 0x0, 0x0])
+                            },
+                            'flipY': ![]
+                        })
+                    }
+
+                    return e.viewShadowMap._shadowMapTexture
+                },
+
+                shadowMap_matrix: function () {
+                    return e.viewShadowMap._shadowMapMatrix
+                },
+
+                shadowMap_lightPositionEC: function () {
+                    return e.viewShadowMap._lightPositionEC
+                },
+
+                shadowMap_texelSizeDepthBias: function () {
+                    var t = new Cesium.Cartesian2
+                    return t.x = 1 / e.viewShadowMap._textureSize.x,
+                        t.y = 1 / e.viewShadowMap._textureSize.y,
+                        Cesium.Cartesian4.fromElements(t.x, t.y, i.depthBias, i.normalShadingSmooth, this.combinedUniforms1)
+                },
+
+                shadowMap_normalOffsetScale: function () {
+                    return Cesium.Cartesian4.fromElements(i.normalOffsetScale, e.viewShadowMap._distance, e.viewShadowMap.maximumDistance, e.viewShadowMap._darkness, this.combinedUniforms2)
+                },
+
+                ztzf_frustum_flipx: () => {
+                    return false
+                },
+
+                ztzf_frustum_flipy: () => {
+                    return false
+                },
+
+                ztzf_frustum_borderColor: () => {
+                    return new Cesium.Color(0 / 255, 213 / 255, 144 / 255, 255 / 255)
+                },
+
+                ztzf_frustum_borderWidth: () => {
+                    return 0.01
+                },
+            }
+        }),
+            this.viewer.scene.postProcessStages.add(this.postProcess)
+    }
+
+    destroy () {
+        this.viewer.scene.postProcessStages.remove(this.postProcess),
+            this.viewer.scene.primitives.remove(this.cameraFrustum),
+            this.viewer.scene.primitives.remove(this.cameraFrustumOutline),
+            //this._videoEle && this._videoEle.parentNode.removeChild(this._videoEle),
+            this.activeVideoListener && this.viewer.clock.onTick.removeEventListener(this.activeVideoListener),
+            this.activeVideoListener && delete this.activeVideoListener,
+            delete this.postProcess,
+            delete this.viewShadowMap,
+            delete this.color,
+            delete this.viewDis,
+            delete this.cameraPosition,
+            delete this.position,
+            delete this.alpha,
+            delete this._camerafov,
+            delete this._isShadowMap,
+            delete this._cameraPosition,
+            delete this.videoTexture,
+            delete this.cameraFrustum,
+            delete this.cameraFrustumOutline,
+            delete this._videoEle,
+            delete this._debugFrustum,
+            delete this._position,
+            delete this._aspectRatio,
+            delete this.element,
+            delete this.orientation,
+            delete this.texture,
+            delete this.videoId,
+            this.viewer.scene.primitives.remove(this),
+            delete this.viewer
+    }
+}
+
+export default CesiumVideoFrustum
diff --git a/applications/task-work-order/src/utils/cesium/frustum/CoordinateTranslate.js b/applications/task-work-order/src/utils/cesium/frustum/CoordinateTranslate.js
new file mode 100644
index 0000000..24e0675
--- /dev/null
+++ b/applications/task-work-order/src/utils/cesium/frustum/CoordinateTranslate.js
@@ -0,0 +1,229 @@
+/*
+ * @Author       : yuan
+ * @Date         : 2025-08-15 14:06:49
+ * @LastEditors  : yuan
+ * @LastEditTime : 2025-08-15 14:06:59
+ * @FilePath     : \src\utils\cesium\frustum\CoordinateTranslate.js
+ * @Description  : 
+ * Copyright 2025 OBKoro1, All Rights Reserved. 
+ * 2025-08-15 14:06:49
+ */
+let ECEF = (function () {
+	var _ = function () {
+		this.PI = 3.141592653589793238
+		this.a = 6378137.0
+		this.b = 6356752.3142
+		this.f = (this.a - this.b) / this.a
+		this.e_sq = this.f * (2.0 - this.f)
+		this.ee = 0.00669437999013
+		this.WGSF = 1 / 298.257223563
+		this.WGSe2 = this.WGSF * (2 - this.WGSF)
+		this.WGSa = 6378137.00000
+		this.EPSILON = 1.0e-12
+	}
+	_.prototype.CalculateCoordinates = function (point, azimuth, elevation, distance) {
+		var vertical_height = distance * Math.sin(2 * this.PI / 360 * elevation)//垂直高度
+		var horizontal_distance = distance * Math.cos(2 * this.PI / 360 * elevation)//水平距离
+		if (azimuth > 360) azimuth = azimuth % 360
+		if (azimuth < 0) azimuth = 360 + (azimuth % 360)
+
+		var point1 = this.lonLat2WebMercator(point)
+		var lnglat = null
+
+		var x_length, y_length
+		if (azimuth <= 90) {//第四象限
+			x_length = horizontal_distance * Math.cos(2 * this.PI / 360 * azimuth)
+			y_length = horizontal_distance * Math.sin(2 * this.PI / 360 * azimuth)
+			lnglat = {
+				x: point1.x + x_length,
+				y: point1.y - y_length
+			}
+		} else if (azimuth > 90 && azimuth <= 180) {//第三象限
+			x_length = horizontal_distance * Math.sin(2 * this.PI / 360 * (azimuth - 90))
+			y_length = horizontal_distance * Math.cos(2 * this.PI / 360 * (azimuth - 90))
+			lnglat = {
+				x: point1.x - x_length,
+				y: point1.y - y_length
+			}
+		} else if (azimuth > 180 && azimuth <= 270) {//第二象限
+			x_length = horizontal_distance * Math.cos(2 * this.PI / 360 * (azimuth - 180))
+			y_length = horizontal_distance * Math.sin(2 * this.PI / 360 * (azimuth - 180))
+			lnglat = {
+				x: point1.x - x_length,
+				y: point1.y + y_length
+			}
+		} else {//第一象限
+			x_length = horizontal_distance * Math.sin(2 * this.PI / 360 * (azimuth - 270))
+			y_length = horizontal_distance * Math.cos(2 * this.PI / 360 * (azimuth - 270))
+			lnglat = {
+				x: point1.x + x_length,
+				y: point1.y + y_length
+			}
+		}
+		lnglat = this.webMercator2LonLat(lnglat)
+		return {
+			lng: lnglat.x,
+			lat: lnglat.y,
+			height: vertical_height
+		}
+	}
+	/*
+	   *经纬度转Web墨卡托
+	   *@lonLat 经纬度
+	   */
+	_.prototype.lonLat2WebMercator = function (lonLat) {
+		let x = lonLat.x * this.a / 180
+		let y = Math.log(Math.tan((90 + lonLat.y) * this.PI / 360)) / (this.PI / 180)
+		y = y * this.a / 180
+		return {
+			x: x,
+			y: y
+		}
+	}
+
+	/*
+	   *Web墨卡托转经纬度
+	   *@mercator 平面坐标
+	   */
+	_.prototype.webMercator2LonLat = function (mercator) {
+		let x = mercator.x / this.a * 180
+		let y = mercator.y / this.a * 180
+		y = 180 / this.PI * (2 * (Math.exp(y * this.PI / 180)) - this.PI / 2)
+		return {
+			x: x,
+			y: y
+		}
+	}
+
+	_.prototype.get_atan = function (z, y) {
+		let x
+		if (z == 0) {
+			x = this.PI / 2
+		} else {
+			if (y == 0) {
+				x = this.PI
+			} else {
+				x = Math.atan(Math.abs(y / z))
+				if ((y > 0) && (z < 0)) {
+					x = this.PI - x
+				} else if ((y < 0) && (z < 0)) {
+					x = this.PI + x
+				} else if ((y < 0) && (z > 0)) {
+					x = 2 * this.M_PI - x
+				}
+			}
+		}
+		return x
+	}
+	//WGS84转ECEF坐标系
+	_.prototype.ConvertLLAToXYZ = function (LLACoor) {
+		let lon = this.PI / 180 * LLACoor.longitude
+		let lat = this.PI / 180 * LLACoor.latitude
+		let H = LLACoor.altitude
+		let N0 = this.a / Math.sqrt(1.0 - this.ee * Math.sin(lat) * Math.sin(lat))
+		let x = (N0 + H) * Math.cos(lat) * Math.cos(lon)
+		let y = (N0 + H) * Math.cos(lat) * Math.sin(lon)
+		let z = (N0 * (1.0 - this.ee) + H) * Math.sin(lat)
+		return {
+			x: x,
+			y: y,
+			z: z
+		}
+	}
+
+	//ECEF坐标系转WGS84
+	_.prototype.ConvertXYZToLLA = function (XYZCoor) {
+		let longitude = this.get_atan(XYZCoor.x, XYZCoor.y)
+		if (longitude < 0) {
+			longitude = longitude + this.PI
+		}
+		let latitude = this.get_atan(Math.sqrt(XYZCoor.x * XYZCoor.x + XYZCoor.y * XYZCoor.y), XYZCoor.z)
+
+		let W = Math.sqrt(1 - this.WGSe2 * Math.sin(latitude) * Math.sin(latitude))
+		let N = this.WGSa / W
+		let B1
+		do {
+			B1 = latitude
+			W = Math.sqrt(1 - this.WGSe2 * Math.sin(B1) * Math.sin(B1))
+			N = this.WGSa / W
+			latitude = this.get_atan(Math.sqrt(XYZCoor.x * XYZCoor.x + XYZCoor.y * XYZCoor.y), (XYZCoor.z + N * this.WGSe2 * Math.sin(B1)))
+		}
+		while (Math.abs(latitude - B1) > this.EPSILON)
+
+		var altitude = Math.sqrt(XYZCoor.x * XYZCoor.x + XYZCoor.y * XYZCoor.y) / Math.cos(latitude) - this.WGSa / Math.sqrt(1 - this.WGSe2 * Math.sin(latitude) * Math.sin(latitude))
+
+		return {
+			longitude: longitude * 180 / this.PI,
+			latitude: latitude * 180 / this.PI,
+			altitude: altitude
+		}
+	}
+	/*北东天坐标系转WGS84
+	@ a A点坐标
+	@ p 相对参数,距离、方位角、仰角
+	*/
+	//	俯视角pitch -elevation 
+	//航向角heading(yaw) -azimuth 
+	_.prototype.enu_to_ecef = function (a, p) {
+		//距离
+		let distance = p.distance
+		//方位角
+		let azimuth = p.azimuth
+		//仰角
+		let elevation = p.elevation
+
+		let zUp = elevation >= 0 ? distance * Math.sin(this.PI / 180 * elevation) : (-1) * distance * Math.sin(this.PI / 180 * Math.abs(elevation))
+
+		let d = distance * Math.cos(this.PI / 180 * Math.abs(elevation))
+		let xEast
+		let yNorth
+		if (azimuth <= 90) {
+			xEast = d * Math.sin(this.PI / 180 * azimuth)
+			yNorth = d * Math.cos(this.PI / 180 * azimuth)
+		} else if (azimuth > 90 && azimuth < 180) {
+			xEast = d * Math.cos(this.PI / 180 * (azimuth - 90))
+			yNorth = (-1) * d * Math.sin(this.PI / 180 * (azimuth - 90))
+		} else if (azimuth > 180 && azimuth < 270) {
+			xEast = (-1) * d * Math.sin(this.PI / 180 * (azimuth - 180))
+			yNorth = (-1) * d * Math.cos(this.PI / 180 * (azimuth - 180))
+		} else {
+			xEast = (-1) * d * Math.sin(this.PI / 180 * (360 - azimuth))
+			yNorth = d * Math.cos(this.PI / 180 * (360 - azimuth))
+		}
+
+		let lamb = this.radians(a.latitude)
+		let phi = this.radians(a.longitude)
+		let h0 = a.altitude
+
+		let s = Math.sin(lamb)
+		let N = this.a / Math.sqrt(1.0 - this.e_sq * s * s)
+
+		let sin_lambda = Math.sin(lamb)
+		let cos_lambda = Math.cos(lamb)
+
+		let sin_phi = Math.sin(phi)
+		let cos_phi = Math.cos(phi)
+
+		let x0 = (h0 + N) * cos_lambda * cos_phi
+		let y0 = (h0 + N) * cos_lambda * sin_phi
+		let z0 = (h0 + (1 - this.e_sq) * N) * sin_lambda
+
+		let t = cos_lambda * zUp - sin_lambda * yNorth
+
+		let zd = sin_lambda * zUp + cos_lambda * yNorth
+		let xd = cos_phi * t - sin_phi * xEast
+		let yd = sin_phi * t + cos_phi * xEast
+
+		return this.ConvertXYZToLLA({
+			x: xd + x0,
+			y: yd + y0,
+			z: zd + z0
+		})
+	}
+	_.prototype.radians = function (degree) {
+		return this.PI / 180 * degree
+	}
+	return _
+})()
+
+export default ECEF
\ No newline at end of file
diff --git a/applications/task-work-order/src/utils/cesium/kmz.js b/applications/task-work-order/src/utils/cesium/kmz.js
index a6cf77f..79e56ea 100644
--- a/applications/task-work-order/src/utils/cesium/kmz.js
+++ b/applications/task-work-order/src/utils/cesium/kmz.js
@@ -209,6 +209,11 @@
 }
 
 
+/**
+ * 递归处理对象,移除 #text 键并返回其值,同时处理数值字符串到数字的转换
+ * @param {any} obj - 需要处理的对象或值
+ * @returns {any} 处理后的对象或值
+ */
 export function removeTextKey(obj) {
 	if (typeof obj !== 'object' || obj === null) {
 		// 如果是数值字符串,转换为数值
@@ -219,18 +224,21 @@
 	}
 
 	if (Array.isArray(obj)) {
+		// 递归处理数组中的每个元素
 		return obj.map(item => removeTextKey(item));
 	}
 
 	if (Object.prototype.hasOwnProperty.call(obj, '#text')) {
-		// 如果 #text 的值是数值字符串,转换为数值
+		// 如果存在 #text 属性,返回其值(如果是数值字符串则转换为数字)
 		const textValue = obj['#text'];
 		return typeof textValue === 'string' && /^-?\d+(\.\d+)?$/.test(textValue) ? Number(textValue) : textValue;
 	}
 
+	// 递归处理对象属性
 	const newObj = {};
 	for (const key in obj) {
 		if (Object.prototype.hasOwnProperty.call(obj, key)) {
+			// 如果属性值是空对象,则设为空字符串;否则递归处理
 			newObj[key] = Object.keys(obj[key]).length === 0 ? '' : removeTextKey(obj[key]);
 		}
 	}
diff --git a/applications/task-work-order/src/utils/cesium/mapUtil.js b/applications/task-work-order/src/utils/cesium/mapUtil.js
index eabf803..89bf787 100644
--- a/applications/task-work-order/src/utils/cesium/mapUtil.js
+++ b/applications/task-work-order/src/utils/cesium/mapUtil.js
@@ -1,7 +1,8 @@
 import * as Cesium from 'cesium'
 import * as turf from '@turf/turf'
-const { VITE_APP_BASE, VITE_APP_ENV, VITE_APP_REGION_URL } = import.meta.env
+import store from '@/store'
 
+const { VITE_APP_BASE, VITE_APP_ENV, VITE_APP_REGION_URL } = import.meta.env
 export const getLngLatDistance = (lat1, lng1, lat2, lng2) => {
 	const radLat1 = (lat1 * Math.PI) / 180.0
 	const radLat2 = (lat2 * Math.PI) / 180.0
@@ -190,6 +191,66 @@
 	const newArr = arr.sort((a, b) => a.distance - b.distance)
 	return newArr[0]
 }
+// 获取多边形内部数据
+export const samplePolygonInterior = (positions, samplingDistance) => {
+	if (!positions.length) return []
+	let minLng = Infinity,
+		maxLng = -Infinity
+	let minLat = Infinity,
+		maxLat = -Infinity
+	positions.forEach(pos => {
+		minLng = Math.min(minLng, pos.lng)
+		maxLng = Math.max(maxLng, pos.lng)
+		minLat = Math.min(minLat, pos.lat)
+		maxLat = Math.max(maxLat, pos.lat)
+	})
+
+	//  将 Cesium 多边形格式转为 Turf 格式
+	const turfPolygonCoords = positions.map(pos => [pos.lng, pos.lat])
+	turfPolygonCoords.push([positions[0].lng, positions[0].lat]) // 闭合多边形
+	const turfPolygon = turf.polygon([turfPolygonCoords])
+
+	//  生成网格点并判断是否在多边形内
+	const sampledPoints = []
+	for (let lng = minLng; lng <= maxLng; lng += samplingDistance) {
+		for (let lat = minLat; lat <= maxLat; lat += samplingDistance) {
+			// 创建 Turf 点
+			const turfPoint = turf.point([lng, lat])
+			// Turf 原生方法判断点是否在多边形内
+			if (turf.booleanPointInPolygon(turfPoint, turfPolygon)) {
+				sampledPoints.push({
+					lng: Number(lng.toFixed(6)),
+					lat: Number(lat.toFixed(6)),
+					height: 0,
+				})
+			}
+		}
+	}
+
+	return sampledPoints
+}
+// 获取多边形面内的最高点(相对地形高度)
+export const getPolygonHighestPoint = async (positions, viewer, samplingDistance = 0.0002) => {
+	try {
+		const interiorPoints = samplePolygonInterior(positions, samplingDistance, viewer)
+		const allPoints = [...positions, ...interiorPoints]
+		// 批量获取所有点的地形高度
+		const pointsWithTerrain = await getPointPositionsHeight(allPoints, viewer)
+		// console.log('所有点的地形高度', pointsWithTerrain)
+
+		// 地形高度(ASL)最高的点
+		const highestTerrainPoint = pointsWithTerrain.reduce(
+			(max, curr) => (curr.ASL > max.ASL ? curr : max),
+			pointsWithTerrain[0]
+		)
+
+		// console.log('地形最高点信息:', highestTerrainPoint)
+		return highestTerrainPoint
+	} catch (error) {
+		console.error('获取地形最高点失败:', error)
+		return null
+	}
+}
 
 // 获取当前经纬度地形数据
 export const getLnglatAltitude = (longitude, latitude, viewer) => {
@@ -285,31 +346,24 @@
 	return new Promise((resolve, reject) => {
 		if (!data || !data.length) {
 			resolve([])
-
 			return
 		}
-
 		// 假设 viewer 已经初始化并且 terrainProvider 是有效的
 		const terrainProvider = viewer?.terrainProvider
-
 		// 创建 Cartographic 对象
 		const cartographics = data.map(item => {
 			const { lng, lat } = item
-
 			return Cesium.Cartographic.fromDegrees(Number(lng), Number(lat))
 		})
-
 		// 获取地形数据的Promise
 		const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, cartographics)
-
 		// 使用 Cesium.when 处理 Promise
 		promise
 			.then(function (updatedPositions) {
-				// updatedPositions 是一个数组,包含更新后的 Cartographic 对象
+				//  是一个数组,包含更新后的 Cartographic 对象
 				const newPosition = updatedPositions.map((item, index) => {
 					const longitude = Cesium.Math.toDegrees(item.longitude)
 					const latitude = Cesium.Math.toDegrees(item.latitude)
-
 					let pointData = {
 						...data[index],
 						longitude,
@@ -317,18 +371,14 @@
 						ASL: Number(item.height),
 						customHeight: Number(item.height),
 					}
-
 					if (droneHeight) pointData.TH = Number(item.height) + Number(droneHeight)
-
 					return pointData
 				})
-
 				resolve(newPosition)
-				// 在这里,你可以使用 height 值进行后续操作
 			})
 			.catch(function (error) {
-				// console.error('获取高程时发生错误:', error);
-				reject(error)
+				console.log('获取高程时发生错误:', error)
+				resolve(data.map(item => ({ ...item, ASL: 0, customHeight: 0, longitude: item.lng, latitude: item.lat })))
 			})
 	})
 }
@@ -410,11 +460,15 @@
 	if (!Array.isArray(positionsData) || positionsData.length === 0) return
 
 	// 如果是一个点,加两个点方便后续生成外包围盒
-	if (positionsData.length === 1){
-		const [lon,lat,height] = positionsData[0]
-		positionsData = [[lon+0.001,lat+0.001,height],[lon-0.001,lat-0.001,height],[lon,lat,height]]
+	if (positionsData.length === 1) {
+		const [lon, lat, height = 0] = positionsData[0]
+		positionsData = [
+			[lon + 0.001, lat + 0.001, height],
+			[lon - 0.001, lat - 0.001, height],
+			[lon, lat, height],
+		]
 	}
-	const positions = positionsData.map(([lon, lat, height]) =>
+	const positions = positionsData.map(([lon, lat, height = 0]) =>
 		Cesium.Cartesian3.fromDegrees(Number(lon), Number(lat), Number(height || 0))
 	)
 
@@ -439,7 +493,7 @@
 			range: boundingSphere.radius * multiple,
 		},
 		complete: () => {
-			// 飞行完成后检查相机高度是否小于最高点,如果小于直接飞到最高点
+			// 飞行完成后检查相机高度是否小于最高点
 			const cameraHeight = Cesium.Cartographic.fromCartesian(viewer.camera.position).height
 			if (cameraHeight < maxHeight) {
 				viewer.camera.flyTo({
@@ -529,7 +583,7 @@
 
 // 辅助函数:创建旋转文字的画布
 export function createRotatedTextCanvas(time) {
-	const prefix = '预计'
+	const prefix = '预计到达'
 	const suffix = '分钟'
 	const canvas = document.createElement('canvas')
 	const context = canvas.getContext('2d')
@@ -537,7 +591,9 @@
 	context.font = 'bold 16px Source Han Sans CN'
 	// 测量各部分文本宽度
 	const prefixWidth = context.measureText(prefix).width
-	const timeWidth = context.measureText(time).width
+	let timeWidth = context.measureText(time).width
+	const timeWidthMore = `${time >= 10 ? 6 : 0}`
+	timeWidth = timeWidth + Number(timeWidthMore)
 	const suffixWidth = context.measureText(suffix).width
 	const totalWidth = prefixWidth + timeWidth + suffixWidth
 	const textHeight = 20 // 估算高度
@@ -550,17 +606,116 @@
 	context.textAlign = 'left' // 改为左对齐,方便分段绘制
 	// 清除画布
 	context.clearRect(0, 0, canvas.width, canvas.height)
-	// 绘制“预计”(白色)
+	// 绘制“预计到达”(白色)
 	context.fillStyle = '#FFFFFF'
 	context.fillText(prefix, 10, 15)
 	// 绘制时间(蓝色)
-	context.font = 'bold 30px Source Han Sans CN'
+	context.font = 'bold 24px Source Han Sans CN'
 	context.fillStyle = '#1EE7E7' // 亮蓝色
-	context.fillText(time, 10 + prefixWidth, 12)
+	// 设置宽度
+	context.textBaseline = 'middle'
+	context.fillText(time, 10 + prefixWidth, 14)
 	// 绘制“分钟”(白色)
 	context.font = 'bold 16px Source Han Sans CN'
 	context.fillStyle = '#FFFFFF'
-	context.fillText(suffix, 20 + prefixWidth + timeWidth, 15)
+	context.fillText(suffix, 14 + prefixWidth + timeWidth, 15)
 
 	return canvas
 }
+
+
+export const saveCurrentCameraPosition = viewer => {
+	const position = viewer?.camera.position.clone() // 相机位置(Cartesian3)
+	const heading = viewer?.camera.heading // 航向角(弧度)
+	const pitch = viewer?.camera.pitch // 俯仰角(弧度)
+	const roll = viewer?.camera.roll // 翻滚角(弧度)
+	store.commit('setCameraPosition', {
+		duration: 0,
+		destination: position,
+		orientation: { heading, pitch, roll },
+	})
+}
+
+// 连接地面线
+export function getDockPolyLine(data, viewer) {
+	if (!data.longitude || !data.latitude) return {}
+	return {
+		positions: new Cesium.CallbackProperty(() => {
+			const pointPosition = Cesium.Cartesian3.fromDegrees(+data.longitude, +data.latitude, +data.height)
+			if (!pointPosition) return []
+			// 获取点的位置
+			const cartographic = Cesium.Cartographic.fromCartesian(pointPosition)
+			// 获取地形高度
+			const terrainHeight = viewer.scene.globe.getHeight(cartographic) || 0
+			// 创建地面点位置
+			const groundPosition = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, terrainHeight)
+			return [pointPosition, groundPosition]
+		}, false),
+		width: 0.5,
+		material: Cesium.Color.WHITE,
+	}
+}
+
+// 飞向一个机巢中心
+export const flyDockCenter = (viewer, info) => {
+	const { longitude = 115, latitude = 28, height = 0 } = info
+	const position = Cesium.Cartesian3.fromDegrees(+longitude, +latitude, +height)
+	const droneEntity = viewer?.entities.add({ position: position, point: { pixelSize: 0 } })
+	viewer?.flyTo(droneEntity, {
+		offset: new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-60), 22000),
+		duration: 0.5,
+		complete: () => {
+			viewer?.entities.remove(droneEntity)
+		},
+	})
+}
+
+// 在固定的经度上获得高度
+export function getHeightOnFixedLonLat(ray, pointParams, ellipsoid = Cesium.Ellipsoid.WGS84) {
+	const { longitude: lon, latitude: lat } = pointParams
+	// 1. 地表点(高度=0)
+	const p0 = Cesium.Cartesian3.fromDegrees(lon, lat, 0, ellipsoid)
+
+	// 2. 该点处的法线方向(up 向量,单位向量)
+	const up = ellipsoid.geodeticSurfaceNormal(p0, new Cesium.Cartesian3())
+
+	// 3. 射线起点和方向
+	const r0 = ray.origin // 相机位置
+	const rd = ray.direction // 射线方向(已归一化?不一定,但不影响)
+
+	// 4. 解:求直线 L(t) = p0 + t * up 与射线 R(s) = r0 + s * rd 的最近点
+	// 使用向量公式求两条直线的最近点参数 t
+	const w0 = Cesium.Cartesian3.subtract(p0, r0, new Cesium.Cartesian3())
+
+	const a = Cesium.Cartesian3.dot(up, up) // = 1(因为 up 是单位向量)
+	const b = Cesium.Cartesian3.dot(up, rd)
+	const c = Cesium.Cartesian3.dot(rd, rd) // = |rd|^2
+	const d = Cesium.Cartesian3.dot(up, w0)
+	const e = Cesium.Cartesian3.dot(rd, w0)
+
+	const denom = a * c - b * b
+	let t
+
+	if (Math.abs(denom) < Cesium.Math.EPSILON10) {
+		// 两直线平行,取 t = 0
+		t = 0
+	} else {
+		t = (b * e - c * d) / denom
+	}
+
+	// 5. 得到高度线上对应的点
+	const resultPoint = Cesium.Cartesian3.add(
+		p0,
+		Cesium.Cartesian3.multiplyByScalar(up, t, new Cesium.Cartesian3()),
+		new Cesium.Cartesian3()
+	)
+
+	// 6. 转回 Cartographic 获取精确高度
+	const carto = Cesium.Cartographic.fromCartesian(resultPoint, ellipsoid)
+	return {
+		cartesian: resultPoint,
+		height: carto.height,
+		longitude: Cesium.Math.toDegrees(carto.longitude),
+		latitude: Cesium.Math.toDegrees(carto.latitude),
+	}
+}
diff --git a/applications/task-work-order/src/utils/cesium/publicCesium.js b/applications/task-work-order/src/utils/cesium/publicCesium.js
index 7af504f..e0fe177 100644
--- a/applications/task-work-order/src/utils/cesium/publicCesium.js
+++ b/applications/task-work-order/src/utils/cesium/publicCesium.js
@@ -70,6 +70,7 @@
  * @param {boolean} [options.flyToContour=false] - 是否飞行到轮廓,默认为 false
  * @param {number} [options.multiple=1.4] - 范围倍数
  * @param {number} [options.dockOptions={}] - 机巢显示
+ * @param {array} [options.terrainLoadCallback] - 地形加载回调
  * @param {array} [options.boundaryChange] - 边界改变事件
  * @param {array} [options.boundaryColor] - 边界颜色
  * @param {array} [options.dockRangeType] - 机巢范围类型 1显示覆盖圆;2显示覆盖圈
@@ -92,15 +93,14 @@
 			dom,
 			flatMode = true,
 			terrain = false,
-			layerMode = 0,
+			layerMode = 17,
 			contour = true,
 			flyToContour = false,
 			multiple = 1.4,
-
 			dockOptions = {},
-
-			boundaryColor = '#7FFFD4',
 			boundaryChange,
+			terrainLoadCallback,
+			boundaryColor = '#7FFFD4',
 			dockRangeType = 1,
 			useDockHeight = false
 		} = options
@@ -120,6 +120,10 @@
 			baseLayer: false,
 			fullscreenButton: false,
 		}
+
+		// 尝试解决出现多个id相同的dom
+		const domIdList = document.querySelectorAll(`#${dom}`)
+		if (domIdList.length>1) domIdList[1].remove()
 
 		this.viewer = new Viewer(dom, viewerOptions)
 		this.viewerDom = dom
@@ -143,33 +147,47 @@
 		this.viewer?.cesiumWidget.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK) // 禁用双击
 
 		if (terrain) {
-			// 正则:第一位非0,第二位任意数字,后10位都是0
-			const re = /^[1-9]\d0{10}$/
-
-			let result = null
-
-			// 1️⃣先判断 areaCode
-			if (re.test(store.state.user.userInfo.detail.areaCode)) {
-				result = store.state.user.userInfo.detail.areaCode.slice(0, 6)
-			} else {
-				// 2️⃣如果不满足,从 ancestors 里找
-				const matchedItems = store.state.user.userInfo.detail.ancestors
-					.split(',')
-					.filter(item => re.test(item)) // 过滤出符合条件的
-
-				// 取第一个符合条件的前6位(可以改成 last one 看需求)
-				if (matchedItems.length > 0) {
-					result = matchedItems[0].slice(0, 6)
-				}
-			}
-
 			try {
-				Cesium.CesiumTerrainProvider.fromUrl(`${import.meta.env.VITE_APP_TERRAIN_URL}${result}`, {
-					requestVertexNormals: true, // 启用地形法线增强立体感
-					requestWaterMask: true, // 启用水体遮罩效果
-				}).then(terrainProvider => {
-					this.viewer.terrainProvider = terrainProvider
-				})
+				const noTerrainMechanism = ['1962779164650135554']
+				if (noTerrainMechanism.includes(store.state.user.userInfo?.deptId)) {
+					// 使用Cesium World Terrain
+					Cesium.createWorldTerrainAsync({
+						requestWaterMask: false,    // 请求水域效果
+						requestVertexNormals: true // 请求光照和地形法线
+					}).then(terrainProvider => {
+						this.viewer.terrainProvider = terrainProvider
+						terrainLoadCallback?.()
+					})
+				} else {
+					/*// 正则:第一位非0,第二位任意数字,后10位都是0
+					const re = /^[1-9]\d0{10}$/
+
+					let result = null
+
+					// 1️⃣先判断 areaCode
+					if (re.test(store.state.user.userInfo.detail.areaCode)) {
+						result = store.state.user.userInfo.detail.areaCode.slice(0, 6)
+					} else {
+						// 2️⃣如果不满足,从 ancestors 里找
+						const matchedItems = store.state.user.userInfo.detail.ancestors
+							.split(',')
+							.filter(item => re.test(item)) // 过滤出符合条件的
+
+						// 取第一个符合条件的前6位(可以改成 last one 看需求)
+						if (matchedItems.length > 0) {
+							result = matchedItems[0].slice(0, 6)
+						}
+					}
+
+					// 使用公司地形
+					Cesium.CesiumTerrainProvider.fromUrl(`${import.meta.env.VITE_APP_TERRAIN_URL}${result}`, {
+						requestVertexNormals: true, // 启用地形法线增强立体感
+						requestWaterMask: true, // 启用水体遮罩效果
+					}).then(terrainProvider => {
+						this.viewer.terrainProvider = terrainProvider
+						terrainLoadCallback?.()
+					})*/
+				}
 			} catch (error) {
 				console.error('地形加载失败:', error)
 			}
@@ -180,6 +198,12 @@
 		this.switchFlatMode(flatMode)
 		this.switchContour(contour)
 		flyToContour && this.flyToContour(contour)
+
+		if (Cesium.FeatureDetection.supportsImageRenderingPixelated()) {
+			let dpr = window.devicePixelRatio
+			while (dpr >= 2.0) dpr /= 2.0 // 避免过高缩放导致模糊
+			this.viewer.resolutionScale = dpr // 设置分辨率缩放比例
+		}
 	}
 
 	getViewer () {
@@ -188,53 +212,69 @@
 
 	// 销毁viewer
 	viewerDestroy (removeDom = true) {
+		if (!this.viewer) return
+		// // 👇 关键:先停止所有动态行为
+		// this.viewer.clock.shouldAnimate = false;
+		// this.viewer.scene.requestRenderMode = false;
+		// // 取消所有可能的 pending 渲染
+		// if (this.viewer.cesiumWidget) {
+		// 	this.viewer.cesiumWidget.render = () => {}; // 空函数覆盖
+		// }
+		// // 清理实体和图层
+		// this.viewer?.entities.removeAll();
+		// this.viewer?.imageryLayers.removeAll();
+		// // 清理数据源
+		// try {
+		// 	const dataSources = this.viewer.dataSources;
+		// 	while (dataSources.length > 0) {
+		// 		dataSources.remove(dataSources.get(0));
+		// 	}
+		// } catch (e) {
+		// 	console.warn('清理数据源时出错:', e);
+		// }
+		// // 清理场景中的图元
+		// try {
+		// 	this.viewer?.scene.primitives.removeAll();
+		// } catch (e) {
+		// 	console.warn('清理图元时出错:', e);
+		// }
+		// // 获取webgl上下文
+		// let gl = this.viewer?.scene.context._originalGLContext
+		// if (gl) {
+		// 	try {
+		// 		gl.canvas.width = 1
+		// 		gl.canvas.height = 1
+		// 		gl.getExtension("WEBGL_lose_context").loseContext()
+		// 	} catch (e) {
+		// 		console.warn('释放WebGL上下文时出错:', e)
+		// 	}
+		// 	gl = null
+		// }
+		this.viewer?.destroy() // 销毁Viewer实例
+		this.viewer = null
 		smallMpaCenterDistance = null
-
-		if (this.viewer) {
-			this.viewer?.entities.removeAll()
-			this.viewer?.imageryLayers.removeAll()
-			this.viewer?.dataSources.removeAll()
-
-
-			// try {
-			// 	this.viewer?.scene?.primitives?.removeAll()
-			// 	this.viewer?.entities?.removeAll()
-			// } catch (e) {
-			// 	console.warn('清理资源时出错:', e)
-
-			// 	console.log(this.viewer, 1111111111111)
-			// }
-
-			// 获取webgl上下文
-			let gl = this.viewer?.scene.context._originalGLContext
-			gl.canvas.width = 1
-			gl.canvas.height = 1
-			gl.getExtension("WEBGL_lose_context").loseContext()
-			gl = null
-			this.viewer?.destroy() // 销毁Viewer实例
-			this.viewer = null
-			var cesiumContainer = document.getElementById(this.viewerDom)
-			if (cesiumContainer && removeDom) {
-				cesiumContainer.remove() // 移除与地图相关的DOM元素
-				this.viewerDom = null
-			}
+		var cesiumContainer = document.getElementById(this.viewerDom)
+		if (cesiumContainer && removeDom) {
+			cesiumContainer.remove() // 移除与地图相关的DOM元素
+			this.viewerDom = null
 		}
 	}
 
 	setShowDock (sns) {
 		this.boundary?.setShowDock(sns)
 	}
-
+	setDockCoverColor (sns) {
+		this.boundary?.setDockCoverColor(sns)
+	}
 	// 切换轮廓显示
 	async switchContour (open) {
 		if (open) {
 			await this.boundary?.openContour()
-
 		} else {
 			this.boundary?.closeContour()
 		}
 	}
-	// // 飞向轮廓居中
+	// 飞向轮廓居中
 	flyToContour () {
 		this.boundary?.flyToBoundary()
 	}
@@ -257,7 +297,7 @@
 		this.globalBaseMapLayers?.forEach(item => {
 			if (item.mapLayer) item.mapLayer.show = false
 		})
-		// store.state.common.mapSetting.mode = mode
+		store.state.common.mapSetting.mode = mode
 		// 标准地图(天地图矢量)加载
 		if (mode === 0) {
 			mapLayers.push(
@@ -324,9 +364,7 @@
 			this.viewer?.imageryLayers.lowerToBottom(find.mapLayer)
 		})
 	}
-
 	// 设置或重置滤镜
-
 	setCurrentLayerFilter (data, mode) {
 		if (mode === 17) {
 			data.mapLayer.brightness = 0.6 // 亮度(默认值)
diff --git a/applications/task-work-order/src/utils/cesium/use-kmz-tsa.js b/applications/task-work-order/src/utils/cesium/use-kmz-tsa.js
new file mode 100644
index 0000000..62ba213
--- /dev/null
+++ b/applications/task-work-order/src/utils/cesium/use-kmz-tsa.js
@@ -0,0 +1,675 @@
+import _ from 'lodash'
+import JSZIP from 'jszip'
+import { JSONToXML } from './kmz'
+import { getDateFromTimestamp } from '@/utils/date'
+
+export default function kmzFile () {
+	// 云台信息
+	const droneModel = {
+		52: '0',
+		53: '1',
+		66: '0',
+		67: '1',
+		80: '0',
+		81: '1',
+	}
+	// 创建图斑航线
+	const create = async (waylineBasicInfo, lnglats, spotList) => {
+		try {
+			const date = new Date()
+			const username = window.localStorage.getItem('bs_username')
+			const updateTime = date.getTime()
+			const fileName = '图斑航线规划_' + date.getTime()
+			// 无人机机型、云台型号、航线高度
+			const { droneEnumValue, payloadEnumValue, height } = waylineBasicInfo
+			const defaultHeight = height || 100
+			// 起始点位 (参考点位-具体以机场为准)
+			const startPoint = lnglats[0]
+			const takeOffPoint = [startPoint[1], startPoint[0], 0].join(',')
+			// template.xml对象模版
+			const fileTemplate = {
+				author: { '#text': username },
+				createTime: { '#text': updateTime },
+				updateTime: { '#text': updateTime },
+				missionConfig: {
+					// 飞向首航点模式
+					flyToWaylineMode: { '#text': 'safely' },
+					// 航线结束动作
+					finishAction: { '#text': 'goHome' },
+					// 失控是否继续执行航线
+					exitOnRCLost: { '#text': 'goContinue' },
+					// 失控动作类型
+					executeRCLostAction: { '#text': 'goBack' },
+					// 安全起飞高度
+					takeOffSecurityHeight: { '#text': 20 },
+					// 参考起飞点
+					takeOffRefPoint: { '#text': takeOffPoint },
+					// 参考起飞点绝对高度
+					takeOffRefPointAGLHeight: { '#text': 0 },
+					// 全局航线过渡速度
+					globalTransitionalSpeed: { '#text': 10 },
+					// 全局返航高度
+					globalRTHHeight: { '#text': defaultHeight },
+					// 无人机参数
+					droneInfo: {
+						droneEnumValue: { '#text': droneEnumValue },
+						droneSubEnumValue: {
+							'#text': droneModel[payloadEnumValue],
+						},
+					},
+					// 云台参数
+					payloadInfo: {
+						payloadEnumValue: { '#text': payloadEnumValue },
+						payloadSubEnumValue: {
+							'#text': droneModel[payloadEnumValue],
+						},
+						payloadPositionIndex: { '#text': 0 },
+					},
+				},
+				Folder: {
+					// 预定义模板类型 - 航点飞行
+					templateType: { '#text': 'waypoint' },
+					// 是否使用全局航线过渡速度
+					useGlobalTransitionalSpeed: { '#text': 0 },
+					templateId: { '#text': 0 },
+					// 坐标系参数信息
+					waylineCoordinateSysParam: {
+						// 经纬度坐标系 - 固定值
+						coordinateMode: { '#text': 'WGS84' },
+						// 航点高程参考平面	- 相对高度
+						heightMode: { '#text': 'relativeToStartPoint' },
+					},
+					// 全局航线飞行速度
+					autoFlightSpeed: { '#text': 10 },
+					// 云台俯仰角控制模式
+					gimbalPitchMode: { '#text': 'usePointSetting' },
+					// 全局高度
+					globalHeight: { '#text': '100' },
+					// 全局偏航角模式参数 - 可使用当前默认值
+					globalWaypointHeadingParam: {
+						waypointHeadingMode: { '#text': 'followWayline' },
+						waypointHeadingAngle: { '#text': 0 },
+						waypointPoiPoint: {
+							'#text': '0.000000,0.000000,0.000000',
+						},
+						waypointHeadingPathMode: { '#text': 'followBadArc' },
+						waypointHeadingPoiIndex: { '#text': 0 },
+					},
+					// 全局航点类型 - 直线飞行,飞行器到点停
+					globalWaypointTurnMode: {
+						'#text': 'toPointAndStopWithDiscontinuityCurvature',
+					},
+					// 全局航段轨迹是否尽量贴合直线
+					globalUseStraightLine: { '#text': 1 },
+					// 航点点位信息 - 位置、事件等
+					Placemark: [],
+					// payloadParam: {
+					//   payloadPositionIndex: { '#text': 0 },
+					//   focusMode: { '#text': 'firstPoint' },
+					//   meteringMode: { '#text': 'average' },
+					//   returnMode: { '#text': 'singleReturnFirst' },
+					//   samplingRate: { '#text': '240000' },
+					//   scanningMode: { '#text': 'repetitive' },
+					//   imageFormat: { '#text': 'wide,zoom' },
+					// },
+				},
+			}
+			// 航点创建
+			const polygonNo = {
+				no: '',
+				index: 0,
+			}
+			lnglats.forEach((lnglat, index) => {
+				const obj = spotList.find(spot => spot.dkfw.find(item => _.isEqual(item, lnglat)))
+				let fileSuffix = ''
+				if (obj) {
+					if (polygonNo.no === obj.dkbh) {
+						polygonNo.index++
+					} else {
+						polygonNo.no = obj.dkbh
+						polygonNo.index = 1
+					}
+					fileSuffix = `图斑航线拍摄(${obj.dkbh}-${polygonNo.index})`
+				} else {
+					fileSuffix = '图斑航线拍摄(起点)'
+				}
+				const placemark = {
+					Point: {
+						// 航点经纬度
+						coordinates: { '#text': `${lnglat[0]},${lnglat[1]}` },
+					},
+					// 航点index
+					index: { '#text': index },
+					// 全局航线高度(椭球高)
+					ellipsoidHeight: { '#text': defaultHeight },
+					// 全局航线高度 (EGM96海拔高/相对起飞点高度/AGL相对地面高度)
+					height: { '#text': defaultHeight },
+					// 航点飞行速度
+					waypointSpeed: { '#text': 10 },
+					// 沿航线方向 - 可使用当前默认值
+					waypointHeadingParam: {
+						waypointHeadingMode: { '#text': 'followWayline' },
+						waypointHeadingAngle: { '#text': 0 },
+						waypointPoiPoint: {
+							'#text': '0.000000,0.000000,0.000000',
+						},
+						waypointHeadingPathMode: { '#text': 'followBadArc' },
+						waypointHeadingPoiIndex: { '#text': 0 },
+					},
+					// 航点类型
+					waypointTurnParam: {
+						waypointTurnMode: {
+							'#text': 'toPointAndStopWithDiscontinuityCurvature',
+						},
+						waypointTurnDampingDist: { '#text': 0.2 },
+					},
+					// 是否全局参数
+					useGlobalHeight: { '#text': 1 },
+					useGlobalSpeed: { '#text': 1 },
+					useGlobalHeadingParam: { '#text': 1 },
+					useGlobalTurnParam: { '#text': 1 },
+					useStraightLine: { '#text': 1 },
+					// 事件组
+					actionGroup: {
+						actionGroupId: { '#text': index },
+						actionGroupStartIndex: { '#text': index },
+						actionGroupEndIndex: { '#text': index },
+						actionGroupMode: { '#text': 'sequence' },
+						actionTrigger: {
+							actionTriggerType: { '#text': 'reachPoint' },
+						},
+						// 单个事件 - 如果是多个事件action可改成数组 action: [{}]
+						action: {
+							actionId: { '#text': 0 },
+							actionActuatorFunc: { '#text': 'takePhoto' },
+							actionActuatorFuncParam: {
+								fileSuffix: { '#text': fileSuffix },
+								payloadPositionIndex: { '#text': '0' },
+								useGlobalPayloadLensIndex: { '#text': '1' },
+							},
+						},
+					},
+				}
+				fileTemplate.Folder.Placemark.push(placemark)
+			})
+			const fileWaylines = waylinesContext(fileTemplate)
+
+			return {
+				fileName,
+				template: fileTemplate,
+				waylines: fileWaylines,
+			}
+		} catch (error) {
+			console.log(error)
+			return false
+		}
+	}
+
+	// 创建正常航线
+	const createNoramlWaylines = (waylineBasicInfo, lnglats) => {
+		try {
+			const date = new Date()
+			const username = window.localStorage.getItem('bs_username')
+			const updateTime = date.getTime()
+			const { year, month, day, hours, minutes } = getDateFromTimestamp(updateTime)
+			const fileName = '新建航线_' + year + month + day + hours + minutes
+			// 无人机机型、云台型号、航线高度
+			const { droneEnumValue, payloadEnumValue, height, waylineName } = waylineBasicInfo
+			const defaultHeight = height || 100
+			// 起始点位 (参考点位-具体以机场为准)
+			const startPoint = lnglats[0]
+			const takeOffPoint = [startPoint.latitude, startPoint.longitude, startPoint.height].join(',')
+			// template.xml对象模版
+			const fileTemplate = {
+				author: { '#text': username },
+				createTime: { '#text': updateTime },
+				updateTime: { '#text': updateTime },
+				missionConfig: {
+					// 飞向首航点模式
+					flyToWaylineMode: { '#text': 'safely' },
+					// 航线结束动作
+					finishAction: { '#text': 'goHome' },
+					// 失控是否继续执行航线
+					exitOnRCLost: { '#text': 'goContinue' },
+					// 失控动作类型
+					executeRCLostAction: { '#text': 'goBack' },
+					// 安全起飞高度
+					takeOffSecurityHeight: { '#text': 20 },
+					// 参考起飞点
+					takeOffRefPoint: { '#text': takeOffPoint },
+					// 参考起飞点绝对高度
+					takeOffRefPointAGLHeight: { '#text': 0 },
+					// 全局航线过渡速度
+					globalTransitionalSpeed: { '#text': 10 },
+					// 全局返航高度
+					globalRTHHeight: { '#text': defaultHeight },
+					// 无人机参数
+					droneInfo: {
+						droneEnumValue: { '#text': droneEnumValue },
+						droneSubEnumValue: {
+							'#text': droneModel[payloadEnumValue],
+						},
+					},
+					// 是否自动绕行(暂未验证M30T机型使用此参数后会不会无法起飞)
+					autoRerouteInfo: {
+						missionAutoRerouteMode: { '#text': 1 },
+						transitionalAutoRerouteMode: { '#text': 1 },
+					},
+					// 云台参数
+					payloadInfo: {
+						payloadEnumValue: { '#text': payloadEnumValue },
+						payloadSubEnumValue: {
+							'#text': droneModel[payloadEnumValue],
+						},
+						payloadPositionIndex: { '#text': 0 },
+					},
+				},
+				Folder: {
+					// 预定义模板类型 - 航点飞行
+					templateType: { '#text': 'waypoint' },
+					// 是否使用全局航线过渡速度
+					useGlobalTransitionalSpeed: { '#text': 0 },
+					templateId: { '#text': 0 },
+					// 坐标系参数信息
+					waylineCoordinateSysParam: {
+						// 经纬度坐标系 - 固定值
+						coordinateMode: { '#text': 'WGS84' },
+						// 航点高程参考平面	- 相对高度
+						heightMode: { '#text': 'relativeToStartPoint' },
+					},
+					// 全局航线飞行速度
+					autoFlightSpeed: { '#text': 10 },
+					// 云台俯仰角控制模式
+					gimbalPitchMode: { '#text': 'usePointSetting' },
+					// 全局高度
+					globalHeight: { '#text': '100' },
+					// 全局偏航角模式参数 - 可使用当前默认值
+					globalWaypointHeadingParam: {
+						waypointHeadingMode: { '#text': 'followWayline' },
+						waypointHeadingAngle: { '#text': 0 },
+						waypointPoiPoint: {
+							'#text': '0.000000,0.000000,0.000000',
+						},
+						waypointHeadingPathMode: { '#text': 'followBadArc' },
+						waypointHeadingPoiIndex: { '#text': 0 },
+					},
+					// 全局航点类型 - 直线飞行,飞行器到点停
+					globalWaypointTurnMode: {
+						'#text': 'toPointAndStopWithDiscontinuityCurvature',
+					},
+					// 全局航段轨迹是否尽量贴合直线
+					globalUseStraightLine: { '#text': 1 },
+					// 航点点位信息 - 位置、事件等
+					Placemark: [],
+					payloadParam: {
+						payloadPositionIndex: { '#text': 0 },
+						focusMode: { '#text': 'firstPoint' },
+						meteringMode: { '#text': 'average' },
+						returnMode: { '#text': 'singleReturnFirst' },
+						samplingRate: { '#text': '240000' },
+						scanningMode: { '#text': 'repetitive' },
+						imageFormat: { '#text': 'wide,zoom' },
+					},
+				},
+			}
+			lnglats.forEach((lnglat, index) => {
+				const placemark = {
+					Point: {
+						// 航点经纬度
+						coordinates: {
+							'#text': `${lnglat.longitude},${lnglat.latitude}`,
+						},
+					},
+					// 航点index
+					index: { '#text': index },
+					// 全局航线高度(椭球高)
+					ellipsoidHeight: { '#text': lnglat.height },
+					// 全局航线高度 (EGM96海拔高/相对起飞点高度/AGL相对地面高度)
+					height: { '#text': lnglat.height },
+					// 航点飞行速度
+					waypointSpeed: { '#text': lnglat?.speed || 10 },
+					// 沿航线方向 - 可使用当前默认值
+					waypointHeadingParam: {
+						waypointHeadingMode: { '#text': 'followWayline' },
+						waypointHeadingAngle: { '#text': 0 },
+						waypointPoiPoint: {
+							'#text': '0.000000,0.000000,0.000000',
+						},
+						waypointHeadingPathMode: { '#text': 'followBadArc' },
+						waypointHeadingPoiIndex: { '#text': 0 },
+					},
+					// 航点类型
+					waypointTurnParam: {
+						waypointTurnMode: {
+							'#text': 'toPointAndStopWithDiscontinuityCurvature',
+						},
+						waypointTurnDampingDist: { '#text': 0.2 },
+					},
+					// 是否全局参数
+					useGlobalHeight: { '#text': 1 },
+					useGlobalSpeed: { '#text': 0 },
+					useGlobalHeadingParam: { '#text': 1 },
+					useGlobalTurnParam: { '#text': 1 },
+					useStraightLine: { '#text': 1 },
+				}
+				if (lnglat?.actions) {
+					const actionGroup = {
+						actionGroupId: { '#text': index },
+						actionGroupStartIndex: { '#text': index },
+						actionGroupEndIndex: { '#text': index },
+						actionGroupMode: { '#text': 'sequence' },
+						actionTrigger: {
+							actionTriggerType: { '#text': 'reachPoint' },
+						},
+						// 单个事件 - 如果是多个事件action可改成数组 action: [{}]
+						// action: [{
+						//   actionId: { '#text': 0 },
+						//   actionActuatorFunc: { '#text': '' },
+						//   actionActuatorFuncParam: {},
+						// }],
+						action: [],
+					}
+					lnglat?.actions.forEach((action, index) => {
+						const singleAction = {
+							actionId: { '#text': index },
+							actionActuatorFunc: { '#text': '' },
+							actionActuatorFuncParam: {},
+						}
+						// actionGroup.action['actionActuatorFunc'] = { '#text': action.key }
+						// action.params.forEach(p => {
+						//   if (p.value || p.value !== '') {
+						//     actionGroup.action['actionActuatorFuncParam'][p.key] = { '#text': p.value }
+						//   }
+						// })
+						singleAction['actionActuatorFunc'] = {
+							'#text': action.key,
+						}
+						action.params.forEach(p => {
+							if (p.value || p.value !== '') {
+								singleAction['actionActuatorFuncParam'][p.key] = {
+									'#text': p.value,
+								}
+							}
+						})
+						if (lnglat?.actions.length > 1) {
+							actionGroup.action.push(singleAction)
+						} else {
+							actionGroup.action = singleAction
+						}
+					})
+					placemark.actionGroup = actionGroup
+				}
+				fileTemplate.Folder.Placemark.push(placemark)
+			})
+			const fileWaylines = waylinesContext(fileTemplate)
+			return {
+				fileName: waylineName || fileName,
+				template: fileTemplate,
+				waylines: fileWaylines,
+			}
+		} catch (error) {
+			console.log(error)
+			return error
+		}
+	}
+
+	// 创建面状航线
+	const createPlanarWayline = (waylineBasicInfo, lnglats) => { }
+
+	// 创建点状航线
+	const createPointWayLines = (waylineBasicInfo, points, settingInfo, dockPosition) => {
+		try {
+			const { droneEnumValue, payloadEnumValue, waylineName } = waylineBasicInfo
+
+			const {
+				imageFormat,
+				heightMode,
+				globalHeight,
+				autoFlightSpeed,
+				gimbalPitchMode,
+				waypointTurnMode,
+				waypointHeadingMode,
+				finishAction,
+				globalTransitionalSpeed,
+			} = settingInfo
+
+			const date = new Date()
+			const username = window.localStorage.getItem('bs_username')
+			const updateTime = date.getTime()
+			const { year, month, day, hours, minutes } = getDateFromTimestamp(updateTime)
+			const fileName = '新建航线_' + year + month + day + hours + minutes
+			// 无人机机型、云台型号、航线高度
+
+			const defaultHeight = 100
+			// 起始点位 (参考点位-具体以机场为准)
+			const takeOffPoint = [dockPosition.latitude, dockPosition.longitude, 0].join(',')
+
+			// template.xml对象模版
+			const fileTemplate = {
+				author: { '#text': username },
+				createTime: { '#text': updateTime },
+				updateTime: { '#text': updateTime },
+				missionConfig: {
+					// 飞向首航点模式
+					flyToWaylineMode: { '#text': 'safely' },
+					// 航线结束动作
+					finishAction: { '#text': finishAction || 'goHome' },
+					// 失控是否继续执行航线
+					exitOnRCLost: { '#text': 'executeLostAction' },
+					// 失控动作类型
+					executeRCLostAction: { '#text': 'goBack' },
+					// 安全起飞高度
+					takeOffSecurityHeight: { '#text': 120 },
+					// 参考起飞点
+					takeOffRefPoint: { '#text': takeOffPoint },
+					// 参考起飞点绝对高度
+					takeOffRefPointAGLHeight: { '#text': 0 },
+					// 全局航线过渡速度
+					globalTransitionalSpeed: { '#text': globalTransitionalSpeed || 10 },
+					// 全局返航高度
+					globalRTHHeight: { '#text': defaultHeight },
+					// 无人机参数
+					droneInfo: {
+						droneEnumValue: { '#text': droneEnumValue },
+						droneSubEnumValue: {
+							'#text': droneModel[payloadEnumValue],
+						},
+					},
+					// 是否自动绕行(暂未验证M30T机型使用此参数后会不会无法起飞)
+					autoRerouteInfo: {
+						missionAutoRerouteMode: { '#text': 1 },
+						transitionalAutoRerouteMode: { '#text': 1 },
+					},
+					// 云台参数
+					payloadInfo: {
+						payloadEnumValue: { '#text': payloadEnumValue },
+						payloadSubEnumValue: {
+							'#text': droneModel[payloadEnumValue],
+						},
+						payloadPositionIndex: { '#text': 0 },
+					},
+				},
+				Folder: {
+					// 预定义模板类型 - 航点飞行
+					templateType: { '#text': 'waypoint' },
+					// 是否使用全局航线过渡速度
+					useGlobalTransitionalSpeed: { '#text': 0 },
+					templateId: { '#text': 0 },
+					// 坐标系参数信息
+					waylineCoordinateSysParam: {
+						// 经纬度坐标系 - 固定值
+						coordinateMode: { '#text': 'WGS84' },
+						// 航点高程参考平面	- 相对高度
+						heightMode: heightMode,
+					},
+					// 全局航线飞行速度
+					autoFlightSpeed: { '#text': autoFlightSpeed || 10 },
+					// 云台俯仰角控制模式
+					gimbalPitchMode: { '#text': gimbalPitchMode || 'manual' },
+					// 全局高度
+					globalHeight: { '#text': globalHeight || '100' },
+					// 全局偏航角模式参数 - 可使用当前默认值
+					globalWaypointHeadingParam: {
+						waypointHeadingMode: { '#text': waypointHeadingMode || 'followWayline' },
+						waypointHeadingAngle: { '#text': 0 },
+						waypointPoiPoint: {
+							'#text': '0.000000,0.000000,0.000000',
+						},
+						waypointHeadingPathMode: { '#text': 'followBadArc' },
+						waypointHeadingPoiIndex: { '#text': 0 },
+					},
+					// 全局航点类型 - 直线飞行,飞行器到点停
+					globalWaypointTurnMode: {
+						'#text': waypointTurnMode || 'toPointAndStopWithDiscontinuityCurvature',
+					},
+					// 全局航段轨迹是否尽量贴合直线
+					globalUseStraightLine: { '#text': 1 },
+					// 航点点位信息 - 位置、事件等
+					Placemark: [],
+					payloadParam: {
+						payloadPositionIndex: { '#text': 0 },
+						focusMode: { '#text': 'firstPoint' },
+						meteringMode: { '#text': 'average' },
+						returnMode: { '#text': 'singleReturnFirst' },
+						samplingRate: { '#text': '240000' },
+						scanningMode: { '#text': 'repetitive' },
+						imageFormat: imageFormat,
+					},
+				},
+			}
+			points.length &&
+				points.forEach((detail, ind) => {
+					const { Point, index, height, ellipsoidHeight, actionGroup, waypointSpeed } = detail
+
+					const placemark = {
+						Point,
+						// 航点index
+						index,
+						// 全局航线高度(椭球高)
+						ellipsoidHeight,
+						// 全局航线高度 (EGM96海拔高/相对起飞点高度/AGL相对地面高度)
+						height,
+						// 航点飞行速度
+						waypointSpeed: { '#text': waypointSpeed || 10 },
+						// 沿航线方向 - 可使用当前默认值
+						waypointHeadingParam: {
+							waypointHeadingMode: {
+								'#text': waypointHeadingMode || 'followWayline',
+							},
+							waypointHeadingAngle: { '#text': 0 },
+							waypointPoiPoint: {
+								'#text': '0.000000,0.000000,0.000000',
+							},
+							waypointHeadingPathMode: { '#text': 'followBadArc' },
+							waypointHeadingPoiIndex: { '#text': 0 },
+						},
+						// 航点类型
+						waypointTurnParam: {
+							waypointTurnMode: {
+								'#text': waypointTurnMode || 'toPointAndStopWithDiscontinuityCurvature',
+							},
+							waypointTurnDampingDist: { '#text': 0.2 },
+						},
+						// 是否全局参数
+						useGlobalHeight: { '#text': 1 },
+						useGlobalSpeed: { '#text': 0 },
+						useGlobalHeadingParam: { '#text': 1 },
+						useGlobalTurnParam: { '#text': 1 },
+						useStraightLine: { '#text': 1 },
+					}
+					if (actionGroup) {
+						placemark.actionGroup = actionGroup
+					}
+
+					fileTemplate.Folder.Placemark.push(placemark)
+				})
+
+			const fileWaylines = waylinesContext(fileTemplate)
+			return {
+				fileName: waylineName || fileName,
+				template: fileTemplate,
+				waylines: fileWaylines,
+			}
+		} catch (error) {
+			console.log(error)
+			return error
+		}
+	}
+
+	const save = async fileInfo => {
+		const JsZip = new JSZIP()
+		const { fileName, template, waylines } = fileInfo
+		const templateXml = JSONToXML(template, '', true)
+		const waylinesWpml = JSONToXML(waylines, '', true)
+		JsZip.file('wpmz/template.kml', templateXml)
+		JsZip.file('wpmz/waylines.wpml', waylinesWpml)
+		const fileBlob = await JsZip.generateAsync({ type: 'blob' })
+		// saveAs(kmzFile, `${fileName}.kmz`)
+		return fileBlob
+	}
+
+	const waylinesContext = templateJson => {
+		const waylinesObj = {
+			// 标准模版
+			missionConfig: {
+				flyToWaylineMode: null,
+				finishAction: null,
+				exitOnRCLost: null,
+				executeRCLostAction: null,
+				takeOffSecurityHeight: null,
+				globalTransitionalSpeed: null,
+				globalRTHHeight: null,
+				droneInfo: null,
+				payloadInfo: null,
+			},
+			Folder: {
+				templateId: null,
+				executeHeightMode: null,
+				waylineId: null,
+				autoFlightSpeed: null,
+				/*
+		  waylines.wpml和template.xml的Placemark通用
+		  不同点:
+			waylineId = templateId
+			ellipsoidHeight、 height 替换成 executeHeight
+		*/
+				Placemark: null,
+			},
+		}
+		Object.keys(waylinesObj).forEach(key => {
+			if (Object.prototype.toString.call(waylinesObj[key]) === '[object Object]') {
+				Object.keys(waylinesObj[key]).forEach(item => {
+					waylinesObj[key][item] = templateJson[key][item]
+					if (item === 'executeHeightMode') {
+						waylinesObj[key][item] = templateJson[key].waylineCoordinateSysParam.heightMode
+					}
+					if (item === 'waylineId') {
+						waylinesObj[key][item] = templateJson[key].templateId
+					}
+					if (item === 'Placemark') {
+						const placemarks = _.cloneDeep(templateJson[key][item])
+						placemarks.forEach(placemark => {
+							placemark.executeHeight = {
+								'#text': placemark.ellipsoidHeight?.['#text'] || '',
+							}
+							delete placemark.ellipsoidHeight
+							delete placemark.height
+						})
+						waylinesObj[key][item] = placemarks
+					}
+				})
+			} else {
+				waylinesObj[key] = templateJson[key]
+			}
+		})
+		return waylinesObj
+	}
+
+	return {
+		create,
+		createNoramlWaylines,
+		createPlanarWayline,
+		createPointWayLines,
+		save,
+	}
+}
diff --git a/applications/task-work-order/src/utils/cesium/useBoundary.js b/applications/task-work-order/src/utils/cesium/useBoundary.js
index d04ffb9..053ddd6 100644
--- a/applications/task-work-order/src/utils/cesium/useBoundary.js
+++ b/applications/task-work-order/src/utils/cesium/useBoundary.js
@@ -6,19 +6,17 @@
 import { useStore } from 'vuex'
 import { getDeviceRegion, getDeviceRegionCount } from '@/api/home/aggregation'
 import userStore from '@/store/modules/user'
-import { areaCodeToArr, getContourByCode } from '@/utils/cesium/mapUtil'
-// import { getEllipse } from '@/hooks/useSingleDroneMap/useSingleDroneMap'
+import { areaCodeToArr, getContourByCode, getDockPolyLine, getLnglatAltitude } from '@/utils/cesium/mapUtil'
 import getBaseConfig from '@/buildConfig/config'
 import { getDroneStatusImage } from '@/utils/stateToImageMap/drone'
-import {
-	GroundCirclePrimitiveManager
-} from '@/utils/mapUtils'
+import { GroundCirclePrimitiveManager } from '@/utils/mapUtils'
+
+import lowBattery from '@/assets/images/aiNowFly/low-battery.svg'
+import mediumBattery from '@/assets/images/aiNowFly/medium-battery.svg'
+import fullBattery from '@/assets/images/aiNowFly/full-charge.svg'
 
 const { VITE_APP_BASE, VITE_APP_ENV, VITE_APP_REGION_URL } = import.meta.env
-// const { singleDockSystem } = getBaseConfig()
 const { singleDockSystem } = getBaseConfig()
-
-
 
 /**
  * 使用通用的边界
@@ -26,8 +24,15 @@
  * @param options
  */
 export const useBoundary = (viewer, options = {}) => {
-	const { multiple = 1.4, dockOptions = {}, boundaryChange, boundaryColor, dockRangeType, useDockHeight = false } = options
-	const { scrollShowDock = false, showDock = false } = dockOptions
+	const {
+		multiple = 1.4,
+		dockOptions = {},
+		boundaryChange,
+		boundaryColor,
+		dockRangeType,
+		useDockHeight = false,
+	} = options
+	const { scrollShowDock = false, showDock = false, showDockNameAndBattery = false } = dockOptions
 
 	const manager = new GroundCirclePrimitiveManager()
 	manager.init(viewer)
@@ -56,7 +61,7 @@
 	}
 
 	// 获取设备列表
-	async function getDeviceRegionFun () {
+	async function getDeviceRegionFun() {
 		const res = await getDeviceRegion({ areaCode: selectedAreaCode })
 		return res?.data?.data || []
 	}
@@ -100,60 +105,127 @@
 		return await res.json()
 	}
 
+	function getBase64Image(imgUrl) {
+		const img = new Image()
+		const canvas = document.createElement('canvas')
+		const ctx = canvas.getContext('2d')
+
+		return new Promise(resolve => {
+			img.onload = function () {
+				canvas.width = img.width
+				canvas.height = img.height
+				ctx.drawImage(img, 0, 0)
+				const base64 = canvas.toDataURL('image/png')
+				resolve(base64)
+			}
+			img.src = imgUrl
+		})
+	}
+
+	function batteryLevelSvg(batteryNum) {
+		if (batteryNum <= 30) {
+			return lowBattery
+		} else if (batteryNum > 30 && batteryNum <= 60) {
+			return mediumBattery
+		} else {
+			return fullBattery
+		}
+	}
+
+	async function nestSVG(nickname, batteryImgUrl, batteryNum) {
+		let txt = nickname.length < 4 ? 130 : nickname.length * 38
+		let tranx = nickname.length < 4 ? 86 : nickname.length * 26 + 3
+		const batteryBase64Image = await getBase64Image(batteryImgUrl)
+		const svg = `
+		  <svg width="${txt}" height="100" xmlns="http://www.w3.org/2000/svg">
+			<g transform="translate(${tranx}, 10)">
+				<!-- 电池图标 -->
+				<image href="${batteryBase64Image}" x="0" y="2" width="12" height="13"/>
+				<!-- 电量值 -->
+				<text x="12" y="10" font-size="14" fill="${
+					batteryNum <= 30 ? '#FF604B' : batteryNum >= 60 ? '#40FF5C' : '#00FFF2'
+				}"  text-anchor="start" dominant-baseline="middle" font-weight="bolder" font-family="Source Han Sans CN" text-rendering="geometricPrecision">
+					${batteryNum}%
+				</text>
+			</g>
+		  </svg>
+		`
+		return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`
+	}
+
 	// 无人机散点渲染
 	const droneSplashed = () => {
-		let showDockList = showDockSnList === null
-			? _.cloneDeep(initDockList)
-			: initDockList.filter(item => showDockSnList.includes(item.device_sn))
+		manager.removeAll()
+		let showDockList =
+			showDockSnList === null
+				? _.cloneDeep(initDockList)
+				: initDockList.filter(item => showDockSnList.includes(item.device_sn))
 
-		showDockList.forEach((item, index) => {
+		showDockList.forEach(async (item, index) => {
+			if (item.status === 'OFFLINE') return
 			let polyline = {}
 
 			if (dockRangeType === 2) {
 				manager.addCircleOutline({
 					data: {
 						lng: item.longitude,
-						lat: item.latitude
+						lat: item.latitude,
 					},
-					frameColor: Cesium.Color.fromCssColorString('#7FFFD4')
+					frameColor: Cesium.Color.fromCssColorString('#7FFFD4'),
 				})
 			} else {
 				manager.addCircle({
 					data: {
 						lng: item.longitude,
-						lat: item.latitude
+						lat: item.latitude,
 					},
-					materialColor: Cesium.Color.CORNFLOWERBLUE.withAlpha(0.3)
+					materialColor: item.color ? item.color : Cesium.Color.CORNFLOWERBLUE.withAlpha(0.3),
 				})
 			}
 
 			if (useDockHeight) {
-				polyline = {
-					positions: new Cesium.CallbackProperty(() => {
-						const pointPosition = Cesium.Cartesian3.fromDegrees(+item.longitude, +item.latitude, +item.height)
-						if (!pointPosition) return []
-						// 获取点的位置
-						const cartographic = Cesium.Cartographic.fromCartesian(pointPosition)
-						// 获取地形高度
-						const terrainHeight = viewer.scene.globe.getHeight(cartographic) || 0
-						// 创建地面点位置
-						const groundPosition = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, terrainHeight)
-
-						return [pointPosition, groundPosition]
-					}, false),
-					width: 0.5,
-					material: Cesium.Color.WHITE,
-				}
+				polyline = getDockPolyLine(item, viewer)
 			}
-
+			const batteryImgUrl = batteryLevelSvg(item.capacity_percent)
+			const combinedImage = await nestSVG(item.nickname, batteryImgUrl, item.capacity_percent)
+			let pointObj = {}
+			try {
+				pointObj = await getLnglatAltitude(item.longitude, item.latitude, viewer)
+			} catch (e) {}
+			const position = Cesium.Cartesian3.fromDegrees(
+				+item.longitude,
+				+item.latitude,
+				useDockHeight ? +item.height : pointObj?.height || 0
+			)
+			if (showDockNameAndBattery) {
+				// 带电量
+				dockSource.entities.add({
+					position,
+					billboard: {
+						// new Cesium.ConstantProperty(pointData.status === 'OFFLINE' ? endingImg : unSelectedOnline),
+						image: combinedImage,
+					},
+				})
+			}
 			dockSource.entities.add({
-				position: Cesium.Cartesian3.fromDegrees(+item.longitude, +item.latitude, !useDockHeight ? 0 : +item.height),
+				label: {
+					text: item.nickname,
+					font: 'bold 16px Source Han Sans CN',
+					fillColor: Cesium.Color.WHITE,
+					outlineColor: Cesium.Color.BLACK,
+					outlineWidth: 2,
+					style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+					verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+					pixelOffset: new Cesium.Cartesian2(0, -24),
+				},
+				position,
 				polyline,
 				billboard: {
 					image: getDroneStatusImage(item.status),
 					width: 60,
 					height: 60,
-					eyeOffset: new Cesium.Cartesian3(0, 0, -5)
+					disableDepthTestDistance: Number.POSITIVE_INFINITY,
+					eyeOffset: new Cesium.Cartesian3(0, 0, -5),
 				},
 			})
 		})
@@ -186,7 +258,7 @@
 							positions: positions,
 							width: 5, // 直接设置宽度
 							clampToGround: true,
-							material: Cesium.Color.fromCssColorString(boundaryColor)
+							material: Cesium.Color.fromCssColorString(boundaryColor),
 						},
 						polygon,
 					})
@@ -205,7 +277,7 @@
 						positions: positions,
 						width: 1, // 直接设置宽度
 						clampToGround: true,
-						material: Cesium.Color.fromCssColorString(boundaryColor)
+						material: Cesium.Color.fromCssColorString(boundaryColor),
 					},
 				})
 			})
@@ -217,7 +289,6 @@
 	// 打开边界
 	const openContour = async () => {
 		const areaCode = selectedAreaCode || userAreaCode
-
 		viewer.scene.postRender.removeEventListener(determineScaling)
 		if (!areaCode) return
 		const hierarchy = areaCodeToArr(areaCode.slice(0, 6))
@@ -258,25 +329,29 @@
 			const outlineGJson = await getContourByCode(areaCode.slice(0, 6))
 			scalingJudgment.forEach(item => item.show && (item.outline = outlineGJson))
 			renderOutline(scalingJudgment[(hierarchy.length - 3) * -1])
-		} catch (e) { }
-		viewer.scene.postRender.addEventListener(determineScaling)
+		} catch (e) {}
+		try {
+			viewer?.scene?.postRender?.addEventListener(determineScaling)
+		}catch (e) {
+
+		}
 	}
 
 	// 关闭边界
-	function closeContour () {
+	function closeContour() {
 		removeAllEntities()
 		viewer.scene.postRender.removeEventListener(determineScaling)
 	}
 
 	// 飞向边界
-	async function flyToBoundary () {
+	async function flyToBoundary() {
 		// 单机巢系统
 		if (singleDockSystem) {
 			if (!initDockList.length) {
 				initDockList = await getDeviceRegionFun()
 			}
 			viewer?.camera.flyTo({
-				destination: Cesium.Cartesian3.fromDegrees(initDockList[0].longitude, initDockList[0].latitude, 24000),
+				destination: Cesium.Cartesian3.fromDegrees(initDockList[0].longitude, initDockList[0].latitude, 22000),
 				duration: 0,
 			})
 			return
@@ -286,7 +361,8 @@
 		const dataSource = await Cesium.GeoJsonDataSource.load(gJson)
 		if (!dataSource) return
 		viewer.dataSources.add(dataSource)
-
+		// 获取多边形边界所有点
+		let positionList = []
 		dataSource.entities.values.forEach(function (entity) {
 			if (entity.polygon) {
 				// 获取多边形的边界球
@@ -295,18 +371,16 @@
 					let cartographic = Cesium.Cartographic.fromCartesian(item)
 					let lng = Cesium.Math.toDegrees(cartographic.longitude) // 经度
 					let lat = Cesium.Math.toDegrees(cartographic.latitude) // 纬度
-
 					return [_.round(lng, 6), _.round(lat, 6)]
 				})
-
-				const newBox = boxTransformScale(curPolygonPosition, multiple)
-
-				viewer.camera.flyTo({
-					destination: Cesium.Rectangle.fromDegrees(...newBox),
-					offset: new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-90), 0),
-					duration: 0.5,
-				})
+				positionList = positionList.concat(curPolygonPosition)
 			}
+		})
+		const newBox = boxTransformScale(positionList, multiple)
+		viewer.camera.flyTo({
+			destination: Cesium.Rectangle.fromDegrees(...newBox),
+			offset: new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-90), 0),
+			duration: 0.5,
 		})
 
 		dataSource.entities.values.forEach(entity => {
@@ -320,7 +394,7 @@
 	 * 设置要显示的机巢列表
 	 * @param dockSns - 要显示的机巢设备序列号数组。如果为 undefined,则显示所有已初始化的机巢;如果为空数组,则不显示任何机巢。
 	 */
-	function setShowDock (dockSns) {
+	function setShowDock(dockSns) {
 		if (dockSns === undefined) {
 			showDockSnList = null
 		} else if (dockSns.length === 0) {
@@ -328,21 +402,31 @@
 		} else {
 			showDockSnList = dockSns
 		}
-
 		removeDockCover()
-
-		if (active === '县') droneSplashed()
+		if (!showDock) return
+		if (scrollShowDock ? active === '县' : true) {
+			droneSplashed()
+		}
 	}
-
+	function setDockCoverColor(arr) {
+		initDockList.forEach(item => {
+			arr.forEach(dock => {
+				item.color = dock.device_sn === item.device_sn ? dock.color : null
+			})
+		})
+		if (scrollShowDock ? active === '县' : true) {
+			droneSplashed()
+		}
+	}
 	onBeforeUnmount(() => {
 		manager.destroy()
 	})
-
 
 	return {
 		openContour,
 		closeContour,
 		flyToBoundary,
-		setShowDock
+		setShowDock,
+		setDockCoverColor,
 	}
 }
diff --git a/applications/task-work-order/src/views/RoutePlan/PlanarAirLine/planarRouteUtils.js b/applications/task-work-order/src/views/RoutePlan/PlanarAirLine/planarRouteUtils.js
deleted file mode 100644
index d796024..0000000
--- a/applications/task-work-order/src/views/RoutePlan/PlanarAirLine/planarRouteUtils.js
+++ /dev/null
@@ -1,1018 +0,0 @@
-import * as Cesium from 'cesium'
-
-import takeoffImg from '@/assets/images/routePlan/pointAirLine/takeoff.svg'
-import _, { cloneDeep, throttle } from 'lodash'
-import { cartesian3Convert } from '@/utils/cesium/mapUtil'
-import * as turf from '@turf/turf'
-import { ElMessage } from 'element-plus'
-
-import { analyzeKmzFile, removeTextKey, XMLToJSON } from '@/utils/cesium/kmz'
-import { camelToSnake } from '@/utils/util'
-
-import { boxTransformScale } from '@/utils/turfFunc'
-
-
-function _getMouseInfo (position, viewer) {
-	let scene = viewer.scene
-	let target = scene.pick(position)
-	let cartesian = undefined
-	let surfaceCartesian = undefined
-	let wgs84Position = undefined
-	let wgs84SurfacePosition = undefined
-	if (scene.pickPositionSupported) {
-		cartesian = scene.pickPosition(position)
-	}
-	if (cartesian) {
-		let c = Cesium.Ellipsoid.WGS84.cartesianToCartographic(cartesian)
-		if (c) {
-			wgs84Position = {
-				lng: Cesium.Math.toDegrees(c.longitude),
-				lat: Cesium.Math.toDegrees(c.latitude),
-				alt: c.height,
-			}
-		}
-	}
-	if (scene.mode === Cesium.SceneMode.SCENE3D && !(viewer.terrainProvider instanceof Cesium.EllipsoidTerrainProvider)) {
-		let ray = scene.camera.getPickRay(position)
-		surfaceCartesian = scene.globe.pick(ray, scene)
-	} else {
-		surfaceCartesian = scene.camera.pickEllipsoid(position, Cesium.Ellipsoid.WGS84)
-	}
-	if (surfaceCartesian) {
-		let c = Cesium.Ellipsoid.WGS84.cartesianToCartographic(surfaceCartesian)
-		if (c) {
-			wgs84SurfacePosition = {
-				lng: Cesium.Math.toDegrees(c.longitude),
-				lat: Cesium.Math.toDegrees(c.latitude),
-				alt: c.height,
-			}
-		}
-	}
-
-	return {
-		target: target,
-		windowPosition: position,
-		position: cartesian,
-		wgs84Position: wgs84Position,
-		surfacePosition: surfaceCartesian,
-		wgs84SurfacePosition: wgs84SurfacePosition,
-	}
-}
-
-let startPointEntity = null
-// 生成起飞点
-function generateStartPoint (movement, viewer) {
-	// 1. 获取笛卡尔坐标
-	const cartesian = viewer.scene.pickPosition(movement.endPosition)
-	if (!cartesian) return
-	// 2. 笛卡尔转为弧度
-	const cartographic = Cesium.Cartographic.fromCartesian(cartesian)
-	// 3. 精确获取地形高度(异步)
-	Cesium.sampleTerrainMostDetailed(viewer.terrainProvider, [cartographic])
-		.then(updatedPositions => {
-			const terrainHeight = updatedPositions[0].height
-			const position = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, terrainHeight)
-			// 4. 更新或创建点实体
-			if (startPointEntity) {
-				startPointEntity.position = position
-			} else {
-				startPointEntity = viewer.entities.add({
-					position,
-					id: 'wayline-point-start-init',
-					billboard: {
-						image: takeoffImg,
-						outlineWidth: 0,
-						width: 36,
-						height: 36,
-						scale: 1.0,
-					},
-				})
-			}
-		})
-		.catch(error => console.error("地形加载失败:", error))
-}
-export const createStartThrottle = throttle(generateStartPoint, 20)
-
-// 获取起飞点位置
-export function getStartPointLast (viewer) {
-	const point = cartesian3Convert(startPointEntity.position.getValue(), viewer) //经纬度
-	startPointEntity && viewer.entities.remove(startPointEntity)
-	return point
-}
-
-export function removeStartPoint (viewer) {
-	if (startPointEntity) {
-		viewer.entities.remove(startPointEntity)
-		startPointEntity = null
-	}
-}
-
-// 检查位置是否在合理范围内
-export function isValidPosition (cartographic) {
-	// 检查经纬度是否在合理范围内
-	return (
-		cartographic.longitude >= -Math.PI &&
-		cartographic.longitude <= Math.PI &&
-		cartographic.latitude >= -Math.PI / 2 &&
-		cartographic.latitude <= Math.PI / 2
-	)
-}
-
-export class PolygonDrawer {
-	/**
-	 * @param {Function} updatePosition - Position update callback function
-	 * @param {Object} idShowWaringTip - Warning tip visibility flag
-	 */
-	constructor(updatePosition, idShowWaringTip) {
-		// Initialize properties
-		this.viewer = null
-		this.curPolygon = null
-		this.drawingMode = false
-		this.settingMode = false
-		this.isDragging = false
-		this.draggedEntity = null
-		this.polygonEntity = null
-		this.editPolygonPointDataSource = null
-		this.handler = null
-		this.updatePosition = updatePosition
-		this.menuPopup = null
-		this.delPolygonPoint = null
-		this.idShowWaringTip = idShowWaringTip
-		this.currentDragPointIsValid = false
-		this.currentDragPointPosition = null
-
-		// Bind methods to maintain context
-		this.handleLeftDown = this.handleLeftDown.bind(this)
-		this.handleLeftUp = this.handleLeftUp.bind(this)
-		this.handleMouseMove = this.handleMouseMove.bind(this)
-		this.handleLeftClick = this.handleLeftClick.bind(this)
-		this.handleRightClick = this.handleRightClick.bind(this)
-		this.delPolygon = this.delPolygon.bind(this)
-		this.delPoint = this.delPoint.bind(this)
-	}
-
-	// Constants for entity names and IDs
-	static ENTITY_NAMES = {
-		POLYGON: '面状航线-面',
-		POINT: '面状航线-端点',
-		POLYGON_ID: 'planar-route-polygon',
-		POINT_ID_PREFIX: 'planar-route-point-'
-	};
-
-	// Constants for colors
-	static COLORS = {
-		DEFAULT_POLYGON: Cesium.Color.fromBytes(45, 140, 240, 99),
-		DEFAULT_LINE: Cesium.Color.fromBytes(45, 140, 240, 255),
-		ERROR_POLYGON: Cesium.Color.fromCssColorString('rgba(255, 0, 0, .3)'),
-		ERROR_LINE: Cesium.Color.fromCssColorString('rgba(255, 0, 0, 1)')
-	};
-
-	/**
-	 * Initialize polygon with existing positions
-	 * @param {Cesium.Viewer} viewer - Cesium viewer instance
-	 * @param {Array} positions - Array of position objects {lng, lat, height}
-	 */
-	initPolygon (viewer, positions) {
-		this.initHandler(viewer)
-		this.startDrawing()
-
-		positions.forEach(item => {
-			this.addPosition(
-				Cesium.Cartesian3.fromDegrees(Number(item.lng), Number(item.lat), Number(item.height)),
-				false
-			)
-		})
-
-		const newBox = boxTransformScale(positions.map(item => [item.lng, item.lat]), 5)
-		viewer.camera.flyTo({
-			destination: Cesium.Rectangle.fromDegrees(...newBox),
-			offset: new Cesium.HeadingPitchRange(0, Cesium.Math.toRadians(-90), 0),
-			duration: 0.5,
-		})
-
-		this.drawingMode = false
-		this.settingMode = true
-	}
-
-	/**
-	 * Start drawing a new polygon
-	 */
-	startDrawing () {
-		this.drawingMode = true
-		this.curPolygon = new Cesium.PolygonHierarchy()
-
-		if (!this.editPolygonPointDataSource) {
-			this.editPolygonPointDataSource = new Cesium.CustomDataSource('editPolygonPointDataSource')
-			this.viewer?.dataSources.add(this.editPolygonPointDataSource)
-		}
-
-		this.editPolygonPointDataSource?.entities.removeAll()
-	}
-
-	/**
-	 * Add a position to the current polygon
-	 * @param {Cesium.Cartesian3} position - Position to add
-	 * @param {Boolean} isAdd - Whether this is an additional point (vs initial point)
-	 */
-	addPosition (position, isAdd = true) {
-		if (this.curPolygon.positions.length === 0 && isAdd) {
-			this.curPolygon.positions.push(position.clone())
-		}
-
-		this.curPolygon.positions.push(position.clone())
-
-		if (!this.polygonEntity) {
-			this.createPolygonEntity()
-		}
-
-		this.createPointEntity(position, isAdd)
-	}
-
-	/**
-	 * Create the main polygon entity
-	 */
-	createPolygonEntity () {
-		this.polygonEntity = this.viewer.entities.add({
-			name: PolygonDrawer.ENTITY_NAMES.POLYGON,
-			id: PolygonDrawer.ENTITY_NAMES.POLYGON_ID,
-			polygon: {
-				hierarchy: new Cesium.CallbackProperty(() => this.curPolygon, false),
-				material: PolygonDrawer.COLORS.DEFAULT_POLYGON,
-				outline: false,
-				outlineWidth: 2,
-				heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
-			},
-			polyline: {
-				width: 2,
-				material: PolygonDrawer.COLORS.DEFAULT_LINE,
-				clampToGround: true,
-				positions: new Cesium.CallbackProperty(
-					() => [...this.curPolygon.positions, this.curPolygon.positions[0]],
-					false
-				)
-			},
-		})
-	}
-
-	/**
-	 * Create a point entity for the polygon
-	 * @param {Cesium.Cartesian3} position - Position of the point
-	 * @param {Boolean} isAdd - Whether this is an additional point
-	 */
-	createPointEntity (position, isAdd) {
-		const pointIndex = isAdd ? this.curPolygon.positions.length - 2 : this.curPolygon.positions.length - 1
-
-		this.editPolygonPointDataSource.entities.add({
-			name: PolygonDrawer.ENTITY_NAMES.POINT,
-			id: `${PolygonDrawer.ENTITY_NAMES.POINT_ID_PREFIX}${pointIndex}`,
-			position: position.clone(),
-			point: {
-				pixelSize: 14,
-				color: Cesium.Color.WHITE,
-				heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
-				disableDepthTestDistance: Number.POSITIVE_INFINITY,
-			},
-			customData: {
-				ind: pointIndex,
-			},
-		})
-	}
-
-	/**
-	 * Finish drawing the polygon
-	 */
-	finishDrawing () {
-		this.curPolygon.positions.pop()
-
-		if (this.curPolygon.positions.length >= 3) {
-			this.drawingMode = false
-			this.settingMode = true
-			this.editPolygonPointDataSource.entities.show = true
-
-			if (!this.curDragPointIsValid(this.curPolygon.positions)) {
-				this.idShowWaringTip.value = true
-				this.currentDragPointIsValid = true
-				this.updatePolygonAppearance(PolygonDrawer.COLORS.ERROR_POLYGON, PolygonDrawer.COLORS.ERROR_LINE)
-			} else {
-				this.idShowWaringTip.value = false
-				this.currentDragPointIsValid = false
-				this.updatePolygonAppearance(PolygonDrawer.COLORS.DEFAULT_POLYGON, PolygonDrawer.COLORS.DEFAULT_LINE)
-			}
-
-			this.updatePosition(this.curPolygon.positions)
-		}
-	}
-
-	/**
-	 * Delete the current polygon
-	 */
-	delPolygon () {
-		this.removeEntities()
-		this.removeMenuPopup()
-		this.updatePosition([])
-		this.startDrawing()
-	}
-
-	/**
-	 * Delete a point from the polygon
-	 */
-	delPoint () {
-		if (this.curPolygon.positions.length <= 3) {
-			this.removeMenuPopup()
-			return ElMessage.warning('端点不可少于3个')
-		}
-		if (!this.delPolygonPoint) return
-
-		this.curPolygon.positions.splice(this.delPolygonPoint.customData.ind, 1)
-		this.editPolygonPointDataSource.entities.remove(this.delPolygonPoint)
-		this.removeMenuPopup()
-
-		// Update indices of remaining points
-		this.editPolygonPointDataSource.entities.values.forEach((item, index) => {
-			item.customData.ind = index
-		})
-
-		this.updatePosition(this.curPolygon.positions)
-	}
-
-	/**
-	 * Create a context menu popup
-	 * @param {String} type - Type of menu ('polygon' or 'edit-point')
-	 * @returns {HTMLElement} The created menu element
-	 */
-	createMenuPopup (type = 'polygon') {
-		const menuPopupVBox = document.createElement('div')
-		menuPopupVBox.id = 'planarPolygonEdit'
-		menuPopupVBox.className = 'planar-polygon-edit-tooltip'
-
-		const menuPopup = document.createElement('div')
-		menuPopup.id = 'planarPolygonEditMenu'
-		menuPopup.className = 'planar-polygon-edit-menu'
-
-		const menuItems = type === 'polygon'
-			? [{ title: '删除测区', class: 'del-planar-polygon' }]
-			: [{ title: '删除端点', class: 'del-planar-point' }]
-
-		menuItems.forEach(item => {
-			const titleDiv = document.createElement('div')
-			titleDiv.innerText = item.title
-			titleDiv.className = item.class
-			menuPopup.appendChild(titleDiv)
-		})
-
-		menuPopupVBox.appendChild(menuPopup)
-		return menuPopupVBox
-	}
-
-	/**
-	 * Remove the context menu popup
-	 */
-	removeMenuPopup () {
-		if (this.menuPopup) {
-			this.menuPopup.removeEventListener('click', this.delPolygon)
-			this.menuPopup.removeEventListener('click', this.delPoint)
-			this.viewer.container.removeChild(this.menuPopup)
-			this.menuPopup = null
-		}
-		this.delPolygonPoint = null
-	}
-
-	/**
-	 * Handle left mouse button down event
-	 * @param {Object} movement - Mouse movement event object
-	 */
-	handleLeftDown (movement) {
-		if (!this.settingMode) return
-
-		const pickedEntity = this.viewer.scene.pick(movement.position)?.id
-		const isPoint = pickedEntity?.name === PolygonDrawer.ENTITY_NAMES.POINT
-
-		if (pickedEntity && isPoint) {
-			this.isDragging = true
-			this.draggedEntity = pickedEntity
-			this.currentDragPointPosition = this.curPolygon.positions[this.draggedEntity?.customData.ind]
-			this.disableMapControl()
-		}
-	}
-
-	/**
-	 * Handle left mouse button up event
-	 */
-	handleLeftUp () {
-		if (!(this.settingMode && this.curPolygon?.positions && this.draggedEntity)) return
-
-		if (this.currentDragPointIsValid && this.isDragging) {
-			this.draggedEntity.position = this.currentDragPointPosition
-			this.curPolygon.positions[this.draggedEntity?.customData.ind] = this.currentDragPointPosition
-
-			if (!this.curDragPointIsValid(this.curPolygon.positions)) {
-				this.idShowWaringTip.value = true
-				this.currentDragPointIsValid = true
-				this.updatePolygonAppearance(PolygonDrawer.COLORS.ERROR_POLYGON, PolygonDrawer.COLORS.ERROR_LINE)
-			} else {
-				this.idShowWaringTip.value = false
-				this.currentDragPointIsValid = false
-				this.updatePolygonAppearance(PolygonDrawer.COLORS.DEFAULT_POLYGON, PolygonDrawer.COLORS.DEFAULT_LINE)
-			}
-		}
-
-		if (this.isDragging) {
-			this.updatePosition(this.curPolygon.positions)
-			this.isDragging = false
-			this.draggedEntity = null
-			this.enableMapControl()
-		}
-	}
-
-	/**
-	 * Update polygon appearance
-	 * @param {Cesium.Color} polygonColor - Color for the polygon
-	 * @param {Cesium.Color} lineColor - Color for the outline
-	 */
-	updatePolygonAppearance (polygonColor, lineColor) {
-		this.polygonEntity.polygon.material = polygonColor
-		this.polygonEntity.polyline.material = lineColor
-	}
-
-	/**
-	 * Handle left mouse click event
-	 * @param {Object} click - Click event object
-	 */
-	handleLeftClick (click) {
-		this.removeMenuPopup()
-
-		const pickedAllEntity = this.viewer.scene.drillPick(click.position).filter(i => i.id)
-		const isStartPoint = pickedAllEntity.find(i => i.id.name === '起飞点')
-		const isPolygonPoint = pickedAllEntity.find(i => i.id.name === PolygonDrawer.ENTITY_NAMES.POINT)
-		const isPolygon = pickedAllEntity.find(i => i.id.name === PolygonDrawer.ENTITY_NAMES.POLYGON)
-
-		if (isStartPoint) return
-
-		if (!this.drawingMode) {
-			if (!isPolygon) {
-				this.settingMode = false
-				this.editPolygonPointDataSource.entities.show = false
-				return
-			}
-
-			if (isPolygon) {
-				this.settingMode = true
-				this.editPolygonPointDataSource.entities.show = true
-			}
-			return
-		}
-
-
-		if (this.curPolygon.positions.length < 4 && isPolygonPoint) {
-			return
-		}
-
-		if (this.curPolygon.positions.length >= 4 && isPolygonPoint) {
-			if (!this.drawingMode) return
-
-			this.finishDrawing()
-
-			return
-		}
-
-		const cartesian = this.viewer.scene.pickPosition(click.position)
-		if (!cartesian) return
-
-		this.addPosition(cartesian)
-	}
-
-	/**
-	 * Handle right mouse click event
-	 * @param {Object} click - Click event object
-	 */
-	handleRightClick (click) {
-		if (this.drawingMode) return
-
-		this.removeMenuPopup()
-
-		const pickedAllEntity = this.viewer.scene.drillPick(click.position).filter(i => i.id)
-		const isPolygon = pickedAllEntity.find(i => i.id.name === PolygonDrawer.ENTITY_NAMES.POLYGON)
-		const isEditPoint = pickedAllEntity.find(i => i.id.name === PolygonDrawer.ENTITY_NAMES.POINT)
-		const { position: { x, y } } = click
-
-		let pickedEntity, tooltipEvent, menuType
-
-		if (isPolygon) {
-			pickedEntity = isPolygon
-			tooltipEvent = this.delPolygon
-			menuType = 'polygon'
-		} else if (isEditPoint) {
-			pickedEntity = isEditPoint
-			tooltipEvent = this.delPoint
-			menuType = 'edit-point'
-		}
-
-		if (pickedEntity) {
-			this.delPolygonPoint = pickedEntity.id
-			this.menuPopup = this.createMenuPopup(menuType)
-			this.menuPopup.style.transform = `translate3d(${x - 10}px, ${y - 10}px, 0)`
-			this.viewer.container.appendChild(this.menuPopup)
-			this.menuPopup.addEventListener('click', tooltipEvent)
-		}
-	}
-
-	/**
-	 * Handle mouse move event
-	 * @param {Object} movement - Mouse movement event object
-	 */
-	handleMouseMove (movement) {
-		if (!this.drawingMode && !this.settingMode) return
-
-		const cartesian = this.viewer.scene.pickPosition(movement.endPosition)
-		if (!cartesian) return
-
-		if (this.settingMode && this.draggedEntity?.customData) {
-			this.draggedEntity.position = cartesian
-			this.curPolygon.positions[this.draggedEntity?.customData.ind] = cartesian
-		}
-
-		if (this.drawingMode && this.polygonEntity && this.curPolygon.positions.length >= 1) {
-			this.curPolygon.positions.pop()
-			this.curPolygon.positions.push(cartesian)
-		}
-
-		if ((this.settingMode && this.draggedEntity?.customData) || (this.drawingMode && this.polygonEntity && this.curPolygon.positions.length >= 3)) {
-			if (!this.curDragPointIsValid(this.curPolygon.positions)) {
-				this.idShowWaringTip.value = true
-				this.currentDragPointIsValid = true
-				this.updatePolygonAppearance(PolygonDrawer.COLORS.ERROR_POLYGON, PolygonDrawer.COLORS.ERROR_LINE)
-			} else {
-				this.idShowWaringTip.value = false
-				this.currentDragPointIsValid = false
-				this.updatePolygonAppearance(PolygonDrawer.COLORS.DEFAULT_POLYGON, PolygonDrawer.COLORS.DEFAULT_LINE)
-			}
-		}
-	}
-
-	/**
-	 * Check if the current dragged point position is valid
-	 * @param {Array} positions - Array of polygon positions
-	 * @returns {Boolean} True if the polygon is valid (no self-intersections)
-	 */
-	curDragPointIsValid (positions) {
-		if (positions.length < 3) return true
-
-		const cartographics = Cesium.Ellipsoid.WGS84.cartesianArrayToCartographicArray(positions)
-		const latLngPoints = cartographics.map(cartographic => [
-			Cesium.Math.toDegrees(cartographic.longitude),
-			Cesium.Math.toDegrees(cartographic.latitude)
-		])
-
-
-		const poly = turf.polygon([[...latLngPoints, latLngPoints[0]]])
-		const intersections = turf.kinks(poly)
-
-		return intersections.features.length === 0
-	}
-
-	/**
-	 * Disable map controls during interaction
-	 */
-	disableMapControl () {
-		const controller = this.viewer.scene.screenSpaceCameraController
-		controller.enableRotate = false
-		controller.enableTranslate = false
-		controller.enableZoom = false
-	}
-
-	/**
-	 * Enable map controls after interaction
-	 */
-	enableMapControl () {
-		const controller = this.viewer.scene.screenSpaceCameraController
-		controller.enableRotate = true
-		controller.enableTranslate = true
-		controller.enableZoom = true
-	}
-
-	/**
-	 * Remove all entities
-	 */
-	removeEntities () {
-		// Remove main polygon entities
-		const entitiesIDs = this.viewer.entities.values.map(i => i.id)
-		entitiesIDs.forEach(item => {
-			if (item.includes('planar-route-')) {
-				this.viewer.entities.removeById(item)
-			}
-		})
-
-		this.settingMode = false
-
-		this.polygonEntity = null
-		this.curPolygon = null
-
-		// Remove edit points
-		if (this.editPolygonPointDataSource) {
-			this.editPolygonPointDataSource.entities.removeAll()
-			this.editPolygonPointDataSource = null
-		}
-	}
-
-	/**
-	 * Initialize event handlers
-	 * @param {Cesium.Viewer} viewer - Cesium viewer instance
-	 */
-	initHandler (viewer) {
-		this.viewer = viewer
-		this.startDrawing()
-
-		if (!this.handler) {
-			this.handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
-
-			// Set up event handlers
-			const events = [
-				[Cesium.ScreenSpaceEventType.LEFT_DOWN, this.handleLeftDown],
-				[Cesium.ScreenSpaceEventType.LEFT_UP, this.handleLeftUp],
-				[Cesium.ScreenSpaceEventType.MOUSE_MOVE, this.handleMouseMove],
-				[Cesium.ScreenSpaceEventType.LEFT_CLICK, this.handleLeftClick],
-				[Cesium.ScreenSpaceEventType.RIGHT_CLICK, this.handleRightClick]
-			]
-
-			events.forEach(([type, handler]) => {
-				this.handler.setInputAction(handler, type)
-			})
-		}
-	}
-
-	/**
-	 * Remove event handlers
-	 */
-	removeHandler () {
-		if (this.handler) {
-			const eventTypes = [
-				Cesium.ScreenSpaceEventType.LEFT_DOWN,
-				Cesium.ScreenSpaceEventType.LEFT_UP,
-				Cesium.ScreenSpaceEventType.MOUSE_MOVE,
-				Cesium.ScreenSpaceEventType.LEFT_CLICK,
-				Cesium.ScreenSpaceEventType.RIGHT_CLICK
-			]
-
-			eventTypes.forEach(type => {
-				this.handler.removeInputAction(type)
-			})
-
-			this.handler = null
-		}
-	}
-
-	/**
-	 * Clean up and destroy the instance
-	 */
-	destroy () {
-		if (!this.viewer) return
-
-		this.removeMenuPopup()
-		this.removeEntities()
-		this.removeHandler()
-		this.enableMapControl()
-	}
-}
-
-export function disposeData (curPolygonPosition, polylinePoints, rthAltitudePoint) {
-	let data = [...curPolygonPosition]
-	data.push(curPolygonPosition[0])
-
-	let disposePolylinePoints = [...polylinePoints]
-
-	if (polylinePoints.length === 1) {
-		ElMessage.warning('当前高度过高,无法生成有效航线,请调整!')
-
-		disposePolylinePoints = [...polylinePoints, ...polylinePoints]
-	}
-
-	const polygon = turf.polygon([data.map(item => [item.lng, item.lat])])
-
-	const polygonArea = turf.area(polygon)
-
-
-	var line = turf.lineString(disposePolylinePoints.map(item => [item.longitude, item.latitude]))
-	var length = turf.length(line, { units: 'kilometers' })
-
-	const newPolylinePoints = disposePolylinePoints.map((item, index) => {
-		return Cesium.Cartesian3.fromDegrees(Number(item.longitude), Number(item.latitude), Number(item.height))
-	})
-
-	let polylineLength = 0
-
-	newPolylinePoints.forEach((item, index) => {
-		if (index == newPolylinePoints.length - 1) return
-
-		let point1 = item
-		let point2 = newPolylinePoints[index + 1]
-
-		polylineLength += Cesium.Cartesian3.distance(point1, point2)
-	})
-
-	const newRthAltitudePoint = rthAltitudePoint.map((item, index) => {
-		return Cesium.Cartesian3.fromDegrees(Number(item.longitude), Number(item.latitude), Number(item.height))
-	})
-
-	let rthLineLength = 0
-
-	newRthAltitudePoint.forEach((item, index) => {
-		if (index == newRthAltitudePoint.length - 1) return
-
-		let point1 = item
-		let point2 = newRthAltitudePoint[index + 1]
-
-		rthLineLength += Cesium.Cartesian3.distance(point1, point2)
-	})
-
-	return {
-		polygonArea,
-		polylineLength,
-		rthLineLength,
-		photoNum: polylinePoints.length * 3
-	}
-}
-
-export const getGsd = (globalSettings, gsdInfo) => {
-	if (_.isEmpty(gsdInfo) || !gsdInfo.image_height) {
-		ElMessage.warning('相机参数获取异常,请联系管理员!')
-		return
-	}
-
-	let w = gsdW(
-		globalSettings.relTerrainHeight,
-		gsdInfo.sensor_width,
-		gsdInfo.focal_length,
-		gsdInfo.image_width
-	)
-	let h = gsdH(
-		globalSettings.relTerrainHeight,
-		gsdInfo.sensor_height,
-		gsdInfo.focal_length,
-		gsdInfo.image_height
-	)
-
-	return w > h ? w : h
-}
-
-export const getGsdByH = (globalSettings, gsdInfo) => {
-	if (!gsdInfo && !gsdInfo.image_height) {
-		ElMessage.warning('相机参数获取异常,请联系管理员!')
-		return
-	}
-
-	let w = gsdW(
-		globalSettings.relTerrainHeight,
-		gsdInfo.sensor_width,
-		gsdInfo.focal_length,
-		gsdInfo.image_width
-	)
-
-	let h = gsdH(
-		globalSettings.relTerrainHeight,
-		gsdInfo.sensor_height,
-		gsdInfo.focal_length,
-		gsdInfo.image_height
-	)
-
-	if (w > h) {
-		return getHbyHW(
-			globalSettings.gsd,
-			gsdInfo.sensor_width,
-			gsdInfo.focal_length,
-			gsdInfo.image_width
-		)
-	} else {
-		return getHbyH(
-			globalSettings.gsd,
-			gsdInfo.sensor_height,
-			gsdInfo.focal_length,
-			gsdInfo.image_height
-		)
-	}
-}
-
-// 解析kmz文件的时候处理pointList 写在这里
-export function handlePointListForKmz (placemark, templateType) {
-	if (!placemark?.length) return []
-
-	let list = []
-
-	if (templateType === "mapping2d") {
-		list = placemark.map(item => {
-			const [longitude, latitude] = item.point.coordinates.trim().split(',')
-
-			return {
-				longitude: longitude,
-				latitude: latitude,
-				height: 0,
-
-				speed: item.waypoint_speed
-			}
-		})
-	} else {
-		list = placemark.map(i => i.map(item => {
-			const [longitude, latitude] = item.point.coordinates.trim().split(',')
-
-			return {
-				longitude: longitude,
-				latitude: latitude,
-				height: 0,
-
-				speed: item.waypoint_speed
-			}
-		}))
-	}
-
-	return list
-}
-
-export async function analysisPlanarRouteKmz (kmzUrl) {
-	const res = await analyzeKmzFile(`${kmzUrl}?_t=${new Date().getTime()}`)
-	const templateXML = await res.fileInfoObj['wpmz/template.kml']
-	const waylinesXML = await res.fileInfoObj['wpmz/waylines.wpml']
-	const templateXMLJSON = XMLToJSON(templateXML)?.['Document']
-	const waylinesXMLJSON = XMLToJSON(waylinesXML)?.['Document']
-	const templateXMLObj = camelToSnake(removeTextKey(templateXMLJSON))
-	const waylinesXMLObj = camelToSnake(removeTextKey(waylinesXMLJSON))
-
-	const {
-		folder: {
-			auto_flight_speed,
-			payload_param: {
-				image_format
-			} = {},
-			placemark: {
-				direction: waylineAngle,
-				inclined_gimbal_pitch: inclined_gimbal_pitch = -45,
-				overlap: {
-					inclined_camera_overlap_h: inclined_camera_overlap_h,
-					inclined_camera_overlap_w: inclined_camera_overlap_w,
-					ortho_camera_overlap_w: side_ratio,
-					ortho_camera_overlap_h: course_ratio,
-				},
-				polygon,
-				margin: buffer_distance_meters = 0
-			},
-			template_type: templateType,
-
-			wayline_coordinate_sys_param: {
-				global_shoot_height
-			}
-		} = {},
-		mission_config: {
-			take_off_ref_point,  // 参考起飞点
-			drone_info: { drone_enum_value, drone_sub_enum_value } = {},
-			payload_info: { payload_position_index, payload_enum_value, payload_sub_enum_value }
-		} = {},
-	} = templateXMLObj
-
-	const {
-		mission_config:
-		{
-			// 安全起飞高
-			take_off_security_height: rth_altitude
-		} = {},
-		folder: polygonPointFolder
-	} = waylinesXMLObj
-
-	let execute_height_mode = ''
-	let pointPlacemark
-
-	if (templateType === "mapping2d") {
-		execute_height_mode = polygonPointFolder.execute_height_mode
-		pointPlacemark = polygonPointFolder.placemark
-	} else {
-		execute_height_mode = polygonPointFolder[0].execute_height_mode
-		pointPlacemark = polygonPointFolder.map(i => i.placemark)
-	}
-
-	const [latitude, longitude, height] = take_off_ref_point.split(',').map(item => _.round(item, 6))
-	let startPoint = { latitude, longitude, height: Number.isNaN(height) ? 0 : height }
-
-	// 取出点位
-	const coordinates = polygon?.outer_boundary_is.linear_ring
-		.coordinates?.split('\n') || []
-
-	// 数组转换
-	let polygonList = coordinates.map((coordinate) =>
-		coordinate
-			.replace(/\s+/g, '')
-			.split(',')
-			.map((v) => Number(v)),
-	)
-
-	polygonList.pop()
-
-	let pointList = handlePointListForKmz(pointPlacemark, templateType)
-
-	return {
-		take_off_ref_point,
-
-		startPoint,
-		image_format,
-		templateType,
-		global_shoot_height,
-		rth_altitude,
-		auto_flight_speed,
-
-		waylineAngle,
-
-		side_ratio,
-		course_ratio,
-
-		inclined_camera_overlap_h,
-		inclined_camera_overlap_w,
-
-		inclined_gimbal_pitch,
-
-		drone_enum_value,
-		drone_sub_enum_value,
-
-		payload_position_index,
-		payload_enum_value,
-		payload_sub_enum_value,
-
-		execute_height_mode,
-
-		pointList,
-		polygonList,
-
-		buffer_distance_meters
-	}
-}
-
-// 计算gsd-H
-function gsdH (height, ch, jj, ih) {
-	let one = Number((height * ch).toFixed(2))
-	let two = Number((jj * ih).toFixed(2))
-	let three = Number((one / two).toFixed(5))
-	let four = Number((three * 100).toFixed(2))
-	return four
-}
-
-function gsdW (height, cw, jj, iw) {
-	let one = Number((height * cw).toFixed(2))
-	let two = Number((jj * iw).toFixed(2))
-	let three = Number((one / two).toFixed(5))
-	let four = Number((three * 100).toFixed(2))
-	return four
-}
-
-// 计算gsd-H
-function getHbyH (gsd, ch, jj, ih) {
-	let one = Number((jj * ih).toFixed(2))
-	let two = Number((gsd / 100).toFixed(4))
-	let three = Number((two * one).toFixed(4))
-	let four = Number((three / ch).toFixed(2))
-	return four
-}
-
-function getHbyHW (gsd, cw, jj, iw) {
-	let one = Number((jj * iw).toFixed(2))
-	let two = Number((gsd / 100).toFixed(4))
-	let three = Number((two * one).toFixed(4))
-	let four = Number((three / cw).toFixed(2))
-	return four
-}
-
-export function getNewPolygonData (data) {
-	const polygonData = data.reduce((pre, cur) => {
-		let arr = cur.data.map(i => {
-			if ('point' in i) return i.point.coordinates.split(',')
-			if ('Point' in i) {
-				if (_.isObject(i.Point.coordinates) && '#text' in i.Point.coordinates) return i.Point.coordinates['#text'].split(',')
-				return i.Point.coordinates.split(',')
-			}
-		}).map(i => turf.point([Number(i[0]), Number(i[1])]))
-
-		return pre.push(...arr), pre
-	}, [])
-
-	const hull = turf.convex(turf.featureCollection(polygonData))
-
-	return hull.geometry.coordinates[0]
-}
-
-export function getApiNewPolygonData (data) {
-	const polygonData = data.reduce((pre, cur) => {
-		let arr = cur.data.map(i => turf.point([Number(i.x), Number(i.y)]))
-
-		return pre.push(...arr), pre
-	}, [])
-
-	const hull = turf.convex(turf.featureCollection(polygonData))
-
-	return hull.geometry.coordinates[0]
-}
-
-export function getBufferPolygonData (data, meters = 0) {
-	const turfPolygonData = data.map(i => [i.lng, i.lat])
-	const polygon = turf.polygon([[...turfPolygonData, turfPolygonData[0]]])
-
-	const buffered = turf.buffer(polygon, meters, {
-		units: 'meters',
-		steps: 16
-	})
-
-	return buffered.geometry.coordinates[0]
-}
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/RoutePlan/PointAirLine/pointWayLineUtils.js b/applications/task-work-order/src/views/RoutePlan/PointAirLine/pointWayLineUtils.js
deleted file mode 100644
index bbc8505..0000000
--- a/applications/task-work-order/src/views/RoutePlan/PointAirLine/pointWayLineUtils.js
+++ /dev/null
@@ -1,613 +0,0 @@
-import CreateFrustum from '@/utils/cesium/frustum/CreateFrustum'
-
-import arrow from '@/assets/gltf/arrow.gltf'
-import * as Cesium from 'cesium'
-import { Decimal } from 'decimal.js'
-import _, { cloneDeep, throttle } from 'lodash'
-import * as turf from '@turf/turf'
-import { DRONE_LIST } from '@/const/device'
-import { cameraModeList, pointEventList } from '@/const/drc'
-import { getCameraInfoApi } from '@/api/payload'
-import takeoffImg from '@/assets/images/routePlan/pointAirLine/takeoff.svg'
-import { cartesian3Convert } from '@/utils/cesium/mapUtil'
-import { analyzeKmzFile, removeTextKey, XMLToJSON } from '@/utils/cesium/kmz'
-import { camelToSnake } from '@/utils/util'
-
-let createFrustum = null
-let editPoint = null
-let startPointEntity = null
-
-// 获取两点的角度
-export function getAngle (start, end) {
-	let point1 = turf.point([start.longitude, start.latitude])
-	let point2 = turf.point([end.longitude, end.latitude])
-	let attitude_head = turf.bearing(point2, point1)
-	let flyRotateYaw = attitude_head >= 0 ? attitude_head - 180 : 180 + attitude_head
-	return _.round(flyRotateYaw, 2)
-}
-
-// 创建或更新椎体
-export const setFrustum = (params, viewer) => {
-	function hasValue (variable) {
-		return variable !== null && variable !== undefined && variable.toString().trim() !== ''
-	}
-
-	function transformValue (value, type = 1) {
-		let curValue = Number(value)
-		if (type === 1) {
-			let diffValue = curValue === 2 ? 200 : curValue === 200 ? 2 : new Decimal(Number(200)).minus(Number(curValue))
-			return new Decimal(Number(diffValue)).dividedBy(Number(10))
-		}
-		return new Decimal(Number(value)).dividedBy(Number(2)).dividedBy(Number(100))
-	}
-
-	const { longitude, latitude, height, fov = 19.5, heading = 0, pitch = 0 } = params
-	if (hasValue(longitude) && hasValue(latitude) && hasValue(height) && hasValue(fov) && hasValue(heading) && hasValue(pitch)) {
-		createFrustum?.clear()
-		createFrustum = new CreateFrustum(viewer, {
-			position: { longitude, latitude, altitude: height },
-			width: 400,
-			height: 300,
-			near: 0.01,
-			far: 200,
-			fov: transformValue(fov || 19.5),
-			roll: 0,
-			pitch: pitch - 90,
-			heading: heading - 90,
-		})
-	}
-}
-
-// 删除椎体
-export const removeFrustum = () => {
-	createFrustum?.clear()
-	createFrustum = null
-}
-
-// 设置箭头
-export function setArrowPoint (roamPoint, viewer) {
-	if (!(roamPoint.longitude && roamPoint.latitude && roamPoint.height)) return
-	const position = Cesium.Cartesian3.fromDegrees(roamPoint.longitude, roamPoint.latitude, roamPoint.height)
-	const heading = roamPoint.arrowHeading || 0
-	const convertHeading = heading >= 0 ? heading - 180 : heading + 180
-	if (editPoint) {
-		editPoint.position = position
-		editPoint.orientation = Cesium.Transforms.headingPitchRollQuaternion(
-			position,
-			new Cesium.HeadingPitchRoll(
-				Cesium.Math.toRadians(-90 + convertHeading), // 头朝向 (Heading) +90°
-				0, // 俯仰角 (Pitch)
-				0 // 横滚角 (Roll)
-			)
-		)
-		return
-	}
-
-	editPoint = viewer.entities.add({
-		id: 'edit-point',
-		position,
-		model: {
-			uri: arrow,
-			scale: 0.00001, // 放大模型
-			minimumPixelSize: 50, // 让模型在屏幕上最小显示 40px
-			color: Cesium.Color.CORNFLOWERBLUE,
-			colorBlendMode: Cesium.ColorBlendMode.MIX,
-			colorBlendAmount: 0.5,
-		},
-		orientation: Cesium.Transforms.headingPitchRollQuaternion(
-			position,
-			new Cesium.HeadingPitchRoll(
-				Cesium.Math.toRadians(-90 + convertHeading), // 头朝向 (Heading) +90°
-				0, // 俯仰角 (Pitch)
-				0 // 横滚角 (Roll)
-			)
-		),
-	})
-}
-
-// 删除箭头
-export function removeArrowPoint (viewer) {
-	if (editPoint) {
-		viewer.entities.remove(editPoint)
-		editPoint = null
-	}
-}
-
-// 获取当前机型支持的摄像头
-export async function getCameraInfoList (drone_info) {
-	const res = await getCameraInfoApi(drone_info, 2)
-	let list = []
-	let zoomRang = { zoomMax: 56, zoomMin: 2 }
-	res.data?.data?.forEach(item => {
-		if (item.camera_mode === 2) {
-			zoomRang.zoomMax = _.round(item.zoom_factor_max)
-			zoomRang.zoomMin = _.round(item.zoom_factor_min)
-		}
-		if (item.is_storage === 1) {
-			const find = cameraModeList.find(item1 => item1.camera_mode === item.camera_mode)
-			find && list.push({ ...find, ...item })
-		}
-	})
-	return { list, zoomRang }
-}
-
-/**
- * 判断action里面是否有key
- * @param action
- * @param key
- * @returns {{hasKey: boolean, val: *}|{hasKey: boolean, val: null}}
- */
-export function actionHasKey (action, key) {
-	const curActionParams = action?.action_actuator_func_param
-	const val = curActionParams?.[key]
-	if (val !== undefined) {
-		return { hasKey: true, val }
-	} else {
-		return { hasKey: false, val: null }
-	}
-}
-
-// 获取寻找的事件
-export function getFindAction(action) {
-	let find = pointEventList.find(item => item.key === action?.action_actuator_func)
-	if (find?.key === 'searchlight') {
-		const { val: typeVal } = actionHasKey(action, 'searchlight_operate_type')
-		const list = ['关闭探照灯', '照明', '爆闪']
-		find = find.children.find(item => item.label === list?.[typeVal])
-	}
-	if (find?.key === 'megaphone') {
-		const { val: typeVal } = actionHasKey(action, 'megaphone_operate_type')
-		const list = ['开始喊话', '结束喊话']
-		find = _.cloneDeep(find.children.find(item => item.label === list?.[typeVal]))
-		if (list?.[typeVal] === '开始喊话' && !action?.action_actuator_func_param?.megaphone_file_md5 && find) {
-			find.label = '未选择喊话文件'
-		}
-	}
-	return find
-}
-
-
-// 处理保存参数
-export function handleSaveParams ({ pointList, startPoint, globalSettings }) {
-	const isWGS84 = globalSettings.execute_height_mode === 'WGS84'
-	let speak_file_ids = []
-	const { longitude, latitude, height: startPointHeight } = startPoint
-	let point_params = _.cloneDeep(pointList)
-	point_params.shift()
-	point_params = point_params.map(item => {
-		if (!item?.action_modes?.length) item.action_modes = undefined
-		item?.action_modes?.forEach(item1 => {
-			// 如果是gimbalPitchRotate,需要修改为gimbalRotate
-			if (item1.action_actuator_func === 'gimbalPitchRotate') {
-				item1.action_actuator_func = 'gimbalRotate'
-			}
-			// 如果有喊话,需要收集它的id
-			if (item1.action_actuator_func === 'megaphone') {
-				if (item1.action_actuator_func_param.megaphone_operate_type === 0) {
-					speak_file_ids.push(item1.action_actuator_func_param.speak_file_id)
-				}
-			}
-			// 如果有变焦,需要 *24
-			const { hasKey: has_focal_length, val: focal_length } = actionHasKey(item1, 'focal_length')
-			if (has_focal_length && focal_length) {
-				item1.action_actuator_func_param.focal_length = focal_length * 24
-			}
-		})
-		return {
-			...item,
-			insert_waypoint: 0,
-			click_tiles: 0,
-			execute_height: isWGS84 ? item.height : item.height - startPointHeight,
-		}
-	})
-	const payload_info = DRONE_LIST.flatMap(item => item.payloads).find(
-		item => item.value === globalSettings.drone_info
-	)?.payload_info
-
-	const params = _.pick(globalSettings, [
-		'execute_height_mode',
-		'id',
-		'wayline_name',
-		'drone_info',
-		'payload_info',
-		'take_off_security_height',
-		'take_off_ref_point',
-		'auto_flight_speed',
-		'wayline_type',
-		'image_format',
-	])
-	return {
-		...params,
-		point_params,
-		payload_info,
-		speak_file_ids,
-		global_height: isWGS84 ? globalSettings.absoluteHeight : globalSettings.relativeHeight,
-		take_off_ref_point: `${latitude},${longitude},${startPointHeight}`,
-		is_save: '1', //是否存航线库 0会立即飞
-		rth_altitude: 120, //返航高度
-		fly_to_wayline_mode: 'safely',
-	}
-}
-
-// 解析kmz文件的时候处理pointList 写在这里
-export function handlePointListForKmz ({ placemark, startPoint, execute_height_mode, auto_flight_speed }) {
-	if (!placemark?.length) return []
-	const isWGS84 = execute_height_mode === 'WGS84'
-	const list = placemark.map(item => {
-		const [longitude, latitude] = item.point.coordinates.trim().split(',').map(i => _.round(i, 6))
-		const [latitude1, longitude1] = (item?.waypoint_heading_param?.waypoint_poi_point?.trim()?.split(',') || [])
-			.map(i => _.round(i, 6))
-		let action_modes = item?.action_group?.action || []
-		action_modes = Array.isArray(action_modes) ? action_modes : [action_modes]
-		const height = isWGS84 ? item.execute_height : item.execute_height + startPoint.height
-		return {
-			longitude,
-			latitude,
-			height: _.round(height,2),
-			waypoint_speed: item.waypoint_speed,
-			waypoint_poi_point: longitude1 ? { longitude: longitude1, latitude: latitude1 } : undefined,//兴趣点
-			action_modes,
-		}
-	})
-	const pointStart = {
-		...startPoint,
-		flyRotateYaw: 0,
-		pointType: 'start',
-		waypoint_speed: auto_flight_speed,
-		heading: 0, // 椎体 heading
-		arrowHeading: 0, // 飞行器 heading
-		pitch: 0, //椎体俯仰角
-		fov: 19.5, // 这个是椎体的展示截面大小
-	}
-	list.forEach(item => {
-		item?.action_modes?.forEach(item1 => {
-			let { hasKey: has_focal_length, val: focal_length } = actionHasKey(item1, 'focal_length')
-			// 处理focalLength需要/24  focalLength可能是‘1,024’
-			if (has_focal_length && focal_length) {
-				focal_length = typeof focal_length === 'string' ? focal_length.replace(/,/g, '') : focal_length
-				item1.action_actuator_func_param.focal_length = Number(focal_length) / 24
-			}
-		})
-		item.arrowHeading = 0
-	})
-	return [pointStart, ...list]
-}
-
-
-export async function analysisPointLineKmz (kmzUrl) {
-	const res = await analyzeKmzFile(`${kmzUrl}?_t=${new Date().getTime()}`)
-	const templateXML = await res.fileInfoObj['wpmz/template.kml']
-	const waylinesXML = await res.fileInfoObj['wpmz/waylines.wpml']
-	const templateXMLJSON = XMLToJSON(templateXML)?.['Document']
-	const waylinesXMLJSON = XMLToJSON(waylinesXML)?.['Document']
-	const templateXMLObj = camelToSnake(removeTextKey(templateXMLJSON))
-	const waylinesXMLObj = camelToSnake(removeTextKey(waylinesXMLJSON))
-
-	const {
-		mission_config: {
-			take_off_ref_point,
-			drone_info: { drone_enum_value, drone_sub_enum_value } = {}
-		} = {},
-		folder: {
-			payload_param: { image_format } = {},
-			placemark: {
-				polygon,
-				margin: buffer_distance_meters = 0
-			},
-			global_height, auto_flight_speed,
-			template_type: templateType
-		} = {},
-	} = templateXMLObj
-	const [latitude, longitude, height] = take_off_ref_point.split(',').map(item => _.round(item, 6))
-	let startPoint = { latitude, longitude, height: Number.isNaN(height) ? 0 : height }
-
-	const {
-		mission_config: { take_off_security_height } = {},
-		folder: polygonPointFolder
-	} = waylinesXMLObj
-
-	let execute_height_mode = '', pointPlacemark
-
-	if (templateType === "mapping3d") {
-		execute_height_mode = polygonPointFolder[0].execute_height_mode
-		pointPlacemark = polygonPointFolder.map(i => i.placemark)
-	} else {
-		execute_height_mode = polygonPointFolder.execute_height_mode
-		pointPlacemark = polygonPointFolder.placemark
-	}
-	// 取出点位
-	const coordinates = polygon?.outer_boundary_is.linear_ring
-		.coordinates?.split('\n') || []
-	// 数组转换
-	let polygonList = coordinates.map((coordinate) =>
-		coordinate
-			.replace(/\s+/g, '')
-			.split(',')
-			.map((v) => Number(v)),
-	)
-	polygonList.pop()
-	const templatePlacemark = templateXMLObj.folder.placemark
-	// 点航线list
-	let pointList = handlePointListForKmz({
-		placemark: polygonPointFolder.placemark,
-		startPoint,
-		execute_height_mode,
-		auto_flight_speed
-	}).map((i,index)=> {
-		// 注入是否使用全局高度参数
-		return {
-			...i,
-			use_global_height: index > 0 ? templatePlacemark[index-1]?.use_global_height : 0
-		}
-	})
-
-	return {
-		image_format,
-		startPoint,
-		global_height,
-		auto_flight_speed,
-		take_off_ref_point,
-		drone_enum_value,
-		drone_sub_enum_value,
-		take_off_security_height,//起飞安全高度
-		execute_height_mode,//执行高度模式
-		pointList,//航点航线 点list
-		templateType,
-		pointPlacemark,
-		polygonList,
-		buffer_distance_meters
-	}
-}
-
-// 生成起飞点
-export function generateStartPoint (movement, viewer) {
-	// 1. 获取笛卡尔坐标
-	const cartesian = viewer.scene.pickPosition(movement.endPosition)
-	if (!cartesian) return
-	// 2. 笛卡尔转为弧度
-	const cartographic = Cesium.Cartographic.fromCartesian(cartesian)
-	const position = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude)
-	// 4. 更新或创建点实体
-	if (startPointEntity) {
-		startPointEntity.position = position
-		return
-	}
-	startPointEntity = viewer.entities.add({
-		position,
-		id: 'wayline-point-start-init',
-		billboard: {
-			image: takeoffImg,
-			outlineWidth: 0,
-			width: 36,
-			height: 36,
-			scale: 1.0,
-			heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
-		},
-	})
-}
-// 获取起飞点位置
-export function getStartPointLast (viewer) {
-	const point = cartesian3Convert(startPointEntity.position.getValue(), viewer) //经纬度
-	removeStartPoint(viewer)
-	return point
-}
-export function removeStartPoint (viewer) {
-	startPointEntity && viewer.entities.remove(startPointEntity)
-	startPointEntity = null
-}
-
-// todo 获取新的云台偏航角(后续做更细致得控制)
-export function getNewGimbalRollRotateAngle (list, index) {
-	const flyRotateYaw = list[index].flyRotateYaw
-	const actions = list[index].action_modes
-	// 当前点击的点有云台偏航角
-	const hasGimbalRollRotate = actions?.some(item => item?.action_actuator_func_param?.gimbal_yaw_rotate_enable === 1)
-	let value = 0
-	list.slice(0, index + 1).forEach(item => {
-		item?.action_modes?.forEach(item1 => {
-			const param = item1?.action_actuator_func_param
-			const find = param?.gimbal_yaw_rotate_enable === 1
-			if (find) {
-				value = param?.gimbal_yaw_rotate_angle
-			}
-		})
-	})
-	return hasGimbalRollRotate ? value : value + flyRotateYaw
-}
-
-// 之前的俯仰角 value
-export function getBeforeGimbalPitchRotateAngle (list, index) {
-	let value = 0
-	list.slice(0, index + 1).forEach(item => {
-		item?.action_modes?.forEach(item1 => {
-			const param = item1?.action_actuator_func_param
-			const find = param?.gimbal_pitch_rotate_enable === 1
-			if (find) {
-				value = param?.gimbal_pitch_rotate_angle
-			}
-		})
-	})
-	return value
-}
-
-
-// 之前的变焦 value
-export function getBeforeZoomValue (list, index) {
-	let value = 5
-	list.slice(0, index + 1).forEach(item => {
-		item?.action_modes?.forEach(item1 => {
-			const find = item1?.action_actuator_func === 'zoom'
-			if (find) {
-				value = item1?.action_actuator_func_param?.focal_length
-			}
-		})
-	})
-	return value
-}
-
-// 创建广告牌
-export function createBillboard (title, fillColor, isHighlighted = false) {
-	const billboard = document.createElement('canvas')
-	billboard.width = 48
-	billboard.height = 48
-	const ctx = billboard.getContext('2d')
-
-	// 如果选中,绘制阴影
-	if (isHighlighted) {
-		ctx.shadowColor = 'rgba(97, 211, 150, 0.9)' // 阴影颜色(#61d396半透明)
-		ctx.shadowBlur = 12 // 阴影模糊程度
-		ctx.shadowOffsetX = 0 // 阴影水平偏移
-		ctx.shadowOffsetY = 0 // 阴影垂直偏移
-	}
-
-	// 绘制填充区域(三角形)
-	ctx.beginPath()
-	ctx.moveTo(6, 6)
-	ctx.lineTo(42, 6)
-	ctx.lineTo(24, 36)
-	ctx.closePath()
-	ctx.fillStyle = fillColor // 填充颜色
-	ctx.fill()
-
-	// 如果选中,绘制边框
-	if (isHighlighted) {
-		ctx.strokeStyle = 'white' // 边框颜色(#61d396)
-		ctx.lineWidth = 2 // 边框宽度
-		ctx.stroke()
-	}
-
-	// 绘制文字
-	ctx.font = '14px serif'
-	ctx.fillStyle = '#ffffff'
-	ctx.fillText(title, 20, 20)
-
-	return billboard.toDataURL() // 返回图片的DataURL
-}
-
-// 检查位置是否在合理范围内
-export function isValidPosition (cartographic) {
-	// 检查经纬度是否在合理范围内
-	return (
-		cartographic.longitude >= -Math.PI &&
-		cartographic.longitude <= Math.PI &&
-		cartographic.latitude >= -Math.PI / 2 &&
-		cartographic.latitude <= Math.PI / 2
-	)
-}
-
-// 计算射线与固定高度平面的交点
-export function findIntersectionWithHeight (viewer, ray, height, lastGoodPosition) {
-	const globe = viewer.scene.globe
-
-	// 创建一个函数来检查某点是否在目标高度
-	const checkHeight = position => {
-		const cartographic = Cesium.Cartographic.fromCartesian(position)
-		return cartographic.height - height
-	}
-
-	// 如果有上一个有效位置,使用它来优化搜索范围
-	let start = 0
-	let end = 20000000 // 增加搜索范围
-
-	if (lastGoodPosition) {
-		// 计算射线原点到上一个位置的距离作为参考
-		const distance = Cesium.Cartesian3.distance(ray.origin, lastGoodPosition)
-		start = Math.max(0, distance * 0.5)
-		end = distance * 1.5
-	}
-
-	let iterations = 0
-	const maxIterations = 100 // 增加最大迭代次数
-
-	let startPoint = Cesium.Cartesian3.fromElements(
-		ray.origin.x + ray.direction.x * start,
-		ray.origin.y + ray.direction.y * start,
-		ray.origin.z + ray.direction.z * start
-	)
-
-	let endPoint = Cesium.Cartesian3.fromElements(
-		ray.origin.x + ray.direction.x * end,
-		ray.origin.y + ray.direction.y * end,
-		ray.origin.z + ray.direction.z * end
-	)
-
-	let startHeight = checkHeight(startPoint)
-	let endHeight = checkHeight(endPoint)
-
-	// 如果起点和终点高度差异方向不对,调整搜索范围
-	if (startHeight * endHeight > 0) {
-		if (Math.abs(startHeight) < Math.abs(endHeight)) {
-			end = start + (end - start) * 0.1
-		} else {
-			start = end - (end - start) * 0.1
-		}
-		startPoint = Cesium.Cartesian3.fromElements(
-			ray.origin.x + ray.direction.x * start,
-			ray.origin.y + ray.direction.y * start,
-			ray.origin.z + ray.direction.z * start
-		)
-		endPoint = Cesium.Cartesian3.fromElements(
-			ray.origin.x + ray.direction.x * end,
-			ray.origin.y + ray.direction.y * end,
-			ray.origin.z + ray.direction.z * end
-		)
-		startHeight = checkHeight(startPoint)
-		endHeight = checkHeight(endPoint)
-	}
-
-	while (iterations < maxIterations) {
-		const mid = (start + end) / 2
-		const midPoint = Cesium.Cartesian3.fromElements(
-			ray.origin.x + ray.direction.x * mid,
-			ray.origin.y + ray.direction.y * mid,
-			ray.origin.z + ray.direction.z * mid
-		)
-
-		const midHeight = checkHeight(midPoint)
-
-		if (Math.abs(midHeight) < 1.0) {
-			// 增加容差
-			return midPoint
-		}
-
-		if (midHeight * startHeight < 0) {
-			end = mid
-			endPoint = midPoint
-			endHeight = midHeight
-		} else {
-			start = mid
-			startPoint = midPoint
-			startHeight = midHeight
-		}
-
-		iterations++
-	}
-
-	// 如果二分法失败,返回最接近目标高度的点
-	if (Math.abs(startHeight) < Math.abs(endHeight)) {
-		return startPoint
-	} else {
-		return endPoint
-	}
-}
-
-// 获取连接地面线
-export function getPolyLine (viewer, pointList, index) {
-	return {
-		positions: new Cesium.CallbackProperty(() => {
-			const point = pointList.value[index]
-			const pointPosition = Cesium.Cartesian3.fromDegrees(point.longitude, point.latitude, point.height)
-			if (!pointPosition) return []
-			// 获取点的位置
-			const cartographic = Cesium.Cartographic.fromCartesian(pointPosition)
-			// 获取地形高度
-			const terrainHeight = viewer.scene.globe.getHeight(cartographic) || 0
-			// 创建地面点位置
-			const groundPosition = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, terrainHeight)
-
-			return [pointPosition, groundPosition]
-		}, false),
-		width: 0.5,
-		material: Cesium.Color.WHITE,
-	}
-}
diff --git a/applications/task-work-order/src/views/algorithmMange/algorithmMange.vue b/applications/task-work-order/src/views/algorithmMange/algorithmMange.vue
deleted file mode 100644
index 0d94a94..0000000
--- a/applications/task-work-order/src/views/algorithmMange/algorithmMange.vue
+++ /dev/null
@@ -1,322 +0,0 @@
-<template>
-  <div class="algorithmMange">
-    <div class="ztzf-form-search">
-      <el-form :model="params" inline>
-        <el-row :gutter="24">
-          <el-col :span="4">
-          <el-form-item label="算法名称:">
-            <el-input v-model="params.algName" placeholder="请输入算法名称" clearable />
-          </el-form-item>
-          </el-col>
-          <el-col :span="4">
-          <el-form-item label="算法类型:">
-            <el-select class="ztzf-select" :teleported="false" v-model="params.algTypeCode" placeholder="请选择算法类型" clearable>
-              <el-option v-for="item in sfTypes" :key="item.id" :label="item.dictValue" :value="item.dictKey" ></el-option>
-            </el-select>
-          </el-form-item>
-          </el-col>
-          <el-col :span="4">
-            <el-button type="primary" @click="getList" :icon="Search">搜索</el-button>
-            <el-button @click="cancelSearch" :icon="Refresh">重置</el-button>
-          </el-col>
-        </el-row>
-      </el-form>
-    </div>
-    <div class="mange-table">
-			<el-table border :data="tableList" class="ztzf-table-mange">
-				<el-table-column label="序号" type="index" width="60"></el-table-column>
-        <el-table-column prop="alg_name" label="算法名称" align="center" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="alg_type" label="算法类型" align="center"></el-table-column>
-				<el-table-column prop="qua_rate" label="最低准确率" align="center">
-          <template #header>
-            <el-tooltip placement="top" effect="dark" content="AI识别率高于最低准确率时会生成待审核状态的事件">
-              <el-icon><QuestionFilled /></el-icon>
-            </el-tooltip>
-            <span>最低准确率</span>
-          </template>
-        </el-table-column>
-				<el-table-column prop="pass_rate" label="最高准确率" align="center">
-          <template #header>
-            <el-tooltip placement="top" effect="dark" content="AI识别率高于最高准确率时会生成待处理状态的事件">
-              <el-icon><QuestionFilled /></el-icon>
-            </el-tooltip>
-            <span>最高准确率</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="event_type" label="事件生成类型" show-overflow-tooltip align="center">
-          <template #default="scope">
-            {{ scope.row.event_type == 0 ? '常规类' : '紧急类' }}
-          </template>
-        </el-table-column>
-        <el-table-column prop="version" label="算法版本" align="center"/>
-				<el-table-column prop="remark" label="算法描述" show-overflow-tooltip />
-				<el-table-column label="操作" width="180" align="center">
-					<template #default="scope">
-            <el-button icon="el-icon-view" type="text" @click="handleDetail(scope.row)">查看</el-button>
-						<el-button icon="el-icon-edit" type="text" @click="handleEdit(scope.row)">编辑</el-button>
-					</template>
-				</el-table-column>
-        <template #empty>
-          <el-empty
-            class="custom-empty"
-            :image-size="100"
-          >
-            <template #description>
-              <span class="custom-text">暂无数据</span>
-            </template>
-          </el-empty>
-        </template>
-			</el-table>
-		</div>
-		<div class="pagination" v-if="tableList.length > 0">
-			<el-pagination class="ztzf-pagination" popper-class="custom-pagination-dropdown" background
-				:page-sizes="[10, 20, 30, 40, 50, 100]" :size="params.size" v-model:current-page="params.current"
-				v-model:page-size="params.size" layout="total, sizes, prev, pager, next, jumper" :total="total"
-				@size-change="handleSizeChange" @current-change="handleCurrentChange" />
-		</div>
-  </div>
-  <commonDialog :isShowView="isShowViewTest" width="1000" title="查看" addEditView="view" @cancel="isShowViewTest = false">
-    <template #default>
-      <el-row :gutter="0" class="table-view-mange">
-        <el-col :span="6" class="label">算法名称</el-col>
-        <el-col :span="6">{{ rowView.model_name }}</el-col>
-        <el-col :span="6" class="label">算法类型</el-col>
-        <el-col :span="6">{{ rowView.alg_type }}</el-col>
-      </el-row>
-      <el-row :gutter="0" class="table-view-mange">
-        <el-col :span="6" class="label">最低准确率</el-col>
-        <el-col :span="6">{{ rowView.qua_rate }}</el-col>
-        <el-col :span="6" class="label">最高准确率</el-col>
-        <el-col :span="6">{{ rowView.pass_rate }}</el-col>
-      </el-row>
-      <el-row :gutter="0" class="table-view-mange">
-        <el-col :span="6" class="label">事件生成类型</el-col>
-        <el-col :span="6">{{ rowView.event_type == 0 ? '常规类' : '紧急类' }}</el-col>
-        <el-col :span="6" class="label">算法版本</el-col>
-        <el-col :span="6">{{ rowView.version }}</el-col>
-      </el-row>
-      <el-row :gutter="0" class="table-view-mange">
-        <el-col :span="6" class="label">算法描述</el-col>
-        <el-col :span="18">
-          <el-input v-model="rowView.remark"></el-input>
-        </el-col>
-      </el-row>
-    </template>
-  </commonDialog>
-  <commonDialog :isShowView="isShowEditView" title="编辑"  addEditView="edit"  @submit="submit(ruleFormRef)" @cancel="isShowEditView = false">
-    <template #default>
-      <el-form class="ztzf-form-mange" ref="ruleFormRef" :model="editParams" :rules="rules" inline>
-        <el-form-item label="算法名称">
-          <el-input v-model="editParams.model_name" disabled />
-        </el-form-item>
-        <el-form-item label="算法类型">
-          <el-select class="ztzf-select" :teleported="false" v-model="editParams.alg_type" disabled>
-            <el-option v-for="item in sfTypes" :key="item.id" :label="item.dictValue" :value="item.dictKey" ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="最低准确率" prop="qua_rate">
-          <el-input v-model="editParams.qua_rate" placeholder="请输入最低准确率" required clearable />
-        </el-form-item>
-        <el-form-item label="最高准确率" prop="pass_rate">
-          <el-input v-model="editParams.pass_rate" placeholder="请输入最高准确率" clearable />
-        </el-form-item>
-        <el-form-item label="事件生成类型" prop="event_type">
-          <el-select class="ztzf-select" v-model="editParams.event_type" placeholder="请选择" clearable>
-            <el-option label="常规类" value="0"></el-option>
-            <el-option label="紧急类" value="1"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="算法描述">
-          <el-input v-model="editParams.remark" placeholder="请输入算法描述" clearable />
-        </el-form-item>
-      </el-form>
-    </template>
-  </commonDialog>
-</template>
-<script setup>
-import { getAlgorithmManageList, algorithmManageEdit } from '@/api/algorithmMange/algorithmMange';
-import { getDictionaryByCode } from '@/api/system/dictbiz';
-import commonDialog from '@/components/commonDialog.vue'
-import { ElMessage } from 'element-plus';
-import { Delete, Search,Refresh } from '@element-plus/icons-vue'
-
-const total = ref(0)
-const params = ref({
-  current: 1,
-  size: 10,
-  algName: '',
-  algTypeCode: '',
-});
-
-let tableList = ref([])
-
-let isShowViewTest = ref(false)
-
-let rowView = ref({})
-
-let isShowEditView = ref(false)
-
-let sfTypes = ref([])
-const ruleFormRef = ref()
-let editParams = ref({
-  model_name: '',
-  alg_type: '',
-  qua_rate: '',
-  pass_rate: '',
-  event_type: '',
-  remark: ''
-})
-const rules = reactive({
-  qua_rate: [
-    { required: true, message: '请输入最低准确率', trigger: 'blur' },
-    {
-      validator: (rule, value, callback) => {
-        if (!/^\d+(\.\d+)?$/.test(value)) {
-          callback(new Error('请输入有效的数字(整数或小数)'));
-        } else if (parseFloat(value) < 0.1) {
-          callback(new Error('最低准确率不能小于0.1'));
-        } else if (parseFloat(value) >= parseFloat(editParams.value.pass_rate)) {
-          callback(new Error('最低准确率必须小于最高准确率'));
-        } else {
-          callback();
-        }
-      },
-      trigger: 'blur'
-    }
-  ],
-  pass_rate: [
-    { required: true, message: '请输入最低准确率', trigger: 'blur' },
-    {
-      validator: (rule, value, callback) => {
-        if (!/^\d+(\.\d+)?$/.test(value)) {
-          callback(new Error('请输入有效的数字(整数或小数)'));
-        } else if (parseFloat(value) > 1) {
-          callback(new Error('最高准确率不能大于1'));
-        } else {
-          callback();
-        }
-      },
-      trigger: 'blur'
-    }
-  ],
-  event_type: [
-    {
-      required: true,
-      message: '请选择事件生成类型',
-      trigger: 'change',
-    },
-  ],
-})
-
-function cancelSearch() {
-  params.value = {
-    algName: '',
-    algTypeCode: '',
-  }
-  params.value.current = 1
-  getList()
-}
-
-function getList() {
-  getAlgorithmManageList(params.value).then(res => {
-    tableList.value = res.data.data.records || []
-    total.value = res.data.data.total || 0
-  })
-}
-function getSFType() {
-  getDictionaryByCode('WORK_ORDER_TYPE').then(res => {
-    sfTypes.value = res.data.data.WORK_ORDER_TYPE || []
-  });
-}
-function handleDetail(row) {
-  isShowViewTest.value = true
-  rowView.value = row
-}
-function handleEdit(row) {
-  isShowEditView.value = true
-  editParams.value = { ...row }
-}
-
-function handleSizeChange(val) {
-  params.value.size = val
-  getList()
-}
-
-function handleCurrentChange(val) {
-  params.value.current = val
-  getList()
-}
-
-async function submit(formValidate) {
-  if (!formValidate) return
-  await formValidate.validate((valid, fields) => {
-    if (valid) {
-      algorithmManageEdit(editParams.value).then(res => {
-        ElMessage.success('保存成功')
-        isShowEditView.value = false
-        getList()
-      })
-    } 
-  })
-}
-
-onMounted(() => {
-  getList()
-  getSFType()
-})
-</script>
-
-<style lang="scss" scoped>
-  .algorithmMange {
-    height: 0;
-    flex: 1;
-    margin: 0 10px 10px 10px;
-    background-color: #ffffff;
-    padding: 10px 20px;
-    border-radius: 5px;
-    display: flex;
-    flex-direction: column;
-    .search-box {
-      height: 40px;
-      .btns {
-        display: flex;
-        justify-content: end;
-      }
-    }
-
-    :deep(.el-input) {
-      .el-input__wrapper {
-        width: 200px;
-      }
-    }
-
-    // 表格
-    .mange-table {
-      height: 0;
-      flex: 1;
-      //margin-top: 18px;
-      overflow: auto;
-      :deep(.el-scrollbar__view) {
-        height: 100%;
-      }
-      :deep(.el-table--fit,.el-scrollbar__view) {
-        height: 100%;
-      }
-    }
-    :deep(.el-pagination) {
-      display: flex;
-      justify-content: right;
-      padding: 20px 0;
-    }
-
-    :deep(.el-pagination button) {
-      background: center center no-repeat none !important;
-      color: #8eb8ea !important;
-    }
-    :deep(.ztzf-select){
-      .el-select__selection {
-        width: 200px;
-      }
-    }
-  }
-</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/algorithmRepository/algorithmRepository.vue b/applications/task-work-order/src/views/algorithmRepository/algorithmRepository.vue
deleted file mode 100644
index 05e7085..0000000
--- a/applications/task-work-order/src/views/algorithmRepository/algorithmRepository.vue
+++ /dev/null
@@ -1,381 +0,0 @@
-<template>
-  <basic-container>
-    <div class="algorithContainer">
-      <div class="algorithItem" v-if="!showDetail">
-        <div class="item" v-for="(item, index) in AlgorithmData" :key="index"
-          :class="{ 'active-bg': activeItem === item.dictValue }" @click="jumpDatail(item)">
-          <img class="imgicon" :src="`${baseUrl}/manage-sf-icon-source/${item.dictKey}.png`" alt="" />
-          <div class="item-title">{{ item.dictValue }}</div>
-          <div :class="!statusSign && item.dictValue === nameSign ? 'stopStatus' : 'normalStatus'"
-            @click.stop="changeStatus(item)">
-            {{ !statusSign && item.dictValue === nameSign ? '停用状态' : '正常状态' }}
-          </div>
-        </div>
-      </div>
-      <!-- 详情页 -->
-      <div class="algorithItemDetail" v-else>
-        <div class="search">
-          <div class="searchBox">
-            <div class="item">
-              <div class="itemchild">模糊查询:</div>
-              <el-input v-model="params.name" class="filter-item" placeholder="请输入事件名称" clearable></el-input>
-            </div>
-            <div class="item">
-              <el-date-picker type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
-                value-format="YYYY-MM-DD" v-model="taskData" placeholder="请选择日期" @change="changeselect" clearable />
-              <!-- @clear="handleDateClear" -->
-            </div>
-            <div class="item">
-              <div class="itemchild">机巢查询:</div>
-              <el-select v-model="params.device_name" placeholder="请选择" class="filter-item" @change="handleSearch"  clearable>
-                <el-option v-for="item in jcoptions" :key="item" :label="item" :value="item" />
-              </el-select>
-            </div>
-          </div>
-          <div class="search-btn">
-            <el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button>
-            <el-button icon="el-icon-refresh" @click="handleReset">重置</el-button>
-            <el-button type="primary" icon="el-icon-back" @click="goback">返回</el-button>
-          </div>
-        </div>
-
-        <div v-if="detailData.length > 0" class="pictureBox">
-          <div class="pictureitem" v-loading="loading" element-loading-text="加载中">
-            <div class="imgitem" v-for="(item, index) in detailData" :key="index">
-              <el-image ref="imageRef" :src="getSmallImg(item.url)" show-progress
-                :preview-src-list="[getShowImg(item.url)]" fit="cover" />
-
-              <div class="info">
-                <div class="name">{{ item.name }}</div>
-                <div class="time">{{ item.create_time.slice(5, 16).replace('-', '/', 1) }}</div>
-              </div>
-            </div>
-          </div>
-        </div>
-        <el-empty class="custom-empty" v-else>
-          <template #description>
-            <span class="custom-text">暂无数据</span>
-          </template>
-        </el-empty>
-        <!-- 分页 -->
-        <el-pagination class="pageStyle" background :page-sizes="[15, 20, 30, 50]" v-model:current-page="params.current"
-          v-model:page-size="params.size" layout="total, prev, pager, next,sizes, jumper" :total="total"
-          @size-change="handleSizeChange" @current-change="handleCurrentChange" />
-      </div>
-    </div>
-  </basic-container>
-</template>
-
-<script setup>
-import { useStore } from 'vuex'
-import { getDictionaryByCode } from '@/api/system/dictbiz'
-import { getalgorithmList, selectDeviceList } from '@/api/algorithm'
-import { getSmallImg, getShowImg } from '@/utils/util'
-import { useRouter } from 'vue-router'
-const store = useStore()
-const router = useRouter()
-const baseUrl = import.meta.env.VITE_APP_PICTURE_URL
-const showDetail = ref(false)
-const taskData = ref('')
-const jcvalue = ref('')
-const jcoptions = ref([])
-const total = ref(0)
-const loading = ref(true)
-const userAreaCode = computed(() => store.getters.userInfo.detail.areaCode)
-const params = ref({
-  ai_type_key: '',
-  start_date: null,
-  end_date: null,
-  device_name: '',
-  name: '',
-  current: 1,
-  size: 15,
-})
-
-// 请求字典字段
-let AlgorithmData = ref([])
-const detailData = ref([])
-const requestDictionary = () => {
-  getDictionaryByCode('SF').then(res => {
-    if (res.code !== 0) {
-      // 处理数据
-      AlgorithmData.value = res.data.data['SF']
-    }
-    console.log('算法',AlgorithmData.value);
-    
-  })
-}
-const activeItem = ref(null)
-const jumpDatail = val => {
-  showDetail.value = true
-  activeItem.value = val.dictValue
-  params.value.ai_type_key = val.dictKey
-  getList()
-}
-const statusSign = ref(true)
-const nameSign = ref('')
-const changeStatus = val => {
-  nameSign.value = val.dictValue
-  statusSign.value = !statusSign.value
-}
-// 详情
-const getList = () => {
-  const detailParams = {
-    ai_type_key: params.value.ai_type_key,
-    start_date: params.value.start_date,
-    end_date: params.value.end_date,
-    device_name: params.value.device_name,
-    name: params.value.name,
-  }
-  getalgorithmList(detailParams, {
-    current: params.value.current,
-    size: params.value.size,
-  }).then(res => {
-    loading.value = true
-    detailData.value = res.data.data.records
-    total.value = res.data.data.total
-    setTimeout(() => {
-      loading.value = false
-    }, 1000)
-  })
-}
-// 机巢查询
-const getDeviceList = () => {
-  console.log('userAreaCode', userAreaCode.value)
-  // { areaCode: userAreaCode.value }
-  selectDeviceList().then(res => {
-    jcoptions.value = res.data.data
-
-
-  })
-}
-// 日期选择
-const changeselect = () => {
-  params.value.start_date = taskData.value?.length ? `${taskData.value[0]} 00:00:00` : null
-  params.value.end_date = taskData.value?.length ? `${taskData.value[1]} 23:59:59` : null
-  handleSearch()
-}
-// 处理日期清空
-const handleDateClear = () => {
-  taskData.value = '' // 清空绑定的日期数据
-  params.value.start_date = null // 重置开始日期参数
-  params.value.end_date = null // 重置结束日期参数
-  getList()
-}
-const handleSearch = () => {
-
-  if (taskData.value === null) {
-    params.value.start_date = null // 重置开始日期参数
-    params.value.end_date = null // 重置结束日期参数
-  }
-
-  getList()
-
-}
-const handleReset = () => {
-  taskData.value = ''
-  params.value.start_date = null
-  params.value.end_date = null
-  params.value.device_name = ''
-  params.value.name = ''
-  getList()
-
-}
-const goback = () => {
-  showDetail.value = false
-  activeItem.value = null
-  params.value.current = 1
-  params.value.size = 15
-  params.value.name = ''
-}
-// 分页大小改变
-const handleSizeChange = val => {
-  params.size = val
-  getList()
-}
-// 页码改变
-const handleCurrentChange = val => {
-  params.current = val
-  getList()
-}
-onMounted(() => {
-  requestDictionary()
-  getDeviceList()
-})
-</script>
-
-<style scoped lang="scss">
-.algorithContainer {
-  height: calc(100vh - 130px);
-}
-
-.algorithItem {
-  height: 100%;
-  overflow-y: auto;
-  overflow-x: hidden;
-  display: grid;
-  grid-template-columns: repeat(5, 1fr);
-  text-align: center;
-  vertical-align: middle;
-
-  .item {
-    height: 267px;
-    display: flex;
-    flex-direction: column;
-    justify-content: center;
-    align-items: center;
-    background: url('/src/assets/images/ht-sfbg.png') no-repeat center;
-    background-size: 100% 100%;
-
-    .item-title {
-      font-weight: bold;
-      font-size: 18px;
-      color: #656565;
-    }
-
-    .imgicon {
-      width: 100px;
-      height: 100px;
-      margin-bottom: 17px;
-    }
-
-    &:hover {
-      background: url('/src/assets/images/ht-sfbg-hover.png') no-repeat center;
-      background-size: 100% 100%;
-      cursor: pointer;
-    }
-
-    &.active-bg {
-      background: url('/src/assets/images/ht-sfbg-click.png') no-repeat center;
-      background-size: 100% 100%;
-    }
-
-    .normalStatus {
-      width: 116px;
-      height: 43px;
-      background: #ebfbee;
-      border-radius: 50px;
-      text-align: center;
-      line-height: 43px;
-      font-weight: 400;
-      font-size: 16px;
-      color: #029d36;
-      margin-top: 23px;
-      cursor: pointer;
-    }
-
-    .stopStatus {
-      width: 116px;
-      height: 43px;
-      background: #e8e8e8;
-      border-radius: 50px 50px 50px 50px;
-      text-align: center;
-      line-height: 43px;
-      font-weight: 400;
-      font-size: 16px;
-      color: #464747;
-      margin-top: 23px;
-      cursor: pointer;
-    }
-
-    .normalStatus:hover {
-      background: rgba(6, 217, 87, 0.2);
-    }
-  }
-}
-
-.algorithItemDetail {
-  padding: 20px;
-
-  .pictureBox {
-    // height: 625px;
-    height: pxToVh(760);
-    overflow: auto;
-  }
-
-  .pictureitem {
-
-    display: grid;
-    grid-template-columns: repeat(5, 1fr);
-    gap: 14px;
-
-    .imgitem {
-      border-radius: 12px 12px 0 0;
-      overflow: hidden;
-
-      .el-image {
-        width: 100%;
-        height: 170px;
-        display: block;
-        margin: 0;
-        padding: 0;
-      }
-
-      .info {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        height: 35px;
-        border-radius: 0 0 12px 12px;
-        overflow: hidden;
-        background: linear-gradient(180deg, #ffffff 0%, #e5edff 100%);
-        border: 1px solid #1c5cff;
-        border-top: none !important;
-
-        .name {
-          margin-left: 12px;
-          font-weight: 500;
-          font-size: 16px;
-          color: #363636;
-        }
-
-        .time {
-          margin-right: 12px;
-          font-weight: 500;
-          font-size: 14px;
-          color: #595959;
-        }
-      }
-    }
-  }
-
-  .search {
-    display: flex;
-    //justify-content: space-between;
-  }
-
-  .searchBox {
-    display: flex;
-    align-items: center;
-    margin-bottom: 27px;
-
-    .itemchild {
-      white-space: nowrap;
-      margin-right: 5px;
-      font-weight: 400;
-      font-size: 14px;
-      color: #363636;
-    }
-
-    .item {
-      display: flex;
-      align-items: center;
-      margin-right: 40px;
-    }
-  }
-
-  .search-btn {
-    display: flex;
-  }
-
-  .filter-item {
-    width: 218px;
-  }
-}
-
-.pageStyle {
-  margin-top: 32px;
-  display: flex;
-  justify-content: right;
-}
-</style>
diff --git a/applications/task-work-order/src/views/authority/apiscope.vue b/applications/task-work-order/src/views/authority/apiscope.vue
deleted file mode 100644
index 642f711..0000000
--- a/applications/task-work-order/src/views/authority/apiscope.vue
+++ /dev/null
@@ -1,645 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud :option="option" :table-loading="loading" :data="data" ref="crud" v-model="form"
-      :permission="permissionList" :before-open="beforeOpen" @row-del="rowDel" @row-update="rowUpdate"
-      @row-save="rowSave" @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
-      @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad"
-      @tree-load="treeLoad">
-      <template #menu="{ row }">
-        <el-button type="primary" text icon="el-icon-setting" v-if="permission.api_scope_setting" plain
-          style="border: 0; background-color: transparent !important" @click.stop="handleDataScope(row)">权限配置
-        </el-button>
-      </template>
-      <template #name="{ row }">
-        <i :class="row.source" class="namei" />
-        <span>{{ row.name }}</span>
-      </template>
-      <template #source="{ row }">
-        <div style="text-align: center">
-          <i :class="row.source" />
-        </div>
-      </template>
-    </avue-crud>
-    <el-drawer :title="`[${scopeMenuName}] 接口权限配置`" v-model="drawerVisible" :direction="direction" append-to-body
-      :before-close="handleDrawerClose" size="1000px">
-      <basic-container>
-        <avue-crud :option="optionScope" :data="dataScope" :page="pageScope" v-model="formScope"
-          :table-loading="scopeLoading" ref="crudScope" @row-del="rowDelScope" @row-update="rowUpdateScope"
-          @row-save="rowSaveScope" :before-open="beforeOpenScope" @search-change="searchChangeScope"
-          @search-reset="searchResetScope" @selection-change="selectionChangeScope" @current-change="currentChangeScope"
-          @size-change="sizeChangeScope" @on-load="onLoadScope">
-          <template #menu-left>
-            <el-button type="danger" icon="el-icon-delete" plain @click="handleDeleteScope">删 除
-            </el-button>
-          </template>
-          <template #scopeType="{ row }">
-            <el-tag>{{ row.scopeTypeName }}</el-tag>
-          </template>
-        </avue-crud>
-      </basic-container>
-    </el-drawer>
-  </basic-container>
-</template>
-
-<script>
-import { add, remove, update, getLazyMenuList, getMenu } from '@/api/system/menu'
-import {
-  addApiScope,
-  removeApiScope,
-  updateApiScope,
-  getListApiScope,
-  getMenuApiScope,
-} from '@/api/system/scope'
-import { mapGetters } from 'vuex'
-import iconList from '@/config/iconList'
-
-export default {
-  data () {
-    return {
-      form: {},
-      selectionList: [],
-      query: {},
-      loading: true,
-      parentId: 0,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      drawerVisible: false,
-      direction: 'rtl',
-      scopeLoading: false,
-      scopeMenuId: 0,
-      scopeMenuName: '菜单',
-      menu: true,
-      option: {
-        lazy: true,
-        tip: false,
-        simplePage: true,
-        searchShow: true,
-        searchGutter: 30,
-        searchMenuPosition: 'left',
-        searchMenuSpan: 4,
-        dialogWidth: '60%',
-        tree: true,
-        border: true,
-        index: true,
-        selection: true,
-        viewBtn: false,
-        editBtn: false,
-        addBtn: false,
-        delBtn: false,
-        menuWidth: 150,
-        dialogClickModal: false,
-
-        height: 'auto',
-        calcHeight: 20,
-
-        column: [
-          {
-            label: '菜单名称',
-            prop: 'name',
-            width: 300,
-            search: true,
-            searchSpan: 4,
-            rules: [
-              {
-                required: true,
-                message: '请输入菜单名称',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '路由地址',
-            prop: 'path',
-            rules: [
-              {
-                required: true,
-                message: '请输入路由地址',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '上级菜单',
-            prop: 'parentId',
-            type: 'tree',
-            dicUrl: '/blade-system/menu/tree',
-            hide: true,
-            props: {
-              label: 'title',
-            },
-            rules: [
-              {
-                required: false,
-                message: '请选择上级菜单',
-                trigger: 'click',
-              },
-            ],
-          },
-          {
-            label: '菜单图标',
-            prop: 'source',
-            type: 'icon',
-            slot: true,
-            width: 85,
-            iconList: iconList,
-            rules: [
-              {
-                required: true,
-                message: '请输入菜单图标',
-                trigger: 'click',
-              },
-            ],
-          },
-          {
-            label: '菜单编号',
-            prop: 'code',
-            search: true,
-            searchSpan: 4,
-            rules: [
-              {
-                required: true,
-                message: '请输入菜单编号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '菜单类型',
-            prop: 'category',
-            type: 'radio',
-            dicData: [
-              {
-                label: '菜单',
-                value: 1,
-              },
-              {
-                label: '按钮',
-                value: 2,
-              },
-            ],
-            hide: true,
-            rules: [
-              {
-                required: true,
-                message: '请选择菜单类型',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '菜单别名',
-            prop: 'alias',
-            rules: [
-              {
-                required: true,
-                message: '请输入菜单别名',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '按钮功能',
-            prop: 'action',
-            type: 'radio',
-            dicData: [
-              {
-                label: '工具栏',
-                value: 0,
-              },
-              {
-                label: '操作栏',
-                value: 1,
-              },
-              {
-                label: '工具操作栏',
-                value: 2,
-              },
-            ],
-            hide: true,
-            rules: [
-              {
-                required: true,
-                message: '请选择按钮功能',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '菜单排序',
-            prop: 'sort',
-            type: 'number',
-            width: 85,
-            rules: [
-              {
-                required: true,
-                message: '请输入菜单排序',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '新窗口',
-            prop: 'isOpen',
-            type: 'radio',
-            dicData: [
-              {
-                label: '否',
-                value: 0,
-              },
-              {
-                label: '是',
-                value: 1,
-              },
-            ],
-            hide: true,
-          },
-          {
-            label: '菜单备注',
-            prop: 'remark',
-            type: 'textarea',
-            span: 24,
-            minRows: 6,
-            hide: true,
-          },
-        ],
-      },
-      data: [],
-      formScope: {},
-      selectionListScope: [],
-      pageScope: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      optionScope: {
-        tip: false,
-        searchShow: true,
-        searchMenuSpan: 6,
-        border: true,
-        index: true,
-        viewBtn: true,
-        selection: true,
-        menuWidth: 200,
-        dialogWidth: 900,
-        dialogClickModal: false,
-        column: [
-          {
-            label: '权限名称',
-            prop: 'scopeName',
-            search: true,
-            searchSpan: 4,
-            rules: [
-              {
-                required: true,
-                message: '请输入权限名称',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '权限编号',
-            prop: 'resourceCode',
-            search: true,
-            searchSpan: 4,
-            width: 180,
-            rules: [
-              {
-                required: true,
-                message: '请输入权限编号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '权限路径',
-            prop: 'scopePath',
-            width: 180,
-            rules: [
-              {
-                required: true,
-                message: '请输入权限编号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '接口类型',
-            type: 'select',
-            dicUrl: '/blade-system/dict/dictionary?code=api_scope_type',
-            props: {
-              label: 'dictValue',
-              value: 'dictKey',
-            },
-            dataType: 'number',
-            slot: true,
-            width: 100,
-            prop: 'scopeType',
-            rules: [
-              {
-                required: true,
-                message: '请输入通知类型',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '备注',
-            prop: 'remark',
-            span: 24,
-            hide: true,
-          },
-        ],
-      },
-      dataScope: [],
-    }
-  },
-
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList () {
-      return {
-        addBtn: this.validData(this.permission.menu_add, false),
-        viewBtn: this.validData(this.permission.menu_view, false),
-        delBtn: this.validData(this.permission.menu_delete, false),
-        editBtn: this.validData(this.permission.menu_edit, false),
-      }
-    },
-    ids () {
-      let ids = []
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id)
-      })
-      return ids.join(',')
-    },
-    scopeIds () {
-      let ids = []
-      this.selectionListScope.forEach(ele => {
-        ids.push(ele.id)
-      })
-      return ids.join(',')
-    },
-  },
-  methods: {
-    // 菜单管理模块
-    rowSave (row, done, loading) {
-      add(row).then(
-        () => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowUpdate (row, index, done, loading) {
-      update(row).then(
-        () => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowDel (row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-        })
-    },
-    searchReset () {
-      this.query = {}
-      this.parentId = 0
-      this.onLoad(this.page)
-    },
-    searchChange (params, done) {
-      this.query = params
-      this.parentId = ''
-      this.page.currentPage = 1
-      this.onLoad(this.page, params)
-      done()
-    },
-    selectionChange (list) {
-      this.selectionList = list
-    },
-    selectionClear () {
-      this.selectionList = []
-      this.$refs.crud.toggleSelection()
-    },
-    handleDelete () {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据')
-        return
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          this.$refs.crud.toggleSelection()
-        })
-    },
-    beforeOpen (done, type) {
-      if (['edit', 'view'].includes(type)) {
-        getMenu(this.form.id).then(res => {
-          this.form = res.data.data
-        })
-      }
-      done()
-    },
-    currentChange (currentPage) {
-      this.page.currentPage = currentPage
-    },
-    sizeChange (pageSize) {
-      this.page.pageSize = pageSize
-    },
-    refreshChange () {
-      this.onLoad(this.page, this.query)
-    },
-    onLoad (page, params = {}) {
-      this.loading = true
-      getLazyMenuList(this.parentId, Object.assign(params, this.query)).then(res => {
-        this.data = res.data.data
-        this.loading = false
-        this.selectionClear()
-      })
-    },
-    treeLoad (tree, treeNode, resolve) {
-      const parentId = tree.id
-      getLazyMenuList(parentId).then(res => {
-        resolve(res.data.data)
-      })
-    },
-    // 数据权限模块
-    handleDataScope (row) {
-      this.drawerVisible = true
-      this.scopeMenuId = row.id
-      this.scopeMenuName = row.name
-      this.onLoadScope(this.pageScope)
-    },
-    handleDrawerClose (hide) {
-      hide()
-    },
-    rowSaveScope (row, done, loading) {
-      row = {
-        ...row,
-        menuId: this.scopeMenuId,
-      }
-      addApiScope(row).then(
-        () => {
-          this.onLoadScope(this.pageScope)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowUpdateScope (row, index, done, loading) {
-      row = {
-        ...row,
-        menuId: this.scopeMenuId,
-      }
-      updateApiScope(row).then(
-        () => {
-          this.onLoadScope(this.pageScope)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowDelScope (row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return removeApiScope(row.id)
-        })
-        .then(() => {
-          this.onLoadScope(this.pageScope)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-        })
-    },
-    handleDeleteScope () {
-      if (this.selectionListScope.length === 0) {
-        this.$message.warning('请选择至少一条数据')
-        return
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return removeApiScope(this.scopeIds)
-        })
-        .then(() => {
-          this.onLoadScope(this.pageScope)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          this.$refs.crudScope.toggleSelection()
-        })
-    },
-    beforeOpenScope (done, type) {
-      if (['edit', 'view'].includes(type)) {
-        getMenuApiScope(this.formScope.id).then(res => {
-          this.formScope = res.data.data
-        })
-      }
-      done()
-    },
-    searchResetScope () {
-      this.onLoadScope(this.pageScope)
-    },
-    searchChangeScope (params, done) {
-      this.onLoadScope(this.pageScope, params)
-      done()
-    },
-    selectionChangeScope (list) {
-      this.selectionListScope = list
-    },
-    currentChangeScope (currentPage) {
-      this.pageScope.currentPage = currentPage
-    },
-    sizeChangeScope (pageSize) {
-      this.pageScope.pageSize = pageSize
-    },
-    onLoadScope (page, params = {}) {
-      this.scopeLoading = true
-      const values = {
-        ...params,
-        menuId: this.scopeMenuId,
-      }
-      getListApiScope(page.currentPage, page.pageSize, Object.assign(values, this.query)).then(
-        res => {
-          const data = res.data.data
-          this.pageScope.total = data.total
-          this.dataScope = data.records
-          this.selectionListScope = []
-          this.scopeLoading = false
-        }
-      )
-    },
-  },
-}
-</script>
-
-<style scoped lang="scss">
-.namei {
-  margin-right: 5px;
-}
-</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/authority/datascope.vue b/applications/task-work-order/src/views/authority/datascope.vue
deleted file mode 100644
index 8cc0fb2..0000000
--- a/applications/task-work-order/src/views/authority/datascope.vue
+++ /dev/null
@@ -1,737 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud :option="option" :table-loading="loading" :data="data" ref="crud" v-model="form"
-      :permission="permissionList" :before-open="beforeOpen" :before-close="beforeClose" @row-del="rowDel"
-      @row-update="rowUpdate" @row-save="rowSave" @search-change="searchChange" @search-reset="searchReset"
-      @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
-      @refresh-change="refreshChange" @on-load="onLoad" @tree-load="treeLoad">
-      <template #menu="{ row }">
-        <el-button type="primary" text icon="el-icon-setting" v-if="permission.data_scope_setting" plain
-          style="border: 0; background-color: transparent !important" @click.stop="handleDataScope(row)">权限配置
-        </el-button>
-      </template>
-      <template #name="{ row }">
-        <i :class="row.source" class="namei" />
-        <span>{{ row.name }}</span>
-      </template>
-      <template #source="{ row }">
-        <div style="text-align: center">
-          <i :class="row.source" />
-        </div>
-      </template>
-    </avue-crud>
-    <el-drawer :title="`[${scopeMenuName}] 数据权限配置`" v-model="drawerVisible" :direction="direction" append-to-body
-      :before-close="handleDrawerClose" size="1000px">
-      <basic-container>
-        <avue-crud :option="optionScope" :data="dataScope" :page="pageScope" v-model="formScope"
-          :table-loading="scopeLoading" ref="crudScope" @row-del="rowDelScope" @row-update="rowUpdateScope"
-          @row-save="rowSaveScope" :before-open="beforeOpenScope" @search-change="searchChangeScope"
-          @search-reset="searchResetScope" @selection-change="selectionChangeScope" @current-change="currentChangeScope"
-          @size-change="sizeChangeScope" @on-load="onLoadScope">
-          <template #menu-left>
-            <el-button type="danger" icon="el-icon-delete" plain @click="handleDeleteScope">删 除
-            </el-button>
-          </template>
-          <template #scopeType="{ row }">
-            <el-tag>{{ row.scopeTypeName }}</el-tag>
-          </template>
-        </avue-crud>
-      </basic-container>
-    </el-drawer>
-  </basic-container>
-</template>
-
-<script>
-import { add, remove, update, getLazyMenuList, getMenu } from '@/api/system/menu'
-import {
-  addDataScope,
-  removeDataScope,
-  updateDataScope,
-  getListDataScope,
-  getMenuDataScope,
-} from '@/api/system/scope'
-import { mapGetters } from 'vuex'
-import iconList from '@/config/iconList'
-import func from '@/utils/func'
-
-export default {
-  data () {
-    return {
-      form: {},
-      selectionList: [],
-      query: {},
-      loading: true,
-      parentId: 0,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      drawerVisible: false,
-      direction: 'rtl',
-      scopeMenuId: 0,
-      scopeMenuCode: '',
-      scopeMenuName: '菜单',
-      scopeLoading: false,
-      menu: true,
-      watchMode: true,
-      option: {
-        lazy: true,
-        tip: false,
-        simplePage: true,
-        searchShow: true,
-        searchGutter: 30,
-        searchMenuPosition: 'left',
-        searchMenuSpan: 4,
-        dialogWidth: '60%',
-        tree: true,
-        border: true,
-        index: true,
-        selection: true,
-        viewBtn: false,
-        editBtn: false,
-        addBtn: false,
-        delBtn: false,
-        menuWidth: 150,
-        dialogClickModal: false,
-
-        height: 'auto',
-        calcHeight: 20,
-
-        column: [
-          {
-            label: '菜单名称',
-            prop: 'name',
-            width: 300,
-            search: true,
-            searchSpan: 4,
-            rules: [
-              {
-                required: true,
-                message: '请输入菜单名称',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '路由地址',
-            prop: 'path',
-            rules: [
-              {
-                required: true,
-                message: '请输入路由地址',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '上级菜单',
-            prop: 'parentId',
-            type: 'tree',
-            dicUrl: '/blade-system/menu/tree',
-            hide: true,
-            props: {
-              label: 'title',
-            },
-            rules: [
-              {
-                required: false,
-                message: '请选择上级菜单',
-                trigger: 'click',
-              },
-            ],
-          },
-          {
-            label: '菜单图标',
-            prop: 'source',
-            type: 'icon',
-            slot: true,
-            width: 85,
-            iconList: iconList,
-            rules: [
-              {
-                required: true,
-                message: '请输入菜单图标',
-                trigger: 'click',
-              },
-            ],
-          },
-          {
-            label: '菜单编号',
-            prop: 'code',
-            search: true,
-            searchSpan: 4,
-            rules: [
-              {
-                required: true,
-                message: '请输入菜单编号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '菜单类型',
-            prop: 'category',
-            type: 'radio',
-            dicData: [
-              {
-                label: '菜单',
-                value: 1,
-              },
-              {
-                label: '按钮',
-                value: 2,
-              },
-            ],
-            hide: true,
-            rules: [
-              {
-                required: true,
-                message: '请选择菜单类型',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '菜单别名',
-            prop: 'alias',
-            rules: [
-              {
-                required: true,
-                message: '请输入菜单别名',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '按钮功能',
-            prop: 'action',
-            type: 'radio',
-            dicData: [
-              {
-                label: '工具栏',
-                value: 0,
-              },
-              {
-                label: '操作栏',
-                value: 1,
-              },
-              {
-                label: '工具操作栏',
-                value: 2,
-              },
-            ],
-            hide: true,
-            rules: [
-              {
-                required: true,
-                message: '请选择按钮功能',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '菜单排序',
-            prop: 'sort',
-            type: 'number',
-            width: 85,
-            rules: [
-              {
-                required: true,
-                message: '请输入菜单排序',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '新窗口',
-            prop: 'isOpen',
-            type: 'radio',
-            dicData: [
-              {
-                label: '否',
-                value: 0,
-              },
-              {
-                label: '是',
-                value: 1,
-              },
-            ],
-            hide: true,
-          },
-          {
-            label: '菜单备注',
-            prop: 'remark',
-            type: 'textarea',
-            span: 24,
-            minRows: 6,
-            hide: true,
-          },
-        ],
-      },
-      data: [],
-      formScope: {},
-      selectionListScope: [],
-      pageScope: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      optionScope: {
-        tip: false,
-        searchShow: true,
-        searchMenuSpan: 6,
-        border: true,
-        index: true,
-        viewBtn: true,
-        selection: true,
-        menuWidth: 200,
-        dialogWidth: 900,
-        dialogClickModal: false,
-        column: [
-          {
-            label: '权限名称',
-            prop: 'scopeName',
-            search: true,
-            searchSpan: 4,
-            value: '',
-            rules: [
-              {
-                required: true,
-                message: '请输入数据权限名称',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '权限编号',
-            prop: 'resourceCode',
-            search: true,
-            searchSpan: 4,
-            width: 100,
-            rules: [
-              {
-                required: true,
-                message: '请输入数据权限编号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '权限字段',
-            prop: 'scopeColumn',
-            width: 130,
-            rules: [
-              {
-                required: true,
-                message: '请输入数据权限编号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '规则类型',
-            type: 'select',
-            dicUrl: '/blade-system/dict/dictionary?code=data_scope_type',
-            props: {
-              label: 'dictValue',
-              value: 'dictKey',
-            },
-            dataType: 'number',
-            slot: true,
-            width: 140,
-            prop: 'scopeType',
-            rules: [
-              {
-                required: true,
-                message: '请输入通知类型',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '可见字段',
-            prop: 'scopeField',
-            span: 24,
-            hide: true,
-            value: '*',
-            rules: [
-              {
-                required: true,
-                message: '请输入数据权限可见的字段',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '权限类名',
-            prop: 'scopeClass',
-            span: 24,
-            hide: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入MybatisMapper对应方法的完整类名路径',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '规则值',
-            prop: 'scopeValue',
-            span: 24,
-            minRows: 5,
-            type: 'textarea',
-            display: true,
-            hide: true,
-          },
-          {
-            label: '备注',
-            prop: 'remark',
-            span: 24,
-            hide: true,
-          },
-        ],
-      },
-      dataScope: [],
-    }
-  },
-  watch: {
-    'formScope.scopeType' () {
-      this.initScope()
-    },
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList () {
-      return {
-        addBtn: this.validData(this.permission.menu_add, false),
-        viewBtn: this.validData(this.permission.menu_view, false),
-        delBtn: this.validData(this.permission.menu_delete, false),
-        editBtn: this.validData(this.permission.menu_edit, false),
-      }
-    },
-    ids () {
-      let ids = []
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id)
-      })
-      return ids.join(',')
-    },
-    scopeIds () {
-      let ids = []
-      this.selectionListScope.forEach(ele => {
-        ids.push(ele.id)
-      })
-      return ids.join(',')
-    },
-  },
-  methods: {
-    initScope () {
-      const scopeType = func.toInt(this.formScope.scopeType)
-      const watchMode = this.watchMode
-      let column = '-',
-        name = '暂无'
-      if (scopeType === 1) {
-        column = '-'
-        name = '全部可见'
-      } else if (scopeType === 2) {
-        column = 'create_user'
-        name = '本人可见'
-      } else if (scopeType === 3) {
-        column = 'create_dept'
-        name = '所在机构可见'
-      } else if (scopeType === 4) {
-        column = 'create_dept'
-        name = '所在机构可见及子级可见'
-      } else if (scopeType === 5) {
-        column = ''
-        name = '自定义'
-      }
-      this.$refs.crudScope.option.column.filter(item => {
-        if (watchMode) {
-          if (item.prop === 'scopeName') {
-            this.formScope.scopeName = `${this.scopeMenuName} [${name}]`
-          }
-          if (item.prop === 'resourceCode') {
-            this.formScope.resourceCode = this.scopeMenuCode
-          }
-          if (item.prop === 'scopeColumn') {
-            this.formScope.scopeColumn = column
-          }
-        }
-        if (item.prop === 'scopeValue') {
-          item.display = scopeType === 5
-        }
-      })
-    },
-    // 菜单管理模块
-    rowSave (row, done, loading) {
-      add(row).then(
-        () => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowUpdate (row, index, done, loading) {
-      update(row).then(
-        () => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowDel (row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-        })
-    },
-    searchReset () {
-      this.query = {}
-      this.parentId = 0
-      this.onLoad(this.page)
-    },
-    searchChange (params, done) {
-      this.query = params
-      this.parentId = ''
-      this.page.currentPage = 1
-      this.onLoad(this.page, params)
-      done()
-    },
-    selectionChange (list) {
-      this.selectionList = list
-    },
-    selectionClear () {
-      this.selectionList = []
-      this.$refs.crud.toggleSelection()
-    },
-    handleDelete () {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据')
-        return
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          this.$refs.crud.toggleSelection()
-        })
-    },
-    beforeOpen (done, type) {
-      if (['edit', 'view'].includes(type)) {
-        getMenu(this.form.id).then(res => {
-          this.form = res.data.data
-        })
-      }
-      done()
-    },
-    beforeClose (done) {
-      this.formScope = {}
-      done()
-    },
-    currentChange (currentPage) {
-      this.page.currentPage = currentPage
-    },
-    sizeChange (pageSize) {
-      this.page.pageSize = pageSize
-    },
-    refreshChange () {
-      this.onLoad(this.page, this.query)
-    },
-    onLoad (page, params = {}) {
-      this.loading = true
-      getLazyMenuList(this.parentId, Object.assign(params, this.query)).then(res => {
-        this.data = res.data.data
-        this.loading = false
-        this.selectionClear()
-      })
-    },
-    treeLoad (tree, treeNode, resolve) {
-      const parentId = tree.id
-      getLazyMenuList(parentId).then(res => {
-        resolve(res.data.data)
-      })
-    },
-    // 数据权限模块
-    handleDataScope (row) {
-      this.drawerVisible = true
-      this.scopeMenuId = row.id
-      this.scopeMenuCode = row.code
-      this.scopeMenuName = row.name
-      this.onLoadScope(this.pageScope)
-    },
-    handleDrawerClose (hide) {
-      hide()
-    },
-    rowSaveScope (row, done, loading) {
-      row = {
-        ...row,
-        menuId: this.scopeMenuId,
-      }
-      addDataScope(row).then(
-        () => {
-          this.onLoadScope(this.pageScope)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowUpdateScope (row, index, done, loading) {
-      row = {
-        ...row,
-        menuId: this.scopeMenuId,
-      }
-      updateDataScope(row).then(
-        () => {
-          this.onLoadScope(this.pageScope)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowDelScope (row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return removeDataScope(row.id)
-        })
-        .then(() => {
-          this.onLoadScope(this.pageScope)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-        })
-    },
-    handleDeleteScope () {
-      if (this.selectionListScope.length === 0) {
-        this.$message.warning('请选择至少一条数据')
-        return
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return removeDataScope(this.scopeIds)
-        })
-        .then(() => {
-          this.onLoadScope(this.pageScope)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          this.$refs.crudScope.toggleSelection()
-        })
-    },
-    beforeOpenScope (done, type) {
-      if (['add'].includes(type)) {
-        this.watchMode = true
-        this.initScope()
-      }
-      if (['edit', 'view'].includes(type)) {
-        this.watchMode = false
-        getMenuDataScope(this.formScope.id).then(res => {
-          this.formScope = res.data.data
-        })
-      }
-      done()
-    },
-    searchResetScope () {
-      this.onLoadScope(this.pageScope)
-    },
-    searchChangeScope (params, done) {
-      this.onLoadScope(this.pageScope, params)
-      done()
-    },
-    selectionChangeScope (list) {
-      this.selectionListScope = list
-    },
-    currentChangeScope (currentPage) {
-      this.pageScope.currentPage = currentPage
-    },
-    sizeChangeScope (pageSize) {
-      this.pageScope.pageSize = pageSize
-    },
-    onLoadScope (page, params = {}) {
-      this.scopeLoading = true
-      const values = {
-        ...params,
-        menuId: this.scopeMenuId,
-      }
-      getListDataScope(page.currentPage, page.pageSize, Object.assign(values, this.query)).then(
-        res => {
-          const data = res.data.data
-          this.pageScope.total = data.total
-          this.dataScope = data.records
-          this.selectionListScope = []
-          this.scopeLoading = false
-        }
-      )
-    },
-  },
-}
-</script>
-
-<style scoped lang="scss">
-.namei {
-  margin-right: 5px;
-}
-</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/authority/role.vue b/applications/task-work-order/src/views/authority/role.vue
deleted file mode 100644
index e330660..0000000
--- a/applications/task-work-order/src/views/authority/role.vue
+++ /dev/null
@@ -1,440 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud :option="option" :table-loading="loading" :data="data" ref="crud" v-model="form"
-      :permission="permissionList" :before-open="beforeOpen" @row-del="rowDel" @row-update="rowUpdate"
-      @row-save="rowSave" @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
-      @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
-      <template #menu-left>
-        <el-button type="danger" icon="el-icon-delete" v-if="permission.role_delete" plain @click="handleDelete">删 除
-        </el-button>
-        <el-button icon="el-icon-setting" v-if="userInfo.role_name.includes('admin')" @click="handleRole" plain>权限设置
-        </el-button>
-        <!--  -->
-      </template>
-    </avue-crud>
-    <el-dialog title="角色权限配置" append-to-body v-model="box" width="432.5px">
-      <el-tabs type="border-card">
-        <el-tab-pane label="后台管理">
-          <el-tree :data="menuGrantList" show-checkbox node-key="id" ref="treeMenu" :default-checked-keys="menuTreeObj"
-            :props="props">
-          </el-tree>
-        </el-tab-pane>
-        <el-tab-pane label="移动app">
-          <el-tree :data="menuGrantListApp" show-checkbox node-key="id" ref="treeMenuApp" :default-checked-keys="menuTreeObjApp"
-                   :props="props">
-          </el-tree>
-        </el-tab-pane>
-
-        <el-tab-pane label="新大屏菜单">
-          <el-tree :data="menuGrantListNew" show-checkbox node-key="id" ref="treeMenuWebNew" :default-checked-keys="menuTreeObjNew"
-                   :props="props">
-          </el-tree>
-        </el-tab-pane>
-
-        <el-tab-pane label="大屏菜单">
-          <el-tree :data="menuGrantListOld" show-checkbox node-key="id" ref="treeMenuWebOld" :default-checked-keys="menuTreeObjOld"
-                   :props="props">
-          </el-tree>
-        </el-tab-pane>
-       
-        <!-- <el-tab-pane label="数据权限">
-          <el-tree
-            :data="dataScopeGrantList"
-            show-checkbox
-            node-key="id"
-            ref="treeDataScope"
-            :default-checked-keys="dataScopeTreeObj"
-            :props="props"
-          >
-          </el-tree>
-        </el-tab-pane>
-        <el-tab-pane label="接口权限">
-          <el-tree
-            :data="apiScopeGrantList"
-            show-checkbox
-            node-key="id"
-            ref="treeApiScope"
-            :default-checked-keys="apiScopeTreeObj"
-            :props="props"
-          >
-          </el-tree>
-        </el-tab-pane> -->
-      </el-tabs>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="box = false">取 消</el-button>
-          <el-button type="primary" @click="submit">确 定</el-button>
-        </span>
-      </template>
-    </el-dialog>
-  </basic-container>
-</template>
-
-<script>
-import {
-  add,
-  getList,
-  getRole,
-  getRoleTreeById,
-  grant,
-  grantTree,
-  remove,
-  update,
-} from '@/api/system/role'
-import { mapGetters } from 'vuex'
-import website from '@/config/website'
-
-export default {
-  data () {
-    return {
-      form: {},
-      box: false,
-      props: {
-        label: 'title',
-        value: 'key',
-      },
-      menuGrantList: [],
-      menuGrantListApp: [],
-      menuGrantListOld: [],
-      menuGrantListNew: [],
-      dataScopeGrantList: [],
-      apiScopeGrantList: [],
-      apiGrantList: [],
-      menuTreeObj: [],
-      menuTreeObjApp: [],
-      menuTreeObjOld: [],
-      menuTreeObjNew: [],
-      dataScopeTreeObj: [],
-      apiScopeTreeObj: [],
-      selectionList: [],
-      query: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      option: {
-        emptyBtnText: '重置',
-        emptyBtnIcon: 'el-icon-refresh',
-        tip: false,
-        simplePage: true,
-        searchShow: true,
-        searchGutter: 30,
-        searchMenuPosition: 'left',
-        searchMenuSpan: 4,
-        tree: true,
-        border: true,
-        index: true,
-        selection: true,
-        viewBtn: true,
-        dialogWidth: 900,
-        dialogClickModal: false,
-
-        height: 'auto',
-        calcHeight: 20,
-
-        column: [
-          {
-            label: '角色名称',
-            prop: 'roleName',
-            search: true,
-            searchSpan: 4,
-            span: 24,
-            rules: [
-              {
-                required: true,
-                message: '请输入角色名称',
-                trigger: 'blur',
-              },
-            ],
-          },
-          // {
-          //   label: '所属租户',
-          //   prop: 'tenantId',
-          //   type: 'tree',
-          //   dicUrl: '/blade-system/tenant/select',
-          //   addDisplay: false,
-          //   editDisplay: false,
-          //   viewDisplay: website.tenantMode,
-          //   span: 24,
-          //   props: {
-          //     label: 'tenantName',
-          //     value: 'tenantId',
-          //   },
-          //   hide: !website.tenantMode,
-          //   search: website.tenantMode,
-          //   rules: [
-          //     {
-          //       required: true,
-          //       message: '请输入所属租户',
-          //       trigger: 'click',
-          //     },
-          //   ],
-          // },
-          {
-            label: '角色别名',
-            prop: 'roleAlias',
-            search: true,
-            searchSpan: 4,
-            span: 24,
-            rules: [
-              {
-                required: true,
-                message: '请输入角色别名',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '上级角色',
-            prop: 'parentId',
-            dicData: [],
-            type: 'tree',
-            hide: true,
-            span: 24,
-            props: {
-              label: 'title',
-            },
-            rules: [
-              {
-                required: false,
-                message: '请选择上级角色',
-                trigger: 'click',
-              },
-            ],
-          },
-          {
-            label: '角色排序',
-            prop: 'sort',
-            type: 'number',
-            span: 24,
-            rules: [
-              {
-                required: true,
-                message: '请输入角色排序',
-                trigger: 'blur',
-              },
-            ],
-          },
-        ],
-      },
-      data: [],
-    }
-  },
-  computed: {
-    ...mapGetters(['userInfo', 'permission']),
-    permissionList () {
-      return {
-        addBtn: this.validData(this.permission.role_add, false),
-        viewBtn: this.validData(this.permission.role_view, false),
-        delBtn: this.validData(this.permission.role_delete, false),
-        editBtn: this.validData(this.permission.role_edit, false),
-      }
-    },
-    ids () {
-      let ids = []
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id)
-      })
-      return ids.join(',')
-    },
-    idsArray () {
-      let ids = []
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id)
-      })
-      return ids
-    },
-  },
-  methods: {
-    initData (roleId) {
-      getRoleTreeById(roleId).then(res => {
-        const column = this.findObject(this.option.column, 'parentId')
-        column.dicData = res.data.data
-      })
-    },
-    submit () {
-      const menuList = this.$refs.treeMenu.getCheckedKeys()
-      const menuListApp = this.$refs.treeMenuApp.getCheckedKeys()
-      const menuListWebNew = this.$refs.treeMenuWebNew.getCheckedKeys()
-      const menuListWebOld = this.$refs.treeMenuWebOld.getCheckedKeys()
-
-      
-
-      // const dataScopeList = this.$refs.treeDataScope.getCheckedKeys();
-      const dataScopeList = []
-      // const apiScopeList = this.$refs.treeApiScope.getCheckedKeys();
-      const apiScopeList = []
-      grant(this.idsArray, [
-        ...menuList,
-        ...menuListApp,
-        ...menuListWebNew,
-        ...menuListWebOld,
-      ], dataScopeList, apiScopeList).then(() => {
-        this.box = false
-        this.$message({
-          type: 'success',
-          message: '操作成功!',
-        })
-        this.onLoad(this.page)
-      })
-    },
-    rowSave (row, done, loading) {
-      add(row).then(
-        () => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowUpdate (row, index, done, loading) {
-      update(row).then(
-        () => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowDel (row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-        })
-    },
-
-    searchReset () {
-      this.query = {}
-      this.onLoad(this.page)
-    },
-    searchChange (params, done) {
-      this.query = params
-      this.page.currentPage = 1
-      this.onLoad(this.page, params)
-      done()
-    },
-    selectionChange (list) {
-      this.selectionList = list
-    },
-    selectionClear () {
-      this.selectionList = []
-      this.$refs.crud.toggleSelection()
-    },
-    beforeOpen (done, type) {
-      if (['add', 'edit'].includes(type)) {
-        this.initData(this.form.id)
-      }
-      done()
-    },
-    handleRole () {
-      if (this.selectionList.length !== 1) {
-        this.$message.warning('只能选择一条数据')
-        return
-      }
-      this.menuTreeObj = []
-      this.dataScopeTreeObj = []
-      this.apiScopeTreeObj = []
-      grantTree({sysType: 1}).then(res => {
-        this.menuGrantList = res.data.data.menu
-        this.dataScopeGrantList = res.data.data.dataScope
-        this.apiScopeGrantList = res.data.data.apiScope
-        getRole(this.ids).then(res => {
-          this.menuTreeObj = res.data.data.menu
-          this.dataScopeTreeObj = res.data.data.dataScope
-          this.apiScopeTreeObj = res.data.data.apiScope
-          this.box = true
-        })
-      })
-      grantTree({sysType: 3}).then(res => {
-        this.menuGrantListApp = res.data.data.menu
-        getRole(this.ids).then(res => {
-          this.menuTreeObjApp = res.data.data.menu
-          this.box = true
-        })
-      })
-      grantTree({sysType: 2}).then(res => {
-        this.menuGrantListOld = res.data.data.menu
-        getRole(this.ids).then(res => {
-          this.menuTreeObjOld = res.data.data.menu
-          this.box = true
-        })
-      })
-    
-      grantTree({sysType: 4}).then(res => {
-        this.menuGrantListNew = res.data.data.menu
-        getRole(this.ids).then(res => {
-          this.menuTreeObjNew = res.data.data.menu
-          this.box = true
-        })
-      })
-    },
-    handleDelete () {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据')
-        return
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          this.$refs.crud.toggleSelection()
-        })
-    },
-    currentChange (currentPage) {
-      this.page.currentPage = currentPage
-    },
-    sizeChange (pageSize) {
-      this.page.pageSize = pageSize
-    },
-    refreshChange () {
-      this.onLoad(this.page, this.query)
-    },
-    onLoad (page, params = {}) {
-      this.loading = true
-      getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
-        this.data = res.data.data
-        this.loading = false
-        this.selectionClear()
-      })
-    },
-  },
-}
-</script>
-<style scoped lang="scss"></style>
diff --git a/applications/task-work-order/src/views/base/region.vue b/applications/task-work-order/src/views/base/region.vue
deleted file mode 100644
index 79c0f49..0000000
--- a/applications/task-work-order/src/views/base/region.vue
+++ /dev/null
@@ -1,457 +0,0 @@
-<template>
-  <div class="manage-p-all-10 manage-p-t-0 manage-h-0 manage-flex-1 manage-flex">
-    <div
-      class="manage-p-all-20 manage-flex-2 manage-h-100 manage-b-r-5 manage-box-s-b-b manage-overflow-h manage-b-c-w">
-      <div class="box ">
-        <el-scrollbar>
-          <div class="manage-w-100 manage-h-100">
-            <avue-tree :option="treeOption" :data="treeData" @node-click="nodeClick" />
-          </div>
-        </el-scrollbar>
-      </div>
-    </div>
-
-    <div
-      class="manage-p-all-10 manage-p-t-0 manage-p-b-0 manage-flex-4 manage-h-100 manage-flex manage-box-s-b-b manage-f-d-c">
-      <div class="manage-p-all-20 manage-flex manage-f-d-c manage-h-100 manage-box-s-b-b manage-b-c-w manage-b-r-5">
-        <div>
-          <el-button-group>
-            <el-button v-if="permission.region_add" type="primary" icon="el-icon-plus" @click="addChildren">新增下级
-            </el-button>
-            <el-button v-if="permission.region_delete" type="primary" icon="el-icon-delete" @click="handleDelete">删除
-            </el-button>
-            <el-button v-if="permission.region_import" type="primary" icon="el-icon-upload" @click="handleImport">导入
-            </el-button>
-            <el-button v-if="permission.region_export" type="primary" icon="el-icon-download" @click="handleExport">导出
-            </el-button>
-            <el-button v-if="permission.region_debug" type="primary" icon="el-icon-video-play" @click="handleDebug">调试
-            </el-button>
-          </el-button-group>
-        </div>
-
-        <div class="manage-m-t-20 manage-h-0 manage-flex-1 ">
-          <avue-form ref="form" :option="regionOption" v-model="regionForm" @submit="handleSubmit">
-            <template #code="{ }">
-              <el-input placeholder="请输入 区划子编号" v-model="regionForm.subCode">
-                <template #prepend>{{ regionForm.parentCode }}</template>
-              </el-input>
-            </template>
-          </avue-form>
-          <el-dialog title="行政区划数据导入" append-to-body v-model="excelBox" width="555px">
-            <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter">
-              <template #excelTemplate>
-                <el-button type="primary" @click="handleTemplate">
-                  点击下载<i class="el-icon-download el-icon--right"></i>
-                </el-button>
-              </template>
-            </avue-form>
-          </el-dialog>
-          <el-dialog title="行政区划数据调试" append-to-body v-model="debugBox" width="350px">
-            <avue-form :option="debugOption" v-model="debugForm" />
-          </el-dialog>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-import { getLazyTree, getDetail, submit, remove } from '@/api/base/region'
-import { exportBlob } from '@/api/common'
-import { mapGetters } from 'vuex'
-import { validatenull } from '@/utils/validate'
-import { downloadXls } from '@/utils/util'
-import { getToken } from '@/utils/auth'
-import NProgress from 'nprogress'
-import 'nprogress/nprogress.css'
-
-export default {
-  data () {
-    return {
-      topCode: '00',
-      treeCode: '',
-      treeParentCode: '',
-      loading: null,
-      treeData: [],
-      treeOption: {
-        nodeKey: 'id',
-        lazy: true,
-        treeLoad: function (node, resolve) {
-          const parentCode = node.level === 0 ? '000000000000' : node.data.id
-          getLazyTree(parentCode).then(res => {
-            resolve(
-              res.data.data.map(item => {
-                return {
-                  ...item,
-                  leaf: !item.hasChildren,
-                }
-              })
-            )
-          })
-        },
-        addBtn: false,
-        menu: false,
-        size: 'small',
-        props: {
-          labelText: '标题',
-          label: 'title',
-          value: 'value',
-          children: 'children',
-        },
-      },
-      regionForm: {},
-      regionOption: {
-        labelWidth: 100,
-        column: [
-          {
-            label: '父区划编号',
-            prop: 'parentCode',
-            span: 24,
-            disabled: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入父区划编号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '父区划名称',
-            prop: 'parentName',
-            span: 24,
-            disabled: true,
-          },
-          {
-            label: '区划编号',
-            prop: 'code',
-            formslot: true,
-            span: 24,
-            rules: [
-              {
-                required: true,
-                message: '请输入区划编号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '区划子编号',
-            prop: 'subCode',
-            display: false,
-          },
-          {
-            label: '区划名称',
-            prop: 'name',
-            span: 24,
-            rules: [
-              {
-                required: true,
-                message: '请输入区划名称',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '区划等级',
-            prop: 'regionLevel',
-            type: 'radio',
-            dicUrl: '/blade-system/dict/dictionary?code=region',
-            props: {
-              label: 'dictValue',
-              value: 'dictKey',
-            },
-            dataType: 'number',
-            span: 24,
-            rules: [
-              {
-                required: true,
-                message: '请选择区划等级',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '区划排序',
-            prop: 'sort',
-            type: 'number',
-            span: 24,
-            rules: [
-              {
-                required: true,
-                message: '请输入区划排序',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '区划备注',
-            prop: 'remark',
-            type: 'textarea',
-            minRows: 6,
-            span: 24,
-          },
-        ],
-      },
-      excelBox: false,
-      excelForm: {},
-      excelOption: {
-        submitBtn: false,
-        emptyBtn: false,
-        column: [
-          {
-            label: '模板上传',
-            prop: 'excelFile',
-            type: 'upload',
-            drag: true,
-            loadText: '模板上传中,请稍等',
-            span: 24,
-            propsHttp: {
-              res: 'data',
-            },
-            tip: '请上传 .xls,.xlsx 标准格式文件',
-            action: '/blade-system/region/import-region',
-          },
-          {
-            label: '数据覆盖',
-            prop: 'isCovered',
-            type: 'switch',
-            align: 'center',
-            width: 80,
-            dicData: [
-              {
-                label: '否',
-                value: 0,
-              },
-              {
-                label: '是',
-                value: 1,
-              },
-            ],
-            value: 0,
-            slot: true,
-            rules: [
-              {
-                required: true,
-                message: '请选择是否覆盖',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '模板下载',
-            prop: 'excelTemplate',
-            formslot: true,
-            span: 24,
-          },
-        ],
-      },
-      debugBox: false,
-      debugForm: {},
-      debugOption: {
-        labelWidth: 50,
-        submitBtn: false,
-        emptyBtn: false,
-        column: [
-          {
-            label: '省份',
-            prop: 'province',
-            type: 'select',
-            props: {
-              label: 'name',
-              value: 'code',
-            },
-            cascader: ['city'],
-            dicUrl: '/blade-system/region/select',
-            span: 24,
-          },
-          {
-            label: '地市',
-            prop: 'city',
-            type: 'select',
-            props: {
-              label: 'name',
-              value: 'code',
-            },
-            cascader: ['district'],
-            dicFlag: false,
-            dicUrl: '/blade-system/region/select?code={{province}}',
-            span: 24,
-          },
-          {
-            label: '区县',
-            prop: 'district',
-            type: 'select',
-            props: {
-              label: 'name',
-              value: 'code',
-            },
-            dicFlag: false,
-            dicUrl: '/blade-system/region/select?code={{city}}',
-            span: 24,
-          },
-        ],
-      },
-    }
-  },
-  watch: {
-    'regionForm.subCode' () {
-      this.regionForm.code = this.regionForm.parentCode + this.regionForm.subCode
-    },
-    'excelForm.isCovered' () {
-      if (this.excelForm.isCovered !== '') {
-        const column = this.findObject(this.excelOption.column, 'excelFile')
-        column.action = `/blade-system/region/import-region?isCovered=${this.excelForm.isCovered}`
-      }
-    },
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList () {
-      return {
-        addBtn: this.validData(this.permission.region_add, false),
-        viewBtn: this.validData(this.permission.region_view, false),
-        delBtn: this.validData(this.permission.region_delete, false),
-        editBtn: this.validData(this.permission.region_edit, false),
-      }
-    },
-    ids () {
-      let ids = []
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id)
-      })
-      return ids.join(',')
-    },
-  },
-  methods: {
-    initTree () {
-      this.treeData = []
-      getLazyTree(this.topCode).then(res => {
-        this.treeData = res.data.data.map(item => {
-          return {
-            ...item,
-            leaf: !item.hasChildren,
-          }
-        })
-      })
-    },
-    nodeClick (data) {
-      const column = this.findObject(this.regionOption.column, 'parentCode')
-      column.disabled = true
-      this.treeCode = data.id
-      this.treeParentCode = data.parentId
-      getDetail(this.treeCode).then(res => {
-        this.regionForm = res.data.data
-        this.regionForm.subCode = this.regionForm.code.replace(this.regionForm.parentCode, '')
-      })
-    },
-    addChildren () {
-      if (validatenull(this.regionForm.code) || validatenull(this.regionForm.name)) {
-        this.$message.warning('请先选择一项区划')
-        return
-      }
-      this.regionForm.parentCode = this.regionForm.code
-      this.regionForm.parentName = this.regionForm.name
-      this.regionForm.code = ''
-      this.regionForm.subCode = ''
-      this.regionForm.name = ''
-      this.regionForm.regionLevel =
-        this.regionForm.regionLevel === 5 ? 5 : this.regionForm.regionLevel + 1
-    },
-    handleSubmit (form, done, loading) {
-      const parentCode = form.parentCode === this.topCode ? '' : form.parentCode
-      // form.code = parentCode + form.subCode;
-      form.code = form.subCode
-      submit(form).then(
-        () => {
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          this.initTree()
-          this.regionForm.subCode = ''
-          this.$refs.form.resetForm()
-          done()
-          console.log('成功')
-
-        },
-        error => {
-          // loading();
-          window.console.log(error)
-        }
-      )
-    },
-    handleDelete () {
-      if (validatenull(this.regionForm.code)) {
-        this.$message.warning('请先选择一项区划')
-        return
-      }
-      this.$confirm(`确定将 [${this.regionForm.name}] 数据删除?`, {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.treeCode)
-        })
-        .then(() => {
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          this.initTree()
-          this.regionForm.subCode = ''
-          this.$refs.form.resetForm()
-        })
-    },
-    uploadAfter (res, done, loading, column) {
-      window.console.log(column)
-      this.excelBox = false
-      this.initTree()
-      done()
-    },
-    handleDebug () {
-      this.debugBox = true
-    },
-    handleImport () {
-      this.excelBox = true
-    },
-    handleExport () {
-      this.$confirm('是否导出行政区划数据?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      }).then(() => {
-        NProgress.start()
-        exportBlob(
-          `/blade-system/region/export-region?${this.website.tokenHeader}=${getToken()}`
-        ).then(res => {
-          downloadXls(res.data, `行政区划数据${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`)
-          NProgress.done()
-        })
-      })
-    },
-    handleTemplate () {
-      exportBlob(
-        `/blade-system/region/export-template?${this.website.tokenHeader}=${getToken()}`
-      ).then(res => {
-        downloadXls(res.data, '行政区划模板.xlsx')
-      })
-    },
-  },
-}
-</script>
-
-<style lang="scss" scoped>
-.box {
-  height: 100%;
-}
-
-::v-deep(.el-scrollbar) {
-  height: 100%;
-
-  .el-scrollbar__wrap {
-    overflow: auto;
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/dataCenter/components/dataCenterMap.vue b/applications/task-work-order/src/views/dataCenter/components/dataCenterMap.vue
deleted file mode 100644
index 3dd006b..0000000
--- a/applications/task-work-order/src/views/dataCenter/components/dataCenterMap.vue
+++ /dev/null
@@ -1,341 +0,0 @@
-<template>
-  <el-dialog modal-class="mapDialog"  v-model="isShow" width="80%" class="ztzf-dialog-mange">
-     <template #header="{ titleId, titleClass }">
-          <div class="my-header">
-            <h4 :id="titleId" :class="titleClass">定位</h4>
-          </div>
-        </template>
-    <div class="mapBox">
-      <div v-if="isShow" id="dataCenterMap" class="ztzf-cesium"></div>
-    </div>
-  </el-dialog>
-</template>
-
-<script setup>
-import EventBus from '@/utils/eventBus';
-import PanoramaPopup from '@/components/PanoramaPopup/PanoramaPopup.vue';
-import { getMapInfoAPI } from '@/api/dataCenter/dataCenter';
-import { useStore } from 'vuex';
-import { PublicCesium } from '@/utils/cesium/publicCesium';
-import { Cartesian3 } from 'cesium';
-import * as Cesium from 'cesium';
-import EventPopUpBox from '@/hooks/components/EventPopUpBox.vue';
-import { render, nextTick, watch, onMounted, onBeforeUnmount, shallowRef, ref, h } from 'vue';
-import panoramaPoint from '@/assets/images/panorama/panorama-point.png'; //全景图标
-import defaultIcon from '@/assets/images/dataCenter/datamap/eventCompleted.png'; //默认图标
-import activeIcon from '@/assets/images/dataCenter/datamap/activeevent.png'; // 激活图标
-import { getEventActiveImage, getEventImage } from '@/utils/stateToImageMap/event'; //点
-const emit = defineEmits(['lookDetail']);
-const isShow = defineModel('show');
-const viewerRef = shallowRef(null);
-let viewer = null;
-const store = useStore();
-const currentAreaPosition = ref({ height: 1987280, latitude: 27.636112, longitude: 115.732975 });
-let handler = null;
-const props = defineProps(['jobId', 'dotData']);
-let currentClickEntity = null;
-// 存储地图实体引用
-const dataPointEntities = ref([]);
-const isMapInitialized = ref(false); //地图加载
-const dataPointList = ref([]);
-const activeEntity = ref(null); // 当前激活的点
-// 获取弹框box
-const detailId = ref('');
-const createLabelDom = data => {
-  detailId.value = data;
-  const vNode = h(EventPopUpBox, { data, removeLabel, detailClick });
-  const tooltipContainer = document.createElement('div');
-  tooltipContainer.id = 'mapPopUpBox';
-  tooltipContainer.style.position = 'absolute';
-  tooltipContainer.style.transform = 'translate(-50%,-125%)';
-  tooltipContainer.style.pointerEvents = 'none';
-  document.querySelector('#dataCenterMap')?.append(tooltipContainer);
-  render(vNode, tooltipContainer);
-  return tooltipContainer;
-};
-// 弹框位置刷新
-const labelBoxUpdate = () => {
-  if (!currentClickEntity) return;
-  const mapPopUpBox = document.querySelector('#mapPopUpBox');
-  let dom = mapPopUpBox
-    ? mapPopUpBox
-    : createLabelDom(currentClickEntity.properties?.customData._value.data || currentClickEntity);
-  const screenPosition = viewer?.scene.cartesianToCanvasCoordinates(
-    currentClickEntity?.position?._value
-  );
-  if (screenPosition) {
-    dom.style.left = `${screenPosition.x}px`;
-    dom.style.top = `${screenPosition.y}px`;
-    dom.style.display = 'block';
-  }
-};
-
-const removeDom = () => {
-  const dom = document.querySelector('#mapPopUpBox');
-  if (dom && dom.parentNode) {
-    dom.parentNode.removeChild(dom);
-  }
-};
-// 移除弹框标签
-const removeLabel = () => {
-  viewer?.scene.postRender.removeEventListener(labelBoxUpdate);
-  removeDom();
-};
-// 点击去到详情页面
-const detailClick = () => {
-  removeLabel();
-  // 给父组件传值
-  // emit('update:show', false);  //关闭地图弹框
-  emit('lookDetail', detailId.value);
-};
-
-// 恢复所有点的默认图标
-const restoreAllIcons = () => {
-  dataPointEntities.value.forEach(entity => {
-    if (entity.billboard) {
-      const status = entity?.properties?._customData?._value?.data.status;
-      entity.billboard.image =
-        status === 1 || status === null ? defaultIcon : getEventImage(status);
-    }
-  });
-  activeEntity.value = null;
-};
-// 左键单机事件
-const singleMachineEvent = async click => {
-  let clickedEntities = click
-    ? viewer?.scene.drillPick(click.position).map(item => item.id)
-    : [currentClickEntity];
-  if (!clickedEntities.length) {
-    // 点击空白处恢复所有图标并移除弹窗
-    restoreAllIcons();
-    removeLabel();
-    return;
-  }
-  currentClickEntity = clickedEntities[0];
-  // 恢复所有点的默认图标
-  restoreAllIcons();
-  if (currentClickEntity.billboard) {
-    const status = currentClickEntity?.properties?._customData?._value?.data.status;
-    currentClickEntity.billboard.image =
-      status === 1 || status === null ? activeIcon : getEventActiveImage(status);
-    currentClickEntity.billboard.scale = 1; // 可选缩放效果
-    activeEntity.value = currentClickEntity;
-  }
-  removeLabel();
-  viewer.scene.postRender.addEventListener(labelBoxUpdate);
-};
-
-// 事件初始化
-const handlerInit = () => {
-  if (handler) return;
-  handler = new Cesium.ScreenSpaceEventHandler(viewer?.scene.canvas);
-  handler.setInputAction(singleMachineEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK);
-};
-// 清除所有数据点实体
-const clearDataPoints = () => {
-  if (!viewer) return;
-  dataPointEntities.value.forEach(entity => {
-    viewer.entities.remove(entity);
-  });
-  dataPointEntities.value = [];
-  activeEntity.value = null;
-};
-const removeHandler = () => {
-  handler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
-  handler?.destroy();
-  handler = null;
-};
-
-const renderDataPoint = mapList => {
-  if (!viewer || !mapList?.length) return;
-  clearDataPoints();
-  mapList.forEach((item, index) => {
-    const entity = viewer?.entities.add({
-      id: `dataCenter-point-${index}-${Date.now()}`,
-      position: Cesium.Cartesian3.fromDegrees(
-        Number(item.metadata.shootPosition.lng),
-        Number(item.metadata.shootPosition.lat)
-      ),
-      label: {
-        font: '12pt Source Han Sans CN',
-        fillColor: Cesium.Color.WHITE,
-        outlineColor: Cesium.Color.BLACK,
-        outlineWidth: 2,
-        style: Cesium.LabelStyle.FILL_AND_OUTLINE,
-        verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
-        eyeOffset: new Cesium.Cartesian3(0, 0, -9),
-        pixelOffset: new Cesium.Cartesian2(0, 55),
-      },
-      billboard: {
-        image: item.status == null || item.status === 1 ? defaultIcon : getEventImage(item.status), // 初始为默认图标
-        width: 40,
-        height: 40,
-        pixelOffset: new Cesium.Cartesian2(0, -15),
-      },
-      properties: {
-        customData: {
-          data: item,
-        },
-      },
-    });
-    // 点击定位点位触发
-    if (props.dotData.id === item.id) {
-      currentClickEntity = entity;
-      activeEntity.value = entity;
-      singleMachineEvent();
-    }
-
-    dataPointEntities.value.push(entity);
-  });
-};
-const initMap = () => {
-  if (viewer || isMapInitialized.value) return;
-
-  const container = document.getElementById('dataCenterMap');
-  if (!container) {
-    console.error('地图容器未找到');
-    return;
-  }
-  try {
-    const publicCesiumInstance = new PublicCesium({
-      dom: 'dataCenterMap',
-      flatMode: false,
-      terrain: false,
-      mapFilter: true,
-      layerMode: 4
-    });
-    viewer = publicCesiumInstance.getViewer();
-    viewerRef.value = viewer;
-
-    isViewerReady.value = true;
-    // 初始化事件处理器
-    handlerInit();
-    isMapInitialized.value = true;
-    if (dataPointList.value.length > 0) {
-      renderDataPoint(dataPointList.value);
-    }
-  } catch (error) {
-    console.error('地图初始化失败:', error);
-  }
-};
-const flyToEntity = position => {
-  const longitude = Number(position.lng);
-  const latitude = Number(position.lat);
-  viewer?.camera.flyTo({
-    destination: Cesium.Cartesian3.fromDegrees(longitude, latitude, 1000),
-    duration: 1,
-    orientation: {
-      heading: Cesium.Math.toRadians(0.0),
-      pitch: Cesium.Math.toRadians(-90.0),
-      roll: 0.0,
-    },
-  });
-};
-
-// 地图接口
-const loading = ref(false);
-const getMapInfoAPIFun = async ids => {
-  try {
-    const res = await getMapInfoAPI(ids);
-    dataPointList.value = res.data.data || [];
-    if (isMapInitialized.value && viewer) {
-      renderDataPoint(dataPointList.value);
-    }
-  } catch (error) {
-    console.error('获取地图数据失败:', error);
-  }
-};
-const isViewerReady = ref(false);
-
-const initEntityOrPopup = data => {
-  //地图点在范围内
-  watch(
-    () => isMapInitialized.value,
-    ready => {
-      if (ready) {
-        flyToEntity(data.metadata.shootPosition);
-        labelBoxUpdate();
-      }
-    },
-    { deep: true, immediate: true } // 初始化时立即执行
-  );
-};
-watch(
-  () => props.jobId,
-  newVal => {
-    if (newVal) {
-      getMapInfoAPIFun(newVal);
-    }
-  },
-  { immediate: true }
-);
-
-// 监听对话框状态
-watch(isShow, newVal => {
-  if (newVal) {
-    nextTick(() => {
-      initMap();
-    });
-  } else {
-    // 清理资源
-    if (viewer) {
-      viewer.destroy();
-      viewer = null;
-    }
-    isMapInitialized.value = false;
-    removeHandler();
-    clearDataPoints();
-  }
-});
-
-onMounted(() => {});
-onBeforeUnmount(() => {
-  if (viewer) {
-    viewer.destroy();
-  }
-  removeHandler();
-  clearDataPoints();
-});
-
-// 暴露方法给父组件
-defineExpose({
-  initEntityOrPopup,
-});
-</script>
-
-<style>
-.mapDialog .el-dialog__body {
-  height: 700px !important;
-  padding: 0 !important;
-}
-</style>
-
-<style scoped lang="scss">
-.mapBox {
-  margin-top: 10px;
-  z-index: 2;
-  height: 650px;
-  width: 98%;
-  position: absolute;
-  left: 13px;
-  top: 50px;
-
-  #dataCenterMap {
-    width: 100%;
-    height: 100%;
-  }
-}
-.my-header :deep(.el-dialog__title) {
-  margin: 0 !important;
-  height: 19px;
-}
-
-.my-header {
-  display: flex;
-  align-items: center;
-
-  .el-button {
-    margin-left: 20px;
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/dataCenter/components/searchData.vue b/applications/task-work-order/src/views/dataCenter/components/searchData.vue
deleted file mode 100644
index 4b52f55..0000000
--- a/applications/task-work-order/src/views/dataCenter/components/searchData.vue
+++ /dev/null
@@ -1,499 +0,0 @@
-<template>
-  <div class="search-box-test">
-    <el-form :model="searchForm" inline>
-      <el-row :gutter="24">
-        <el-col :span="4">
-        <el-form-item label="行政区划:" >
-          <el-tree-select
-          :disabled="viewDetailsDisabled"
-            popper-class="custom-tree-select"
-            v-model="searchForm.areaCode"
-            :data="deptTreeData"
-            :default-expanded-keys="[searchForm.areaCode]"
-            check-strictly
-            node-key="id"
-            :props="treeProps"
-            @node-click="handleNodeClick"
-          />
-        </el-form-item>
-        </el-col>
-          <el-col :span="4">
-        <el-form-item label="所属机巢:">
-          <el-select
-          :disabled="viewDetailsDisabled"
-            :teleported="false"
-            v-model="searchForm.deviceSn"
-            placeholder="请选择"
-            clearable
-            @change="handleSearch"
-          >
-            <el-option
-              v-for="item in machineData"
-              :key="item.device_sn"
-              :label="item.nickname"
-              :value="item.device_sn"
-            />
-          </el-select>
-        </el-form-item>
-          </el-col>
-        <el-col :span="4">
-        <el-form-item label="任务名称:">
-          <el-input  :disabled="viewDetailsDisabled" v-model="searchForm.jobName" placeholder="请输入" clearable />
-        </el-form-item>
-        </el-col>
-        <el-col :span="8">
-        <el-form-item label="选择日期:">
-          <el-date-picker
-           :disabled="viewDetailsDisabled"
-            popper-class="custom-date-picker"
-            v-model="dateRange"
-            type="daterange"
-            :clearable="true"
-            range-separator="至"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-            :value-format="timeFormat"
-            @change="handleDateChange"
-            :popper-options="{
-              modifiers: [
-                {
-                  name: 'flip',
-                  options: {
-                    fallbackPlacements: ['bottom-start'], // 优先向下弹出
-                    allowedAutoPlacements: ['bottom-start'], // 禁止其他方向
-                  },
-                },
-              ],
-            }"
-          />
-        </el-form-item>
-        </el-col>
-        <el-col :span="4">
-        <el-form-item label="文件格式:">
-          <el-select
-          :disabled="foldersDisabled || viewDetailsDisabled"
-            :teleported="false"
-            v-model="searchForm.resultType"
-            placeholder="请选择"
-            clearable
-             @change="handleSearch"
-          >
-            <el-option
-              v-for="item in fileFormatOption"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-         :disabled="searchForm.photoType !== '' && item.value === '4'"
-            />
-          </el-select>
-        </el-form-item>
-        </el-col>
-        <el-col :span="4">
-        <el-form-item label="文件类别:">
-          <el-select
-
-            :disabled="disabled || foldersDisabled || viewDetailsDisabled"
-            :teleported="false"
-            v-model="searchForm.photoType"
-            placeholder="请选择"
-            clearable
-            @clear="changePhotoType"
-             @change="handleSearch"
-          >
-            <el-option
-              v-for="item in CategoryOption"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            />
-          </el-select>
-        </el-form-item>
-        </el-col>
-        <el-col :span="4">
-        <el-form-item label="文件名称:">
-          <el-input :disabled="foldersDisabled || viewDetailsDisabled" v-model="searchForm.name" placeholder="请输入" clearable />
-        </el-form-item>
-        </el-col>
-        <el-col :span="4">
-          <el-button :disabled="viewDetailsDisabled" type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button>
-          <el-button :disabled="viewDetailsDisabled" icon="el-icon-refresh" @click="handleReset">重置</el-button>
-        </el-col>
-      </el-row>
-      <div class="search-first">
-        <div class="search-btn">
-<!--          <el-button type="primary" icon="el-icon-download" @click="allDownloadFun"-->
-<!--            >全部下载</el-button-->
-<!--          >-->
-        <el-button v-if="!viewDetailsDisabled" type="primary" plain  @click="handleswitchFolders" ><el-icon><FolderOpened /></el-icon></el-button>
-          <div class="downloadBtn" @click="htsjzx === 100 && downloadFun()">
-            <el-progress v-if="htsjzx !== 100" :percentage="htsjzx" :show-text="false" striped striped-flow :duration="1" />
-            <div class="downloadBtnText">
-              <span v-if="htsjzx === 100">下载</span>
-              <template v-else>
-                处理中<el-icon @click="cancelDownload"><CircleClose /></el-icon>
-              </template>
-            </div>
-          </div>
-           <el-button v-if="viewDetailsDisabled" type="primary" plain  @click="handleBack" >返回</el-button>
-        </div>
-      </div>
-    </el-form>
-  </div>
-</template>
-
-<script setup>
-import { pxToRem } from '@/utils/rem';
-import { ElMessage } from 'element-plus';
-import dayjs from 'dayjs';
-import { useStore } from 'vuex';
-import { getRegionTreeAll, getDeviceRegion, deptsByAreaCode } from '@/api/job/task';
-import { watch } from 'vue';
-import { cancelDownloadApi, getDownloadStatusApi } from '@/api/dataCenter/dataCenter';
-import EventBus from '@/utils/eventBus';
-const store = useStore();
-const userAreaCode = computed(() => store.getters.userInfo.detail.areaCode);
-const selectedAreaCode = computed(() => store.state.user.selectedAreaCode);
-const htsjzx = computed(() => store.state.common.downloadProgress?.htsjzx || 100)
-const emit = defineEmits(['search', 'Reset','downFun', 'allDownFun','handleswitchFolders','handleBack']);
-const startTime = dayjs().subtract(6, 'day').startOf('day');
-const endTime = dayjs().endOf('day');
-const timeRange = [startTime.format('YYYY-MM-DD HH:mm:ss'), endTime.format('YYYY-MM-DD HH:mm:ss')];
-const dateRange = ref(timeRange);
-const timeFormat = 'YYYY-MM-DD HH:mm:ss';
-const props = defineProps(['searchjobId','switchFolders','viewDetails'])
-const searchForm = reactive({
-  jobName: '', //任务名称
-  name: '', //文件名称
-  areaCode: userAreaCode.value, // 区域code
-  endTime: endTime.format(timeFormat), // 结束时间
-  startTime: startTime.format(timeFormat), // 开始时间
-  deviceSn: '', // 所属机巢
-  resultType: '', //文件格式
-  photoType: '', //文件类别
-  wayLineJobId:''
-});
-const disabled = ref(false);
-const treeProps = {
-  label: 'name',
-  value: 'id',
-  children: 'childrens',
-};
-const fileFormatOption = [
-  {
-    value: '',
-    label: '全部',
-  },
-  {
-    value: '0',
-    label: '照片',
-  },
-  {
-    value: '1',
-    label: '视频',
-  },
-  {
-    value: '2',
-    label: 'AI识别',
-  },
-  {
-    value: '5',
-    label: '全景',
-
-  },
-  {
-    value: '4',
-    label: '正射',
-
-  },
-];
-const CategoryOption = [
-  {
-    value: 'visible',
-    label: '可见光',
-  },
-  {
-    value: 'ir',
-    label: '红外',
-  },
-];
-watch(
-  () => searchForm.resultType,
-  newVal => {
-    if (newVal === '4') {
-      disabled.value = true;
-    } else {
-      disabled.value = false;
-    }
-  },
-  { deep: true }
-);
-watch(() => props.searchjobId, (newVal) => {
-  searchForm.wayLineJobId = newVal;
-  handleSearch()
-});
-const foldersDisabled  = ref(false)
-watch(() => props.switchFolders, (newVal) => {
-if(newVal === true){
-  foldersDisabled.value = true
-}else{
-   foldersDisabled.value = false
-}
-});
-const viewDetailsDisabled  = ref(false)
-watch(() => props.viewDetails, (newVal) => {
-if(newVal === true){
-  viewDetailsDisabled.value = true
-}else{
-   viewDetailsDisabled.value = false
-}
-});
-const changePhotoType =(val)=>{
-if(val === undefined){
-  searchForm.photoType = ''
-}
-}
-// 部门
-let deptTreeData = ref([]);
-// 机巢
-let machineData = ref([]);
-let deptData = ref([]);
-// 从单机巢任务传参值
-const signDevice_sn = ref('');
-// 日期限制
-const handleDateChange = val => {
-  if (val && val.length === 2) {
-    const start = dayjs(val[0]);
-    const end = dayjs(val[1]);
-    const diff = end.diff(start, 'day');
- const maxDays = 365;
-    if (diff > maxDays) {
-      ElMessage.warning('日期范围不能超过一年');
-      dateRange.value = [];
-      // 重置为默认时间范围
-      setTimeout(() => {
-        dateRange.value = timeRange;
-      }, 0);
-      return;
-    }
-
-    // 更新搜索表单中的时间
-    searchForm.startTime = start.format(timeFormat);
-    searchForm.endTime = end.format(timeFormat);
-    handleSearch()
-  }
-};
-// 部门下得机巢
-const requestDockInfo = () => {
-  getRegionTreeAll({ parentCode: userAreaCode.value }).then(res => {
-    deptTreeData.value = res.data.data ? [res.data.data] : [];
-    handleNodeClick({ id: userAreaCode.value });
-  });
-};
-const handleNodeClick = async data => {
-  // 处理机巢数据
-  searchForm.deviceSn = '';
-  machineData.value = '';
-  const droneList = await getDeviceRegion({ areaCode: data.id });
-  machineData.value = droneList?.data?.data;
-
-  // 默认选中值
-  if (signDevice_sn.value) {
-    searchForm.deviceSn = signDevice_sn.value;
-  }
-  // 所属部门重新请求值
-  deptData.value = [];
-  getDeptsByAreaCode();
-  handleSearch();
-
-};
-// 所属部门信息
-const getDeptsByAreaCode = () => {
-  deptsByAreaCode(searchForm.areaCode).then(res => {
-    if (res.code !== 0) {
-      deptData.value = res.data.data;
-    }
-  });
-};
-// 搜索
-const handleSearch = () => {
-  if (!dateRange.value) {
-    dateRange.value = [];
-  }
-  let params = {
-    ...searchForm,
-    startTime: dateRange.value.length
-      ? dayjs(dateRange?.value[0]).startOf('day').format(timeFormat)
-      : null,
-    endTime: dateRange.value.length
-      ? dayjs(dateRange?.value[1]).endOf('day').format(timeFormat)
-      : null,
-  };
-  // 调用父组件方法
-  emit('search', params);
-};
-// 清空
-const handleReset = () => {
-  dateRange.value = timeRange;
-  searchForm.jobName = '';
-  searchForm.name = '';
-  searchForm.areaCode = userAreaCode.value;
-  searchForm.endTime = endTime.format(timeFormat);
-  searchForm.startTime = startTime.format(timeFormat);
-  searchForm.deviceSn = '';
-  searchForm.resultType = '';
-  searchForm.photoType = '';
-  searchForm.wayLineJobId=''
-  handleNodeClick({ id: userAreaCode.value });
-  handleSearch();
-   emit('Reset', searchForm);
-};
-// 下载
-const downloadFun = () => {
-  emit('downFun');
-};
-// 全部下载
-const allDownloadFun = () => {
-  emit('allDownFun');
-};
-
-function cancelDownload() {
-  cancelDownloadApi({ type:'htsjzx' }).then(res =>{
-    ElMessage.success('取消成功')
-  }).catch(e =>{
-    EventBus.emit('useGlobalWS-messageHandler', {biz_code: 'DOWNLOAD_PROGRESS',data:{status: 'CANCELLED',type:'htsjzx'}})
-  })
-}
-// 切换文件夹
-const handleswitchFolders =()=>{
-  emit('handleswitchFolders');
-}
-// 返回按钮
-const handleBack = ()=>{
-  emit('handleBack');
-}
-onMounted(() => {
-  requestDockInfo();
-  getDownloadStatusApi({type: 'htsjzx'}).then(res =>{
-    if (!['CANCELLED','COMPLETED'].includes(res.data.data?.status || 'COMPLETED')){
-      EventBus.emit('useGlobalWS-messageHandler',res.data.data)
-    }
-  })
-});
-
-defineExpose({
-  handleReset,
-});
-</script>
-
-<style scoped lang="scss">
-.search-box-test {
-  transition: all 0.3s;
-
-  .search-first {
-    display: flex;
-    flex-wrap: wrap;
-    align-items: center;
-    gap: 20px 7px; // 设置行间距和列间距
-    margin-bottom: 10px;
-    justify-content: space-between;
-
-    .search-btn {
-    display: flex;
-    align-items: center;
-      margin-right: 32px;
-
-      .downloadBtn{
-      margin:0 10px;
-        position: relative;
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        height: 28px;
-        padding: 0 15px;
-        background: rgb(239.8,248.9,235.3);
-        border-radius: 4px 4px 4px 4px;
-        border: 1px solid rgb(179,224.5,156.5);
-        cursor: pointer;
-        color: #67c23a;
-        font-size: 14px;
-
-        .downloadBtnText{
-          display: flex;
-          align-items: center;
-          gap: 5px;
-          z-index: 5;
-        }
-        .el-progress{
-          height: 100%;
-          position: absolute;
-          left: 0;
-          top: 0;
-          width: 100%;
-
-          :deep(){
-            .el-progress-bar__outer{
-              height: 26px !important;
-              border-radius: 0 !important;
-              background: transparent !important;
-
-              .el-progress-bar__inner{
-                border-radius: 0 !important;
-                background-color: #e5ffd9;
-              }
-            }
-          }
-        }
-
-      }
-
-    }
-    .time-card {
-      text-align: center;
-      background: #ffffff;
-      border-radius: 4px 0px 0px 4px;
-      border: 1px solid #e5e5e5;
-      font-family: Source Han Sans CN, Source Han Sans CN;
-      font-weight: 400;
-      font-size: 14px;
-      color: #7c8091;
-      display: flex;
-      height: 32px;
-
-      .card-item {
-        width: 60px;
-        height: 100%;
-        line-height: 32px;
-        cursor: pointer;
-      }
-
-      .active {
-        background: #ffffff;
-        border-radius: 0px 0px 0px 0px;
-        border: 1px solid #1c5cff;
-        color: #1441ff;
-      }
-    }
-  }
-
-  :deep(.el-form) {
-    :deep(.el-input__wrapper.is-disabled) {
-      box-shadow: 0 0 0 1px #026ad6;
-    }
-
-    .el-form-item {
-      //margin-bottom: 0;
-      width: 100%;
-
-      .el-form-item__label {
-        color: #363636;
-        line-height: 32px;
-        width: 80px;
-      }
-      .el-form-item__content {
-        display: flex;
-        flex: 1;
-      }
-    }
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/dataCenter/dataCenter.vue b/applications/task-work-order/src/views/dataCenter/dataCenter.vue
deleted file mode 100644
index 0da6d52..0000000
--- a/applications/task-work-order/src/views/dataCenter/dataCenter.vue
+++ /dev/null
@@ -1,1225 +0,0 @@
-<template>
-  <div
-    class="manage-m-all-10 manage-m-t-0 manage-p-all-20 manage-h-0 manage-flex-1 manage-flex manage-f-d-c manage-b-r-5 manage-b-c-w"
-  >
-    <div class="dataCenter-table">
-      <searchData
-      ref="searchBoxRef"
-      :searchjobId="searchjobId"
-      :switchFolders="switchFolders"
-        @search="searchClick"
-        @downFun="downloadFile"
-        @allDownFun="aLLDownloadFile"
-        @handleswitchFolders="handleswitchFolders"
-        @handleBack ="handleBack"
-       :viewDetails ="viewDetails"
-
-      ></searchData>
-      <!-- 文件夹 -->
-      <div v-if="switchFolders" class="dataTable">
-            <el-table
-            border
-         class="custom-header custom-body"
-          v-loading="loadings"
-          element-loading-text=""
-          :data="folderList"
-            @selection-change="foldersSelectionChange"
-        >
-          <el-table-column type="selection" width="55" />
-          <el-table-column label="序号" type="index" width="60">
-            <template #default="{ $index }">
-              {{
-                ($index + 1 + (FolderListParams.page - 1) * FolderListParams.page_size)
-                  .toString()
-                  .padStart(2, '0')
-              }}
-            </template>
-          </el-table-column>
-          <el-table-column property="name" label="任务名称" show-overflow-tooltip />
-           <el-table-column property="regionName" label="所属区域">
-             <template #default="scope">
-              <span>{{scope.row.city_name ? scope.row.city_name :'--'}},{{scope.row.area_name ? scope.row.area_name :'--'}}</span>
-            </template>
-            </el-table-column>
-          <el-table-column property="nickname" label="所属机巢" >
-             <template #default="scope">
-              <span>{{scope.row.nickname ? scope.row.nickname :'--'}}</span>
-            </template>
-            </el-table-column>
-          <el-table-column label="操作" align="center">
-            <template #default="scope">
-              <el-button icon="el-icon-view" type="text" @click="foldersOpen(scope.row)"
-                >查看</el-button
-              >
-            </template>
-          </el-table-column>
-              <template #empty>
-                <el-empty
-                  class="custom-empty"
-                  :image-size="100"
-                >
-                  <template #description>
-                    <span class="custom-text">暂无数据</span>
-                  </template>
-                </el-empty>
-              </template>
-        </el-table>
-      </div>
-      <!-- 表格部分 -->
-      <div class="dataTable" v-else>
-        <el-table
-        border
-          v-loading="loadings"
-          element-loading-text=""
-          :data="tableData"
-          class="custom-header"
-          @selection-change="handleSelectionChange"
-          @cell-click="handleCellClick"
-        >
-          <el-table-column type="selection" width="55" />
-          <el-table-column label="序号" type="index" width="60">
-            <template #default="{ $index }">
-              {{
-                ($index + 1 + (jobListParams.current - 1) * jobListParams.size)
-                  .toString()
-                  .padStart(2, '0')
-              }}
-            </template>
-          </el-table-column>
-          <el-table-column prop="regionName" label="所属区域" v-if="!isDistrictLevel">
-            <template #default="scope">
-              <span>{{ processAddress(scope.row.regionName) }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column property="nestName" label="所属机巢" />
-          <el-table-column property="jobName" label="任务名称" show-overflow-tooltip />
-          <el-table-column prop="nickName" label="文件名称" width="160">
-            <template #default="scope">
-              <el-tooltip-copy :content="scope.row.nickName" :showCopyText="true">
-                {{scope.row.nickName}}
-              </el-tooltip-copy>
-            </template>
-          </el-table-column>
-
-          <el-table-column property="link" label="缩略图" width="120">
-            <template #default="scope">
-             <div v-if="scope.row?.resultType === 5" class="videoItem1">
-               <img
-                class="quanjing"
-                @click="clickpanorama(scope.row)"
-                
-                :src="scope.row?.smallUrl"
-                alt=""
-              />
-             </div>
-              <!-- 视频 -->
-              <div v-else-if="scope.row?.resultType === 1" class="videoItem1">
-                <img
-                  :src="convertVideoUrlToThumbnail(scope.row?.link)"
-                  alt=""
-                  class="imageBox"
-                  @click="enterFullScreen(scope.row)"
-                />
-                <img
-                  class="playBox"
-                  @click="enterFullScreen(scope.row)"
-                  src="@/assets/images/dataCenter/videoplay.png"
-                  alt=""
-                />
-              </div>
-              <!-- 正射 -->
-              <div v-else-if="scope.row?.resultType === 4" class="videoItem1">
-                <el-image
-                
-                :src="getzsSmallImg(scope.row?.link)"
-                :preview-src-list="[getzsSmallImg(scope.row?.link)]"
-                fit="cover"
-                preview-teleported
-              />
-              </div>
-              <div v-else class="videoItem1">
-                <el-image            
-                :src="scope.row?.smallUrl"
-                :preview-src-list="[scope.row?.showUrl]"
-                fit="cover"
-                preview-teleported
-              />
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column prop="jobTime" label="任务时间" />
-          <el-table-column property="photoType" label="文件类别">
-            <template #default="scope">
-              <span>{{
-                photoTypeMap[scope.row.photoType] ? photoTypeMap[scope.row.photoType] : '--'
-              }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column property="resultType" label="文件格式">
-            <template #default="{ row }">
-              <span>{{ resultTypeMap[row?.resultType] }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column label="操作" width="200" align="center">
-            <template #default="scope">
-              <el-button icon="el-icon-view" type="text" @click="lookDetail(scope.row)"
-                >查看</el-button
-              >
-              <el-button
-                v-if="scope.row.resultType !== 2"
-                icon="el-icon-delete"
-                type="text"
-                @click="deleteDetail(scope.row)"
-                >删除</el-button
-              >
-              <el-button
-                v-if="shouldShowLocation(scope.row)"
-                type="text"
-                @click="positionDetail(scope.row)"
-              >
-                <img :src="positionicon" class="custom-icon" />定位</el-button
-              >
-            </template>
-          </el-table-column>
-          <template #empty>
-            <el-empty
-              class="custom-empty"
-              :image-size="100"
-            >
-              <template #description>
-                <span class="custom-text">暂无数据</span>
-              </template>
-            </el-empty>
-          </template>
-        </el-table>
-      </div>
-      <!-- 分页 -->
-      <div class="pagination" v-if="!switchFolders ? tableData.length > 0 : folderList.length > 0">
-         <el-pagination
-      :current-page="switchFolders ? FolderListParams.page : jobListParams.current"
-      :page-size="switchFolders ? FolderListParams.page_size : jobListParams.size"
-      :page-sizes="[10, 20, 30, 40]"
-      background
-       layout="total, sizes, prev, pager, next, jumper"
-      :total="total"
-      @size-change="handleSizeChange"
-      @current-change="handleCurrentChange"
-    />
-      </div>
-      <!-- 查看弹框 -->
-      <el-dialog
-        v-model="dialogVisible"
-        class="ztzf-dialog-mange"
-        width="60%"
-        append-to-body
-        @close="dialogClose"
-        align-center
-      >
-        <template #header="{ titleId, titleClass }">
-          <div class="my-header">
-            <!-- <h4 :id="titleId" :class="titleClass">{{ detailTitle }}</h4> -->
-            <h4 :id="titleId" :class="titleClass">详情</h4>
-          </div>
-        </template>
-        <div class="detailContainer">
-          <div class="leftImg">
-            <!-- 视频 -->
-            <video
-              v-if="dialogDetailList?.resultType === 1"
-              style="width: 100%"
-              class="videoItem"
-              ref="videoRefs"
-              controls
-             
-              :src="dialogDetailList.link"
-            ></video>
-            <!-- 地图 -->
-            <div
-              v-else-if="dialogDetailList?.resultType === 4"
-              id="detaildataCenterMap"
-              class="ztzf-cesium"
-            ></div>
-            <img v-else :src="getSmallImg(dialogDetailList?.link)" alt="" />
-          </div>
-          <div class="rightDetail">
-            <div class="title">
-              <div class="inputEdit">
-                文件名称:<span class="fileTitle" v-if="!dialogDetailList?.checkedinput">{{
-                  dialogDetailList?.nickName ? dialogDetailList?.nickName : '--'
-                }}</span>
-                <el-input
-                  v-else
-                  v-model="dialogDetailList.nickName"
-                  @blur="saveTitle(dialogDetailList)"
-                  @keyup.enter="saveTitle(dialogDetailList)"
-                  class="title-input"
-                  clearable
-                />
-                <span class="editname" @click="editTitle(dialogDetailList)"
-                  ><el-icon> <Edit /> </el-icon
-                ></span>
-              </div>
-            </div>
-            <div>任务名称:{{ dialogDetailList?.jobName ? dialogDetailList?.jobName : '--' }}</div>
-            <div>
-              所属区域:{{ dialogDetailList?.regionName ? dialogDetailList?.regionName : '--' }}
-            </div>
-            <div>
-              拍摄机巢:{{ dialogDetailList?.nestName ? dialogDetailList?.nestName : '--' }}
-            </div>
-            <div v-if="dialogDetailList?.resultType == 0">
-              照片位置:{{ _.round(dialogDetailList?.longitude, 3) }},{{
-                _.round(dialogDetailList?.latitude, 3)
-              }}
-            </div>
-            <div>任务时间:{{ dialogDetailList?.jobTime ? dialogDetailList?.jobTime : '--' }}</div>
-            <div>
-             {{ dialogDetailList?.resultType === 2 ?'识别' :'拍摄'}}时间:{{ dialogDetailList?.createTime ? dialogDetailList?.createTime : '--' }}
-            </div>
-            <div>
-              文件类型:{{
-                photoTypeMap[dialogDetailList?.photoType]
-                  ? photoTypeMap[dialogDetailList?.photoType]
-                  : '--'
-              }}
-            </div>
-            <div>
-              文件格式:{{
-                resultTypeMap[dialogDetailList?.resultType]
-                  ? resultTypeMap[dialogDetailList?.resultType]
-                  : '--'
-              }}
-            </div>
-            <div>
-              文件大小:{{
-                bytesToMB(dialogDetailList?.attachSize)
-                  ? bytesToMB(dialogDetailList?.attachSize)
-                  : '--'
-              }}
-            </div>
-            <div>
-              <el-button
-                type="success"
-                plain
-                icon="el-icon-download"
-                @click="detailDownLoad(dialogDetailList)"
-                >下载</el-button
-              >
-            </div>
-          </div>
-        </div>
-      </el-dialog>
-      <!-- 全景预览 -->
-      <PanoramaPopup
-        v-model:panoramaParamsShow="panoramaParamsShow"
-        v-model:panoramaParamsUrl="panoramaParamsUrl"
-      >
-      </PanoramaPopup>
-      <!-- 视频预览 -->
-      <el-dialog
-        :title="currentVideoTitle"
-        class="ztzf-dialog-mange"
-        modal-class="videoDialog"
-        append-to-body
-        width="54%"
-        v-model="VideoShow"
-        :close-on-click-modal="false"
-        :destroy-on-close="true"
-        @close="currentVideoIndex = -1"
-      >
-        <div class="video-container">
-          <video
-            style="width: 100%;height: 500px"
-            class="videoBox"
-            ref="videoRefs"
-            controls
-           preload="auto"
-              @play="handleVideoPlay"
-              @ended="handleVideoEnded(index)"
-            :src="currentVideoUrl"
-          ></video>
-        </div>
-      </el-dialog>
-      <!-- 地图弹框 -->
-      <dataCenterMap
-        ref="mapComponent"
-        v-model:show="dataCenterMapVisible"
-        :jobId="jobId"
-        @lookDetail="lookDetail"
-        :dotData="mapList"
-      ></dataCenterMap>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import fileimg from '@/assets/images/dataCenter/filePackage.png'
-import { getShowImg, getSmallImg, getzsSmallImg } from '@/utils/util';
-import { onMounted, watch } from 'vue';
-import dayjs from 'dayjs';
-import ElTooltipCopy from '@/components/ElTooltipCopy.vue';
-import videoplay from '@/assets/images/dataCenter/videoplay.png';
-import positionicon from '@/assets/images/dataCenter/positionicon.png';
-import { useStore } from 'vuex';
-import { PublicCesium } from '@/utils/cesium/publicCesium';
-import { Cartesian3 } from 'cesium';
-import * as Cesium from 'cesium';
-import EventPopUpBox from '@/hooks/components/EventPopUpBox.vue';
-import { nextTick, render } from 'vue';
-import defaultIcon from '@/assets/images/dataCenter/datamap/eventCompleted.png';
-import EventBus from '@/utils/eventBus';
-import dataCenterMap from '@/views/dataCenter/components/dataCenterMap.vue';
-import PanoramaPopup from '@/components/PanoramaPopup/PanoramaPopup.vue'; //全景
-import { ElMessage, ElMessageBox, ElLoading } from 'element-plus';
-import searchData from '@/views/dataCenter/components/searchData.vue';
-import fy1 from '@/assets/images/dataCenter/1.jpeg';
-import _ from 'lodash';
-import {
-  getaiImagesPageAPI,
-  getAttachInfoAPI,
-  deleteFileMultipleApi,
-  downloadApi,
-  updataTitleApi,
-  getOrthoimageInfo, getDownloadStatusApi,getJobIdsBySnApi
-} from '@/api/dataCenter/dataCenter';
-const userInfo = computed(() => store.getters.userInfo);
-const isShow = defineModel('show');
-const viewerRef = shallowRef(null);
-let viewer = null;
-const viewInstance = shallowRef(null);
-const store = useStore();
-const currentAreaPosition = ref({ height: 1987280, latitude: 27.636112, longitude: 115.732975 });
-let handler = null;
-const switchFolders = ref(false)
-// 视频播放事件处理
-const handleVideoPlay = (event) => {
-  if (event.target.playbackRate !== 0.75) {
-    event.target.playbackRate = 0.75
-
-  }
-}
-const handleVideoEnded = index => {
-  // 获取当前视频
-  const video = videoRefs.value[index]
-
-  // 重置视频播放时间为 0
-  video.currentTime = 0
-
-  // 重新加载视频
-  video.load()
-}
-function bytesToMB(bytes, decimalPlaces = 2) {
-  if (typeof bytes !== 'number' || bytes < 0) return '0';
-  return (bytes / 1048576).toFixed(decimalPlaces) + ' MB';
-}
-// 视频一帧
-function convertVideoUrlToThumbnail(videoUrl) {
-  // 检查是否是有效的视频URL
-  if (!videoUrl || typeof videoUrl !== 'string') {
-    return videoUrl;
-  }
-  // 替换文件扩展名
-  const thumbnailUrl = videoUrl.replace(/\.mp4$/, '_small.jpg');
-  return thumbnailUrl;
-}
-const resultTypeMap = {
-  0: '照片',
-  1: '视频',
-  2: 'AI识别',
-  5: '全景',
-  4: '正射',
-};
-const photoTypeMap = {
-  visible: '可见光',
-  ir: '红外',
-};
-// 判断省市区
-const areaCode = userInfo.value?.detail?.areaCode || '';
-// 判断账号级别
-const isProvinceLevel = computed(() => areaCode.endsWith('00000000')); // 省级:后8位为0
-const isCityLevel = computed(() => !isProvinceLevel.value && areaCode.endsWith('000000')); // 市级:后6位为0
-const isDistrictLevel = computed(() => !isProvinceLevel.value && !isCityLevel.value); // 区县级
-
-// 处理区域名称的函数
-function processAddress(str) {
-  if (!str) return '';
-  const parts = str.split(',');
-  // 省级账号:显示市和区(去除省级)
-  if (isProvinceLevel.value) {
-    return parts.filter(part => !part.endsWith('省')).join(',');
-  }
-  // 市级账号:只显示区(去除省和市)
-  if (isCityLevel.value) {
-    return parts.filter(part => !part.endsWith('省') && !part.endsWith('市')).join(',');
-  }
-  // 区县级账号:不显示区域信息(在模板中已隐藏该列)
-  return '';
-}
-const showRegionColumn = computed(() => {
-  // 是否显示列
-  return tableData.value.some(row => {
-    const processed = processAddress(row.regionName || '');
-    return processed !== '';
-  });
-});
-const loadings = ref(true);
-let loading;
-const total = ref(0);
-const startTime = dayjs().subtract(6, 'day').startOf('day');
-const endTime = dayjs().endOf('day');
-const timeRange = [startTime.format('YYYY-MM-DD HH:mm:ss'), endTime.format('YYYY-MM-DD HH:mm:ss')];
-// 全景预览
-const panoramaParamsShow = ref(false);
-const panoramaParamsUrl = ref(null);
-const clickpanorama = val => {
-  panoramaParamsShow.value = true;
-  panoramaParamsUrl.value = val.link;
-};
-// 视频
-const currentVideoTitle = ref('');
-const VideoShow = ref(false);
-const currentVideoUrl = ref(null);
-const enterFullScreen = val => {
-  currentVideoTitle.value = val?.nickName;
-  currentVideoUrl.value = val?.link;
-  VideoShow.value = true;
-};
-const jobListParams = reactive({
-  current: 1,
-  size: 10,
-  orderByCreateTime: true,
-  searchParams: { startTime: timeRange[0], endTime: timeRange[1] },
-});
-const FolderListParams = reactive({
-    page: 1,
-    page_size: 10,
-    startTime: jobListParams.searchParams.startTime?.slice(0, 10),
-    endTime: jobListParams.searchParams.endTime?.slice(0, 10),
-     waylineName:'',
-    dockSn:'',
-    areaCode:''
-});
-const tableData = ref([]);
-// 获取列表数据
-const getaiImagesPage = () => {
-  loadings.value = true;
-  const params = {
-    orderByCreateTime: jobListParams.orderByCreateTime,
-    ...jobListParams.searchParams,
-  };
-  if( searchjobId.value === ''){
-    params.wayLineJobId = ''
-  }
-  getaiImagesPageAPI(params, {
-    current: jobListParams.current,
-    size: jobListParams.size,
-  })
-    .then(res => {
-      total.value = res.data.data.total;
-      tableData.value = res.data.data.records.map(i => ({
-        ...i,
-        checked: false,
-        url: i?.link,
-        smallUrl: getSmallImg(i?.link),
-        showUrl: getShowImg(i?.link),
-        file_name: i.name.split('/').pop(),
-      }));
-    })
-    .catch(error => {
-      console.error('获取数据失败:', error);
-    })
-    .finally(() => {
-      loadings.value = false;
-    });
-};
-
-const folderList = ref([])
-// 获取文件夹数据
-const getFolderList=()=>{
-    loadings.value = true;
-    const apiParams = {
-      ...FolderListParams,
-      };
-    getJobIdsBySnApi(apiParams)
-		.then(res => {
-    folderList.value = res.data.data.records.map(i => ({ ...i, checked: false }))
-    total.value = res.data.data.total
-
-		})
-		.finally(() => {
-		  loadings.value = false;
-		})
-}
-const searchjobId = ref('')
-const viewDetails = ref('')
-// 文件夹查看
-const foldersOpen = (val)=>{
-    loadings.value = true;
-    tableData.value=[]
-    searchjobId.value = val.job_id
-    switchFolders.value = false
-    viewDetails.value = true
-}
-// 获取数据时使用各自的分页参数
-const fetchData = () => {
-  if (switchFolders.value) {
-    getFolderList();
-  } else {
-    getaiImagesPage();
-  }
-};
-// 切换文件夹
- const handleswitchFolders = () => {
- searchjobId.value = ''
-     switchFolders.value = !switchFolders.value;
-     jobListParams.current = 1;
-     FolderListParams.page = 1;
-
-     searchBoxRef.value?.handleReset();
-      fetchData();
-   };
-   const handleBack =()=>{
-    searchjobId.value = ''
-    switchFolders.value = true
-    viewDetails.value = false
-    jobListParams.current = 1;
-    FolderListParams.page = 1;
-     fetchData();
-
-   }
-   const searchBoxRef = ref(null);
-
-// 查询
-const searchClick = params => {
-  if(switchFolders.value){
-    FolderListParams.page = 1;
-    FolderListParams.page_size = 10;
-    FolderListParams.startTime = params?.startTime?.slice(0, 10);
-    FolderListParams.endTime = params?.endTime?.slice(0, 10);
-    FolderListParams.waylineName=params?.jobName,
-   FolderListParams.dockSn = params?.deviceSn
-   FolderListParams.areaCode = params?.areaCode
-    getFolderList()
-  }else{
-     jobListParams.current = 1;
-      jobListParams.size = 10;
-      jobListParams.searchParams = {
-      ...jobListParams.searchParams,
-      ...params
-    };
-    getaiImagesPage()
-  }
-};
-const handleSizeChange = (val) => {
-  if (switchFolders.value) {
-    FolderListParams.page_size = val;
-  } else {
-    jobListParams.size = val;
-  }
-  fetchData();
-};
-const handleCurrentChange = (val) => {
-  if (switchFolders.value) {
-    FolderListParams.page = val;
-  } else {
-    jobListParams.current = val;
-  }
-  fetchData();
-};
-// 多选
-const selectedRows = ref([]);
-const handleSelectionChange = val => {
-  // 更新选中状态
-  tableData.value.forEach(item => {
-    item.checked = val.some(selected => selected.id === item.id);
-  });
-  selectedRows.value = val;
-};
-// 文件夹多选
-const foldersSelectedRows = ref([]);
-const foldersSelectionChange =(val)=>{
- folderList.value.forEach(item => {
-    item.checked = val.some(foldersselected => foldersselected.id === item.id);
-  });
-  foldersSelectedRows.value = val;
-}
-// 删除
-const deleteDetail = val => {
-  ElMessageBox.confirm('您确定删除吗?', '提示', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning',
-  })
-    .then(() => {
-      deleteFileMultipleApi(val.id)
-        .then(res => {
-          ElMessage.success('删除成功');
-          getaiImagesPage();
-        })
-        .catch(error => {
-          ElMessage.error('删除失败');
-        });
-    })
-    .catch(() => {});
-};
-// url下载
-function aLinkDownload(url, name) {
-  const a = document.createElement('a');
-  a.style.display = 'none';
-  a.href = url;
-  a.download = name;
-  document.body.appendChild(a);
-  a.click();
-  document.body.removeChild(a);
-}
-const fileDownload = async () => {
-  const list = selectedRows.value.filter(i => i.checked);
-  if (!list?.length) return ElMessage.warning('请选择文件');
-  if (list.length === 1) {
-    list.forEach((item, index) => {
-      const suffix = item.url.split('.').pop();
-      aLinkDownload(item.url, item.nickName + '.' + suffix);
-    });
-  } else {
-    loading = ElLoading.service({ background: 'rgba(0, 0, 0, 0.5)', text: '打包中,请稍等...' });
-    const fileIds = list.map(i => i.id);
-    let aaa = {
-      areaCode: '',
-      attachIds: fileIds,
-      dockSn: '',
-      endTime: '',
-      fileName: '',
-      fileType: '',
-      jobName: '',
-      resultType: '',
-      startTime: '',
-      type:'htsjzx'
-    };
-    const res = await getDownloadStatusApi({type: 'htsjzx'})
-    if (!['CANCELLED','COMPLETED'].includes(res.data.data?.status || 'COMPLETED')){
-      loading.close()
-      return ElMessage.warning('还有正在处理的')
-    }
-    downloadApi(aaa).finally(res => {
-      loading.close();
-    });
-  }
-};
-// 文件夹打包下载
-async function folderDownload() {
-	const jobId =  foldersSelectedRows.value.filter(i => i.checked).map(i => i.job_id)
-	if (!jobId?.length) return ElMessage.warning('请选择文件夹')
-	const res = await getDownloadStatusApi({type: 'dpsjzx'})
-	if (!['CANCELLED','COMPLETED'].includes(res.data.data?.status || 'COMPLETED')){
-		return ElMessage.warning('还有正在处理的')
-	}
-	await downloadApi({ wayLineJobIds:jobId, withFolder: true, resultType: 0, type:'htsjzx' })
-}
-// 下载
-const downloadFile = () => {
- switchFolders.value?folderDownload(): fileDownload();
-};
-const detailDownLoad = val => {
-  const suffix = val.link?.split('.').pop();
-  aLinkDownload(val.link, val?.nickName + '.' + suffix);
-};
-// 全部下载
-const aLLDownloadFile = () => {
-  loading = ElLoading.service({ background: 'rgba(0, 0, 0, 0.5)', text: '打包中,请稍等...' });
-
-  const params = {
-    ...jobListParams.searchParams,
-  };
-  params.areaCode = '';
-  downloadApi(params).then(res => {
-    aLinkDownload(res.data.data, `sjzx-file-pack-${dayjs().format('YYYYMMDDHHmmss')}.zip`);
-    loading.close();
-  });
-};
-// 地图弹框
-const mapComponent = ref(null); // 创建子组件引用
-const mapList = ref(null);
-const dataCenterMapVisible = ref(false);
-const jobId = ref('');
-const statusType = ref(null);
-const positionDetail = val => {
-  jobId.value = val.wayLineJobId;
-  mapList.value = val;
-  dataCenterMapVisible.value = true;
-  // 确保地图组件加载完成
-  nextTick(() => {
-    if (mapComponent.value) {
-      // 调用子组件方法并传递数据
-      mapComponent.value.initEntityOrPopup(val);
-    }
-  });
-};
-
-const fileNameedit = ref('');
-// 编辑文件名
-const editTitle = val => {
-  val.checkedinput = true;
-  fileNameedit.value = val?.nickName;
-};
-
-// 通用空值检查函数
-const validateNickname = (name, fieldName) => {
-  if (!name || name.trim() === '') {
-    ElMessage.warning(`${fieldName}不能为空`);
-    return false;
-  }
-  if (name.length > 50) {
-    ElMessage.warning(`${fieldName}不能超过50个字符`);
-    return false;
-  }
-  return true;
-};
-// 保存文件名
-const saveTitle = item => {
-  const updateparams = {
-    id: item.id,
-    nickName: `${item.nickName.trim()}`,
-  };
-  // 验证并提示
-  if (!validateNickname(updateparams.nickName, '名称')) return;
-  item.checkedinput = false;
-  detailTitle.value = item.nickName;
-  updataTitleApi(updateparams)
-    .then(res => {
-      if (res.status === 200) {
-        ElMessage.success('修改成功');
-        getaiImagesPage();
-      } else {
-        ElMessage.error(res.data.message || '修改失败');
-      }
-    })
-    .catch(error => {
-      ElMessage.error('请求失败,请稍后重试');
-      console.error('API error:', error);
-    });
-};
-// 正射地图
-const yxShowBox = ref(false);
-const removeHandler = () => {
-  handler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
-  handler?.destroy();
-  handler = null;
-};
-const isMapInitialized = ref(false); //地图加载
-const initMap = () => {
-  if (viewer || isMapInitialized.value) return;
-  const container = document.getElementById('detaildataCenterMap');
-  if (!container) {
-    console.error('地图容器未找到');
-    return;
-  }
-  viewInstance.value = new PublicCesium({
-    dom: 'detaildataCenterMap',
-    flatMode: false,
-    terrain: false,
-    mapFilter: true,
-    layerMode: 4
-  });
-  viewer = viewInstance.value.getViewer();
-  viewerRef.value = viewer;
-  isMapInitialized.value = true;
-};
-// 判断是否是正射
-function isTifFile(filename) {
-  const lastDot = filename.lastIndexOf('.');
-  if (lastDot === -1) return false; // 无后缀
-  return filename.slice(lastDot + 1).toLowerCase() === 'tif';
-}
-const shouldShowLocation = row => {
-  return row.resultType !== 1 && row.resultType !== 4;
-};
-// 查看弹框
-const dialogVisible = ref(false);
-const dialogDetailList = ref(null);
-const detailTitle = ref('');
-let curCustomImageryProvider = null;
-const orthoimageApi = ref('');
-const positiongeom = ref('');
-const odmToken = ref(null);
-const lookDetail = val => {
-  if (val.resultType === 4) {
-    // 正射
-    getOrthoimageInfo(val.wayLineJobId).then(async res => {
-      dialogVisible.value = true;
-      detailTitle.value = val.nickName;
-      dialogDetailList.value = val;
-      await nextTick();
-      initMap();
-      positiongeom.value = res.data.data.geom;
-      orthoimageApi.value = res.data.data.orthoimageApi;
-      odmToken.value = res.data.data.odmToken;
-      if (res.data.data != null && isMapInitialized.value === true) {
-        curCustomImageryProvider = viewInstance.value.addCustomImageryProviderDataSource(
-          new Cesium.UrlTemplateImageryProvider({
-            url: `${import.meta.env.VITE_APP_AREA_NAME}/webodm${res.data.data.orthoimageApi}?jwt=${
-              res.data.data.odmToken.split(' ')[1]
-            }`,
-          })
-        );
-        yxShowBox.value = true;
-        // 添加定位
-        if (positiongeom.value) {
-          // 解析WKT格式的多边形坐标
-          const wktString = positiongeom.value;
-          const coordinates = parseWKTCoordinates(wktString);
-          if (coordinates.length > 0) {
-            // 创建多边形边界
-            const positions = coordinates.map(coord =>
-              Cesium.Cartesian3.fromDegrees(coord[0], coord[1])
-            );
-            // 计算多边形的包围球
-            const boundingSphere = Cesium.BoundingSphere.fromPoints(positions);
-            const viewer = viewInstance.value.getViewer();
-            if (viewer && viewer.camera) {
-              viewer.camera.flyToBoundingSphere(boundingSphere, {
-                duration: 0, // 增加动画时间使过渡更平滑
-                offset: new Cesium.HeadingPitchRange(
-                  Cesium.Math.toRadians(-45), // 航向角:-45度(东北方向)
-                  Cesium.Math.toRadians(-90), // 俯仰角:-30度(向下倾斜30度)
-                  boundingSphere.radius * 2.5 // 距离:2.5倍半径
-                ),
-              });
-            } else {
-              console.error('无法获取有效的 Viewer 或 camera 对象');
-            }
-          }
-        }
-      }
-    });
-  } else {
-    getAttachInfoAPI(val.id).then(res => {
-      detailTitle.value = res.data.data.nickName.split('.jpeg')[0];
-      dialogDetailList.value = {
-        ...res.data.data,
-        checkedinput: false,
-        editName: res.data.data?.nickName?.split('.jpeg')[0],
-      };
-      dialogVisible.value = true;
-    });
-  }
-};
-// WKT坐标解析函数
-function parseWKTCoordinates(wktString) {
-  // 解析POLYGON格式的WKT字符串
-  const regex = /POLYGON\s*\(\((.*?)\)\)/i;
-  const match = wktString.match(regex);
-  if (!match || !match[1]) return [];
-  // 分割坐标对
-  const coordinatePairs = match[1].split(/,\s*/);
-  return coordinatePairs.map(pair => {
-    const [lon, lat] = pair.trim().split(/\s+/).map(Number);
-    return [lon, lat];
-  });
-}
-function dialogClose() {
-  // 对话框关闭时清理资源
-  viewInstance.value?.viewerDestroy();
-  viewer = null;
-  isMapInitialized.value = false;
-}
-function handleCellClick(row, column) {
-  if (column.no === 5) {
-    navigator.clipboard.writeText(row.nickName).then(() => {
-      ElMessage.success('复制文件名称成功')
-    })
-  }
-}
-onMounted(() => {
-  getaiImagesPage();
-  // 监听打开全景事件
-  EventBus.on('open-panorama', params => {
-    panoramaParamsShow.value = params.show;
-    panoramaParamsUrl.value = params.url;
-  });
-});
-onBeforeUnmount(() => {
-  // 组件卸载时移除事件监听,防止内存泄漏
-  EventBus.off('open-panorama');
-  viewInstance.value?.removeAllCustomImageryProviderDataSource(curCustomImageryProvider);
-  viewInstance.value?.viewerDestroy();
-});
-</script>
-<style scoped lang="scss">
-.dataCenter-table {
-  height: 0;
-  flex: 1;
-  display: flex;
-  flex-direction: column;
-
-  .dataTable {
-    height: 0;
-    flex: 1;
-    overflow: auto;
-    :deep(.el-scrollbar__view) {
-      height: 100%;
-    }
-    :deep(.el-table--fit,.el-scrollbar__view) {
-      height: 100%;
-    }
-
-    .look {
-      color: #1c5cff;
-      cursor: pointer;
-      margin-right: 10px;
-    }
-    .custom-icon {
-      width: 14px;
-      height: 14px;
-      margin-right: 5px;
-      vertical-align: middle;
-    }
-    .delete {
-      color: #ff241c;
-      margin-right: 10px;
-      cursor: pointer;
-    }
-
-    .location {
-      color: #19876d;
-      cursor: pointer;
-    }
-  }
-	.fileshow {
-		 display: grid;
-  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
-  gap: 10px;
-  overflow: auto;
-  flex: 1;
-  min-height: 0; /* 关键:解决 flex 容器中的最小高度问题 */
-  align-content: flex-start; /* 让内容从顶部开始排列 */
-			.filePackage {
-          display: flex;
-    justify-content: center;
-				width: 260px;
-				height: 146px;
-				border-radius: 4px 4px 4px 4px;
-				position: relative;
-				background: #ddd;
-				cursor: pointer;
-				img {
-					width: 111px;
-					height: 111px;
-
-				}
-
-				.el-checkbox {
-					position: absolute;
-					top: 0;
-					left: 6px;
-				}
-
-				.itemName {
-					position: absolute;
-					bottom: 0;
-					left: 0;
-					height: 23px;
-					width: 100%;
-          padding: 0 10px;
-          box-sizing: border-box;
-					background: rgba(22, 56, 101, 0.3);
-					border-radius: 0px 0px 4px 4px;
-					font-family: Source Han Sans CN, Source Han Sans CN;
-					font-weight: 400;
-					font-size: 14px;
-					color: #ffffff;
-					line-height: 23px;
-
-					display: flex;
-					align-items: center;
-					justify-content: space-between;
-
-					div {
-						white-space: nowrap;
-					}
-
-					img {
-						width: 14px;
-						height: 14px;
-						cursor: pointer;
-					}
-				}
-			}
-		}
-  .pagination {
-    display: flex;
-    justify-content: end;
-    margin-top: 20px;
-  }
-
-  .quanjing,
-  .el-image,
-  .imageBox {
-    cursor: pointer;
-    width: 76px;
-    height: 72px;
-  }
- 
-  .videoItem1 {
-  position: relative; 
-  display: flex;     
-  justify-content: center; 
-  align-items: center;     
-  width: 100%;       
-  height: 100%;     
-
-  min-height: 80px;
-}
-
-.playBox {
-  position: absolute;
-  width: 20px;        
-  height: 20px;
-  cursor: pointer;
-  
-  top: 50%;
-  left: 50%;
-  transform: translate(-50%, -50%); 
- 
-  z-index: 1;
-}
-  .videoDialog :deep(.el-dialog) {
-    height: 600px;
-    width: 54%;
-  }
-
-  .video-container {
-    width: 100%;
-    aspect-ratio: 16/9;
-    /* 按视频比例设置(如16:9) */
-    overflow: hidden;
-    /* 隐藏溢出部分 */
-  }
-
-  .videoBox {
-    width: 100%;
-    height: 100%;
-    object-fit: contain;
-    /* 保持比例完整显示 */
-    display: block;
-  }
-}
-
-:deep(.custom-header th.el-table__cell) {
-  color: rgba(0, 0, 0, 0.85);
-  background: #fafafa;
-  height: 60px !important;
-}
-:deep(.custom-body .el-table__body tr) {
-  height: 53px !important;
-}
-// 弹框
-.detailContainer {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  .leftImg {
-    width: 70%;
-    height: 500px;
-    overflow: hidden;
-    img {
-      width: 100%;
-      height: 100%;
-    }
-    .videoItem {
-      width: 100%;
-      height: 100%;
-      object-fit: cover;
-    }
-    #detaildataCenterMap {
-      width: 100%;
-      height: 100%;
-    }
-  }
-
-  .rightDetail {
-    width: 30%;
-    padding-left: 40px;
-
-    .title {
-      display: flex;
-      margin: 0 !important;
-
-      .editname {
-        cursor: pointer;
-         :deep(.el-icon) {
-    width: 20px;  // 调整图标宽度(默认通常14px左右)
-    height: 20px; // 调整图标高度(与宽度保持一致)
-    font-size: 20px; // 部分图标可能依赖font-size控制大小,同步设置
-  }
-      }
-
-      .inputEdit {
-        display: flex;
-        align-items: center;
-        width: 100%;
-
-        .fileTitle {
-          width: 70%;
-          white-space: nowrap;
-          overflow: hidden;
-          text-overflow: ellipsis;
-        }
-      }
-    }
-
-    div {
-      margin-bottom: 20px;
-    }
-  }
-}
-
-.my-header :deep(.el-dialog__title) {
-  margin: 0 !important;
-  height: 19px;
-}
-
-.my-header {
-  display: flex;
-  align-items: center;
-
-  .el-button {
-    margin-left: 20px;
-  }
-}
-
-.title-input {
-  margin-bottom: 0 !important;
-  width: 70%;
-}
-
-.editname {
-  margin-bottom: 0 !important;
-}
-
-.suffixBoxEdit {
-  display: flex;
-  // align-items: center;
-  justify-content: space-between;
-  margin-bottom: 0 !important;
-  font-size: 16px;
-
-  > .editText {
-    cursor: pointer;
-    margin-right: 6px;
-
-    &:hover {
-      transform: scale(1.2);
-    }
-  }
-
-  .editimg {
-    cursor: pointer;
-    width: 15px;
-    height: 15px;
-
-    &:hover {
-      transform: scale(1.2);
-    }
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/dataCockpit/components/CenterContainer.vue b/applications/task-work-order/src/views/dataCockpit/components/CenterContainer.vue
new file mode 100644
index 0000000..170826c
--- /dev/null
+++ b/applications/task-work-order/src/views/dataCockpit/components/CenterContainer.vue
@@ -0,0 +1,237 @@
+<template>
+	<div class="center-container">
+		<div class="left-box">
+			<div class="logo">
+				<img :src="warningLogo" alt="">
+			</div>
+
+			<div class="list">
+				<div class="item" v-for="(item, ind) in warningList" :key="ind">
+					<div class="val" @click="warningTypeClick(item.type)">
+						{{ item.value }}
+					</div>
+
+					<div class="name">
+						{{ item.title }}
+					</div>
+				</div>
+			</div>
+		</div>
+
+		<div class="right-box">
+			<div class="logo">
+				<img :src="equipmentLogo" alt="">
+			</div>
+
+			<div class="list">
+				<div class="item" v-for="(item, ind) in equipmentList" :key="ind">
+					<div class="val" :class="{highlight: item.isHighlight}" @click="equipmentClick(item.isHighlight)">
+						{{ item.value }}
+					</div>
+
+					<div class="name">
+						{{ item.title }}
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script setup>
+import { onMounted, ref } from 'vue'
+import warningLogo from '@/assets/images/dataCockpit/warning.png'
+import equipmentLogo from '@/assets/images/dataCockpit/equipment.png'
+import { alarmStatisticsApi } from '@/api/dataCockpit'
+
+const warningList = ref([
+	{
+		title: '实时告警',
+		value: 0,
+		type: 1
+	},
+	{
+		title: '设备告警',
+		value: 0,
+		type: 2
+	},
+	{
+		title: '历史告警',
+		value: 0,
+		type: 3
+	},
+])
+
+const equipmentList = ref([
+	{
+		title: '设备统计',
+		value: 0,
+		isHighlight: true,
+	},
+	{
+		title: '无线电',
+		value: 0,
+	},
+	{
+		title: '光电',
+		value: 0,
+	},
+	{
+		title: '雷达',
+		value: 0,
+	}
+])
+
+const emit = defineEmits(['select-warning', 'select-equipment'])
+
+const warningTypeClick = (type) => {
+	emit('select-warning', type)
+}
+
+const equipmentClick = (isHighlight) => {
+	if (isHighlight) {
+		emit('select-equipment')
+	}
+}
+
+const updateStats = async () => {
+	const res = await alarmStatisticsApi()
+	const data = res?.data?.data || {}
+	warningList.value = [
+		{ title: '实时告警', value: data.realTimeAlarmCount ?? 0, type: 1 },
+		{ title: '设备告警', value: data.deviceAlarmCount ?? 0, type: 2 },
+		{ title: '历史告警', value: data.historyAlarmCount ?? 0, type: 3 }
+	]
+	equipmentList.value = [
+		{ title: '设备统计', value: data.deviceCount ?? 0, isHighlight: true },
+		{ title: '无线电', value: data.radioCount ?? 0 },
+		{ title: '光电', value: data.opticalCount ?? 0 },
+		{ title: '雷达', value: data.radarCount ?? 0 }
+	]
+}
+
+onMounted(() => {
+	updateStats()
+})
+</script>
+
+<style lang="scss" scoped>
+.center-container {
+	display: flex;
+	position: absolute;
+	top: 75px;
+	left: 465px;
+	z-index: 9;
+	pointer-events: none;
+
+	.left-box {
+		width: 356px;
+
+		.list {
+			.item {
+				.val {
+					color: #FF4444;
+					cursor: pointer;
+				}
+			}
+		}
+	}
+
+	.right-box {
+		margin-left: 20px;
+		width: 455px;
+
+		.list {
+			.item {
+				.val.highlight {
+					color: #6382FF;
+					cursor: pointer;
+				}
+			}
+		}
+	}
+
+	.left-box,
+	.right-box {
+		position: relative;
+		padding: 17px 20px;
+		display: flex;
+		align-items: center;
+		height: 100px;
+		background: rgba(0,0,0,0.3);
+		box-sizing: border-box;
+		border-radius: 16px 16px 16px 16px;
+		pointer-events: auto;
+
+		&::after {
+			content: '';
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 100%;
+			height: 100%;
+			z-index: -1;
+			background: rgba(17, 23, 34, 0.56);
+      		backdrop-filter: blur(2px);
+			border-radius: 16px 16px 16px 16px;
+		}
+
+
+		.logo {
+			img {
+				width: 40px;
+				height: 40px;
+			}
+		}
+
+		.list {
+			width: 0;
+			flex: 1;
+			height: 100%;
+			display: flex;
+
+			.item {
+				width: 0;
+				flex: 1;
+				position: relative;
+				padding-left: 20px;
+				color: #fff;
+
+				.name {
+					font-family: Open Sans, Open Sans;
+					font-weight: 400;
+					font-size: 14px;
+					color: #FFFFFF;
+					text-align: left;
+					font-style: normal;
+					text-transform: none;
+				}
+
+				.val {
+					font-family: Source Han Sans CN, Source Han Sans CN;
+					font-weight: bold;
+					font-size: 30px;
+					text-align: left;
+					font-style: normal;
+					text-transform: none;
+				}
+
+				&::after {
+					content: '';
+					position: absolute;
+					top: 0;
+					right: 0;
+					width: 1px;
+					height: 100%;
+					width: 1px;
+					background: #333355;
+				}
+
+				&:last-child::after {
+					display: none;
+				}
+			}
+		}
+	}
+}
+</style>
diff --git a/applications/task-work-order/src/views/dataCockpit/components/DeviceHistoryDialog.vue b/applications/task-work-order/src/views/dataCockpit/components/DeviceHistoryDialog.vue
new file mode 100644
index 0000000..f8e3dab
--- /dev/null
+++ b/applications/task-work-order/src/views/dataCockpit/components/DeviceHistoryDialog.vue
@@ -0,0 +1,208 @@
+<template>
+	<el-dialog class="ztzf-data-cockpit-dialog" append-to-body v-model="visibleModel" :title="dialogTitle"
+		:close-on-click-modal="false" :destroy-on-close="true">
+		<el-form ref="queryParamsRef" :model="searchParams" class="ztzf-dialog-history-search">
+			<el-form-item label="关键字" prop="keyword">
+				<el-input class="ztzf-data-cockpit-search-input" v-model="searchParams.keyword" placeholder="名称/序列号"
+					clearable @clear="handleSearch" />
+			</el-form-item>
+
+			<el-form-item prop="dateRange">
+				<el-date-picker class="ztzf-data-cockpit-date-picker"
+					popper-class="ztzf-data-cockpit-tree-select-popper" v-model="searchParams.dateRange"
+					type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
+					value-format="YYYY/MM/DD" @change="handleSearch" />
+			</el-form-item>
+
+			<el-form-item label="区域" prop="area">
+				<el-tree-select class="ztzf-data-cockpit-select" popper-class="ztzf-data-cockpit-tree-select-popper"
+					v-model="searchParams.area" :data="areaTree" :props="areaTreeProps" node-key="value" check-strictly
+					clearable placeholder="请选择" @change="handleSearch" />
+			</el-form-item>
+
+			<el-form-item label="无人机类型" prop="droneType">
+				<el-select class="ztzf-data-cockpit-select" popper-class="ztzf-data-cockpit-select-popper"
+					v-model="searchParams.droneType" placeholder="请选择" clearable @change="handleSearch">
+					<el-option v-for="item in droneTypeOptions" :key="item.value" :label="item.label"
+						:value="item.value" />
+				</el-select>
+			</el-form-item>
+
+			<el-form-item class="history-search-actions">
+				<el-button :icon="RefreshRight" @click="resetForm"></el-button>
+				<el-button :icon="Search" @click="handleSearch"></el-button>
+			</el-form-item>
+		</el-form>
+
+		<div class="ztzf-table-container" v-loading="loading" element-loading-background="rgba(5, 5, 15, 0.6)">
+			<div class="ztzf-table-content">
+				<el-table class="ztzf-data-cockpit-table" :data="list">
+					<el-table-column type="index" width="60" label="序号" />
+					<el-table-column prop="droneName" label="无人机名称" min-width="120" />
+					<el-table-column prop="droneSerialNo" label="无人机序列号" min-width="140" />
+					<el-table-column label="无人机类型" min-width="110">
+						<template #default="{ row }">
+							{{ getDroneTypeText(row.droneType) }}
+						</template>
+					</el-table-column>
+					<el-table-column prop="areaName" label="区域" min-width="90" />
+					<el-table-column prop="deviceName" label="数据来源" min-width="110" />
+					<el-table-column label="信号频段" min-width="100">
+						<template #default="{ row }">
+							{{ formatFrequency(row.signalFreqMhz) }}
+						</template>
+					</el-table-column>
+					<el-table-column prop="alarmTime" label="发现时间" min-width="150" />
+					<el-table-column prop="stayDuration" label="停留时间" min-width="110" />
+					<el-table-column label="反制方式" min-width="110">
+						<template #default="{ row }">
+							{{ getCounterWayText(row.counterWay) }}
+						</template>
+					</el-table-column>
+				</el-table>
+			</div>
+
+			<div class="ztzf-table-pagination">
+				<el-pagination popper-class="ztzf-data-cockpit-select-popper"
+					v-model:current-page="searchParams.current" v-model:page-size="searchParams.size"
+					layout="total, prev, pager, next, sizes" :total="total" @change="getList" />
+			</div>
+		</div>
+	</el-dialog>
+</template>
+
+<script setup>
+import { Search, RefreshRight } from '@element-plus/icons-vue'
+import { computed, ref, watch } from 'vue'
+import { alarmLogApi } from '@/api/dataCockpit'
+
+const props = defineProps({
+	modelValue: {
+		type: Boolean,
+		default: false
+	},
+	device: {
+		type: Object,
+		default: () => null
+	}
+})
+
+const emit = defineEmits(['update:modelValue'])
+
+const visibleModel = computed({
+	get: () => props.modelValue,
+	set: (val) => emit('update:modelValue', val)
+})
+
+const dialogTitle = computed(() => {
+	return `反制设备名称 ${props.device?.name || ''}`.trim()
+})
+
+const initSearchParams = () => ({
+	keyword: '',
+	dateRange: [],
+	area: '',
+	droneType: '',
+	current: 1,
+	size: 10
+})
+const searchParams = ref(initSearchParams())
+const queryParamsRef = ref(null)
+const loading = ref(true)
+const list = ref([])
+const total = ref(0)
+const areaTree = ref([
+	{
+		label: '古村区',
+		value: '古村区'
+	},
+	{
+		label: '新区',
+		value: '新区'
+	},
+	{
+		label: '产业园',
+		value: '产业园'
+	}
+])
+const areaTreeProps = {
+	label: 'label',
+	children: 'children'
+}
+
+const droneTypeOptions = [
+	{ label: '微型机', value: '1' },
+	{ label: '植保机', value: '2' }
+]
+
+const getList = async () => {
+	if (!props.device?.id) {
+		list.value = []
+		total.value = 0
+		return
+	}
+	const [startTime, endTime] = searchParams.value.dateRange || []
+	const keyword = (searchParams.value.keyword || '').trim()
+	const params = {
+		alarmType: '2',
+		deviceId: props.device.id,
+		current: searchParams.value.current,
+		size: searchParams.value.size,
+		startTime,
+		endTime,
+		areaName: searchParams.value.area || undefined,
+		droneType: searchParams.value.droneType || undefined,
+		droneName: keyword || undefined,
+	}
+	loading.value = true
+	try {
+		const res = await alarmLogApi(params)
+		list.value = res?.data?.data?.records ?? []
+		total.value = res?.data?.data?.total ?? 0
+	} finally {
+		loading.value = false
+	}
+}
+
+function handleSearch () {
+	searchParams.value.current = 1
+	getList()
+}
+
+function resetForm () {
+	searchParams.value = initSearchParams()
+
+	getList()
+}
+
+const formatFrequency = (value) => {
+	if (value == null || value === '') return '-'
+	return `${value}MHZ`
+}
+
+const getCounterWayText = (value) => {
+	if (value === 1 || value === '1') return '信号干扰'
+	if (value === 2 || value === '2') return '诱导驱离'
+	if (value === 3 || value === '3') return '无'
+	return value || '-'
+}
+
+const getDroneTypeText = (value) => {
+	if (value === 1 || value === '1') return '微型机'
+	if (value === 2 || value === '2') return '植保机'
+	return value || '-'
+}
+
+watch(
+	() => visibleModel.value,
+	(visible) => {
+		if (visible) {
+			searchParams.value.current = 1
+			getList()
+		}
+	}
+)
+
+</script>
+
+<style lang="scss" scoped></style>
diff --git a/applications/task-work-order/src/views/dataCockpit/components/EmptyState.vue b/applications/task-work-order/src/views/dataCockpit/components/EmptyState.vue
new file mode 100644
index 0000000..929fb57
--- /dev/null
+++ b/applications/task-work-order/src/views/dataCockpit/components/EmptyState.vue
@@ -0,0 +1,59 @@
+<!--
+ * @Author       : yuan
+ * @Date         : 2026-01-09 15:06:02
+ * @LastEditors  : yuan
+ * @LastEditTime : 2026-01-09 15:10:44
+ * @FilePath     : \applications\drone-command\src\views\dataCockpit\components\EmptyState.vue
+ * @Description  : 
+ * Copyright 2026 OBKoro1, All Rights Reserved. 
+ * 2026-01-09 15:06:02
+-->
+<template>
+	<div class="empty-state">
+		<div class="empty-content">
+			<img :src="noDataBg" alt="暂无数据">
+			<span class="empty-text">暂无数据</span>
+		</div>
+	</div>
+</template>
+
+<script setup>
+import noDataBg from '@/assets/images/no-data-bg.png'
+</script>
+
+<style scoped lang="scss">
+.empty-state {
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex: 1;
+	width: 100%;
+	height: 100%;
+	min-height: 220px;
+
+	.empty-content {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		flex-direction: column;
+		text-align: center;
+	}
+
+	img {
+		max-width: 78%;
+		max-height: 78%;
+		object-fit: contain;
+	}
+
+	.empty-text {
+		font-family: Source Han Sans CN, Source Han Sans CN;
+		font-weight: 400;
+		font-size: 14px;
+		color: #9E9EBA;
+		line-height: 18px;
+		text-align: center;
+		font-style: normal;
+		text-transform: none;
+	}
+}
+</style>
diff --git a/applications/task-work-order/src/views/dataCockpit/components/EquipmentWarning.vue b/applications/task-work-order/src/views/dataCockpit/components/EquipmentWarning.vue
new file mode 100644
index 0000000..ddbd81d
--- /dev/null
+++ b/applications/task-work-order/src/views/dataCockpit/components/EquipmentWarning.vue
@@ -0,0 +1,101 @@
+<!--
+ * @Author       : yuan
+ * @Date         : 2026-01-08 09:29:07
+ * @LastEditors  : yuan
+ * @LastEditTime : 2026-01-08 14:49:25
+ * @FilePath     : \applications\drone-command\src\views\dataCockpit\components\EquipmentWarning.vue
+ * @Description  : 
+ * Copyright 2026 OBKoro1, All Rights Reserved. 
+ * 2026-01-08 09:29:07
+-->
+<template>
+	<div
+		class="equipment-warning"
+		v-loading="loading"
+		element-loading-background="rgba(5, 5, 15, 0.6)"
+		element-loading-text="加载中..."
+	>
+		<EmptyState v-if="!equipmentWarningData.length" />
+		<EquipmentTemplate
+			v-else
+			v-for="(item, ind) in equipmentWarningData"
+			:key="ind"
+			:data="item"
+			@click="onCardClick"
+		/>
+	</div>
+</template>
+
+<script setup>
+import { onMounted, ref } from 'vue'
+import EquipmentTemplate from './templateComponents/EquipmentTemplate.vue'
+import { deviceSearchApi } from '@/api/dataCockpit'
+import EmptyState from './EmptyState.vue'
+
+const equipmentWarningData = ref([])
+const loading = ref(true)
+const minLoadingMs = 400
+
+const statusMap = {
+	0: { text: '在线', statusType: 'online' },
+	1: { text: '离线', statusType: 'offline' },
+	2: { text: '故障', statusType: 'fault' },
+	3: { text: '报废', statusType: 'offline' }
+}
+const deviceTypeMap = {
+	1: '便捷侦测箱',
+	2: '反制枪',
+	3: '察打一体'
+}
+
+const formatDeviceItem = (item) => {
+	const statusInfo = statusMap[item?.status] || { text: '-', statusType: '' }
+	return {
+		id: item.id,
+		name: item.deviceName || item.deviceModel || '-',
+		status: statusInfo.text,
+		statusType: statusInfo.statusType,
+		type: deviceTypeMap[item.deviceType] || item.deviceType || '-',
+		manufacturer: item.manufacturer || '-',
+		azimuth: item.azimuth ?? 0,
+		pitch: item.elevation ?? 0,
+		range: item.effectiveRangeKm ?? 0,
+		model: item.deviceModel || '-',
+		longitude: item.longitude ?? '-',
+		latitude: item.latitude ?? '-'
+	}
+}
+
+const fetchDeviceWarning = async () => {
+	const startAt = Date.now()
+	loading.value = true
+	try {
+		const params = { current: 1, size: 20, deviceStatusList: '1,2,3' }
+		const res = await deviceSearchApi(params)
+		const records = res?.data?.data?.records ?? []
+		equipmentWarningData.value = records.map(formatDeviceItem)
+	} finally {
+		const elapsed = Date.now() - startAt
+		if (elapsed < minLoadingMs) {
+			await new Promise((resolve) => setTimeout(resolve, minLoadingMs - elapsed))
+		}
+		loading.value = false
+	}
+}
+
+onMounted(() => {
+	fetchDeviceWarning()
+})
+
+const onCardClick = (item) => {
+	console.log('点击设备卡片:', item.id)
+}
+</script>
+
+<style lang="scss" scoped>
+.equipment-warning {
+	width: 100%;
+	height: 100%;
+}
+
+</style>
diff --git a/applications/task-work-order/src/views/dataCockpit/components/HistoryWarning.vue b/applications/task-work-order/src/views/dataCockpit/components/HistoryWarning.vue
new file mode 100644
index 0000000..767359a
--- /dev/null
+++ b/applications/task-work-order/src/views/dataCockpit/components/HistoryWarning.vue
@@ -0,0 +1,123 @@
+<template>
+	<div
+		class="history-warning"
+		v-loading="loading"
+		element-loading-background="rgba(5, 5, 15, 0.6)"
+		element-loading-text="加载中..."
+	>
+		<!-- 搜索区(设计稿红框) -->
+		<div class="search-box">
+			<!-- 关键字 -->
+			<el-input v-model="query.keyword" class="ztzf-data-cockpit-search-input" placeholder="请输入数据名称" clearable
+				@keyup.enter="onSearch">
+			</el-input>
+
+			<!-- 日期范围 -->
+			<el-date-picker v-model="query.dateRange" 
+			  	class="ztzf-data-cockpit-date-picker"
+			 	popper-class="ztzf-data-cockpit-date-picker-popper"
+			    type="daterange" 
+				range-separator="~"
+				start-placeholder="创建开始日期" end-placeholder="结束日期" format="YYYY年MM月DD日" value-format="YYYY-MM-DD"
+				:clearable="true" @change="onSearch">
+			</el-date-picker>
+		</div>
+
+		<!-- 列表 -->
+		<div class="list-content">
+			<EmptyState v-if="!filteredList.length" />
+			<HistoryTemplate
+				v-else
+				v-for="(item, ind) in filteredList"
+				:key="item.id || ind"
+				:data="item"
+				@click="onCardClick"
+			/>
+		</div>
+	</div>
+</template>
+
+<script setup>
+import { ref, computed, onMounted } from 'vue'
+import HistoryTemplate from './templateComponents/HistoryTemplate.vue'
+import { alarmLogApi } from '@/api/dataCockpit'
+import EmptyState from './EmptyState.vue'
+
+const historyWarningData = ref([])
+const loading = ref(true)
+const minLoadingMs = 400
+
+// 查询条件:keyword + dateRange(YYYY-MM-DD数组)
+const query = ref({
+	keyword: '',
+	dateRange: [] // [start, end]
+})
+
+const onSearch = () => {
+	fetchHistoryWarning()
+}
+
+const onCardClick = (item) => {
+	console.log('点击无人机卡片:', item.id)
+}
+
+const fetchHistoryWarning = async () => {
+	const startAt = Date.now()
+	loading.value = true
+	try {
+		const [startTime, endTime] = query.value.dateRange || []
+		const keyword = (query.value.keyword || '').trim()
+		const params = {
+			current: 1,
+			size: 20,
+			alarmType: '2',
+			startTime,
+			endTime,
+			droneName: keyword || undefined,
+			droneSerialNo: keyword || undefined
+		}
+		const res = await alarmLogApi(params)
+		const records = res?.data?.data?.records ?? []
+		historyWarningData.value = records
+	} finally {
+		const elapsed = Date.now() - startAt
+		if (elapsed < minLoadingMs) {
+			await new Promise((resolve) => setTimeout(resolve, minLoadingMs - elapsed))
+		}
+		loading.value = false
+	}
+}
+
+const filteredList = computed(() => {
+	return historyWarningData.value
+})
+
+onMounted(() => {
+	fetchHistoryWarning()
+})
+</script>
+
+<style scoped lang="scss">
+.history-warning {
+	display: flex;
+	flex-direction: column;
+	width: 100%;
+	height: 100%;
+
+	.search-box {
+		display: flex;
+		flex-direction: column;
+		gap: 10px;
+
+		::v-deep(.ztzf-data-cockpit-date-picker) {
+			width: 100% !important;
+		}
+	}
+
+	.list-content {
+		height: 0;
+		flex: 1;
+	}
+}
+
+</style>
diff --git a/applications/task-work-order/src/views/dataCockpit/components/LeftContainer.vue b/applications/task-work-order/src/views/dataCockpit/components/LeftContainer.vue
new file mode 100644
index 0000000..7b54029
--- /dev/null
+++ b/applications/task-work-order/src/views/dataCockpit/components/LeftContainer.vue
@@ -0,0 +1,219 @@
+<template>
+	<div class="left-container" :class="{ collapsed: collapsedModel }">
+		<div class="wrapper">
+			<TitleTemplate>异常情况告警</TitleTemplate>
+
+			<div class="category-container">
+				<div class="category-item" v-for="(item, ind) in categoryList" :key="ind"
+					@click="activeIdModel = item.id" :class="{ active: activeIdModel === item.id }">
+					{{ item.name }}
+					<span class="badge" v-if="item.badge">{{ item.badge }}</span>
+				</div>
+			</div>
+
+			<div class="content">
+				<component :is="currentComponent" />
+			</div>
+		</div>
+
+		<div class="collapse-btn" @click="toggleCollapse">
+			<span class="arrow" :class="collapsedModel ? 'right' : 'left'"></span>
+		</div>
+	</div>
+</template>
+
+<script setup>
+import TitleTemplate from './templateComponents/TitleTemplate.vue'
+import RealWarning from './RealWarning.vue'
+import EquipmentWarning from './EquipmentWarning.vue'
+import HistoryWarning from './HistoryWarning.vue'
+import { alarmStatisticsApi } from '@/api/dataCockpit'
+import { onMounted } from 'vue'
+
+const props = defineProps({
+	activeId: {
+		type: Number,
+		default: 1
+	},
+	collapsed: {
+		type: Boolean,
+		default: false
+	}
+})
+
+const emit = defineEmits(['update:activeId', 'update:collapsed'])
+
+const activeIdModel = computed({
+	get: () => props.activeId,
+	set: (val) => emit('update:activeId', val)
+})
+
+const collapsedModel = computed({
+	get: () => props.collapsed,
+	set: (val) => emit('update:collapsed', val)
+})
+
+const categoryList = ref([
+	{
+		id: 1,
+		name: '实时告警',
+		badge: 0,
+		component: RealWarning
+	},
+	{
+		id: 2,
+		name: '设备告警',
+		badge: 0,
+		component: EquipmentWarning
+	},
+	{
+		id: 3,
+		name: '历史告警',
+		badge: 0,
+		component: HistoryWarning
+	}
+])
+
+const currentComponent = computed(() => {
+	return categoryList.value.find(i => i.id === activeIdModel.value)?.component
+})
+
+const toggleCollapse = () => {
+	collapsedModel.value = !collapsedModel.value
+}
+
+const updateBadges = async () => {
+	const res = await alarmStatisticsApi()
+	const data = res?.data?.data || {}
+	const realTotal = data.realTimeAlarmCount ?? 0
+	const historyTotal = data.historyAlarmCount ?? 0
+	const deviceTotal = data.deviceAlarmCount ?? 0
+	categoryList.value = categoryList.value.map((item) => {
+		if (item.id === 1) return { ...item, badge: realTotal }
+		if (item.id === 2) return { ...item, badge: deviceTotal }
+		if (item.id === 3) return { ...item, badge: historyTotal }
+		return item
+	})
+}
+
+onMounted(() => {
+	updateBadges()
+})
+</script>
+
+<style lang="scss" scoped>
+.left-container {
+	position: relative;
+	transition: transform 0.3s ease-in-out;
+
+	&.collapsed {
+		transform: translateX(-100%);
+	}
+}
+
+.collapse-btn {
+	position: absolute;
+	top: 50%;
+	left: 357px;
+	cursor: pointer;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	color: #fff;
+	z-index: 10;
+	transform: translateY(-50%);
+
+	.arrow {
+		width: 24px;
+		height: 24px;
+		background: url('@/assets/images/dataCockpit/left-btn.png') center / 100% 100% no-repeat;
+	}
+
+	&:hover {
+		background: rgba(40, 79, 227, 0.6);
+	}
+}
+
+.category-container {
+	position: relative;
+	display: flex;
+	justify-content: space-between;
+
+	&::after {
+		content: '';
+		position: absolute;
+		left: 0;
+		bottom: 0;
+		width: 100%;
+		height: 1px;
+		background: #333355;
+	}
+
+	.category-item {
+		position: relative;
+		width: 0;
+		flex: 1;
+		margin-left: 26px;
+		height: 68px;
+		line-height: 68px;
+
+		font-family: Source Code Pro, Source Code Pro;
+		font-weight: 400;
+		font-size: 14px;
+		color: #86909C;
+		text-align: center;
+		font-style: normal;
+		text-transform: none;
+		cursor: pointer;
+
+		&:first-child {
+			margin-left: 0;
+		}
+
+		&.active {
+			font-weight: normal;
+			color: #FFFFFF;
+		}
+
+		&::after {
+			content: '';
+			position: absolute;
+			left: 0;
+			bottom: 0;
+			width: 100%;
+			height: 0;
+		}
+
+		&.active::after {
+			height: 3px;
+			background: #284FE3;
+			box-shadow: 0px 3px 2px 0px rgba(15, 89, 255, 0.1), 0px 7px 5px 0px rgba(15, 89, 255, 0.15), 0px 13px 10px 0px rgba(15, 89, 255, 0.18), 0px 22px 18px 0px rgba(15, 89, 255, 0.21), 0px 42px 33px 0px rgba(15, 89, 255, 0.26), 0px 100px 80px 0px rgba(15, 89, 255, 0.36);
+			border-radius: 5px 5px 0px 0px;
+			z-index: 9;
+		}
+
+		.badge {
+			position: absolute;
+			top: 16px;
+			right: 4px;
+			min-width: 18px;
+			line-height: 18px;
+			font-size: 12px;
+			color: #FFFFFF;
+			background: #FF3B30;
+			border-radius: 50%;
+			text-align: center;
+			box-shadow: 0px 2px 6px rgba(255, 59, 48, 0.6);
+			pointer-events: none;
+		}
+	}
+}
+
+.content {
+	height: 0;
+	flex: 1;
+	margin-top: 20px;
+	overflow-x: hidden;
+	overflow-y: auto;
+}
+</style>
diff --git a/applications/task-work-order/src/views/dataCockpit/components/RealWarning.vue b/applications/task-work-order/src/views/dataCockpit/components/RealWarning.vue
new file mode 100644
index 0000000..607b94d
--- /dev/null
+++ b/applications/task-work-order/src/views/dataCockpit/components/RealWarning.vue
@@ -0,0 +1,109 @@
+<!--
+ * @Author       : yuan
+ * @Date         : 2026-01-08 09:29:07
+ * @LastEditors  : yuan
+ * @LastEditTime : 2026-01-08 14:49:09
+ * @FilePath     : \applications\drone-command\src\views\dataCockpit\components\RealWarning.vue
+ * @Description  : 
+ * Copyright 2026 OBKoro1, All Rights Reserved. 
+ * 2026-01-08 09:29:07
+-->
+<template>
+	<div
+		class="real-warning"
+		v-loading="loading"
+		element-loading-background="rgba(5, 5, 15, 0.6)"
+		element-loading-text="加载中..."
+	>
+		<EmptyState v-if="!realWarningData.length" />
+		<RealTemplate
+			v-else
+			v-for="(item, ind) in realWarningData"
+			:key="ind"
+			:data="item"
+			@signal="() => handleAction('signal', item)"
+			@counter="() => handleAction('counter', item)"
+			@favorite="() => console.log('收藏', item.id)"
+		/>
+	</div>
+</template>
+
+<script setup>
+import RealTemplate from './templateComponents/RealTemplate.vue'
+import { alarmLogApi, interferenceAndExpulsionApi } from '@/api/dataCockpit'
+import { onMounted, ref } from 'vue'
+import EmptyState from './EmptyState.vue'
+import { ElMessage } from 'element-plus'
+
+const realWarningData = ref([])
+const loading = ref(true)
+const minLoadingMs = 400
+
+const actionTextMap = {
+	signal: '信号干扰',
+	counter: '诱导驱离'
+}
+
+const buildPayload = (item) => ({
+	alarmRecordId: item.id,
+	areaCode: item.areaCode,
+	counterEffect: '',
+	coverRadiusM: item.coverRadiusM,
+	deployLatitude: item.latitude,
+	deployLongitude: item.longitude,
+	deviceCode: item.deviceCode,
+	deviceId: item.deviceId,
+	deviceModel: item.deviceModel,
+	deviceName: item.deviceName,
+	deviceType: item.deviceType,
+	droneDeviceCode: item.droneSerialNo,
+	droneName: item.droneName,
+	droneType: item.droneType,
+	findTime: item.alarmTime,
+	id: item.id,
+	workMode: ''
+})
+
+const handleAction = async (type, item) => {
+	const actionText = actionTextMap[type] || '操作'
+	try {
+		const res = await interferenceAndExpulsionApi(buildPayload(item))
+		if (res?.data?.success) {
+			ElMessage({ type: 'success', message: `${actionText}成功` })
+		} else {
+			ElMessage({ type: 'error', message: res?.data?.msg || `${actionText}失败` })
+		}
+	} catch (error) {
+		ElMessage({ type: 'error', message: `${actionText}失败` })
+	}
+}
+
+const fetchRealWarning = async () => {
+	const startAt = Date.now()
+	loading.value = true
+	try {
+		const params = { current: 1, size: 20, alarmType: '1' }
+		const res = await alarmLogApi(params)
+		const records = res?.data?.data?.records ?? []
+		realWarningData.value = records
+	} finally {
+		const elapsed = Date.now() - startAt
+		if (elapsed < minLoadingMs) {
+			await new Promise((resolve) => setTimeout(resolve, minLoadingMs - elapsed))
+		}
+		loading.value = false
+	}
+}
+
+onMounted(() => {
+	fetchRealWarning()
+})
+</script>
+
+<style lang="scss" scoped>
+.real-warning {
+	width: 100%;
+	height: 100%;
+}
+
+</style>
diff --git a/applications/task-work-order/src/views/dataCockpit/components/RightContainer.vue b/applications/task-work-order/src/views/dataCockpit/components/RightContainer.vue
new file mode 100644
index 0000000..b014989
--- /dev/null
+++ b/applications/task-work-order/src/views/dataCockpit/components/RightContainer.vue
@@ -0,0 +1,288 @@
+<!--
+ * @Author       : yuan
+ * @Date         : 2026-01-07 15:17:54
+ * @LastEditors  : yuan
+ * @LastEditTime : 2026-01-09 16:54:31
+ * @FilePath     : \applications\drone-command\src\views\dataCockpit\components\RightContainer.vue
+ * @Description  : 
+ * Copyright 2026 OBKoro1, All Rights Reserved. 
+ * 2026-01-07 15:17:54
+-->
+<template>
+	<div class="right-container" :class="{ collapsed: collapsedModel }">
+		<div class="wrapper">
+			<TitleTemplate>侦测反制设备</TitleTemplate>
+
+			<div class="category-container">
+				<div class="category-item" v-for="(item, ind) in categoryList" :key="ind">
+					<div class="category-item-logo">
+						<img :src="item.logo" alt="">
+					</div>
+
+					<div class="category-item-content">
+						<span class="name">{{ item.name }}</span>
+						<span class="val">{{ item.val }}</span>
+					</div>
+				</div>
+			</div>
+
+			<div
+				class="content"
+				v-loading="loading"
+				element-loading-background="rgba(5, 5, 15, 0.6)"
+				element-loading-text="加载中..."
+			>
+				<EmptyState v-if="!counterDeviceStatusList.length" />
+				<RealEquipmentTemplate
+					v-else
+					v-for="item in counterDeviceStatusList"
+					:key="item.id"
+					:data="item"
+					@history="onHistory"
+					@click="onCardClick"
+				/>
+			</div>
+		</div>
+
+		<div class="collapse-btn" @click="toggleCollapse">
+			<span class="arrow" :class="collapsedModel ? 'left' : 'right'"></span>
+		</div>
+
+		<DeviceHistoryDialog v-model="historyVisible" :device="historyDevice" />
+	</div>
+</template>
+
+<script setup>
+import TitleTemplate from './templateComponents/TitleTemplate.vue'
+import RealEquipmentTemplate from './templateComponents/RealEquipmentTemplate.vue'
+import DeviceHistoryDialog from './DeviceHistoryDialog.vue'
+import EmptyState from './EmptyState.vue'
+import zcsbLogo from '@/assets/images/dataCockpit/zcsb.png'
+import fzsbLogo from '@/assets/images/dataCockpit/fzsb.png'
+import { deviceSearchApi, deviceStatisticsApi } from '@/api/dataCockpit'
+
+const props = defineProps({
+	collapsed: {
+		type: Boolean,
+		default: false
+	}
+})
+
+const emit = defineEmits(['update:collapsed', 'update:onlineDevices'])
+
+const collapsedModel = computed({
+	get: () => props.collapsed,
+	set: (val) => emit('update:collapsed', val)
+})
+
+const categoryList = ref([
+	{
+		id: 1,
+		name: '侦测设备',
+		val: 0,
+		logo: zcsbLogo
+	},
+	{
+		id: 2,
+		name: '反制设备',
+		val: 0,
+		logo: fzsbLogo
+	}
+])
+
+const counterDeviceStatusList = ref([])
+
+const historyVisible = ref(false)
+const historyDevice = ref(null)
+const loading = ref(true)
+const minLoadingMs = 400
+
+const onHistory = (item) => {
+	historyDevice.value = item
+	historyVisible.value = true
+	console.log('历史数据:', item.id)
+}
+
+const onCardClick = (item) => {
+	console.log('点击卡片:', item.id)
+}
+const toggleCollapse = () => {
+	collapsedModel.value = !collapsedModel.value
+}
+
+const statusMap = {
+	0: { text: '在线', actionType: 'detecting' },
+	1: { text: '离线', actionType: '' },
+	2: { text: '故障', actionType: 'jamming' },
+	3: { text: '报废', actionType: '' }
+}
+const deviceTypeMap = {
+	1: '便捷侦测箱',
+	2: '反制枪',
+	3: '察打一体'
+}
+
+const formatDeviceItem = (item) => {
+	const statusInfo = statusMap[item?.status] || { text: '-', actionType: '' }
+	return {
+		id: item.id,
+		name: item.deviceName || item.deviceModel || '-',
+		actionText: statusInfo.text,
+		actionType: statusInfo.actionType,
+		type: deviceTypeMap[item.deviceType] || item.deviceType || '-',
+		batteryPct: item.batteryPct ?? 0,
+		azimuth: item.azimuth ?? 0,
+		elevation: item.elevation ?? 0,
+		status: item.status ?? '-',
+		manufacturer: item.manufacturer || '-',
+		detectTargetCnt: item.detectTargetCnt ?? 0,
+		effectiveRangeKm: item.effectiveRangeKm ?? 0
+	}
+}
+
+const fetchDeviceList = async () => {
+	const startAt = Date.now()
+	loading.value = true
+	try {
+		const params = { current: 1, size: 20, deviceStatusList: '0' }
+		const res = await deviceSearchApi(params)
+		const records = res?.data?.data?.records ?? []
+		counterDeviceStatusList.value = records.map(formatDeviceItem)
+		emit('update:onlineDevices', records)
+	} finally {
+		const elapsed = Date.now() - startAt
+		if (elapsed < minLoadingMs) {
+			await new Promise((resolve) => setTimeout(resolve, minLoadingMs - elapsed))
+		}
+		loading.value = false
+	}
+}
+
+onMounted(() => {
+	fetchDeviceList()
+	fetchDeviceStatistics()
+})
+
+const normalizeType = (value) => {
+	if (value === 1 || value === '1') return '侦测设备'
+	if (value === 2 || value === '2') return '反制设备'
+	if (value === 'detect') return '侦测设备'
+	if (value === 'counter') return '反制设备'
+	return value
+}
+
+const fetchDeviceStatistics = async () => {
+	const res = await deviceStatisticsApi()
+	const list = res?.data?.data ?? []
+	const map = new Map(list.map((item) => [normalizeType(item.type), item.count]))
+	categoryList.value = categoryList.value.map((item) => ({
+		...item,
+		val: map.has(item.name) ? map.get(item.name) : item.val
+	}))
+}
+</script>
+
+<style lang="scss" scoped>
+.category-container {
+	margin-top: 20px;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	gap: 28px;
+	box-sizing: border-box;
+
+	.category-item {
+		position: relative;
+		width: 0;
+		flex: 1;
+		display: flex;
+		height: 64px;
+
+		&-logo {
+			display: flex;
+			align-items: center;
+
+			img {
+				width: 40px;
+				height: 40px;
+			}
+		}
+
+		&-content {
+			width: 0;
+			flex: 1;
+			display: flex;
+			flex-direction: column;
+			border-bottom: 1px solid #6C6C89;
+
+			span {
+				margin-left: 8px;
+			}
+
+			.name {
+				font-family: Open Sans, Open Sans;
+				font-weight: 400;
+				font-size: 16px;
+				color: #C3C3DD;
+				line-height: 20px;
+				text-align: left;
+				font-style: normal;
+				text-transform: none;
+			}
+
+			.val {
+				margin-top: 10px;
+				font-family: DIN, DIN;
+				font-weight: bold;
+				font-size: 22px;
+				color: #FFFFFF;
+				line-height: 20px;
+				text-align: left;
+				font-style: normal;
+				text-transform: none;
+			}
+		}
+	}
+}
+
+.content {
+	height: 0;
+	flex: 1;
+	margin-top: 20px;
+	overflow-x: hidden;
+	overflow-y: auto;
+}
+
+
+.right-container {
+	transition: transform 0.3s ease-in-out;
+	position: relative;
+
+	&.collapsed {
+		transform: translateX(100%);
+	}
+}
+
+.collapse-btn {
+	position: absolute;
+	top: 50%;
+	right: 357px;
+	cursor: pointer;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	color: #fff;
+	z-index: 10;
+	transform: translateY(-50%);
+
+	.arrow {
+		width: 24px;
+		height: 24px;
+		background: url('@/assets/images/dataCockpit/right-btn.png') center / 100% 100% no-repeat;
+	}
+
+	&:hover {
+		background: rgba(40, 79, 227, 0.6);
+	}
+}
+</style>
diff --git a/applications/task-work-order/src/views/dataCockpit/components/templateComponents/EquipmentTemplate.vue b/applications/task-work-order/src/views/dataCockpit/components/templateComponents/EquipmentTemplate.vue
new file mode 100644
index 0000000..1d5d632
--- /dev/null
+++ b/applications/task-work-order/src/views/dataCockpit/components/templateComponents/EquipmentTemplate.vue
@@ -0,0 +1,171 @@
+<template>
+	<div class="device-card" @click="emit('click', data)">
+		<div class="header">
+			<div class="title">
+				<span class="name">{{ data.name }}</span>
+
+				<span class="status">
+					<span :class="data.statusType">
+
+					</span>
+
+					<span>
+						{{ data.status }}
+					</span>
+				</span>
+			</div>
+		</div>
+
+		<div class="content">
+			<div class="row">
+				<div class="col">
+					<span class="label">类型</span>
+					{{ data.type }}
+				</div>
+				<div class="col">
+					<span class="label">厂商</span>
+					{{ data.manufacturer }}
+				</div>
+			</div>
+			<div class="row">
+				<div class="col">
+					<span class="label">方位角</span>
+					{{ data.azimuth }}°
+				</div>
+				<div class="col">
+					<span class="label">俯仰角</span>
+					{{ data.pitch }}°
+				</div>
+			</div>
+			<div class="row">
+				<div class="col">
+					<span class="label">有效范围</span>
+					{{ data.range }}
+				</div>
+				<div class="col">
+					<span class="label">设备型号</span>
+					{{ data.model }}
+				</div>
+			</div>
+
+			<div>
+				<span class="label">部署位置</span>
+				<span class="value">{{ data.longitude }},{{ data.latitude }}</span>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script setup>
+const props = defineProps({
+	data: {
+		type: Object,
+		required: true,
+		default: () => ({})
+	}
+})
+
+const emit = defineEmits(['click'])
+</script>
+
+<style scoped lang="scss">
+.device-card {
+	margin-top: 10px;
+	padding: 10px;
+	color: #fff;
+	background: #191933;
+	border-radius: 6px 6px 6px 6px;
+
+	&:first-child {
+		margin-top: 0;
+	}
+
+	.header {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+
+		.title {
+			display: flex;
+			align-items: center;
+			gap: 6px;
+
+			.name {
+				font-family: Source Han Sans CN, Source Han Sans CN;
+				font-weight: bold;
+				font-size: 14px;
+				color: #FFFFFF;
+				text-align: left;
+				font-style: normal;
+				text-transform: none;
+			}
+
+			.status {
+				padding: 0 10px;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				height: 21px;
+
+				background: #303041;
+				border-radius: 10px;
+				gap: 6px;
+
+				span {
+					font-family: Source Han Sans CN, Source Han Sans CN;
+					font-weight: 400;
+					font-size: 10px;
+					color: #FFFFFF;
+					text-align: center;
+					font-style: normal;
+					text-transform: none;
+				}
+
+
+				span.offline {
+					width: 4px;
+					height: 4px;
+					background: #939393;
+					border-radius: 50%;
+				}
+
+				span.fault {
+					width: 4px;
+					height: 4px;
+					background: #FF4444;
+					border-radius: 50%;
+				}
+			}
+		}
+	}
+
+	.content {
+		font-family: Source Han Sans CN, Source Han Sans CN;
+		font-weight: 400;
+		font-size: 12px;
+		color: #9E9EBA;
+		text-align: left;
+		font-style: normal;
+		text-transform: none;
+
+		&>div {
+			margin-top: 10px;
+			line-height: 22px;
+
+			span.label {
+				margin-right: 10px;
+				color: #D4D5D7;
+			}
+		}
+
+		.row {
+			display: flex;
+
+			&>div {
+				width: 0;
+				flex: 1;
+			}
+		}
+	}
+}
+</style>
diff --git a/applications/task-work-order/src/views/dataCockpit/components/templateComponents/HistoryTemplate.vue b/applications/task-work-order/src/views/dataCockpit/components/templateComponents/HistoryTemplate.vue
new file mode 100644
index 0000000..494cd94
--- /dev/null
+++ b/applications/task-work-order/src/views/dataCockpit/components/templateComponents/HistoryTemplate.vue
@@ -0,0 +1,149 @@
+<template>
+	<div class="drone-info-card" @click="emit('click', data)">
+		<div class="title">
+			<span class="name">
+				{{ data.droneName }}
+			</span>
+		</div>
+
+		<div class="rows">
+			<div class="row">
+				<span class="label">序列号</span>
+				<span class="value">{{ data.droneSerialNo }}</span>
+			</div>
+
+			<div class="row">
+				<span class="label">数据源</span>
+				<span class="value">{{ getDataSource(data) }}</span>
+			</div>
+
+			<div class="row">
+				<span class="label">信号频段</span>
+				<span class="value">{{ formatFrequency(data.signalFreqMhz) }}</span>
+			</div>
+
+			<div class="row">
+				<span class="label">发现时间</span>
+				<span class="value">
+					<span class="date">{{ getAlarmDate(data.alarmTime) }}</span>
+					<span class="time">{{ getAlarmTime(data.alarmTime) }}</span>
+				</span>
+			</div>
+
+			<div class="row">
+				<span class="label">停留时间</span>
+				<span class="value">{{ data.stayDuration }}</span>
+			</div>
+
+			<div class="row">
+				<span class="label">反制方式</span>
+				<span class="value">{{ getCounterWayText(data.counterWay) }}</span>
+			</div>
+
+			<div class="row">
+				<span class="label">飞行状态</span>
+				<span class="value">{{ getFlightStatusText(data.flightStatus) }}</span>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script setup>
+defineProps({
+	data: {
+		type: Object,
+		required: true,
+		default: () => ({})
+	}
+})
+
+const emit = defineEmits(['click'])
+
+const getDataSource = (item) => {
+	return item?.deviceName || item?.areaName || '-'
+}
+
+const formatFrequency = (value) => {
+	if (value == null || value === '') return '-'
+	return `${value}MHZ`
+}
+
+const getAlarmDate = (value) => {
+	if (!value) return '-'
+	const parts = value.replace('T', ' ').split(' ')
+	return parts[0] || value
+}
+
+const getAlarmTime = (value) => {
+	if (!value) return '-'
+	const parts = value.replace('T', ' ').split(' ')
+	return parts[1] || value
+}
+
+const getFlightStatusText = (value) => {
+	if (value === 1 || value === '1') return '侦测中'
+	if (value === 2 || value === '2') return '反制中'
+	return value || '-'
+}
+
+const getCounterWayText = (value) => {
+	if (value === 1 || value === '1') return '信号干扰'
+	if (value === 2 || value === '2') return '诱导驱离'
+	if (value === 3 || value === '3') return '无'
+	return value || '-'
+}
+</script>
+
+<style scoped lang="scss">
+.drone-info-card {
+	margin-top: 10px;
+	padding: 10px;
+	color: #fff;
+	background: #191933;
+	border-radius: 6px 6px 6px 6px;
+
+	&:hover {
+		filter: brightness(1.05);
+	}
+
+	.title {
+		display: flex;
+		align-items: center;
+		gap: 6px;
+
+		.name {
+			font-family: Source Han Sans CN, Source Han Sans CN;
+			font-weight: bold;
+			font-size: 14px;
+			color: #FFFFFF;
+			text-align: left;
+			font-style: normal;
+			text-transform: none;
+		}
+	}
+
+	.rows {
+		margin-top: 10px;
+		display: flex;
+		flex-direction: column;
+		gap: 10px;
+
+		font-family: Source Han Sans CN, Source Han Sans CN;
+		font-weight: 400;
+		font-size: 12px;
+		color: #9E9EBA;
+		text-align: left;
+		font-style: normal;
+		text-transform: none;
+
+		.row {
+			line-height: 22px;
+
+			.label {
+				margin-right: 10px;
+				color: #D4D5D7;
+			}
+		}
+	}
+}
+</style>
diff --git a/applications/task-work-order/src/views/dataCockpit/components/templateComponents/RealEquipmentTemplate.vue b/applications/task-work-order/src/views/dataCockpit/components/templateComponents/RealEquipmentTemplate.vue
new file mode 100644
index 0000000..ed08cbf
--- /dev/null
+++ b/applications/task-work-order/src/views/dataCockpit/components/templateComponents/RealEquipmentTemplate.vue
@@ -0,0 +1,213 @@
+<template>
+	<div class="counter-card" @click="emit('click', data)">
+		<!-- 头部 -->
+		<div class="header">
+			<div class="title">
+				<span class="name">{{ data.name }}</span>
+
+				<span class="status">
+					<span :class="getStatusType(data.status)">
+
+					</span>
+
+					<span>
+						{{ getStatusText(data.status) }}
+					</span>
+				</span>
+			</div>
+		</div>
+
+		<!-- 字段区:两列 -->
+		<div class="content">
+			<div class="row">
+				<div class="col">
+					<span class="label">类型</span>
+					{{ data.type }}
+				</div>
+				<div class="col">
+					<span class="label">电量</span>
+					{{ data.batteryPct }}%
+				</div>
+			</div>
+
+			<div class="row">
+				<div class="col">
+					<span class="label">方位角</span>
+					{{ data.azimuth }}°
+				</div>
+				<div class="col">
+					<span class="label">俯仰角</span>
+					{{ data.elevation }}°
+				</div>
+			</div>
+
+			<div class="row">
+				<div class="col">
+					<span class="label">状态</span>
+					{{ getStatusText(data.status) }}
+				</div>
+				<div class="col">
+					<span class="label">厂商</span>
+					{{ data.manufacturer }}
+				</div>
+			</div>
+
+			<div class="row">
+				<div class="col">
+					<span class="label">侦测目标</span>
+					{{ data.detectTargetCnt }}台
+				</div>
+				<div class="col">
+					<span class="label">有效范围</span>
+					{{ data.effectiveRangeKm }}KM
+				</div>
+			</div>
+		</div>
+
+		<!-- 底部按钮 -->
+		<div class="footer">
+			<el-button color="#284FE3" type="primary" @click.stop="emit('history', data)">历史数据</el-button>
+		</div>
+	</div>
+</template>
+
+<script setup>
+defineProps({
+	data: {
+		type: Object,
+		required: true,
+		default: () => ({})
+	}
+})
+
+const emit = defineEmits(['history', 'click'])
+
+const getStatusText = (value) => {
+	if (value === 0 || value === '0') return '在线'
+	if (value === 1 || value === '1') return '离线'
+	if (value === 2 || value === '2') return '故障'
+	if (value === 3 || value === '3') return '报废'
+	return value || '-'
+}
+
+const getStatusType = (value) => {
+	if (value === 0 || value === '0') return 'detecting'
+	if (value === 2 || value === '2') return 'jamming'
+	return ''
+}
+</script>
+
+<style scoped lang="scss">
+.counter-card {
+	margin-top: 10px;
+	padding: 10px;
+	color: #fff;
+	background: #191933;
+	border-radius: 6px 6px 6px 6px;
+
+	&:first-child {
+		margin-top: 0;
+	}
+
+	.header {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+
+		.title {
+			display: flex;
+			align-items: center;
+			gap: 6px;
+
+			.name {
+				font-family: Source Han Sans CN, Source Han Sans CN;
+				font-weight: bold;
+				font-size: 14px;
+				color: #FFFFFF;
+				text-align: left;
+				font-style: normal;
+				text-transform: none;
+			}
+
+			.status {
+				padding: 0 10px;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				height: 21px;
+
+				background: #303041;
+				border-radius: 10px;
+				gap: 6px;
+
+				span {
+					font-family: Source Han Sans CN, Source Han Sans CN;
+					font-weight: 400;
+					font-size: 10px;
+					color: #FFFFFF;
+					text-align: center;
+					font-style: normal;
+					text-transform: none;
+				}
+
+
+				span.detecting {
+					width: 4px;
+					height: 4px;
+					background: #18FF4A;
+					border-radius: 50%;
+				}
+
+				span.jamming {
+					width: 4px;
+					height: 4px;
+					background: #FF4444;
+					border-radius: 50%;
+				}
+			}
+		}
+	}
+
+	.content {
+		font-family: Source Han Sans CN, Source Han Sans CN;
+		font-weight: 400;
+		font-size: 12px;
+		color: #9E9EBA;
+		text-align: left;
+		font-style: normal;
+		text-transform: none;
+
+		&>div {
+			margin-top: 10px;
+			line-height: 22px;
+
+			span.label {
+				margin-right: 10px;
+				color: #D4D5D7;
+			}
+		}
+
+		.row {
+			display: flex;
+
+			&>div {
+				width: 0;
+				flex: 1;
+			}
+		}
+	}
+
+	.footer {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		gap: 10px;
+		margin-top: 10px;
+
+		::v-deep(.el-button) {
+			width: 96px;
+			height: 36px;
+		}
+	}
+}
+</style>
diff --git a/applications/task-work-order/src/views/dataCockpit/components/templateComponents/RealTemplate.vue b/applications/task-work-order/src/views/dataCockpit/components/templateComponents/RealTemplate.vue
new file mode 100644
index 0000000..d29d7b4
--- /dev/null
+++ b/applications/task-work-order/src/views/dataCockpit/components/templateComponents/RealTemplate.vue
@@ -0,0 +1,245 @@
+<template>
+	<div class="drone-card">
+		<div class="header">
+			<div class="title">
+				<span class="name">{{ data.droneName }}</span>
+				<span class="status">
+					<span :class="getStatusType(data)">
+
+					</span>
+
+					<span>
+						{{ getStatusText(data) }}
+					</span>
+				</span>
+			</div>
+
+			<div class="actions">
+				<span class="star" @click="emit('favorite')">
+					{{ data.isFavorite ? '★' : '☆' }}
+				</span>
+			</div>
+		</div>
+
+		<div class="content">
+			<div>
+				<span class="label">序列号</span>
+				{{ data.droneSerialNo }}
+			</div>
+			<div>
+				<span class="label">数据源</span>
+				{{ getDataSource(data) }}
+			</div>
+			<div>
+				<span class="label">经纬度</span>
+				{{ data.longitude }}, {{ data.latitude }}
+			</div>
+			<div class="row">
+				<div class="col">
+					<span class="label">信号频段</span>
+					{{ formatFrequency(data.signalFreqMhz) }}
+				</div>
+				<div class="col">
+					<span class="label">发现时间</span>
+					{{ getAlarmTime(data.alarmTime) }}
+				</div>
+			</div>
+			<div class="row">
+				<div class="col">
+					<span class="label">飞行高度</span>
+					{{ formatHeight(data.flightHeightM) }}
+				</div>
+				<div class="col">
+					<span class="label">飞行速度</span>
+					{{ formatSpeed(data.flightSpeedMs) }}
+				</div>
+			</div>
+		</div>
+
+		<div class="footer">
+			<el-button class="general" color="#2B2B4C" @click="emit('signal')">信号干扰</el-button>
+			<el-button color="#284FE3" type="primary" @click="emit('counter')">诱导驱离</el-button>
+		</div>
+	</div>
+</template>
+
+<script setup>
+const props = defineProps({
+	data: {
+		type: Object,
+		required: true,
+		default: () => ({})
+	}
+})
+
+const emit = defineEmits(['signal', 'counter', 'favorite'])
+
+const getStatusText = (item) => {
+	const status = item?.flightStatus
+	if (status === 1 || status === '1') return '侦测中'
+	if (status === 2 || status === '2') return '反制中'
+	return status || '侦测中'
+}
+
+const getStatusType = (item) => {
+	const statusText = getStatusText(item)
+	const counterWay = item?.counterWay
+	if (statusText.includes('反制') || counterWay === 2 || counterWay === '2' || counterWay === '诱导驱离') {
+		return 'countering'
+	}
+	return 'detecting'
+}
+
+const getDataSource = (item) => {
+	return item?.deviceName || item?.areaName || '-'
+}
+
+const formatFrequency = (value) => {
+	if (value == null || value === '') return '-'
+	return `${value}MHz`
+}
+
+const getAlarmTime = (value) => {
+	if (!value) return '-'
+	const parts = value.replace('T', ' ').split(' ')
+	return parts[1] || value
+}
+
+const formatHeight = (value) => {
+	if (value == null || value === '') return '-'
+	return `${value}m`
+}
+
+const formatSpeed = (value) => {
+	if (value == null || value === '') return '-'
+	return `${value}m/s`
+}
+</script>
+
+<style scoped lang="scss">
+.drone-card {
+	margin-top: 10px;
+	padding: 10px;
+	color: #fff;
+	background: #191933;
+	border-radius: 6px 6px 6px 6px;
+
+	&:hover {
+		background: #29294D;
+		;
+	}
+
+	&:first-child {
+		margin-top: 0;
+	}
+
+	.header {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+
+		.title {
+			display: flex;
+			align-items: center;
+			gap: 6px;
+
+			.name {
+				font-family: Source Han Sans CN, Source Han Sans CN;
+				font-weight: bold;
+				font-size: 14px;
+				color: #FFFFFF;
+				text-align: left;
+				font-style: normal;
+				text-transform: none;
+			}
+
+			.status {
+				padding: 0 10px;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				height: 21px;
+
+				background: #303041;
+				border-radius: 10px;
+				gap: 6px;
+
+				span {
+					font-family: Source Han Sans CN, Source Han Sans CN;
+					font-weight: 400;
+					font-size: 10px;
+					color: #FFFFFF;
+					text-align: center;
+					font-style: normal;
+					text-transform: none;
+				}
+
+
+				span.detecting {
+					width: 4px;
+					height: 4px;
+					background: #18FF4A;
+					border-radius: 50%;
+				}
+
+				span.countering {
+					width: 4px;
+					height: 4px;
+					background: #FF4444;
+					border-radius: 50%;
+				}
+			}
+		}
+
+		.actions {
+			display: flex;
+			gap: 8px;
+			font-size: 16px;
+			cursor: pointer;
+		}
+	}
+
+	.content {
+		font-family: Source Han Sans CN, Source Han Sans CN;
+		font-weight: 400;
+		font-size: 12px;
+		color: #9E9EBA;
+		text-align: left;
+		font-style: normal;
+		text-transform: none;
+
+		&>div {
+			margin-top: 10px;
+			line-height: 22px;
+
+			span.label {
+				margin-right: 10px;
+				color: #D4D5D7;
+			}
+		}
+
+		.row {
+			display: flex;
+			justify-content: space-between;
+		}
+	}
+
+	.footer {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		gap: 10px;
+		margin-top: 10px;
+
+		::v-deep(.el-button) {
+			width: 96px;
+			height: 36px;
+
+			&.general.el-button {
+				border-radius: 4px 4px 4px 4px;
+				border: 1px solid rgba(255, 255, 255, 0.5);
+			}
+		}
+	}
+}
+</style>
diff --git a/applications/task-work-order/src/views/dataCockpit/components/templateComponents/TitleTemplate.vue b/applications/task-work-order/src/views/dataCockpit/components/templateComponents/TitleTemplate.vue
new file mode 100644
index 0000000..9d3c9b0
--- /dev/null
+++ b/applications/task-work-order/src/views/dataCockpit/components/templateComponents/TitleTemplate.vue
@@ -0,0 +1,43 @@
+<!--
+ * @Author       : yuan
+ * @Date         : 2026-01-08 09:32:52
+ * @LastEditors  : yuan
+ * @LastEditTime : 2026-01-08 09:43:00
+ * @FilePath     : \applications\drone-command\src\views\dataCockpit\components\templateComponents\TitleTemplate.vue
+ * @Description  : 
+ * Copyright 2026 OBKoro1, All Rights Reserved. 
+ * 2026-01-08 09:32:52
+-->
+<template>
+	<div class="title-box">
+		<div class="title">
+			<slot></slot>
+		</div>
+	</div>
+</template>
+
+<script setup>
+
+</script>
+
+<style lang="scss" scoped>
+.title-box {
+	padding-left: 26px;
+	background: url('@/assets/images/dataCockpit/title-bg.png') center / 100% 100% no-repeat;
+	height: 34px;
+
+	.title {
+		height: 25px;
+		line-height: 25px;
+
+		font-family: PangMen; 
+		font-weight: 400;
+		font-size: 18px;
+		color: #FFFFFF;
+		letter-spacing: 1px;
+		text-align: left;
+		font-style: normal;
+		text-transform: none;
+	}
+}
+</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/dataCockpit/index.vue b/applications/task-work-order/src/views/dataCockpit/index.vue
new file mode 100644
index 0000000..137328a
--- /dev/null
+++ b/applications/task-work-order/src/views/dataCockpit/index.vue
@@ -0,0 +1,96 @@
+<!--
+ * @Author       : yuan
+ * @Date         : 2026-01-06 16:35:50
+ * @LastEditors  : yuan
+ * @LastEditTime : 2026-01-09 16:34:39
+ * @FilePath     : \applications\drone-command\src\views\dataCockpit\index.vue
+ * @Description  : 
+ * Copyright 2026 OBKoro1, All Rights Reserved. 
+ * 2026-01-06 16:35:50
+-->
+<template>
+  <div class="page-container">
+    <DeviceMapContainer
+      :online-devices="onlineDevices"
+      :left-collapsed="leftCollapsed"
+      container-id="data-cockpit-map"
+    />  
+    <LeftContainer class="left-container" v-model:activeId="leftActiveId" v-model:collapsed="leftCollapsed" />  
+    <RightContainer class="right-container" v-model:collapsed="rightCollapsed" v-model:onlineDevices="onlineDevices" />  
+    <CenterContainer @select-warning="onSelectWarning" @select-equipment="onSelectEquipment" />  
+  </div>
+</template>
+
+<script setup>
+  import DeviceMapContainer from '@/components/map-container/device-map-container.vue';
+  import LeftContainer from './components/LeftContainer.vue';
+  import RightContainer from './components/RightContainer.vue';
+  import CenterContainer from './components/CenterContainer.vue';
+
+  const leftActiveId = ref(1);
+  const leftCollapsed = ref(false);
+
+  const rightCollapsed = ref(false);
+  const onlineDevices = ref([]);
+
+  const onSelectWarning = (type) => {
+    leftActiveId.value = type;
+    leftCollapsed.value = false;
+  };
+
+  const onSelectEquipment = () => {
+    rightCollapsed.value = false;
+  };
+</script>
+
+<style scoped lang="scss">
+  .page-container {
+    position: relative;
+    width: 100%;
+    height: 100%;
+  }
+
+  .left-container,
+  .right-container {
+    position: absolute;
+    top: 96px;
+    bottom: 0;
+    width: 401px;
+    z-index: 9;
+    backdrop-filter: blur(2px);
+
+    ::v-deep(.wrapper) {
+      display: flex;
+      flex-direction: column;
+      position: absolute;
+      top: 17px;
+      bottom: 20px;
+      padding: 20px;
+      width: 300px;
+      background: rgba(0,0,0,0.3);
+      backdrop-filter: blur(16px);
+      border-radius: 10px 10px 10px 10px;
+    }
+  }
+
+  .left-container {
+    top: 96px;
+    left: 0;
+    background: linear-gradient( 270deg, rgba(17,23,34,0) 0%, rgba(17,23,34,0.56) 50%, rgba(17,23,34,0.96) 100%);
+
+    ::v-deep(.wrapper) {
+      left: 17px;
+    }
+  }
+
+  .right-container {
+    top: 54px;
+    right: 0;
+    background: linear-gradient( 270deg, rgba(17,23,34,0.96) 0.16%, rgba(17,23,34,0.56) 57.57%, rgba(4,30,37,0) 100%);
+
+    ::v-deep(.wrapper) {
+      top: 21px;
+      right: 17px;
+    }
+  }
+</style>
diff --git a/applications/task-work-order/src/views/desk/notice.vue b/applications/task-work-order/src/views/desk/notice.vue
deleted file mode 100644
index 84a2b12..0000000
--- a/applications/task-work-order/src/views/desk/notice.vue
+++ /dev/null
@@ -1,307 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud
-      :option="option"
-      :table-loading="loading"
-      :data="data"
-      v-model:page="page"
-      ref="crud"
-      @row-del="rowDel"
-      v-model="form"
-      :permission="permissionList"
-      @row-update="rowUpdate"
-      @row-save="rowSave"
-      :before-open="beforeOpen"
-      @search-change="searchChange"
-      @search-reset="searchReset"
-      @selection-change="selectionChange"
-      @current-change="currentChange"
-      @size-change="sizeChange"
-      @refresh-change="refreshChange"
-      @on-load="onLoad"
-    >
-      <template #menu-left>
-        <el-button
-          type="danger"
-          icon="el-icon-delete"
-          plain
-          v-if="permission.notice_delete"
-          @click="handleDelete"
-          >删 除
-        </el-button>
-      </template>
-      <template #="{ row }">
-        <el-tag>{{ row.categoryName }}</el-tag>
-      </template>
-    </avue-crud>
-  </basic-container>
-</template>
-
-<script>
-import { getList, remove, update, add, getNotice } from '@/api/desk/notice';
-import { mapGetters } from 'vuex';
-
-export default {
-  data() {
-    return {
-      form: {},
-      query: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      selectionList: [],
-      option: {
-        dialogWidth: 950,
-        tip: false,
-        searchShow: true,
-        searchMenuSpan: 6,
-        border: true,
-        index: true,
-        viewBtn: true,
-        selection: true,
-        excelBtn: true,
-        dialogClickModal: false,
-        grid: false,
-        column: [
-          {
-            label: '通知标题',
-            prop: 'title',
-            span: 24,
-            row: true,
-            search: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入通知标题',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '通知类型',
-            type: 'select',
-            dicUrl: '/blade-system/dict/dictionary?code=notice',
-            props: {
-              label: 'dictValue',
-              value: 'dictKey',
-            },
-            dataType: 'number',
-            slot: true,
-            prop: 'category',
-            search: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入通知类型',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '通知时间',
-            prop: 'releaseTimeRange',
-            type: 'datetime',
-            format: 'YYYY-MM-DD HH:mm:ss',
-            valueFormat: 'YYYY-MM-DD HH:mm:ss',
-            searchRange: true,
-            hide: true,
-            addDisplay: false,
-            editDisplay: false,
-            viewDisplay: false,
-            search: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入通知时间',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '通知日期',
-            prop: 'releaseTime',
-            type: 'date',
-            gridRow: true,
-            format: 'YYYY-MM-DD HH:mm:ss',
-            valueFormat: 'YYYY-MM-DD HH:mm:ss',
-            rules: [
-              {
-                required: true,
-                message: '请输入通知日期',
-                trigger: 'click',
-              },
-            ],
-          },
-          {
-            label: '通知内容',
-            prop: 'content',
-            component: 'avue-ueditor',
-            action: '/blade-resource/oss/endpoint/put-file',
-            propsHttp: {
-              res: 'data',
-              url: 'link',
-            },
-            hide: true,
-            minRows: 4,
-            span: 24,
-          },
-        ],
-      },
-      data: [],
-    };
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList() {
-      return {
-        addBtn: this.validData(this.permission.notice_add, false),
-        viewBtn: this.validData(this.permission.notice_view, false),
-        delBtn: this.validData(this.permission.notice_delete, false),
-        editBtn: this.validData(this.permission.notice_edit, false),
-      };
-    },
-    ids() {
-      let ids = [];
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id);
-      });
-      return ids.join(',');
-    },
-  },
-  methods: {
-    rowSave(row, done, loading) {
-      add(row).then(
-        () => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          done();
-        },
-        error => {
-          window.console.log(error);
-          loading();
-        }
-      );
-    },
-    rowUpdate(row, index, done, loading) {
-      update(row).then(
-        () => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          done();
-        },
-        error => {
-          window.console.log(error);
-          loading();
-        }
-      );
-    },
-    rowDel(row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-        });
-    },
-    searchReset() {
-      this.query = {};
-      this.onLoad(this.page);
-    },
-    searchChange(params, done) {
-      this.query = params;
-      this.page.currentPage = 1;
-      this.onLoad(this.page, params);
-      done();
-    },
-    selectionChange(list) {
-      this.selectionList = list;
-    },
-    selectionClear() {
-      this.selectionList = [];
-      this.$refs.crud.toggleSelection();
-    },
-    handleDelete() {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据');
-        return;
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          this.$refs.crud.toggleSelection();
-        });
-    },
-    beforeOpen(done, type) {
-      if (['edit', 'view'].includes(type)) {
-        getNotice(this.form.id).then(res => {
-          this.form = res.data.data;
-        });
-      }
-      done();
-    },
-    currentChange(currentPage) {
-      this.page.currentPage = currentPage;
-    },
-    sizeChange(pageSize) {
-      this.page.pageSize = pageSize;
-    },
-    refreshChange() {
-      this.onLoad(this.page, this.query);
-    },
-    onLoad(page, params = {}) {
-      const { releaseTimeRange } = this.query;
-      let values = {
-        ...params,
-        ...this.query,
-      };
-      if (releaseTimeRange) {
-        values = {
-          ...values,
-          releaseTime_datege: releaseTimeRange[0],
-          releaseTime_datelt: releaseTimeRange[1],
-        };
-        values.releaseTimeRange = null;
-      }
-      this.loading = true;
-      getList(page.currentPage, page.pageSize, values).then(res => {
-        const data = res.data.data;
-        this.page.total = data.total;
-        this.data = data.records;
-        this.loading = false;
-        this.selectionClear();
-      });
-    },
-  },
-};
-</script>
-
-<style></style>
diff --git a/applications/task-work-order/src/views/device/addDevice.vue b/applications/task-work-order/src/views/device/addDevice.vue
deleted file mode 100644
index 43272f4..0000000
--- a/applications/task-work-order/src/views/device/addDevice.vue
+++ /dev/null
@@ -1,688 +0,0 @@
-<template>
-    <basic-container>
-        <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" ref="crud"
-            @row-del="rowDel" v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave"
-            :before-open="beforeOpen" @search-change="searchChange" @search-reset="searchReset"
-            @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
-            @refresh-change="refreshChange" @on-load="onLoad">
-
-            <template #menu="scope">
-                <el-button type="primary" text icon="el-icon-copy-document"
-                    @click.stop="copyInfo(scope.row, scope.index)" v-if="userInfo.role_name.includes('admin')">复制
-                </el-button>
-            </template>
-        </avue-crud>
-    </basic-container>
-</template>
-
-<script>
-import {
-    getList,
-    remove,
-    update,
-    add,
-    getDetail,
-} from '@/api/device/workspaces'
-
-import { getList as getSystemNames } from '@/api/system/sysConfig'
-import { getRegionTreeAll } from '@/api/job/task';
-
-import { getLazyTree } from '@/api/base/region'
-
-import { mapGetters } from 'vuex'
-import { $Clipboard } from "@smallwei/avue"
-
-
-export default {
-    components: {
-    },
-
-    data () {
-        return {
-            xzqhData: [],
-            systemNamesList: [],
-            // 用于记录已经创建的websocket,防止重复创建
-            webSocketIdSet: new Set(),
-            // 用于保存多组websocket
-            websocketMap: new Map(),
-            scheduleNum: 0,
-            webSocket: '',
-            devicePerShareVisible: false,
-            remoteDebuggingShow: false,
-            curDeviceInfo: {},
-            firmwareManageVisible: false,
-            percentageNum: 0,
-            firmwareBox: false,
-            firmwareInfo: {},
-            form: {},
-            query: {},
-            firmwareVersion: '',
-            loading: true,
-            page: {
-                pageSize: 10,
-                currentPage: 1,
-                total: 0,
-            },
-            selectionList: [],
-            option: {
-              emptyBtnText: '重置',
-              emptyBtnIcon: 'el-icon-refresh',
-                addTitle: '设备注册',
-                menuWidth: 300,
-                lazy: true,
-                tree: true,
-
-                dialogWidth: 1050,
-                searchGutter: 30,
-                searchMenuPosition: 'left',
-                searchMenuSpan: 4,
-                tip: false,
-                searchShow: true,
-                border: true,
-                index: true,
-                indexLabel: '序号',
-                indexWidth: 60,
-                viewBtn: true,
-                selection: false,
-                excelBtn: false,
-                addBtn: true,
-                addBtnText: '设备注册',
-                dialogClickModal: false,
-                grid: false,
-
-                height: 'auto',
-                calcHeight: 20,
-                column: [
-                    {
-                        label: '设备名称',// '工作空间名称',
-                        prop: 'workspace_name',
-                        // editDisabled: true,
-                        editDisplay: false,
-                        labelWidth: 130,
-                        search: true,
-                        searchSpan: 4,
-                        rules: [
-                            {
-                                required: true,
-                                message: '请输入设备名称',
-                                trigger: 'blur',
-                            },
-                        ],
-                    },
-                    {
-                        label: '系统名称',// '平台名称',
-                        prop: 'platform_name',
-                        labelWidth: 130,
-                        width: 180,
-                        // editDisabled: true,
-                        editDisplay: false,
-                        type: 'select',
-                        dicData: this.systemNamesDicData,
-                        rules: [
-                            {
-                                required: false,
-                                message: '请输入系统名称',
-                                trigger: 'blur',
-                            },
-                        ],
-                    },
-                    {
-                        label: '所属部门',
-                        prop: 'dept_name',
-                        addDisplay: false,
-                        editDisplay: false,
-                        viewDisplay: false,
-                        labelWidth: 130,
-                        width: 180,
-                        rules: [
-                        {
-                            required: true,
-                            message: '请输入所属部门',
-                            trigger: 'blur',
-                        },
-                        ],
-                    },
-                    {
-                        label: '所属部门',
-                        prop: 'dept_id',
-                        hide: true,
-                        type: 'tree',
-                        defaultExpandAll: true,
-                        search: true,
-                        searchSpan: 4,
-                        labelWidth: 130,
-                        dicUrl: '/blade-system/dept/getTree',
-                        props: {
-                        label: 'name',
-                        value: 'id',
-                        },
-                        rules: [
-                        {
-                            required: true,
-                            message: '请输入所属部门',
-                            trigger: 'blur',
-                        },
-                        ],
-                    },
-                    {
-                        label: '绑定编号',
-                        prop: 'bind_code',
-                        labelWidth: 130,
-                        // editDisabled: true,
-                        editDisplay: false,
-                        rules: [
-                            {
-                                required: false,
-                                message: '请输入绑定编号',
-                                trigger: 'blur',
-                            },
-                        ],
-                    },
-                    {
-                        label: '设备类型',
-                        editDisplay: false,
-                        prop: 'type',
-                        labelWidth: 130,
-                        value: 0,
-                        type: 'select',
-                        dicData: [
-                            {
-                                label: '机巢',
-                                value: 0
-                            },
-                            {
-                                label: '控制器',
-                                value: 1
-                            }
-                        ],
-                        rules: [
-                            {
-                                required: true,
-                                message: '请选择设备类型',
-                                trigger: 'change',
-                            },
-                        ],
-                    },
-                    {
-                        label: '设备位置',// '行政区划',
-                        prop: 'area_name',
-                        // hide: true,
-                        overHidden: true,
-                        addDisplay: false, //新增显示
-                        editDisplay: false, //编辑显示
-                        viewDisplay: true, //查看显示
-                        labelWidth: 130,
-                        width: 200,
-                    },
-                    {
-                      label: '设备位置',
-                      prop: 'area_code',
-                      // type: 'cascader',
-                      type: 'tree',
-                      labelWidth: 130,
-                      searchSpan: 4,
-                      hide: true,
-                      search: true,
-                      // overHidden: true,
-                      editDisplay: true,
-                      viewDisplay: true,
-                      checkStrictly: true,
-                      defaultExpandAll: true,
-                      dicData: [],
-                      props: {
-                        label: 'name',
-                        value: 'id',
-                        children: 'childrens',
-                      },
-                      rules: [
-                        {
-                          required: true,
-                          message: '请选择设备位置',
-                          trigger: 'change',
-                        },
-                      ],
-                    },
-                    {
-                        label: '创建时间',
-                        prop: 'create_time',
-                        addDisplay: false,
-                        editDisplay: false,
-                        overHidden: true,
-                        type: 'date',
-                        labelWidth: 130,
-                        width: 160,
-                        format: 'YYYY-MM-DD HH:mm:ss',
-
-                    },
-                    {
-                        label: '设备描述', // '工作空间描述',
-                        prop: 'workspace_desc',
-                        type: 'textarea',
-                        labelWidth: 130,
-                        searchSpan: 4,
-                        overHidden: true,
-                        minRows: 3,
-                        maxRows: 5,
-                        maxlength: 250,
-                        span: 24,
-                        showWordLimit: true,
-                        rules: [
-                            {
-                                required: true,
-                                message: '请输入设备描述不能超过250个字',
-                                trigger: 'blur',
-                            },
-                            {
-                                max: 250,
-                                message: '设备描述不能超过250个字',
-                                trigger: 'blur',
-                            },
-                            // 如果需要更严格的校验(如中文字符计算),可以使用 validator
-                            {
-                                validator: (rule, value, callback) => {
-                                    if (value && value.length > 250) {
-                                        callback(new Error('设备描述不能超过250个字'));
-                                    } else {
-                                        callback();
-                                    }
-                                },
-                                trigger: 'blur',
-                            },
-                        ],
-                    },
-
-
-
-
-                ],
-            },
-            data: [],
-
-        }
-    },
-    computed: {
-        ...mapGetters(['userInfo', 'permission']),
-        permissionList () {
-            return {
-                addBtn: this.validData(this.permission.airport_add, false),
-                viewBtn: this.validData(this.permission.airport_view, true),
-                delBtn: this.validData(this.permission.airport_delete, false),
-                editBtn: this.validData(this.permission.airport_edit, false),
-            }
-        },
-        ids () {
-            let ids = []
-            this.selectionList.forEach(ele => {
-                ids.push(ele.id)
-            })
-            return ids.join(',')
-        },
-        systemNamesDicData() {
-            return this.systemNamesList.map(item => ({
-                label: item.name,
-                value: item.id,
-            }));
-        },
-    },
-    destroyed () {
-        this.websocketMap.forEach((k, v) => {
-            if (null != v) {
-                v.close()
-                this.websocketMap.delete(k)
-                this.webSocketIdSet.delete(k)
-            }
-        })
-    },
-    async created() {
-        await this.getRegionTreeList();
-        await this.getSystemNamesList();
-    },
-    mounted() {
-      getRegionTreeAll({ parentCode: this.userInfo.detail.areaCode }).then(res => {
-        const column = this.findObject(this.option.column, 'area_code');
-        column.dicData = res.data.data ? [res.data.data] : [];
-      });
-    },
-    methods: {
-        async getRegionTreeList(code) {
-            try {
-                const res = await getRegionTreeAll({ parentCode: code });
-                return res.data.data; // 返回数据而不是赋值给 this.xzqhData
-            } catch (error) {
-                console.error('获取区域树数据失败:', error);
-                return null;
-            }
-        },
-        async getSystemNamesList() {
-            try {
-                const res = await getSystemNames(1, 99);
-                if (res?.data?.data?.records) {
-                    this.systemNamesList = res.data.data.records;
-                    // 找到平台名称列的索引
-                    const columnIndex = this.option.column.findIndex(col => col.prop === 'platform_name');
-                    if (columnIndex !== -1) {
-                        // 直接更新 dicData
-                        this.option.column[columnIndex].dicData = this.systemNamesList.map(item => ({
-                            label: item.name,
-                            value: item.id
-                        }));
-                    }
-                }
-            } catch (error) {
-                console.error('获取系统名称失败:', error);
-                this.systemNamesList = [];
-            }
-        },
-        // beforeOpen (type, row, index) {
-        //     if (type === 'add') {
-        //         this.form = {
-        //             workspace_name: '',
-        //             platform_name: '',
-        //             dept_name: '',
-        //             bind_code: '',
-        //             type: 0,
-        //             workspace_desc: '',
-        //             area_name: '',
-        //             area_code: '',
-        //         }
-        //     }
-        // },
-        async getXZQHList(area_code) {
-            try {
-                const res = await getLazyTree(area_code);
-                return res.data.data; // 返回数据,而不是直接修改 this.xzqhData
-            } catch (error) {
-                console.error('获取行政区划数据失败:', error);
-                return [];
-            }
-        },
-        findNodeById(tree, id) {
-            if (tree.id === id) {
-                return tree;
-            }
-            if (tree.childrens && tree.childrens.length > 0) {
-                for (const child of tree.childrens) {
-                    const found = this.findNodeById(child, id);
-                    if (found) return found;
-                }
-            }
-            return null;
-        },
-        async fetchAreaName(areaCode) {
-            if (!areaCode) return '/';
-            try {
-                const response = await this.getFullAreaCode(areaCode);
-                const codes = response.split(',');
-
-                // 获取区域树数据
-                const xzqhData = await this.getRegionTreeList(codes[0]);
-                if (!xzqhData) return '/';
-
-                const names = [];
-                for (const code of codes) {
-                    const node = this.findNodeById(xzqhData, code);
-                    if (node) {
-                        names.push(node.name);
-                    }
-                }
-
-                return names.join('');
-            } catch (error) {
-                console.error('获取区域名称失败:', error);
-                return '/';
-            }
-        },
-
-        copyInfo (row, index) {
-          const ipAddress = import.meta.env.VITE_APP_DEVICE_IP
-          let params = `
-            网关地址: tcp://${ipAddress}
-            账号:drone
-            密码:drone@123
-            组织id:${row.bing_id}
-            设备码:${row.bind_code}
-            机场名称:${row.workspace_name}
-            aircrattName:${row.workspace_desc}`
-          $Clipboard({
-            text: params,
-          }).then(() => {
-            this.$message.success("复制成功")
-          }).catch(() => {
-            this.$message.error("复制失败")
-          })
-        },
-        init () {
-            this.onLoad(this.page)
-        },
-
-        handleOpenRemoteDebugging (row) {
-            this.curDeviceInfo = row
-            this.remoteDebuggingShow = true
-        },
-
-        rowSave (row, done, loading) {
-            let areaCode = row.area_code
-            if (Array.isArray(areaCode)) {
-                areaCode = areaCode[areaCode.length - 1]
-            } else if (typeof areaCode === 'string' && areaCode.includes(',')) {
-                const codes = areaCode.split(',')
-                areaCode = codes[codes.length - 1]
-            }
-            row.area_code = areaCode || null
-            add(row).then(
-                () => {
-                    this.onLoad(this.page)
-                    this.$message({
-                        type: 'success',
-                        message: '操作成功!',
-                    })
-                    done()
-                },
-                error => {
-                    window.console.log(error)
-                    loading()
-                }
-            )
-        },
-        rowUpdate (row, index, done, loading) {
-            const submitData = {
-                ...row,
-                area_code: row.area_code.split(',').pop(),
-            }
-            update(submitData).then(
-                () => {
-                    this.onLoad(this.page)
-                    this.$message({
-                        type: 'success',
-                        message: '操作成功!',
-                    })
-                    done()
-                },
-                error => {
-                    window.console.log(error)
-                    loading()
-                }
-            )
-        },
-        rowDel (row) {
-            this.$confirm('确定将选择数据删除?', {
-                confirmButtonText: '确定',
-                cancelButtonText: '取消',
-                type: 'warning',
-            })
-                .then(() => {
-                    return remove(row.id)
-                })
-                .then(() => {
-                    this.onLoad(this.page)
-                    this.$message({
-                        type: 'success',
-                        message: '操作成功!',
-                    })
-                })
-        },
-        searchReset () {
-            this.query = {}
-            this.onLoad(this.page)
-        },
-        searchChange (params, done) {
-            this.query = params
-            this.page.currentPage = 1
-            this.onLoad(this.page, params)
-            done()
-        },
-        selectionChange (list) {
-            this.selectionList = list
-        },
-        selectionClear () {
-            this.selectionList = []
-            this.$refs.crud.toggleSelection()
-        },
-        handleDelete () {
-            if (this.selectionList.length === 0) {
-                this.$message.warning('请选择至少一条数据')
-                return
-            }
-            this.$confirm('确定将选择数据删除?', {
-                confirmButtonText: '确定',
-                cancelButtonText: '取消',
-                type: 'warning',
-            })
-                .then(() => {
-                    return remove(this.ids)
-                })
-                .then(() => {
-                    this.onLoad(this.page)
-                    this.$message({
-                        type: 'success',
-                        message: '操作成功!',
-                    })
-                    this.$refs.crud.toggleSelection()
-                })
-        },
-        async getFullAreaCode (areaCode) {
-            if (!areaCode) return ''
-
-            const code = areaCode.toString()
-
-            if (code.includes(',')) return code
-
-            if (code.endsWith('0000000000')) {
-                return code
-            } else if (code.endsWith('00000000') && !code.endsWith('0000000000')) {
-                const provinceCode = code.substring(0, 2) + '0000000000'
-                return `${provinceCode},${code}`
-            } else {
-                const provinceCode = code.substring(0, 2) + '0000000000'
-                const cityCode = code.substring(0, 4) + '00000000'
-                return `${provinceCode},${cityCode},${code}`
-            }
-        },
-        beforeOpen (done, type) {
-            if (type === 'add') {
-              this.form = {
-                workspace_name: '',
-                platform_name: '',
-                dept_name: '',
-                bind_code: '',
-                type: 0,
-                workspace_desc: '',
-                area_name: '',
-                area_code: '',
-              }
-            }
-            if (['edit', 'view'].includes(type)) {
-                getDetail(this.form.id).then(async res => {
-                    const data = res.data.data
-                     this.form = {
-                        ...data,
-                        // area_code: await this.getFullAreaCode(data.area_code),
-                     }
-                })
-            }
-            done()
-        },
-        currentChange (currentPage) {
-            this.page.currentPage = currentPage
-        },
-        sizeChange (pageSize) {
-            this.page.pageSize = pageSize
-        },
-        refreshChange () {
-            this.onLoad(this.page, this.query)
-        },
-        onLoad (page, params = {}) {
-
-            const { releaseTimeRange } = this.query
-            let values = {
-                ...params,
-                ...this.query,
-            }
-            if (releaseTimeRange) {
-                values = {
-                    ...values,
-                    releaseTime_datege: releaseTimeRange[0],
-                    releaseTime_datelt: releaseTimeRange[1],
-                }
-                values.releaseTimeRange = null
-            }
-            console.log(values.area_code,this.query)
-            values['type'] = 1
-            if (values.area_code) {
-                values['area_code'] = values.area_code.split(',').pop()
-            }
-
-            this.loading = true
-            getList(page.currentPage, page.pageSize, values).then(async res => {
-                const data = res.data.data
-                this.page.total = data.total
-                // data.records.forEach(e => {
-                //     e['hasChildren'] = e.has_children;
-                //     if (e.firmware_status == 4) {
-                //         this.connectWebSocket(e);
-                //     }
-                // });
-                this.data = data.records
-                for (const row of this.data) {
-                if (row.area_code) {
-                    row.area_name = await this.fetchAreaName(row.area_code);
-                }
-                }
-                this.loading = false
-                this.selectionClear()
-            })
-
-        },
-        treeLoad (tree, treeNode, resolve) {
-            var params = {
-                childSn: tree.child_sn,
-            }
-            getList(1, 10, params).then(res => {
-                const data = res.data.data.records
-                resolve(data)
-            })
-        },
-    },
-}
-</script>
-
-<style lang="scss" scoped>
-.firmware_status {
-    background-color: aqua;
-    border-radius: 4px;
-}
-
-.firmware_status:hover {
-    cursor: pointer;
-    /* color: aqua; */
-}
-
-.active-element {
-    cursor: pointer;
-
-    &:hover {
-        background-color: #409eff;
-        border-color: #409eff;
-    }
-}
-</style>
diff --git a/applications/task-work-order/src/views/device/airport.vue b/applications/task-work-order/src/views/device/airport.vue
deleted file mode 100644
index 5d83c15..0000000
--- a/applications/task-work-order/src/views/device/airport.vue
+++ /dev/null
@@ -1,1687 +0,0 @@
-<template>
-  <basic-main-content>
-    <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" ref="crud" @row-del="rowDel"
-      v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave" :before-open="beforeOpen"
-      @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
-      @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad"
-      @tree-load="treeLoad">
-      <template #menu-left>
-        <el-button type="danger" icon="el-icon-delete" plain v-if="permission.device_delete" @click="handleDelete">删 除
-        </el-button>
-      </template>
-      <template #dept_name="{ row }">
-        <el-tag v-if="row.dept_name">{{ row.dept_name }}</el-tag>
-        <span v-else>/</span>
-      </template>
-      <template #status="{ row }">
-        <div v-if="row.status == true" class="onlineStatus">
-          <div class="onlineStatus-dot"></div>
-          <span class="online">在线</span>
-        </div>
-        <div v-if="row.status == false" class="onlineStatus">
-          <div class="onlineStatus-dot1"></div>
-          <span class="online">离线</span>
-        </div>
-      </template>
-      <template #firmware_status="{ row }">
-        <div v-if="row.firmware_status == 1" class="onlineStatus1">
-          <el-tag type="info">无需升级</el-tag>
-<!--          <el-tag type="primary" effect="dark" class="active-element" @click="rollFirmware(row)">版本管理</el-tag>-->
-          <!-- <div style="background-color: #f1f1f1; border-radius: 4px">无需升级</div> -->
-        </div>
-        <div v-if="row.firmware_status == 2" class="onlineStatus1">
-          <!-- <el-tag type="success" effect="dark" class="active-element" @click="updateFirmware(row)"
-            >升级固件</el-tag
-          > -->
-<!--          <el-tag type="primary" effect="dark" class="active-element" @click="rollFirmware(row)">版本管理</el-tag>-->
-          <!-- <div @click="updateFirmware(row)" class="firmware_status">升级固件</div> -->
-        </div>
-        <div v-if="row.firmware_status == 3" class="onlineStatus">
-<!--          <el-tag type="success" effect="dark" class="active-element" @click="updateFirmware(row)">一致性升级</el-tag>-->
-          <!-- <div @click="updateFirmware(row)" class="firmware_status">一致性升级</div> -->
-        </div>
-        <div v-if="row.firmware_status == 4" class="onlineStatus">
-          <el-tag effect="dark" class="active-element" @click="updateFirmware(row)">升级中</el-tag>
-          <el-progress v-if="row.firmware_progress > 0 && row.firmware_progress < 100"
-            :percentage="row.firmware_progress"></el-progress>
-        </div>
-      </template>
-      <template #domain="{ row }">
-        <span class="text">
-          {{ row.domain == 3 ? '机巢' : row.domain == 0 ? '无人机' : '其他' }}
-        </span>
-      </template>
-      <template #mode_code="{ row }">
-        <div  class="onlineStatus" v-if="row.domain == 3 || row.domain == 0" :style="row.mode_code != '-1' ? 'color: #00ee8b' : 'color: #de5e5e'">
-          <div>{{ getModelText(row.mode_code) }}</div>
-          <el-progress
-              v-if="row.firmware_progress > 0 && row.firmware_progress < 100 && row.mode_code == 3"
-              :percentage="row.firmware_progress"></el-progress>
-        </div>
-      </template>
-      <template #menu="scope">
-        <el-dropdown>
-          <el-button type="primary" text v-if="permission.oss_set"><el-icon>
-              <MoreFilled />
-            </el-icon>更多</el-button>
-          <template #dropdown v-if="scope.row.domain == 3">
-            <el-dropdown-menu teleported>
-              <el-dropdown-item command="a" v-if="permission.oss_set">
-                <el-button type="primary" text icon="el-icon-paperclip"
-                  @click.stop="handleOpenOssSet(scope.row, scope.index)">存储配置</el-button>
-              </el-dropdown-item>
-              <el-dropdown-item command="b" v-if="permission.per_share && scope.row.domain == 3">
-                <el-button type="primary" text icon="el-icon-share"
-                  @click.stop="handleOpenDevicePerShare(scope.row, scope.index)">机场授权</el-button>
-              </el-dropdown-item>
-              <el-dropdown-item command="c" v-if="permission.rang_con && scope.row.domain == 3">
-                <el-button type="primary" text icon="el-icon-position"
-                  :disabled="!scope.row.status"
-                  @click.stop="handleOpenRemoteDebugging(scope.row, scope.index)">远程调试</el-button>
-              </el-dropdown-item>
-              <el-dropdown-item command="d" v-if="permission.fly_device_offline">
-                <el-button type="primary" text icon="el-icon-collection"
-                   @click.stop="rollFirmware(scope.row)">固件版本管理</el-button>
-              </el-dropdown-item>
-              <el-dropdown-item command="d" v-if="!scope.row.status">
-                <el-button type="primary" text icon="el-icon-collection" @click.stop="dockNotLine(scope.row)">
-                  {{ scope.row.hidden_flag === 1 ? '设备上线' : '设备下线' }}
-                </el-button>
-              </el-dropdown-item>
-              <el-dropdown-item command="e" v-if="permission.fly_device_offline && scope.row.mode_code !==0">
-                <el-button type="primary" text icon="el-icon-document-delete" @click.stop="handleDeviceOffline(scope.row)">注销</el-button>
-              </el-dropdown-item>
-              <el-dropdown-item command="e" v-if="permission.fly_device_offline">
-                <el-button type="primary" text icon="el-icon-document-delete"
-                  :disabled="scope.row.dem_status === 1" @click.stop="handleStatus(scope.row)">
-                  {{ scope.row.dem_status === 0 ? '初始化地形' : (scope.row.dem_status === 1 ? '初始化中' : '更新地形') }}
-                </el-button>
-              </el-dropdown-item>
-            </el-dropdown-menu>
-          </template>
-          <template #dropdown v-else>
-            <el-dropdown-menu teleported>
-              <!-- <el-dropdown-item command="a">
-                    <el-button type="primary" text icon="el-icon-circle-close" @click.stop="rowDel(scope.row, scope.index)">删除</el-button>
-                  </el-dropdown-item> -->
-              <!-- <el-dropdown-item command="a">
-                    <el-button type="primary" text icon="el-icon-key" v-if="permission.operate_password_set" @click.stop="handleOperatePassword(scope.row, scope.index)">操控密码设置</el-button>
-                  </el-dropdown-item> -->
-              <el-dropdown-item command="d"><el-button type="primary" text icon="el-icon-collection"
-                  @click.stop="rollFirmware(scope.row)">固件版本管理</el-button>
-              </el-dropdown-item>
-            </el-dropdown-menu>
-          </template>
-        </el-dropdown>
-      </template>
-
-      <!-- 添加行政区划显示模板 -->
-      <template #area_code="{ row }">
-        <span>{{ row.area_name }}</span>
-      </template>
-    </avue-crud>
-
-    <el-dialog title="操控密码设置" append-to-body v-model="operatePasswordSetBox" width="450px">
-      <el-form :model="passwordForm" ref="passwordForm" label-width="80px" :rules="rules" v-loading="loadingForm">
-        <el-form-item label="密码" prop="password">
-          <el-input type="password" v-model="passwordForm.password" placeholder="请输入密码" show-password></el-input>
-        </el-form-item>
-        <el-form-item label="确认密码" prop="password2">
-          <el-input type="password" v-model="passwordForm.password2" placeholder="请输入确认密码" show-password></el-input>
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="operatePasswordSetBox = false">取 消</el-button>
-          <el-button type="primary" @click="setOperatePasswordConfirm">确 定</el-button>
-        </span>
-      </template>
-    </el-dialog>
-
-    <el-dialog title="操控密码查看" append-to-body v-model="operatePasswordViewBox" width="455px">
-      <el-input v-model="operate_password" disabled></el-input>
-    </el-dialog>
-
-    <el-dialog title="注销" class="ztzf-dialog-mange zx-cancel" append-to-body v-model="cancenOperate" width="560px">
-      <div class="txt-contain">
-        <img :src="warnSvg" />注销
-        <span class="name">
-          {{ cancelSNName }}
-        </span> 设备可能会影响相关数据,确认注销吗?
-      </div>
-      <div class="delete-txt">*删除相关图片、视频、事件</div>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="cancenOperate = false">取 消</el-button>
-          <el-button type="primary" @click="cancenOperateDo">确 定</el-button>
-        </span>
-      </template>
-    </el-dialog>
-
-    <el-dialog title="固件升级" append-to-body v-model="firmwareBox" width="455px">
-      <div>升级固件版本:{{ firmwareVersion }}</div>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="firmwareBox = false">取 消</el-button>
-          <el-button type="primary" @click="updateFirmwareConfirm">确 定</el-button>
-        </span>
-      </template>
-    </el-dialog>
-
-    <el-dialog title="存储配置" append-to-body v-model="ossSetBox" @close="handleOssSetClose" width="600px">
-      <div class="onlineStatus">
-        存储对象配置:
-        <el-select v-model="ossEnd" clearable placeholder="请选择存储对象" style="width: 450px">
-          <el-option v-for="item in ossList" :key="item.id" :label="item.name + ': ' + item.endpoint" :value="item.id">
-            <span style="float: left">{{ item.name + ': ' + item.endpoint }}</span>
-            <span v-if="item.status == 1" class="status1">{{ item.categoryName }}</span>
-            <span v-if="item.status == 2" class="status2">{{ item.categoryName }}</span>
-          </el-option>
-        </el-select>
-      </div>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="cancelOssSet">取 消</el-button>
-          <el-button type="danger" @click="cancelOssSetConfirm">取消配置</el-button>
-          <el-button type="primary" @click="ossSetConfirm">配置</el-button>
-        </span>
-      </template>
-    </el-dialog>
-
-    <el-dialog title="固件版本管理" append-to-body v-model="rollFirmwareBox" width="455px">
-      <div class="onlineStatus">
-        固件版本升级/回退:
-        <el-select v-model="rollFirmVersion" clearable placeholder="请选择固件版本" style="width: 240px">
-          <el-option v-for="item in firmList" :key="item.firmware_version" :label="item.firmware_version"
-            :value="item.firmware_version" />
-        </el-select>
-      </div>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="rollFirmwareBox = false">取 消</el-button>
-          <el-button type="primary" @click="rollFirmwareConfirm">确 定</el-button>
-        </span>
-      </template>
-    </el-dialog>
-
-    <el-drawer class="ztzf-drawer-body-basic-container ztzf-el-card__body" title="机场授权管理" size="60%" append-to-body
-      v-model="devicePerShareVisible" :direction="'rtl'">
-      <DevicePerShare ref="devicePerShare" />
-    </el-drawer>
-
-    <el-drawer :title="operateTitle" append-to-body v-model="remoteDebuggingShow" size="40%">
-      <DockControlPanel v-if="remoteDebuggingShow" :sn="curDeviceInfo.device_sn" :deviceInfo="curDeviceInfo">
-      </DockControlPanel>
-    </el-drawer>
-  </basic-main-content>
-</template>
-
-<script>
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { getRegionTreeAll } from '@/api/job/task'
-import { pxToRem } from '@/utils/rem'
-import {
-  getList,
-  remove,
-  update,
-  add,
-  getDetail,
-  getDeviceUpgradeInfo,
-  ota,
-  getDeviceFirmwareList,
-  getDevices,
-  deviceOffline,
-  devicesUpdate,
-  devicesUpAndDown,
-  initAirportTerrainHeight,
-  deleteAirportTerrainHeight
-} from '@/api/device/device'
-import { deleteByOssId, addOrUpdate as addOrUpdateOssBind } from '@/api/device/ossBind'
-import { getListPage as getOssList } from '@/api/resource/oss'
-import { getLazyTree } from '@/api/base/region'
-import { EDockModeText, EDockModeCode } from '@/types/device'
-import { mapGetters } from 'vuex'
-import FirmwareManage from './components/firmwareManage.vue'
-import DevicePerShare from './components/devicePerShare.vue'
-import DockControlPanel from './components/DockControlPanel.vue'
-import { getWebsocketUrl } from '@/utils/websocket/config'
-import ConnectWebSocket from '@/utils/websocket'
-import warnSvg from '@/assets/images/warn.svg'
-
-export default {
-  components: {
-    FirmwareManage,
-    DevicePerShare,
-    DockControlPanel,
-  },
-  data() {
-    // const self = this
-
-    const validatePass = (rule, value, callback) => {
-      if (value === '') {
-        callback(new Error('请输入密码'))
-      } else {
-        callback()
-      }
-    }
-    const validatePass2 = (rule, value, callback) => {
-      if (value === '') {
-        callback(new Error('请再次输入密码'))
-      } else if (value !== this.passwordForm.password) {
-        callback(new Error('两次输入密码不一致!'))
-      } else {
-        callback()
-      }
-    }
-    return {
-      treeResolveMap: new Map(),
-      rules: {
-        password: [{ required: true, validator: validatePass, trigger: 'blur' }],
-        password2: [{ required: true, validator: validatePass2, trigger: 'blur' }],
-      },
-      warnSvg: warnSvg,
-      cancelSNName: '',
-      cancenOperate: false,
-      cancenOperateRow: {},
-      deleteFlag: false,
-      passwordForm: {
-        id: '',
-        password: '',
-        password2: '',
-      },
-      operatePasswordSetBox: false,
-      operatePasswordViewBox: false,
-      operate_password: '',
-      bindOssId: null,
-      deviceSn: '',
-      ossSetBox: false,
-      ossList: [],
-      ossEnd: '',
-      operateTitle: '',
-      rollFirmVersion: '',
-      firmList: [],
-      rollFirmwareBox: false,
-      isUpdateDrone: {},
-      // 用于记录已经创建的websocket,防止重复创建
-      webSocketIdSet: new Set(),
-      // 用于保存多组websocket
-      websocketMap: new Map(),
-      scheduleNum: 0,
-      webSocket: '',
-      devicePerShareVisible: false,
-      remoteDebuggingShow: false,
-      curDeviceInfo: {},
-      firmwareManageVisible: false,
-      percentageNum: 0,
-      firmwareBox: false,
-      firmwareInfo: {},
-      form: {},
-      query: {},
-      firmwareVersion: '',
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      selectionList: [],
-      option: {
-        emptyBtnText: '重置',
-        emptyBtnIcon: 'el-icon-refresh',
-        lazy: true,
-        tree: true,
-
-        dialogWidth: 1050,
-        searchGutter: 30,
-        tip: false,
-        searchShow: true,
-        // searchMenuSpan: 16,
-        searchMenuPosition: 'left',
-        searchMenuSpan: 4,
-
-        border: true,
-        index: true,
-        indexLabel: '序号',
-        indexWidth: 60,
-        viewBtn: true,
-        delBtn: false,
-        selection: true,
-        excelBtn: false,
-        addBtn: false,
-        dialogClickModal: false,
-        grid: false,
-
-        height: 'auto',
-        calcHeight: 20,
-
-        column: [
-          {
-            label: '设备类型',
-            prop: 'domain',
-            editDisabled: false,
-            editDisplay: false, //编辑显示
-            viewDisplay: false, //查看显示
-            search: false,
-            slot: true,
-            searchSpan: 4,
-            labelWidth: 145,
-            width: 120,
-            // formatter: (row) => row.domain == 3 ? '机巢' : '无人机'
-            // rules: [
-            //   {
-            //     required: true,
-            //     message: '请输入设备类型',
-            //     trigger: 'blur',
-            //   },
-            // ],
-          },
-          {
-            label: '设备类型',
-            prop: 'domainTxt',
-            // editDisabled: true,
-            editDisplay: false, //编辑显示
-            viewDisplay: true, //查看显示
-            labelWidth: 145,
-            width: 120,
-            hide: true
-          },
-          {
-            label: '设备型号',
-            prop: 'device_name',
-            // editDisabled: true,
-            editDisplay: false, //编辑显示
-            viewDisplay: true, //查看显示
-            search: false,
-            searchSpan: 4,
-            labelWidth: 145,
-            width: 120,
-          },
-
-          {
-            label: '设备名称',
-            prop: 'nickname',
-            labelWidth: 145,
-            width: 160,
-            searchSpan: 4,
-            search: true,
-            overHidden: true,
-            editDisplay: true, //编辑显示
-            rules: [
-              {
-                required: true,
-                message: '请输入设备名称',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '4G增强',
-            prop: 'link_workmode',
-            labelWidth: 145,
-            width: 160,
-            overHidden: true,
-            editDisplay: false, //编辑显示
-            viewDisplay: false,
-            align: 'center',
-            formatter: (row, column, cellValue) => {
-              const statusMap = {
-                0: '关',
-                1: '开',
-              }
-              return statusMap[cellValue] || '/'
-            }
-          },
-
-          {
-            label: '负载设备',
-            prop: 'payload_str',
-            labelWidth: 145,
-            width: 160,
-            overHidden: true,
-            editDisplay: false, //编辑显示
-
-          },
-
-          {
-            label: '流量剩余(GB)',
-            prop: 'traffic_remaining',
-            labelWidth: 145,
-            width: 120,
-            // editDisabled: true,
-            editDisplay: false, //编辑显示
-            // rules: [
-            //   {
-            //     required: true,
-            //     message: '请输入流量剩余',
-            //     trigger: 'blur',
-            //   },
-            // ],
-          },
-
-          {
-            label: '流量到期时间',
-            prop: 'traffic_expire_time',
-            labelWidth: 145,
-            width: 120,
-            type: 'date',
-            format: 'YYYY-MM-DD',
-            editDisplay: false, //编辑显示
-          },
-
-          {
-            label: '设备状态',
-            prop: 'cnstatus',
-            hide: true,
-            addDisplay: false,
-            editDisplay: false,
-            viewDisplay: false,
-            labelWidth: 145,
-          },
-          {
-            label: '设备状态',
-            prop: 'status',
-            addDisplay: false,
-            editDisplay: false,
-            viewDisplay: false,
-            labelWidth: 100,
-            hide: true,
-            // searchSpan: 4,
-            // search: true,
-            slot: true,
-            width: 100,
-
-            rules: [
-              {
-                required: true,
-                message: '请输入在线状态',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '设备状态',
-            prop: 'cnmode_code',
-            hide: true,
-            addDisplay: false,
-            editDisplay: false,
-            viewDisplay: true,
-            labelWidth: 145,
-            width: 110,
-          },
-          {
-            label: '设备状态',
-            prop: 'mode_code',
-            addDisplay: false,
-            editDisplay: false,
-            viewDisplay: false,
-            labelWidth: 145,
-            searchSpan: 4,
-            search: true,
-            type: 'select',
-            dicData: [
-              { label: '在线', value: 0 },
-              { label: '离线', value: -1 },
-              { label: '远程调试', value: 2 },
-              { label: '现场调试', value: 1 },
-              { label: '固件升级中', value: 3 }
-            ],
-            slot: true,
-            width: 160,
-
-            rules: [
-              {
-                required: true,
-                message: '请输入机场状态',
-                trigger: 'blur',
-              },
-            ],
-          },
-          // {
-          //   label: '固件升级',
-          //   prop: 'firmware_status',
-          //   labelWidth: 145,
-          //   width: 100,
-          //   // hide: true,
-          //   viewDisabled: true,
-          //   addDisabled: true,
-          //   editDisplay: false, //编辑显示
-          //   addDisplay: false,
-          //   viewDisplay: false,
-          // },
-          {
-            label: '设备SN',
-            prop: 'device_sn',
-            labelWidth: 145,
-            width: 120,
-            overHidden: true,
-            searchSpan: 4,
-            // editDisabled: true,
-            editDisplay: false, //编辑显示
-          },
-
-          {
-            label: '设备位置',// '行政区划',
-            prop: 'area_name',
-            // hide: true,
-            overHidden: true,
-            editDisplay: false, //编辑显示
-            viewDisplay: false, //查看显示
-            labelWidth: 145,
-            width: 200,
-          },
-          {
-            label: '设备位置',
-            prop: 'area_code',
-            // type: 'cascader',
-            type: 'tree',
-            labelWidth: 145,
-            searchSpan: 4,
-            hide: true,
-            search: true,
-            // overHidden: true,
-            editDisplay: true,
-            viewDisplay: true,
-            checkStrictly: true,
-            defaultExpandAll: true,
-            dicData: [],
-            props: {
-              label: 'name',
-              value: 'id',
-              children: 'childrens',
-            },
-            rules: [
-              {
-                required: true,
-                message: '请选择设备位置',
-                trigger: 'change',
-              },
-            ],
-          },
-
-          {
-            // hide: true,
-            label: '保险有效期',
-            prop: 'duration_of_insurance',
-            labelWidth: 145,
-            width: 200,
-            type: 'daterange',
-            format: 'YYYY-MM-DD ',
-            valueFormat: 'YYYY-MM-DD',
-            startPlaceholder: '保险开始日期',
-            endPlaceholder: '保险结束日期',
-            align: 'center',
-            rules: [
-              {
-                required: false,
-                message: '请选择保险有效期',
-                trigger: 'blur',
-              },
-            ],
-            formatter: (row, value) => {
-              return value[0] ? `${this.$dayjs(value[0]).format('YYYY-MM-DD')}~${this.$dayjs(value[1]).format('YYYY-MM-DD')}` : '/'
-            },
-          },
-          // {
-          //   label: '保险有效期',
-          //   prop: 'insureExpiredTime',
-          //   labelWidth: 145,
-          //   width: 110,
-          //   rules: [
-          //     {
-          //       required: true,
-          //       message: '请输入保险有效期',
-          //       trigger: 'blur',
-          //     },
-          //   ],
-          // },
-
-
-          {
-            label: '固件版本',
-            prop: 'firmware_version',
-            labelWidth: 145,
-            width: 110,
-            editDisplay: false, //编辑显示
-          },
-          {
-            label: '所属部门',
-            prop: 'dept_name',
-            addDisplay: false,
-            editDisplay: false,
-            viewDisplay: false,
-            align: 'center',
-            labelWidth: 145,
-            width: 180,
-            rules: [
-              {
-                required: true,
-                message: '请输入所属部门',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '所属部门',
-            prop: 'dept_id',
-            hide: true,
-            type: 'tree',
-
-            search: true,
-            searchSpan: 4,
-            labelWidth: 145,
-            defaultExpandAll: true,
-            dicUrl: '/blade-system/dept/getTree',
-            props: {
-              label: 'name',
-              value: 'id',
-            },
-            rules: [
-              {
-                required: true,
-                message: '请输入所属部门',
-                trigger: 'blur',
-              },
-            ],
-          },
-          // {
-          //   label: '加入组织时间',
-          //   prop: 'bound_time',
-          //   addDisplay: false,
-          //   editDisplay: false,
-          //   type: 'date',
-          //   labelWidth: 145,
-          //   width: 160,
-          //   format: 'YYYY-MM-DD HH:mm:ss',
-          //   // valueFormat: 'YYYY-MM-DD HH:mm:ss',
-          //   rules: [
-          //     {
-          //       required: true,
-          //       message: '请输入在线状态',
-          //       trigger: 'blur',
-          //     },
-          //   ],
-          // },
-
-
-
-
-          {
-            label: '在线时间',
-            hide: true,
-            prop: 'login_time',
-            type: 'date',
-            editDisplay: false, //编辑显示
-            // editDisabled: true,
-            viewDisplay: false, //查看显示
-            addDisplay: true,
-            labelWidth: 145,
-            width: 160,
-            overHidden: true,
-            format: 'YYYY-MM-DD HH:mm:ss',
-            // valueFormat: 'YYYY-MM-DD HH:mm:ss',
-            startPlaceholder: '任务开始时间',
-            // rules: [
-            //   {
-            //     required: true,
-            //     message: '请输入在线时间',
-            //     trigger: 'blur',
-            //   },
-            // ],
-          },
-          {
-            label: '设备最新在线时间',
-            hide: true,
-            prop: 'login_time',
-            type: 'date',
-            viewDisplay: true, //查看显示
-            editDisabled: true,
-            labelWidth: 145,
-            overHidden: true,
-            format: 'YYYY-MM-DD HH:mm:ss',
-          },
-          {
-            label: '注册时间',
-            prop: 'create_time',
-            type: 'date',
-            hide: true,
-            editDisplay: false, //编辑显示
-            // editDisabled: true,
-            viewDisplay: false, //查看显示
-            addDisplay: true,
-            overHidden: true,
-            labelWidth: 145,
-            width: 160,
-            format: 'YYYY-MM-DD HH:mm:ss',
-            // valueFormat: 'YYYY-MM-DD HH:mm:ss',
-            startPlaceholder: '创建时间',
-            // rules: [
-            //   {
-            //     required: true,
-            //     message: '请输入创建时间',
-            //     trigger: 'blur',
-            //   },
-            // ],
-          },
-          {
-            label: '设备注册时间',
-            prop: 'create_time',
-            type: 'date',
-            hide: true,
-            viewDisplay: true, //查看显示
-            editDisabled: true,
-            overHidden: true,
-            labelWidth: 145,
-            width: 160,
-            format: 'YYYY-MM-DD HH:mm:ss',
-          },
-        ],
-      },
-      data: [],
-      DeviceFirmwareTypeEnum: {
-        // 普通升级
-        ToUpgraded: 3,
-        // 一致性升级
-        ConsistencyUpgrade: 2,
-      },
-      DeviceFirmwareStatusEnum: {
-        None: 1, // 无需升级
-        ToUpgraded: 2, // 待升级
-        ConsistencyUpgrade: 3, // 一致性升级
-        DuringUpgrade: 4, // 升级中
-      },
-    }
-  },
-
-  computed: {
-    ...mapGetters(['permission', 'userInfo']),
-    permissionList() {
-      return {
-        addBtn: this.validData(this.permission.air_add, true),
-        viewBtn: this.validData(this.permission.air_view, true),
-        delBtn: this.validData(this.permission.air_delete, true),
-        editBtn: this.validData(this.permission.air_edit, true),
-      }
-    },
-    ids() {
-      let ids = []
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id)
-      })
-      return ids.join(',')
-    },
-  },
-  destroyed() {
-    this.treeResolveMap.clear()
-    this.websocketMap.forEach((k, v) => {
-      if (null != v) {
-        v.close()
-        this.websocketMap.delete(k)
-        this.webSocketIdSet.delete(k)
-      }
-    })
-  },
-  mounted() {
-    getRegionTreeAll({ parentCode: this.userInfo.detail.areaCode }).then(res => {
-      const column = this.findObject(this.option.column, 'area_code')
-      column.dicData = res.data.data ? [res.data.data] : []
-    })
-  },
-  methods: {
-    getDockModeText(value) {
-      return EDockModeText[value] || ''
-    },
-    getModelText(value) {
-      let txt = '离线'
-      if (value === 0 || value === 4) {
-        txt = '在线'
-      } else if (value === 1) {
-        txt = '现场调试'
-      } else if (value === 2) {
-        txt = '远程调试'
-      } else if (value === 3) {
-        txt = '固件升级中'
-      }
-      return txt
-    },
-    // 关闭所有的webscoket
-    closeAllWebsoket() {
-      this.websocketMap.forEach((k, v) => {
-        if (null != v) {
-          v.close()
-          this.websocketMap.delete(k)
-          this.webSocketIdSet.delete(k)
-        }
-      })
-    },
-    // 连接webSocket
-    connectWebSocket(data) {
-      const webSocketId = data.workspace_id
-      if (!this.webSocketIdSet.has(webSocketId)) {
-        // 防止重复连接
-        this.webSocketIdSet.add(webSocketId)
-        const webSorketUrl = getWebsocketUrl() + '&workspace-id=' + data.workspace_id
-        // 监听ws 消息
-        this.useConnectWebSocket1(webSocketId, webSorketUrl)
-      }
-    },
-    useConnectWebSocket1(webSocketId, url) {
-      const websocket = new ConnectWebSocket(url)
-      // 加入 webscoket map
-      this.websocketMap.set(webSocketId, websocket)
-      websocket?.registerMessageHandler(this.messageHandler)
-      websocket?.initSocket()
-    },
-    async messageHandler(payload) {
-      let loadData = JSON.parse(payload)
-      if (!loadData) {
-        return
-      }
-
-      if (loadData.biz_code != 'ota_progress') {
-        return
-      }
-      console.log(loadData.data.output.progress.percent, '升级进度')
-      this.data.forEach((e, index) => {
-        if ((e.device_sn == loadData.data.sn || e.child_sn == loadData.data.sn) && loadData.data.output.status == 'in_progress') {
-          e.mode_code = 3
-          e.firmware_progress = loadData.data.output.progress.percent
-          // if (e.children[0]) {
-          //   e.children[0].firmware_progress = loadData.data.output.progress.percent;
-          // }
-          // console.log('是否更新中2',e.children[0])
-        }
-
-        if ((e.device_sn == loadData.data.sn || e.child_sn == loadData.data.sn) && loadData.data.output.status == 'ok') {
-          // 升级完成修改状态
-          e.firmware_status = 1
-          e.mode_code = 0
-          // if (e.children[0]) {
-          //   e.children[0].firmware_status = 1
-          // }
-          const webscoket = this.websocketMap.get(e.workspace_id)
-          // 关闭
-          webscoket?.close()
-          //删除对应的webscoket
-          this.websocketMap.delete(e.workspace_id)
-          this.webSocketIdSet.delete(e.workspace_id)
-        }
-      })
-      // this.$forceUpdate()
-    },
-    init() {
-      (this.page = {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      }),
-        this.onLoad(this.page)
-    },
-    // 打开权限分享页面
-    handleOpenDevicePerShare(row) {
-      var that = this
-      this.devicePerShareVisible = true
-      this.$nextTick(() => {
-        that.$refs.devicePerShare.init(row)
-      })
-    },
-    // 打开远程调试
-    handleOpenRemoteDebugging(row) {
-      this.curDeviceInfo = row
-      this.remoteDebuggingShow = true
-      this.operateTitle = row.nickname + ' - ' + row.device_sn
-    },
-
-    // 设备注销
-    handleDeviceOffline(row) {
-      this.cancenOperate = true
-      this.cancelSNName = row.nickname
-      this.cancenOperateRow = row
-    },
-
-    // 设备
-    handleStatus(row) {
-      // dem_status
-      if (row.dem_status === 2 || row.dem_status === 3) {
-        deleteAirportTerrainHeight({ dockSn: row.device_sn }).then(res => {
-          initAirportTerrainHeight({ dockSn: row.device_sn, centerLon: row.longitude, centerLat: row.latitude, }).then(res => {
-            ElMessage.success('操作成功')
-            this.init()
-          })
-        })
-      } else {
-        initAirportTerrainHeight({ dockSn: row.device_sn, centerLon: row.longitude, centerLat: row.latitude,  }).then(res => {
-            ElMessage.success('操作成功')
-            this.init()
-        })
-      }
-    },
-
-    cancenOperateDo() {
-      this.cancenOperate = false
-      this.deleteFlag = false
-      deviceOffline(this.cancenOperateRow.device_sn, true).then(res => {
-        ElMessage.success('注销成功')
-
-        this.init()
-      }).catch(error => {
-        ElMessage.error('注销失败')
-      })
-    },
-
-    // 打开存储对象配置页面
-    handleOpenOssSet(row) {
-      var that = this
-      this.deviceSn = row.device_sn
-      this.ossSetBox = true
-      this.bindOssId = row.oss_id
-      this.ossEnd = row.oss_id
-      // 查询下拉列表
-      const param = {
-        categoryKeys: '1,3,6',
-      }
-      getOssList(1, 50, param).then(res => {
-        const data = res.data.data
-        that.ossList = data.records
-      })
-    },
-    // 打开固件管理页面
-    handleOpenFirmwarm(row) {
-      var that = this
-      this.firmwareManageVisible = true
-      this.$nextTick(() => {
-        that.$refs.firmwareManage.init(row)
-      })
-    },
-    // 设备下线
-    dockNotLine(row) {
-      let txt = row.hidden_flag === 1 ? '上线' : '下线'
-      ElMessageBox.confirm(`确定${txt}该设备吗?`, '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          let hidden_flag = row.hidden_flag === 1 ? 0 : 1
-          devicesUpAndDown({ id: row.id, hidden_flag: hidden_flag })
-            .then(res => {
-              ElMessage.success(`${txt}成功`)
-              this.init()
-            })
-            .catch(error => {
-              ElMessage.error('下线失败')
-            })
-        })
-        .catch(() => { })
-    },
-    // 版本回退点击事件
-    rollFirmware(row) {
-      console.log(this.data,row, '打印看看值')
-      if (row.status == 0) {
-        this.$message({
-          type: 'warning',
-          message: '设备不在线!',
-        })
-        return
-      }
-      // 如果是机场,查询飞机对应的信息
-      if (row.domain === 3) {
-        // 查询子设备名称
-        getDevices(row.workspace_id, row.child_sn).then(res => {
-          const data = res.data.data
-          that.firmwareInfo['child_device_name'] = data.device_name
-          that.firmwareInfo['child_version'] = data.firmware_version
-          that.firmwareInfo['child_status'] = data.status
-        })
-      }
-      var that = this
-      this.rollFirmwareBox = true
-      // this.isUpdateDrone = row
-      const param = {
-        device_name: row.device_name,
-      }
-      // 获取固件最新版本信息
-      getDeviceFirmwareList(1, 20, param).then(res => {
-        that.firmList = []
-        const data = res.data.data.records
-        if (data.length === 0) {
-          return
-        }
-        data.forEach(e => {
-          if (e.firmware_version != row.firmware_version) {
-            that.firmList.push(e)
-          }
-        })
-        that.firmwareInfo['device_name'] = row.device_name
-        that.firmwareInfo['sn'] = row.device_sn
-        // 3-普通升级,2-一致性升级;
-        that.firmwareInfo['firmware_upgrade_type'] = 3
-        that.firmwareInfo['workspaceId'] = row.workspace_id
-        that.firmwareInfo['firmware_version'] = row.firmware_version
-        that.firmwareInfo['status'] = row.status
-        // domain 0:飞机  3:机场
-        that.firmwareInfo['domain'] = row.domain
-        that.firmwareInfo['child_sn'] = row.child_sn
-        that.firmwareInfo['now_version'] = row.firmware_version
-      })
-    },
-    // 比较版本大小
-    compare(version1, version2) {
-      let arr1 = version1.split('.')
-      let arr2 = version2.split('.')
-      let length = Math.max(arr1.length, arr2.length)
-      for (let i = 0; i < length; i++) {
-        const n1 = Number(arr1[i] || 0)
-        const n2 = Number(arr2[i] || 0)
-        // version1 > version2 返回1,如果 version1 < version2 返回-1,不然返回0
-        if (n1 > n2) return 1
-        if (n1 < n2) return -1
-      }
-      return 0
-    },
-    // 版本回退
-    rollFirmwareConfirm() {
-      // 无人机升级/回滚
-      if (this.rollFirmVersion == '') {
-        this.$message({
-          type: 'warning',
-          message: '请先选择回退的固件版本!',
-        })
-        return
-      }
-      var that = this
-      var arr = []
-      that.firmwareInfo['product_version'] = this.rollFirmVersion
-      // 机场信息设置
-      arr.push(that.firmwareInfo)
-      // 判断是机场升级还是飞机升级,如果是机场升级则把无人机信息一起带过去
-      if (that.firmwareInfo.domain === 3) {
-        // 判断当前机场和无人机固件版本是否一致
-        var dockFlag = this.compare(
-          this.firmwareInfo.firmware_version,
-          this.firmwareInfo.child_version
-        )
-        // 机场和无人机版本一致情况
-        if (dockFlag == 0) {
-          if (!this.firmwareInfo.status || !this.firmwareInfo.child_status) {
-            this.$message({
-              type: 'warning',
-              message: '请先更新无人机固件版本后再进行机场固件版本更新!',
-            })
-            return
-          }
-          // 只有同时在线并且是升级才能操作
-          // 判断升级还是降级,不能降级
-          var upDownFlag = this.compare(this.rollFirmVersion, this.firmwareInfo.firmware_version)
-          if (upDownFlag == -1) {
-            this.$message({
-              type: 'warning',
-              message: '请先回滚无人机固件版本后再进行机场固件版本更新!',
-            })
-            return
-          }
-          // 同时升级操作
-          // 无人机信息设置
-          arr.push({
-            device_name: that.firmwareInfo.child_device_name,
-            sn: that.firmwareInfo.child_sn,
-            product_version: this.rollFirmVersion,
-            firmware_upgrade_type: 3,
-          })
-        } else {
-          // 版本不一致情况
-          // 比对需要改变的版本号和无人机版本号是否一致,不一致提示不能操作
-          var verFlag = this.compare(this.rollFirmVersion, this.firmwareInfo.child_version)
-          if (verFlag == -1 || verFlag == 1) {
-            this.$message({
-              type: 'warning',
-              message: '更新版本与当前无人机固件版本不一致,请更新和无人机一致的版本!',
-            })
-            return
-          }
-          // 需要改变的版本号和无人机版本号如果是一致,进行单独的机场升级/回滚操作
-        }
-      }
-      
-      ota(that.firmwareInfo.workspaceId, arr).then(res => {
-        that.firmwareVersion = ''
-        that.firmwareInfo = {}
-        that.rollFirmwareBox = false
-        this.$message({
-          type: 'success',
-          message: '操作成功!',
-        })
-        // if(that.isUpdateDrone.domain == 3) {
-          this.onLoad(this.page)
-        // } else {
-        //   this.data.map(item => {
-        //     if(item.workspace_id === that.isUpdateDrone.workspace_id) {
-        //       item.firmware_status = 2
-        //       item.mode_code = 3
-        //       item.children[0].mode_code = 0
-        //       item.children[0].firmware_status = 4
-        //       this.connectWebSocket(item)
-        //       console.log('无人机更新中',item)
-        //     }
-        //   })
-        // }
-        // 获取保存的 resolve 函数===== 此处需要更新子集塞入父级
-        // done()
-      })
-    },
-    // 升级固件按钮事件
-    updateFirmware(row) {
-      if (row.status == 0) {
-        this.$message({
-          type: 'warning',
-          message: '设备不在线!',
-        })
-        return
-      }
-      var that = this
-      this.firmwareBox = true
-      const param = {
-        device_name: row.device_name,
-      }
-      // 获取固件最新版本信息
-      getDeviceUpgradeInfo(param).then(res => {
-        const data = res.data.data
-        if (data.length === 0) {
-          return
-        }
-        that.firmwareVersion = data[0].product_version
-        that.firmwareInfo['device_name'] = row.device_name
-        that.firmwareInfo['sn'] = row.device_sn
-        that.firmwareInfo['product_version'] = data[0].product_version
-        // 3-普通升级,2-一致性升级;
-        that.firmwareInfo['firmware_upgrade_type'] =
-          row.firmware_status === that.DeviceFirmwareStatusEnum.ToUpgraded
-            ? that.DeviceFirmwareTypeEnum.ToUpgraded
-            : that.DeviceFirmwareTypeEnum.ConsistencyUpgrade
-        that.firmwareInfo['workspaceId'] = row.workspace_id
-      })
-    },
-    // 确定升级固件版本
-    updateFirmwareConfirm() {
-      var that = this
-      var arr = []
-      arr.push(that.firmwareInfo)
-      ota(that.firmwareInfo.workspaceId, arr).then(res => {
-        that.firmwareVersion = ''
-        that.firmwareInfo = {}
-        that.firmwareBox = false
-        this.$message({
-          type: 'success',
-          message: '操作成功!',
-        })
-        this.onLoad(this.page)
-        done()
-      })
-    },
-    handleOssSetClose() {
-      this.ossEnd = ''
-      this.deviceSn = ''
-      this.bindOssId = null
-    },
-    // 存储对象配置确定
-    ossSetConfirm() {
-      var that = this
-      // 判断是否已选择
-      if (!this.ossEnd) {
-        this.$message({
-          type: 'warning',
-          message: '请选择对于的存储对象!',
-        })
-        return
-      }
-      // 新增或者修改操作
-      const data = {
-        oss_id: this.ossEnd,
-        sn: this.deviceSn,
-      }
-      // 新增
-      addOrUpdateOssBind(data).then(res => {
-        this.$message({
-          type: 'success',
-          message: '操作成功!',
-        })
-        that.ossSetBox = false
-        this.onLoad(this.page)
-        done()
-      })
-    },
-    // 取消配置
-    cancelOssSetConfirm() {
-      var that = this
-      // 判断是否已有配置
-      if (!this.bindOssId) {
-        this.$message({
-          type: 'warning',
-          message: '当前机场尚未配置存储对象信息!',
-        })
-        return
-      }
-      deleteByOssId(this.bindOssId).then(() => {
-        that.ossSetBox = false
-        this.onLoad(this.page)
-        this.$message({
-          type: 'success',
-          message: '操作成功!',
-        })
-      })
-    },
-    // 取消按钮 oss
-    cancelOssSet() {
-      this.ossEnd = ''
-      this.deviceSn = ''
-      this.bindOssId = null
-      this.ossSetBox = false
-    },
-    rowSave(row, done, loading) {
-      let areaCode = row.area_code
-      if (Array.isArray(areaCode)) {
-        areaCode = areaCode[areaCode.length - 1]
-      } else if (typeof areaCode === 'string' && areaCode.includes(',')) {
-        const codes = areaCode.split(',')
-        areaCode = codes[codes.length - 1]
-      }
-      row.area_code = areaCode || null
-
-      add(row).then(
-        () => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowUpdate(row, index, done, loading) {
-      const submitData = {
-        ...row,
-        area_code: row.area_code.split(',').pop(),
-        insure_start_time: row.duration_of_insurance[0] + ' 00:00:00' || null,
-        insure_expired_time: row.duration_of_insurance[1] + ' 23:59:59' || null,
-        deptId: row.dept_id,
-        areaCode: row.area_code.split(',').pop(),
-      }
-      if (submitData.traffic_expire_time === '') {
-        delete submitData.traffic_expire_time
-      }
-      delete submitData.duration_of_insurance
-
-      update(submitData).then(
-        () => {
-          if (row.domain === 0) {
-            // 获取保存的 resolve 函数
-            const resolve = this.treeResolveMap.get(row.device_sn)
-            if (resolve) {
-              // 重新加载子节点数据
-              var params = {
-                childSn: row.device_sn,
-              }
-              getList(1, 10, params).then(res => {
-                const data = res.data.data.records
-                data.forEach(e => {
-                  e.duration_of_insurance = [e?.insure_start_time?.slice(0, 10) || '', e?.insure_expired_time?.slice(0, 10) || '']
-                })
-                resolve(data)
-              })
-            }
-          } else {
-            this.onLoad(this.page)
-          }
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowDel(row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-        })
-    },
-    searchReset() {
-      this.query = {}
-      this.onLoad(this.page)
-    },
-    searchChange(params, done) {
-      this.query = params
-      this.page.currentPage = 1
-      this.onLoad(this.page, params)
-      done()
-    },
-    selectionChange(list) {
-      this.selectionList = list
-    },
-    selectionClear() {
-      this.selectionList = []
-      this.$refs.crud.toggleSelection()
-    },
-    handleDelete() {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据')
-        return
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          this.$refs.crud.toggleSelection()
-        })
-    },
-    // async getFullAreaCode(areaCode) {
-    //   console.log('getFullAreaCode', areaCode)
-    //   if (!areaCode) return ''
-    //
-    //   const code = areaCode.toString()
-    //
-    //   if (code.includes(',')) return code
-    //
-    //   if (code.endsWith('0000000000')) {
-    //     return code
-    //   } else if (code.endsWith('00000000') && !code.endsWith('0000000000')) {
-    //     const provinceCode = code.substring(0, 2) + '0000000000'
-    //     return `${provinceCode},${code}`
-    //   } else {
-    //     const provinceCode = code.substring(0, 2) + '0000000000'
-    //     const cityCode = code.substring(0, 4) + '00000000'
-    //     return `${provinceCode},${cityCode},${code}`
-    //   }
-    // },
-    beforeOpen(done, type) {
-      if (['edit', 'view'].includes(type)) {
-        getDetail(this.form.id).then(async res => {
-          const data = res.data.data
-          this.form = {
-            ...data,
-            // area_code: await this.getFullAreaCode(data.area_code),
-            area_name: this.form.area_name,
-            cnmode_code: this.getDockModeText(this.form.mode_code),
-            domainTxt: data.domain === 0 ? '无人机' : data.domain === 3 ? '机巢' : '未知',
-            cnstatus: this.form.status === false ? '离线' : '在线',
-            duration_of_insurance: [data?.insure_start_time?.slice(0, 10) || '', data?.insure_expired_time?.slice(0, 10) || ''],
-          }
-
-          done()
-        })
-      }
-    },
-    currentChange(currentPage) {
-      this.page.currentPage = currentPage
-    },
-    sizeChange(pageSize) {
-      this.page.pageSize = pageSize
-    },
-    refreshChange() {
-      this.onLoad(this.page, this.query)
-    },
-    onLoad(page, params = {}) {
-      // this.closeAllWebsoket();
-      const { releaseTimeRange } = this.query
-      let values = {
-        ...params,
-        ...this.query,
-      }
-      if (releaseTimeRange) {
-        values = {
-          ...values,
-          releaseTime_datege: releaseTimeRange[0],
-          releaseTime_datelt: releaseTimeRange[1],
-        }
-        values.releaseTimeRange = null
-      }
-      values['type'] = 1
-      if (values.area_code) {
-        values['area_code'] = values.area_code.split(',').pop()
-      }
-      this.loading = true
-      getList(page.currentPage, page.pageSize, values).then(res => {
-        const data = res.data.data
-        this.page.total = data.total
-        data.records.forEach(e => {
-          e['hasChildren'] = e.has_children
-          if (e.firmware_status == 4 || e.mode_code === 3) {
-            console.log('监听了没')// 机巢升级 firmware_status === 4
-            this.connectWebSocket(e)
-          }
-          e.duration_of_insurance = [e?.insure_start_time?.slice(0, 10) || '', e?.insure_expired_time?.slice(0, 10) || '']
-        })
-        this.data = data.records.map(item => ({
-          ...item,
-          firmware_progress: 0
-        }));
-        // console.log('2222',this.data)
-        this.loading = false
-        this.selectionClear()
-      })
-    },
-    treeLoad(tree, treeNode, resolve) {
-      // 保存resolve
-      this.treeResolveMap.set(tree.child_sn, resolve)
-      var params = {
-        childSn: tree.child_sn,
-      }
-      getList(1, 10, params).then(res => {
-        const data = res.data.data.records
-        data.forEach(e => {
-          e.duration_of_insurance = [e?.insure_start_time?.slice(0, 10) || '', e?.insure_expired_time?.slice(0, 10) || '']
-        })
-        resolve(data)
-      })
-    },
-    // rowDel (row) {
-    //   this.$confirm('确定将选择数据删除?', {
-    //     confirmButtonText: '确定',
-    //     cancelButtonText: '取消',
-    //     type: 'warning',
-    //   })
-    //     .then(() => {
-    //       return remove(row.id)
-    //     })
-    //     .then(() => {
-    //       this.onLoad(this.page)
-    //       this.$message({
-    //         type: 'success',
-    //         message: '操作成功!',
-    //       })
-    //     })
-    // },
-    // 设置无人机操作密码
-    setOperatePasswordConfirm() {
-      var that = this
-      this.$refs.passwordForm.validate(valid => {
-        if (valid) {
-          this.loadingForm = true
-          const data = {
-            id: this.passwordForm.id,
-            operate_password: this.passwordForm.password,
-          }
-          // 提交
-          operatePasswordUpdate(data).then(res => {
-            this.loadingForm = false
-            this.operatePasswordSetBox = false
-            that.passwordForm = {}
-            this.onLoad(this.page)
-            this.$message({
-              type: 'success',
-              message: '操作成功!',
-            })
-          })
-        } else {
-          console.log('error submit!!')
-          return false
-        }
-      })
-    },
-    // 操作密码设置
-    handleOperatePassword(row) {
-      this.operatePasswordSetBox = true
-      this.passwordForm.id = row.id
-    },
-  },
-}
-</script>
-
-<style lang="scss" scoped>
-.status2 {
-  float: right;
-  color: #40cb8b;
-  font-size: 13px;
-}
-
-.status1 {
-  float: right;
-  color: #8492a6;
-  font-size: 13px;
-}
-
-.online {
-  margin-left: 5px;
-}
-
-.onlineStatus1 {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-
-  .el-tag:first-child {
-    margin-bottom: 5px;
-  }
-}
-
-.onlineStatus {
-  display: flex;
-  flex-direction: row;
-  align-items: center;
-}
-
-.onlineStatus-dot {
-  width: 15px;
-  height: 15px;
-  background-color: #40cb8b;
-  border-radius: 50%;
-}
-
-.onlineStatus-dot1 {
-  width: 15px;
-  height: 15px;
-  background-color: #de5e5e;
-  border-radius: 50%;
-}
-
-.firmware_status {
-  background-color: aqua;
-  border-radius: 4px;
-}
-
-.firmware_status:hover {
-  cursor: pointer;
-  /* color: aqua; */
-}
-
-.active-element {
-  cursor: pointer;
-
-  &:hover {
-    background-color: #409eff;
-    border-color: #409eff;
-  }
-}
-
-:deep(.avue-crud__menu) {
-  display: flex;
-}
-
-.more-container {
-  position: relative;
-}
-
-.show-more-do {
-  position: absolute;
-  background-color: #ffffff;
-  // border: 1px solid #409eff;
-  z-index: 9999;
-  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
-  width: 140px;
-  font-size: 12px;
-  // height: 140px;
-  height: 190px;
-  right: 0;
-}
-
-:deep(.avue-crud__pagination) {
-  position: fixed;
-  bottom: 10px;
-  right: 30px;
-}
-
-.force-center-dialog .el-dialog {}
-
-.zx-cancel {
-  .txt-contain {
-    display: flex;
-    justify-content: center;
-    margin-bottom: 20px;
-    font-family: Source Han Sans CN, Source Han Sans CN;
-    font-weight: 400;
-    font-size: 14px;
-
-    img {
-      width: 20px;
-      height: 20px;
-    }
-
-    .name {
-      color: #0E8BFF;
-      margin-left: 6px;
-      margin-right: 6px;
-    }
-
-  }
-
-  .delete-txt {
-    font-family: Source Han Sans CN, Source Han Sans CN;
-    font-weight: 400;
-    display: flex;
-    justify-content: center;
-    color: #FF0000;
-    font-size: 12px;
-    margin-bottom: 20px;
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/device/components/DeviceSettingBox.vue b/applications/task-work-order/src/views/device/components/DeviceSettingBox.vue
deleted file mode 100644
index db76492..0000000
--- a/applications/task-work-order/src/views/device/components/DeviceSettingBox.vue
+++ /dev/null
@@ -1,433 +0,0 @@
-<template>
-  <div class="device-setting-wrapper">
-    <!-- <div class="device-setting-header">设备属性设置</div> -->
-    <!-- 设备状态 -->
-    <!-- <div class="device-state-box flex-display flex-justify-between flex-wrap flex-align-center">
-      <div class="device-state-item flex-common flex-direction-column">
-        <div class="state-item-value">29</div>
-        <div class="state-item-label">机场搜星</div>
-      </div>
-      <div class="device-state-item flex-common flex-direction-column">
-        <div class="state-item-value">已指定</div>
-        <div class="state-item-label">指定状态</div>
-      </div>
-      <div class="device-state-item flex-common flex-direction-column">
-        <div class="state-item-value">0.0/78.2 GB</div>
-        <div class="state-item-label">机场存储</div>
-      </div>
-      <div class="device-state-item flex-common flex-direction-column">
-        <div class="state-item-value">--/-- GB</div>
-        <div class="state-item-label">飞行器存储</div>
-      </div>
-      <div class="device-state-item flex-common flex-direction-column">
-        <div class="state-item-value">24.8°C</div>
-        <div class="state-item-label">舱内温度</div>
-      </div>
-      <div class="device-state-item flex-common flex-direction-column">
-        <div class="state-item-value">99%</div>
-        <div class="state-item-label">舱内湿度</div>
-      </div>
-      <div class="device-state-item flex-common flex-direction-column">
-        <div class="state-item-value">空闲中</div>
-        <div class="state-item-label">空调状态</div>
-      </div>
-    </div> -->
-    <div class="device-setting-box">
-      <!-- 飞行器夜航灯 -->
-      <div class="control-setting-item">
-        <div class="control-setting-item-left">
-          <div class="item-label">
-            {{ deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].label }}
-          </div>
-          <div class="item-status">
-            {{ deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].value }}
-          </div>
-        </div>
-        <div class="control-setting-item-right">
-          <DeviceSettingPopover
-            :visible="deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].popConfirm.visible"
-            :loading="deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].popConfirm.loading"
-            @confirm="
-              onConfirm(deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].settingKey)
-            "
-            @cancel="onCancel(deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].settingKey)"
-          >
-            <template #formContent>
-              <div class="form-content">
-                <span class="form-label"
-                  >{{ deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].label }}:</span
-                >
-                <el-switch
-                  active-text="开"
-                  inactive-text="关"
-                  v-model="deviceSettingFormModel.nightLightsState"
-                />
-              </div>
-            </template>
-            <a
-              @click.stop="
-                onShowPopConfirm(
-                  deviceSetting[DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET].settingKey
-                )
-              "
-              >编辑</a
-            >
-          </DeviceSettingPopover>
-        </div>
-      </div>
-      <!-- 限高 -->
-      <div class="control-setting-item">
-        <div class="control-setting-item-left">
-          <div class="item-label">
-            {{ deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].label }}
-          </div>
-          <div class="item-status">
-            {{ deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].value }}
-          </div>
-        </div>
-        <div class="control-setting-item-right">
-          <DeviceSettingPopover
-            :visible="deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].popConfirm.visible"
-            :loading="deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].popConfirm.loading"
-            @confirm="onConfirm(deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].settingKey)"
-            @cancel="onCancel(deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].settingKey)"
-          >
-            <template #formContent>
-              <div class="form-content">
-                <span class="form-label"
-                  >{{ deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].label }}:(m)</span
-                >
-                <el-input-number
-                  size="small"
-                  v-model="deviceSettingFormModel.heightLimit"
-                  :min="20"
-                  :max="1500"
-                />
-
-              </div>
-            </template>
-            <a
-              @click="
-                onShowPopConfirm(deviceSetting[DeviceSettingKeyEnum.HEIGHT_LIMIT_SET].settingKey)
-              "
-              >编辑</a
-            >
-          </DeviceSettingPopover>
-        </div>
-      </div>
-      <!-- 限远 -->
-      <div class="control-setting-item">
-        <div class="control-setting-item-left">
-          <div class="item-label">
-            {{ deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].label }}
-          </div>
-          <div class="item-status">
-            {{ deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].value }}
-          </div>
-        </div>
-        <div class="control-setting-item-right">
-          <DeviceSettingPopover
-            :visible="deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].popConfirm.visible"
-            :loading="deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].popConfirm.loading"
-            @confirm="onConfirm(deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].settingKey)"
-            @cancel="onCancel(deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].settingKey)"
-          >
-            <template #formContent>
-              <div class="form-content">
-                <span class="form-label"
-                  >{{ deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].label }}:</span
-                >
-                <el-switch
-                  style="margin-right: 10px"
-                  active-text="开"
-                  inactive-text="关"
-                  v-model="deviceSettingFormModel.distanceLimitStatus.state"
-                />
-                <el-input-number
-                  size="small"
-                  v-model="deviceSettingFormModel.distanceLimitStatus.distanceLimit"
-                  :min="15"
-                  :max="8000"
-                />
-                m
-              </div>
-            </template>
-            <a
-              @click="
-                onShowPopConfirm(deviceSetting[DeviceSettingKeyEnum.DISTANCE_LIMIT_SET].settingKey)
-              "
-              >编辑</a
-            >
-          </DeviceSettingPopover>
-        </div>
-      </div>
-      <!-- 水平避障 -->
-      <div class="control-setting-item">
-        <div class="control-setting-item-left">
-          <div class="item-label">
-            {{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].label }}
-          </div>
-          <div class="item-status">
-            {{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].value }}
-          </div>
-        </div>
-        <div class="control-setting-item-right">
-          <DeviceSettingPopover
-            :visible="
-              deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].popConfirm.visible
-            "
-            :loading="
-              deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].popConfirm.loading
-            "
-            @confirm="
-              onConfirm(deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].settingKey)
-            "
-            @cancel="
-              onCancel(deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].settingKey)
-            "
-          >
-            <template #formContent>
-              <div class="form-content">
-                <span class="form-label"
-                  >{{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].label }}:</span
-                >
-                <el-switch
-                  active-text="开"
-                  inactive-text="关"
-                  v-model="deviceSettingFormModel.obstacleAvoidanceHorizon"
-                />
-              </div>
-            </template>
-            <a
-              @click="
-                onShowPopConfirm(
-                  deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON].settingKey
-                )
-              "
-              >编辑</a
-            >
-          </DeviceSettingPopover>
-        </div>
-      </div>
-      <!-- 上视避障 -->
-      <div class="control-setting-item">
-        <div class="control-setting-item-left">
-          <div class="item-label">
-            {{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].label }}
-          </div>
-          <div class="item-status">
-            {{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].value }}
-          </div>
-        </div>
-        <div class="control-setting-item-right">
-          <DeviceSettingPopover
-            :visible="
-              deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].popConfirm.visible
-            "
-            :loading="
-              deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].popConfirm.loading
-            "
-            @confirm="
-              onConfirm(deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].settingKey)
-            "
-            @cancel="
-              onCancel(deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].settingKey)
-            "
-          >
-            <template #formContent>
-              <div class="form-content">
-                <span class="form-label"
-                  >{{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].label }}:</span
-                >
-                <el-switch
-                  active-text="开"
-                  inactive-text="关"
-                  v-model="deviceSettingFormModel.obstacleAvoidanceUpside"
-                />
-              </div>
-            </template>
-            <a
-              @click="
-                onShowPopConfirm(
-                  deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE].settingKey
-                )
-              "
-              >编辑</a
-            >
-          </DeviceSettingPopover>
-        </div>
-      </div>
-      <!-- 下视避障 -->
-      <div class="control-setting-item">
-        <div class="control-setting-item-left">
-          <div class="item-label">
-            {{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].label }}
-          </div>
-          <div class="item-status">
-            {{ deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].value }}
-          </div>
-        </div>
-        <div class="control-setting-item-right">
-          <DeviceSettingPopover
-            :visible="
-              deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].popConfirm.visible
-            "
-            :loading="
-              deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].popConfirm.loading
-            "
-            @confirm="
-              onConfirm(deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].settingKey)
-            "
-            @cancel="
-              onCancel(deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].settingKey)
-            "
-          >
-            <template #formContent>
-              <div class="form-content">
-                <span class="form-label"
-                  >{{
-                    deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].label
-                  }}:</span
-                >
-                <el-switch
-                  active-text="开"
-                  inactive-text="关"
-                  v-model="deviceSettingFormModel.obstacleAvoidanceDownside"
-                />
-              </div>
-            </template>
-            <a
-              @click="
-                onShowPopConfirm(
-                  deviceSetting[DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE].settingKey
-                )
-              "
-              >编辑</a
-            >
-          </DeviceSettingPopover>
-        </div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { defineProps, inject, ref, watch } from 'vue';
-import { ELocalStorageKey } from '@/types'
-import { cloneDeep } from 'lodash';
-import { initDeviceSetting, initDeviceSettingFormModel, DeviceSettingKeyEnum } from '@/types/device-setting';
-import {
-  updateDeviceSettingInfoByOsd,
-  updateDeviceSettingFormModelByOsd,
-} from '@/utils/device-setting';
-import { useDeviceSetting } from './use-device-setting';
-import DeviceSettingPopover from './DeviceSettingPopover.vue'
-
-// const props = defineProps();
-const props = defineProps(['sn', 'deviceInfo'])
-
-// const deviceSetting = ref(cloneDeep(initDeviceSetting));
-// const deviceSettingFormModelFromOsd = ref(cloneDeep(initDeviceSettingFormModel));
-const deviceSettingFormModel = ref(cloneDeep(initDeviceSettingFormModel)); // 真实使用的formModel
-
-const deviceSetting = inject('deviceSetting')
-const deviceSettingFormModelFromOsd = inject('deviceSettingFormModelFromOsd')
-// 根据设备osd信息更新信息
-watch(
-  () => props.deviceInfo,
-  value => {
-    // console.log('9999',value)
-    // updateDeviceSettingInfoByOsd(deviceSetting, value);
-    // updateDeviceSettingFormModelByOsd(deviceSettingFormModelFromOsd, value);
-    // console.log('deviceInfo', value)
-  },
-  {
-    immediate: true,
-    deep: true,
-  }
-);
-
-function onShowPopConfirm(settingKey) {
-  deviceSetting.value[settingKey].popConfirm.visible = true;
-  deviceSettingFormModel.value = cloneDeep(deviceSettingFormModelFromOsd.value);
-}
-
-function onCancel(settingKey) {
-  deviceSetting.value[settingKey].popConfirm.visible = false;
-}
-
-async function onConfirm(settingKey,) {
-  deviceSetting.value[settingKey].popConfirm.loading = true;
-  const body = genDevicePropsBySettingKey(settingKey, deviceSettingFormModel.value);
-  localStorage.setItem(ELocalStorageKey.WorkspaceId, props.deviceInfo.workspace_id)
-  await setDeviceProps(props.sn, props.deviceInfo.workspace_id, body);
-  deviceSetting.value[settingKey].popConfirm.loading = false;
-  deviceSetting.value[settingKey].popConfirm.visible = false;
-}
-
-// 更新设备属性
-const { genDevicePropsBySettingKey, setDeviceProps } = useDeviceSetting();
-</script>
-
-<style lang="scss" scoped>
-.device-setting-wrapper {
-  //border-bottom: 1px solid #515151;
-
-  .device-setting-header {
-    font-size: 14px;
-    //font-weight: 600;
-    padding: 10px 10px 0px;
-  }
-
-  .device-state-box {
-    .device-state-item {
-      width: 23%;
-      .state-item-value {
-      }
-      .state-item-label {
-      }
-    }
-  }
-  .device-state-box::after {
-    content: '';
-    width: 23%;
-  }
-
-  .device-setting-box {
-    display: flex;
-    flex-wrap: wrap;
-    justify-content: space-between;
-    padding: 4px 10px;
-    font-size: 14px;
-
-    .control-setting-item {
-      width: 220px;
-      height: 58px;
-      display: flex;
-      align-items: center;
-      justify-content: space-between;
-      border: 1px solid #666;
-      margin: 4px 0;
-      padding: 0 8px;
-
-      .control-setting-item-left {
-        display: flex;
-        flex-direction: column;
-
-        .item-label {
-          //font-weight: 700;
-        }
-        .item-status {
-          color: #8d8b8b;
-        }
-      }
-      .control-setting-item-right {
-        .el-tooltip__trigger {
-          color: #1C5CFF;
-          cursor: pointer;
-        }
-      }
-    }
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/device/components/DeviceSettingPopover.vue b/applications/task-work-order/src/views/device/components/DeviceSettingPopover.vue
deleted file mode 100644
index fb90a89..0000000
--- a/applications/task-work-order/src/views/device/components/DeviceSettingPopover.vue
+++ /dev/null
@@ -1,99 +0,0 @@
-<template>
-  <el-popover
-    :visible="state.sVisible"
-    trigger="click"
-    :overlay-class-name="overlayClassName"
-    placement="bottom"
-    width="200"
-  >
-    <template #default>
-      <div class="title-content"></div>
-      <slot name="formContent" />
-      <div class="uranus-popconfirm-btns">
-        <el-button @click="onCancel">
-          {{ cancelText || '取消' }}
-        </el-button>
-        <el-button
-          :loading="loading"
-          type="primary"
-          class="confirm-btn"
-          @click="onConfirm"
-        >
-          {{ okText || '确定' }}
-        </el-button>
-      </div>
-    </template>
-    <template #reference>
-      <slot></slot>
-    </template>
-  </el-popover>
-</template>
-
-<script setup>
-import { defineProps, defineEmits, reactive, watch, computed } from 'vue';
-
-const props = defineProps(['visible', 'loading', 'disabled', 'title', 'cancelText', 'okText', 'width']);
-
-const emit = defineEmits(['cancel', 'confirm']);
-
-const state = reactive({
-  sVisible: false,
-  loading: false,
-});
-
-watch(
-  () => props.visible,
-  val => {
-    state.sVisible = val || false;
-  }
-);
-
-const loading = computed(() => {
-  return props.loading;
-});
-const okLabel = computed(() => {
-  return props.loading ? '' : '确定';
-});
-
-const overlayClassName = computed(() => {
-  const classList = ['device-setting-popconfirm'];
-  return classList.join(' ');
-});
-
-function onConfirm(e) {
-  if (props.disabled) {
-    return;
-  }
-  emit('confirm', e);
-}
-
-function onCancel(e) {
-  state.sVisible = false;
-  emit('cancel', e);
-}
-</script>
-
-<style lang="scss">
-.device-setting-popconfirm {
-  min-width: 300px;
-
-  .uranus-popconfirm-btns {
-    display: flex;
-    padding: 10px 0px;
-    justify-content: flex-end;
-
-    .confirm-btn {
-      margin-left: 10px;
-    }
-  }
-
-  .form-content {
-    display: inline-flex;
-    align-items: center;
-
-    .form-label {
-      padding-right: 10px;
-    }
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/device/components/DockControlPanel.vue b/applications/task-work-order/src/views/device/components/DockControlPanel.vue
deleted file mode 100644
index e51976b..0000000
--- a/applications/task-work-order/src/views/device/components/DockControlPanel.vue
+++ /dev/null
@@ -1,552 +0,0 @@
-<template>
-  <div class="dock-control-panel">
-    <!-- title -->
-
-    <!-- setting -->
-    <DeviceSettingBox :sn="props.sn" :deviceInfo="props.deviceInfo"></DeviceSettingBox>
-    <!-- cmd -->
-    <div class="control-cmd-wrapper">
-      <div class="control-cmd-header">
-        远程调试
-        <el-switch v-model="debugStatus" @change="onDeviceStatusChange" active-text="开" inactive-text="关"
-          class="debug-btn" style="--el-switch-on-color: #13ce66; --el-switch-off-color: #ff4949" />
-        <el-divider />
-      </div>
-      <div class="control-cmd-box">
-        <div v-for="(cmdItem, index) in cmdList" :key="cmdItem.cmdKey" class="control-cmd-item">
-          <div class="control-cmd-item-left">
-            <div class="item-label">{{ cmdItem.label }}</div>
-            <div class="item-status">{{ cmdItem.status }}</div>
-          </div>
-          <div class="control-cmd-item-right">
-            <el-button :disabled="!debugStatus || cmdItem.disabled" :loading="cmdItem.loading" size="small"
-              type="primary" @click="sendControlCmd(cmdItem, index)">
-              {{ cmdItem.operateText }}
-            </el-button>
-          </div>
-        </div>
-      </div>
-
-      <el-divider v-if="deviceInfo">无人机设置</el-divider>
-      <div class="control-cmd-box" v-for="(item, index) in cameras">
-        <div>
-          <el-form-item label="摄像头设置">
-            <el-select @change="cameraSettings($event, item)" v-model="videoValue" placeholder="请选择">
-              <el-option v-for="item in videoType" :key="item.value" :label="item.label" :value="item.value">
-              </el-option>
-            </el-select>
-          </el-form-item>
-
-          <el-form-item label="调色盘样式" v-if="videoValue == 'ir'">
-            <el-select @change="changs($event, item)" v-model="valueStyle" placeholder="请选择">
-              <el-option v-for="item in paletteOptions" :key="item.value" :label="item.label" :value="item.value">
-              </el-option>
-            </el-select>
-          </el-form-item>
-        </div>
-
-        <div>
-          <el-form-item label="相机模式">
-            <el-select @change="photoAndVideoCmdSettings($event, item)" v-model="cameraModeValue" placeholder="请选择">
-              <el-option v-for="item in cameraMode" :key="item.value" :label="item.label" :value="item.value">
-              </el-option>
-            </el-select>
-          </el-form-item>
-
-          <el-form-item label="照片存储设置" v-if="cameraModeValue == 0">
-            <el-select v-model="photo_storage_settings" collapse-tags @change="photoStorageTypeChang($event, item)"
-              multiple placeholder="请选择">
-              <el-option v-for="item in photoStorageType" :key="item.value" :label="item.label" :value="item.value">
-              </el-option>
-            </el-select>
-          </el-form-item>
-
-          <el-form-item label="视频存储设置" v-if="cameraModeValue == 1">
-            <el-select v-model="video_storage_settings" collapse-tags @change="videoStorageTypeChang($event, item)"
-              multiple placeholder="请选择">
-              <el-option v-for="item in photoStorageType" :key="item.value" :label="item.label" :value="item.value">
-              </el-option>
-            </el-select>
-          </el-form-item>
-        </div>
-
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { ElMessage } from 'element-plus';
-import { EBizCode, ELocalStorageKey, ERouterName } from '@/types'
-import { defineProps, ref, watch, reactive } from 'vue'
-import { cmdList as baseCmdList } from '@/types/device-cmd'
-import { useDockControl } from './use-dock-control'
-import { EDockModeCode } from '@/types/device'
-import { updateDeviceSettingFormModelByOsd, updateDeviceSettingInfoByOsd } from '@/utils/device-setting';
-import { initDeviceSetting, initDeviceSettingFormModel } from '@/types/device-setting';
-import { updateDeviceCmdInfoByOsd, updateDeviceCmdInfoByExecuteInfo } from '@/utils/device-cmd'
-import { setThermalCurrentPaletteStyle, setPhotoStorageSet, setVideoStorageSet, getLiveStatus, setStreamsSwitch, photoAndVideoCmd } from '@/api/device-setting'
-import DeviceSettingBox from './DeviceSettingBox.vue'
-import Store from '@/store'
-import { useConnectWebSocket } from '@/utils/websocket/connect-websocket';
-import { getWebsocketUrl } from '@/utils/websocket/config';
-import EventBus from '@/utils/eventBus';
-import { cloneDeep } from 'lodash';
-
-const valueStyle = ref(0)
-const cameraModeValue = ref(0)
-const videoValue = ref("zoom")
-const photo_storage_settings = ref([])
-const video_storage_settings = ref([])
-
-
-
-let deviceSetting = ref(cloneDeep(initDeviceSetting));
-const deviceSettingFormModelFromOsd = ref(cloneDeep(initDeviceSettingFormModel));
-
-provide('deviceSetting', deviceSetting)
-provide('deviceSettingFormModelFromOsd', deviceSettingFormModelFromOsd)
-
-// 定义一个数据videoList
-const videoList = reactive([])
-// 摄像头信息
-let cameras = reactive([])
-// let cameras = reactive([
-//   {
-//     camera_mode: 0,
-//     liveview_world_region: {
-//       bottom: 0.5515424609184265,
-//       left: 0.42740535736083984,
-//       right: 0.5581043362617493,
-//       top: 0.42277535796165466
-//     },
-//     payload_index: "81-0-0",
-//     photo_state: 0,
-//     record_time: 0,
-//     recording_state: 0,
-//     remain_photo_num: 3931,
-//     remain_record_duration: 0,
-//     zoom_factor: 6.9999943,
-//     ir_zoom_factor: 2,
-//     photo_storage_settings: [
-//       "vision",
-//       "ir"
-//     ],
-//     video_storage_settings: [
-//       "vision"
-//     ]
-//   }
-// ])
-
-// 无人机信息
-let deviceInfo = ref()
-
-// camera_mode {"0":"拍照","1":"录像","2":"智能低光","3":"全景拍照","-1":"不支持的模式"}
-const cameraMode = [
-  { label: '拍照', value: 0 },
-  { label: '录像', value: 1 },
-  { label: '智能低光', value: 2 },
-  { label: '全景拍照', value: 3 },
-  // { label: '不支持的模式', value: -1 },
-]
-
-// 调色盘选项数据
-const paletteOptions = [
-  { label: '白热', value: 0 },
-  { label: '黑热', value: 1 },
-  { label: '描红', value: 2 },
-  { label: '医疗', value: 3 },
-  { label: '彩虹1', value: 5 },
-  { label: '铁红', value: 6 },
-  { label: '北极', value: 8 },
-  { label: '熔岩', value: 11 },
-  { label: '热铁', value: 12 },
-  { label: '彩虹2', value: 13 },
-]
-// 视频类型 ZOOM("zoom"), WIDE("wide"), THERMAL("thermal"), NORMAL("normal"), IR("ir");
-const videoType = [
-  { label: '变焦', value: 'zoom' },
-  { label: '广角', value: 'wide' },
-  // { label: '热红外', value: 'thermal' },
-  // { label: '正常', value: 'normal' },
-  { label: '红外', value: 'ir' },
-]
-// 拍照存储类型{current, wide, zoom, ir},可多选
-const photoStorageType = [
-  { label: '当前', value: 'current' },
-  { label: '广角', value: 'wide' },
-  { label: '变焦', value: 'zoom' },
-  { label: '可见光', value: 'vision' },
-  { label: '红外', value: 'ir' },
-]
-
-const props = defineProps(['sn', 'deviceInfo'])
-const initCmdList = baseCmdList.map(cmdItem => Object.assign({}, cmdItem))
-const cmdList = ref(initCmdList)
-// dock 控制指令
-const debugStatus = ref(props.deviceInfo.mode_code == EDockModeCode.Remote_Debugging)
-
-// 根据机场指令执行状态更新信息
-watch(
-  () => Store.getters.devicesCmdExecuteInfo,
-  devicesCmdExecuteInfo => {
-    // console.log('设备指令执行状态变化', devicesCmdExecuteInfo)
-    if (props.sn && devicesCmdExecuteInfo[props.sn]) {
-      updateDeviceCmdInfoByExecuteInfo(cmdList.value, devicesCmdExecuteInfo[props.sn])
-    }
-  },
-  {
-    immediate: true,
-    deep: true,
-  }
-)
-watch(
-  () => Store.state.device.videoSurveillance,
-  newObj => {
-    // console.log('视频类型监听中', newObj)
-    if (newObj && newObj.live_status && newObj.live_status.length) {
-      let arr = newObj.live_status || []
-      if (videoList.length == arr.length) {
-        return
-      }
-      arr.forEach(element => {
-        let video_id = element.video_id
-        element.payIndex = video_id.split('/')[1].split('-')[1]
-        if (props.deviceInfo.child_sn == video_id.split('/')[0]) {
-          if (element.video_type == 'normal' || element.video_type == 'thermal') {
-            videoValue.value = 'wide'
-          } else {
-            videoValue.value = element.video_type
-          }
-        }
-      })
-      videoList.push(...arr) // 添加新元素
-    }
-  },
-  {
-    immediate: true,
-    deep: true,
-  }
-)
-
-// 根据设备osd信息更新信息
-watch(
-  () => Store.getters.deviceState,
-  value => {
-    // console.log(value, '测试')
-    // console.log('设备状态变化', value.deviceInfo[props.deviceInfo.child_sn])
-    if (props.sn && (value.currentSn === props.deviceInfo.child_sn || value.currentSn === props.deviceInfo.device_sn)) {
-      debugStatus.value = value.dockInfo[props.deviceInfo.device_sn]?.basic_osd?.mode_code === EDockModeCode.Remote_Debugging
-      const devices = {}
-      devices['device'] = value.deviceInfo[props.deviceInfo.child_sn]
-      devices['dock'] = value.dockInfo[props.deviceInfo.device_sn]
-      devices['gateway'] = value.gatewayInfo
-      let cameraList = value.deviceInfo[props.deviceInfo.child_sn]?.cameras || []
-      cameras = cameraList
-      // console.log('设备osd.cameras信息变化', cameras)
-      // 判断cameras列表长度是否为0,如果为0,则不执行后续操作
-      if (cameras.length > 0) {
-        cameraModeValue.value = cameras[0].camera_mode
-        photo_storage_settings.value = cameras[0]?.photo_storage_settings ?? [];
-        video_storage_settings.value = cameras[0]?.video_storage_settings ?? [];
-      }
-      deviceInfo = ref(value.deviceInfo[props.deviceInfo.child_sn])
-      updateDeviceCmdInfoByOsd(cmdList.value, devices)
-      // by cpz
-      updateDeviceSettingInfoByOsd(deviceSetting, value.deviceInfo[props.deviceInfo.child_sn]);
-      updateDeviceSettingFormModelByOsd(deviceSettingFormModelFromOsd, value.deviceInfo[props.deviceInfo.child_sn])
-    }
-  },
-  {
-    immediate: true,
-    deep: true,
-  }
-)
-onMounted(() => {
-  const webSorketUrl = getWebsocketUrl() + '&workspace-id=' + props.deviceInfo.workspace_id
-  // 监听ws 消息
-  useConnectWebSocket(messageHandler, webSorketUrl)
-  getLiveStatuss()
-});
-
-async function getLiveStatuss() {
-  let result = await getLiveStatus(props.sn)
-  result.data.data.live_status.forEach(item => {
-    if (props.deviceInfo.child_sn == item.video_id.split('/')[0]) {
-      if (item.video_type == 'normal' || item.video_type == 'thermal') {
-        videoValue.value = 'wide'
-      } else {
-        videoValue.value = item.video_type
-      }
-    }
-  })
-}
-
-
-// 远程控制开关
-async function onDeviceStatusChange(status) {
-  let result = false
-  if (status) {
-    result = await dockDebugOnOff(props.sn, true)
-  } else {
-    result = await dockDebugOnOff(props.sn, false)
-  }
-
-  if (!result) {
-    if (status) {
-      debugStatus.value = false
-    } else {
-      debugStatus.value = true
-    }
-  }
-}
-
-const { sendDockControlCmd, dockDebugOnOff } = useDockControl()
-
-async function sendControlCmd(cmdItem, index) {
-  const params = {
-    sn: props.sn,
-    cmd: cmdItem.cmdKey,
-    action: cmdItem.action,
-  }
-  const success = await sendDockControlCmd(params, true)
-}
-
-// webSocket 监听
-const messageHandler = async payload => {
-  payload = JSON.parse(payload)
-  if (!payload) {
-    return
-  }
-  switch (payload.biz_code) {
-    case EBizCode.GatewayOsd: {
-      Store.commit('SET_GATEWAY_INFO', payload.data)
-      break
-    }
-    // 飞行器
-    case EBizCode.DeviceOsd: {
-      Store.commit('SET_DEVICE_INFO', payload.data)
-      break
-    }
-    // 机场
-    case EBizCode.DockOsd: {
-      Store.commit('SET_DOCK_INFO', payload.data)
-      break
-    }
-    case EBizCode.MapElementCreate: {
-      Store.commit('SET_MAP_ELEMENT_CREATE', payload.data)
-      break
-    }
-    case EBizCode.MapElementUpdate: {
-      Store.commit('SET_MAP_ELEMENT_UPDATE', payload.data)
-      break
-    }
-    case EBizCode.MapElementDelete: {
-      Store.commit('SET_MAP_ELEMENT_DELETE', payload.data)
-      break
-    }
-    case EBizCode.DeviceOnline: {
-      Store.commit('SET_DEVICE_ONLINE', payload.data)
-      break
-    }
-    case EBizCode.DeviceOffline: {
-      Store.commit('SET_DEVICE_OFFLINE', payload.data)
-      break
-    }
-    case EBizCode.FlightTaskProgress:
-    case EBizCode.FlightTaskMediaProgress:
-    case EBizCode.FlightTaskMediaHighestPriority: {
-      EventBus.emit('flightTaskWs', payload)
-      break
-    }
-    case EBizCode.DeviceHms: {
-      Store.commit('SET_DEVICE_HMS_INFO', payload.data)
-      break
-    }
-    case EBizCode.VideoSurveillance: {
-      if (payload.data.live_status && payload.data.live_status.length) {
-        Store.commit('SAVE_VIDEO_SURVEILLANCE_INFO', payload.data)
-      }
-      break
-    }
-    case EBizCode.DeviceReboot:
-    case EBizCode.DroneOpen:
-    case EBizCode.DroneClose:
-    case EBizCode.CoverOpen:
-    case EBizCode.CoverClose:
-    case EBizCode.PutterOpen:
-    case EBizCode.PutterClose:
-    case EBizCode.ChargeOpen:
-    case EBizCode.ChargeClose:
-    case EBizCode.DeviceFormat:
-    case EBizCode.DroneFormat: {
-      Store.commit('SET_DEVICES_CMD_EXECUTE_INFO', {
-        biz_code: payload.biz_code,
-        timestamp: payload.timestamp,
-        ...payload.data,
-      })
-      break
-    }
-    case EBizCode.ControlSourceChange:
-    case EBizCode.FlyToPointProgress:
-    case EBizCode.TakeoffToPointProgress:
-    case EBizCode.JoystickInvalidNotify:
-    case EBizCode.DrcStatusNotify: {
-      EventBus.emit('droneControlWs', payload)
-      break
-    }
-    default:
-      break
-  }
-}
-
-
-// 添加 changs 方法
-async function changs(value, item) {
-  const payload = {
-    [item.payload_index]: {
-      thermal_current_palette_style: value
-    }
-  }
-  console.log('payload', payload)
-  let data = await setThermalCurrentPaletteStyle(props.sn, props.deviceInfo.workspace_id, payload)
-  if (data.data.code === 0) {
-    ElMessage.success('修改成功');
-  }
-}
-// 摄像头设置
-async function cameraSettings(value, item) {
-  const payload = {
-    // 1581F6Q8D245U00G57GJ/81-0-0/normal-0
-    video_id: props.deviceInfo.child_sn + '/' + item.payload_index + '/normal-0',
-    video_type: value
-  }
-  let data = await setStreamsSwitch(payload)
-  if (data.data.code === 0) {
-    ElMessage.success('修改成功');
-  }
-}
-// 相机模式设置
-async function photoAndVideoCmdSettings(value, item) {
-  // photo 0 video_start 1 video_stop
-  item.camera_mode = value
-  let data = await photoAndVideoCmd(props.deviceInfo.child_sn, value)
-  if (data.data.code == 0) {
-    ElMessage.success('修改成功');
-  }
-}
-// 照片存储设置
-async function photoStorageTypeChang(value, item) {
-  // value 不能为空
-  if (!value) {
-    ElMessage.error('请选择存储方式');
-    return;
-  }
-  const payload = {
-    payload_index: item.payload_index,
-    photo_storage_settings: value
-  }
-  item.photo_storage_settings = value
-  let data = await setPhotoStorageSet(props.sn, payload)
-  if (data.data.code == 0) {
-    ElMessage.success('修改成功');
-  }
-}
-// 视频存储设置
-async function videoStorageTypeChang(value, item) {
-  if (!value) {
-    ElMessage.error('请选择存储方式');
-    return;
-  }
-  const payload = {
-    payload_index: item.payload_index,
-    video_storage_settings: value
-  }
-  item.video_storage_settings = value
-  let data = await setVideoStorageSet(props.sn, payload)
-  if (data.data.code == 0) {
-    ElMessage.success('修改成功');
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-.dock-control-panel {
-  position: relative;
-  width: 100%;
-  height: 100%;
-  padding: 0 !important;
-  color: #000;
-  border-radius: 2px;
-
-  .control-cmd-wrapper {
-    font-size: 14px;
-    .control-cmd-header {
-      font-size: 14px;
-      //font-weight: 600;
-      padding: 10px 10px 0px;
-
-      .debug-btn {
-        margin-left: 10px;
-        // border: 1px solid #585858;
-      }
-    }
-
-    .control-cmd-box {
-      display: flex;
-      flex-wrap: wrap;
-      justify-content: space-between;
-      padding: 4px 15px;
-
-      .control-cmd-item {
-        width: 320px;
-        height: 58px;
-        display: flex;
-        align-items: center;
-        justify-content: space-between;
-        border: 1px solid #666;
-        margin: 8px 0;
-        padding: 0 8px;
-        border-radius: 2px;
-
-        .control-cmd-item-left {
-          display: flex;
-          flex-direction: column;
-
-          .item-label {
-            //font-weight: 700;
-          }
-          .item-status {
-            color: #8d8b8b;
-          }
-        }
-      }
-    }
-  }
-
-  ::v-deep {
-    .el-form {
-      display: flex;
-      flex-wrap: wrap;
-      justify-content: space-between;
-      padding: 4px 15px;
-    }
-
-    .el-form-item {
-      width: 320px;
-      height: 58px;
-      display: flex;
-      align-items: center;
-      justify-content: space-between;
-      border: 1px solid #666;
-      margin: 8px 0;
-      padding: 0 8px;
-      border-radius: 2px;
-    }
-
-    .el-select__wrapper {
-      width: 160px;
-    }
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/device/components/devicePerShare.vue b/applications/task-work-order/src/views/device/components/devicePerShare.vue
deleted file mode 100644
index 8b3feaa..0000000
--- a/applications/task-work-order/src/views/device/components/devicePerShare.vue
+++ /dev/null
@@ -1,301 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" ref="crud" @row-del="rowDel"
-      v-model="form" :permission="permissionList" @row-save="rowSave" @row-update="rowUpdate" :before-open="beforeOpen"
-      @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
-      @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange">
-    </avue-crud>
-  </basic-container>
-</template>
-
-<script>
-import { getList, remove, add, update } from '@/api/device/devicePerShare'
-import { getDeptTreeByNotItself } from '@/api/system/dept'
-import { mapGetters } from 'vuex'
-
-export default {
-  data () {
-    return {
-      deptId: '',
-      deviceSn: '',
-      form: {},
-      query: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      selectionList: [],
-      deptTreeData: [],
-      option: {
-        lazy: true,
-        tree: true,
-        dialogWidth: 750,
-        tip: false,
-        searchShow: true,
-        searchMenuSpan: 6,
-        border: true,
-        index: true,
-        viewBtn: true,
-        addBtn: true,
-        editBtn: false,
-        selection: true,
-        excelBtn: false,
-        dialogClickModal: false,
-        grid: false,
-
-        height: 'auto',
-        calcHeight: 20,
-
-        column: [
-          {
-            label: '授权单位',
-            prop: 'deptId',
-            // labelWidth: 100,
-            type: 'tree',
-            dicData: [],
-            props: {
-              label: 'name',
-              value: 'id',
-            },
-            span: 24,
-            row: true,
-            hide: true,
-            editDisplay: false,
-            viewDisplay: false,
-            rules: [
-              {
-                required: true,
-                message: '请输入授权单位',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '授权单位',
-            prop: 'deptName',
-            // labelWidth: 100,
-            addDisplay: false,
-            editDisabled: true,
-            search: true,
-            searchSpan: 6,
-            span: 24,
-            row: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入授权单位',
-                trigger: 'blur',
-              },
-            ],
-          },
-          // {
-          //   label: '授权功能',
-          //   prop: 'devicePerMenuId',
-          //   labelWidth: 130,
-          //   type: 'tree',
-          //   dicUrl: '/blade-system/manage/api/v1/devicePerMenu/selectDeviceList',
-          //   props: {
-          //     label: 'name',
-          //     value: 'id',
-          //   },
-          //   multiple: true,
-          //   dataType: 'string',
-          //   span: 24,
-          //   row: true,
-          //   rules: [
-          //     {
-          //       required: true,
-          //       message: '请输入授权功能',
-          //       trigger: 'blur',
-          //     },
-          //   ],
-          // },
-          {
-            label: '授权时间',
-            prop: 'createTime',
-            type: 'date',
-            addDisplay: false,
-            editDisplay: false,
-            span: 24,
-            row: true,
-            width: 200,
-            format: 'YYYY-MM-DD HH:mm:ss',
-          },
-        ],
-      },
-      data: [],
-    }
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList () {
-      return {
-        addBtn: this.validData(this.permission.airport_add, true),
-        viewBtn: this.validData(this.permission.airport_view, true),
-        delBtn: this.validData(this.permission.airport_delete, true),
-        editBtn: this.validData(this.permission.airport_edit, false),
-      }
-    },
-    ids () {
-      let ids = []
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id)
-      })
-      return ids.join(',')
-    },
-  },
-  methods: {
-    init (data) {
-      this.deptId = data.dept_id
-      this.deviceSn = data.device_sn
-      this.getDeptTreeInfo()
-      this.getLoadPage(this.page)
-    },
-    getDeptTreeInfo () {
-      getDeptTreeByNotItself(this.deptId, this.deviceSn).then(res => {
-        const column = this.findObject(this.option.column, 'deptId')
-        this.deptTreeData = res.data.data
-        column.dicData = res.data.data
-      })
-    },
-    rowSave (row, done, loading) {
-      // 添加毫秒级时间戳
-      row['createTime'] = Date.now()
-      row['deviceSn'] = this.deviceSn
-
-      add(row).then(
-        () => {
-          this.initFlag = false
-          this.getLoadPage(this.page)
-          this.getDeptTreeInfo()
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowUpdate (row, index, done, loading) {
-      row['device_sn'] = this.deviceSn
-      update(row).then(
-        () => {
-          this.getLoadPage(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowDel (row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id)
-        })
-        .then(() => {
-          this.getDeptTreeInfo()
-          this.getLoadPage(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-        })
-    },
-    searchReset () {
-      this.query = {}
-      this.getLoadPage(this.page)
-    },
-    searchChange (params, done) {
-      this.query = params
-      this.page.currentPage = 1
-      this.getLoadPage(this.page, params)
-      done()
-    },
-    selectionChange (list) {
-      this.selectionList = list
-    },
-    selectionClear () {
-      this.selectionList = []
-      this.$refs.crud.toggleSelection()
-    },
-    handleDelete () {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据')
-        return
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids)
-        })
-        .then(() => {
-          this.getLoadPage(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          this.$refs.crud.toggleSelection()
-        })
-    },
-    beforeOpen (done, type) {
-      done()
-    },
-    currentChange (currentPage) {
-      this.page.currentPage = currentPage
-      this.getLoadPage(this.page, this.query) // 添加数据刷新
-    },
-    sizeChange (pageSize) {
-      this.page.pageSize = pageSize
-      this.page.currentPage = 1 // 每页条数改变时,重置到第一页
-      this.getLoadPage(this.page, this.query) // 添加数据刷新
-    },
-    refreshChange () {
-      this.getLoadPage(this.page, this.query)
-    },
-    getLoadPage (page, params = {}) {
-      params['deviceSn'] = this.deviceSn
-      this.loading = true
-      getList(page.currentPage, page.pageSize, params).then(res => {
-        const data = res.data.data
-        this.page.total = data.total
-        this.data = data.records
-        this.loading = false
-        this.selectionClear()
-      }).catch(err => {
-        console.error('加载数据失败:', err)
-        this.loading = false
-      })
-    },
-  },
-}
-</script>
-
-<style>
-.firmware_status {
-  background-color: aqua;
-  border-radius: 4px;
-}
-
-.firmware_status:hover {
-  cursor: pointer;
-}
-</style>
diff --git a/applications/task-work-order/src/views/device/components/firmwareManage.vue b/applications/task-work-order/src/views/device/components/firmwareManage.vue
deleted file mode 100644
index 3cf32e4..0000000
--- a/applications/task-work-order/src/views/device/components/firmwareManage.vue
+++ /dev/null
@@ -1,444 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud
-      :option="option"
-      :table-loading="loading"
-      :data="data"
-      v-model:page="page"
-      ref="crud"
-      @row-del="rowDel"
-      v-model="form"
-      :permission="permissionList"
-      @row-update="rowUpdate"
-      :before-open="beforeOpen"
-      @search-change="searchChange"
-      @search-reset="searchReset"
-      @selection-change="selectionChange"
-      @current-change="currentChange"
-      @size-change="sizeChange"
-      @refresh-change="refreshChange"
-       @on-load="onLoad"
-    >
-      <template #menu-left>
-        <el-button type="primary" icon="el-icon-plus" plain @click="openFirmwareUpload"
-          >固件上传
-        </el-button>
-      </template>
-    </avue-crud>
-    <el-dialog title="固件上传" class="ztzf-dialog-mange" append-to-body v-model="firmwareUploadBox" width="40%" height="60%">
-      <el-form
-        ref="form"
-        class="ztzf-form-search"
-        :model="importForm"
-        v-loading="loadingForm"
-        style="width: 80%; margin-left: 10%"
-        :rules="rules"
-      >
-        <el-form-item label="设备名称" prop="device_name">
-          <el-input v-model="importForm.device_name" clearable></el-input>
-        </el-form-item>
-
-        <!-- 上传 -->
-        <el-form-item label="固件文件" prop="file">
-          <el-upload
-            class="upload-demo"
-            action="#"
-            ref="uploadFirmware"
-            :limit="1"
-            :auto-upload="false"
-            :multiple="false"
-            :before-upload="beforeUploadFile"
-          >
-            <i class="el-icon-upload"></i>
-            <div class="el-upload__text" style="height: 50px"> <el-button>点击上传</el-button></div>
-          </el-upload>
-        </el-form-item>
-        <el-form-item label="是否可用" prop="status">
-          <el-select v-model="importForm.status" placeholder="请选择" clearable>
-            <el-option label="是" value="1"></el-option>
-            <el-option label="否" value="0"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="说明" prop="release_note">
-          <el-input type="textarea" v-model="importForm.release_note" clearable></el-input>
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-        <el-button type="primary" @click="onConfirm" icon="el-icon-circle-check">确定</el-button>
-        <el-button @click="onCancel" icon="el-icon-circle-close">取消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </basic-container>
-</template>
-
-<script>
-import { getDeviceFirmwareList, deleteFirmware, updateFirmware, upload } from '@/api/device/device';
-import { mapGetters } from 'vuex';
-
-export default {
-  data() {
-    return {
-      loadingForm:false,
-      file: '',
-      rules: {
-        device_name: [{ required: true, message: '请输入设备名称', trigger: 'blur' }],
-        status: [{ required: true, message: '请选择', trigger: 'change' }],
-        release_note:[{ required: true, message: '请输入版本说明', trigger: 'blur' }],
-      },
-      importForm: {},
-      firmwareUploadBox: false,
-      form: {},
-      query: {},
-      workspaceId: '4a574d68-4ad3-48f7-9f16-3edbcd8056e1',
-      deviceName: '',
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      selectionList: [],
-      option: {
-        emptyBtnText: '重置',
-        emptyBtnIcon: 'el-icon-refresh',
-        lazy: true,
-        tree: true,
-        dialogWidth: 950,
-        tip: false,
-        searchShow: true,
-        searchGutter: 30,
-        searchMenuPosition: 'left',
-        searchMenuSpan: 4,
-        border: true,
-        index: true,
-        viewBtn: true,
-        addBtn: false,
-        selection: true,
-        excelBtn: false,
-        dialogClickModal: false,
-        grid: false,
-
-        height: 'auto',
-        calcHeight: 20,
-        column: [
-          {
-            label: '设备名称',
-            prop: 'device_name',
-            // search: true,
-            // searchSpan: 5,
-            labelWidth: 130,
-            addDisplay: false,
-            editDisabled: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入设备型号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '文件名称',
-            prop: 'file_name',
-            labelWidth: 130,
-            search: true,
-            searchSpan: 4,
-            // searchLabelWidth: 120,
-            editDisabled: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入固件文件名称',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '文件大小',
-            prop: 'file_size',
-            addDisplay: false,
-            editDisabled: true,
-            hide:true,
-            labelWidth: 130,
-            rules: [
-              {
-                required: false,
-                message: '请输入文件大小',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '固件版本',
-            prop: 'firmware_version',
-            labelWidth: 130,
-            width: 100,
-            editDisabled: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入固件版本',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '上传时间',
-            prop: 'create_time',
-            type: 'date',
-            addDisplay: false,
-            editDisplay: false,
-            labelWidth: 130,
-            width: 160,
-            format: 'YYYY-MM-DD HH:mm:ss',
-            // valueFormat: 'YYYY-MM-DD HH:mm:ss',
-            startPlaceholder: '任务开始时间',
-            rules: [
-              {
-                required: true,
-                message: '请输入在线时间',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '是否可用',
-            prop: 'status',
-            addDisplay: false,
-            labelWidth: 130,
-            type: 'select',
-            width: 100,
-            dicData: [
-              {
-                label: '可用',
-                value: true,
-              },
-              {
-                label: '不可用',
-                value: false,
-              },
-            ],
-            rules: [
-              {
-                required: true,
-                message: '请输入在线状态',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '上传状态',
-            prop: 'upload_status',
-            addDisplay: false,
-            editDisplay: false,
-            labelWidth: 130,
-            type: 'select',
-            width: 100,
-            dicData: [
-              {
-                label: '上传中或者上传失败',
-                value: 1,
-              },
-              {
-                label: '上传成功',
-                value: 2,
-              },
-            ],
-            rules: [
-              {
-                required: true,
-                message: '请输入在线状态',
-                trigger: 'blur',
-              },
-            ],
-          },
-        ],
-      },
-      data: [],
-    };
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList() {
-      return {
-        addBtn: this.validData(this.permission.airport_add, true),
-        viewBtn: this.validData(this.permission.airport_view, true),
-        delBtn: this.validData(this.permission.airport_delete, true),
-        editBtn: this.validData(this.permission.airport_edit, true),
-      };
-    },
-    ids() {
-      let ids = [];
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id);
-      });
-      return ids.join(',');
-    },
-  },
-  methods: {
-    //自定义上传方法,使用上传组件的submit()后才会触发以获取文件实体
-    beforeUploadFile(param) {
-      this.file = param;
-      return false;
-    },
-    // 确定按钮
-    onConfirm() {
-      var that = this;
-      this.$refs.form.validate(valid => {
-        if (valid) {
-          this.$refs.uploadFirmware.submit();
-          const formDatas = new FormData();
-          formDatas.append('file', that.file);
-          formDatas.append('deviceName', that.importForm.device_name);
-          formDatas.append('releaseNote', that.importForm.release_note);
-          formDatas.append('status', that.importForm.status);
-          this.loadingForm = true;
-          // 提交
-          upload(this.workspaceId, formDatas).then(res => {
-            this.loadingForm = false;
-            this.firmwareUploadBox = false;
-            that.importForm = {}
-            this.onLoad(this.page);
-            this.$message({
-              type: 'success',
-              message: '操作成功!',
-            });
-          });
-        } else {
-          console.log('error submit!!');
-          return false;
-        }
-      });
-    },
-    onCancel(){
-        this.firmwareUploadBox = false;
-        this.file = ''
-    },
-    //打卡固件上传页面
-    openFirmwareUpload() {
-      this.firmwareUploadBox = true;
-      this.importForm['device_name'] = this.deviceName;
-    },
-    // 初始化数据
-    init(data) {
-      // this.workspaceId = data.workspace_id;
-      this.workspaceId = '4a574d68-4ad3-48f7-9f16-3edbcd8056e1';
-      this.deviceName = data.device_name;
-      this.onLoad(this.page);
-    },
-    rowUpdate(row, index, done, loading) {
-        updateFirmware(row).then(
-        () => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          done();
-        },
-        error => {
-          window.console.log(error);
-          loading();
-        }
-      );
-    },
-    rowDel(row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return deleteFirmware(row.id);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-        });
-    },
-    searchReset() {
-      this.query = {};
-      this.onLoad(this.page);
-    },
-    searchChange(params, done) {
-      this.query = params;
-      this.page.currentPage = 1;
-      this.onLoad(this.page, params);
-      done();
-    },
-    selectionChange(list) {
-      this.selectionList = list;
-    },
-    selectionClear() {
-      this.selectionList = [];
-      this.$refs.crud.toggleSelection();
-    },
-    handleDelete() {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据');
-        return;
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          this.$refs.crud.toggleSelection();
-        });
-    },
-    beforeOpen(done, type) {
-      done();
-    },
-    currentChange(currentPage) {
-      this.page.currentPage = currentPage;
-    },
-    sizeChange(pageSize) {
-      this.page.pageSize = pageSize;
-    },
-    refreshChange() {
-      this.onLoad(this.page, this.query);
-    },
-    onLoad(page, params = {}) {
-      params['device_name'] = this.deviceName;
-      this.loading = true;
-      getDeviceFirmwareList(page.currentPage, page.pageSize, params).then(res => {
-        const data = res.data.data;
-        this.page.total = data.total;
-        this.data = data.records;
-        this.loading = false;
-        this.selectionClear();
-      });
-    },
-  },
-};
-</script>
-
-<style>
-.firmware_status {
-  background-color: aqua;
-  border-radius: 4px;
-}
-.firmware_status:hover {
-  cursor: pointer;
-  /* color: aqua; */
-}
-</style>
-<style scoped lang="scss">
-.upload-demo {
-  height: 30px;
-}
-</style>
diff --git a/applications/task-work-order/src/views/device/components/use-device-setting.js b/applications/task-work-order/src/views/device/components/use-device-setting.js
deleted file mode 100644
index a57cc92..0000000
--- a/applications/task-work-order/src/views/device/components/use-device-setting.js
+++ /dev/null
@@ -1,72 +0,0 @@
-import { ElMessage } from 'element-plus';
-
-import { putDeviceProps } from '@/api/device-setting';
-import {
-  DeviceSettingKeyEnum,
-  ObstacleAvoidanceStatusEnum,
-  NightLightsStateEnum,
-  DistanceLimitStatusEnum,
-} from '@/types/device-setting';
-import { messages } from '@/lang';
-
-export function useDeviceSetting() {
-  // 生成参数
-  function genDevicePropsBySettingKey(key, fromModel) {
-    const body = {};
-    if (key === DeviceSettingKeyEnum.NIGHT_LIGHTS_MODE_SET) {
-      body.night_lights_state = fromModel.nightLightsState
-        ? NightLightsStateEnum.OPEN
-        : NightLightsStateEnum.CLOSE;
-    } else if (key === DeviceSettingKeyEnum.HEIGHT_LIMIT_SET) {
-      body.height_limit = fromModel.heightLimit;
-    } else if (key === DeviceSettingKeyEnum.DISTANCE_LIMIT_SET) {
-      body.distance_limit_status = {};
-      if (fromModel.distanceLimitStatus.state) {
-        body.distance_limit_status.state = DistanceLimitStatusEnum.SET;
-        body.distance_limit_status.distance_limit = fromModel.distanceLimitStatus.distanceLimit;
-      } else {
-        body.distance_limit_status.state = DistanceLimitStatusEnum.UNSET;
-      }
-    } else if (key === DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_HORIZON) {
-      body.obstacle_avoidance = {
-        horizon: fromModel.obstacleAvoidanceHorizon
-          ? ObstacleAvoidanceStatusEnum.OPEN
-          : ObstacleAvoidanceStatusEnum.CLOSE,
-      };
-    } else if (key === DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_UPSIDE) {
-      body.obstacle_avoidance = {
-        upside: fromModel.obstacleAvoidanceUpside
-          ? ObstacleAvoidanceStatusEnum.OPEN
-          : ObstacleAvoidanceStatusEnum.CLOSE,
-      };
-    } else if (key === DeviceSettingKeyEnum.OBSTACLE_AVOIDANCE_DOWNSIDE) {
-      body.obstacle_avoidance = {
-        downside: fromModel.obstacleAvoidanceDownside
-          ? ObstacleAvoidanceStatusEnum.OPEN
-          : ObstacleAvoidanceStatusEnum.CLOSE,
-      };
-    }
-    return body;
-  }
-
-  // 设置设备属性
-  async function setDeviceProps(sn, workspaceId, body) {
-    try {
-       await putDeviceProps(sn, workspaceId, body).then(res => {
-         if (res.data.code === 0) {
-           ElMessage({
-             message: '设备属性设置成功!',
-             type: 'success',
-           });
-         }
-      });
-    } catch (e) {
-      return false;
-    }
-  }
-
-  return {
-    genDevicePropsBySettingKey,
-    setDeviceProps,
-  };
-}
diff --git a/applications/task-work-order/src/views/device/components/use-dock-control.js b/applications/task-work-order/src/views/device/components/use-dock-control.js
deleted file mode 100644
index 546a2fb..0000000
--- a/applications/task-work-order/src/views/device/components/use-dock-control.js
+++ /dev/null
@@ -1,70 +0,0 @@
-import { ElMessage } from 'element-plus';
-import { ref } from 'vue';
-import { postSendCmd } from '@/api/device-cmd';
-import { DeviceCmd } from '@/types/device-cmd';
-
-export function useDockControl() {
-  const dockControlPanelVisible = ref(false);
-
-  function setDockControlPanelVisible(visible) {
-    dockControlPanelVisible.value = visible;
-  }
-
-  // 远程调试开关
-  async function dockDebugOnOff(sn, on) {
-    const result = await sendDockControlCmd(
-      {
-        sn: sn,
-        cmd: on ? DeviceCmd.DebugModeOpen : DeviceCmd.DebugModeClose,
-      },
-      false
-    );
-    return result;
-  }
-
-  // 发送指令
-  async function sendDockControlCmd(params, tip = true) {
-    let body = undefined;
-    if (params.action !== undefined) {
-      if (params.cmd === DeviceCmd.SdrWorkModeSwitch) {
-        body = {
-          link_workmode: params.action,
-        };
-      } else {
-        body = {
-          action: params.action,
-        };
-      }
-    }
-    try {
-      const res = await postSendCmd({ dock_sn: params.sn, device_cmd: params.cmd }, body);
-      if (res.data.code === 0) {
-        tip &&
-          ElMessage({
-            message: '指令发送成功',
-            type: 'success',
-          });
-        return true;
-      }
-    } catch (error) {
-      return false;
-    }
-
-    return false;
-  }
-
-  // 控制面板关闭
-  async function onCloseControlPanel(sn) {
-    console.log(dockControlPanelVisible.value, 'value');
-    await dockDebugOnOff(sn, false);
-    setDockControlPanelVisible(false);
-  }
-
-  return {
-    dockControlPanelVisible,
-    setDockControlPanelVisible,
-    sendDockControlCmd,
-    dockDebugOnOff,
-    onCloseControlPanel,
-  };
-}
diff --git a/applications/task-work-order/src/views/device/devicePerMenu.vue b/applications/task-work-order/src/views/device/devicePerMenu.vue
deleted file mode 100644
index ef97045..0000000
--- a/applications/task-work-order/src/views/device/devicePerMenu.vue
+++ /dev/null
@@ -1,307 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" ref="crud" @row-del="rowDel"
-      v-model="form" :permission="permissionList" @row-save="rowSave" @row-update="rowUpdate" :before-open="beforeOpen"
-      @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
-      @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
-    </avue-crud>
-  </basic-container>
-</template>
-
-<script>
-import { getList, remove, add, update } from '@/api/device/devicePerMenu'
-import { mapGetters } from 'vuex'
-
-export default {
-  data () {
-    return {
-      form: {},
-      query: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      selectionList: [],
-      option: {
-        dialogWidth: 750,
-        tip: false,
-        searchShow: true,
-        searchGutter: 30,
-        searchMenuPosition: 'left',
-        searchMenuSpan: 4,
-        border: true,
-        index: true,
-        viewBtn: true,
-        addBtn: true,
-        selection: true,
-        excelBtn: false,
-        dialogClickModal: false,
-        grid: false,
-
-        height: 'auto',
-        calcHeight: 20,
-
-        column: [
-          {
-            label: '菜单名称',
-            prop: 'name',
-            search: true,
-            searchSpan: 4,
-            span: 24,
-            row: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入设备型号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '绑定菜单',
-            prop: 'menu_name',
-            search: true,
-            searchSpan: 4,
-            span: 24,
-            row: true,
-            display: false,
-            eidtDisplay: false,
-            viewDisplay: false,
-            rules: [
-              {
-                required: true,
-                message: '请输入设备型号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '绑定菜单',
-            searchSpan: 5,
-            span: 24,
-            prop: 'menu_id',
-            type: 'tree',
-            dicUrl: '/blade-system/menu/deviceButtons',
-            props: {
-              label: 'title',
-              value: 'id',
-            },
-            hide: true,
-            multiple: true,
-            dataType: 'string',
-            showAllLevels: false,
-            rules: [
-              {
-                required: true,
-                message: '请选择绑定菜单',
-                trigger: 'blur',
-              },
-            ],
-            // lazy: true,
-            // lazyLoad(node, resolve) {
-            //   let level = node.level;
-            //   let list = [];
-            //   let callback = () => {
-            //     resolve(
-            //       (list || []).map(ele => {
-            //         return Object.assign(ele, {
-            //           leaf: !ele.hasChildren,
-            //         });
-            //       })
-            //     );
-            //   };
-            //   if (level == 0) {
-            //     getLazyList(0).then(res => {
-            //       list = res.data.data;
-            //       callback();
-            //     });
-            //   } else if (level > 0 && level < 5) {
-            //     getLazyList(node.value).then(res => {
-            //       list = res.data.data;
-            //       callback();
-            //     });
-            //   } else {
-            //     callback();
-            //   }
-            // },
-          },
-          {
-            label: '创建时间',
-            prop: 'create_time',
-            type: 'date',
-            addDisplay: false,
-            editDisplay: false,
-            span: 24,
-            row: true,
-            width: 160,
-            format: 'YYYY-MM-DD HH:mm:ss',
-            // valueFormat: 'YYYY-MM-DD HH:mm:ss',
-          },
-          {
-            label: '说明',
-            prop: 'remark',
-            type: 'textarea',
-            row: true,
-            hide: true,
-            span: 24,
-            rules: [
-              {
-                required: false,
-                message: '请输入说明',
-                trigger: 'blur',
-              },
-            ],
-          },
-        ],
-      },
-      data: [],
-    }
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList () {
-      return {
-        addBtn: this.validData(this.permission.device_per_menu_add, true),
-        viewBtn: this.validData(this.permission.device_per_menu_view, true),
-        delBtn: this.validData(this.permission.device_per_menu_delete, true),
-        editBtn: this.validData(this.permission.device_per_menu_edit, true),
-      }
-    },
-    ids () {
-      let ids = []
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id)
-      })
-      return ids.join(',')
-    },
-  },
-  methods: {
-    rowSave (row, done, loading) {
-      add(row).then(
-        () => {
-          this.initFlag = false
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowUpdate (row, index, done, loading) {
-      update(row).then(
-        () => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowDel (row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-        })
-    },
-    searchReset () {
-      this.query = {}
-      this.onLoad(this.page)
-    },
-    searchChange (params, done) {
-      this.query = params
-      this.page.currentPage = 1
-      this.onLoad(this.page, params)
-      done()
-    },
-    selectionChange (list) {
-      this.selectionList = list
-    },
-    selectionClear () {
-      this.selectionList = []
-      this.$refs.crud.toggleSelection()
-    },
-    handleDelete () {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据')
-        return
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          this.$refs.crud.toggleSelection()
-        })
-    },
-    beforeOpen (done, type) {
-      done()
-    },
-    currentChange (currentPage) {
-      this.page.currentPage = currentPage
-    },
-    sizeChange (pageSize) {
-      this.page.pageSize = pageSize
-    },
-    refreshChange () {
-      this.onLoad(this.page, this.query)
-    },
-    onLoad (page, params = {}) {
-      this.loading = true
-      getList(page.currentPage, page.pageSize, params).then(res => {
-        const data = res.data.data
-        this.page.total = data.total
-        this.data = data.records
-        this.loading = false
-        this.selectionClear()
-      })
-    },
-  },
-}
-</script>
-
-<style>
-.firmware_status {
-  background-color: aqua;
-  border-radius: 4px;
-}
-
-.firmware_status:hover {
-  cursor: pointer;
-  /* color: aqua; */
-}
-</style>
-<style scoped lang="scss"></style>
diff --git a/applications/task-work-order/src/views/device/fly.vue b/applications/task-work-order/src/views/device/fly.vue
deleted file mode 100644
index 7329e5a..0000000
--- a/applications/task-work-order/src/views/device/fly.vue
+++ /dev/null
@@ -1,537 +0,0 @@
-<template>
-  <basic-main-content>
-    <avue-crud id="device" :option="option" :table-loading="loading" :data="data" :page="page"
-      @update:page="handlePageChange" ref="crud" @row-del="rowDel" v-model="form" :permission="permissionList"
-      @row-update="rowUpdate" @row-save="rowSave" :before-open="beforeOpen" @search-change="searchChange"
-      @search-reset="searchReset" @selection-change="selectionChange" @current-change="currentChange"
-      @size-change="sizeChange" @refresh-change="refreshChange">
-      <template #menu-left>
-        <el-button type="danger" icon="el-icon-delete" plain v-if="permission.workspace_delete" @click="handleDelete">删
-          除
-        </el-button>
-      </template>
-      <template #dept_name="{ row }">
-        <el-tag>{{ row.dept_name }}</el-tag>
-      </template>
-      <template #status="{ row }">
-        <div v-if="row.status == true" class="onlineStatus">
-          <div class="onlineStatus-dot"></div>
-          <span class="online">在线</span>
-        </div>
-        <div v-if="row.status == false" class="onlineStatus">
-          <div class="onlineStatus-dot1"></div>
-          <span class="online">离线</span>
-        </div>
-      </template>
-      <template #menu="scope">
-        <el-button type="primary" text icon="el-icon-setting" v-if="permission.operate_password_set"
-          @click.stop="handleOperatePassword(scope.row, scope.index)">操控密码设置
-        </el-button>
-        <!-- <el-button
-          type="primary"
-          text
-          icon="el-icon-view"
-          v-if="permission.operate_password_view"
-          @click.stop="viewOperatePassword(scope.row, scope.index)"
-          >操控密码查看
-        </el-button> -->
-      </template>
-    </avue-crud>
-    <el-dialog title="操控密码设置" append-to-body v-model="operatePasswordSetBox" width="455px">
-      <el-form :model="passwordForm" ref="passwordForm" label-width="80px" :rules="rules" v-loading="loadingForm">
-        <el-form-item label="密码" prop="password">
-          <el-input type="password" v-model="passwordForm.password" placeholder="请输入密码" show-password></el-input>
-        </el-form-item>
-        <el-form-item label="确认密码" prop="password2">
-          <el-input type="password" v-model="passwordForm.password2" placeholder="请输入确认密码" show-password></el-input>
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="operatePasswordSetBox = false">取 消</el-button>
-          <el-button type="primary" @click="setOperatePasswordConfirm">确 定</el-button>
-        </span>
-      </template>
-    </el-dialog>
-    <el-dialog title="操控密码查看" append-to-body v-model="operatePasswordViewBox" width="455px">
-      <el-input v-model="operate_password" disabled></el-input>
-    </el-dialog>
-  </basic-main-content>
-</template>
-
-<script>
-import {
-  getList,
-  remove,
-  update,
-  add,
-  getDetail,
-  getOperatePassword,
-  operatePasswordUpdate,
-} from '@/api/device/device'
-import { mapGetters } from 'vuex'
-
-export default {
-  data () {
-    const validatePass = (rule, value, callback) => {
-      if (value === '') {
-        callback(new Error('请输入密码'))
-      } else {
-        callback()
-      }
-    }
-    const validatePass2 = (rule, value, callback) => {
-      if (value === '') {
-        callback(new Error('请再次输入密码'))
-      } else if (value !== this.passwordForm.password) {
-        callback(new Error('两次输入密码不一致!'))
-      } else {
-        callback()
-      }
-    }
-    return {
-      loadingForm: false,
-      rules: {
-        password: [{ required: true, validator: validatePass, trigger: 'blur' }],
-        password2: [{ required: true, validator: validatePass2, trigger: 'blur' }],
-      },
-      passwordForm: {
-        id: '',
-        password: '',
-        password2: '',
-      },
-      operatePasswordSetBox: false,
-      operatePasswordViewBox: false,
-      operate_password: '',
-      form: {},
-      query: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      selectionList: [],
-      option: {
-        // dialogWidth: 950,
-        tip: false,
-        searchShow: true,
-        searchMenuSpan: 6,
-        border: true,
-        index: true,
-        viewBtn: true,
-        selection: true,
-        addBtn: false,
-        excelBtn: false,
-        dialogClickModal: false,
-        grid: false,
-
-        height: 'auto',
-        calcHeight: 180,
-
-        column: [
-          {
-            label: '设备型号',
-            prop: 'device_name',
-            search: true,
-            searchSpan: 4,
-            labelWidth: 130,
-            editDisabled: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入设备型号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '设备SN',
-            prop: 'device_sn',
-            labelWidth: 130,
-            search: true,
-            searchSpan: 4,
-            editDisabled: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入设备SN',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '机巢编号',
-            prop: 'machine_nest_sn',
-            editDisabled: true,
-            labelWidth: 130,
-            rules: [
-              {
-                required: false,
-                message: '请输入机巢编号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '设备组织名称',
-            prop: 'nickname',
-            labelWidth: 130,
-            rules: [
-              {
-                required: true,
-                message: '请输入设备组织名称',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '固件版本',
-            prop: 'firmware_version',
-            labelWidth: 130,
-            width: 100,
-            editDisabled: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入固件版本',
-                trigger: 'blur',
-              },
-            ],
-          },
-
-          {
-            label: '所属部门',
-            prop: 'dept_name',
-            addDisplay: false,
-            editDisplay: false,
-            viewDisplay: false,
-            labelWidth: 130,
-            rules: [
-              {
-                required: true,
-                message: '请输入所属部门',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '所属部门',
-            prop: 'dept_id',
-            hide: true,
-            type: 'tree',
-            defaultExpandAll: true,
-            labelWidth: 130,
-            dicUrl: '/blade-system/dept/getTree',
-            props: {
-              label: 'name',
-              value: 'id',
-            },
-            rules: [
-              {
-                required: true,
-                message: '请输入所属部门',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '加入组织时间',
-            prop: 'bound_time',
-            addDisplay: false,
-            editDisplay: false,
-            type: 'date',
-            labelWidth: 130,
-            width: 160,
-            format: 'YYYY-MM-DD HH:mm:ss',
-            // valueFormat: 'YYYY-MM-DD HH:mm:ss',
-            rules: [
-              {
-                required: true,
-                message: '请输入在线状态',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '在线时间',
-            prop: 'login_time',
-            type: 'date',
-            addDisplay: false,
-            editDisplay: false,
-            labelWidth: 130,
-            width: 160,
-            format: 'YYYY-MM-DD HH:mm:ss',
-            // valueFormat: 'YYYY-MM-DD HH:mm:ss',
-            startPlaceholder: '任务开始时间',
-            rules: [
-              {
-                required: true,
-                message: '请输入在线时间',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '在线状态',
-            prop: 'status',
-            addDisplay: false,
-            editDisplay: false,
-            labelWidth: 130,
-            slot: true,
-            width: 100,
-            rules: [
-              {
-                required: true,
-                message: '请输入在线状态',
-                trigger: 'blur',
-              },
-            ],
-          },
-        ],
-      },
-      data: [],
-    }
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList () {
-      return {
-        addBtn: this.validData(this.permission.fly_add, true),
-        viewBtn: this.validData(this.permission.fly_view, true),
-        delBtn: this.validData(this.permission.fly_delete, true),
-        editBtn: this.validData(this.permission.fly_edit, true),
-      }
-    },
-    ids () {
-      let ids = []
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id)
-      })
-      return ids.join(',')
-    },
-  },
-  methods: {
-    // 设置无人机操作密码
-    setOperatePasswordConfirm () {
-      var that = this
-      this.$refs.passwordForm.validate(valid => {
-        if (valid) {
-          this.loadingForm = true
-          const data = {
-            id: this.passwordForm.id,
-            operate_password: this.passwordForm.password,
-          }
-          // 提交
-          operatePasswordUpdate(data).then(res => {
-            this.loadingForm = false
-            this.operatePasswordSetBox = false
-            that.passwordForm = {}
-            this.onLoad(this.page)
-            this.$message({
-              type: 'success',
-              message: '操作成功!',
-            })
-          })
-        } else {
-          console.log('error submit!!')
-          return false
-        }
-      })
-    },
-    // 操作密码设置
-    handleOperatePassword (row) {
-      this.operatePasswordSetBox = true
-      this.passwordForm.id = row.id
-    },
-    viewOperatePassword (row) {
-      this.operatePasswordViewBox = true
-      // 查询密码
-      getOperatePassword(row.id).then(res => {
-        this.operate_password = res.data.data
-      })
-    },
-    init () {
-      (this.page = {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      }),
-        this.onLoad(this.page)
-    },
-    rowSave (row, done, loading) {
-      add(row).then(
-        () => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowUpdate (row, index, done, loading) {
-      update(row).then(
-        () => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          window.console.log(error)
-          loading()
-        }
-      )
-    },
-    rowDel (row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-        })
-    },
-    searchReset () {
-      this.query = {}
-      this.onLoad(this.page)
-    },
-    searchChange (params, done) {
-      this.query = params
-      this.page.currentPage = 1
-      this.onLoad(this.page, params)
-      done()
-    },
-    selectionChange (list) {
-      this.selectionList = list
-    },
-    selectionClear () {
-      this.selectionList = []
-      this.$refs.crud.toggleSelection()
-    },
-    handleDelete () {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据')
-        return
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          this.$refs.crud.toggleSelection()
-        })
-    },
-    beforeOpen (done, type) {
-      if (['edit', 'view'].includes(type)) {
-        getDetail(this.form.id).then(res => {
-          this.form = res.data.data
-        })
-      }
-      done()
-    },
-    handlePageChange (val) {
-      this.page = val
-      this.onLoad(this.page)
-    },
-    currentChange (currentPage) {
-      this.page.currentPage = currentPage
-      this.onLoad(this.page)
-    },
-    sizeChange (pageSize) {
-      this.page.pageSize = pageSize
-      this.page.currentPage = 1
-      this.onLoad(this.page)
-    },
-    refreshChange () {
-      this.onLoad(this.page, this.query)
-    },
-    onLoad (page, params = {}) {
-      const { releaseTimeRange } = this.query
-      let values = {
-        ...params,
-        ...this.query,
-      }
-      if (releaseTimeRange) {
-        values = {
-          ...values,
-          releaseTime_datege: releaseTimeRange[0],
-          releaseTime_datelt: releaseTimeRange[1],
-        }
-        values.releaseTimeRange = null
-      }
-      values['domain'] = 0
-      this.loading = true
-      getList(page.currentPage, page.pageSize, values).then(res => {
-        const data = res.data.data
-        this.page.total = data.total
-        this.data = data.records
-        this.loading = false
-        this.selectionClear()
-      })
-    },
-  },
-}
-</script>
-
-<style lang="scss" scoped>
-:deep(#device .el-card__body .avue-crud__body .el-form) {
-  height: 655px !important;
-  overflow: auto;
-}
-
-.online {
-  margin-left: 5px;
-}
-
-.onlineStatus1 {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-}
-
-.onlineStatus {
-  display: flex;
-  flex-direction: row;
-  align-items: center;
-}
-
-.onlineStatus-dot {
-  width: 15px;
-  height: 15px;
-  background-color: #40cb8b;
-  border-radius: 50%;
-}
-
-.onlineStatus-dot1 {
-  width: 15px;
-  height: 15px;
-  background-color: #de5e5e;
-  border-radius: 50%;
-}
-</style>
diff --git a/applications/task-work-order/src/views/device/index.vue b/applications/task-work-order/src/views/device/index.vue
deleted file mode 100644
index b502309..0000000
--- a/applications/task-work-order/src/views/device/index.vue
+++ /dev/null
@@ -1,97 +0,0 @@
-<!--
- * @Author       : yuan
- * @Date         : 2025-04-27 21:01:20
- * @LastEditors  : yuan
- * @LastEditTime : 2025-06-25 16:23:45
- * @FilePath     : \src\views\device\index.vue
- * @Description  : 
- * Copyright 2025 OBKoro1, All Rights Reserved. 
- * 2025-04-27 21:01:20
--->
-<template>
-  <basic-container>
-    <airport ref="airport" />
-    <!-- <el-tabs v-model="activeName" @tab-click="handleClick">
-      <el-tab-pane label="机场" name="1">
-        <airport ref="airport" />
-      </el-tab-pane>
-      <el-tab-pane label="飞行器" name="2">
-        <fly ref="fly" />
-      </el-tab-pane>
-    </el-tabs> -->
-  </basic-container>
-</template>
-
-<script>
-import { mapGetters } from 'vuex'
-import airport from './airport.vue'
-import fly from './fly.vue'
-export default {
-  components: { airport, fly },
-  data () {
-    return {
-      activeName: '1',
-      form: {},
-      query: {},
-      loading: true,
-      data: [],
-    }
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList () {
-      return {}
-    },
-    ids () {
-      let ids = []
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id)
-      })
-      return ids.join(',')
-    },
-  },
-  created () {
-    // 默认打开机场页面
-  },
-  methods: {
-    handleClick (tab, event) {
-      if (tab.index == 1) {
-        this.$refs.fly.init()
-      }
-      if (tab.index == 0) {
-        this.$refs.airport.init()
-      }
-    },
-  },
-}
-</script>
-
-<style lang="scss" scoped>
-::v-deep(.el-tabs) {
-  height: 100%;
-  display: flex;
-  flex-direction: column;
-
-  .el-tabs__header {
-    order: 1;
-  }
-
-  .el-tabs__content {
-    order: 2;
-  }
-
-  .el-tabs__content {
-    height: 0;
-    flex: 1;
-    display: flex;
-    flex-direction: column;
-
-    .el-tab-pane {
-      height: 0;
-      flex: 1;
-      display: flex;
-      flex-direction: column;
-    }
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/flow/deploy.vue b/applications/task-work-order/src/views/flow/deploy.vue
deleted file mode 100644
index 9fac645..0000000
--- a/applications/task-work-order/src/views/flow/deploy.vue
+++ /dev/null
@@ -1,160 +0,0 @@
-<template>
-  <basic-container>
-    <avue-form
-      ref="form"
-      :option="option"
-      v-model="form"
-      :upload-before="uploadBefore"
-      :upload-after="uploadAfter"
-    />
-  </basic-container>
-</template>
-
-<script>
-import { deployUpload } from '@/api/flow/flow';
-import { flowCategory } from '@/utils/flow';
-
-export default {
-  data() {
-    return {
-      form: {
-        flowCategory: '',
-        tenantId: '',
-        flowFile: [],
-        file: {},
-      },
-      option: {
-        labelWidth: 120,
-        menuBtn: false,
-        column: [
-          {
-            label: '流程类型',
-            prop: 'flowCategory',
-            type: 'select',
-            dicUrl: `/blade-system/dict/dictionary?code=flow`,
-            props: {
-              label: 'dictValue',
-              value: 'dictKey',
-            },
-            row: true,
-            span: 12,
-            dataType: 'number',
-            rules: [
-              {
-                required: true,
-                message: '请选择流程类型',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '流程模式',
-            prop: 'flowMode',
-            type: 'radio',
-            dicData: [
-              {
-                label: '通用流程',
-                value: 1,
-              },
-              {
-                label: '定制流程',
-                value: 2,
-              },
-            ],
-            value: 1,
-            row: true,
-            span: 12,
-            rules: [
-              {
-                required: true,
-                message: '请选择流程模式',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '所属租户',
-            prop: 'tenantId',
-            type: 'tree',
-            multiple: true,
-            dicUrl: '/blade-system/tenant/select',
-            props: {
-              label: 'tenantName',
-              value: 'tenantId',
-            },
-            display: false,
-            row: true,
-            span: 12,
-            rules: [
-              {
-                required: true,
-                message: '请选择所属租户',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '附件上传',
-            prop: 'flowFile',
-            type: 'upload',
-            loadText: '附件上传中,请稍等',
-            span: 24,
-            propsHttp: {
-              res: 'data',
-            },
-            tip: '请上传 bpmn20.xml 标准格式文件',
-            action: '/blade-flow/manager/check-upload',
-          },
-        ],
-      },
-    };
-  },
-  watch: {
-    'form.flowMode'() {
-      this.$refs.form.option.column.filter(item => {
-        if (item.prop === 'tenantId') {
-          item.display = this.form.flowMode === 2;
-        }
-      });
-    },
-  },
-  methods: {
-    uploadBefore(file, done) {
-      this.$message.success('部署提交');
-      this.file = file;
-      done();
-    },
-    uploadAfter(res, done, loading) {
-      if (!this.form.flowCategory) {
-        this.$message.warning('清先选择流程类型');
-        loading();
-        return false;
-      }
-      if (this.form.flowMode === 2 && !this.form.tenantId) {
-        this.$message.warning('清先选择对应租户');
-        loading();
-        return false;
-      }
-      if (res.success) {
-        deployUpload(
-          flowCategory(this.form.flowCategory),
-          this.form.tenantId ? this.form.tenantId.join(',') : '',
-          [this.file]
-        ).then(res => {
-          const data = res.data;
-          if (data.success) {
-            done();
-          } else {
-            this.$message.error(data.msg);
-            loading();
-          }
-        });
-      } else {
-        this.$message.warning('请上传 bpmn20.xml 标准格式文件');
-        loading();
-        return false;
-      }
-    },
-  },
-};
-</script>
diff --git a/applications/task-work-order/src/views/flow/follow.vue b/applications/task-work-order/src/views/flow/follow.vue
deleted file mode 100644
index f600bce..0000000
--- a/applications/task-work-order/src/views/flow/follow.vue
+++ /dev/null
@@ -1,199 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud
-      :option="option"
-      :table-loading="loading"
-      :data="data"
-      ref="crud"
-      v-model="form"
-      v-model:page="page"
-      :permission="permissionList"
-      @row-del="rowDel"
-      @search-change="searchChange"
-      @search-reset="searchReset"
-      @selection-change="selectionChange"
-      @current-change="currentChange"
-      @size-change="sizeChange"
-      @refresh-change="refreshChange"
-      @on-load="onLoad"
-    >
-      <template #suspensionState="{ row }">
-        <el-tag>{{ row.suspensionState === 1 ? '激活' : '挂起' }}</el-tag>
-      </template>
-    </avue-crud>
-    <el-dialog title="流程删除" append-to-body v-model="followBox" width="20%">
-      <el-form :model="form" ref="form" label-width="80px">
-        <el-form-item label="删除理由">
-          <el-input v-model="deleteReason" placeholder="请输入删除理由" />
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="followBox = false">关 闭</el-button>
-          <el-button type="primary" @click="handleDelete">确 定</el-button>
-        </span>
-      </template>
-    </el-dialog>
-  </basic-container>
-</template>
-
-<script>
-import { mapGetters } from 'vuex';
-import { followList, deleteProcessInstance } from '@/api/flow/flow';
-
-export default {
-  data() {
-    return {
-      form: {},
-      selectionId: '',
-      processInstanceId: '',
-      selectionList: [],
-      query: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      followBox: false,
-      deleteReason: '',
-      option: {
-        tip: false,
-        searchShow: true,
-        searchMenuSpan: 6,
-        border: true,
-        index: true,
-        selection: true,
-        editBtn: false,
-        addBtn: false,
-        viewBtn: false,
-        dialogWidth: 900,
-        menuWidth: 100,
-        dialogClickModal: false,
-        column: [
-          {
-            label: '执行id',
-            prop: 'executionId',
-            search: true,
-            width: 320,
-          },
-          {
-            label: '流程key',
-            prop: 'processDefinitionKey',
-            search: true,
-          },
-          {
-            label: '实例id',
-            prop: 'processInstanceId',
-            search: true,
-            width: 320,
-          },
-          {
-            label: '状态',
-            prop: 'suspensionState',
-            slot: true,
-            width: 80,
-          },
-          {
-            label: '发起人',
-            prop: 'startUser',
-            width: 100,
-          },
-          {
-            label: '开始时间',
-            prop: 'startTime',
-            width: 170,
-          },
-        ],
-      },
-      data: [],
-    };
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList() {
-      return {
-        delBtn: this.validData(this.permission.flow_follow_delete, false),
-      };
-    },
-    ids() {
-      let ids = [];
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id);
-      });
-      return ids.join(',');
-    },
-  },
-  methods: {
-    rowDel(row) {
-      this.followBox = true;
-      this.selectionId = row.id;
-      this.processInstanceId = row.processInstanceId;
-    },
-    handleDelete() {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return deleteProcessInstance({
-            deleteReason: this.deleteReason,
-            processInstanceId: this.processInstanceId,
-          });
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.followBox = false;
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-        });
-    },
-    searchReset() {
-      this.query = {};
-      this.onLoad(this.page);
-    },
-    searchChange(params, done) {
-      this.query = params;
-      this.page.currentPage = 1;
-      this.onLoad(this.page, params);
-      done();
-    },
-    selectionChange(list) {
-      this.selectionList = list;
-    },
-    selectionClear() {
-      this.selectionList = [];
-      this.$refs.crud.toggleSelection();
-    },
-    currentChange(currentPage) {
-      this.page.currentPage = currentPage;
-    },
-    sizeChange(pageSize) {
-      this.page.pageSize = pageSize;
-    },
-    refreshChange() {
-      this.onLoad(this.page, this.query);
-    },
-    onLoad(page, params = {}) {
-      this.loading = true;
-      followList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
-        const data = res.data.data;
-        this.page.total = data.total;
-        this.data = data.records;
-        this.loading = false;
-        this.selectionClear();
-      });
-    },
-  },
-};
-</script>
-
-<style>
-.none-border {
-  border: 0;
-  background-color: transparent !important;
-}
-</style>
diff --git a/applications/task-work-order/src/views/flow/manager.vue b/applications/task-work-order/src/views/flow/manager.vue
deleted file mode 100644
index 09ff99a..0000000
--- a/applications/task-work-order/src/views/flow/manager.vue
+++ /dev/null
@@ -1,369 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud
-      :option="option"
-      :table-loading="loading"
-      :data="data"
-      ref="crud"
-      v-model="form"
-      v-model:page="page"
-      :permission="permissionList"
-      @search-change="searchChange"
-      @search-reset="searchReset"
-      @selection-change="selectionChange"
-      @current-change="currentChange"
-      @size-change="sizeChange"
-      @refresh-change="refreshChange"
-      @on-load="onLoad"
-    >
-      <template #menu-left>
-        <el-radio-group v-model="mode">
-          <el-radio-button label="1">通用流程</el-radio-button>
-          <el-radio-button label="2">定制流程</el-radio-button>
-        </el-radio-group>
-      </template>
-      <template #menu="scope">
-        <el-button
-          type="primary"
-          text
-          icon="el-icon-refresh"
-          v-if="permission.flow_manager_state"
-          @click.stop="handleState(scope.row, scope.index)"
-          >变更状态
-        </el-button>
-        <el-button
-          type="primary"
-          text
-          icon="el-icon-search"
-          v-if="permission.flow_manager_image"
-          @click.stop="handleImage(scope.row, scope.index)"
-          >流程图
-        </el-button>
-        <el-button
-          type="primary"
-          text
-          icon="el-icon-delete"
-          v-if="permission.flow_manager_remove"
-          @click.stop="handleSlotDelete(scope.row, scope.index)"
-          >删除
-        </el-button>
-      </template>
-      <template #tenantId="{ row }">
-        <el-tag>{{ row.tenantId === '' ? '通用' : row.tenantId }}</el-tag>
-      </template>
-      <template #version="{ row }">
-        <el-tag>v{{ row.version }}</el-tag>
-      </template>
-      <template #suspensionState="{ row }">
-        <el-tag>{{ row.suspensionState === 1 ? '激活' : '挂起' }}</el-tag>
-      </template>
-      <template #category="{ row }">
-        <el-tag>{{ row.categoryName }}</el-tag>
-      </template>
-    </avue-crud>
-    <flow-design
-      v-if="this.website.design.designMode"
-      is-dialog
-      v-model:is-display="flowBox"
-      :process-definition-id="processDefinitionId"
-    ></flow-design>
-    <el-dialog v-else title="流程图" append-to-body v-model="flowBox" :fullscreen="true">
-      <iframe
-        :src="flowUrl"
-        width="100%"
-        height="700"
-        title="流程图"
-        frameBorder="no"
-        border="0"
-        marginWidth="0"
-        marginHeight="0"
-        scrolling="no"
-        allowTransparency="yes"
-      >
-      </iframe>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="flowBox = false">关 闭</el-button>
-        </span>
-      </template>
-    </el-dialog>
-    <el-dialog title="流程变更" append-to-body v-model="stateBox" width="20%">
-      <el-form :model="form" ref="form" label-width="80px">
-        <el-form-item label="流程状态">
-          <el-select v-model="flowState" placeholder="请选择" value="">
-            <el-option
-              v-for="item in stateOptions"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            >
-            </el-option>
-          </el-select>
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="stateBox = false">关 闭</el-button>
-          <el-button type="primary" @click="handleDoState">确 定</el-button>
-        </span>
-      </template>
-    </el-dialog>
-  </basic-container>
-</template>
-
-<script>
-import { mapGetters } from 'vuex';
-import { managerList, changeState, deleteDeployment } from '@/api/flow/flow';
-import { flowCategory } from '@/utils/flow';
-
-export default {
-  data() {
-    return {
-      form: {},
-      mode: '1',
-      selectionId: '',
-      selectionList: [],
-      query: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      processDefinitionId: '',
-      flowBox: false,
-      flowUrl: '',
-      stateBox: false,
-      flowState: '',
-      stateOptions: [
-        {
-          value: 'active',
-          label: '激活',
-        },
-        {
-          value: 'suspend',
-          label: '挂起',
-        },
-      ],
-      option: {
-        tip: false,
-        searchShow: true,
-        searchMenuSpan: 6,
-        border: true,
-        index: true,
-        selection: true,
-        editBtn: false,
-        addBtn: false,
-        viewBtn: false,
-        delBtn: false,
-        dialogWidth: 900,
-        menuWidth: 250,
-        dialogClickModal: false,
-        column: [
-          {
-            label: '租户编号',
-            prop: 'tenantId',
-            slot: true,
-            width: 120,
-          },
-          {
-            label: '流程主键',
-            prop: 'id',
-          },
-          {
-            label: '流程标识',
-            prop: 'key',
-            search: true,
-            width: 150,
-          },
-          {
-            label: '流程名称',
-            prop: 'name',
-            width: 150,
-          },
-          {
-            label: '流程分类',
-            type: 'select',
-            row: true,
-            dicUrl: '/blade-system/dict/dictionary?code=flow',
-            props: {
-              label: 'dictValue',
-              value: 'dictKey',
-            },
-            dataType: 'number',
-            slot: true,
-            prop: 'category',
-            search: true,
-            width: 100,
-          },
-          {
-            label: '流程版本',
-            prop: 'version',
-            slot: true,
-            width: 85,
-          },
-          {
-            label: '状态',
-            prop: 'suspensionState',
-            slot: true,
-            width: 80,
-          },
-          {
-            label: '部署时间',
-            prop: 'deploymentTime',
-            width: 170,
-          },
-        ],
-      },
-      data: [],
-    };
-  },
-  watch: {
-    mode() {
-      this.onLoad(this.page);
-    },
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList() {
-      return {
-        delBtn: this.validData(this.permission.flow_manager_remove, false),
-      };
-    },
-    ids() {
-      let ids = [];
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id);
-      });
-      return ids.join(',');
-    },
-    deploymentIds() {
-      let ids = [];
-      this.selectionList.forEach(ele => {
-        ids.push(ele.deploymentId);
-      });
-      return ids.join(',');
-    },
-  },
-  methods: {
-    searchReset() {
-      this.query = {};
-      this.onLoad(this.page);
-    },
-    searchChange(params, done) {
-      this.query = params;
-      this.page.currentPage = 1;
-      this.onLoad(this.page, params);
-      done();
-    },
-    selectionChange(list) {
-      this.selectionList = list;
-    },
-    selectionClear() {
-      this.selectionList = [];
-      this.$refs.crud.toggleSelection();
-    },
-    handleDelete() {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据');
-        return;
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return deleteDeployment(this.deploymentIds);
-        })
-        .then(() => {
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          this.$refs.crud.toggleSelection();
-          this.onLoad(this.page);
-        });
-    },
-    handleSlotDelete(row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return deleteDeployment(row.deploymentId);
-        })
-        .then(() => {
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          this.$refs.crud.toggleSelection();
-          this.onLoad(this.page);
-        });
-    },
-    handleState(row) {
-      this.stateBox = true;
-      this.selectionId = row.id;
-    },
-    handleDoState() {
-      if (!this.flowState) {
-        this.$message({
-          type: 'warn',
-          message: '请先选择流程状态!',
-        });
-        return;
-      }
-      changeState({ processId: this.selectionId, state: this.flowState }).then(res => {
-        const data = res.data;
-        if (data.success) {
-          this.$message({
-            type: 'success',
-            message: data.msg,
-          });
-          this.stateBox = false;
-          this.onLoad(this.page);
-        } else {
-          this.$message({
-            type: 'warn',
-            message: data.msg,
-          });
-        }
-      });
-    },
-    handleImage(row) {
-      if (this.website.design.designMode) {
-        this.processDefinitionId = row.id;
-      } else {
-        this.flowUrl = `/blade-flow/process/resource-view?processDefinitionId=${row.id}`;
-      }
-      this.flowBox = true;
-    },
-    currentChange(currentPage) {
-      this.page.currentPage = currentPage;
-    },
-    sizeChange(pageSize) {
-      this.page.pageSize = pageSize;
-    },
-    refreshChange() {
-      this.onLoad(this.page, this.query);
-    },
-    onLoad(page, params = {}) {
-      const values = {
-        ...params,
-        category: params.category ? flowCategory(params.category) : null,
-        mode: this.mode,
-      };
-      this.loading = true;
-      managerList(page.currentPage, page.pageSize, Object.assign(values, this.query)).then(res => {
-        const data = res.data.data;
-        this.page.total = data.total;
-        this.data = data.records;
-        this.loading = false;
-        this.selectionClear();
-      });
-    },
-  },
-};
-</script>
diff --git a/applications/task-work-order/src/views/flow/model.vue b/applications/task-work-order/src/views/flow/model.vue
deleted file mode 100644
index fa06a03..0000000
--- a/applications/task-work-order/src/views/flow/model.vue
+++ /dev/null
@@ -1,548 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud
-      :option="option"
-      :table-loading="loading"
-      :data="data"
-      ref="crud"
-      v-model="form"
-      v-model:page="page"
-      @search-change="searchChange"
-      @search-reset="searchReset"
-      @selection-change="selectionChange"
-      @current-change="currentChange"
-      @size-change="sizeChange"
-      @refresh-change="refreshChange"
-      @on-load="onLoad"
-    >
-      <template #menu-left>
-        <el-button
-          type="primary"
-          size="default"
-          icon="el-icon-circle-plus"
-          v-if="permission.flow_model_create"
-          plain
-          @click="handleCreate"
-          >创 建
-        </el-button>
-        <el-button
-          type="danger"
-          size="default"
-          icon="el-icon-delete"
-          v-if="permission.flow_model_delete"
-          plain
-          @click="handleDelete"
-          >删 除
-        </el-button>
-      </template>
-      <template #menu="scope">
-        <el-button
-          type="primary"
-          text
-          size="default"
-          icon="el-icon-setting"
-          v-if="permission.flow_model_update"
-          @click.stop="handleUpdate(scope.row, scope.index)"
-          >配置
-        </el-button>
-        <el-button
-          type="primary"
-          text
-          size="default"
-          icon="el-icon-upload"
-          v-if="permission.flow_model_deploy"
-          @click.stop="handleDeploy(scope.row, scope.index)"
-          >部署
-        </el-button>
-        <el-button
-          type="primary"
-          text
-          size="default"
-          icon="el-icon-delete"
-          v-if="permission.flow_model_delete"
-          @click.stop="handleSlotDelete(scope.row, scope.index)"
-          >删除
-        </el-button>
-      </template>
-      <template #version="{ row }">
-        <el-tag>v{{ row.version }}</el-tag>
-      </template>
-    </avue-crud>
-    <el-dialog
-      v-if="this.website.design.designMode"
-      title="流程配置"
-      append-to-body
-      destroy-on-close
-      v-model="flowBox"
-      :close-on-press-escape="false"
-      :fullscreen="true"
-      :before-close="handleNutflowClose"
-      class="nf-dialog"
-    >
-      <nf-design-base
-        v-if="nutflowOption.step === 1"
-        class="animated fadeIn"
-        style="height: calc(100vh - 108px)"
-        ref="nf-design"
-        :options="nutflowOption.step1"
-      ></nf-design-base>
-      <nf-design-base
-        v-if="nutflowOption.step === 2"
-        class="animated fadeIn"
-        style="height: calc(100vh - 108px)"
-        ref="nf-design-view"
-        :options="nutflowOption.step2"
-      ></nf-design-base>
-      <template #footer>
-        <span class="avue-dialog__footer">
-          <el-button @click="handleNutflowClose(() => {}, true)">取 消</el-button>
-          <el-button v-if="nutflowOption.step === 1" type="success" @click="handleStep(1)"
-            >下 一 步</el-button
-          >
-          <el-button v-if="nutflowOption.step === 2" type="success" @click="handleStep(-1)"
-            >上 一 步</el-button
-          >
-          <el-button v-if="nutflowOption.step === 2" type="primary" @click="handleSubmitModel"
-            >确 定</el-button
-          >
-        </span>
-      </template>
-    </el-dialog>
-    <el-dialog v-else title="流程配置" append-to-body v-model="flowBox" :fullscreen="true">
-      <iframe
-        :src="flowUrl"
-        width="100%"
-        height="700"
-        title="流程设计器"
-        frameBorder="no"
-        border="0"
-        marginWidth="0"
-        marginHeight="0"
-        scrolling="no"
-        allowTransparency="yes"
-      >
-      </iframe>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="flowBox = false">取 消</el-button>
-          <el-button type="primary" @click="handleRefresh">确 定</el-button>
-        </span>
-      </template>
-    </el-dialog>
-    <el-dialog title="流程部署" append-to-body v-model="deployBox" width="20%">
-      <avue-form ref="form" :option="optionDeploy" v-model="form" @submit="handleSubmit" />
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button @click="deployBox = false">取 消</el-button>
-          <el-button type="primary" @click="handleDoDeploy" :loading="deployLoading"
-            >确 定</el-button
-          >
-        </span>
-      </template>
-    </el-dialog>
-  </basic-container>
-</template>
-
-<script>
-import { mapGetters } from 'vuex';
-import { modelList, removeModel, deployModel, submitModel, detail } from '@/api/flow/flow';
-import { flowCategory } from '@/utils/flow';
-
-export default {
-  data() {
-    return {
-      form: {},
-      optionDeploy: {
-        menuBtn: false,
-        column: [
-          {
-            label: '流程类型',
-            type: 'select',
-            dicUrl: '/blade-system/dict/dictionary?code=flow',
-            props: {
-              label: 'dictValue',
-              value: 'dictKey',
-            },
-            dataType: 'number',
-            slot: true,
-            prop: 'categoryValue',
-            search: true,
-            span: 24,
-            rules: [
-              {
-                required: true,
-                message: '请选择流程类型',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '流程模式',
-            prop: 'flowMode',
-            type: 'radio',
-            dicData: [
-              {
-                label: '通用流程',
-                value: 1,
-              },
-              {
-                label: '定制流程',
-                value: 2,
-              },
-            ],
-            value: 1,
-            span: 24,
-            rules: [
-              {
-                required: true,
-                message: '请选择流程模式',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '所属租户',
-            prop: 'tenantId',
-            type: 'tree',
-            multiple: true,
-            dicUrl: '/blade-system/tenant/select',
-            props: {
-              label: 'tenantName',
-              value: 'tenantId',
-            },
-            display: false,
-            span: 24,
-            rules: [
-              {
-                required: true,
-                message: '请选择所属租户',
-                trigger: 'blur',
-              },
-            ],
-          },
-        ],
-      },
-      selectionId: '',
-      selectionList: [],
-      query: {},
-      loading: true,
-      deployLoading: false,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      deployBox: false,
-      flowBox: false,
-      flowUrl: '',
-      option: {
-        tip: false,
-        searchShow: true,
-        searchMenuSpan: 6,
-        border: true,
-        index: true,
-        selection: true,
-        editBtn: false,
-        addBtn: false,
-        viewBtn: false,
-        delBtn: false,
-        dialogWidth: 900,
-        menuWidth: 220,
-        dialogClickModal: false,
-        size: 'default',
-        searchSize: 'default',
-        column: [
-          {
-            label: '模型主键',
-            prop: 'id',
-          },
-          {
-            label: '模型标识',
-            prop: 'modelKey',
-            search: true,
-            overHidden: true,
-          },
-          {
-            label: '模型名称',
-            prop: 'name',
-            search: true,
-            overHidden: true,
-          },
-          {
-            label: '流程版本',
-            prop: 'version',
-            slot: true,
-            overHidden: true,
-          },
-          {
-            label: '创建时间',
-            prop: 'created',
-            overHidden: true,
-          },
-          {
-            label: '更新时间',
-            prop: 'lastUpdated',
-            overHidden: true,
-          },
-        ],
-      },
-      data: [],
-      nutflowOption: {
-        process: {},
-        step: 1,
-        step1: {
-          toolbar: [
-            'open',
-            'create',
-            'fit',
-            'zoom-in',
-            'zoom-out',
-            'undo',
-            'redo',
-            'import',
-            'preview',
-          ],
-        },
-        step2: {
-          mode: 'view',
-          simulation: true,
-          minimap: true,
-        },
-      },
-    };
-  },
-  watch: {
-    'form.flowMode'() {
-      this.$refs.form.option.column.filter(item => {
-        if (item.prop === 'tenantId') {
-          item.display = this.form.flowMode === 2;
-        }
-      });
-    },
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    ids() {
-      let ids = [];
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id);
-      });
-      return ids.join(',');
-    },
-  },
-  methods: {
-    handleSubmitModel() {
-      const registry = this.$refs['nf-design-view'].getElementRegistry().getAll();
-      const { businessObject } = registry[0];
-      const { id, name, documentation } = businessObject;
-      const description = documentation && documentation.length > 0 ? documentation[0].text : null;
-      const params = {
-        ...this.nutflowOption.process,
-        modelKey: id,
-        name,
-        description,
-        modelEditorXml: this.nutflowOption.process.xml,
-      };
-      submitModel(params).then(() => {
-        this.$message.success('操作成功');
-        this.handleNutflowClose();
-        this.onLoad(this.page, this.query);
-      });
-    },
-    handleStep(step) {
-      if (step === 1) {
-        // 下一步
-        this.$refs['nf-design'].getData('xml').then(data => {
-          this.nutflowOption.step1.xml = data;
-          this.nutflowOption.step2.xml = data;
-          this.nutflowOption.process.xml = data;
-          this.nutflowOption.step = 2;
-        });
-      } else this.nutflowOption.step = 1;
-    },
-    handleNutflowClose(done, flag) {
-      const initOption = {
-        process: {},
-        step: 1,
-        step1: {
-          toolbar: [
-            'open',
-            'create',
-            'fit',
-            'zoom-in',
-            'zoom-out',
-            'undo',
-            'redo',
-            'import',
-            'preview',
-          ],
-        },
-        step2: {
-          mode: 'view',
-          simulation: true,
-          minimap: true,
-        },
-      };
-      if (done || flag) {
-        this.$confirm('确定要关闭吗?关闭未保存的修改都会丢失。', '警告', {
-          type: 'warning',
-        })
-          .then(() => {
-            this.nutflowOption = initOption;
-            if (typeof done == 'function') done();
-            this.flowBox = false;
-          })
-          .catch(() => {});
-      } else {
-        this.nutflowOption = initOption;
-        this.flowBox = false;
-      }
-    },
-    handleSubmit(form, done) {
-      this.deployLoading = true;
-      deployModel({
-        modelId: this.selectionId,
-        category: flowCategory(form.categoryValue),
-        tenantIds: form.tenantId ? form.tenantId.join(',') : '',
-      }).then(res => {
-        const data = res.data;
-        if (data.success) {
-          this.$message({
-            type: 'success',
-            message: data.msg,
-          });
-          done();
-          this.$refs.form.resetForm();
-          this.deployBox = false;
-          this.deployLoading = false;
-        } else {
-          done();
-          this.deployLoading = false;
-          this.$message({
-            type: 'warn',
-            message: data.msg,
-          });
-        }
-      });
-    },
-    searchReset() {
-      this.query = {};
-      this.onLoad(this.page);
-    },
-    searchChange(params, done) {
-      this.query = params;
-      this.page.currentPage = 1;
-      this.onLoad(this.page, params);
-      done();
-    },
-    selectionChange(list) {
-      this.selectionList = list;
-    },
-    selectionClear() {
-      this.selectionList = [];
-      this.$refs.crud.toggleSelection();
-    },
-    handleDelete() {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据');
-        return;
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return removeModel(this.ids);
-        })
-        .then(() => {
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          this.$refs.crud.toggleSelection();
-          this.onLoad(this.page);
-        });
-    },
-    handleCreate() {
-      if (!this.website.design.designMode) {
-        this.flowUrl = `${this.website.design.designUrl}/index.html`;
-      }
-      this.flowBox = true;
-    },
-    handleRefresh() {
-      this.flowBox = false;
-      this.onLoad(this.page);
-    },
-    handleUpdate(row) {
-      if (this.website.design.designMode) {
-        detail({ id: row.id }).then(res => {
-          const data = res.data.data;
-          const { modelEditorXml } = data;
-          this.nutflowOption.step1.xml = modelEditorXml;
-          this.nutflowOption.process = data;
-        });
-      } else {
-        this.flowUrl = `${this.website.design.designUrl}/index.html#/editor/${row.id}`;
-      }
-      this.flowBox = true;
-    },
-    handleDeploy(row) {
-      this.deployBox = true;
-      this.selectionId = row.id;
-    },
-    handleDoDeploy() {
-      this.$refs.form.submit();
-    },
-    handleSlotDelete(row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return removeModel(row.id);
-        })
-        .then(() => {
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          this.$refs.crud.toggleSelection();
-          this.onLoad(this.page);
-        });
-    },
-    currentChange(currentPage) {
-      this.page.currentPage = currentPage;
-    },
-    sizeChange(pageSize) {
-      this.page.pageSize = pageSize;
-    },
-    refreshChange() {
-      this.onLoad(this.page, this.query);
-    },
-    onLoad(page, params = {}) {
-      this.loading = true;
-      modelList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
-        const data = res.data.data;
-        this.page.total = data.total;
-        this.data = data.records;
-        this.loading = false;
-        this.selectionClear();
-      });
-    },
-  },
-};
-</script>
-
-<style lang="scss">
-.nf-dialog {
-  .el-dialog__body {
-    padding: 5px;
-  }
-
-  .avue-dialog__footer {
-    text-align: center;
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/job/components/CancelTaskDialog.vue b/applications/task-work-order/src/views/job/components/CancelTaskDialog.vue
deleted file mode 100644
index 9f039c2..0000000
--- a/applications/task-work-order/src/views/job/components/CancelTaskDialog.vue
+++ /dev/null
@@ -1,152 +0,0 @@
-<template>
-	<el-dialog
-		v-model="dialogVisible"
-		:width="400"
-		:close-on-click-modal="false"
-		:destroy-on-close="true"
-		class="cancel-task-dialogs"
-	>
-		<div class="dialog-headers">
-			<img @click="closeClick" src="@/assets/images/task/close.png" alt="" />
-		</div>
-		<div class="dialog-contents">
-			<div class="dialog-text">您确定取消任务?</div>
-			<div class="dialog-btns">
-				<img src="@/assets/images/task/cancel-one.png" @click="handleCancel" alt="" />
-				<img src="@/assets/images/task/cancel-all.png" @click="handleCancelAll" alt="" />
-			</div>
-		</div>
-	</el-dialog>
-</template>
-<script setup>
-import { cancelJobs } from '@/api/job/task'
-import { ElMessage } from 'element-plus'
-
-const props = defineProps({
-	isShowCancelTask: {
-		type: Boolean,
-		default: false,
-	},
-	rowData: {
-		type: Object,
-		required: true,
-	},
-})
-
-const emit = defineEmits(['update:isShowCancelTask', 'refresh'])
-
-const dialogVisible = computed({
-	get: () => props.isShowCancelTask,
-	set: val => emit('update:isShowCancelTask', val),
-})
-
-// 取消本次
-const handleCancel = () => {
-	submitCancelTask(props.rowData, 1)
-	dialogVisible.value = false
-}
-// 取消所有
-const handleCancelAll = () => {
-	submitCancelTask(props.rowData, 0)
-	dialogVisible.value = false
-}
-// 提交取消任务请求
-const submitCancelTask = (row, isSingle) => {
-	if (!row.wayline_job_info_id) {
-		ElMessage.warning('该任务无法取消,数据未兼容!')
-		return
-	}
-	cancelJobs({
-		jobInfoId: row.wayline_job_info_id,
-		batchNo: row.batch_no,
-		isSingle: isSingle,
-	}).then(res => {
-		if (res.data.code !== 0) return
-		ElMessage.success('取消任务成功')
-		emit('refresh')
-	})
-}
-const closeClick = () => {
-	dialogVisible.value = false
-}
-
-defineExpose({
-	submitCancelTask,
-})
-</script>
-<style lang="scss">
-.cancel-task-dialogs {
-	margin: 0;
-	position: absolute;
-	top: 50%;
-	left: 50%;
-	transform: translate(-50%, -50%);
-	padding: 0;
-	// width: 398px;
-	// height: 181px;
-	background: #0f1d33;
-	box-shadow: inset 0px -50px 50px 0px rgba(27, 148, 255, 0.13);
-	border-radius: 50px 0px 0px 0px;
-	border: 2px solid;
-	border-image: linear-gradient(
-			180deg,
-			rgba(81, 168, 255, 0),
-			rgba(48, 111, 202, 1),
-			rgba(255, 255, 255, 1),
-			rgba(27, 148, 255, 1)
-		)
-		2 2;
-	.el-dialog__header {
-		display: none;
-	}
-	.dialog-headers {
-		width: 100%;
-		height: 60px;
-		background: url('@/assets/images/task/header.png') center no-repeat;
-		background-size: 100% 100%;
-		color: #fff;
-		font-size: 16px;
-		font-weight: bold;
-		display: flex;
-		align-items: center;
-		justify-content: center;
-		img {
-			position: absolute;
-			top: 24px;
-			right: 20px;
-			cursor: pointer;
-		}
-	}
-
-	.dialog-contents {
-		padding: 40px 20px 20px 20px;
-		.dialog-text {
-			color: #fff;
-			font-size: 14px;
-			margin-bottom: 60px;
-			text-align: center;
-		}
-
-		.dialog-btns {
-			display: flex;
-			justify-content: center;
-			gap: 46px;
-			img {
-				width: 96px;
-				height: 32px;
-				cursor: pointer;
-			}
-			// .el-button {
-			// 	width: 120px;
-			// 	height: 32px;
-			// 	border-radius: 2px;
-
-			// 	&.el-button--primary {
-			// 		background: #026ad6;
-			// 		border-color: #026ad6;
-			// 	}
-			// }
-		}
-	}
-}
-</style>
diff --git a/applications/task-work-order/src/views/job/components/DeviceJobDetails.vue b/applications/task-work-order/src/views/job/components/DeviceJobDetails.vue
deleted file mode 100644
index 5216b27..0000000
--- a/applications/task-work-order/src/views/job/components/DeviceJobDetails.vue
+++ /dev/null
@@ -1,806 +0,0 @@
-<!-- 历史任务详情 -->
-<template>
-  <el-dialog class="ztzf-dialog" append-to-body modal-class="detailsOfHistoricalTasks" v-model="isShow" title="巡检任务详情"
-    :width="pxToRem(1800)" :close-on-click-modal="false" :destroy-on-close="true">
-    <div class="content">
-      <div class="contentLeft">
-				<!--				执行机巢详情-->
-				<execute-nest-details :wayLineJobInfoId="wayLineJobInfoId" :batchNo="batchNo"></execute-nest-details>
-				<!--				详情-->
-        <div class="detailsLine">
-					<img src="/src/assets/images/task/sign.svg" alt="">
-          <div class="title">
-            详情
-          </div>
-          <div class="btn" v-show="videoData.length > 0">
-            <el-button
-              class="playback-video-btn"
-              v-show="videoData.length == 1"
-              type="primary"
-              @click="openPlaybackVideoDialog(videoData[0])"
-              size="small"
-            >
-              回放直播
-            </el-button>
-
-            <el-popover placement="bottom-start" popper-class="ztzf-custom-popover bottom">
-              <template #reference>
-                <el-button class="playback-video-btn" v-show="videoData.length > 1" type="primary" size="small">
-                  回放直播
-                </el-button>
-              </template>
-
-              <div class="playback-video-list">
-                <div v-for="(item, index) in videoData" :key="index">
-                  {{ formatTimestamp(item.execute_time) }}
-
-                  <div class="play-btn" @click="openPlaybackVideoDialog(item)">播放</div>
-                </div>
-              </div>
-            </el-popover>
-          </div>
-        </div>
-        <div class="infoBox">
-          <div class="itemBoxLeft">
-            <div v-for="(item, index) in infoList" :key="index" class="itemCon">
-              <div class="itemBox">
-                <div class="itemTitle">{{ item.name }}:</div>
-                <div truncated class="itemValue" v-if="item.name !== '飞行事件' && item.name !== '任务执行次数'">
-                  {{ item.value ? item.value : '--' }}
-                </div>
-                <div class="itemValue" v-if="item.name === '任务执行次数'">{{ item.value ? item.value : '0' }}次</div>
-                <!-- 飞行事件 -->
-                <div class="flightEvents" v-if="item.name === '飞行事件'">
-                  <template v-if="flightEvents.length">
-                    <img
-                      v-for="(item, index) in flightEvents"
-                      alt=""
-                      :src="item.imgUrl"
-                      :title="item.label"
-                      :key="index"
-                    />
-                  </template>
-                  <div class="itemValue" v-else>--</div>
-                </div>
-              </div>
-            </div>
-          </div>
-
-        </div>
-        <JobRelatedEvents :jobTimes="jobTimes" :batchNo="batchNo" :waylineJobId="waylineJobId" :detailName="detailName" />
-        <div class="devicetitle" v-if="isShow">
-          <div>
-            <img src="/src/assets/images/task/sign.svg" alt="">
-            <p>
-              成果数据
-              <span>{{ total }}</span>
-              个
-            </p>
-          </div>
-          <div class="rightBox" v-if="total">
-            <div class="downloadBtn" @click="htlsrwxq === 100 && downloadFun()">
-              <el-progress v-if="htlsrwxq !== 100" :percentage="htlsrwxq" :show-text="false" striped striped-flow
-                :duration="1" />
-              <div class="downloadBtnText">
-                <span v-if="htlsrwxq === 100">下载</span>
-                <template v-else>
-                  处理中<el-icon @click="cancelDownload">
-                    <CircleClose />
-                  </el-icon>
-                </template>
-              </div>
-            </div>
-            <div class="downloadBtn" @click="showAll = !showAll" v-if="total > 5">
-              {{ showAll ? '收起' : '更多' }}
-            </div>
-          </div>
-        </div>
-<!--        <div class="imgListBox">-->
-<!--          &lt;!&ndash; 图片显示 &ndash;&gt;-->
-<!--          <template v-for="(item, index) in achievementList.slice(0, visibleCount)" :key="index">-->
-<!--            <div class="result-item">-->
-<!--              <el-checkbox v-model="item.checked" />-->
-<!--              <div class="itemName">{{ item.createTime }}</div>-->
-<!--              &lt;!&ndash; 正射 &ndash;&gt;-->
-<!--              <el-image v-if="item.resultType === 4" :src="item.smallUrl" :preview-src-list="[item.showUrl]" fit="cover"-->
-<!--                preview-teleported />-->
-<!--              &lt;!&ndash; 全景 &ndash;&gt;-->
-<!--              <img v-else-if="item.resultType === 5" class="quanjing" @click="clickpanorama(item)" :src="item?.smallUrl"-->
-<!--                alt="" />-->
-<!--              &lt;!&ndash; 视频 &ndash;&gt;-->
-<!--              <div v-else-if="item.resultType === 1" class="videotime">-->
-<!--                <img class="videoDisplay" :src="convertVideoUrlToThumbnail(item.link)" alt=""-->
-<!--                  @click="enterFullScreen(index)" />-->
-<!--                <img @click="enterFullScreen(index)" class="videobutton" src="@/assets/images/task/videoshow.png"-->
-<!--                  alt="" />-->
-<!--              </div>-->
-<!--              &lt;!&ndash; 图片 &ndash;&gt;-->
-<!--              <el-image v-else :src="item.smallUrl" :preview-src-list="[item.showUrl]" preview-teleported-->
-<!--                :initial-index="index" fit="cover" />-->
-
-
-<!--            </div>-->
-
-<!--          </template>-->
-
-<!--        </div>-->
-        <div class="imgListBox">
-          <template v-for="(item, index) in achievementList.slice(0, visibleCount)" :key="index">
-            <div class="result-item">
-              <el-checkbox v-model="item.checked" />
-              <div class="itemName">{{ item.createTime }}</div>
-              <!-- 正射 -->
-              <el-image v-if="item.resultType === 4"  :src="item?.smallUrl" fit="cover" preview-teleported @click="clickPlay(index)"/>
-              <!-- 全景 -->
-              <img
-                v-else-if="item.resultType === 5"
-                class="quanjing"
-                @click="clickPlay(index)"
-                :src="item?.smallUrl"
-                alt=""
-              />
-              <!-- 视频 -->
-              <div v-else-if="item.resultType === 1" class="videotime">
-                <img
-                  class="videoDisplay"
-                  :src="convertVideoUrlToThumbnail(item.link)"
-                  alt=""
-                  @click="clickPlay(index)"
-                />
-                <img
-                  @click="clickPlay(index)"
-                  class="videobutton"
-                  src="@/assets/images/signMachineNest/videoshow.png"
-                  alt=""
-                />
-              </div>
-              <!-- 图片 -->
-              <el-image v-else :src="item?.smallUrl" fit="cover" preview-teleported  @click="clickPlay(index)"/>
-            </div>
-          </template>
-        </div>
-        <el-image-viewer
-          v-if="showViewer"
-          :url-list="previewUrls"
-          :initial-index="activeIndex"
-          @close="showViewer = false"
-        />
-        <div class="cg-empty" v-if="achievementList.length === 0">暂无数据</div>
-      </div>
-
-      <div class="content-right" v-if="isShow">
-				<DeviceJobDetailsMap
-					:detailsData="detailsData"
-					:yuanImages="yuanImages"
-					:taskData="taskData"
-					@showImageeclick="showImageeclick"
-					:jobId="props.jobId"
-				/>
-        <div class="content-map-popups"></div>
-      </div>
-    </div>
-  </el-dialog>
-  <el-dialog class="ztzf-dialog" append-to-body modal-class="detailsOfHistoricalTasks" v-model="VideoShow"
-    :width="pxToRem(1600)" :close-on-click-modal="false" :destroy-on-close="true">
-    <div class="fullscreen">
-      <video ref="fullscreenVideo" class="fullscreen-video" :src="currentVideoUrl"
-        :style="{ width: pxToRem(1567), height: '80vh' }" controls preload="auto" @play="handleVideoPlay"
-        @ended="handleVideoEnded"></video>
-    </div>
-  </el-dialog>
-  <!-- 全景360 -->
-  <PanoramaPopup v-if="'全景'" v-model:panoramaParamsShow="panoramaParamsShow"
-    v-model:panoramaParamsUrl="panoramaParamsUrl" />
-
-  <PlaybackVideo v-model:show="playbackVideo" v-model:detailData="openVideoDetail" :detailsData="detailsData" />
-  <FileTypePlay v-model:show="carouselShow" :list="achievementList" :cIndex="currentIndex"></FileTypePlay>
-</template>
-
-<script setup>
-import PanoramaPopup from '@/components/PanoramaPopup/PanoramaPopup.vue'
-import PlaybackVideo from '@/components/PlaybackVideo/PlaybackVideo.vue'
-import FileTypePlay from '@/views/job/components/FileTypePlay.vue';
-import ExecuteNestDetails from './executeNestDetails.vue'
-import { getWaylinejobLiveRecordPage } from '@/api/playback'
-import { getShowImg, getSmallImg, getzsSmallImg, getzsShowImg, aLinkDownloadUtil } from '@/utils/util'
-import { getaiImagesPageAPI, cancelDownloadApi, getDownloadStatusApi, attachDownload, aiImagesPage } from '@/api/dataCenter/dataCenter'
-import { getFindAction } from '@/views/RoutePlan/PointAirLine/pointWayLineUtils'
-import { pxToRem } from '@/utils/rem'
-import JobRelatedEvents from './JobRelatedEvents.vue'
-import { getEventMediaListApi, getJobDetails, getJobInfoFiles, getJobsAllFiles, NestDetailApi } from '@/api/job/task'
-import DeviceJobDetailsMap from './DeviceJobDetailsMap.vue'
-import { droneEventList } from '../const/drc'
-import { ElMessage, ElLoading } from 'element-plus'
-import { useStore } from 'vuex'
-import EventBus from '@/utils/eventBus'
-const store = useStore()
-const htlsrwxq = computed(() => store.state.common.downloadProgress?.htlsrwxq || 100)
-const isShow = defineModel('show')
-const VideoShow = ref(false)
-const showAll = ref(false) // 是否展示全部
-let loadingData
-const fullscreenVideo = ref(null)
-const playbackVideo = ref(false)
-const carouselShow = ref(false) // 是否轮播
-const currentIndex = ref(-1)
-// 视频播放事件处理
-const handleVideoPlay = (event) => {
-  if (event.target.playbackRate !== 0.75) {
-    event.target.playbackRate = 0.75
-
-  }
-}
-const handleVideoEnded = index => {
-  // 获取当前视频
-  const video = fullscreenVideo.value
-
-  // 重置视频播放时间为 0
-  video.currentTime = 0
-
-  // 重新加载视频
-  video.load()
-}
-// 原图
-const yuanImages = ref([])
-function convertVideoUrlToThumbnail (videoUrl) {
-  // 检查是否是有效的视频URL
-  if (!videoUrl || typeof videoUrl !== 'string') {
-    return videoUrl
-  }
-  // 替换文件扩展名
-  return videoUrl.replace(/\.mp4$/, '_small.jpg')
-}
-const infoList = ref([
-  { name: '任务编号', value: '', field: 'job_info_num' },
-  { name: '任务名称', value: '', field: 'name' },
-  { name: '任务类型', value: '', field: 'rep_rule_type' },
-  { name: '飞行事件', value: '', field: 'event_number' },
-  { name: '所属机巢', value: '', field: 'device_names' },
-  { name: '创建人', value: '', field: 'creator_name' },
-  { name: '所属部门', value: '', field: 'dept_name' },
-  { name: '任务时间', value: '', field: 'cycle_time_value' },
-  { name: '任务频次', value: '', field: 'rep_rule_type' },
-  { name: '关联算法', value: '', field: 'ai_type_str' },
-  { name: '自定义识别区', value: '', field: 'enable_custom_area' },
-  { name: '任务描述', value: '', field: 'remark' },
-  // { name: '任务执行次数', value: '', field: 'job_num' },
-])
-// 机巢状态
-const flystatus = ref('')
-const detailsData = ref({
-  id: null,
-  remark: null,
-  is_monitoring: null,
-  industry_type_str: null,
-  area_code: null,
-  ai_type_str: null,
-  enable_custom_area: null,
-  begin_time: null,
-  end_time: null,
-  device_names: null,
-  create_time: null,
-  name: null,
-  event_number: null,
-  creator_name: null,
-  way_lines: [],
-})
-// 任务成果
-const total = ref(0)
-const achievementList = ref([])
-const props = defineProps(['wayLineJobInfoId', 'waylineJobId', 'batchNo', 'jobId'])
-const wayLineJobInfoId = computed(() => props.wayLineJobInfoId)
-const jobId = computed(() => props.jobId)
-provide('wayLineJobInfoId', wayLineJobInfoId)
-provide('jobId', jobId)
-
-// 可见数量
-const visibleCount = computed(() =>
-  showAll.value ? achievementList.value.length : Math.min(5, achievementList.value.length)
-)
-
-const jumpMore = () => {
-  ElMessage.warning('正在加急开发中...')
-}
-
-const flightEvents = ref([])
-const jobTimes = ref([])
-const historyTime = ref('')
-const jumpDataCenter = ref(null)
-const cycle_time = ref(null)
-const detailName = ref(null)
-
-const getDetails = () => {
-  const params = {
-    wayLineJobInfoId: props.wayLineJobInfoId,
-    // waylineJobId: props.waylineJobId,
-    batchNo: props.batchNo
-  }
-  getJobDetails(params).then(res => {
-    detailsData.value = res.data.data
-    jobTimes.value = res.data.data.job_times
-    jumpDataCenter.value = res.data.data
-    cycle_time.value = res.data.data.cycle_time_value
-    detailName.value = detailsData.value.name
-
-    infoList.value.forEach(item => {
-      item.value = detailsData.value?.[item.field] || '--'
-      if (item.name === '任务频次') {
-        item.value = detailsData?.value.rep_rule_type ? detailsData?.value.final_cycle_frequency : '1次'
-      }
-      if (item.name === '任务类型') {
-        const { rep_rule_type = '' } = detailsData?.value || {}
-        item.value = rep_rule_type ? '周期任务' : '临时任务'
-      }
-      if (item.name === '飞行事件') {
-        const { action_modes = [] } = detailsData?.value || {}
-        flightEvents.value = action_modes.flatMap(getFindAction)
-      }
-      if (item.name === '自定义识别区' && infoList?.value[9].value !== '--') {
-        item.value = res.data.data.enable_custom_area ? '是' : '否'
-      }
-    })
-    getJobsAllFiles({
-      wayLineJobId: detailsData.value.way_lines.map(item => item.job_id).join(','),
-      resultTypes: [0, 1, 2, 4, 5,15],
-      orderByCreateTime: true,
-    }).then(result => {
-      if (result.data.code !== 200) return
-      achievementList.value = result.data.data.records.map(i => ({
-        ...i,
-        checked: false,
-        smallUrl: i.resultType === 4 ? getzsSmallImg(i.link) : getSmallImg(i.link),
-        showUrl: i.resultType === 4 ? getzsShowImg(i.link) : getShowImg(i.link),
-      }))
-      total.value = result.data.data.total
-
-      yuanImages.value = result.data.data.records.filter(item => item.resultType !== 1)
-    })
-  })
-}
-// 播放
-const videoRef = ref(null)
-const currentVideoIndex = ref(-1)
-
-const enterFullScreen = (index) => {
-  currentVideoIndex.value = index
-  VideoShow.value = true
-}
-// 计算当前视频URL
-const currentVideoUrl = computed(() => {
-  return achievementList.value[currentVideoIndex.value]?.link || ''
-})
-// 关闭弹窗处理
-const handleClose = () => {
-  if (fullscreenVideo.value) {
-    fullscreenVideo.value.pause()
-    fullscreenVideo.value.currentTime = 0
-  }
-}
-// 下载
-const downloadFun = async () => {
-  const list = achievementList.value.filter(i => i.checked)
-  console.log('list', list)
-  if (!list?.length) return ElMessage.warning('请选择文件')
-  if (list.length === 1) {
-    list.forEach((item, index) => {
-      const suffix = item.link.split('.').pop()
-      aLinkDownloadUtil(item.link, item.nickName + '.' + suffix)
-    })
-  } else {
-    loadingData = ElLoading.service({ background: 'rgba(0, 0, 0, 0.5)', text: '打包中,请稍等...' })
-    const fileIds = list.map(i => i.id)
-    const res = await getDownloadStatusApi({ type: 'htlsrwxq' })
-    if (!['CANCELLED', 'COMPLETED'].includes(res.data.data?.status || 'COMPLETED')) {
-      return ElMessage.warning('还有正在处理的')
-    }
-    attachDownload({ attachIds: fileIds, type: 'htlsrwxq' }).finally(() => {
-      loadingData.close()
-    })
-  }
-}
-// 全景预览
-const panoramaParamsShow = ref(false)
-const panoramaParamsUrl = ref(null)
-const clickpanorama = val => {
-  panoramaParamsShow.value = true
-  panoramaParamsUrl.value = val.link
-}
-// 从地图点击图片预览
-const showViewer = ref(false)
-const activeIndex = ref(0)
-const previewUrls = ref([])
-const showImageeclick = (list, index, categoriestype) => {
-  if (categoriestype === 5) {
-    panoramaParamsShow.value = true
-    panoramaParamsUrl.value = list[0]
-  } else {
-    previewUrls.value = list
-    activeIndex.value = 0
-    showViewer.value = true
-  }
-}
-// 取消下载
-function cancelDownload () {
-  cancelDownloadApi({ type: 'htlsrwxq' }).then(res => {
-    ElMessage.success('取消成功')
-  }).catch(e => {
-    EventBus.emit('useGlobalWS-messageHandler', { biz_code: 'DOWNLOAD_PROGRESS', data: { status: 'CANCELLED', type: 'htlsrwxq' } })
-  })
-}
-
-// 执行机巢详情
-const taskData = ref([])
-const getNestDetailApi = () => {
-	const params = {
-		jobInfoId: props.wayLineJobInfoId,
-		batchNo: props.batchNo,
-	}
-	NestDetailApi(params).then(res => {
-		taskData.value = res.data.data
-	})
-}
-
-// 获取回放直播列表
-const videoData = ref([])
-const openVideoDetail = ref({})
-const getVideoList = () => {
-  getWaylinejobLiveRecordPage({ job_info_id: props.wayLineJobInfoId }).then(videoDetails => {
-    videoData.value = videoDetails.data.data.records
-  })
-}
-
-const openPlaybackVideoDialog = data => {
-  playbackVideo.value = true
-  openVideoDetail.value = data
-}
-
-
-
-function clickPlay(index) {
-  carouselShow.value = true
-  currentIndex.value = index
-}
-
-onMounted(() => {
-  getDetails()
-  getNestDetailApi()
-  getVideoList()
-})
-</script>
-
-<style lang="scss">
-.detailsOfHistoricalTasks {
-  .el-dialog {
-    --el-dialog-margin-top: 5vh;
-  }
-
-  .el-pagination {
-    justify-content: center;
-    padding: 20px;
-  }
-
-  .el-dialog__body {
-    height: 80vh;
-  }
-}
-</style>
-
-<style lang="scss" scoped>
-.content {
-  display: flex;
-  height: 100%;
-
-  .contentLeft {
-    margin-left: 35px;
-    margin-right: 24px;
-    width: 1150px;
-    overflow: auto;
-
-    .detailsLine {
-			display: flex;
-			align-items: center;
-			border-bottom: 2px solid #e4e7ed;
-			padding-bottom: 4px;
-			img {
-				width: 15px;
-				height: 15px;
-			}
-			.title {
-				margin-left: 10px;
-				font-size: 16px;
-				color: #303133;
-			}
-      .btn {
-        margin-left: 16px;
-      }
-    }
-
-    .devicetitle {
-      margin-bottom: 16px;
-      // background: url('/src/assets/images/task/detailtitle.png') no-repeat center;
-      border-bottom: 2px solid #e4e7ed;
-      background-size: 100% 100%;
-      display: flex;
-      justify-content: space-between;
-      align-content: center;
-
-      .rightBox {
-        display: flex;
-        align-items: center;
-        padding-right: 10px;
-        gap: 0 10px;
-
-        .downloadBtn {
-          position: relative;
-          display: flex;
-          align-items: center;
-          justify-content: center;
-          height: 28px;
-          padding: 0 15px;
-          background: rgba(28, 92, 255, 0.14);
-          border-radius: 4px 4px 4px 4px;
-          border: 1px solid #1c5cff;
-          cursor: pointer;
-          color: #1C5CFF;
-
-          .downloadBtnText {
-            display: flex;
-            align-items: center;
-            gap: 5px;
-            z-index: 5;
-          }
-
-          .el-progress {
-            position: absolute;
-            left: 0;
-            top: 0;
-            width: 100%;
-
-            :deep() {
-              .el-progress-bar__outer {
-                height: 28px !important;
-                border-radius: 0 !important;
-                background: transparent !important;
-
-                .el-progress-bar__inner {
-                  border-radius: 0 !important;
-                }
-              }
-            }
-          }
-
-        }
-      }
-
-      img {
-        width: 15px;
-        height: 15px;
-      }
-
-      p {
-        display: inline-block;
-        margin-left: 10px;
-        font-size: 16px;
-        color: #363636;
-        line-height: 20px;
-        text-align: left;
-        margin-bottom: 8px;
-
-        span {
-          font-size: 26px;
-          color: #0282ff;
-          font-weight: bold;
-        }
-      }
-
-      .more {
-        color: #2f9dff;
-        font-size: 14px;
-        padding-top: 5px;
-        cursor: pointer;
-      }
-    }
-
-    .infoBox {
-      display: flex;
-      justify-content: space-between;
-
-      .itemBoxLeft {
-        flex: 1;
-        display: grid;
-        grid-template-columns: repeat(2, 1fr);
-        column-gap: 10px;
-        /* 只设置列间距 */
-        row-gap: 0;
-        /* 取消行间距 */
-        padding: 10px;
-        font-size: 14px;
-
-        .itemBox {
-          display: flex;
-          align-items: center;
-          background: #fff;
-          height: 43px;
-          border-top: 2px solid #EFEFEF;
-
-        }
-
-      }
-
-      .itemCon:nth-last-child(-n+2) {
-        border-bottom: 2px solid #EFEFEF;
-      }
-
-      .itemBox:nth-last-child(-n+2) .itemTitle {
-        border-bottom: 1px solid #EFEFEF;
-      }
-
-      .itemTitle {
-        color: #0B1D38;
-        width: 26%;
-        text-align: right;
-        background: #F3F6FF;
-        height: 43px;
-        line-height: 43px;
-        padding-right: 10px;
-        border-top: 1px solid #EFEFEF;
-      }
-
-      .itemValue {
-        font-size: 14px;
-        color: #747e91;
-        text-align: center;
-        width: 74%;
-
-      }
-
-      .flightEvents {
-        display: flex;
-        flex-wrap: wrap;
-        gap: 10px 10px;
-        width: 74%;
-        justify-content: center;
-
-        img {
-          width: 30px;
-          height: 30px;
-        }
-      }
-
-    }
-
-    .imgListBox {
-      display: grid;
-      grid-template-columns: repeat(5, 1fr);
-      gap: 10px;
-      margin-bottom: 49px;
-
-      >* {
-        width: 100%;
-        height: 200px;
-        position: relative;
-        border-radius: 0px 0px 4px 4px;
-        overflow: hidden;
-      }
-
-      :deep(.el-checkbox__inner) {
-        width: 17px !important;
-        height: 17px !important;
-        background: rgba(37, 36, 36, 0.63) !important;
-        border-radius: 4px 4px 4px 4px;
-        border: 1px solid #ffffff !important;
-      }
-
-      .el-checkbox {
-        position: absolute;
-        top: 0;
-        left: 6px;
-      }
-
-      :deep(.el-checkbox__inner:after) {
-        position: absolute;
-        left: 50% !important;
-        top: 40% !important;
-        transform: translate(-50%, -50%) rotate(45deg) !important;
-      }
-
-      :deep(.el-checkbox.is-checked .el-checkbox__inner) {
-        background-color: #09297b !important;
-        border-color: #1c5cff !important;
-      }
-
-      .el-image {
-        width: 100%;
-        height: 100%;
-        cursor: pointer;
-        position: relative;
-      }
-
-      .quanjing {
-        width: 100%;
-        height: 100%;
-        object-fit: cover;
-        cursor: pointer;
-        position: relative;
-      }
-
-      .videotime {
-        width: 100%;
-        height: 100%;
-        position: relative;
-
-        .videoDisplay {
-          width: 100%;
-          height: 100%;
-          object-fit: cover;
-        }
-      }
-
-      .itemName {
-        position: absolute;
-        bottom: 0;
-        left: 0;
-        height: 23px;
-        width: 100%;
-        background: rgba(22, 22, 22, 0.68);
-        border-radius: 0px 0px 4px 4px;
-        font-family: Source Han Sans CN, Source Han Sans CN;
-        font-weight: 400;
-        font-size: 14px;
-        color: #ffffff;
-        line-height: 23px;
-        z-index: 9;
-        padding: 0 6px;
-      }
-    }
-
-    .videobutton {
-      position: absolute;
-      top: 40%;
-      left: 50%;
-      transform: translate(-50%);
-      cursor: pointer;
-      width: 40px;
-      height: 40px;
-      display: inline-block;
-      background: #999;
-      border-radius: 50%;
-    }
-
-    .videoDisplay {
-      display: flex;
-      flex-wrap: wrap;
-      width: 200px;
-      height: 200px;
-
-    }
-
-    .videotime {
-      position: relative;
-    }
-
-		.cg-empty {
-			text-align: center;
-			color: #909399;
-		}
-
-  }
-
-  .content-right {
-    position: relative;
-    width: 0;
-    flex-grow: 1;
-    background: #19ad8d;
-    margin-right: 17px;
-    overflow: hidden;
-
-    .content-map-popups {
-      pointer-events: none;
-
-      >* {
-        pointer-events: auto !important;
-      }
-    }
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/job/components/DeviceJobDetailsMap.vue b/applications/task-work-order/src/views/job/components/DeviceJobDetailsMap.vue
deleted file mode 100644
index 9c59fe6..0000000
--- a/applications/task-work-order/src/views/job/components/DeviceJobDetailsMap.vue
+++ /dev/null
@@ -1,364 +0,0 @@
-<template>
-	<div id="deviceJobDetailsMap" class="ztzf-cesium"></div>
-</template>
-<script setup>
-import { flyVisual } from '@/utils/cesium/mapUtil'
-import _ from 'lodash'
-
-import * as Cesium from 'cesium'
-import { PublicCesium } from '@/utils/cesium/publicCesium'
-import photoDirection from '@/assets/images/historyMapPopup/photoDirection-new.png'
-import { getEventImage } from '@/utils/stateToImageMap/event'
-import panoramaPoint from '@/assets/images/panorama/panorama-point.png' //全景图标
-import { getShowImg } from '@/utils/util'
-import { getPanoramaList } from '@/api/panorama'
-import CreateRouteLine from '@/utils/cesium/createRouteLine'
-import { useStore } from 'vuex'
-import { getOdmToken } from '@/api/model'
-
-const createRouteLineExample = new CreateRouteLine()
-const store = useStore()
-const emit = defineEmits(['showImageeclick'])
-const props = defineProps(['detailsData', 'yuanImages', 'jobId','taskData'])
-const userAreaCode = computed(() => store.state.user.userInfo.detail.areaCode)
-let viewer = null
-let publicCesiumInstance = null
-const viewInstance = shallowRef(null)
-import { cloneDeep } from 'lodash'
-import { useIdentificationArea } from '@ztzf/hooks'
-let handler = null
-let curMoveEntity = null
-const tokenStr = ref('')
-let tipsLabel = null
-
-const initMap = () => {
-	publicCesiumInstance = new PublicCesium({
-		dom: 'deviceJobDetailsMap',
-		terrain: true,
-		flatMode: false,
-		layerMode: 4,
-	})
-
-	viewer = publicCesiumInstance.getViewer()
-	viewInstance.value = publicCesiumInstance
-	viewer.scene.globe.depthTestAgainstTerrain = true
-
-	createRouteLineExample.initCreateRoute(viewer)
-
-	handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
-	handler.setInputAction(click => {
-		const pickedObjects = viewer.scene.drillPick(click.position)
-		LeftClickEvent(click, pickedObjects, viewer)
-	}, Cesium.ScreenSpaceEventType.LEFT_CLICK)
-
-	handler.setInputAction(e => {
-		let pick = viewer.scene.drillPick(e.endPosition)
-		mouseMoveEvent(e, pick, viewer)
-	}, Cesium.ScreenSpaceEventType.MOUSE_MOVE)
-}
-
-function mouseMoveEvent(click, pick, viewer) {
-	let startEntity = pick?.find(
-		i => i.id.name === 'work-drone-route-planar-polyline' || i.id.name === 'work-drone-route-point-polyline'
-	)?.id
-	const position = viewer.scene.pickPosition(click.endPosition)
-	const device_sn = startEntity?.customData?.data?.device_sn
-	const lineBoxShow = createRouteLineExample.detailsMapPopupData?.find(i => i.device_sn === device_sn)?.show
-	if (startEntity && !lineBoxShow) {
-		if (!tipsLabel){
-			tipsLabel = viewer.entities.add({
-				position: position,
-				label: {
-					text: `点击显示详情`,
-					font: '14px sans-serif',
-					showBackground: true,
-					backgroundColor: new Cesium.Color(0.165, 0.165, 0.165, 0.8),
-					pixelOffset: new Cesium.Cartesian2(0, -20),
-					eyeOffset: new Cesium.Cartesian3(0, 0, -10), // 使标签在点的上方
-					disableDepthTestDistance: Number.POSITIVE_INFINITY, // 避免被遮挡
-				}
-			})
-			return
-		}
-		tipsLabel.position = position
-	}else{
-		tipsLabel && viewer.entities.remove(tipsLabel)
-		tipsLabel = null
-	}
-}
-
-// 绘制线和飞行
-const drawLine = async () => {
-	Promise.all(
-		props.detailsData.way_lines.map(
-			async item =>
-				await createRouteLineExample.parsingFiles(
-					{
-						...item,
-						url: `${item.url}?_t=${new Date().getTime()}`,
-						status: props.taskData.length > 1 ? props.taskData.filter(i => i.dock_sn === item.device_sn)[0].status : ''
-					},
-					{
-						longitude: item.longitude,
-						latitude: item.latitude,
-						height: item.height,
-					},
-					true,
-					false
-				)
-		)
-	).then(res => {
-		createRouteLineExample.showDetailMapPopup(props.detailsData.way_lines)
-
-		let arr = res.map(i => i.filePositions)
-
-		let newArr = _.flatten(arr)
-
-		flyVisual({
-			positionsData: newArr.map(i => [i.lng, i.lat, i.alt]),
-			viewer,
-			pitch: -60,
-		})
-	})
-}
-
-const lastSelectedId = ref(null)
-// 鼠标左键点击事件
-const LeftClickEvent = (click, pick, viewer) => {
-	// pick是一个数组
-	if (pick && pick.length > 0) {
-		let startEntity = pick.find(
-			i => i.id.name === 'work-drone-route-planar-polyline' || i.id.name === 'work-drone-route-point-polyline'
-		)?.id
-
-		if (startEntity) {
-			createRouteLineExample.showSingleDetailMapPopup(startEntity?.customData?.data)
-			tipsLabel && viewer.entities.remove(tipsLabel)
-			tipsLabel = null
-			return
-		}
-		let imagePath = []
-		let categories = ''
-		let panoramic = ''
-		pick.forEach(item => {
-			const index = item.id.index
-			if (item.id.customType == 'spotImages') {
-				imagePath.push(item.id.customInfo.link)
-			} else if (item.id.customType == 'aggregationSplashed') {
-				imagePath.push(item.id.customInfo.link)
-			} else if (item.id.customType == 'panorama') {
-				//全景
-				imagePath.push(item.id.customInfo.link)
-				categories = item.id.customInfo.resultType
-			}
-		})
-		if (imagePath.length === 0) return
-		const finalImagePaths = categories === 5 ? imagePath : imagePath.map(i => getShowImg(i))
-		emit('showImageeclick', finalImagePaths, 0, categories)
-	}
-}
-
-const removeMap = () => {
-	viewer.entities.removeAll()
-	publicCesiumInstance?.viewerDestroy()
-	publicCesiumInstance = null
-	viewer = null
-}
-const {setArea,removeArea } = useIdentificationArea()
-watch(
-	() => props.detailsData,
-	async  (newValue, oldValue) => {
-		if (newValue) {
-			await drawLine()
-		}
-		if (newValue?.ai_types && newValue.enable_custom_area){
-			setArea(newValue.ai_types.split(','),viewer)
-		}
-	}
-)
-const zsList = ref([])
-// 获取odmtoken
-function getOdmTokenStr() {
-	getOdmToken().then(res => {
-		if (res.data.code !== 200) return
-		tokenStr.value = res.data.data
-	})
-}
-// 获取正射列表
-function getZSList(newVal) {
-	let list = []
-	newVal.map((item, index) => {
-		item.childrens.map(zschilditem => {
-			if (zschilditem?.data) {
-				zschilditem?.data.map(dataitem => {
-					list.push(dataitem)
-				})
-			}
-		})
-	})
-	return list
-}
-// 获取正射请求地图聚合数据
-const zsMapList = ref([])
-function getZSMapList(valSn) {
-	const params = {
-		areaCode: userAreaCode.value,
-		deviceSn: valSn,
-		resultType: 4,
-		wayLineJobId: props.jobId,
-	}
-	getPanoramaList(params).then(res => {
-		const resData = res?.data?.data
-		zsMapList.value = resData?.childrens || []
-		zsList.value = getZSList(zsMapList.value)
-
-		renderOrthophoto()
-	})
-}
-// 解析经纬度
-function getLonLat(str) {
-	if (!str) return []
-	return str
-		.replace('POLYGON((', '')
-		.replace('))', '')
-		.split(',')
-		.map(pair => {
-			const [lon, lat] = pair.trim().split(' ').map(Number)
-			return [lon, lat]
-		})
-}
-// 渲染正射
-function renderOrthophoto() {
-	zsList.value.forEach((item, index) => {
-		const cur = viewInstance.value.addCustomImageryProviderDataSource(
-			new Cesium.UrlTemplateImageryProvider({
-				url: `${import.meta.env.VITE_APP_AREA_NAME}/webodm${item.url}?jwt=${tokenStr.value.split(' ')[1]}`,
-			})
-		)
-	})
-}
-
-watch(
-	() => props.yuanImages,
-	(newValue, oldValue) => {
-		// 增加箭头
-		if (newValue.length === 0) return
-		let eventArr = newValue.filter(i => i.resultType === 2)
-		let originalArr = newValue.filter(i => i.resultType === 0)
-		let panoramicArr = newValue.filter(i => i.resultType === 5)
-		let orthographicArr = newValue.filter(i => i.resultType === 4)
-		if (orthographicArr) {
-			getZSMapList(orthographicArr[0]?.deviceSn)
-		}
-		originalArr.forEach((item_in, index) => {
-			// 根据偏航角度展示图片拍摄的方向
-			let yawAngleDegrees =
-				item_in.metadata.gimbalYawDegree < 0
-					? 360 + Number(item_in.metadata.gimbalYawDegree)
-					: Number(item_in.metadata.gimbalYawDegree)
-
-			viewer.entities.add({
-				position: Cesium.Cartesian3.fromDegrees(
-					+item_in.metadata.shootPosition.lng,
-					+item_in.metadata.shootPosition.lat,
-					+item_in.metadata.absoluteAltitude
-				),
-				id: 'spotImages' + item_in.id,
-				customType: 'spotImages',
-				customInfo: {
-					...item_in,
-				},
-				index: index,
-				billboard: {
-					image: photoDirection,
-					outlineWidth: 0,
-					width: 14,
-					height: 21,
-					disableDepthTestDistance: Number.POSITIVE_INFINITY,
-					verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
-				},
-			})
-		})
-
-		eventArr.forEach((item, index) => {
-			viewer.entities.add({
-				id: `aggregationSplashed${item.id}`,
-				customType: 'aggregationSplashed',
-				customInfo: {
-					...item,
-				},
-				position: Cesium.Cartesian3.fromDegrees(
-					+item.metadata.shootPosition.lng,
-					+item.metadata.shootPosition.lat,
-					+item.metadata.absoluteAltitude
-				),
-				billboard: {
-					image: getEventImage(item.status),
-					width: 30,
-					height: 30,
-					disableDepthTestDistance: Number.POSITIVE_INFINITY,
-				},
-				index: index,
-				properties: {
-					customData: {
-						data: item,
-					},
-				},
-			})
-		})
-		// 全景
-		panoramicArr.forEach((item, index) => {
-			viewer.entities.add({
-				id: `panorama${item.id}`,
-				customType: 'panorama',
-				customInfo: {
-					...item,
-				},
-				position: Cesium.Cartesian3.fromDegrees(
-					+item.metadata.shootPosition.lng,
-					+item.metadata.shootPosition.lat,
-					+item.metadata.absoluteAltitude
-				),
-				billboard: {
-					image: panoramaPoint,
-					width: 30,
-					height: 30,
-					disableDepthTestDistance: Number.POSITIVE_INFINITY,
-				},
-				index: index,
-				properties: {
-					customData: {
-						data: item,
-					},
-				},
-			})
-		})
-	},
-	{ immediate: true, deep: true }
-)
-
-onBeforeUnmount(() => {
-	// 移除事件监听
-	handler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
-	handler?.destroy()
-	handler = null
-
-	createRouteLineExample.destroyedCustomDom()
-
-	removeMap()
-})
-
-onMounted(() => {
-	getOdmTokenStr()
-	nextTick(() => {
-		initMap()
-	})
-
-})
-</script>
-<style scoped lang="scss">
-#deviceJobDetailsMap {
-	position: relative;
-	height: 100%;
-}
-</style>
diff --git a/applications/task-work-order/src/views/job/components/FileTypePlay.vue b/applications/task-work-order/src/views/job/components/FileTypePlay.vue
deleted file mode 100644
index 517ac37..0000000
--- a/applications/task-work-order/src/views/job/components/FileTypePlay.vue
+++ /dev/null
@@ -1,158 +0,0 @@
-<template>
-  <!--  <div class="file-type-play">-->
-  <el-image-viewer
-    v-if="isShow"
-    ref="preview"
-    :url-list="playList"
-    :initial-index="currentActiveIndex"
-    @close="closeImageViewer"
-    @switch="onViewerSwitch"
-    teleported>
-  </el-image-viewer>
-</template>
-
-<script setup>
-import { getShowImg } from '@/utils/util'
-
-const currentActiveIndex = ref(0)
-
-const isShow = defineModel('show', {
-  type: Boolean,
-  default: true,
-})
-
-const props = defineProps(['list','cIndex'])
-
-const playList = ref([])
-
-function getQJUrl(url) {
-  return `https://wrj.shuixiongit.com/dronePanorama/html/simple-index.html?path=${getShowImg(url)}`
-}
-
-function closeImageViewer() {
-  isShow.value = false
-}
-
-function onViewerSwitch (index) {
-  currentActiveIndex.value = index
-  videoImageSwitch()
-}
-
-const videoImageSwitch = () => {
-  nextTick(() => {
-    const viewerCanvas = document.querySelector('.el-image-viewer__canvas');
-    const viewerActions = document.querySelector('.el-image-viewer__actions');
-    const parentDOM = document.querySelector('.el-image-viewer__wrapper');
-
-    // const maskLayer = document.querySelector('.el-image-viewer__mask'); // 获取遮罩层
-
-    // 清理之前可能存在的视频或全景图元素
-    const existingVideo = parentDOM?.querySelector('.preview-video');
-    const existingIframe = parentDOM?.querySelector('.preview-panorama');
-
-    if (existingVideo) existingVideo.remove();
-    if (existingIframe) existingIframe.remove();
-
-    const item = props.list[currentActiveIndex.value];
-
-    if (item?.resultType === 1) {
-      // ========== 处理视频 ==========
-      // 隐藏图片查看器的UI
-      if (viewerActions) viewerActions.style.display = 'none';
-      if (viewerCanvas) viewerCanvas.style.display = 'none';
-
-      // 创建并添加视频元素
-      const videoDom = document.createElement('video');
-      videoDom.className = 'preview-video';
-      // videoDom.autoplay = true;
-      videoDom.muted = true;
-      videoDom.playsInline = true;
-      videoDom.loop = true;
-      videoDom.controls = true;
-      videoDom.preload = 'auto';
-      videoDom.src = item.object_key || item.showUrl;
-
-      videoDom.style.position = 'relative';
-      // 添加视频样式
-      videoDom.style.width = '100%';
-      videoDom.style.height = '100%';
-      videoDom.style.objectFit = 'contain';
-
-      // 添加事件监听器
-      videoDom.addEventListener('play', (event) => {
-        // 设置播放速度为 0.75
-        if (event.target.playbackRate !== 0.75) {
-          event.target.playbackRate = 0.75;
-        }
-      });
-
-      videoDom.addEventListener('ended', () => {
-        // 重置视频播放时间为 0 并重新加载
-        videoDom.currentTime = 0;
-        videoDom.load();
-      });
-
-      if (parentDOM) {
-        parentDOM.appendChild(videoDom);
-      }
-    } else if (item?.resultType === 5) {
-      // ========== 处理全景图 ==========
-      // 隐藏图片查看器的UI(如果全景图不需要查看器UI)
-      // if (maskLayer) maskLayer.style.display = 'none';
-      if (viewerActions) viewerActions.style.display = 'none';
-      if (viewerCanvas) viewerCanvas.style.display = 'none';
-
-      // 创建并添加iframe元素
-      const iframeDom = document.createElement('iframe');
-      iframeDom.className = 'preview-panorama';
-      iframeDom.src = getQJUrl(item?.link); // 使用你的全景图URL生成函数
-      iframeDom.frameBorder = '0'; // 注意:frameBorder 是 camelCase
-      iframeDom.allow = 'fullscreen'; // 允许全屏,如果需要
-      iframeDom.title = '全景图浏览';
-
-      // 添加iframe样式
-      // iframeDom.style.zIndex = '2000'; // 比遮罩层的 2000 高
-      iframeDom.style.position = 'relative';
-      iframeDom.style.width = '100%';
-      iframeDom.style.height = '100%';
-      iframeDom.style.border = 'none';
-
-      // 如果需要,可以设置iframe的加载策略
-      iframeDom.loading = 'eager';
-
-      if (parentDOM) {
-        parentDOM.appendChild(iframeDom);
-      }
-    } else {
-      // ========== 处理图片(或其他类型) ==========
-      // 显示图片查看器的UI
-      if (viewerCanvas) viewerCanvas.style.display = 'flex';
-      if (viewerActions) viewerActions.style.display = 'flex';
-    }
-  });
-};
-
-watch(isShow, async newVal => {
-  if (newVal) {
-    playList.value = props.list.map((item) => item.showUrl)
-    currentActiveIndex.value = props.cIndex
-    videoImageSwitch()
-
-  }
-})
-</script>
-<style lang="scss">
-.el-image-viewer__wrapper {
-  .el-image-viewer__canvas {
-    img {
-      height: 90%;
-      top: 5%;
-    }
-  }
-
-  .preview-video {
-    max-height: 96%;
-  }
-}
-
-</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/job/components/JobRelatedEvents.vue b/applications/task-work-order/src/views/job/components/JobRelatedEvents.vue
deleted file mode 100644
index 9e03ac7..0000000
--- a/applications/task-work-order/src/views/job/components/JobRelatedEvents.vue
+++ /dev/null
@@ -1,392 +0,0 @@
-<template>
-	<div class="JobRelatedEvents">
-	  <div class="machineTableDetailsTitle">
-			<img src="/src/assets/images/task/sign.svg" alt="">
-      <div class="title">
-        关联事件<span>{{ total }}</span>件
-      </div>
-      <div class="exportBtn" v-if="total > 0 ">
-		<el-button
-			:loading="isShowExportTextLoading"
-			:disabled="isShowExportTextLoading"
-			class="playback-video-btn" type="primary" @click="exportTheTask" size="small">
-			{{ isShowExportTextLoading ? '导出中' : '导出报告' }}
-		</el-button>
-	  </div>
-	</div>
-	<div class="search">
-		<div class="searchBox">
-			<div class="item">
-				<div class="itemchild">模糊查询:</div>
-				<el-input v-model="params.event_name" placeholder="请输入事件名称" clearable></el-input>
-			</div>
-			<!-- <div class="item">
-				<div class="itemchild">任务执行日期:</div>
-				<el-date-picker
-					popper-class="custom-date-picker"
-					class="tasktimer"
-					v-model="taskData"
-					type="date"
-					placeholder="请选择日期"
-					value-format="YYYY-MM-DD"
-					:disabled-date="disabledDate"
-					@change="changeselect"
-				/>
-			</div> -->
-			<div class="item">
-				<div class="itemchild">关联算法:</div>
-        <TaskAlgorithmBusiness ref="algorithmRef" :setWidth="186" :showAlgorithm="true" @algorithmChange="algorithmChange" />
-			</div>
-		</div>
-		<div class="search-btn">
-			<el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button>
-			<el-button icon="el-icon-refresh" @click="handleReset">重置</el-button>
-			</div>
-	</div>
-
-	<div class="ztzf-table">
-		<el-table
-			v-loading="loading"
-			:row-class-name="tableRowClassName"
-			:data="list"
-			style="width: 100%"
-      :row-style="{ height: pxToRem(48), fontSize: pxToRem(14), 'text-align': 'center' }"
-      :header-cell-style="{ 'text-align': 'center', height: pxToRem(36), fontSize: pxToRem(14) }"
-    >
-      <el-table-column label="序号" type="index" :width="pxToRemNum(60)">
-        <template #default="{ $index }">
-          {{ ($index + 1 + (sizeParams.current - 1) * sizeParams.size).toString().padStart(2, '0') }}
-        </template>
-      </el-table-column>
-      <el-table-column show-overflow-tooltip prop="event_num" label="事件编号" :width="pxToRemNum(160)">
-        <template #default="scope">
-          <el-tooltip-copy :content="scope.row.event_num" :showCopyText="true">
-            {{ scope.row.event_num }}
-          </el-tooltip-copy>
-        </template>
-      </el-table-column>
-			<el-table-column show-overflow-tooltip prop="event_name" label="事件名称"  align="center"/>
-			<el-table-column show-overflow-tooltip prop="remark" label="事件地址"  align="center"/>
-			<el-table-column show-overflow-tooltip prop="ai_types" label="关联算法"  align="center"/>
-			<el-table-column show-overflow-tooltip prop="work_type" label="事件来源" align="center">
-				<template #default="scope">
-					{{scope.row.work_type === '0' ? '巡检任务' : 
-						scope.row.work_type === '1' ? '人工上报' : 
-						scope.row.work_type === '2' ? '识别分析' : '' }}
-				</template>
-			</el-table-column>
-			<el-table-column show-overflow-tooltip prop="create_time" label="事件时间"  align="center"/>
-			<el-table-column prop="status" label="事件状态" align="center">
-				<template #default="scope">
-					<div class="pending" v-if="scope.row.status === 0">待处理</div>
-					<div class="reviewed" v-if="scope.row.status === 2">待审核</div>
-					<div class="processing" v-if="scope.row.status === 3">处理中</div>
-					<div class="done" v-if="scope.row.status === 4">已完成</div>
-					<div class="ended" v-if="scope.row.status === 5">已完结</div>
-				</template>
-			</el-table-column>
-      <el-table-column label="操作" :width="pxToRemNum(150)">
-        <template #default="scope">
-          <div class="btnGroups">
-            <el-popover
-              v-if="scope.row.status === 3 || scope.row.status === 0"
-              popper-class="ztzf-custom-qrcode-popover"
-              :width="pxToRem(119)"
-              :visible="scope.row.showQR"
-              placement="top"
-              title=""
-              trigger="click"
-            >
-              <template #reference>
-                <el-button type="text" @click="QRCode(scope.row)">事件导航</el-button>
-              </template>
-              <div class="qrcode-content">
-                <div class="close-btn" @click.stop="scope.row.showQR = false">×</div>
-                <CreateQRcode v-if="scope.row.showQR" :latAndLon="latAndLon"></CreateQRcode>
-              </div>
-            </el-popover>
-            <el-button icon="el-icon-view" type="text" @click="examine(scope.row)">查看</el-button>
-          </div>
-        </template>
-      </el-table-column>
-		</el-table>
-	</div>
-	<el-pagination v-if="list.length > 0"
-		class="ztzf-pagination"
-		popper-class="custom-pagination-dropdown"
-		background
-		:page-sizes="[10, 20, 30, 50]"
-		v-model:current-page="sizeParams.current"
-		v-model:page-size="sizeParams.size"
-		layout=" prev, pager, next,sizes, jumper"
-		:total="total"
-		@change="pageChange"
-	/>
-	</div>
-</template>
-<script setup>
-import { useStore } from 'vuex'
-import { wgs84ToGcj02 } from '@/utils/coordinateTransformation'
-import CreateQRcode from '@/components/CreateQRcode/CreateQRcode.vue'
-import { getDeviceEventList } from '@/api/job/task'
-import { dayjs, ElMessage } from 'element-plus'
-import { useRouter } from 'vue-router';
-import { NestDetailApi, exportTaskReports } from '@/api/home'
-import { pxToRem, pxToRemNum } from '@/utils/rem'
-import TaskAlgorithmBusiness from './TaskAlgorithmBusiness.vue'
-const router = useRouter();
-const emit = defineEmits(['refresh'])
-const props = defineProps(['jobTimes', 'batchNo', 'waylineJobId','detailName'])
-const taskData = ref('')
-const algorithmRef = ref()
-
-const algorithmChange = val => {
-	params.value.ai_types = val
-  handleSearch()
-}
-const loading = ref(false)
-const list = ref()
-const params = ref({
-	way_line_job_info_id: null,
-	event_name: '',
-	ai_types: [], // 算法类型
-	start_date: null,
-	end_date: null,
-})
-const sizeParams = ref({
-	current: 1,
-	size: 5,
-})
-// 日期选择
-const changeselect = () => {
-	params.value.start_date = taskData.value.length ? `${taskData.value} 00:00:00` : null
-	params.value.end_date = taskData.value.length ? `${taskData.value} 23:59:59` : null
-}
-const store = useStore()
-const child_sn = computed(() => store.state.home.singleUavHome.child_sn)
-const total = ref(0)
-const examine = row => {
-	const orderNumber = row.event_num
-	router.push({
-      path: `/tickets/ticket`,
-      query: {
-        orderNumber,
-      },
-    });
-}
-const wayLineJobInfoId = inject('wayLineJobInfoId')
-
-const getList = () => {
-  if (!wayLineJobInfoId.value) return
-  params.value.way_line_job_info_id = wayLineJobInfoId.value
-  params.value.batch_no = props.batchNo
-  loading.value = true
-  getDeviceEventList(
-	{
-		...params.value,
-	}, sizeParams.value
-  ).then(res => {
-    const resData = res?.data?.data || {}
-    list.value = resData.records.map(item => ({
-      ...item,
-      showQR: false, // 为每条数据添加showQR状态
-    }))
-    total.value = resData.total
-    loading.value = false
-    // store.commit('setJobEventList', list.value)
-  })
-}
-
-const pageChange = val => {
-	sizeParams.value.current = val
-	getList()
-}
-// 表格隔行变色
-const tableRowClassName = ({ row, rowIndex }) => {
-	if (rowIndex % 2 === 1) {
-		return 'warning-row'
-	} else {
-		return 'success-row'
-	}
-}
-// 禁用当天之前的日期
-const disabledDate = time => {
-	const curTime = dayjs(time).format('YYYY-MM-DD')
-	// console.log(curTime)
-	return !(props.jobTimes || []).includes(curTime)
-}
-const handleReset = () => {
-	params.value.ai_types = []
-	params.value.event_name = ''
-	params.value.end_date = null
-	params.value.start_date = null
-	taskData.value = ''
-  algorithmRef.value?.handleClear()
-	algorithmChange([])
-	getList()
-}
-const handleSearch = () => {
-	getList()
-}
-// 二维码
-const latAndLon = ref(null)
-const QRCode = item => {
-  const [gcjLng, gcjLat] = wgs84ToGcj02(Number(item.longitude), Number(item.latitude))
-  latAndLon.value = `${gcjLng},${gcjLat}`
-  list.value.forEach(i => {
-    i.showQR = i.id === item.id ? !i.showQR : false
-  })
-}
-// 导出任务报表
-const isShowExportTextLoading = ref(false)
-const exportTheTask = () => {
-  isShowExportTextLoading.value = true
-  const params = {
-    wayLineJobInfoId: wayLineJobInfoId.value,
-    waylineJobId: props.waylineJobId,
-    batchNo: props.batchNo,
-  }
-  exportTaskReports(params).then(res => {
-    const elink = document.createElement('a')
-    elink.download = props.detailName + '.docx'
-    elink.style.display = 'none'
-    const blob = new Blob([res.data])
-    elink.href = URL.createObjectURL(blob)
-    document.body.appendChild(elink)
-    elink.click()
-    document.body.removeChild(elink)
-	isShowExportTextLoading.value = false
-  })
-}
-onMounted(() => {
-	getList()
-})
-</script>
-<style scoped lang="scss">
-.JobRelatedEvents {
-	.machineTableDetailsTitle {
-    display: flex;
-    border-bottom: 2px solid #e4e7ed;
-    margin-bottom: 16px;
-    align-content: center;
-    .exportBtn {
-      margin-left: 16px;
-    }
-    img {
-        width: 15px;
-        height: 15px;
-    }
-    .title {
-      margin-left: 10px;
-      font-size: 16px;
-      color: #363636;
-
-      span {
-        font-size: 26px;
-        color: #0282ff;
-        font-weight: bold;
-				margin: 0 4px
-      }
-    }
-  }
-
-// 待处理
-.pending {
-	color: #ff7411;
-}
-// 待审核
-.reviewed {
-	color: #ff472f;
-}
-// 处理中
-.processing {
-	color: #FFC300;
-}
-// 已完成
-.done {
-	color: #06d957;
-}
-// 已完结
-.ended {
-	color: #06d957;
-}
-.search {
-	display: flex;
-	justify-content: space-between;
-	margin-bottom: 19px; // 添加底部间距
-	.item {
-		position: relative;
-		display: flex;
-		align-items: center;
-		font-size: 14px;
-		color: #363636;
-		margin-right: 20px;
-		.itemchild {
-			white-space: nowrap;
-			margin-right: 5px;
-		}
-		:deep(.el-date-editor.el-input__wrapper) {
-			width: 200px; // 调整日期选择器宽度
-		}
-	}
-	.item:nth-last-child {
-		margin-right: 113px;
-	}
-}
-.searchBox {
-	display: flex;
-}
-
-.search-btn {
-			display: flex;
-			justify-content: space-between;
-			font-size: 14px;
-
-			.btn {
-				width: 80px;
-				height: 32px;
-				border-radius: 4px 4px 4px 4px;
-				line-height: 32px;
-				display: flex;
-				justify-content: center;
-				align-items: center;
-
-				img {
-					width: 14px;
-					height: 14px;
-				}
-			}
-			.search {
-				background: #409EFF;
-				color: #fff;
-				margin-right: 10px;
-				cursor: pointer;
-			}
-			.clear {
-				border: 1px solid #D2D1D1;
-				color: #676767;
-				margin-right: 10px;
-				cursor: pointer;
-			}
-			.add {
-				background: #FF9243;
-				color: #fff;
-			}
-		}
-		.btnItem {
-			height: 27px;
-			line-height: 27px;
-			border-radius: 0px 0px 0px 0px;
-			border: 1px solid #51a8ff;
-			font-family: Segoe UI, Segoe UI;
-			font-weight: 400;
-			font-size: 14px;
-			color: #1C5CFF;
-			padding: 0 10px;
-			display: inline-block;
-			margin-right: 10px;
-			cursor: pointer;
-	}
-}
-
-</style>
diff --git a/applications/task-work-order/src/views/job/components/SearchBox.vue b/applications/task-work-order/src/views/job/components/SearchBox.vue
deleted file mode 100644
index e3bf99c..0000000
--- a/applications/task-work-order/src/views/job/components/SearchBox.vue
+++ /dev/null
@@ -1,590 +0,0 @@
-<template>
-  <div class="search-box-test" :class="{ 'is-expand': isExpand }">
-    <el-form :model="searchForm" inline>
-      <div class="search-first">
-        <el-form-item>
-          <el-input v-model="searchForm.key_word" placeholder="请输入任务编号/名称" clearable />
-        </el-form-item>
-        <el-form-item label="行政区划:">
-          <el-tree-select
-            popper-class="custom-tree-select"
-            v-model="searchForm.area_code"
-            :data="deptTreeData"
-            :default-expanded-keys="[searchForm.area_code]"
-            check-strictly
-            node-key="id"
-            :props="treeProps"
-            clearable
-            @change="handleNodeClick"
-          />
-        </el-form-item>
-        <el-form-item label="所属机巢:">
-          <el-select
-            :teleported="false"
-            v-model="searchForm.device_sn"
-            placeholder="请选择"
-            clearable
-            @change="handleSearch"
-          >
-            <el-option
-              v-for="item in machineData"
-              :key="item.device_sn"
-              :label="item.nickname"
-              :value="item.device_sn"
-            />
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <el-date-picker
-            popper-class="custom-date-picker"
-            v-model="dateRange"
-            type="daterange"
-            range-separator="至"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-            :value-format="timeFormat"
-            @change="handleDateChange"
-          />
-        </el-form-item>
-        <el-form-item>
-          <div class="time-card">
-            <div
-              class="card-item"
-              :class="item === checked ? 'active' : ''"
-              v-for="(item, index) in timeList"
-              :key="index"
-              @click="timeClick(item, index)"
-            >
-              {{ timeListStr[index] }}
-            </div>
-          </div>
-        </el-form-item>
-        <div class="more" v-if="isExpand" @click="toggleExpand">收起</div>
-        <div class="more" v-else @click="toggleExpand">更多</div>
-        <div class="search-btn" :style="{ bottom: isExpand ? '5px' : '-3px' }">
-
-          <el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button>
-          <el-button icon="el-icon-refresh" @click="handleReset">重置</el-button>
-        </div>
-        <el-form-item label="任务算法:" v-if="isExpand" class="taskAlgorithm">
-          <!-- <TaskAlgorithmBusiness
-          ref="algorithmRef"
-            :setWidth="160"
-            :showAlgorithm="true"
-            @algorithmChange="algorithmChange"
-          /> -->
-          <el-tree-select
-          style="z-index: 1000"
-            :teleported="false"
-            class="custom-tree-select"
-            :style="{ width: pxToRem(186) }"
-            v-model="dictKey"
-            :data="dataList"
-            :default-expanded-keys="[dictKey]"
-            :props="treePropsSF"
-            :render-after-expand="false"
-            :default-checked-keys="checkedKeys"
-            node-key="id"
-            multiple
-            show-checkbox
-            collapse-tags
-            collapse-tags-tooltip
-            clearable
-            @check="handleCheck"
-            @clear="handleClear"
-          />
-        </el-form-item>
-        <el-form-item label="所属部门:" v-if="isExpand">
-          <el-tree-select
-            popper-class="custom-tree-select"
-            v-model="searchForm.create_dept"
-            :data="deptData"
-            :default-expanded-keys="[searchForm.create_dept]"
-            check-strictly
-            node-key="id"
-            :props="treeDeptProps"
-            clearable
-            @change="(id) => handleDeptNodeClick({id})"
-          />
-        </el-form-item>
-        <el-form-item label="任务状态:" v-if="isExpand">
-          <el-select
-          style="z-index: 1000"
-            :teleported="false"
-            v-model="searchForm.status"
-            placeholder="请选择"
-            clearable
-            multiple
-            collapse-tags
-            collapse-tags-tooltip
-              @change="handleSearch"
-          >
-            <el-option
-              v-for="item in statusOptions"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="任务类型:" v-if="isExpand">
-          <el-select
-            :teleported="false"
-            v-model="searchForm.is_circle_job"
-            placeholder="请选择"
-            clearable
-            @change="handleSearch"
-          >
-            <el-option label="周期任务" :value="1" />
-            <el-option label="临时任务" :value="0" />
-          </el-select>
-        </el-form-item>
-      </div>
-    </el-form>
-  </div>
-</template>
-<script setup>
-import { pxToRem } from '@/utils/rem';
-import { ElMessage } from 'element-plus';
-import { deptsByAreaCode, getSFDictionaryTree  } from '@/api/job/task';
-import { getDeptLazyTree } from '@/api/system/dept'
-// import TaskAlgorithmBusiness from './TaskAlgorithmBusiness.vue';
-import dayjs from 'dayjs';
-import { useStore } from 'vuex';
-import { getRegionTreeAll } from '@/api/job/task';
-import { getDeviceRegion } from '@/api/job/task';
-const route = useRoute();
-const store = useStore();
-const userAreaCode = computed(() => store.getters.userInfo.detail.areaCode);
-const selectedAreaCode = computed(() => store.state.user.selectedAreaCode);
-
-const algorithmRef = ref(null)
-const isExpand = ref(false);
-const toggleExpand = () => {
-  isExpand.value = !isExpand.value;
-};
-const timeFormat = 'YYYY-MM-DD HH:mm:ss';
-
-const dateRange = ref([]);
-
-const treeProps = {
-  label: 'name',
-  value: 'id',
-  children: 'childrens',
-};
-const searchForm = reactive({
-  ai_types: [], // 算法类型
-  area_code: userAreaCode.value, // 区域code
-  create_dept: '', // 创建部门
-  date_enum: 'CURRENT_MONTH', // 日期枚举,可用值:TODAY,CURRENT_WEEK,CURRENT_MONTH,CURRENT_YEAR
-  device_sn: '', // 设备编号
-  end_date: null, // 结束时间
-  industry_type: '', // 行业key
-  key_word: '', // 模糊搜索关键词(匹配名称/昵称/设备sn)
-  start_date: null, // 开始时间
-  status: [], // 作业状态
-  is_circle_job: null, // 任务类型
-});
-
-// 从单机巢任务传参值
-const signDevice_sn = ref('');
-
-const statusOptions = [
-  { label: '待执行', value: 1 },
-  { label: '执行中', value: 2 },
-  { label: '已执行', value: 3 },
-  // { label: '已取消', value: 4 },
-  { label: '执行失败', value: 5 },
-  { label: '取消执行', value: 7 },
-];
-
-const emit = defineEmits(['search', 'addTask']);
-
-const algorithmChange = val => {
-  searchForm.ai_types = val;
-  handleSearch()
-};
-
-const businessChange = val => {
-  searchForm.industry_type = val;
-};
-
-let deptData = ref([]);
-// 所属部门信息
-const getDeptsByAreaCode = () => {
-  getDeptLazyTree({ parentId: 0, level: 0 }).then(res => {
-    deptData.value = res.data.data;
-  });
-};
-
-// 部门
-let deptTreeData = ref([]);
-// 机巢
-let machineData = ref([]);
-
-// 记录选中行政区划值
-let area_code_log = ref('')
-// 记录选中部门
-let dept_id_log = ref('')
-
-// 部门下得机巢
-const requestDockInfo = () => {
-  getRegionTreeAll({ parentCode: userAreaCode.value }).then(res => {
-    deptTreeData.value = res.data.data ? [res.data.data] : [];
-
-    area_code_log.value = userAreaCode.value
-    roadDroneList()
-  });
-};
-
-function handleNodeClick(data) {
-  area_code_log.value = data?.id
-  roadDroneList()
-}
-
-// 筛选部门管理
-function handleDeptNodeClick(data) {
-  dept_id_log.value = data.id
-  roadDroneList()
-}
-
-// 算法
-const treePropsSF = {
-    label: 'dictValue',
-    value: 'id',
-    children: 'children',
-}
-// 部门
-const treeDeptProps = {
-  label: 'title',
-  value: 'id',
-  children: 'children',
-}
-const dictKey = ref('')
-const dataList = ref([])
-function getAlgorithmList() {
-  getSFDictionaryTree({code:'SF'}).then((res) => {
-      if (res.data.code === 200) {
-          const result = res.data.data[0].children
-          // 过滤第一层数据
-          const filteredData = result.map(item => {
-              // 过滤第二层数据
-              const children = item.children?.map(child => ({
-                  ...child,
-                  children: [] // 清空第三层数据
-              }))
-              return {
-                  ...item,
-                  children: children || []
-              }
-          })
-          dataList.value = filteredData
-      }
-  })
-}
-
-function handleSFNodeClick(data) {
-    if (data.children && data.children.length) {
-        // 获取子节点dictKey
-        const childDictKeys = data.children.map(child => child.dictKey)
-        searchForm.ai_types = childDictKeys
-    } else {
-        searchForm.ai_types = [data.dictKey]
-    }
-    // 更新列表
-    handleSearch()
-}
-function handleClear() {
-    dictKey.value = ''
-    searchForm.ai_types = []
-    handleSearch()
-}
-
-async function roadDroneList() {
-  // 处理机巢数据
-  searchForm.device_sn = ''
-  machineData.value = ''
-  const droneList = await getDeviceRegion({ area_code: area_code_log.value, dept_id: dept_id_log.value })
-
-  machineData.value = droneList?.data?.data
-  // 默认选中值
-  if (signDevice_sn.value) {
-    searchForm.device_sn = signDevice_sn.value
-  }
-  handleSearch()
-}
-
-// 日期 和周期
-let timeList = ['today', 'week', 'month', 'year'];
-let timeListStr = ['今日', '本周', '本月', '本年'];
-let timeListEnum = ['TODAY', 'CURRENT_WEEK', 'CURRENT_MONTH', 'CURRENT_YEAR'];
-let checked = ref('');
-
-// 根据 周期 获取时间段
-function getDateRange(date_enum) {
-  // 设置对应的日期范围
-  switch (date_enum) {
-    case 'today':
-      dateRange.value = [dayjs().startOf('day').format(timeFormat), dayjs().endOf('day').format(timeFormat)]
-      break
-    case 'week':
-      dateRange.value = [dayjs().startOf('week').format(timeFormat), dayjs().format(timeFormat)]
-      break
-    case 'month':
-      dateRange.value = [dayjs().startOf('month').format(timeFormat), dayjs().format(timeFormat)]
-      break
-    case 'year':
-      dateRange.value = [dayjs().startOf('year').format(timeFormat), dayjs().format(timeFormat)]
-      break
-  }
-}
-
-let timeClick = (item, index) => {
-  if (checked.value === item) {
-    checked.value = null
-    searchForm.date_enum = undefined
-    dateRange.value = []
-  } else {
-    checked.value = item
-    searchForm.date_enum = timeListEnum[index]
-    getDateRange(item)
-  }
-  handleSearch()
-}
-// 搜索
-const handleSearch = () => {
-  if (!dateRange.value) {
-    dateRange.value = [];
-  }
-  // if (dateRange.value && dateRange.value.length) {
-  //   // 有值时 清除 日 本周 本月 本年状态
-  //   checked.value = '';
-  //   searchForm.date_enum = '';
-  // }
-  // 提交至store
-  let params = {
-    ...searchForm,
-    start_date: dateRange.value.length
-      ? dayjs(dateRange?.value[0]).startOf('day').format(timeFormat)
-      : null,
-    end_date: dateRange.value.length
-      ? dayjs(dateRange?.value[1]).endOf('day').format(timeFormat)
-      : null,
-  };
-  store.commit('setTaskSearchParams', params);
-  emit('search', params);
-};
-const handleDateChange = val => {
-  checked.value = null
-  searchForm.date_enum = undefined
-  handleSearch()
-};
-
-// 重置
-const handleReset = () => {
-  dateRange.value = [];
-  Object.keys(searchForm).forEach(key => {
-    searchForm[key] = '';
-  });
-  searchForm.ai_types = [];
-  searchForm.date_enum = 'CURRENT_MONTH';
-  searchForm.area_code = userAreaCode.value;
-  checked.value = 'month';
-  signDevice_sn.value = ''
-  // 清除算法
-  dictKey.value = '';
-	// algorithmRef.value?.clear()
-  area_code_log.value = userAreaCode.value
-  dept_id_log.value = ''
-  roadDroneList()
-  // handleSearch();
-};
-
-// 新增任务
-const addTask = () => {
-  emit('addTask');
-};
-
-// 监听从巡检任务概况提交的数据
-// watch(
-//   () => store.state.task.jumpTask,
-//   newVal => {
-
-//     if (newVal && Object.keys(newVal).length) {
-//       // 兼容当日任务 计划任务 历史任务传参
-//       if (newVal.clickValue) {
-//         checked.value = newVal.clickValue;
-//         searchForm.date_enum = newVal.date_enum;
-//       }
-//       if (newVal.date_value) {
-//         dateRange.value = newVal.date_value;
-//       }
-//       if (newVal.status) {
-//         searchForm.status = newVal.status;
-//       }
-//       if (newVal.device_sn) {
-//         searchForm.device_sn = newVal.device_sn;
-//         // 不直接赋值的原因: 回选会被清空值
-//         signDevice_sn.value = newVal.device_sn;
-//       }
-//     } else {
-//       checked.value = 'today';
-//       searchForm.date_enum = 'TODAY';
-//     }
-//     handleSearch();
-//   },
-//   { immediate: true, deep: true }
-// );
-
-const checkedKeys = ref([])
-
-const handleCheck = (data, { checkedKeys, checkedNodes }) => {
-	dictKey.value = checkedKeys
-	// 获取所有选中节点的 dictKey
-	const selectedDictKeys = checkedNodes.map(node => node.dictKey).filter(Boolean)
-  searchForm.ai_types = selectedDictKeys
-  handleSearch()
-}
-
-onBeforeUnmount(() => {
-  checked.value = 'today';
-  searchForm.date_enum = 'TODAY';
-});
-
-onMounted(() => {
-  requestDockInfo();
-  getDeptsByAreaCode()
-  getAlgorithmList();
-  // 日历传值
-  const calendarday = ref(route.query.day);
-
-  if (calendarday.value) {
-    const date = dayjs(calendarday.value).format(timeFormat);
-
-    const dateArray = [date, date];
-
-    dateRange.value = dateArray;
-    searchForm.date_enum = ''
-    const find = store.state.tags.bsTagList.find(i => i.path === '/job/jobstatistics')
-          find && (find.query = {})
-  } else {
-    checked.value = 'month'
-    getDateRange('month')
-  }
-    // 查询一次
-    // handleSearch()
-});
-</script>
-<style lang="scss"></style>
-<style lang="scss" scoped>
-// .taskAlgorithm {
-// 	:deep() {
-// 		.task-algorithm > div {
-// 			width: 233px !important;
-// 		}
-// 	}
-// }
-.search-box-test {
-  transition: all 0.3s;
-
-  .search-first {
-    position: relative;
-    display: flex;
-    flex-wrap: wrap;
-    align-items: center;
-    gap: 20px 15px; // 设置行间距和列间距
-
-    .more {
-      cursor: pointer;
-      width: 32px;
-      height: 32px;
-      color: #1c5cff;
-      line-height: 32px;
-      font-size: 16px;
-      margin: 0 28px;
-    }
-
-    .search-btn {
-      // position: absolute;
-      // right: 0;
-      display: flex;
-      justify-content: space-between;
-      cursor: pointer;
-      font-size: 14px;
-
-      .btn {
-        width: 80px;
-        height: 32px;
-        border-radius: 4px 4px 4px 4px;
-        line-height: 32px;
-        display: flex;
-        justify-content: center;
-        align-items: center;
-        // margin-left: px;
-        img {
-          width: 14px;
-          height: 14px;
-        }
-      }
-      .search {
-        background: #409eff;
-        color: #fff;
-        margin-right: 10px;
-      }
-      .clear {
-        border: 1px solid #d2d1d1;
-        color: #676767;
-        margin-right: 10px;
-      }
-      .add {
-        background: #ff9243;
-        color: #fff;
-      }
-    }
-
-    .time-card {
-      text-align: center;
-      background: #ffffff;
-      border-radius: 4px 0px 0px 4px;
-      border: 1px solid #e5e5e5;
-      font-family: Source Han Sans CN, Source Han Sans CN;
-      font-weight: 400;
-      font-size: 14px;
-      color: #7c8091;
-      display: flex;
-      height: 32px;
-
-      .card-item {
-        width: 60px;
-        height: 100%;
-        line-height: 32px;
-        cursor: pointer;
-      }
-
-      .active {
-        background: #ffffff;
-        border-radius: 0px 0px 0px 0px;
-        border: 1px solid #1c5cff;
-        color: #1441ff;
-      }
-    }
-  }
-
-  :deep(.el-form) {
-    :deep(.el-input__wrapper.is-disabled) {
-      box-shadow: 0 0 0 1px #026ad6;
-    }
-
-    .el-form-item {
-      margin-bottom: 0;
-      width: 233px;
-      	margin-right: 20px;
-
-      .el-form-item__label {
-        color: #363636;
-        line-height: 32px;
-      }
-    }
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/job/components/TaskAlgorithmBusiness.vue b/applications/task-work-order/src/views/job/components/TaskAlgorithmBusiness.vue
deleted file mode 100644
index 01c1e69..0000000
--- a/applications/task-work-order/src/views/job/components/TaskAlgorithmBusiness.vue
+++ /dev/null
@@ -1,131 +0,0 @@
-<!-- 关联算法和综合业务 -->
-<template>
-  <div class="task-algorithm" v-if="showAlgorithm">
-    <el-select
-        class="ztzf-select"
-        :teleported="false"
-        :style="{ width: pxToRem(setWidth) }"
-        v-model="ai_types"
-        multiple
-        collapse-tags
-        collapse-tags-tooltip
-        placeholder="支持多项选择"
-        clearable
-        @clear="handleClear"
-        @change="handleAlgorithmChange"
-    >
-      <el-option v-for="item in taskAlgorithm" :key="item.id" :label="item.dictValue" :value="item.dictKey" />
-    </el-select>
-  </div>
-  <div class="task-business" v-if="showBusiness">
-    <el-select class="ztzf-select"
-               :teleported="false"
-               :style="{ width: pxToRem(setWidth) }"
-               v-model="industry_type"
-               placeholder="请选择类型"
-               clearable
-               @change="handleBusinessChange"
-    >
-      <el-option v-for="item in taskBusiness" :key="item.id" :label="item.dictValue" :value="item.dictKey" />
-    </el-select>
-  </div>
-</template>
-
-<script setup>
-import { getMultipleDictionary } from '@/api/job/task'
-import { pxToRem } from '@/utils/rem';
-
-// 接收父组件传参
-const props = defineProps({
-  showAlgorithm: {
-    type: Boolean,
-    default: false,
-  },
-  showBusiness: {
-    type: Boolean,
-    default: false,
-  },
-  setWidth: {
-    type: String,
-    default: '100%',
-  },
-})
-
-// 算法
-let ai_types = ref('')
-let taskAlgorithm = ref([])
-// 综合业务
-let industry_type = ref('')
-let taskBusiness = ref([])
-
-// 请求字典字段
-const requestDictionary = () => {
-  getMultipleDictionary('SF,HYLB').then(res => {
-    if (res.code !== 0) {
-      // 处理数据
-      taskAlgorithm.value = res.data.data['SF']
-      taskBusiness.value = res.data.data['HYLB']
-    }
-  })
-}
-const emit = defineEmits(['algorithmChange', 'businessChange'])
-// 算法选择事件
-const handleAlgorithmChange = value => {
-  emit('algorithmChange', value)
-}
-// 业务选择事件
-const handleBusinessChange = value => {
-  emit('businessChange', value)
-}
-
-function handleClear() {
-  ai_types.value = []
-  emit('algorithmChange', [])
-}
-
-defineExpose({
-  handleClear,
-})
-
-onMounted(() => {
-  requestDictionary()
-})
-</script>
-<style scoped lang="scss">
-// :deep(.el-tag, .el-tag.el-tag--primary),
-// :deep(.el-tag.el-tag--info) {
-// 	--el-tag-bg-color: none !important;
-// 	--el-tag-border-color: none !important;
-// 	--el-tag-hover-color: none !important;
-// 	color: #fff !important;
-// }
-::v-deep(.ztzf-select) {
-  .el-select__wrapper {
-    z-index: 1111;
-
-    /* 修改 Tooltip 面板样式 */
-    .el-popper.is-light {
-      background: #fff !important;
-      // box-shadow: none !important;
-      // border: none !important;
-      border-radius: 4px !important;
-
-      .el-select__selection {
-        max-width: 240px !important;
-
-        .el-select__selected-item {
-          .el-tag {
-            // background: #fff !important;
-            // color: #000;
-          }
-        }
-      }
-
-      .el-popper__arrow::before {
-        // background: #fff !important;
-        // border: 1px solid #8d8b8b !important;
-      }
-    }
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/job/components/TaskIntermediateContent/AddTask.vue b/applications/task-work-order/src/views/job/components/TaskIntermediateContent/AddTask.vue
deleted file mode 100644
index 78b7ca1..0000000
--- a/applications/task-work-order/src/views/job/components/TaskIntermediateContent/AddTask.vue
+++ /dev/null
@@ -1,414 +0,0 @@
-<!-- 新建任务 -->
-<template>
-	<el-dialog
-		class="ztzf-dialog"
-		modal-class="add-task"
-		v-model="isShowAddTask"
-		title="新建任务"
-		:width="1500"
-		:close-on-click-modal="false"
-		:destroy-on-close="true"
-		@close="cancel"
-	>
-		<!-- <el-divider content-position="left">新建任务</el-divider> -->
-		<div class="task-contain">
-			<div class="left">
-				<div class="search">
-					<div class="item">
-						<div class="itemchild">任务名称:</div>
-						<el-input class="ztzf-input" v-model="searchForm.name" placeholder="请输入"></el-input>
-					</div>
-					<div class="item">
-						<div class="itemchild">日期选择:</div>
-						<el-date-picker
-							popper-class="custom-date-picker"
-							class="ztzf-date-picker tasktimer"
-							v-model="taskData"
-							type="date"
-							placeholder="请选择日期"
-							value-format="YYYY-MM-DD"
-							:disabled-date="disabledDate"
-						/>
-					</div>
-					<div class="item">
-						<div class="itemchild">任务时间:</div>
-						<el-time-picker
-							style="flex: 1"
-							popper-class="custom-time-picker"
-							class="ztzf-date-picker tasktimer"
-							v-model="timeSlot"
-							placeholder="请选择"
-							format="HH:mm"
-							value-format="HH:mm"
-						/>
-					</div>
-					<div class="item">
-						<div class="itemchild">选择航线:</div>
-
-						<el-select
-							:teleported="false"
-							class="ztzf-select"
-							v-model="searchForm.file_id"
-							@change="getWayLineFile"
-							placeholder="请选择"
-							clearable
-						>
-							<el-option
-								v-for="item in routeOptions"
-								:key="item.wayline_id"
-								:label="item.name"
-								:value="item.wayline_id"
-							/>
-						</el-select>
-					</div>
-					<div class="item">
-						<div class="itemchild">关联算法:</div>
-						<!-- <TaskAlgorithmBusiness :setWidth="220" :showAlgorithm="true" @algorithmChange="algorithmChange" /> -->
-					</div>
-					<div class="item">
-						<div class="itemchild">任务描述:</div>
-						<el-input class="ztzf-input" v-model="searchForm.remark" placeholder="请输入"></el-input>
-					</div>
-				</div>
-				<div class="lines">
-					<div class="wayline-type">
-						<el-radio-group v-model="waylineType" @change="radioChange">
-							<el-radio :value="1" label="单点航线"></el-radio>
-							<el-radio :value="2" label="智能规划选区"></el-radio>
-						</el-radio-group>
-					</div>
-					<!-- <TaskMap
-						class="wayline-map"
-						:wayLineFile="wayLineFile"
-						:waylineModel="waylineModel"
-						:checkedTableData="checkedTableData"
-						:waylineTypeTest="waylineType"
-						@clickPosition="clickSignPosition"
-						@saveWayline="savePlanerWayline"
-					/> -->
-				</div>
-			</div>
-			<div class="right">
-				<TaskTable
-					ref="taskTableRef"
-					:waylineId="waylineId"
-					:waylineModel="waylineModel"
-					:waylineType="waylineType"
-					:singlePoint="singlePoint"
-					:planarPoints="planarPoints"
-					@update:selected="handleSelected"
-				/>
-				<div class="btn">
-					<!-- <img @click="cancel" src="@/assets/images/task/cancel.png" alt="" /> -->
-					<img
-						@click="!loading && submitClick()"
-						:style="{ opacity: loading ? 0.5 : 1, cursor: loading ? 'not-allowed' : 'pointer' }"
-						src="@/assets/images/task/publish.png"
-						alt=""
-					/>
-				</div>
-			</div>
-		</div>
-	</el-dialog>
-</template>
-
-<script setup>
-import { ElMessage } from 'element-plus'
-import { pxToRem } from '@/utils/rem'
-import { getWaylineList, createTask } from '@/api/job/task'
-// import TaskAlgorithmBusiness from '../components/TaskAlgorithmBusiness.vue'
-// import TaskMap from './TaskMap.vue'
-import TaskTable from './TaskTable.vue'
-import { useRouter } from 'vue-router'
-const router = useRouter()
-
-const emit = defineEmits(['refresh'])
-
-const rangDate = ref([])
-// 航线ID
-const waylineId = ref('')
-// 航线文件
-const wayLineFile = ref('')
-// 航线类型
-const waylineType = ref(3)
-// 添加子组件引用
-const taskTableRef = ref(null)
-const taskData = ref('')
-const timeSlot = ref('')
-const searchForm = reactive({
-	name: '',
-	ai_types: [],
-	file_id: '',
-	begin_time: '',
-	end_time: '',
-	execute_time_arr: '',
-	remark: '',
-	type: waylineType.value,
-	dock_sns: [],
-	longitude: '',
-	latitude: '',
-	polygon: [],
-})
-const isShowAddTask = defineModel('show')
-
-const loading = ref(false)
-
-// 禁用当天之前的日期
-const disabledDate = time => {
-	return time.getTime() < Date.now() - 8.64e7 // 86400000 = 24 * 60 * 60 * 1000
-}
-
-// 获取航线列表数据
-const routeOptions = ref([])
-const getRouteList = async () => {
-	const res = await getWaylineList()
-	if (res.data.code === 0) {
-		routeOptions.value = res.data.data
-	}
-}
-// 关联算法
-const algorithmChange = val => {
-	searchForm.ai_types = val
-}
-
-// 切换航线类型
-const radioChange = val => {
-	// 清空选中航线值
-	searchForm.file_id = ''
-	// 航线ID也清空
-	waylineId.value = ''
-	wayLineFile.value = ''
-	waylineType.value = val
-	searchForm.type = val
-	// 清空列表数据
-	nextTick(() => {
-		if (taskTableRef.value) {
-			taskTableRef.value.clearTableData()
-		}
-	})
-}
-// 航线类型
-const waylineModel = ref('')
-// 航线类型
-const judgeWaylineMode = route => {
-	if (route.wayline_type == '2' || route.wayline_type == '4') {
-		waylineModel.value = 'planar'
-	} else {
-		waylineModel.value = 'point'
-	}
-}
-
-// 获取航线文件
-const getWayLineFile = async val => {
-	searchForm.type = 0
-	waylineType.value = 0
-	waylineId.value = val
-	const currentRoute = routeOptions.value.find(item => item.wayline_id === val)
-	wayLineFile.value = currentRoute?.object_key || ''
-	judgeWaylineMode(currentRoute)
-}
-
-// 获取选中机场列表数据,并且发布
-let checkedTableData = ref([])
-const handleSelected = val => {
-	searchForm.dock_sns = val.map(item => item.device_sn)
-	checkedTableData.value = val
-}
-
-// 地图点击事件 表格重新刷新数据
-let singlePoint = ref({})
-const clickSignPosition = val => {
-	singlePoint.value = val
-	searchForm.longitude = val.longitude
-	searchForm.latitude = val.latitude
-}
-
-// 保存面状航线
-let planarPoints = ref([])
-const savePlanerWayline = val => {
-	planarPoints.value = val
-	const polygonArray = val.map(point => [point.longitude, point.latitude])
-	searchForm.polygon = polygonArray
-}
-
-// 提交
-const submitClick = () => {
-	if (loading.value) return
-	if (!taskData.value) {
-		ElMessage({
-			message: '请选择任务日期',
-			type: 'warning',
-		})
-		return
-	}
-	if (!searchForm.name) {
-		ElMessage({
-			message: '请输入任务名称',
-			type: 'warning',
-		})
-		return
-	}
-	// 检查任务时间
-	if (timeSlot.value) {
-		const now = new Date()
-		const today = now.toDateString()
-		const selectedDate = new Date(taskData.value).toDateString()
-
-		if (today === selectedDate) {
-			const [hours, minutes] = timeSlot.value.split(':')
-			const selectedTime = new Date()
-			selectedTime.setHours(parseInt(hours), parseInt(minutes))
-
-			if (selectedTime < now) {
-				ElMessage({
-					message: '任务时间不能小于当前时间',
-					type: 'warning',
-				})
-				return
-			}
-		}
-	}
-	if (searchForm.dock_sns.length === 0) {
-		ElMessage({
-			message: '请选择机场',
-			type: 'warning',
-		})
-		return
-	}
-	loading.value = true
-	searchForm.begin_time = `${taskData.value} 00:00:00`
-	searchForm.end_time = `${taskData.value} 23:59:59`
-	searchForm.execute_time_arr = timeSlot.value ? [timeSlot.value] : []
-	createTask(searchForm)
-		.then(res => {
-			if (res.data.code === 0) {
-				ElMessage.success('任务创建成功')
-				// 关闭当前窗口,刷新任务管理列表
-				isShowAddTask.value = false
-				if (searchForm.dock_sns.length === 1) {
-					// 清除数据
-					cancel()
-					emit('refresh')
-				} else {
-					// 超过两个机场 跳转至集群调度
-					store.commit('setSaveTaskId', res?.data.data.id)
-					router.push({ path: '/clusterScheduling' })
-				}
-			}
-		})
-		.catch(err => {
-			loading.value = false
-			console.log(err)
-		})
-		.finally(() => {
-			loading.value = false
-		})
-}
-const cancel = () => {
-	isShowAddTask.value = false
-	// 清除搜索数据
-	searchForm.name = ''
-	searchForm.ai_types = []
-	searchForm.file_id = ''
-	searchForm.begin_time = ''
-	searchForm.end_time = ''
-	timeSlot.value = ''
-	searchForm.remark = ''
-	searchForm.dock_sns = []
-	rangDate.value = []
-	waylineId.value = ''
-	wayLineFile.value = ''
-	taskData.value = ''
-}
-
-onMounted(() => {
-	getRouteList()
-})
-</script>
-
-<style lang="scss">
-.add-task {
-	.el-pagination {
-		text-align: left;
-		padding: 20px;
-	}
-}
-/* 修改日期单元格背景色 */
-// .custom-date-picker .el-picker-panel__body {
-// 	background: #012350 !important;
-// 	color: #fff !important;
-// }
-</style>
-
-<style lang="scss" scoped>
-.task-contain {
-	display: flex;
-	padding: 20px 32px 32px 27px;
-	.left {
-		width: 1330px;
-		margin-right: 34px;
-		.search {
-			display: grid;
-			grid-template-columns: repeat(3, 1fr);
-			grid-template-rows: repeat(2, 1fr);
-			gap: 30px; // 增加间距使布局更合理
-			margin-bottom: 8px; // 添加底部间距
-			.item {
-				position: relative;
-				display: flex;
-				align-items: center;
-				font-size: 16px;
-				color: #ffffff;
-				.itemchild {
-					width: 68px;
-					white-space: nowrap;
-					margin-right: 5px;
-				}
-				// :deep(.el-date-editor.el-input__wrapper) {
-				// 	width: 200px; // 调整日期选择器宽度
-				// }
-			}
-		}
-	}
-	.right {
-		width: 366px;
-		display: flex;
-		flex-direction: column;
-		justify-content: space-between;
-
-		.btn {
-			display: flex;
-			justify-content: center;
-			align-items: center;
-			img {
-				width: 137px;
-				height: 32px;
-				cursor: pointer;
-			}
-		}
-	}
-	:deep(.tasktimer .el-input__wrapper) {
-		background: none !important;
-		color: #8ac3fd !important;
-	}
-	:deep(.el-input .el-input__icon) {
-		color: #fff !important;
-	}
-	:deep(.el-input__inner) {
-		color: #8ac3fd !important;
-		&::placeholder {
-			color: #8ac3fd !important;
-		}
-	}
-	:deep(.el-radio__inner) {
-		background: none !important;
-		border: 1px solid #1b5d9a !important;
-	}
-	:deep(.el-radio__label) {
-		color: #fff !important;
-	}
-	:deep(.el-radio__inner:after) {
-		background: #65b5ff !important;
-	}
-}
-</style>
diff --git a/applications/task-work-order/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue b/applications/task-work-order/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
deleted file mode 100644
index 4d26ed2..0000000
--- a/applications/task-work-order/src/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue
+++ /dev/null
@@ -1,382 +0,0 @@
-<!-- 任务统计表格 -->
-<template>
-	<div class="task-intermediate-content">
-		<SearchBox @search="searchClick" @addTask="handleAddTask"></SearchBox>
-		<div class="task-table">
-			<el-table border :data="jobListData" class="custom-header">
-				<el-table-column label="序号" type="index" width="60">
-					<template #default="{ $index }">
-						{{ ($index + 1 + (jobListParams.current - 1) * jobListParams.size).toString().padStart(2,
-							'0') }}
-					</template>
-				</el-table-column>
-        <el-table-column prop="job_info_num" label="任务编号" width="160">
-          <template #default="scope">
-            <el-tooltip-copy :content="scope.row.job_info_num" :showCopyText="true">
-              {{scope.row.job_info_num}}
-            </el-tooltip-copy>
-          </template>
-        </el-table-column>
-        <el-table-column prop="name" label="任务名称" width="160">
-          <template #default="scope">
-            <el-tooltip-copy :content="scope.row.name" :showCopyText="true">
-              {{scope.row.name}}
-            </el-tooltip-copy>
-          </template>
-        </el-table-column>
-				<el-table-column prop="device_names" label="所属机巢" show-overflow-tooltip/>
-				<el-table-column prop="ai_type_str" label="关联算法" show-overflow-tooltip align="center" />
-				<el-table-column label="任务状态" align="center">
-					<template #default="scope">
-						<div class="base_f_c_c">
-						<span :style="{
-							color:
-								scope.row.status === 1
-									? '#00CDC2'
-									: scope.row.status === 2
-										? '#FF720F'
-										: scope.row.status === 3
-											? '#00AA2D'
-											: scope.row.status === 5
-												? '#FF4848'
-												: scope.row.status === 7
-													? '#A6A6A6'
-													: '',
-						}">
-							{{ scope.row.status ? getStatusText(scope.row.status) : '' }}
-						</span>
-						<el-tooltip
-								class="item"
-								effect="dark"
-								:content="scope.row.reason"
-								placement="top"
-								popper-class="reasonNotFly ztzf-tooltip-box1"
-							>
-								<el-icon v-if="scope.row.status === 5 && scope.row.reason" color="#FF4848"><QuestionFilled /></el-icon>
-							</el-tooltip>
-						</div>
-					</template>
-				</el-table-column>
-				<el-table-column prop="is_circle_job" label="任务类型" align="center">
-					<template #default="scope">
-						<span>{{ scope.row.rep_rule_type ? '周期任务' : '临时任务' }}</span>
-					</template>
-				</el-table-column>
-				<!-- <el-table-column prop="job_num" label="执行次数" /> -->
-				<el-table-column prop="event_number" label="关联事件" align="center">
-					<template #default="scope">
-						<span>{{ scope.row.event_number ? scope.row.event_number : '/' }}</span>
-					</template>
-				</el-table-column>
-				<el-table-column prop="cycle_time_value" label="任务时间" show-overflow-tooltip />
-        <el-table-column prop="dept_name" label="创建部门" width="200" align="center" />
-				<el-table-column prop="creator_name" label="创建人" align="center" show-overflow-tooltip />
-				<el-table-column label="操作" :width="pxToRemNum(200)" align="center">
-					<template #default="scope">
-						<!-- <el-button type="text" @click="rejectDetail(row.id)">驳回原因</el-button> -->
-						<el-button icon="el-icon-back" v-if="scope.row.status === 2" type="text"
-							@click="turnBack(scope.row)">
-							返航
-						</el-button>
-						<el-button icon="el-icon-close" v-if="scope.row.status === 1" type="text"
-							@click="cancelTask(scope.row)">
-							取消任务
-						</el-button>
-						<el-button icon="el-icon-view" type="text" @click="handleDetail(scope.row)">查看</el-button>
-					</template>
-				</el-table-column>
-        <template #empty>
-          <el-empty
-            class="custom-empty"
-            :image-size="100"
-          >
-            <template #description>
-              <span class="custom-text">暂无数据</span>
-            </template>
-          </el-empty>
-        </template>
-			</el-table>
-		</div>
-		<div class="pagination" v-if="jobListData.length > 0">
-			<el-pagination class="ztzf-pagination" popper-class="custom-pagination-dropdown" background
-				:page-sizes="[10, 20, 30, 40, 50, 100]" :size="size" v-model:current-page="jobListParams.current"
-				v-model:page-size="jobListParams.size" layout="total, sizes, prev, pager, next, jumper" :total="total"
-				@size-change="handleSizeChange" @current-change="handleCurrentChange" />
-		</div>
-	</div>
-	<!-- 添加任务 -->
-	<AddTask v-model:show="isShowAddTask" @refresh="refreshGetJobList" />
-	<!-- 当前任务详情 -->
-	<!-- <CurrentTaskDetails
-		v-if="isShowCurrentTaskDetails"
-		v-model:show="isShowCurrentTaskDetails"
-		:wayLineJobInfoId="rowData.id"
-	/> -->
-	<!-- 历史任务详情 -->
-	<DeviceJobDetails v-if="isShowDeviceJobDetails" v-model:show="isShowDeviceJobDetails" :wayLineJobInfoId="rowData.id"
-		:batchNo="rowData.batch_no" :jobId="jobId" :waylineJobId="rowData.wayline_job_id"/>
-	<CancelTaskDialog ref="cancelTaskDialogRef" v-model:isShowCancelTask="isShowCancelTask" :row-data="rowData"
-		@refresh="getJobList" />
-</template>
-
-<script setup>
-import SearchBox from '../SearchBox.vue'
-import AddTask from './AddTask.vue'
-import { pxToRem, pxToRemNum } from '@/utils/rem'
-// import CurrentTaskDetails from '@/components/CurrentTaskDetails/CurrentTaskDetails.vue'
-import { jobList, cancelJobs, taskReturnLines, returnHomeCluster, statusChangedApi } from '@/api/job/task';
-import { ElMessage } from 'element-plus'
-import DeviceJobDetails from '../DeviceJobDetails.vue'
-import CancelTaskDialog from '../CancelTaskDialog.vue'
-import { useStore } from 'vuex'
-import { cloneDeep } from 'lodash'
-import { inject, onBeforeUnmount } from 'vue';
-import ElTooltipCopy from '@/components/ElTooltipCopy.vue';
-const store = useStore()
-const singleUavHome = computed(() => store.state.home.singleUavHome)
-const jobListParams = reactive({
-	current: 1,
-	size: 10,
-	searchParams: {},
-})
-const jobListData = ref([])
-const total = ref(0)
-let isShowDeviceJobDetails = ref(false)
-let isShowCurrentTaskDetails = ref(false)
-let isShowCancelTask = ref(false)
-const cancelTaskDialogRef = ref(null)
-
-// 获取任务列表
-const getJobList = () => {
-	const apiParams = {
-		...cloneDeep(jobListParams),
-		searchParams: {
-			...cloneDeep(jobListParams.searchParams),
-			status_list: jobListParams.searchParams.status || undefined,
-			status: undefined,
-		},
-	}
-	jobList(apiParams).then(res => {
-		if (res.data.code !== 0) return
-		jobListData.value = res.data.data.records
-		total.value = res.data.data.total
-	})
-}
-// 状态文字
-const getStatusText = status => {
-	const statusMap = {
-		1: '待执行',
-		2: '执行中',
-		3: '已执行',
-		4: '已取消',
-		5: '执行失败',
-		7: '取消执行',
-	}
-	return statusMap[status] || '-'
-}
-
-// 查看当前任务详情 如果是一台机则显示详情 如果是多台机则进入集群调度(暂未开发)
-let rowData = ref({})
-const jobId = ref('')
-const handleDetail = row => {
-	if (!row.device_sns.length) return ElMessage.warning('没有device_sns')
-	rowData.value = row ? row : {}
-	if (row.device_sns.length > 1 && (row.status === 2 || row.status === 1)) {
-		const adminUrl = `${import.meta.env.VITE_APP_AREA_NAME}/command-center-dashboard/#/clusterScheduling`
-		const targetPath = `taskNo=${encodeURIComponent(rowData.value.job_info_num)}`
-		window.open(`${adminUrl}?${targetPath}`, '_blank')
-		return
-	}
-	jobId.value = rowData.value?.job_id
-	if (row.status === 2 || row.status === 1) {
-		// isShowCurrentTaskDetails.value = true
-		// 跳转大屏当前任务详情
-		const adminUrl = `${import.meta.env.VITE_APP_AREA_NAME}/command-center-dashboard/#/taskManage`
-		const targetPath = `id=${encodeURIComponent(rowData.value.id)}&batchNo=${encodeURIComponent(rowData.value.batch_no)}&dockSn=${encodeURIComponent(rowData.value.device_sns[0])}`
-		window.open(`${adminUrl}?${targetPath}`, '_blank')
-	} else {
-		isShowDeviceJobDetails.value = true
-	}
-}
-
-// 分页大小改变
-const handleSizeChange = val => {
-	jobListParams.size = val
-	getJobList()
-}
-
-// 页码改变
-const handleCurrentChange = val => {
-	jobListParams.current = val
-	getJobList()
-}
-
-// 传参查询条件
-const searchClick = params => {
-	jobListParams.current = 1
-	jobListParams.size = 10
-	jobListParams.searchParams = params
-	getJobList()
-}
-
-const refreshGetJobList = () => {
-	jobListParams.current = 1
-	jobListParams.size = 10
-	getJobList()
-}
-
-// 新建任务
-const isShowAddTask = ref(false)
-const handleAddTask = () => {
-	isShowAddTask.value = true
-}
-
-const tableRowClassName = ({ row, rowIndex }) => {
-	if (rowIndex % 2 === 1) {
-		return 'warning-row'
-	} else {
-		return 'success-row'
-	}
-}
-// 取消任务 0 取消全部 1取消单条
-const cancelTask = row => {
-	if (row.execute_time_arr?.length && row.execute_time_arr?.length > 0) {
-		rowData.value = row
-		isShowCancelTask.value = true
-	} else {
-		cancelTaskDialogRef.value.submitCancelTask(row, 1)
-	}
-}
-// 返航
-const turnBack = row => {
-	if (row.returnStatus === '待机') return
-
-	if (row.returnStatus === '自动返航') return ElMessage.success('无人机返航中')
-
-	if (row.returnStatus === '自动降落') return ElMessage.success('无人机降落中')
-	returnHomeCluster(row.device_sns).then(res => {
-		if (res.data.code !== 0) return
-		ElMessage.success('返航操作成功')
-		getJobList()
-	})
-}
-
-function handleCellClick(row, column) {
-	if (column.no === 1) {
-		navigator.clipboard.writeText(row.job_info_num).then(() => {
-			ElMessage.success('复制任务编号成功')
-		})
-	} else if (column.no === 2) {
-		navigator.clipboard.writeText(row.name).then(() => {
-			ElMessage.success('复制任务名称成功')
-		})
-	}
-}
-
-
-const changeKey = inject('changeKey')
-const jobUpdateKey = computed(() => store.state.common.jobUpdateKey)
-const deviceUpdateKey = computed(() => store.state.common.deviceUpdateKey)
-
-watch([jobUpdateKey,deviceUpdateKey],()=>{
-  getJobList()
-  changeKey.value++
-})
-
-onBeforeUnmount(() => {
-  // clearInterval(polling)
-})
-
-onMounted(() => {
-	// getJobList()
-})
-</script>
-
-<style lang="scss" scoped>
-.task-intermediate-content {
-	height: 0;
-	flex: 1;
-	margin: 0 10px 10px 10px;
-	background-color: #ffffff;
-	padding: 10px 20px;
-	border-radius: 5px;
-	display: flex;
-	flex-direction: column;
-
-	// 表格
-	.task-table {
-		height: 0;
-		flex: 1;
-		margin-top: 18px;
-		overflow: auto;
-    :deep(.el-scrollbar__view) {
-      height: 100%;
-    }
-    :deep(.el-table--fit,.el-scrollbar__view) {
-      height: 100%;
-    }
-	}
-
-  .custom-empty {
-    //font-family: Source Han Sans CN, Source Han Sans CN;
-    //margin-top: 15%;
-    //.custom-text {
-    //  color: #fff;
-    //  font-size: 16px;
-    //}
-  }
-
-	.btnItem {
-		height: 27px;
-		line-height: 27px;
-		border-radius: 0px 0px 0px 0px;
-		border: 1px solid #51a8ff;
-		font-family: Segoe UI, Segoe UI;
-		font-weight: 400;
-		font-size: 14px;
-		color: #1C5CFF;
-		padding: 0 10px;
-		display: inline-block;
-		margin-right: 10px;
-		cursor: pointer;
-
-		&.turnBack {
-			border: 1px solid #ffa500;
-			color: #ffa500;
-		}
-
-		&.cancelTask {
-			border: 1px solid #00AA2D;
-			color: #00AA2D;
-		}
-	}
-
-	// :deep(.el-table) {
-	// 		--el-table-tr-bg-color: #ffffff;
-	// 		--el-table-striped-bg-color: #EFEFEF;
-
-	// 		.el-table__body tr.el-table__row--striped td {
-	// 			background-color: var(--el-table-striped-bg-color);
-	// 		}
-	// }
-	// 分页
-	:deep(.custom-header th.el-table__cell) {
-		color: rgba(0, 0, 0, 0.85);
-	}
-
-	:deep(.el-table td.el-table__cell) {
-		color: #606266;
-	}
-
-	:deep(.el-pagination) {
-		display: flex;
-    padding: 20px 0;
-		justify-content: right;
-	}
-
-	:deep(.el-pagination button) {
-		background: center center no-repeat none !important;
-		color: #8eb8ea !important;
-	}
-}
-</style>
diff --git a/applications/task-work-order/src/views/job/components/TaskIntermediateContent/TaskTable.vue b/applications/task-work-order/src/views/job/components/TaskIntermediateContent/TaskTable.vue
deleted file mode 100644
index 88c857f..0000000
--- a/applications/task-work-order/src/views/job/components/TaskIntermediateContent/TaskTable.vue
+++ /dev/null
@@ -1,252 +0,0 @@
-<template>
-	<div class="table-container ztzf-table">
-		<div class="taskTableTitle"><span>可飞行机巢列表</span></div>
-		<el-table
-			:data="tableData"
-			:row-style="{ height: '38px', fontSize: '14px', 'text-align': 'center' }"
-			:header-cell-style="{ 'text-align': 'center', height: '36px', fontSize: '14px' }"
-			@selection-change="handleSelectionChange"
-		>
-			<el-table-column type="selection" :selectable="checkSelectable" />
-			<el-table-column type="index" label="序号">
-				<template #default="{ $index }">
-					{{ ($index + 1).toString().padStart(2, '0') }}
-				</template>
-			</el-table-column>
-			<el-table-column prop="nickname" label="机巢名称" />
-			<el-table-column prop="estimated_arrival_time" label="预计到达时间(min)" />
-			<el-table-column prop="flight_range" label="执行里程(km)" />
-		</el-table>
-		<div class="pagination">
-			<el-pagination
-				class="ztzf-pagination"
-				v-model:current-page="pagingParams.page"
-				v-model:page-size="pagingParams.size"
-				layout=" prev, pager, next"
-				:total="total"
-				@size-change="handleSizeChange"
-				@current-change="handleCurrentChange"
-			/>
-		</div>
-	</div>
-</template>
-
-<script setup>
-import { getFlyingNestBy } from '@/api/job/task'
-import _ from 'lodash'
-
-const props = defineProps({
-	waylineId: {
-		type: String,
-		default: '',
-	},
-	waylineType: {
-		type: Number,
-		default: 3,
-	},
-	singlePoint: {
-		type: Object,
-		default: () => ({}),
-	},
-	waylineModel: {
-		type: String,
-		default: '',
-	},
-	planarPoints: {
-		type: Array,
-		default: () => [],
-	},
-})
-
-// 选中的数据
-const selectedRows = ref([])
-// 分页参数
-let pageParams = ref({
-	wayline_id: props.waylineId,
-	type: props.waylineType,
-	longitude: props.singlePoint.longitude,
-	latitude: props.singlePoint.latitude,
-	polygon: [],
-})
-let pagingParams = ref({
-	current: 1,
-	size: 10,
-})
-// 获取可用机巢列表数据
-const total = ref(0)
-const tableData = ref([])
-const getNestList = async () => {
-	tableData.value = []
-	const res = await getFlyingNestBy(pageParams.value, pagingParams.value)
-	if (res.data.code === 0) {
-		tableData.value = (res.data?.data || []).map((item, index) => ({
-			...item,
-			estimated_arrival_time: item.estimated_arrival_time > 0 ? _.round(item.estimated_arrival_time / 60, 0) : 0,
-			flight_range: item.flight_range > 0 ? _.round(item.flight_range / 1000, 0) : 0,
-		}))
-	}
-}
-// 分页大小改变
-const handleSizeChange = val => {
-	pagingParams.value.size = val
-	getNestList()
-}
-
-// 页码改变
-const handleCurrentChange = val => {
-	pagingParams.value.current = val
-	getNestList()
-}
-
-// 刷新数据
-const refreshData = () => {
-	tableData.value = []
-	pagingParams.value.current = 1
-	getNestList()
-}
-
-const emit = defineEmits(['update:selected'])
-const handleSelectionChange = val => {
-	// 如果不是智能规划选区模式,才更新所有选中数据
-	if (props.waylineType !== 2) {
-		selectedRows.value = val
-		emit('update:selected', val)
-	} else {
-		// 如果是智能规划选区模式,更新选中数据
-		if (val.length > 1) {
-			const lastSelected = selection[selection.length - 1]
-			selectedRows.value = [lastSelected]
-			emit('update:selected', selectedRows.value)
-		} else {
-			emit('update:selected', val)
-		}
-	}
-}
-
-// 控制表格行是否可选
-const checkSelectable = row => {
-	if (props.waylineType === 2) {
-		// 如果已经有选中的行,且当前行未被选中,则不允许选择
-		return selectedRows.value.length === 0 || selectedRows.value.some(selected => selected.device_sn === row.device_sn)
-	}
-	return true
-}
-
-// 处理单行选择
-// const handleSelect = (selection, row) => {
-// 	console.log(55555, selection)
-// 	if (props.waylineType === 2) {
-// 		// 如果是智能规划选区模式,确保只能选中一行
-// 		if (selection.length === 0) {
-// 		}
-// 		if (selection.length > 1 || selection.length === 1) {
-// 			// 保留最后选中的那一行
-// 			const lastSelected = selection[selection.length - 1]
-// 			selectedRows.value = [lastSelected]
-// 			// 触发更新事件
-// 			console.log('99999', selectedRows.value)
-// 			emit('update:selected', selectedRows.value)
-// 		}
-// 	}
-// }
-
-// 监听航线ID变化
-watch(
-	() => props.waylineId,
-	newVal => {
-		pageParams.value.type = 0
-		if (newVal && props.waylineModel === 'point') {
-			pageParams.value.wayline_id = newVal
-			refreshData()
-		} else {
-			// 数据为空时,清除列表数据
-			tableData.value = []
-		}
-	},
-	{ deep: true }
-)
-
-// 监听单点返回的数据
-watch(
-	() => props.singlePoint,
-	newVal => {
-		pageParams.value.wayline_id = ''
-		pageParams.value.type = 1
-		if (newVal && newVal.latitude && newVal.longitude) {
-			pageParams.value.latitude = newVal.latitude
-			pageParams.value.longitude = newVal.longitude
-			refreshData()
-		}
-	},
-	{ deep: true }
-)
-
-// 监听面状航线返回的数据
-watch(
-	() => props.planarPoints,
-	newVal => {
-		pageParams.value.wayline_id = ''
-		pageParams.value.type = 2
-		if (newVal && newVal.length > 0) {
-			const polygonArray = newVal.map(point => [point.longitude, point.latitude])
-			pageParams.value.polygon = polygonArray
-			refreshData()
-		}
-	},
-	{ deep: true }
-)
-
-// 暴露给父组件的方法
-const clearTableData = () => {
-	tableData.value = []
-}
-defineExpose({
-	clearTableData,
-})
-// 表格隔行变色
-const tableRowClassName = ({ row, rowIndex }) => {
-	if (rowIndex % 2 === 1) {
-		return 'warning-row'
-	} else {
-		return 'success-row'
-	}
-}
-onMounted(() => {})
-</script>
-
-<style lang="scss" scoped>
-.table-container {
-	.pagination {
-		margin-top: 10px;
-	}
-	:deep(.cell) {
-		padding: 0;
-		margin: 0;
-		// border: 1px solid red;
-		// width: 20px;
-	}
-	// 分页
-	:deep(.el-pagination) {
-		display: flex;
-		justify-content: center;
-	}
-	.taskTableTitle {
-		margin-bottom: 16px;
-		background: url('/src/assets/images/signMachineNest/machineRight/detailtitle.png') no-repeat center;
-		background-size: 100% 100%;
-		span {
-			display: inline-block;
-			margin-left: 10px;
-			font-size: 16px;
-			color: #ddf0ff;
-			line-height: 20px;
-			text-align: left;
-			margin-bottom: 8px;
-		}
-	}
-	:deep(.el-checkbox__inner) {
-		background: none !important;
-		border: 1px solid #3194ef !important;
-	}
-}
-</style>
diff --git a/applications/task-work-order/src/views/job/components/TaskTop/TaskEvent.vue b/applications/task-work-order/src/views/job/components/TaskTop/TaskEvent.vue
deleted file mode 100644
index 9f39ef2..0000000
--- a/applications/task-work-order/src/views/job/components/TaskTop/TaskEvent.vue
+++ /dev/null
@@ -1,155 +0,0 @@
-<!-- 任务事件数量比统计 -->
-<template>
-	<div class="task-event">
-		<div class="title">任务事件数量比统计</div>
-		<div class="chart" ref="chartRef"></div>
-	</div>
-</template>
-
-<script setup>
-import * as echarts from 'echarts'
-import { jobEventBar } from '@/api/job/task'
-import dayjs from 'dayjs'
-import useEchartsResize from '@/hooks/useEchartsResize'
-import { useStore } from 'vuex'
-
-const store = useStore()
-
-// const setTaskSearchParams = computed(() => store.state.task.setTaskSearchParams);
-
-// 日期
-const currenDate = dayjs().format('YYYY-MM-DD')
-const newTime = ref([currenDate, currenDate])
-// 图表
-const chartRef = ref(null)
-let { chart } = useEchartsResize(chartRef)
-
-const option = {
-	tooltip: {
-		trigger: 'axis',
-		axisPointer: {
-			type: 'shadow',
-		},
-	},
-	legend: {
-		itemWidth: 8,
-		itemHeight: 12,
-		data: ['任务', '事件'],
-		top: '2%',
-		textStyle: {
-			color: '#6B90B5',
-			fontSize: 12,
-		},
-	},
-	grid: {
-		top: '15%',
-		left: '3%',
-		right: '4%',
-		bottom: '2%',
-		containLabel: true,
-	},
-	xAxis: {
-		type: 'category',
-		// data: ['1月', '2月', '3月', '4月', '5月', '6月'],
-		axisLine: {
-			show: true, // 隐藏轴线
-		},
-		axisLabel: {
-			color: '#5B5B5D',
-		},
-	},
-	yAxis: {
-		type: 'value',
-		axisLine: {
-			lineStyle: {
-				color: '#363636',
-			},
-		},
-		splitLine: {
-			lineStyle: {
-				color: 'rgba(255, 255, 255, 0.1)',
-			},
-		},
-		axisLabel: {
-			color: '#5B5B5D',
-		},
-	},
-	series: [
-		{
-			name: '任务',
-			type: 'bar',
-			barWidth: 6,
-			itemStyle: {
-				color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-					{ offset: 0, color: '#FF8902' },
-					{ offset: 1, color: '#FF8902' },
-				]),
-			},
-		},
-		{
-			name: '事件',
-			type: 'bar',
-			barWidth: 6,
-			itemStyle: {
-				color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-					{ offset: 0, color: '#4363FF' },
-					{ offset: 1, color: '#4363FF' },
-				]),
-			},
-		},
-	],
-}
-
-// 获取行业统计数据
-const getJobEventBar = value => {
-  const params = {
-    ...value,
-    status_list:value.status,
-    status:undefined
-  }
-	jobEventBar(params).then(res => {
-		if (res.data.code !== 0) return
-		option.xAxis.data = res.data.data.map(item => item.name)
-		option.series[0].data = res.data?.data.map(item => item.data[0].value)
-		option.series[1].data = res.data?.data.map(item => item.data[1].value)
-		chart.value.setOption(option)
-	})
-}
-
-const changeKey = inject('changeKey')
-// 添加监听
-watch(
-  () => [store.state.task.taskSearchParams, changeKey.value],
-  () => getJobEventBar(store.state.task.taskSearchParams),
-  { deep: true }
-)
-</script>
-
-<style lang="scss" scoped>
-.task-event {
-	width: 0;
-	flex: 1;
-	height: 100%;
-	margin-left: 10px;
-	background: #FFFFFF;
-	border-radius: 8px 8px 8px 8px;
-
-	.title {
-		padding: 10px 0 10px 16px;
-		width: 144px;
-		height: 18px;
-		font-family: Segoe UI, Segoe UI;
-		font-weight: bold;
-		font-size: 16px;
-		color: #363636;
-		line-height: 18px;
-	}
-
-	.chart {
-		padding: 6px 0px;
-		width: 100%;
-		height: 166px;
-
-	}
-}
-</style>
diff --git a/applications/task-work-order/src/views/job/components/TaskTop/TaskIndustry.vue b/applications/task-work-order/src/views/job/components/TaskTop/TaskIndustry.vue
deleted file mode 100644
index 58c3ed8..0000000
--- a/applications/task-work-order/src/views/job/components/TaskTop/TaskIndustry.vue
+++ /dev/null
@@ -1,117 +0,0 @@
-<!-- 任务算法统计 -->
-<template>
-	<div class="task-industry">
-		<div class="title">机巢事件数量占比</div>
-		<div class="chart" ref="chartRef"></div>
-	</div>
-</template>
-
-<script setup>
-import * as echarts from 'echarts'
-import { industryJobNumPieChart } from '@/api/job/task'
-import useEchartsResize from '@/hooks/useEchartsResize'
-import { useStore } from 'vuex'
-
-const store = useStore()
-const chartRef = ref(null)
-let { chart } = useEchartsResize(chartRef)
-
-const option = {
-	tooltip: {
-		trigger: 'item',
-		formatter: '{b}: {c} ({d}%)',
-	},
-	legend: {
-    orient: 'vertical',
-    top: 'center',
-    right: '20',
-		textStyle: {
-			color: '#363636',
-			fontSize: 12,
-		},
-		itemWidth: 8, // 减小图例标记的宽度
-		itemHeight: 8, // 减小图例标记的高度
-		itemGap: 8, // 减小图例项之间的间距
-		formatter: '{name}', // 简化图例文本
-	},
-	series: [
-		{
-			name: '机巢事件统计',
-			type: 'pie',
-			// roseType: 'radius',
-      radius: ['20%', '70%'],
-      center: ['30%', '50%'],
-			data: [],
-			label: {
-				show: false,
-				position: 'outside',
-				formatter: '{c}',
-				fontSize: 12,
-				color: '#000',
-			},
-			labelLine: {
-				show: false,
-				length: 10,
-				length2: 10,
-				lineStyle: {
-					color: '#000',
-				},
-			},
-		},
-	],
-}
-
-// 获取机巢事件数据
-const getIndustryJobNumPieChart = value => {
-	industryJobNumPieChart(value).then(res => {
-		if (res.data.code !== 0) return
-		option.series[0].data = res.data.data
-		// forEach(item => {
-		//   const matchData = res.data.data.find(d => d.name === item.name);
-		//   if (matchData) {
-		//     item.value = matchData.value;
-		//   }
-		// });
-		chart.value.setOption(option)
-	})
-}
-
-const changeKey = inject('changeKey')
-// 添加监听
-watch(
-  () => [store.state.task.taskSearchParams,changeKey.value],
-  () => getIndustryJobNumPieChart(store.state.task.taskSearchParams),
-  { deep: true }
-)
-
-
-onMounted(() => {
-	getIndustryJobNumPieChart({ date_enum: 'TODAY' })
-})
-</script>
-
-<style lang="scss" scoped>
-.task-industry {
-	width: 300px;
-	height: 100%;
-	background: #FFFFFF;
-	border-radius: 8px 8px 8px 8px;
-	margin-left: 10px;
-
-	.title {
-		font-family: Segoe UI, Segoe UI;
-		padding: 10px 0 10px 16px;
-		width: 160px;
-		height: 18px;
-		font-weight: bold;
-		font-size: 16px;
-		color: #363636;
-		line-height: 18px;
-	}
-
-	.chart {
-		width: 100%;
-		height: 180px;
-	}
-}
-</style>
diff --git a/applications/task-work-order/src/views/job/components/TaskTop/TaskTime.vue b/applications/task-work-order/src/views/job/components/TaskTop/TaskTime.vue
deleted file mode 100644
index fdacf62..0000000
--- a/applications/task-work-order/src/views/job/components/TaskTop/TaskTime.vue
+++ /dev/null
@@ -1,161 +0,0 @@
-<!-- 任务数量统计 -->
-<template>
-	<div class="task-time">
-		<div class="title">任务数量统计</div>
-		<div class="chart" ref="chartRef"></div>
-	</div>
-</template>
-
-<script setup>
-import * as echarts from 'echarts'
-import { jobNumBar } from '@/api/job/task'
-import dayjs from 'dayjs'
-import useEchartsResize from '@/hooks/useEchartsResize'
-import { useStore } from 'vuex'
-
-const store = useStore()
-
-// 日期
-const currenDate = dayjs().format('YYYY-MM-DD')
-const newTime = ref([currenDate, currenDate])
-
-const chartRef = ref(null)
-let { chart } = useEchartsResize(chartRef)
-
-const option = {
-	tooltip: {
-		trigger: 'axis',
-		axisPointer: {
-			type: 'shadow',
-		},
-		formatter: '{b}: {c} 件',
-	},
-	legend: {
-		itemWidth: 8,
-		itemHeight: 12,
-		top: '2%',
-		textStyle: {
-			color: '#6B90B5',
-			fontSize: 12,
-		},
-	},
-	grid: {
-		top: '15%',
-		left: '3%',
-		right: '4%',
-		bottom: '2%',
-		containLabel: true,
-	},
-	// xAxis: {
-	//   type: 'category',
-	//   axisLine: {
-	//     lineStyle: {
-	//       color: '#fff'
-	//     }
-	//   },
-	//   axisLabel: {
-	//     color: '#fff',
-	//     interval: 0,
-	//     rotate: 30
-	//   }
-	// },
-	xAxis: {
-		type: 'category',
-		data: ['1'],
-		axisLine: {
-			show: true, // 隐藏轴线
-		},
-		// axisTick: {
-		// 	show: true,
-		// 	length: 2,
-		// 	lineStyle: {
-		// 		color: 'red',
-		// 	},
-		// },
-		axisLabel: {
-			color: '#363636',
-			margin: 8,
-		},
-	},
-	yAxis: {
-		type: 'value',
-		nameTextStyle: {
-			color: '#E6F7FF',
-			fontSize: 12,
-			padding: [0, 0, 0, 0], // 调整单位文字位置
-		},
-		axisLine: {
-			lineStyle: {
-				color: '#fff',
-			},
-		},
-		splitLine: {
-			lineStyle: {
-				color: 'rgba(255, 255, 255, 0.1)',
-			},
-		},
-		axisLabel: {
-			color: '#5B5B5D',
-		},
-	},
-	series: [
-		{
-			name: '任务数量',
-			type: 'bar',
-			barWidth: 8,
-			itemStyle: {
-				color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-					{ offset: 0, color: '#1C5CFF ' },
-					{ offset: 1, color: '#1C5CFF ' },
-				]),
-			},
-		},
-	],
-}
-
-// 获取任务时间统计数据
-const getJobNumBar = value => {
-	jobNumBar(value).then(res => {
-		if (res.data.code !== 0) return
-		option.xAxis.data = res.data.data.map(item => item.name)
-		option.series[0].data = res.data.data.map(item => item.value)
-		chart.value.setOption(option)
-	})
-}
-
-const changeKey = inject('changeKey')
-// 添加监听
-watch(
-  () => [store.state.task.taskSearchParams,changeKey.value],
-  () => getJobNumBar(store.state.task.taskSearchParams),
-  { deep: true }
-)
-</script>
-
-<style lang="scss" scoped>
-.task-time {
-	width: 529px;
-	height: 100%;
-	margin-left: 10px;
-	background: #FFFFFF;
-	border-radius: 8px 8px 8px 8px;
-
-	.title {
-		padding: 10px 0 10px 16px;
-		width: 96px;
-		height: 18px;
-		font-family: Segoe UI, Segoe UI;
-		font-weight: bold;
-		font-size: 16px;
-		color: #363636;
-		line-height: 18px;
-	}
-
-	.chart {
-		padding: 6px 0px;
-		width: 100%;
-		height: 166px;
-		color: #000;
-	}
-}
-</style>
diff --git a/applications/task-work-order/src/views/job/components/TaskTop/TaskTop.vue b/applications/task-work-order/src/views/job/components/TaskTop/TaskTop.vue
deleted file mode 100644
index 68b8a6b..0000000
--- a/applications/task-work-order/src/views/job/components/TaskTop/TaskTop.vue
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
- * @Author       : yuan
- * @Date         : 2025-06-14 15:19:16
- * @LastEditors  : yuan
- * @LastEditTime : 2025-06-26 11:46:38
- * @FilePath     : \src\views\job\components\TaskTop\TaskTop.vue
- * @Description  : 
- * Copyright 2025 OBKoro1, All Rights Reserved. 
- * 2025-06-14 15:19:16
--->
-<template>
-	<div class="task-top">
-		<!--时间 天气-->
-		<div class="statistical-chart">
-			<TaskTotal />
-			<TaskIndustry />
-			<TaskTime />
-			<TaskEvent />
-		</div>
-	</div>
-</template>
-
-<script setup>
-import { pxToRem } from '@/utils/rem'
-import TaskTotal from './TaskTotal.vue'
-import TaskIndustry from './TaskIndustry.vue'
-import TaskTime from './TaskTime.vue'
-import TaskEvent from './TaskEvent.vue'
-</script>
-
-<style lang="scss" scoped>
-.task-top {
-	position: relative;
-	display: flex;
-
-	.statistical-chart {
-		margin-left: 10px;
-		margin-right: 10px;
-		display: flex;
-		width: 0;
-		flex: 1;
-		height: 216px;
-		box-sizing: border-box;
-		margin-bottom: 10px;
-	}
-}
-</style>
diff --git a/applications/task-work-order/src/views/job/components/TaskTop/TaskTotal.vue b/applications/task-work-order/src/views/job/components/TaskTop/TaskTotal.vue
deleted file mode 100644
index b3bd734..0000000
--- a/applications/task-work-order/src/views/job/components/TaskTop/TaskTotal.vue
+++ /dev/null
@@ -1,157 +0,0 @@
-<!-- 任务统计 -->
-<template>
-	<div class="task-total">
-		<div class="title">任务数据概览</div>
-		<div class="contain">
-			<div class="left">
-				<div class="total-num">
-					<img src="@/assets/images/task/total-number.png" alt="" />
-					<div class="txt">总执行次数</div>
-					<div class="num">{{ numTotal }}</div>
-				</div>
-			</div>
-			<div class="other-total">
-				<div class="total" v-for="(item, index) in list" :key="index">
-					<div class="total-item">
-						<div class="name"><img :src="item.img" alt="" />{{ item.name }}</div>
-						<div class="value" :style="{ color: item.color }">{{ item.value }}</div>
-					</div>
-				</div>
-			</div>
-		</div>
-	</div>
-</template>
-
-<script setup>
-import { pxToRem } from '@/utils/rem'
-import { totalJobNum, jobStatistics } from '@/api/job/task'
-import { useStore } from 'vuex'
-import jhzxpng from '@/assets/images/task/jhzx.png'
-import yzxpng from '@/assets/images/task/yzx.png'
-import zxzpng from '@/assets/images/task/zxz.png'
-import zxsbpng from '@/assets/images/task/zxsb.png'
-import dzxpng from '@/assets/images/task/dzx.png'
-import qxzxpng from '@/assets/images/task/qxzx.png'
-
-const store = useStore()
-
-const total = ref(0)
-const numTotal = ref(0)
-const list = ref([
-	{ name: '计划执行', value: '0', color: '#1C5CFF', img: jhzxpng },
-	{ name: '已执行', value: '0', color: '#00AA2D', img: yzxpng },
-	{ name: '执行中', value: '0', color: '#FF720F', img:  zxzpng},
-	{ name: '执行失败', value: '0', color: '#FF4848', img: zxsbpng },
-	{ name: '待执行', value: '0', color: '#00CDC2', img: dzxpng },
-	{ name: '取消执行', value: '0', color: '#373333', img: qxzxpng },
-])
-
-
-// 获取其他任务统计
-const getJobStatistics = value => {
-	jobStatistics(value).then(res => {
-		if (res.data.code !== 0) returen
-    const {executed = 0,failed_executions = 0,go_home_executions = 0} = res.data?.data || {}
-    numTotal.value = executed + failed_executions + go_home_executions
-		list.value[0].value = res.data.data.planned_executions || 0
-		list.value[1].value = res.data.data.executed || 0
-		list.value[2].value = res.data.data.running_num || 0
-		list.value[3].value = res.data.data.failed_executions || 0
-		list.value[4].value = res.data.data.pending_executions || 0
-		list.value[5].value = res.data.data.go_home_executions || 0
-	})
-}
-
-const changeKey = inject('changeKey')
-// 添加监听
-watch(
-  () => [store.state.task.taskSearchParams,changeKey.value],
-  () => getJobStatistics(store.state.task.taskSearchParams),
-  { deep: true }
-)
-
-</script>
-
-<style scoped lang="scss">
-.task-total {
-	width: 300px;
-	font-family: Source Han Sans CN, Source Han Sans CN;
-	background: #FFFFFF;
-	border-radius: 8px 8px 8px 8px;
-	.title {
-		padding: 10px 0 10px 16px;
-		width: 96px;
-		height: 18px;
-		font-family: Segoe UI, Segoe UI;
-		font-weight: bold;
-		font-size: 16px;
-		color: #363636;
-		line-height: 18px;
-		text-align: left;
-		font-style: normal;
-		text-transform: none;
-	}
-	.contain {
-		display: flex;
-	}
-	.total-num {
-		width: 100px;
-
-		img {
-			width: 84px;
-			height: 84px;
-		}
-		.txt {
-			font-weight: 400;
-			font-size: 14px;
-			color: #363636;
-			line-height: 18px;
-			text-align: center;
-		}
-		.num {
-			font-weight: bold;
-			font-size: 20px;
-			color: #363636;
-			line-height: 18px;
-			text-align: center;
-			margin-top: 6px;
-		}
-	}
-	.other-total {
-		position: relative;
-		top: -10px;
-		width: 200px;
-		height: 160px;
-		display: flex;
-		gap: 10px;
-
-		flex-wrap: wrap;
-		align-content: space-evenly;
-		.total {
-			display: flex;
-			align-items: center;
-			margin-bottom: -18px;
-			text-align: center;
-
-			.name {
-				display: flex;
-				align-items: center;
-				width: 90px;
-				font-weight: 400;
-				font-size: 14px;
-				color: #363636;
-				line-height: 18px;
-				img {
-					width: 18px;
-					height: 18px;
-				}
-			}
-			.value {
-				font-weight: bold;
-				font-size: 16px;
-				text-align: center;
-			}
-		}
-	}
-}
-</style>
diff --git a/applications/task-work-order/src/views/job/components/executeNestDetails.vue b/applications/task-work-order/src/views/job/components/executeNestDetails.vue
deleted file mode 100644
index 03a9a5f..0000000
--- a/applications/task-work-order/src/views/job/components/executeNestDetails.vue
+++ /dev/null
@@ -1,225 +0,0 @@
-<template>
-	<div class="executeNestDetails">
-		<img src="/src/assets/images/task/sign.svg" alt="">
-		<div class="title">
-			任务执行详情
-		</div>
-	</div>
-	<div class="ztzf-table">
-		<el-table
-			v-loading="loading"
-			element-loading-background="rgba(22, 43, 74, 0.79)"
-			:row-class-name="tableRowClassName"
-			:data="taskData"
-			style="width: 100%"
-			:row-style="{ height: pxToRem(48), fontSize: pxToRem(14), 'text-align': 'center' }"
-			:header-cell-style="{ 'text-align': 'center', height: pxToRem(36), fontSize: pxToRem(14) }"
-		>
-			<el-table-column type="index" label="序号" :width="pxToRemNum(100)" align="center">
-				<template #default="{ $index }">
-					{{ ($index + 1).toString().padStart(2, '0') }}
-				</template>
-			</el-table-column>
-			<el-table-column show-overflow-tooltip prop="nick_name" label="机巢名称" align="center">
-				<template #default="scope">
-					<el-tooltip-copy :content="scope.row.nick_name" :showCopyText="true">
-						{{ scope.row.nick_name }}
-					</el-tooltip-copy>
-				</template>
-			</el-table-column>
-
-			<el-table-column prop="status" label="执行状态" align="center">
-				<template #default="scope">
-					<div class="base_f_c_c">
-						<span
-							:style="{
-								color:
-									scope.row.status === 1
-										? '#ffe17e'
-										: scope.row.status === 2
-										? '#ffa768'
-										: scope.row.status === 3
-										? 'rgb(6, 217, 87)'
-										: scope.row.status === 5
-										? '#FF4848'
-										: scope.row.status === 7
-										? '#A6A6A6'
-										: '',
-							}"
-						>
-							{{ scope.row.status ? getStatusText(scope.row.status) : '' }}
-						</span>
-
-						<el-tooltip
-							class="item"
-							effect="dark"
-							:content="scope.row.reason"
-							placement="top"
-							popper-class="reasonNotFly ztzf-tooltip-box1"
-						>
-							<el-icon v-if="scope.row.status === 5 && scope.row.reason" color="#FF4848"><QuestionFilled /></el-icon>
-						</el-tooltip>
-					</div>
-				</template>
-			</el-table-column>
-		</el-table>
-	</div>
-</template>
-<script setup>
-import { NestDetailApi } from '@/api/home'
-import { dayjs, ElMessage, ElMessageBox } from 'element-plus'
-import { pxToRem, pxToRemNum } from '@/utils/rem'
-import { QuestionFilled } from '@element-plus/icons-vue'
-import { ContinuingToFly } from '@/const/device'
-const props = defineProps(['wayLineJobInfoId', 'batchNo'])
-const taskData = ref('')
-// 是否展示再次执行弹框
-let isShowDetails = ref(false)
-const singledevice_sns = ref([])
-const deviseName = ref(null)
-const devisejobInfoId = ref('')
-const devisebatchNo = ref(null)
-const loading = ref(false)
-const isShowContinuingToFly = code => {
-	return ContinuingToFly.find(i => i.code === code)
-}
-// 状态文字
-const getStatusText = status => {
-	const statusMap = {
-		1: '待执行',
-		2: '执行中',
-		3: '已执行',
-		4: '已取消',
-		5: '执行失败',
-		7: '取消执行',
-	}
-	return statusMap[status] || '-'
-}
-// 表格隔行变色
-const tableRowClassName = ({ row, rowIndex }) => {
-	if (rowIndex % 2 === 1) {
-		return 'warning-row'
-	} else {
-		return 'success-row'
-	}
-}
-
-const handleSearch = () => {}
-// 执行机巢详情
-const getNestDetailApi = () => {
-	const params = {
-		jobInfoId: props.wayLineJobInfoId,
-		batchNo: props.batchNo,
-	}
-	NestDetailApi(params).then(res => {
-		taskData.value = res.data.data
-	})
-}
-onMounted(() => {
-	getNestDetailApi()
-})
-</script>
-
-<style scoped lang="scss">
-.executeNestDetails {
-	display: flex;
-	align-items: center;
-	border-bottom: 2px solid #e4e7ed;
-	img {
-		width: 15px;
-		height: 15px;
-	}
-	margin-bottom: 8px;
-
-	.title {
-		margin-left: 10px;
-		font-size: 16px;
-		color: #303133;
-	}
-}
-
-.ztzf-table {
-	margin-bottom: 16px;
-}
-
-// 待处理
-.pending {
-	color: #ff7411;
-}
-// 待审核
-.reviewed {
-	color: #ff472f;
-}
-// 处理中
-.processing {
-	color: #ffff61;
-}
-// 已完成
-.done {
-	color: #06d957;
-}
-// 已完结
-.ended {
-	color: #06d957;
-}
-
-.searchBox {
-	display: flex;
-}
-.search-btn {
-	display: flex;
-	img {
-		cursor: pointer;
-		margin-right: 8px;
-		width: 82px;
-		height: 32px;
-	}
-}
-.btnGroups {
-	display: flex;
-	align-items: center;
-	justify-content: space-around;
-	div {
-		height: 27px;
-		line-height: 27px;
-		background: #001f4e !important;
-		border-radius: 0px 0px 0px 0px;
-		border: 1px solid #51a8ff !important;
-		font-size: 14px;
-		color: #ffffff;
-		text-align: center;
-		cursor: pointer;
-		padding: 0 8px;
-	}
-}
-</style>
-<style lang="scss">
-.machineTableDetailsTitle {
-	display: flex;
-	border-bottom: 2px solid #e4e7ed;
-	background-size: 100% 100%;
-
-	img {
-		width: 15px;
-		height: 15px;
-		margin-top: 6px;
-	}
-
-	.title {
-		display: inline-block;
-		margin-left: 10px;
-		font-size: 16px;
-		// color: #0282ff;
-		color: #303133;
-		line-height: 20px;
-		text-align: left;
-		margin-bottom: 8px;
-	}
-
-	.btn {
-		margin-left: 16px;
-		margin-bottom: 8px;
-		line-height: 20px;
-	}
-}
-</style>
diff --git a/applications/task-work-order/src/views/job/const/drc.js b/applications/task-work-order/src/views/job/const/drc.js
deleted file mode 100644
index e15b981..0000000
--- a/applications/task-work-order/src/views/job/const/drc.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import startRecordImg from '@/assets/images/task/startRecord.png'
-import hoverImg from '@/assets/images/task/hover.png'
-import takePhotoImg from '@/assets/images/task/takePhoto.png'
-
-export const droneEventList = [
-	{name:'开始录像',value:'startRecord',img:startRecordImg},
-	{name:'悬停',value:'hover',img:hoverImg},
-	{name:'拍照',value:'takePhoto',img:takePhotoImg},
-]
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/job/jobinfo.vue b/applications/task-work-order/src/views/job/jobinfo.vue
deleted file mode 100644
index 2fa7b2b..0000000
--- a/applications/task-work-order/src/views/job/jobinfo.vue
+++ /dev/null
@@ -1,269 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud :option="option" v-model:search="search" v-model:page="page" v-model="form" :table-loading="loading"
-      :data="data" :permission="permissionList" :before-open="beforeOpen" ref="crud" @row-update="rowUpdate"
-      @row-save="rowSave" @row-del="rowDel" @search-change="searchChange" @search-reset="searchReset"
-      @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
-      @refresh-change="refreshChange" @on-load="onLoad">
-      <template #menu-left>
-        <el-button type="danger" icon="el-icon-delete" plain v-if="permission.jobinfo_delete" @click="handleDelete">删 除
-        </el-button>
-        <el-button type="info" plain icon="el-icon-sort" @click="handleSync">数 据 同 步
-        </el-button>
-      </template>
-      <template #menu="scope">
-        <el-button type="primary" text icon="el-icon-video-play" @click="handleRun(scope.row)">运 行
-        </el-button>
-      </template>
-      <template #enable="{ row }">
-        <el-switch v-model="row.enable" inline-prompt @change="slotChange(row)" active-text="启用" inactive-text="暂停"
-          :active-value="1" :inactive-value="0" />
-      </template>
-    </avue-crud>
-  </basic-container>
-</template>
-
-<script>
-import { getList, getDetail, add, update, remove, change, run, sync } from '@/api/job/jobinfo'
-import option from '@/option/job/jobinfo'
-import { mapGetters } from 'vuex'
-import 'nprogress/nprogress.css'
-import func from '@/utils/func'
-
-export default {
-  data () {
-    return {
-      form: {},
-      query: {},
-      search: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      selectionList: [],
-      option: option,
-      data: [],
-    }
-  },
-  created() {
-       this.$bus?.on('triggerSearchChange', (params) => {
-         this.searchChange(params, () => {});
-       });
-     },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList () {
-      return {
-        addBtn: this.validData(this.permission.jobinfo_add, false),
-        viewBtn: this.validData(this.permission.jobinfo_view, false),
-        delBtn: this.validData(this.permission.jobinfo_delete, false),
-        editBtn: this.validData(this.permission.jobinfo_edit, false),
-      }
-    },
-    ids () {
-      let ids = []
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id)
-      })
-      return ids.join(',')
-    },
-  },
-  methods: {
-    rowSave (row, done, loading) {
-      if (func.isArrayAndNotEmpty(row.lifecycle)) {
-        const lifecycleStart = row.lifecycle[0]
-        const lifecycleEnd = row.lifecycle[1]
-        if (!func.isUndefined(lifecycleStart) && !func.isUndefined(lifecycleEnd)) {
-          row.lifecycle = lifecycleStart + ',' + lifecycleEnd
-        }
-      } else {
-        row.lifecycle = ''
-      }
-      add(row).then(
-        () => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          loading()
-          window.console.log(error)
-        }
-      )
-    },
-    rowUpdate (row, index, done, loading) {
-      if (func.isArrayAndNotEmpty(row.lifecycle)) {
-        const lifecycleStart = row.lifecycle[0]
-        const lifecycleEnd = row.lifecycle[1]
-        if (!func.isUndefined(lifecycleStart) && !func.isUndefined(lifecycleEnd)) {
-          row.lifecycle = lifecycleStart + ',' + lifecycleEnd
-        }
-      } else {
-        row.lifecycle = ""
-      }
-      update(row).then(
-        () => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          loading()
-          console.log(error)
-        }
-      )
-    },
-    rowDel (row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-        })
-    },
-    handleDelete () {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据')
-        return
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          this.$refs.crud.toggleSelection()
-        })
-    },
-    handleSync () {
-      this.$confirm('确定进行数据双向同步?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return sync()
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-        })
-    },
-    handleRun (row) {
-      this.$confirm('运行后将创建一个实例执行,是否继续?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return run(row)
-        })
-        .then(() => {
-          this.$message({
-            type: 'success',
-            message: '运行成功!',
-          })
-        })
-    },
-    slotChange (row) {
-      if (!row.id) {
-        return
-      }
-      change(row).then(
-        () => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-        },
-        error => {
-          window.console.log(error)
-        }
-      )
-    },
-    beforeOpen (done, type) {
-      if (['edit', 'view'].includes(type)) {
-        getDetail(this.form.id).then(res => {
-          this.form = res.data.data
-        })
-      }
-      done()
-    },
-    searchReset () {
-      this.query = {}
-      this.onLoad(this.page)
-    },
-    searchChange (params, done) {
-      this.query = params
-      this.page.currentPage = 1
-      this.onLoad(this.page, params)
-      done()
-    },
-    selectionChange (list) {
-      this.selectionList = list
-    },
-    selectionClear () {
-      this.selectionList = []
-      this.$refs.crud.toggleSelection()
-    },
-    currentChange (currentPage) {
-      this.page.currentPage = currentPage
-    },
-    sizeChange (pageSize) {
-      this.page.pageSize = pageSize
-    },
-    refreshChange () {
-      this.onLoad(this.page, this.query)
-    },
-    onLoad (page) {
-      this.loading = true
-
-      const { jobServerId, jobName } = this.query
-
-      let values = {
-        jobServerId_like: jobServerId,
-        jobName_like: jobName,
-      }
-
-      getList(page.currentPage, page.pageSize, values).then(res => {
-        const data = res.data.data
-        this.page.total = data.total
-        this.data = data.records
-        this.loading = false
-        this.selectionClear()
-      })
-    },
-  },
-}
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/applications/task-work-order/src/views/job/jobserver.vue b/applications/task-work-order/src/views/job/jobserver.vue
deleted file mode 100644
index 29567a9..0000000
--- a/applications/task-work-order/src/views/job/jobserver.vue
+++ /dev/null
@@ -1,213 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud :option="option" v-model:search="search" v-model:page="page" v-model="form" :table-loading="loading"
-      :data="data" :permission="permissionList" :before-open="beforeOpen" ref="crud" @row-update="rowUpdate"
-      @row-save="rowSave" @row-del="rowDel" @search-change="searchChange" @search-reset="searchReset"
-      @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
-      @refresh-change="refreshChange" @on-load="onLoad">
-      <template #menu-left>
-        <el-button type="danger" icon="el-icon-delete" plain v-if="permission.jobserver_delete" @click="handleDelete">删
-          除
-        </el-button>
-        <el-button type="info" plain icon="el-icon-sort" @click="handleSync">数 据 同 步
-        </el-button>
-      </template>
-      <template #menu="scope">
-        <el-button type="primary" text icon="el-icon-video-play" @click="handleLink(scope.row)">服务跳转
-        </el-button>
-      </template>
-    </avue-crud>
-  </basic-container>
-</template>
-
-<script>
-import { getList, getDetail, add, update, remove, sync } from '@/api/job/jobserver'
-import option from '@/option/job/jobserver'
-import { mapGetters } from 'vuex'
-import 'nprogress/nprogress.css'
-import func from '@/utils/func'
-
-export default {
-  data () {
-    return {
-      form: {},
-      query: {},
-      search: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      selectionList: [],
-      option: option,
-      data: [],
-    }
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList () {
-      return {
-        addBtn: this.validData(this.permission.jobserver_add, false),
-        viewBtn: this.validData(this.permission.jobserver_view, false),
-        delBtn: this.validData(this.permission.jobserver_delete, false),
-        editBtn: this.validData(this.permission.jobserver_edit, false),
-      }
-    },
-    ids () {
-      let ids = []
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id)
-      })
-      return ids.join(',')
-    },
-  },
-  methods: {
-    rowSave (row, done, loading) {
-      add(row).then(
-        () => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          loading()
-          window.console.log(error)
-        }
-      )
-    },
-    rowUpdate (row, index, done, loading) {
-      update(row).then(
-        () => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          done()
-        },
-        error => {
-          loading()
-          console.log(error)
-        }
-      )
-    },
-    rowDel (row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-        })
-    },
-    handleDelete () {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据')
-        return
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids)
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-          this.$refs.crud.toggleSelection()
-        })
-    },
-    handleLink (row) {
-      window.open(func.formatUrl(row.jobServerUrl))
-    },
-    handleSync () {
-      this.$confirm('确定进行数据双向同步?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return sync()
-        })
-        .then(() => {
-          this.onLoad(this.page)
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          })
-        })
-    },
-    beforeOpen (done, type) {
-      if (['edit', 'view'].includes(type)) {
-        getDetail(this.form.id).then(res => {
-          this.form = res.data.data
-        })
-      }
-      done()
-    },
-    searchReset () {
-      this.query = {}
-      this.onLoad(this.page)
-    },
-    searchChange (params, done) {
-      this.query = params
-      this.page.currentPage = 1
-      this.onLoad(this.page, params)
-      done()
-    },
-    selectionChange (list) {
-      this.selectionList = list
-    },
-    selectionClear () {
-      this.selectionList = []
-      this.$refs.crud.toggleSelection()
-    },
-    currentChange (currentPage) {
-      this.page.currentPage = currentPage
-    },
-    sizeChange (pageSize) {
-      this.page.pageSize = pageSize
-    },
-    refreshChange () {
-      this.onLoad(this.page, this.query)
-    },
-    onLoad (page) {
-      this.loading = true
-
-      const { jobServerName, jobAppName } = this.query
-
-      let values = {
-        jobServerName_like: jobServerName,
-        jobAppName_like: jobAppName,
-      }
-
-      getList(page.currentPage, page.pageSize, values).then(res => {
-        const data = res.data.data
-        this.page.total = data.total
-        this.data = data.records
-        this.loading = false
-        this.selectionClear()
-      })
-    },
-  },
-}
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/applications/task-work-order/src/views/job/jobstatistics.vue b/applications/task-work-order/src/views/job/jobstatistics.vue
deleted file mode 100644
index 3689297..0000000
--- a/applications/task-work-order/src/views/job/jobstatistics.vue
+++ /dev/null
@@ -1,14 +0,0 @@
-
-<template>
-  <TaskTop />
-  <TaskIntermediateContent />
-</template>
-<script setup>
-import TaskTop from "@/views/job/components/TaskTop/TaskTop.vue"
-import TaskIntermediateContent from "@/views/job/components/TaskIntermediateContent/TaskIntermediateContent.vue"
-import { ref } from 'vue';
-const changeKey = ref(0)
-provide('changeKey', changeKey)
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/applications/task-work-order/src/views/layerManagement/components/folderFile.vue b/applications/task-work-order/src/views/layerManagement/components/folderFile.vue
deleted file mode 100644
index 1ba2799..0000000
--- a/applications/task-work-order/src/views/layerManagement/components/folderFile.vue
+++ /dev/null
@@ -1,316 +0,0 @@
-<template>
-  <div class="rightContainer">
-    <div class="contenttitle">{{ itSLandPlanning ? '文件' : '文件夹' }}信息</div>
-    <div class="centerBox">
-      <div class="itemRow">
-        <div class="label">{{ itSLandPlanning ? '文件' : '文件夹' }}名称</div>
-        <div>
-          <el-input class="ztzf-layer-input inputName" v-model="formData.name" placeholder="请输入" />
-        </div>
-      </div>
-      <div class="itemRow"
-        v-if="(layerParams.addAnEditingFolder === 1 && layerParams.fileType !== 2) || (layerParams.addAnEditingFolder === 2 && layerParams.fileType !== 2) && !itSLandPlanning">
-        <div class="label">关联算法</div>
-        <div>
-          <el-select class="ztzf-layer-search filter-item" @change="handleTypeChange" v-model="formData.event_type"
-            placeholder="请选择" clearable>
-            <el-option v-for="item in types" :key="item.value" :label="item.label" :value="item.value" />
-          </el-select>
-          <el-select v-model="formData.algorithm_name" class="ztzf-layer-search" placeholder="请选择" clearable
-            :disabled="!formData.event_type">
-            <el-option v-for="item in algorithms" :key="item.value" :label="item.label" :value="item.value" />
-          </el-select>
-        </div>
-      </div>
-    </div>
-    <div class="detailInfo" v-if="layerParams.editFolder">
-      <div class="infpItem" v-if="!itSLandPlanning">
-        <div class="itemData">
-          <div class="title">{{ layerParams.fileType === 1 ? '识别区' : '禁飞区' }}总数量</div>
-
-          <div class="num">
-            <span class="totalQuantity">{{ formData.total_count }}</span> 个
-          </div>
-        </div>
-        <div class="itemData">
-          <div class="title">{{ layerParams.fileType === 1 ? '识别区' : '禁飞区' }}总面积</div>
-          <div class="num">
-            <span class="areaStyle">{{ dataUnitConversion(formData.total_area).val }}</span> {{
-              dataUnitConversion(formData.total_area).unit }}
-          </div>
-        </div>
-      </div>
-      <div class="infpItem">
-        <div class="itemData">
-          <div class="title">创建时间</div>
-          <div class="num">
-            <span>{{ formData?.create_time }}</span>
-          </div>
-        </div>
-        <div class="itemData">
-          <div class="title">创建人</div>
-          <div class="num">
-            <span>{{ formData?.create_name }}</span>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div class="btnGroups">
-      <img src="/src/assets/images/layerManagement/savebtn.svg" alt="" @click="submitHandle" />
-      <img src="/src/assets/images/layerManagement/cancelbtn.svg" @click="cancelHandel" alt="" />
-    </div>
-  </div>
-</template>
-
-<script setup>
-import {dataUnitConversion} from '@ztzf/utils'
-const emit = defineEmits(['refreshMethod', 'callParentMethod'])
-import EventBus from '@/utils/eventBus'
-import { ElMessage } from 'element-plus'
-import dayjs from 'dayjs'
-import { deleteFolderApi, deitFolderApi, addFolderApi } from '@/api/layer/index'
-import { getTicketInfo } from '@/api/tickets/ticket'
-import { computed } from 'vue'
-
-const layerParams = inject('layerParams')
-const types = ref([]) //工单类型
-const allAlgorithms = ref([])
-const algorithms = ref([])
-const formData = ref({
-  category_id: '',
-  name: '',
-  event_type: '',
-  algorithm_name: '',
-  total_count: 0,
-  total_area: 0,
-})
-const detailData = ref(null)
-detailData.value = layerParams.value.editFolderData
-const props = defineProps({
-  activeName: String,
-})
-const itSLandPlanning = computed(() => props.activeName === '国土空间规划')
-const getTicketInfoData = async () => {
-  const response = await getTicketInfo()
-  const { dept_data, event_type, ai_type, info } = response.data.data
-  allAlgorithms.value = info
-  types.value = Object.entries(event_type).map(([key, value]) => ({
-    label: value,
-    value: key,
-  }))
-}
-const handleTypeChange = typeValue => {
-  formData.value.algorithm_name = ''
-  const matchedCategory = allAlgorithms.value.find(category => category.dict_key === typeValue)
-  if (!matchedCategory || !matchedCategory.algorithms || matchedCategory.algorithms.length === 0) {
-    // 无匹配的算法时清空
-    algorithms.value = []
-    return
-  }
-  algorithms.value = matchedCategory.algorithms.map(algo => ({
-    label: algo.dict_value,
-    value: algo.dict_key,
-    dict_key: algo.dict_key,
-    dict_value: algo.dict_value,
-  }))
-}
-const clearAllData = () => {
-  formData.value = {
-    category_id: '',
-    name: '',
-    event_type: '',
-    algorithm_name: '',
-    total_count: 0,
-    total_area: 0,
-    create_time: '',
-    create_name: '',
-  }
-  algorithms.value = []
-  detailData.value = {}
-  layerParams.value.decideWhetherToAddOrEdit = 1
-  layerParams.value.addFolder = false
-  layerParams.value.editFolder = false
-  layerParams.value.editDetailData = null
-  layerParams.value.polygonPosition = null
-}
-const cancelHandel = () => {
-  clearAllData()
-  emit('callParentMethod')
-}
-const submitHandle = () => {
-  if (!formData.value.name) {
-    ElMessage.error('请输入文件夹名称')
-    return
-  }
-  if (!itSLandPlanning.value) {
-    if (!formData.value.event_type && layerParams.value.fileType === 1) {
-      ElMessage.warning('请选择类型')
-      return
-    }
-    if (!formData.value.algorithm_name && layerParams.value.fileType === 1) {
-      ElMessage.warning('请选择算法')
-      return
-    }
-  }
-  const params = {
-    category_id: layerParams.value.fileType === 1 ? 1 : 2,
-    name: formData.value.name,
-    event_type: formData.value.event_type,
-    algorithm_name: formData.value.algorithm_name,
-  }
-  // 如果是编辑模式,才添加 id
-  if (layerParams.value.addAnEditingFolder === 2) {
-    params.id = detailData.value.id
-  }
-  if (layerParams.value.addAnEditingFolder === 1) {
-    // 文件夹新增
-    addFolderApi(params).then(res => {
-      ElMessage.success('新增成功')
-      EventBus.emit('gettreeDataApi')
-      emit('refreshMethod')
-      clearAllData()
-      emit('callParentMethod')
-    })
-  } else {
-    //文件夹编辑
-    deitFolderApi(params).then(res => {
-      ElMessage.success('编辑成功')
-      EventBus.emit('gettreeDataApi')
-      clearAllData()
-      emit('callParentMethod')
-    })
-  }
-}
-onMounted(async () => {
-  await getTicketInfoData()
-  const addOrEditStatus = layerParams.value.addAnEditingFolder || 1
-  //  判断是否有编辑数据,有则回显
-  if (detailData.value && addOrEditStatus === 2) {
-    const editData = detailData.value
-    formData.value = {
-      ...formData.value,
-      category_id: editData.category_id,
-      name: editData.name,
-      event_type: editData.event_type, // 回显“关联算法类型”值
-      algorithm_name: editData.algorithm_name, // 回显“算法”值
-
-      total_count: editData.total_count,
-      total_area: editData.total_area,
-      create_time: editData.create_time ? dayjs(editData.create_time).format('YYYY年MM月DD日') : '',
-      create_name: editData.create_name,
-    }
-    if (formData.value.event_type) {
-      handleTypeChange(formData.value.event_type)
-
-      setTimeout(() => {
-        formData.value.algorithm_name = editData.algorithm_name
-      }, 100)
-    }
-  }
-})
-</script>
-
-<style scoped lang="scss">
-.rightContainer {
-  position: absolute;
-  top: 0;
-  right: 0;
-  height: calc(100% - 32px);
-  z-index: 99;
-  width: 324px;
-
-  overflow: hidden;
-  background: rgba(0, 0, 0, 0.51);
-  backdrop-filter: blur(4px);
-  border-radius: 8px 8px 8px 8px;
-  padding: 16px 12px;
-
-  :deep(.el-textarea__inner) {
-    background: transparent !important;
-    color: #ffffff !important;
-  }
-
-  .contenttitle {
-    font-family: Source Han Sans CN, Source Han Sans CN;
-    font-weight: bold;
-    font-size: 16px;
-    color: #ffffff;
-    margin-bottom: 20px;
-  }
-
-  .centerBox {
-    font-family: Source Han Sans CN, Source Han Sans CN;
-    font-weight: 400;
-    font-size: 14px;
-    color: #ffffff;
-
-    .itemRow {
-      margin-bottom: 35px;
-    }
-
-    .label {
-      margin-bottom: 5px;
-    }
-  }
-
-  .detailInfo {
-    .infpItem {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      font-family: Source Han Sans CN, Source Han Sans CN;
-      font-weight: 400;
-      font-size: 14px;
-      color: #DFDFDF;
-      margin-bottom: 23px;
-
-      .num {
-        span {
-          font-family: Source Han Sans CN, Source Han Sans CN;
-          font-weight: bold;
-          font-size: 14px;
-          color: #ffffff;
-        }
-
-        .totalQuantity {
-          font-family: Source Han Sans CN, Source Han Sans CN;
-          font-weight: bold;
-          font-size: 20px;
-        }
-
-        .areaStyle {
-          font-family: Source Han Sans CN, Source Han Sans CN;
-          font-weight: bold;
-          font-size: 20px;
-          color: #FFFFFF;
-
-        }
-      }
-
-      .itemData {
-        width: 50%;
-
-      }
-    }
-  }
-
-  .btnGroups {
-    display: flex;
-    justify-content: center;
-    position: absolute;
-    bottom: 59px;
-    left: 0;
-    right: 0;
-
-    img {
-      width: 125px;
-      height: 39px;
-      cursor: pointer;
-    }
-  }
-}
-
-.filter-item {
-  margin-bottom: 12px;
-}
-</style>
diff --git a/applications/task-work-order/src/views/layerManagement/components/leftList.vue b/applications/task-work-order/src/views/layerManagement/components/leftList.vue
deleted file mode 100644
index b200cf5..0000000
--- a/applications/task-work-order/src/views/layerManagement/components/leftList.vue
+++ /dev/null
@@ -1,588 +0,0 @@
-<template>
-  <div class="table-overlay">
-    <div class="searchBox">
-      <el-input
-        class="ztzf-layer-input inputName"
-        v-model="formData.dkbh"
-        placeholder="输入名称模糊搜索"
-      ></el-input>
-      <div class="searchAndReset">
-        <el-button type="primary" icon="el-icon-search" @click="search">搜索</el-button>
-        <el-button class="ztzf-button" icon="el-icon-refresh" @click="reset">重置</el-button>
-      </div>
-    </div>
-    <div class="btnGroups">
-      <el-button v-if="activeName !== '国土空间规划'" class="ztzf-button" @click="addFence">{{
-        props.activeName === '自定义识别区' ? '新增识别区' : '新增禁飞区'
-      }}</el-button>
-      <el-button v-if="activeName !== '国土空间规划'" class="ztzf-button" @click="addFolder"
-        >新增文件夹</el-button
-      >
-      <el-upload
-        v-if="activeName === '国土空间规划'"
-        action="#"
-        :show-file-list="false"
-        :before-upload="e => uploadFlightFile(e, '1')"
-        accept=".zip"
-      >
-        <el-button class="ztzf-button"> 上传 </el-button>
-      </el-upload>
-
-      <!-- <template v-if="activeName === '自定义禁飞区'">
-        <template v-if="failuresInfo.length">
-          <el-button class="ztzf-button" @click="synchronize"> 继续同步 </el-button>
-          <el-button class="ztzf-button" @click="failuresDel"> 取消同步 </el-button>
-        </template>
-        <el-button v-else class="ztzf-button" @click="synchronize"> 同步 </el-button>
-      </template> -->
-
-      <!-- <el-button class="ztzf-button" @click="selectAll">全选</el-button> -->
-      <el-button class="ztzf-button" @click="selectAll">
-  {{ checkedKeys.length === getAllFenceKeys().length ? '取消全选' : '全选' }}
-</el-button>
-    </div>
-    <div
-      class="tableListBox"
-      v-loading="loading"
-      element-loading-background="rgba(0, 0, 0, 0.2)"
-      element-loading-text="加载中..."
-    >
-      <el-tree
-        class="ztzf-el-tree"
-        :class="{ isTheTerritory: activeName === '国土空间规划' }"
-        ref="treeRef"
-        v-model="checkedKeys"
-        :data="treeData"
-        show-checkbox
-        node-key="id"
-        default-expand-all
-        :expand-on-click-node="false"
-         :check-on-click-node="true"
-        :filter-node-method="filterNode"
-        highlight-current
-        @check="handleCheck"
-        :current-node-key="currentNodeKey"
-        @node-click="handleNodeClick"
-        :props="{
-          label: 'name',
-          children: 'children',
-        }"
-      >
-        <!-- 自定义节点内容 -->
-        <template #default="{ node }">
-          <div class="tree-node" >
-            <!-- 节点名称 -->
-            <span class="nodeName" >{{ node.label }}</span>
-            <!-- 操作按钮组 -->
-            <div class="tree-node-actions" >
-              <!-- <el-button
-                link
-               icon="el-icon-location"
-                @click.stop="handleLocation(node)"
-                :disabled="node.data.level === 2 && (!node.data.children || node.data.children.length === 0)"
-              class="location-btn"
-              ></el-button> -->
-              <el-button icon="el-icon-edit" link @click.stop="handleEdit(node)"></el-button>
-              <el-button icon="el-icon-delete" :class="isDisabledColor ? 'location-btn' : ''" link @click.stop="handleDelete(node)" 
-                :disabled="!!formData.dkbh.trim() && node.data.level === 2 && props.activeName !== '国土空间规划' && (
-     filteredShowNodeIds.has(node.data.id) || isNodeOrChildrenMatch(node.data, formData.dkbh.trim())
-     )"></el-button>
-            </div>
-          </div>
-        </template>
-      </el-tree>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { ElMessage, ElMessageBox } from 'element-plus';
-import {
-  treeDataApi,
-  deleteFenceApi,
-  deleteFolderApi,
-  spatialPlanningApi,
-  failuresListApi,
-  failuresDelApi,
-  areasUpdateApi,
-} from '@/api/layer/index';
-import { inject, nextTick, onMounted, watch } from 'vue';
-const emit = defineEmits(['update:coverData', 'update:deitData', 'newFencesMethods']);
-import EventBus from '@/utils/eventBus';
-const coverData = ref();
-const layerParams = inject('layerParams');
-const checkedKeys = ref([]); // 存储勾选的节点key
-const treeRef = ref(null); // 获取tree实例
-const checkedNodes = ref([]); // 存储勾选的节点数据
-const props = defineProps(['activeName','resetCheck']);
-const formData = ref({
-  isPush: undefined,
-  page: 1,
-  isGenerated: undefined,
-  pageSize: 17,
-  dkbh: '',
-  patchesName: '',
-});
-const loading = ref(false);
-const treeData = ref([]);
-const treeAllData = ref([]);
-// 存储过滤后显示的节点ID(返回true的节点)
-const filteredShowNodeIds = ref(new Set());
-const isDisabledColor = ref(false)
-// 存储当前选中节点的key
-const currentNodeKey = ref(null); 
-// 节点点击事件:切换选中/取消选中
-const handleNodeClick = (nodeData, node) => {
-  // 如果点击的是已经高亮的节点,则取消高亮
-  if (!node.checked) {
-    treeRef.value?.setCurrentKey(null);
-  }
-};
-// 获取数据
-const gettreeDataApi = async () => {
-  try {
-    loading.value = true;
-    const res = await treeDataApi({filterExpired:false});
-    treeAllData.value = res.data.data;
-    // 加载数据后立即清空标记
-    filteredShowNodeIds.value.clear();
-    if(coverData.value.length===0){
-       checkedKeys.value = [];
-    checkedNodes.value = [];
-    coverData.value = [];
-     nextTick(() => {
-      if (treeRef.value) {
-        treeRef.value.setCheckedKeys([]);
-      }
-    });
-    }
-
-    setupWatch();
-  } catch (error) {
-    console.error('获取数据失败:', error);
-  } finally {
-    loading.value = false;
-  }
-};
-
-const setupWatch = () => {
-  watch(
-    () => props.activeName,
-    newVal => {
-      const matchedCategory = treeAllData.value.find(item => item.name === newVal);
-      treeData.value = matchedCategory.children;
-      nextTick(search);
-      if (treeData.value && treeData.value.length > 0) {
-        const folderNode = treeData.value[0];
-        // 赋值给 layerParams
-        layerParams.value.total_count = folderNode.total_count ? folderNode.total_count : 0;
-        layerParams.value.total_area = folderNode.total_area ? folderNode.total_area : 0;
-      }
-    },
-    { immediate: true }
-  );
-};
-const handleCheck = (checkedNodesData, checkedKeysData) => {
-layerParams.value.isSingleLocating = false
-  const filteredNodes = checkedKeysData.checkedNodes.filter(node => node.level === 3);
-  checkedNodes.value = filteredNodes
-  checkedKeys.value = filteredNodes.map(node => node.id);
-  coverData.value = filteredNodes;
-  emit('update:coverData', coverData.value);
-};
-// 全选方法
-const getAllFenceKeys = () => {
-  return treeData.value.flatMap(
-    folder => folder.children.map(fence => fence.id)
-  );
-};
-const selectAll = () => {
-  currentNodeKey.value = null;
- layerParams.value.currentLocationFolderId = null;
-layerParams.value.isSingleLocating = false
-  // 清除高亮
-  currentNodeKey.value = null;
-  treeRef.value?.setCurrentKey(null);
-  if (treeRef.value) {
-    const allFenceKeys = getAllFenceKeys();
-    const allFenceNodes = treeData.value.flatMap(folder => folder.children);
-    if (checkedKeys.value.length === allFenceKeys.length) {
-      // 取消全选
-      treeRef.value.setCheckedKeys([]);
-      checkedKeys.value = [];
-      checkedNodes.value = [];
-      coverData.value = [];
-      emit('update:coverData', coverData.value);
-    } else {
-      // 全选
-      treeRef.value.setCheckedKeys(allFenceKeys);
-      checkedKeys.value = allFenceKeys;
-      checkedNodes.value = allFenceNodes;
-      coverData.value = allFenceNodes;
-      emit('update:coverData', coverData.value);
-
-    }
-
-  }
-};
-// 定位按钮事件
-const handleLocation = node => {
- const currentKey = treeRef.value.getCurrentKey();
-      if (currentKey === node.data.id) {
-        treeRef.value.setCurrentKey(null); // 取消高亮
-      } else {
-        treeRef.value.setCurrentKey(node.data.id); // 高亮当前节点
-      }
-  if (node.data.level === 2) {
-    layerParams.value.isSingleLocating = false;
-    // 新增:标记当前定位的文件夹ID
-    layerParams.value.currentLocationFolderId = node.data.id;
-  } else if (node.data.level === 3) {
-    layerParams.value.isSingleLocating = true;
-    // 清空文件夹定位标识
-    layerParams.value.currentLocationFolderId = null;
-  }
-
-  const currentCheckedKeys = [...checkedKeys.value];
-  const currentCheckedNodes = [...checkedNodes.value];
-  EventBus.emit('focusOnNode', node.data);
-  if (node.data.level === 2) {
-    const folderChildren = node.data.children || [];
-    const childrenIds = folderChildren.map(child => child.id);
-    const newChildrenIds = childrenIds.filter(id => !currentCheckedKeys.includes(id));
-    const newChildrenNodes = folderChildren.filter(child => newChildrenIds.includes(child.id));
-
-    const newCheckedKeys = [...new Set([...currentCheckedKeys, ...newChildrenIds])];
-    const newCheckedNodes = [...currentCheckedNodes, ...newChildrenNodes];
-
-    treeRef.value.setCheckedKeys(newCheckedKeys);
-    checkedKeys.value = newCheckedKeys;
-    checkedNodes.value = newCheckedNodes;
-    coverData.value = newCheckedNodes;
-    emit('update:coverData', coverData.value);
-  } else if (!currentCheckedKeys.includes(node.data.id)) {
-    layerParams.value.isSingleLocating = true;
-    currentCheckedKeys.push(node.data.id);
-    currentCheckedNodes.push(node.data);
-    treeRef.value.setCheckedKeys(currentCheckedKeys);
-    checkedKeys.value = currentCheckedKeys;
-    checkedNodes.value = currentCheckedNodes;
-    coverData.value = currentCheckedNodes;
-    emit('update:coverData', coverData.value);
-  }
-};
-// 编辑按钮事件
-const handleEdit = node => {
-  if (node.data.level == 2) {
-    layerParams.value.editFolder = true;
-    layerParams.value.addAnEditingFolder = 2;
-    if (props.activeName === '自定义识别区') {
-      layerParams.value.fileType = 1;
-    } else if (props.activeName === '自定义禁飞区') {
-      layerParams.value.fileType = 2;
-    }
-    emit('update:editFolder', node.data);
-  } else if (node.data.level === 3) {
-    checkedKeys.value = [];
-    checkedNodes.value = [];
-    coverData.value = [];
-    layerParams.value.editNest = true;
-    layerParams.value.decideWhetherToAddOrEdit = 2;
-    if (props.activeName === '自定义识别区') {
-      layerParams.value.fenceType = 1; // 电子围栏类型标识
-    } else if (props.activeName === '自定义禁飞区') {
-      layerParams.value.fenceType = 2; // 自定义禁飞区类型标识
-    }
-    emit('update:deitData', node.data);
-  }
-};
-
-// 删除按钮事件
-const handleDelete = node => {
-
-  let id = node.data.id;
-  ElMessageBox.confirm('确定要删除该内容吗?', '提示', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning',
-  })
-    .then(() => {
-      if (node.data.level === 2) {
-        // 删除文件夹
-        deleteFolderApi(id).then(res => {
-          ElMessage.success('删除成功');
-          gettreeDataApi();
-          EventBus.emit('deleteMapEntitiesByFolderId', id);
-        });
-      } else if (node.data.level === 3) {
-        // 删除单个围栏/禁飞区
-        deleteFenceApi(id).then(res => {
-          ElMessage.success('删除成功');
-          gettreeDataApi();
-          EventBus.emit('deleteMapEntityById', id);
-        });
-      }
-    })
-    .catch(() => {
-     
-    });
-};
-// 新增围栏
-const addFence = () => {
-  layerParams.value.addNest = true;
-  layerParams.value.decideWhetherToAddOrEdit = 1;
-  if (props.activeName === '自定义识别区') {
-    layerParams.value.fenceType = 1; // 电子围栏类型标识
-  } else if (props.activeName === '自定义禁飞区') {
-    layerParams.value.fenceType = 2; // 自定义禁飞区类型标识
-  }
-  emit('newFencesMethods');
-};
-// 新增文件夹
-const addFolder = () => {
-  layerParams.value.addFolder = true;
-  layerParams.value.addAnEditingFolder = 1;
-  if (props.activeName === '自定义识别区') {
-    layerParams.value.fileType = 1;
-  } else if (props.activeName === '自定义禁飞区') {
-    layerParams.value.fileType = 2;
-  }
-};
-function uploadFlightFile(file, t) {
-  const fileSuffix = file.name.substring(file.name.lastIndexOf('.') + 1);
-  if (!['zip'].includes(fileSuffix)) {
-    return ElMessage.error('请上传zip格式的文件');
-  }
-  let data = new FormData();
-  const params = {
-    file: file,
-    fileName: file.name,
-  };
-  Object.keys(params).forEach(key => {
-    data.append(key, params[key]);
-  });
-  spatialPlanningApi(data).then(res => {
-    ElMessage.success('上传成功');
-    gettreeDataApi();
-  });
-}
-
-function search() {
-  const keyword = formData.value.dkbh.trim();
-  // 有搜索词时才过滤,无则清空标记
-  if (keyword) {
-    treeRef.value?.filter(keyword);
-    isDisabledColor.value = true
-  } else {
-    filteredShowNodeIds.value.clear();
-    treeRef.value?.filter('');
-  }
-}
-function reset() {
-  isDisabledColor.value = false
-  formData.value.dkbh = '';
-  filteredShowNodeIds.value.clear();
-  nextTick(() => {
-    treeRef.value?.filter('');
-  });
-}
-const isNodeOrChildrenMatch = (nodeData, keyword) => {
-  // 无关键词时直接返回false
-  if (!keyword || keyword.trim() === '') return false;
-  // 自身包含关键词
-  if (nodeData.name.includes(keyword)) return true;
-  // 遍历子节点,判断是否有子节点包含
-  if (nodeData.children && nodeData.children.length) {
-    return nodeData.children.some(child => isNodeOrChildrenMatch(child, keyword));
-  }
-  return false;
-};
-function filterNode(value, data) {
-  let isShow = false;
-  const keyword = value?.trim() || ''; 
-
-  if (props.activeName === '国土空间规划') {
-    if (!keyword) {
-      isShow = data.level === 2 || data.level === 1;
-    } else {
-      isShow = (data.level === 2 || data.level === 1) && data.name.includes(keyword);
-    }
-  } else {
-    if (!keyword) {
-      isShow = true;
-    } else {
-      // 非国土空间规划:节点自身/子节点匹配则显示
-      isShow = isNodeOrChildrenMatch(data, keyword);
-    }
-  }
-  // 仅当有搜索词时,才更新标记(无搜索词清空)
-  if (keyword) {
-    if (isShow && data.id) {
-      filteredShowNodeIds.value.add(data.id);
-    } else if (data.id) {
-      filteredShowNodeIds.value.delete(data.id);
-    }
-  } else {
-    filteredShowNodeIds.value.clear();
-  }
-
-  return isShow;
-}
-
-// 同步信息
-const failuresInfo = ref([]);
-function failuresList() {
-  failuresListApi().then(res => {
-    failuresInfo.value = res.data.data || [];
-  });
-}
-
-// 同步
-function synchronize() {
-  const data = failuresInfo.value.map(item => item.device_sn);
-  areasUpdateApi(data).then(res => {
-    if (res.data.data.length) {
-      let stringVal = res.data.data.reduce((acc, cur) => {
-        return acc + cur.nickname + '(' + cur.reason + ')' + ',';
-      }, '');
-      stringVal = stringVal.slice(0, -1);
-      ElMessageBox.alert(stringVal, '同步失败', {
-        confirmButtonText: '确定',
-      });
-    } else {
-      ElMessage.success('同步成功');
-    }
-  });
-}
-
-// 取消同步
-function failuresDel() {
-  failuresDelApi().then(res => {
-    ElMessage.success('取消同步成功');
-  });
-}
-// 切换tab清空复选框的数据
-watch(
-  () => props.resetCheck,
-  (newVal) => {
-    if (newVal !== undefined) {
-      checkedKeys.value = [];
-      checkedNodes.value = [];
-      coverData.value = [];
-      treeRef.value?.setCheckedKeys([]);
-    }
-  },
-  { immediate: true }
-);
-onMounted(() => {
-  failuresList();
-  gettreeDataApi();
-  EventBus.on('gettreeDataApi', gettreeDataApi);
-});
-onBeforeUnmount(() => {
-  EventBus.off('gettreeDataApi', gettreeDataApi);
-});
-</script>
-
-<style scoped lang="scss">
-.table-overlay {
-  position: absolute;
-  top: 0;
-  left: 0;
-height: calc(100% - 32px);
-  z-index: 99;
-  width: 332px;
-  overflow: hidden;
-  background: rgba(0,0,0,0.51);
-  backdrop-filter: blur(4px);
-  border-radius: 8px 8px 8px 8px;
-  padding: 16px 0  16px 12px;
-  display: flex;
-  flex-direction: column;
-}
-
-.searchBox {
-  display: flex;
-  margin-top: 10px;
-padding-right: 12px;
-  .inputName {
-    width: 140px;
-    height: 32px;
-  }
-  .searchAndReset {
-    width: 182px;
-    display: flex;
-    justify-content: right;
-    align-items: center;
-    margin-right: 10px;
-
-  }
-}
-.btnGroups {
-  margin: 12px 0 14px 0;
-  display: flex;
-  gap: 0 10px;
-padding-right: 12px;
-  .el-button {
-    margin: 0 !important;
-  }
-}
-.tableListBox {
-  overflow-y: scroll;
-  height: 0;
-  flex-grow: 1;
-  // padding-right: 12px;
-  :deep(.el-tree-node__content) {
-  height: 45px !important;
-  line-height: 45px !important;
-  // padding-left: 0 !important;
-  border-bottom: 1px dotted  rgba(255,255,255,0.1);
-  }
-  // 定位选中节点的背景色样式
-  ::v-deep(.el-tree-node.is-current > .el-tree-node__content) {
-    background-color: rgba(64, 158, 255, 0.2) !important; // 浅蓝色半透明背景
-  }
-  .isTheTerritory {
-    :deep() {
-      .el-tree-node__expand-icon {
-        visibility: hidden;
-      }
-    }
-  }
-
-  :deep() {
-    .el-checkbox {
-      --el-checkbox-bg-color: transparent !important;
-    }
-  }
-  .tree-node {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-     padding-right: 12px;
-    width: 100%;
-       .nodeName {
-    font-size: 12px !important;
-    }
-  }
-
-  .tree-node-actions {
-    display: flex;
-    // gap: 8px;
-
-    button {
-      padding: 0;
-      color: #fff;
-      width: 17px;
-      height: 17px;
-      //  color: #409eff;
-      // &:hover {
-      //   color: #409eff;
-      // }
-    }
-  }
-  ::v-deep(.location-btn.el-button.is-link.is-disabled) {
-  color:  #999 !important;
-}
-}
-</style>
diff --git a/applications/task-work-order/src/views/layerManagement/components/nationalSpatialPlanning.vue b/applications/task-work-order/src/views/layerManagement/components/nationalSpatialPlanning.vue
deleted file mode 100644
index f11522c..0000000
--- a/applications/task-work-order/src/views/layerManagement/components/nationalSpatialPlanning.vue
+++ /dev/null
@@ -1,49 +0,0 @@
-<template>
-  <div class="spLeft">
-    <div class="input-search">
-      <el-input placeholder="请输入关键字" clearable></el-input>
-      <el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button>
-      <el-button icon="el-icon-refresh" @click="handleReset">清空</el-button>
-    </div>
-  </div>
-  <div class="spRight"></div>
-</template>
-
-<script setup>
-
-function handleSearch() {}
-function handleReset() {}
-</script>
-
-<style scoped lang="scss">
-.spLeft {
-  position: absolute;
-  top: 0;
-  left: 0;
-  height: 95%;
-  z-index: 99;
-  width: 392px;
-  overflow: hidden;
-  background: rgba(0, 0, 0, 0.8);
-  border-radius: 8px 8px 8px 8px;
-  padding: 16px 12px;
-  .input-search {
-    display: flex;
-    .el-input {
-      margin-right: 10px;
-    }
-  }
-}
-.spRight {
-  position: absolute;
-  top: 0;
-  right: 0;
-  height: 95%;
-  z-index: 99;
-  width: 324px;
-  overflow: hidden;
-  background: rgba(0, 0, 0, 0.8);
-  border-radius: 8px 8px 8px 8px;
-  padding: 16px 12px;
-}
-</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/layerManagement/components/rightEdit.vue b/applications/task-work-order/src/views/layerManagement/components/rightEdit.vue
deleted file mode 100644
index b640471..0000000
--- a/applications/task-work-order/src/views/layerManagement/components/rightEdit.vue
+++ /dev/null
@@ -1,471 +0,0 @@
-<template>
-  <div class="rightContainer"  >
-    <div class="contenttitle">{{ layerParams.fenceType === 1 ? '识别区' : '禁飞区' }}信息</div>
-    <div class="centerBox">
-      <div class="itemRow">
-        <div class="label">文件夹名称</div>
-        <div>
-          <el-select
-            :disabled="isDisabled"
-            class="ztzf-layer-search"
-            clearable
-            v-model="formData.folder_id"
-            placeholder="请选择"
-          >
-            <el-option
-              v-for="item in options"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            />
-          </el-select>
-        </div>
-      </div>
-      <div class="itemRow">
-        <div class="label">{{ layerParams.fenceType === 1 ? '识别区' : '禁飞区' }}名称</div>
-        <div>
-          <el-input
-            :disabled="isDisabled"
-            class="ztzf-layer-input inputName"
-            v-model="formData.name"
-            placeholder="请输入"
-          />
-        </div>
-      </div>
-      <div class="itemRow" v-if="layerParams.fenceType === 2">
-        <div class="label">禁飞区管控时间</div>
-        <div>
-          <!-- popper-class="ztzf-layer-date-picker-popper  " -->
-          <el-date-picker
-            :disabled="isDisabled"
-            class="ztzf-layer-date-picker"
-            v-model="timeValue"
-            type="datetimerange"
-            format="YYYY-MM-DD HH:mm"
-            range-separator="至"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-                :disabled-date="disabledDate"
-          />
-        </div>
-      </div>
-      <div class="itemRow">
-        <div class="label">{{ layerParams.fenceType === 1 ? '识别区' : '禁飞区' }}备注</div>
-        <div>
-          <el-input
-            :disabled="isDisabled"
-            v-model="formData.description"
-            :rows="5"
-            type="textarea"
-            placeholder="请输入"
-          />
-        </div>
-      </div>
-    </div>
-    <div class="detailInfo">
-      <div class="infpItem" v-if="layerParams.editNest && layerParams.fenceType === 1">
-        <div class="itemData">
-          <div class="title">识别区面积</div>
-          <div class="num">
-            <span class="areaStyle">{{ dataUnitConversion(fenceArea).val }}</span> {{
-              dataUnitConversion(fenceArea).unit }}
-          </div>
-        </div>
-        <div class="itemData">
-          <div class="title">创建人</div>
-          <div class="num">
-            <span>{{ formData?.create_name }}</span>
-          </div>
-        </div>
-      </div>
-      <div class="infpItem" v-if="layerParams.fenceType === 2">
-        <div class="itemData" v-if="layerParams.editNest && layerParams.fenceType === 2">
-          <div class="title">禁飞区面积</div>
-          <div class="num">
-            <span class="areaStyle">{{ dataUnitConversion(fenceArea).val }}</span> {{
-              dataUnitConversion(fenceArea).unit }}
-          </div>
-        </div>
-        <div class="itemData">
-          <div class="title">禁飞区高度</div>
-          <div class="num noFly">
-            <span
-              ><el-input
-                :disabled="isDisabled"
-                class="ztzf-layer-input inputName"
-                v-model="formData.altitude"
-                placeholder="请输入"
-            /></span>
-            米
-          </div>
-        </div>
-      </div>
-      <div class="infpItem" v-if="layerParams.editNest && layerParams.fenceType === 2">
-        <div class="itemData">
-          <div class="title">创建时间</div>
-          <div class="num">
-            <span>{{ formData?.create_time }}</span>
-          </div>
-        </div>
-        <div class="itemData">
-          <div class="title">创建人</div>
-          <div class="num">
-            <span>{{ formData?.create_name }}</span>
-          </div>
-        </div>
-      </div>
-      <div class="infpItem" v-if="layerParams.editNest && layerParams.fenceType === 1">
-        <div class="itemData">
-          <div class="title">创建时间</div>
-          <div class="num">
-            <span>{{ formData?.create_time }}</span>
-          </div>
-        </div>
-      </div>
-    </div>
-    <div class="btnGroups">
-      <img v-if="!layerParams.editingIsProhibited && layerParams.fenceArea / 1000000 > 50" src="/src/assets/images/layerManagement/disabled.svg" alt="" />
-      <img v-if="!layerParams.editingIsProhibited && layerParams.fenceArea / 1000000 < 50" src="/src/assets/images/layerManagement/savebtn.svg" alt="" @click="submitHandle" />
-      <img v-if="layerParams.editingIsProhibited" src="/src/assets/images/layerManagement/closeBtn.svg" @click="cancelHandel" alt="" />
-      <img v-else src="/src/assets/images/layerManagement/cancelbtn.svg" @click="cancelHandel" alt="" />
-      
-    </div>
-  </div>
-</template>
-
-<script setup>
-  import {dataUnitConversion} from '@ztzf/utils'
-import { ElMessage } from 'element-plus';
-import dayjs from 'dayjs';
-import { deitFenceApi, addFenceApi } from '@/api/layer/index';
-import EventBus from '@/utils/eventBus';
-const emit = defineEmits(['callParentMethod','update:loading']);
-const layerParams = inject('layerParams');
-const options = ref([]);
-const timeValue = ref('');
-options.value = layerParams.value.folderOption;
-const formData = ref({
-  folder_id: '',
-  name: '',
-  description: '',
-  is_enabled: false,
-  area: '',
-  altitude: '',
-  control_start_time: '',
-  control_end_time: '',
-  geo_data: '',
-
-});
-const loading = ref(false);
-const detailData = ref(null);
-const fenceArea = ref(0);
-detailData.value = layerParams.value.editDetailData;
-fenceArea.value = layerParams.value.fenceArea;
-const isDisabled = computed(() => {
-  return layerParams.value.editingIsProhibited;
-});
-// 禁用当天之前的日期
-const disabledDate = time => {
-  return time.getTime() < Date.now() - 8.64e7 // 86400000 = 24 * 60 * 60 * 1000
-}
-watch(
-  () => layerParams.value.fenceArea,
-  newArea => {
-    if (newArea !== undefined && newArea !== null) {
-      if (newArea / 1000000 < 50) {
-        fenceArea.value = newArea;
-        formData.value.area = newArea;
-      }
-    }
-  },
-  { immediate: true }
-);
-// 监听editDetailData的变化
-watch(
-  () => layerParams.value.editDetailData,
-  newVal => {
-    if (newVal && layerParams.value.editingIsProhibited) {
-      // 当editDetailData有值时,填充表单
-      formData.value = {
-        ...formData.value,
-        folder_id: newVal.folder_id || '',
-        name: newVal.name || '',
-        description: newVal.description || '',
-        is_enabled: newVal.is_enabled || false,
-        area: newVal.area || '',
-        altitude: newVal.altitude || '',
-        control_start_time: newVal.control_start_time || '',
-        control_end_time: newVal.control_end_time || '',
-        geo_data: newVal.geo_data || '',
-        create_name: newVal.create_name || '',
-        create_time: newVal.create_time ? dayjs(newVal.create_time).format('YYYY年MM月DD日') : '',
-      };
-
-      // 处理文件夹选择
-      if (newVal.folder_id && options.value.length > 0) {
-        const matchedFolder = options.value.find(item => item.value === String(newVal.folder_id));
-        if (matchedFolder) {
-          formData.value.folder_id = matchedFolder.value;
-        }
-      }
-
-      // 处理时间选择
-      if (newVal.control_start_time && newVal.control_end_time) {
-        timeValue.value = [
-          dayjs(newVal.control_start_time).toDate(),
-          dayjs(newVal.control_end_time).toDate(),
-        ];
-      }
-    }
-  },
-  { immediate: true, deep: true }
-);
-watch(
-  () => timeValue.value,
-  newTimeArr => {
-    if (Array.isArray(newTimeArr) && newTimeArr.length === 2) {
-      const startTime = newTimeArr[0];
-      const endTime = newTimeArr[1];
-      formData.value.control_start_time = dayjs(startTime).format('YYYY-MM-DD HH:mm:ss');
-      formData.value.control_end_time = dayjs(endTime).format('YYYY-MM-DD HH:mm:ss');
-    } else {
-      formData.value.control_start_time = '';
-      formData.value.control_end_time = '';
-    }
-  },
-  { immediate: true }
-);
-const clearAllData = () => {
-  detailData.value = {};
-  layerParams.value.decideWhetherToAddOrEdit = 1;
-  // 重置面板状态和缓存数据
-  layerParams.value.addNest = false;
-  layerParams.value.editNest = false;
-  layerParams.value.editDetailData = null;
-  layerParams.value.polygonPosition = null;
-  layerParams.value.editingIsProhibited = false;
-};
-const cancelHandel = () => {
-loading.value = false
- emit('update:loading', false); 
-  clearAllData();
-  emit('callParentMethod');
-  EventBus.emit('gettreeDataApi');
-};
-const submitHandle = () => {
-if(layerParams.value.crossSurface){
-  return ElMessage.warning('测区不支持交叉面')
-}
-  if (!formData.value.folder_id) {
-    ElMessage.error('请选择文件夹');
-    return;
-  }
-  if (!formData.value.name) {
-    ElMessage.error('请输入名称');
-    return;
-  }
-  if (!formData.value.altitude && layerParams.value.fenceType === 2) {
-    ElMessage.error('请输入高度');
-    return;
-  }
-  if (fenceArea.value === 0) {
-    ElMessage.error('请绘制区域');
-    return;
-  }
-  loading.value = true
-  emit('update:loading', true);
-  const params = {
-    folder_id: formData.value.folder_id,
-    name: formData.value.name,
-    description: formData.value.description,
-    is_enabled: true,
-    area: formData.value.area,
-    altitude: formData.value.altitude,
-    geo_data: layerParams.value.polygonPosition
-      ? layerParams.value.polygonPosition
-      : formData.value.geo_data,
-    control_start_time: formData.value.control_start_time,
-    control_end_time: formData.value.control_end_time,
-  };
-  // 如果是编辑模式,才添加 id
-  if (layerParams.value.decideWhetherToAddOrEdit === 2) {
-    params.id = detailData.value.id;
-  }
-  if (layerParams.value.decideWhetherToAddOrEdit === 1) {
-    //围栏新增
-    addFenceApi(params)
-      .then(res => {
-       if(res.data.code ===0 ){
-          ElMessage.success('新增成功');
-          EventBus.emit('gettreeDataApi');
-          loading.value = false;
-          emit('update:loading', false);
-          clearAllData();
-          emit('callParentMethod');
- }
-      })
-      .catch(err => {
-        ElMessage.error('新增失败,请重试');
-      })
-      .finally(() => {
-        loading.value = false;
-         emit('update:loading', false);
-      });
-  } else if (layerParams.value.decideWhetherToAddOrEdit === 2) {
-    //围栏编辑
-      deitFenceApi(params)
-      .then(res => {
-      if(res.data.code === 0){
-        ElMessage.success('编辑成功');
-        EventBus.emit('gettreeDataApi');
-        clearAllData();
-        emit('callParentMethod');
-        loading.value = false;
-         emit('update:loading', false);
-      }      
-      })
-      .catch(err => {
-        ElMessage.error('编辑失败,请重试');
-      })
-      .finally(() => {
-        loading.value = false;
-         emit('update:loading', false);
-      });
-        }
-};
-onMounted(() => {
-  // 获取判断状态(默认设为 1)
-  const addOrEditStatus = layerParams.value.decideWhetherToAddOrEdit || 1;
-  if (addOrEditStatus === 2) {
-    // 编辑状态:回显数据
-    const editData = layerParams.value.editDetailData || {};
-    formData.value = {
-      folder_id: editData.folder_id || '',
-      name: editData.name || '',
-      description: editData.description || '',
-      is_enabled: editData.is_enabled || false,
-      area: editData.area || '',
-      altitude: editData.altitude || '',
-      control_start_time: editData.control_start_time || '',
-      control_end_time: editData.control_end_time || '',
-      geo_data: editData.geo_data || '',
-      create_name: editData.create_name,
-      create_time: editData.create_time ? dayjs(editData.create_time).format('YYYY年MM月DD日') : '',
-    };
-    if (editData.folder_id && options.value.length > 0) {
-      const matchedFolder = options.value.find(item => item.value === String(editData.folder_id));
-      if (matchedFolder) {
-        formData.value.folder_id = matchedFolder.value;
-      }
-    }
-    if (editData.control_start_time && editData.control_end_time) {
-      timeValue.value = [
-        dayjs(editData.control_start_time).toDate(),
-        dayjs(editData.control_end_time).toDate(),
-      ];
-    }
-    fenceArea.value = editData.area || 0;
-  }
-});
-</script>
-
-<style scoped lang="scss">
-.rightContainer {
-  position: absolute;
-  top: 0;
-  right: 0;
-height: calc(100% - 32px);
-  z-index: 99;
-  width: 324px;
-
-  overflow: hidden;
-  background: rgba(0,0,0,0.51);
-  backdrop-filter: blur(4px);
-  border-radius: 8px 8px 8px 8px;
-  padding: 16px 12px;
-:deep(.el-select__wrapper.is-disabled .el-select__selected-item){
-color: rgba(255,255,255,0.37) !important;
-}
-  :deep(.el-textarea__inner) {
-    background: transparent !important;
-    color: #ffffff;
-  }
-  :deep(.el-textarea.is-disabled .el-textarea__inner){
-    color: var(--el-disabled-text-color) !important;
- 
-}
-  .contenttitle {
-    font-family: Source Han Sans CN, Source Han Sans CN;
-    font-weight: bold;
-    font-size: 16px;
-    color: #ffffff;
-    margin-bottom: 20px;
-  }
-  .centerBox {
-    font-family: Source Han Sans CN, Source Han Sans CN;
-    font-weight: 400;
-    font-size: 14px;
-    color: #ffffff;
-    .itemRow {
-      margin-bottom: 35px;
-    }
-    .label {
-      margin-bottom: 5px;
-    }
-    :deep(.el-date-editor.el-input__wrapper) {
-      width: auto !important;
-      background: transparent !important;
-    }
-    :deep(.el-range-editor.is-disabled input) {
-      background-color: transparent !important;
-    }
-  }
-  .detailInfo {
-    .infpItem {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      font-family: Source Han Sans CN, Source Han Sans CN;
-      font-weight: 400;
-      font-size: 14px;
-      color: #dfdfdf;
-      margin-bottom: 23px;
-      .num {
-        span {
-          font-family: Source Han Sans CN, Source Han Sans CN;
-          font-weight: bold;
-          font-size: 14px;
-          color: #ffffff;
-        }
-        .areaStyle {
-          font-family: Source Han Sans CN, Source Han Sans CN;
-          font-weight: bold;
-          font-size: 20px;
-          color: #ffffff;
-        }
-      }
-      .noFly {
-        display: flex;
-        align-items: center;
-      }
-      .itemData {
-        width: 50%;
-      }
-    }
-  }
-  .btnGroups {
-    display: flex;
-    justify-content: center;
-    position: absolute;
-    bottom: 29px;
-    left: 0;
-    right: 0;
-    img {
-      width: 125px;
-      height: 39px;
-      cursor: pointer;
-    }
-
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/layerManagement/index.vue b/applications/task-work-order/src/views/layerManagement/index.vue
deleted file mode 100644
index 451d0d6..0000000
--- a/applications/task-work-order/src/views/layerManagement/index.vue
+++ /dev/null
@@ -1,602 +0,0 @@
-<template>
-  <basic-container>
-    <div class="layerContainer">
-      <div>
-        <el-tabs v-model="activeType" @tab-click="handleClick">
-          <el-tab-pane v-for="tab in tabData" :key="tab.type" :label="tab.name" :name="tab.type">
-          </el-tab-pane>
-        </el-tabs>
-      </div>
-      <!-- 地图 -->
-      <div class="mapContainer" v-loading="isPageLoading"
-      element-loading-background="rgba(0, 0, 0, 0.5)"
-      element-loading-text="加载中...">
-      <div class="tool-tip warning" v-show="isShowWaringTip">
-          <span class="icon">
-            <el-icon><WarningFilled /></el-icon>
-          </span>
-          <span>{{ showWarnToolTipText }}</span>
-        </div>
-         <div class="tool-tip" v-if="!isShowWaringTip && layerParams.addNest">
-          {{ showToolTipText }}
-        </div>
-        <div id="layMap" class="ztzf-cesium"></div>
-        <leftList
-          v-if="
-            !layerParams.addNest &&
-            !layerParams.editNest &&
-            !layerParams.addFolder &&
-            !layerParams.editFolder
-          "
-          @update:coverData="handleCoverDataUpdate"
-          @update:deitData="handleEdit"
-          @update:editFolder="handleFolder"
-          :activeName="activeName"
-          @newFencesMethods="newFencesMethods"
-          :reset-check="resetCheck"
-        ></leftList>
-        <rightEdit
-          v-if="layerParams.addNest || layerParams.editNest"
-          @callParentMethod="parentMethod"
-          @update:loading="handleLoadingChange"
-        ></rightEdit>
-        <folderFile
-          @refreshMethod="refreshMethod"
-          :activeName="activeName"
-           @callParentMethod="parentMethod"
-          v-if="layerParams.addFolder || layerParams.editFolder"
-        ></folderFile>
-      </div>
-    </div>
-  </basic-container>
-</template>
-
-<script setup>
-import EventBus from '@/utils/eventBus';
-import * as turf from '@turf/turf';
-import { dataFolderApi } from '@/api/layer/index';
-import folderFile from '@/views/layerManagement/components/folderFile.vue';
-import { parseGeoDataToPositions } from '@/utils/geoParseUtil';
-import { flyVisual } from '@/utils/cesium/mapUtil';
-import rightEdit from '@/views/layerManagement/components/rightEdit.vue';
-import leftList from '@/views/layerManagement/components/leftList.vue';
-import { DrawPolygon } from '@/views/layerManagement/components/utils';
-import * as Cesium from 'cesium';
-import { PublicCesium } from '@/utils/cesium/publicCesium';
-import _, { cloneDeep, throttle } from 'lodash';
-
-import { provide } from 'vue';
-import { useStore } from 'vuex';
-const isProd = import.meta.env.VITE_APP_ENV === 'production'
-const store = useStore();
-const userInfo = computed(() => store.getters.userInfo);
-const areaCode = userInfo.value?.detail?.areaCode || '';
-const showToolTipText = ref('点击地图生成测绘区域')
-const showWarnToolTipText = ref('测区不支持交叉面')
-// 红色警告交叉面提示窗
-const isShowWaringTip = ref(false);
-const activeName = ref('自定义识别区');
-const activeType = ref('0');
-let tbJwdList = [];
-const selectDataList = ref([]);
-// 当前面位置信息
-let curPolygonPosition = [];
-const tabData = computed(() => {
-  const allTabs = [
-    {
-      name: '自定义识别区',
-      type: '0',
-    },
-    {
-      name: '自定义禁飞区',
-      type: '1',
-    },
-    {
-      name: '国土空间规划',
-      type: '2',
-    },
-  ];
-
-  // 如果是生产环境,只返回自定义识别区
-  if (isProd) {
-    return allTabs.filter(tab => tab.type === '0');
-  }
-  return allTabs;
-});
-const layerParams = ref({
-  addNest: false,
-  editNest: false,
-  editDetailData: null,
-  total_count: 0,
-  total_area: 0,
-  polygonPosition: null,
-  decideWhetherToAddOrEdit: null, //新增or编辑围栏
-  addAnEditingFolder: null, //新增or编辑文件夹
-  addFolder: false,
-  editFolder: false,
-  folderOption: [], //文件夹选项
-  fenceType: 1,
-  fenceArea: 0, //围栏面积
-  fileType: 1, //文件夹类型
-  editFolderData: null,
-  editingIsProhibited: false, //禁止编辑
-  isDetailShow: false,
-  isSingleLocating:false , //是否是单个定位
-  currentLocationFolderId:null,
-  crossSurface:false,//是否交叉面
-});
-const resetCheck = ref(false);
-const handleClick = tab => {
-  const clickedTab = tabData.value.find(item => item.type === tab.paneName);
-  activeType.value = clickedTab.type;
-  activeName.value = clickedTab.name;
-  getdataFolderApi();
-  parentMethod();
-  handleCoverDataUpdate([])
-  layerParams.value.addNest = false
-    layerParams.value.editNest = false
-     layerParams.value.addFolder = false
-    layerParams.value.editFolder = false
-    resetCheck.value = !resetCheck.value;
-
-};
-const refreshMethod = () => {
-  getdataFolderApi();
-};
-const getdataFolderApi = () => {
-  let id;
-  if (activeName.value === '自定义识别区') {
-    id = 1;
-  } else if (activeName.value === '自定义禁飞区') {
-    id = 2;
-  } else {
-    id = 3;
-  }
-  dataFolderApi(id).then(res => {
-    const originalFolderList = res.data.data || [];
-    const formattedFolderOption = originalFolderList.map(folder => ({
-      label: folder.name,
-      value: folder.id.toString(),
-    }));
-    layerParams.value.folderOption = formattedFolderOption;
-  });
-};
-
-// 编辑围栏区域
-const handleEdit = val => {
-  viewer.entities.removeAll();
-  layerParams.value.editDetailData = val;
-  drawPolygonExample.editThePatch(true);
-  drawPolygonExample.drawTheArea(true);
-  let geoDataArr = JSON.parse(val.geo_data);
-  if (geoDataArr.length > 0) {
-    geoDataArr.pop();
-  }
-  const processedGeoData = JSON.stringify(geoDataArr);
-  //geo_data 解析坐标
-  const positions = parseGeoDataToPositions(processedGeoData, val.altitude);
-  if (positions.length < 3) return; // 少于3个点无法构成多边形
-  drawPolygonExample.initPolygon(viewer, positions, true);
-};
-// 编辑文件夹
-const handleFolder = val => {
-parentMethod()
-  selectDataList.value = val.children;
-  if (selectDataList.value?.length > 0) {
-    loadDataToMap(selectDataList.value);
-  } else {
-    viewer.entities.removeAll();
-  }
-  layerParams.value.editFolderData = val;
-};
-// 新增开启绘制
-const newFencesMethods = () => {
-  viewer.entities.removeAll();
-  drawPolygonExample.initHandler(viewer);
-  drawPolygonExample.drawTheArea(true);
-  drawPolygonExample.startDrawing();
-};
-// 清除地图数据
-const parentMethod = () => {
-  drawPolygonExample.delPolygon();
-  drawPolygonExample.drawTheArea(false);
-  viewer.entities.removeAll();
-};
-// 点击显示区域
-const handleCoverDataUpdate = data => {
-  selectDataList.value = data;
-  if (selectDataList.value?.length > 0) {
-    loadDataToMap(selectDataList.value);
-  } else {
-    viewer.entities.removeAll();
-  }
-};
-const loadDataToMap = dataList => {
-  if (!viewer) return;
-  viewer.entities.removeAll();
-  // 存储所有有效坐标
-  tbJwdList = [];
-  dataList.forEach(item => {
-    let positions = parseGeoDataToPositions(item.geo_data, item.altitude);
-    if (positions.length < 3) {
-      console.warn(`数据 ${item.name} 坐标点不足,无法绘制`);
-      return;
-    }
-
-    tbJwdList.push(...positions);
-    let degreesArray = [];
-    positions.forEach(pos => {
-      degreesArray.push(pos.lng, pos.lat, pos.height);
-    });
-     const colorMap = {
-    1: Cesium.Color.fromCssColorString('#00ff06').withAlpha(0.5), // 绿色(填充色)
-    2: Cesium.Color.fromCssColorString('#ff0000').withAlpha(0.5), // 红色(填充色)
-    3: Cesium.Color.fromCssColorString('#00ffea').withAlpha(0.5), // 青色(填充色)
-    // 边框色:去掉透明度,保持纯色
-    border1: Cesium.Color.fromCssColorString('#00ff06'),
-    border2: Cesium.Color.fromCssColorString('#ff0000'),
-    border3: Cesium.Color.fromCssColorString('#00ffea'),
-  };
-   const fillColor = item.category_id === 1
-      ? colorMap[1]
-      : item.category_id === 2
-        ? colorMap[2]
-        : item.category_id === 3
-          ? colorMap[3]
-          : Cesium.Color.YELLOW.withAlpha(0.5);
-
-    const borderColor = item.category_id === 1
-      ? colorMap.border1
-      : item.category_id === 2
-        ? colorMap.border2
-        : item.category_id === 3
-          ? colorMap.border3
-          : Cesium.Color.YELLOW;
-      viewer.entities.add({
-      id: `polygon_${item.id}`,
-      customType: 'fence_polygon',
-      customInfo: item,
-      polygon: {
-        hierarchy: new Cesium.PolygonHierarchy(
-          Cesium.Cartesian3.fromDegreesArrayHeights(degreesArray)
-        ),
-        material:fillColor, // 填充色
-        outline: true, // 显示边框
-        outlineColor: borderColor, // 边框色
-        outlineWidth: 2, // 边框宽度
-        clampToGround: true, // 贴地显示
-      },
-
-      polyline: {
-        positions: Cesium.Cartesian3.fromDegreesArrayHeights(degreesArray),
-        width: 2,
-        material:borderColor,
-        clampToGround: true,
-      },
-      zIndex: 99,
-    });
-  });
- if (!layerParams.value.isSingleLocating) {
-    focusOnAllFeatures();
-  }
-  viewInstance.value?.addLeftClickEvent(null, handleFenceClick);
-};
-const focusOnAllFeatures = () => {
-  if (tbJwdList.length === 0 || !viewer) return;
-
-  // 判断是否有指定定位的文件夹
-  if (layerParams.value.currentLocationFolderId) {
-    // 筛选当前文件夹下的所有子节点坐标
-    const targetFolderPositions = selectDataList.value
-      .filter(item => item.folder_id === layerParams.value.currentLocationFolderId)
-      .flatMap(item => {
-        const positions = parseGeoDataToPositions(item.geo_data, item.altitude);
-        return positions.length >= 3 ? positions : [];
-      });
-
-    if (targetFolderPositions.length > 0) {
-      const positionsData = targetFolderPositions.map(pos => [
-        pos.lng,
-        pos.lat,
-        pos.height || 0
-      ]);
-      flyVisual({
-        positionsData,
-        viewer,
-        multiple: activeName.value === '国土空间规划' ? 13 : 10,
-        pitch: -90
-      });
-      return; // 仅聚焦当前文件夹,结束方法
-    }
-  }
-
-  // 无指定文件夹时,聚焦所有选中数据
-  const positionsData = tbJwdList.map(pos => [
-    pos.lng,
-    pos.lat,
-    pos.height || 0
-  ]);
-  flyVisual({
-    positionsData,
-    viewer,
-    multiple: activeName.value === '国土空间规划' ? 13 : 4,
-    pitch: -90
-  });
-};
-// 区域点击显示详细信息
-const handleFenceClick = movement => {
-if(layerParams.value.editFolder) return
-  if (!viewer) return;
-  layerParams.value.editDetailData = null;
-
-if(activeName.value !== '国土空间规划') {
-    const pickedObjects = viewer.scene.drillPick(movement.position, 10);
-  // 遍历所有被点击的实体,找到围栏类型(customType: 'fence_polygon')
-  let selectedEntity = null;
-  for (let i = 0; i < pickedObjects.length; i++) {
-    const pick = pickedObjects[i];
-    if (Cesium.defined(pick.id) && pick.id?.customType === 'fence_polygon') {
-      selectedEntity = pick.id;
-      break;
-    }
-  }
-    // viewer.entities.values.forEach(entity => {
-    // if (entity.customType === 'fence_polygon') {
-    //   entity.polygon.material = entity === selectedEntity
-    //     ? Cesium.Color.RED.withAlpha(0.5)
-    //     : Cesium.Color.YELLOW.withAlpha(0.5);
-    // }
-    // });
-  if (selectedEntity) {
-    const selectedData = selectedEntity.customInfo;
-    if (activeName.value !== '国土空间规划') {
-      layerParams.value.editNest = true;
-      layerParams.value.decideWhetherToAddOrEdit = 2;
-      if (activeName.value === '自定义识别区') {
-        layerParams.value.fenceType = 1;
-      } else if (activeName.value === '自定义禁飞区') {
-        layerParams.value.fenceType = 2;
-      }
-      layerParams.value.editDetailData = selectedData;
-      layerParams.value.fenceArea = selectedData.area;
-      layerParams.value.editingIsProhibited = true;
-    }
-  }
-}
-
-};
-let publicCesiumInstance = null;
-let viewer = null;
-const viewInstance = shallowRef(null);
-const drawPolygonExample = new DrawPolygon();
-// 地图初始化
-const initMap = () => {
-  publicCesiumInstance = new PublicCesium({
-    dom: 'layMap',
-    flatMode: false,
-    terrain: true,
-    layerMode: 4, //轮廓线
-    dockOptions:{showDock:true}//机巢
-  });
-  viewer = publicCesiumInstance.getViewer();
-  viewInstance.value = publicCesiumInstance;
-  viewInstance.value?.flyToContour();
-  const nanChangPosition = Cesium.Cartesian3.fromDegrees(
-    115.892151, // 经度
-    28.676493, // 纬度
-    15000 // 相机高度
-  );
-
-  // 执行相机飞行
-  viewer.camera.flyTo({
-    destination: nanChangPosition,
-    duration: 0,
-    orientation: {
-      heading: Cesium.Math.toRadians(0),
-      pitch: Cesium.Math.toRadians(-90),
-      roll: 0,
-    },
-  });
-};
-// 编辑/绘制
-const loadPlanarRoute = async (positions = null, save = false) => {
-  if (positions) {
-    curPolygonPosition = positions.map(item => {
-      let cartographic = Cesium.Cartographic.fromCartesian(item);
-      let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度
-      let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度
-      let height = Cesium.Math.toDegrees(cartographic.height); //高度
-      return {
-        lng: _.round(lng, 6),
-        lat: _.round(lat, 6),
-        height: _.round(height, 6),
-      };
-    });
-  }
-  let polygon = curPolygonPosition.map(item => [item?.lng, item?.lat]);
-  if(polygon.length ===0){
-    isShowWaringTip.value = false
-  }
-  if(polygon.length > 0 && !isShowWaringTip.value){
-    showToolTipText.value = '测绘区域已绘制完成'
-  } else {
-    showToolTipText.value = '点击地图生成测绘区域'
-  }
-
- if(polygon.length > 0){
-      polygon.push([curPolygonPosition[0]?.lng, curPolygonPosition[0]?.lat])
- }
-  let polygonString = JSON.stringify(polygon);
-  layerParams.value.polygonPosition = polygon.length > 0 ? polygonString : null;
-  if (polygon.length >= 3) {
-    //  确保多边形闭合:最后一个点与第一个点一致
-    const firstPoint = polygon[0];
-    const lastPoint = polygon[polygon.length - 1];
-    const isClosed =
-      _.round(firstPoint[0], 6) === _.round(lastPoint[0], 6) &&
-      _.round(firstPoint[1], 6) === _.round(lastPoint[1], 6);
-    const closedPolygon = isClosed ? polygon : [...polygon, firstPoint];
-    const turfPolygon = turf.polygon([closedPolygon]);
-    const area = _.round(turf.area(turfPolygon), 2);
-    if (area / 1000000 < 50) {
-      layerParams.value.fenceArea = area;
-    } else {
-      layerParams.value.fenceArea = area;
-      isShowWaringTip.value = true
-      showWarnToolTipText.value = '自定义禁飞区不能超过50平方公里'
-    }
-  } else {
-    layerParams.value.fenceArea = 0;
-  }
-};
-drawPolygonExample.subscribe('getShowWaringTip', data => {
-  isShowWaringTip.value = data;
-  showWarnToolTipText.value = '测区不支持交叉面'
-  layerParams.value.crossSurface = data
-});
-const throttleLoadPlanarRoute = throttle(loadPlanarRoute, 200);
-drawPolygonExample.subscribe('getPolygonPositions', data => {
-  throttleLoadPlanarRoute(data);
-});
-
-// 地图销毁
-const destroyMap = () => {
-  drawPolygonExample.destroy();
-  if (viewer) {
-    viewer.destroy();
-    viewer = null;
-  }
-  publicCesiumInstance = null;
-};
-// 阻止浏览器默认
-const preventDefault = event => {
-  event.preventDefault();
-  return;
-};
-const cesiumContextMenu = (isAdd = true) => {
-  let cesium = document.getElementById('layMap');
-  if (!cesium) return;
-  if (isAdd) {
-    cesium.addEventListener('contextmenu', preventDefault);
-  } else {
-    cesium.removeEventListener('contextmenu', preventDefault);
-  }
-};
-// 添加loading
-const isPageLoading = ref(false);
-const handleLoadingChange = (status) => {
-  isPageLoading.value = status;
-};
-provide('layerParams', layerParams);
-onMounted(() => {
-  initMap();
-  cesiumContextMenu();
-  getdataFolderApi();
-  // 监听定位事件
-  EventBus.on('focusOnNode', (nodeData) => {
-    focusOnNode(nodeData);
-  });
-  EventBus.on('deleteMapEntityById', deleteMapEntityById);
-  EventBus.on('deleteMapEntitiesByFolderId', deleteMapEntitiesByFolderId);
-});
-
-//定位到指定节点
-const focusOnNode = (nodeData) => {
-  if (!viewer || !nodeData?.geo_data) return;
-
-  // 解析节点坐标
-  const positions = parseGeoDataToPositions(nodeData.geo_data, nodeData.altitude);
-  if (positions.length < 3) return;
-
-  // level 2 节点走全量聚焦,level 3 节点走单个聚焦
-  if (nodeData.level === 2) {
-    focusOnAllFeatures();
-  } else {
-    flyVisual({
-      positionsData: positions.map(pos => [pos.lng, pos.lat, pos.height || 0]),
-      viewer,
-      multiple: activeName.value === '国土空间规划' ? 13 : 7, // 缩放倍数
-      pitch: -90
-    });
-  }
-};
-onBeforeUnmount(() => {
-  destroyMap();
-  cesiumContextMenu(false);
-  EventBus.off('deleteMapEntityById', deleteMapEntityById);
-  EventBus.off('deleteMapEntitiesByFolderId', deleteMapEntitiesByFolderId);
-});
-// 删除单个地图实体
-const deleteMapEntityById = entityId => {
-  if (!viewer) return;
-  const entity = viewer.entities.getById(`polygon_${entityId}`);
-  if (entity) {
-    viewer.entities.remove(entity);
-  }
-  // 更新选中数据列表
-  selectDataList.value = selectDataList.value.filter(item => item.id !== entityId);
-};
-// 删除文件夹下所有地图实体
-const deleteMapEntitiesByFolderId = folderId => {
-  if (!viewer) return;
-  const entitiesToDelete = viewer.entities.values.filter(entity => {
-    return entity.customInfo?.folder_id === folderId;
-  });
-  entitiesToDelete.forEach(entity => {
-    viewer.entities.remove(entity);
-  });
-  // 更新选中数据列表
-  selectDataList.value = selectDataList.value.filter(item => item.folder_id !== folderId);
-  getdataFolderApi()
-};
-</script>
-
-<style scoped lang="scss">
-.layerContainer {
-  width: 100%;
-  height: 90vh;
-}
-.mapContainer {
-  position: relative;
-  width: 100%;
-  height: 80vh;
-    .warning {
-    position: absolute;
-    top: 234px;
-    color: #fff;
-    background: rgba(140, 0, 0, 0.4) !important;
-
-    .icon {
-      display: flex;
-      align-items: center;
-      color: #ff1f1f;
-    }
-  }
-  #layMap {
-    width: 100%;
-    height: 100%;
-     border-radius: 8px 8px 8px 8px;
-     overflow: hidden;
-  }
-  .tool-tip {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    position: absolute;
-    width: 800px;
-    height: 64px;
-    right: 430px;
-    top: 60px;
-    font-family: Source Han Sans CN, Source Han Sans CN;
-    font-size: 18px;
-    color: #ffffff;
-
-    background: rgba(11, 31, 58, 0.7);
-    -moz-user-select: none;
-    -webkit-user-select: none;
-    -ms-user-select: none;
-    user-select: none;
-  }
-
-}
-</style>
diff --git a/applications/task-work-order/src/views/license/license.vue b/applications/task-work-order/src/views/license/license.vue
deleted file mode 100644
index d5b9bc3..0000000
--- a/applications/task-work-order/src/views/license/license.vue
+++ /dev/null
@@ -1,360 +0,0 @@
-<template>
-    <basic-container>
-
-        <avue-crud :option="option" :table-loading="loading" :data="data" v-model:page="page" ref="crud"
-            @row-del="rowDel" v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave"
-            :before-open="beforeOpen" @search-change="searchChange" @search-reset="searchReset"
-            @selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange"
-            @refresh-change="refreshChange" @on-load="onLoad">
-
-            <!-- 自定义证书地址列 -->
-            <template #url="scope">
-                <el-link :href="scope.row.url" target="_blank" type="primary">
-                    下载密钥
-                </el-link>
-            </template>
-
-            <!-- 自定义过期时间列 -->
-            <template #expireDay="scope">
-                <span :style="{ color: isExpired(scope.row.expireDay) ? 'red' : 'inherit' }">
-                    {{ formatExpireDay(scope.row.expireDay, scope.row.licenseType) }}
-                </span>
-            </template>
-
-            <!-- 自定义设备数量列 -->
-            <template #printClientCount="scope">
-                <span>
-                    {{ scope.row.printClientCount === -1 ? '不限制' : scope.row.printClientCount }}
-                </span>
-            </template>
-
-            <!-- 自定义是否校验机器码列 -->
-            <template #checkMachineCode="scope">
-                <span>
-                    {{ scope.row.checkMachineCode ? '校验机器码' : '不校验' }}
-                </span>
-            </template>
-            <template #menu-left>
-                <el-button type="primary" icon="el-icon-plus" @click="createLicenseShow()">新 增
-                </el-button>
-            </template>
-        </avue-crud>
-
-        <!-- 新增弹窗 -->
-        <el-dialog class="ztzf-dialog-mange" title="新增 License" v-model="addDialogVisible" width="70%" :close-on-click-modal="false"
-            @close="resetForm">
-            <el-form :model="newLicense" ref="licenseForm" label-width="120px">
-                <el-form-item label="机构ID" prop="licenseId">
-                    <el-input v-model="newLicense.licenseId" />
-                </el-form-item>
-                <el-form-item label="机构名称" prop="licenseName" required>
-                    <el-input v-model="newLicense.licenseName" />
-                </el-form-item>
-                <el-form-item label="过期时间类型" prop="licenseType" required>
-                    <el-select v-model="newLicense.licenseType" placeholder="请选择">
-                        <el-option label="不验证过期时间" :value="1" />
-                        <el-option label="验证过期时间" :value="2" />
-                    </el-select>
-                </el-form-item>
-                <el-form-item v-if="newLicense.licenseType == 2" label="过期时间" prop="expireDay">
-                    <el-date-picker v-model="newLicense.expireDay" type="date" placeholder="选择日期" />
-                </el-form-item>
-                <el-form-item label="设备数量" prop="printClientCount">
-                    <el-radio-group v-model="deviceLimit">
-                        <el-radio :label="-1">不限制</el-radio>
-                        <el-radio :label="1">限制</el-radio>
-                    </el-radio-group>
-                    <el-input-number v-if="deviceLimit === 1" v-model="newLicense.printClientCount" :min="0"
-                        placeholder="请输入数量" style="margin-top: 10px;" />
-                </el-form-item>
-                <el-form-item label="是否校验机器码" prop="checkMachineCode">
-                    <el-switch v-model="newLicense.checkMachineCode" />
-                </el-form-item>
-                <el-form-item label="机器码" prop="machineCode">
-                    <el-input v-model="newLicense.machineCode" type="textarea" rows="3" />
-                </el-form-item>
-                <el-form-item label="备注" prop="remark">
-                    <el-input v-model="newLicense.remark" />
-                </el-form-item>
-            </el-form>
-            <template #footer>
-                <div class="dialog-footer">
-                  <el-button type="primary" @click="createLicense" :icon="CircleCheck">保存</el-button>
-                  <el-button @click="addDialogVisible = false"  :icon="CircleClose">取消</el-button>
-                </div>
-            </template>
-
-        </el-dialog>
-    </basic-container>
-</template>
-
-<script>
-import { getList, add } from '@/api/license/license'
-import { mapGetters } from 'vuex'
-import { CircleCheck, CircleClose } from '@element-plus/icons-vue';
-
-export default {
-    data () {
-        return {
-            loading: true,
-            page: {
-                pageSize: 10,
-                currentPage: 1,
-                total: 0,
-            },
-            selectionList: [],
-            addDialogVisible: false,
-            deviceLimit: -1, // 控制设备数量选择
-            newLicense: {
-                licenseId: '',
-                licenseName: '',
-                licenseType: null,
-                expireDay: null,
-                printClientCount: -1,
-                checkMachineCode: false,
-                machineCode: '',
-                remark: '',
-            },
-            option: {
-                menuWidth: 300,
-                lazy: true,
-                tree: false,
-                tip: false,
-                searchShow: true,
-                searchMenuSpan: 6,
-                border: true,
-                index: true,
-                viewBtn: true,
-                selection: false,
-                excelBtn: false,
-                addBtnText: '新建license',
-                addBtn: true,
-                dialogClickModal: false,
-                grid: false,
-
-                height: 'auto',
-                calcHeight: 20,
-
-                column: [
-                    {
-                        label: '机构ID',
-                        prop: 'licenseId',
-                        labelWidth: 130,
-                        search: false,
-                        rules: [
-                            {
-                                required: false,
-                                message: '请输入机构ID',
-                                trigger: 'blur',
-                            },
-                        ],
-                    },
-                    {
-                        label: '机构名称',
-                        prop: 'licenseName',
-                        labelWidth: 130,
-                        search: false,
-                        rules: [
-                            {
-                                required: true,
-                                message: '请输入机构名称',
-                                trigger: 'blur',
-                            },
-                        ],
-                    },
-                    {
-                        label: '是否验证过期时间',
-                        prop: 'licenseType',
-                        type: 'select',
-                        labelWidth: 130,
-                        dicData: [
-                            {
-                                label: '不验证过期时间',
-                                value: 1,
-                            },
-                            {
-                                label: '验证过期时间',
-                                value: 2,
-                            },
-                        ],
-                        rules: [
-                            {
-                                required: true,
-                                message: '请选择类型',
-                                trigger: 'change',
-                            },
-                        ],
-                    },
-                    {
-                        label: '过期时间',
-                        prop: 'expireDay',
-                        type: 'date',
-                        labelWidth: 130,
-                        slot: true, // 启用自定义插槽
-                        rules: [
-                            {
-                                required: false,
-                                message: '请选择过期时间',
-                                trigger: 'change',
-                            },
-                        ],
-                    },
-                    {
-                        label: '设备数量',
-                        prop: 'printClientCount',
-                        type: 'number',
-                        labelWidth: 130,
-                        slot: true, // 启用自定义插槽
-                        rules: [
-                            {
-                                required: false,
-                                message: '请输入设备数量',
-                                trigger: 'blur',
-                            },
-                        ],
-                    },
-                    {
-                        label: '是否校验机器码',
-                        prop: 'checkMachineCode',
-                        type: 'switch',
-                        labelWidth: 130,
-                        slot: true, // 启用自定义插槽
-                        rules: [
-                            {
-                                required: false,
-                                message: '请选择是否校验机器码',
-                                trigger: 'change',
-                            },
-                        ],
-                    },
-                    {
-                        label: '机器码',
-                        prop: 'machineCode',
-                        type: 'textarea',
-                        labelWidth: 130,
-                        rules: [
-                            {
-                                required: false,
-                                message: '请输入机器码',
-                                trigger: 'blur',
-                            },
-                        ],
-                    },
-                    {
-                        label: '密钥地址',
-                        prop: 'url',
-                        labelWidth: 130,
-                        slot: true, // 启用自定义插槽
-                        rules: [
-                            {
-                                required: false,
-                                trigger: 'blur',
-                            },
-                        ],
-                    },
-                    {
-                        label: '备注',
-                        prop: 'remark',
-                        labelWidth: 130,
-                        rules: [
-                            {
-                                required: false,
-                                message: '请输入备注',
-                                trigger: 'blur',
-                            },
-                        ],
-                    },
-                ],
-            },
-            data: [],
-        }
-    },
-    computed: {
-      CircleClose() {
-        return CircleClose
-      },
-      CircleCheck() {
-        return CircleCheck
-      },
-        ...mapGetters(['userInfo', 'permission']),
-        permissionList () {
-            return {
-                addBtn: this.validData(this.permission.license_add, false),
-                viewBtn: this.validData(this.permission.license_view, true),
-                delBtn: this.validData(this.permission.license_delete, false),
-                editBtn: this.validData(this.permission.license_edit, false),
-            }
-        },
-    },
-    methods: {
-        isExpired (expireDay) {
-            const now = new Date()
-            return new Date(expireDay) < now
-        },
-        formatExpireDay (expireDay, licenseType) {
-            if (licenseType == 2 && this.isExpired(expireDay)) {
-                return `${expireDay} (已过期)`
-            }
-            if (licenseType == 1) {
-                return `永久`
-            }
-            return expireDay
-        },
-        rowSave (row, done, loading) {
-            add(row).then(
-                () => {
-                    this.onLoad(this.page)
-                    this.$message({
-                        type: 'success',
-                        message: '操作成功!',
-                    })
-                    done()
-                },
-                error => {
-                    console.error(error)
-                    loading()
-                }
-            )
-        },
-        createLicenseShow () {
-            this.addDialogVisible = true
-        },
-        createLicense () {
-            // 格式化过期时间
-            if (this.newLicense.expireDay) {
-                this.newLicense.expireDay = this.formatDate(this.newLicense.expireDay)
-                console.log(this.newLicense.expireDay)
-
-            }
-
-            // 保存数据
-            add(this.newLicense).then(() => {
-                this.$message.success('新增成功')
-                this.addDialogVisible = false
-                this.onLoad(this.page)
-            }).catch(error => {
-                console.error(error)
-                this.$message.error('新增失败')
-            })
-        },
-        formatDate (date) {
-            const d = new Date(date)
-            const year = d.getFullYear()
-            const month = String(d.getMonth() + 1).padStart(2, '0')
-            const day = String(d.getDate()).padStart(2, '0')
-            return `${year}-${month}-${day}`
-        },
-        onLoad (page, params = {}) {
-            this.loading = true
-            getList(page.currentPage, page.pageSize, params).then(res => {
-                const data = res.data.data
-                this.page.total = data.total
-                this.data = data.records
-                this.loading = false
-            })
-        },
-    },
-}
-</script>
-
-<style lang="scss" scoped></style>
diff --git a/applications/task-work-order/src/views/license/upload.vue b/applications/task-work-order/src/views/license/upload.vue
deleted file mode 100644
index 3743ac2..0000000
--- a/applications/task-work-order/src/views/license/upload.vue
+++ /dev/null
@@ -1,112 +0,0 @@
-<!-- filepath: /d:/work/drone-web-manage/src/views/license/upload.vue -->
-<template>
-    <!-- <basic-container>
-        <el-upload
-            class="upload-demo"
-            drag
-            :http-request="customUpload"
-            :show-file-list="false"
-            accept=".lic"
-        >
-            <i class="el-icon-upload"></i>
-            <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
-            <div class="el-upload__tip">仅支持扩展名:lic</div>
-        </el-upload>
-    </basic-container> -->
-    <!-- 密钥上传 -->
-    <div class="upload-file">
-      <img v-if="isSuccess === 'success'" :src="uploadSuccess" alt="" />
-      <div v-if="isSuccess === 'success'">上传成功</div>
-      <img v-if="isSuccess === 'error'" :src="uploadError" alt="" />
-      <div v-if="isSuccess === 'error'">上传失败</div>
-      <el-upload
-        action="/upload"
-        accept=".lic"
-        :show-file-list="false"
-        :before-upload="handleUpload"
-      >
-        <div class="upload-btn">密钥上传</div>
-      </el-upload>
-      <div class="password-time">密钥有效期:{{ passwordTime || '永久有效' }}</div>
-    </div>
-</template>
-
-<script>
-import { uploadLicense } from '@/api/license/uploadLicense';
-import { findLicenseDate } from '@/api/system/dict';
-import uploadSuccess from '@/assets/images/uoload-success.png';
-import uploadError from '@/assets/images/upload-error.png';
-
-export default {
-    data() {
-        return {
-            isSuccess: '', // 上传状态
-            passwordTime: '', // 密钥有效期
-            uploadSuccess, // 上传成功图片
-            uploadError, // 上传失败图片
-        };
-    },
-    mounted() {
-        this.getFindLicenseDate();
-    },
-    methods: {
-        handleUpload(file) {
-            uploadLicense(file)
-            .then(res => {
-                console.log(res.data.code,'444')
-                if (res.data.code !== 200) return this.$message.error('上传失败');
-                this.$message.success('上传成功');
-                this.isSuccess = 'success';
-                this.getFindLicenseDate();
-            })
-            .catch(err => {
-                this.isSuccess = 'error';
-                this.$message.error('上传失败');
-            });
-        },
-        getFindLicenseDate() {
-            findLicenseDate()
-                .then(res => {
-                    if (res.data.code !== 0) return this.$message.error('上传失败');
-                    this.passwordTime = res.data.data;
-                })
-                .catch(err => {
-                    this.$message.error('获取失败失败');
-                });
-        },
-    },
-};
-</script>
-
-<style scoped lang="scss">
-.upload-file {
-  text-align: center;
-  margin-top: 60px;
-  .upload-btn {
-    width: 93px;
-    height: 38px;
-    background: #DDEBFF;
-    border-radius: 8px 8px 8px 8px;
-    border: 1px solid #409EFF;
-    text-align: center;
-    font-family: Source Han Sans CN, Source Han Sans CN;
-    font-weight: bold;
-    font-size: 14px;
-    color: #228CFA;
-    line-height: 38px;
-    text-align: center;
-    margin-top: 10px;
-  }
-  .password-time {
-    margin-top: 50px;
-    width: 100%;
-    height: 16px;
-    font-family: Source Han Sans CN, Source Han Sans CN;
-    font-weight: 400;
-    font-size: 14px;
-    color: #2d9dff;
-    line-height: 16px;
-    // text-align: left;
-  }
-}
-</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/monitor/log/api.vue b/applications/task-work-order/src/views/monitor/log/api.vue
deleted file mode 100644
index b4798a4..0000000
--- a/applications/task-work-order/src/views/monitor/log/api.vue
+++ /dev/null
@@ -1,218 +0,0 @@
-<template>
-  <basic-container >
-    <avue-crud :option="option" :table-loading="loading" :data="data" ref="crud" v-model="form"
-      :permission="permissionList" :before-open="beforeOpen" v-model:page="page" @search-change="searchChange"
-      @search-reset="searchReset" @current-change="currentChange" @size-change="sizeChange"
-      @refresh-change="refreshChange" @on-load="onLoad">
-    </avue-crud>
-  </basic-container>
-</template>
-
-<script>
-import { getApiList, getApiLogs } from '@/api/logs'
-import { mapGetters } from 'vuex'
-
-export default {
-  data () {
-    return {
-      form: {},
-      selectionList: [],
-      query: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      option: {
-        emptyBtnText: '重置',
-        emptyBtnIcon: 'el-icon-refresh',
-        // height: 'auto',
-        // calcHeight: 32,
-        tip: false,
-        searchShow: true,
-        searchGutter: 30,
-        searchMenuPosition: 'left',
-        searchMenuSpan: 4,
-        border: true,
-        index: true,
-        viewBtn: true,
-        editBtn: false,
-        addBtn: false,
-        delBtn: false,
-        menuWidth: 120,
-        dialogType: 'drawer',
-
-        height: 'auto',
-        calcHeight: 20,
-
-        column: [
-          {
-            label: '操作名称',
-            prop: 'title',
-            search: true,
-            searchSpan: 4,
-          },
-          {
-            label: '操作人',
-            prop: 'createBy',
-            search: true,
-            width: 120,
-            searchSpan: 4,
-          },
-          {
-            label: '操作人IP',
-            prop: 'remoteIp',
-            width: 130,
-          },
-          {
-            label: '服务模块',
-            prop: 'serviceId',
-            width: '120',
-          },
-          {
-            label: '服务host',
-            prop: 'serverHost',
-            hide: true,
-          },
-          {
-            label: '服务ip',
-            prop: 'serverIp',
-            width: '160',
-            hide: true,
-          },
-          {
-            label: '服务环境',
-            prop: 'env',
-            width: '85',
-          },
-
-          {
-            label: '请求方法',
-            prop: 'method',
-            width: '85',
-          },
-          {
-            label: '请求接口',
-            prop: 'requestUri',
-            search: true,
-            searchSpan: 4,
-          },
-          {
-            label: '用户代理',
-            prop: 'userAgent',
-            span: 24,
-            hide: true,
-          },
-          {
-            label: '请求数据',
-            prop: 'params',
-            type: 'textarea',
-            span: 24,
-            minRows: 2,
-            hide: true,
-          },
-          {
-            label: '操作时间',
-            prop: 'daterange',
-            type: 'daterange',
-            search: true,
-            searchRange: true,
-            searchSpan: 8,
-            format: 'YYYY-MM-DD',
-            valueFormat: 'YYYY-MM-DD',
-            startPlaceholder: '开始时间',
-            endPlaceholder: '结束时间',
-            viewDisplay: false,
-            hide: true,
-            rules: [
-              {
-                required: true,
-                message: '请选择操作时间',
-                trigger: 'blur',
-              },
-            ],
-             change: (value) => {
-               this.searchChange({ ...this.query,daterange:value.value}, () => {});
-          }
-          },
-          {
-            label: '操作时间',
-            prop: 'createTime',
-            width: '180',
-          },
-        ],
-      },
-      data: [],
-    }
-  },
-
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList () {
-      return {
-        viewBtn: this.validData(this.permission.log_api_view, false),
-      }
-    },
-  },
-  methods: {
-    searchReset () {
-      this.query = {}
-      this.onLoad(this.page)
-    },
-    searchChange (params, done) {
-      this.query = params
-      this.page.currentPage = 1
-      this.onLoad(this.page, params)
-      done()
-    },
-    beforeOpen (done, type) {
-      if (['edit', 'view'].includes(type)) {
-        getApiLogs(this.form.id).then(res => {
-          this.form = res.data.data
-        })
-      }
-      done()
-    },
-    currentChange (currentPage) {
-      this.page.currentPage = currentPage
-    },
-    sizeChange (pageSize) {
-      this.page.pageSize = pageSize
-    },
-    refreshChange () {
-      this.onLoad(this.page, this.query)
-    },
-    onLoad (page, params = {}) {
-      const { daterange } = this.query
-      let values = {
-        ...params,
-        ...this.query,
-      }
-      if (daterange) {
-        values = {
-          ...values,
-          startTime: daterange[0],
-          endTime: daterange[1],
-        }
-        values.daterange = null
-      }
-      this.loading = true
-      getApiList(page.currentPage, page.pageSize, values).then(res => {
-        const data = res.data.data
-        this.page.total = data.total
-        this.data = data.records
-        this.loading = false
-      })
-    },
-  },
-}
-</script>
-
-
-<style lang="scss">
-
-.avue-crud__dialog__header .el-dialog__title {
-  font-size: 18px !important;
-}
-</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/monitor/log/error.vue b/applications/task-work-order/src/views/monitor/log/error.vue
deleted file mode 100644
index 3d2a5e6..0000000
--- a/applications/task-work-order/src/views/monitor/log/error.vue
+++ /dev/null
@@ -1,173 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud :option="option" :table-loading="loading" :data="data" ref="crud" :before-open="beforeOpen"
-      v-model="form" :permission="permissionList" v-model:page="page" @search-change="searchChange"
-      @search-reset="searchReset" @current-change="currentChange" @size-change="sizeChange"
-      @refresh-change="refreshChange" @on-load="onLoad">
-    </avue-crud>
-  </basic-container>
-</template>
-
-<script>
-import { getErrorList, getErrorLogs } from '@/api/logs'
-import { mapGetters } from 'vuex'
-
-export default {
-  data () {
-    return {
-      form: {},
-      selectionList: [],
-      query: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      option: {
-        emptyBtnText: '重置',
-        emptyBtnIcon: 'el-icon-refresh',
-        tip: false,
-        searchShow: true,
-        searchGutter: 30,
-        searchMenuPosition: 'left',
-        searchMenuSpan: 4,
-        border: true,
-        index: true,
-        viewBtn: true,
-        editBtn: false,
-        addBtn: false,
-        delBtn: false,
-        menuWidth: 120,
-        dialogType: 'drawer',
-
-        height: 'auto',
-        calcHeight: 20,
-
-        column: [
-          {
-            label: '服务名称',
-            prop: 'serviceId',
-            search: true,
-            searchSpan: 4,
-            width: '120',
-          },
-
-          {
-            label: '服务host',
-            prop: 'serverHost',
-          },
-          {
-            label: '服务ip',
-            prop: 'serverIp',
-            width: '160',
-          },
-          {
-            label: '软件环境',
-            prop: 'env',
-            width: '85',
-          },
-          {
-            label: '请求方法',
-            prop: 'method',
-            width: '85',
-          },
-          {
-            label: '请求接口',
-            prop: 'requestUri',
-            search: true,
-            searchSpan: 4,
-          },
-          {
-            label: '操作人',
-            prop: 'createBy',
-            search: true,
-            searchSpan: 4,
-            width: '120',
-          },
-          {
-            label: '日志时间',
-            prop: 'createTime',
-            width: '180',
-          },
-          {
-            label: '用户代理',
-            prop: 'userAgent',
-            span: 24,
-            hide: true,
-          },
-          {
-            label: '请求数据',
-            prop: 'params',
-            type: 'textarea',
-            span: 24,
-            minRows: 2,
-            hide: true,
-          },
-          {
-            label: '日志数据',
-            prop: 'stackTrace',
-            type: 'textarea',
-            span: 24,
-            minRows: 16,
-            hide: true,
-          },
-        ],
-      },
-      data: [],
-    }
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList () {
-      return {
-        viewBtn: this.validData(this.permission.log_error_view, false),
-      }
-    },
-  },
-  methods: {
-    searchReset () {
-      this.query = {}
-      this.onLoad(this.page)
-    },
-    searchChange (params, done) {
-      this.query = params
-      this.page.currentPage = 1
-      this.onLoad(this.page, params)
-      done()
-    },
-    beforeOpen (done, type) {
-      if (['edit', 'view'].includes(type)) {
-        getErrorLogs(this.form.id).then(res => {
-          this.form = res.data.data
-        })
-      }
-      done()
-    },
-    currentChange (currentPage) {
-      this.page.currentPage = currentPage
-    },
-    sizeChange (pageSize) {
-      this.page.pageSize = pageSize
-    },
-    refreshChange () {
-      this.onLoad(this.page, this.query)
-    },
-    onLoad (page, params = {}) {
-      let values = {
-        ...params,
-        ...this.query,
-      }
-      this.loading = true
-      getErrorList(page.currentPage, page.pageSize, values).then(res => {
-        const data = res.data.data
-        this.page.total = data.total
-        this.data = data.records
-        this.loading = false
-      })
-    },
-  },
-}
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/applications/task-work-order/src/views/monitor/log/flightLog.vue b/applications/task-work-order/src/views/monitor/log/flightLog.vue
deleted file mode 100644
index 51593b2..0000000
--- a/applications/task-work-order/src/views/monitor/log/flightLog.vue
+++ /dev/null
@@ -1,529 +0,0 @@
-<!-- 飞行日志 -->
-<template>
-  <div class="flight">
-    <div class="ztzf-form-search">
-      <el-form :model="params" inline>
-        <el-row :gutter="24">
-          <el-col :span="4">
-          <el-form-item label="任务名称:">
-            <el-input v-model="params.jobName" placeholder="请输入任务名称" clearable />
-          </el-form-item>
-          </el-col>
-          <el-col :span="4">
-          <el-form-item label="任务编号:">
-            <el-input v-model="params.jobInfoNum" placeholder="请输入任务编号" clearable />
-          </el-form-item>
-          </el-col>
-          <el-col :span="8">
-          <el-form-item label="选择日期:">
-            <el-date-picker
-              v-model="rangTime"
-              type="daterange"
-              range-separator="至"
-              start-placeholder="开始日期"
-              end-placeholder="结束日期"
-              clearable
-              @change="changeselect"
-            />
-          </el-form-item>
-          </el-col>
-          <el-col :span="4">
-          <el-button type="primary" @click="getList" :icon="Search">搜索</el-button>
-          <el-button @click="cancelSearch" :icon="Refresh">重置</el-button>
-          </el-col>
-        </el-row>
-      </el-form>
-    </div>
-    <div class="mange-table">
-      <!--      <el-tabs v-model="tabType" class="demo-tabs" @tab-click="handleTabClick">-->
-      <!--        <el-tab-pane label="全部" name="全部"></el-tab-pane>-->
-      <!--        <el-tab-pane label="我的收藏" name="收藏"></el-tab-pane>-->
-      <!--        -->
-      <!--      </el-tabs>-->
-      <el-table border :data="tableList" class="custom-header">
-        <el-table-column label="序号" type="index" width="60"></el-table-column>
-        <el-table-column prop="job_name" label="任务名称" align="center" show-overflow-tooltip></el-table-column>
-        <el-table-column prop="job_info_num" label="任务编号" align="center" show-overflow-tooltip></el-table-column>
-<!--        <el-table-column prop="title" label="飞行类型" align="center" show-overflow-tooltip></el-table-column>-->
-        <el-table-column prop="nickname" label="机巢名称" align="center"></el-table-column>
-        <el-table-column prop="start_time" label="开始时间" align="center">
-          <template #default="scope">
-            {{ timeFormatConvert(scope.row.start_time) }}
-          </template>
-        </el-table-column>
-        <el-table-column prop="end_time" label="结束时间" align="center">
-          <template #default="scope">
-            {{ timeFormatConvert(scope.row.end_time) }}
-          </template>
-        </el-table-column>
-        <el-table-column prop="create_name" label="创建人" align="center"></el-table-column>
-        <!--        <el-table-column prop="end_time" label="标签" align="center">-->
-        <!--          <template #default="scope">-->
-        <!--            <el-select v-model="scope.row.label_id" @change="handleUpdateLabel(scope.row)" clearable>-->
-        <!--              <el-option-->
-        <!--                v-for="item in tagList"-->
-        <!--                :key="item.id"-->
-        <!--                :label="item.label_name"-->
-        <!--                :value="item.id"-->
-        <!--              ></el-option>-->
-        <!--            </el-select>-->
-        <!--          </template>-->
-        <!--        </el-table-column>-->
-        <el-table-column label="操作" width="300" align="center">
-          <template #default="scope">
-            <el-button icon="el-icon-view" type="text" @click="handleDetail(scope.row)">查看</el-button>
-            <el-button icon="el-icon-view" type="text" @click="handleLineTrajectory(scope.row)">轨迹</el-button>
-            <el-button icon="el-icon-delete" type="text" @click="handleDelete(scope.row)">删除</el-button>
-            <!--            <el-button type="text" @click="handleStar(scope.row)">-->
-            <!--              <el-icon><Star /></el-icon>-->
-            <!--              {{ scope.row.is_favorite ? '取消收藏':'收藏' }}</el-button>-->
-            <el-button type="text" @click="handleExport(scope.row)"><el-icon><Download /></el-icon>导出</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-    </div>
-
-    <div class="pagination">
-      <el-pagination class="ztzf-pagination" popper-class="custom-pagination-dropdown" background
-                     :page-sizes="[10, 20, 30, 40, 50, 100]" :size="size" v-model:current-page="params.page"
-                     v-model:page-size="params.page_size" layout="total, sizes, prev, pager, next, jumper" :total="total"
-                     @size-change="handleSizeChange" @current-change="handleCurrentChange" />
-    </div>
-  </div>
-  <el-dialog class="ztzf-dialog-mange" append-to-body v-model="isShowView" title="查看" :width="pxToRem(1200)" :close-on-click-modal="false" :destroy-on-close="true">
-    <el-table border :data="tableDataDetails" height="466">
-      <el-table-column label="序号" type="index" width="60"></el-table-column>
-      <el-table-column prop="flight_type" label="飞行类型" align="center" show-overflow-tooltip></el-table-column>
-      <el-table-column prop="create_time" label="飞行时间" align="center" show-overflow-tooltip></el-table-column>
-      <el-table-column prop="longitude" label="经度" align="center"></el-table-column>
-      <el-table-column prop="latitude" label="纬度" align="center"></el-table-column>
-      <el-table-column prop="height" label="绝对高度" align="center"></el-table-column>
-      <el-table-column prop="elevation" label="实时真高" align="center"></el-table-column>
-    </el-table>
-    <template #footer>
-      <div class="pagination dialog-footer" style="display: flex;justify-content: end;margin-top: 10px;">
-        <el-pagination class="ztzf-pagination" popper-class="custom-pagination-dropdown" background
-                       :page-sizes="[10, 20, 30, 40, 50, 100]" :size="size" v-model:current-page="detailParams.current"
-                       v-model:page-size="detailParams.size" layout="total, sizes, prev, pager, next, jumper" :total="detailTotal"
-                       @size-change="handleSizeChangeDetails" @current-change="handleCurrentChangeDetails" />
-      </div>
-    </template>
-  </el-dialog>
-  <el-dialog class="ztzf-dialog-mange" append-to-body v-model="isShowFlyMapView" title="查看" :width="pxToRem(1000)" :close-on-click-modal="false" :destroy-on-close="true">
-    <div id="flyMap" class="ztzf-cesium"></div>
-  </el-dialog>
-</template>
-<script setup>
-import { getHistoryTrack, cancelStar, addStar, updateDroneFlight, deleteDroneFlight, droneFlightLogInfoPage } from '@/api/logs';
-// import { flightLogPage } from '@/api/airspace/airspace';
-import { downloadXls } from '@/utils/util';
-import { exportBlob } from '@/api/common'
-import * as Cesium from 'cesium';
-import { PublicCesium } from '@/utils/cesium/publicCesium';
-import { ElMessage, ElMessageBox, ElLoading } from 'element-plus';
-import {Delete, Refresh, Search} from '@element-plus/icons-vue';
-import { ArrowLineMaterialProperty } from '@/utils/cesium/Material'
-import { flyVisual } from '@/utils/cesium/mapUtil'
-import rwqfdImg from '@/assets/images/signMachineNest/rwqfd.png'
-import endPointImg from '@/assets/images/EndPointicon.png'
-import { nextTick } from 'vue';
-
-let publicCesiumInstance = null;
-let viewer = null;
-const viewInstance = shallowRef(null);
-const homeViewer = shallowRef(null);
-
-let previewDataSource = null
-
-const total = ref(0)
-let rangTime = ref([])
-const params = ref({
-  isFavorite: false,
-  page: 1,
-  page_size: 10,
-  startTime: '',
-  endTime: '',
-  jobName: '',
-  jobInfoNum: '',
-});
-
-let tableList = ref([])
-
-let isShowView = ref(false)
-
-let isShowFlyMapView = ref(false)
-
-let tabType = ref('全部')
-
-function timeFormatConvert(time) {
-  if (!time) return '/'
-  const date = new Date(time);
-  return date.toLocaleString();
-}
-
-function cancelSearch() {
-  rangTime.value = []
-  params.value = {
-    startTime: '',
-    endTime: '',
-    isFavorite: tabType.value === '收藏' ? true : false,
-    page: 1,
-    page_size: 10,
-    jobName: '',
-    jobInfoNum: '',
-  }
-  getList()
-}
-
-function getList() {
-  params.value.startTime = rangTime.value?.length ? rangTime.value[0].getTime() : ''
-  params.value.endTime = rangTime.value?.length? new Date(
-    rangTime.value[1].getFullYear(),
-    rangTime.value[1].getMonth(),
-    rangTime.value[1].getDate(),
-    23, 59, 59
-  ).getTime() : ''
-  getHistoryTrack(params.value).then(res => {
-    tableList.value = res.data.data.list || []
-    total.value = res.data.data.pagination.total || 0
-  })
-}
-
-function handleAll() {
-  params.value.isFavorite = false
-  params.value.page = 1
-  tabType.value = '全部'
-  getList()
-}
-// 查看
-let tableDataDetails = ref([])
-let detailTotal = ref(0)
-let detailParams = ref({
-  current: 1,
-  size: 10,
-  flightId: ''
-})
-function handleDetail(row) {
-  isShowView.value = true
-  detailParams.value.current = 1
-  detailParams.value.size = 10
-  detailParams.value.flightId = row.id
-  detailTotal.value = 0
-  droneFlightLogInfoPage(detailParams.value).then(res => {
-    tableDataDetails.value = res.data.data.records
-    detailTotal.value = res.data.data.total
-  })
-}
-// 地图
-const initMap = () => {
-  if (!document.getElementById('flyMap')) {
-    return;
-  }
-  publicCesiumInstance = new PublicCesium({
-    dom: 'flyMap',
-    flatMode: false,
-    terrain: true,
-    layerMode: 4,
-    contour: false,
-  });
-  homeViewer.value = publicCesiumInstance.getViewer();
-  viewer = publicCesiumInstance.getViewer();
-  viewInstance.value = publicCesiumInstance;
-  viewer.scene.globe.depthTestAgainstTerrain = true;
-  viewInstance.value.switchContour(true);
-};
-// 预览轨迹
-let arrowLineMaterialProperty = new ArrowLineMaterialProperty({
-  color: new Cesium.Color(128 / 255, 215 / 255, 255 / 255, 1),
-  directionColor: new Cesium.Color(1, 1, 1, 1),
-  outlineColor: new Cesium.Color(1, 1, 1, 1),
-  outlineWidth: 0,
-  speed: 5,
-})
-async function handleLineTrajectory(row) {
-  isShowFlyMapView.value = true;
-
-  // 确保地图容器已渲染
-  await nextTick();
-
-  // 确保地图初始化完成
-  // if (!viewer) {
-  //   initMap();
-  // }
-  initMap();
-
-  detailParams.value.size = 9999
-  detailParams.value.current = 1
-  detailParams.value.flightId = row.id;
-  const res = await droneFlightLogInfoPage(detailParams.value);
-  tableDataDetails.value = res.data.data.records;
-
-  // 清除现有数据源(如果有)
-  if (previewDataSource) {
-    viewer.dataSources.remove(previewDataSource);
-  }
-
-  // 创建新数据源
-  previewDataSource = new Cesium.CustomDataSource('previewDataSource');
-  await viewer.dataSources.add(previewDataSource);
-
-  // 确保数据有效
-  const validPositions = tableDataDetails.value
-    .filter(i => i.longitude && i.latitude && i.height)
-    .map(i => Cesium.Cartesian3.fromDegrees(
-      Number(i.longitude),
-      Number(i.latitude),
-      Number(i.height)
-    ));
-
-  if (validPositions.length > 0) {
-    previewDataSource.entities.add({
-      polyline: {
-        width: 4,
-        positions: validPositions,
-        material: arrowLineMaterialProperty,
-        clampToGround: false,
-      },
-    });
-    // 起点
-    // previewDataSource.entities.add({
-    //   position: validPositions[0],
-    //   billboard: {
-    //     image: rwqfdImg,
-    //     width: 50,
-    //     height: 50,
-    //   },
-    // })
-    // 终点
-    // previewDataSource.entities.add({
-    //   position: validPositions[validPositions.length - 1],
-    //   billboard: {
-    //     image: new Cesium.ConstantProperty(endPointImg),
-    //     width: 30,
-    //     height: 30,
-    //     verticalOrigin: Cesium.VerticalOrigin.BOTTOM, // 底部对齐
-    //   },
-    // })
-
-
-    flyVisual({
-      positionsData: tableDataDetails.value.map(i => [
-        Number(i.longitude),
-        Number(i.latitude),
-        Number(i.height)
-      ]),
-      viewer,
-      multiple: 4.6,
-      pitch: -60
-    });
-  } else {
-    console.warn('No valid positions data');
-  }
-}
-// 分页
-function handleSizeChangeDetails(val) {
-  detailParams.value.size = val
-  detailParams.value.current = 1
-  droneFlightLogInfoPage(detailParams.value).then(res => {
-    tableDataDetails.value = res.data.data.records
-    detailTotal.value = res.data.data.total
-  })
-}
-function handleCurrentChangeDetails(val) {
-  detailParams.value.current = val
-  droneFlightLogInfoPage(detailParams.value).then(res => {
-    tableDataDetails.value = res.data.data.records
-    detailTotal.value = res.data.data.total
-  })
-}
-
-
-function handleStartList() {
-  params.value.isFavorite = true
-  tabType.value = '收藏'
-  params.value.page = 1
-  getList()
-}
-
-// function handleTabClick() {
-//   if (tabType.value === '全部') {
-//     handleAll()
-//   } else if (tabType.value === '收藏') {
-//     handleStartList()
-//   }
-// }
-
-// 收藏
-function handleStar(row) {
-  if (row.is_favorite) {
-    cancelStar(row.id).then(res => {
-      ElMessage.success('取消收藏成功')
-      getList()
-    })
-  } else {
-    addStar({ flight_log_id: row.id }).then(res => {
-      ElMessage.success('收藏成功')
-      getList()
-    })
-  }
-}
-
-// 打标签
-function handleUpdateLabel(row) {
-  updateDroneFlight({ id: row.id, label_id: row.label_id }).then(res => {
-    // getList()
-    ElMessage.success('设置标签成功')
-  })
-}
-
-// 删除
-function handleDelete(row) {
-  ElMessageBox.confirm('确定删除该条数据?', '提示', {
-    confirmButtonText: '确定',
-    cancelButtonText: '取消',
-    type: 'warning',
-  }).then(() => {
-    deleteDroneFlight({ id: row.id }).then(res => {
-      ElMessage.success('删除成功')
-      getList()
-    })
-  }).catch(() => {
-    ElMessage({
-      type: 'info',
-      message: '已取消删除'
-    })
-  })
-}
-
-// 导出
-function handleExport(row) {
-  exportBlob(
-    `/drone-device-core/log/droneFlightLogInfo/export/${row.id}`
-  ).then(res => {
-    downloadXls(res.data, `${row.job_name}.xlsx`)
-  })
-}
-
-// 日期选择
-// const changeselect = () => {
-//   params.value.startTime = rangTime.value[0] ? rangTime.value[0].getTime() : ''
-//   params.value.endTime = rangTime.value[1]? rangTime.value[1].getTime() : ''
-//   getList()
-// };
-
-function handleSizeChange(val) {
-  params.value.page_size = val
-  getList()
-}
-function handleCurrentChange(val) {
-  params.value.page = val
-  getList()
-}
-let tagList = ref([])
-function tagManageList() {
-  flightLogPage({ current:1, size: 99 }).then(res => {
-    tagList.value = res.data.data.records || []
-  })
-}
-
-onMounted(() => {
-  // tagManageList()
-  getList()
-})
-</script>
-
-<style lang="scss" scoped>
-.flight {
-  height: 0;
-  flex: 1;
-  margin: 0 10px 10px 10px;
-  background-color: #ffffff;
-  padding: 10px 20px;
-  border-radius: 5px;
-  display: flex;
-  flex-direction: column;
-  //.search-box {
-  //  height: 30px;
-  //}
-
-  :deep(.el-input) {
-    .el-input__wrapper {
-      width: 200px;
-    }
-  }
-
-  // 表格
-  .mange-table {
-    height: 0;
-    flex: 1;
-    //margin-top: 18px;
-    overflow: auto;
-  }
-  :deep(.el-pagination) {
-    display: flex;
-    justify-content: right;
-  }
-
-  :deep(.el-pagination button) {
-    background: center center no-repeat none !important;
-    color: #8eb8ea !important;
-  }
-  :deep(.ztzf-select){
-    .el-select__selection {
-      width: 200px;
-    }
-  }
-}
-
-.content {
-  padding: 20px;
-
-  .view-table {
-    width: 100%;
-    border-collapse: collapse;
-    border: 1px solid #EBEEF5;
-
-    tr {
-      &:not(:last-child) {
-        border-bottom: 1px solid #EBEEF5;
-      }
-
-      td {
-        padding: 12px 10px;
-
-        &.label {
-          width: 140px;
-          text-align: right;
-          // color: #909399;
-          // background-color: #F5F7FA;
-          border-right: 1px solid #EBEEF5;
-        }
-
-        &.value {
-          width: 180px;
-          // color: #303133;
-        }
-      }
-    }
-  }
-}
-.content-edit {
-  .el-form {
-    .el-form-item {
-      width: 300px;
-      :deep(.el-form-item__label) {
-        width: 120px;
-      }
-
-    }
-    .btns {
-      display: flex;
-      justify-content: center
-    }
-  }
-}
-#flyMap {
-  height: 500px;
-  width: 100%;
-}
-</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/monitor/log/usual.vue b/applications/task-work-order/src/views/monitor/log/usual.vue
deleted file mode 100644
index 17a335b..0000000
--- a/applications/task-work-order/src/views/monitor/log/usual.vue
+++ /dev/null
@@ -1,164 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud
-      :option="option"
-      :table-loading="loading"
-      :data="data"
-      ref="crud"
-      v-model="form"
-      :permission="permissionList"
-      v-model:page="page"
-      :before-open="beforeOpen"
-      @search-change="searchChange"
-      @search-reset="searchReset"
-      @current-change="currentChange"
-      @size-change="sizeChange"
-      @refresh-change="refreshChange"
-      @on-load="onLoad"
-    >
-    </avue-crud>
-  </basic-container>
-</template>
-
-<script>
-import { getUsualList, getUsualLogs } from '@/api/logs';
-import { mapGetters } from 'vuex';
-
-export default {
-  data() {
-    return {
-      form: {},
-      selectionList: [],
-      query: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      option: {
-        tip: false,
-        searchShow: true,
-        searchMenuSpan: 6,
-        border: true,
-        index: true,
-        viewBtn: true,
-        editBtn: false,
-        addBtn: false,
-        delBtn: false,
-        menuWidth: 120,
-        dialogType: 'drawer',
-        column: [
-          {
-            label: '服务id',
-            prop: 'serviceId',
-            search: true,
-          },
-          {
-            label: '服务host',
-            prop: 'serverHost',
-            search: true,
-          },
-          {
-            label: '服务ip',
-            prop: 'serverIp',
-          },
-          {
-            label: '软件环境',
-            prop: 'env',
-            width: '100',
-          },
-          {
-            label: '日志级别',
-            prop: 'logLevel',
-          },
-          {
-            label: '日志id',
-            prop: 'logId',
-          },
-          {
-            label: '请求接口',
-            prop: 'requestUri',
-          },
-          {
-            label: '日志时间',
-            prop: 'createTime',
-            width: '180',
-          },
-          {
-            label: '用户代理',
-            prop: 'userAgent',
-            span: 24,
-            hide: true,
-          },
-          {
-            label: '日志数据',
-            prop: 'logData',
-            type: 'textarea',
-            span: 24,
-            minRows: 2,
-            hide: true,
-          },
-          {
-            label: '请求数据',
-            prop: 'params',
-            type: 'textarea',
-            span: 24,
-            minRows: 2,
-            hide: true,
-          },
-        ],
-      },
-      data: [],
-    };
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList() {
-      return {
-        viewBtn: this.validData(this.permission.log_usual_view, false),
-      };
-    },
-  },
-  methods: {
-    searchReset() {
-      this.query = {};
-      this.onLoad(this.page);
-    },
-    searchChange(params, done) {
-      this.query = params;
-      this.page.currentPage = 1;
-      this.onLoad(this.page, params);
-      done();
-    },
-    beforeOpen(done, type) {
-      if (['edit', 'view'].includes(type)) {
-        getUsualLogs(this.form.id).then(res => {
-          this.form = res.data.data;
-        });
-      }
-      done();
-    },
-    currentChange(currentPage) {
-      this.page.currentPage = currentPage;
-    },
-    sizeChange(pageSize) {
-      this.page.pageSize = pageSize;
-    },
-    refreshChange() {
-      this.onLoad(this.page, this.query);
-    },
-    onLoad(page, params = {}) {
-      this.loading = true;
-      getUsualList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
-        const data = res.data.data;
-        this.page.total = data.total;
-        this.data = data.records;
-        this.loading = false;
-      });
-    },
-  },
-};
-</script>
-
-<style></style>
diff --git a/applications/task-work-order/src/views/odm/task.vue b/applications/task-work-order/src/views/odm/task.vue
deleted file mode 100644
index 0cf8f39..0000000
--- a/applications/task-work-order/src/views/odm/task.vue
+++ /dev/null
@@ -1,492 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud
-      :option="option"
-      :table-loading="loading"
-      :data="data"
-      v-model:page="page"
-      ref="crud"
-      @row-del="rowDel"
-      v-model="form"
-      :permission="permissionList"
-      @row-update="rowUpdate"
-      @row-save="rowSave"
-      :before-open="beforeOpen"
-      :before-close="beforeClose"
-      @search-change="searchChange"
-      @search-reset="searchReset"
-      @selection-change="selectionChange"
-      @current-change="currentChange"
-      @size-change="sizeChange"
-      @refresh-change="refreshChange"
-      @on-load="onLoad"
-    >
-      <template #menu-left>
-        <!-- <el-button
-          type="danger"
-          icon="el-icon-delete"
-          plain
-          v-if="permission.odm_task_delete"
-          @click="handleDelete"
-          >删 除
-        </el-button> -->
-      </template>
-      <template #runningProgress="{ row }">
-        <el-progress :percentage="row.runningProgress * 100"></el-progress>
-      </template>
-      <template #processingTime="{ row }">
-        {{ formatSeconds(row.processingTime) }}
-      </template>
-      <template #menu="scope">
-        <el-button
-          type="primary"
-          text
-          icon="el-icon-guide"
-          v-if="permission.odm_task_handle && scope.row.taskId == null"
-          @click.stop="atHandle(scope.row, scope.index)"
-          >立即启动
-        </el-button>
-        <el-button
-          type="primary"
-          text
-          icon="el-icon-refresh-right"
-          v-if="(permission.odm_task_handle && scope.row.status == 30) || scope.row.status == 50"
-          @click.stop="restartHandle(scope.row, scope.index)"
-          >重新启动
-        </el-button>
-      </template>
-    </avue-crud>
-  </basic-container>
-</template>
-
-<script>
-import { getList, remove, update, add, createOdmTask, restartOdmTask } from '@/api/odm/task';
-import { tourStrategies } from 'element-plus';
-import { mapGetters } from 'vuex';
-
-export default {
-  data() {
-    return {
-      form: {},
-      query: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      selectionList: [],
-      option: {
-        emptyBtnText: '重置',
-        emptyBtnIcon: 'el-icon-refresh',
-        dialogWidth: 950,
-        tip: false,
-        searchShow: true,
-        searchGutter: 30,
-        searchMenuPosition: 'left',
-        searchMenuSpan: 4,
-        border: true,
-        index: true,
-        viewBtn: true,
-        selection: true,
-        addBtn: false,
-        editBtn: false,
-        excelBtn: false,
-        dialogClickModal: false,
-        grid: false,
-        menuWidth: 260,
-
-        height: 'auto',
-        calcHeight: 20,
-
-        column: [
-          {
-            label: '任务名称',
-            prop: 'taskName',
-            search: true,
-            labelWidth: 130,
-            searchSpan: 4,
-            // searchLabelWidth: 100,
-            //labelWidth: 130,
-            searchPlaceholder: '任务名称',
-            rules: [
-              {
-                required: true,
-                message: '请输入任务名称',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '地块编号',
-            prop: 'dkbh',
-            labelWidth: 130,
-            // hide:true,
-            rules: [
-              {
-                required: true,
-                message: '请输入任务编号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '任务编号',
-            prop: 'taskId',
-            hide: true,
-            labelWidth: 130,
-            rules: [
-              {
-                required: true,
-                message: '请输入任务编号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '飞行任务编号',
-            prop: 'waylineJobId',
-            addDisplay: false,
-            editDisplay: false,
-            hide: true,
-            labelWidth: 130,
-            width: 160,
-          },
-          {
-            label: '任务类型',
-            prop: 'waylineType',
-            type: 'select',
-            search: true,
-            searchSpan: 4,
-            // searchLabelWidth: 100,
-            //width: 100,
-            labelWidth: 130,
-            searchPlaceholder: '任务类型',
-            dicData: [
-              {
-                label: '航测',
-                value: 2,
-              },
-              {
-                label: '正射举证',
-                value: 4,
-              },
-            ],
-            change: value => {
-              this.searchChange({ ...this.query, waylineType: value.value }, () => {});
-            },
-          },
-          {
-            label: '机场名称',
-            prop: 'airportName',
-            searchSpan: 4,
-            // searchLabelWidth: 100,
-            labelWidth: 130,
-            //search: true,
-          },
-          {
-            label: '图片数量',
-            prop: 'imageCount',
-            labelWidth: 130,
-            width: 90,
-          },
-          {
-            label: '拼图耗时',
-            prop: 'processingTime',
-            width: 90,
-            labelWidth: 130,
-          },
-          {
-            label: '进度',
-            prop: 'runningProgress',
-            width: 100,
-            labelWidth: 130,
-          },
-          {
-            label: '任务状态',
-            prop: 'status',
-            type: 'select',
-            search: true,
-            searchSpan: 4,
-            // searchLabelWidth: 100,
-            searchPlaceholder: '任务状态',
-            labelWidth: 130,
-            width: 90,
-            dicData: [
-              { label: '待启动', value: 0 },
-              { label: '待处理', value: 10 },
-              { label: '处理中', value: 20 },
-              { label: '失败', value: 30 },
-              { label: '已完成', value: 40 },
-              { label: '已取消', value: 50 },
-            ],
-            change: value => {
-              this.searchChange({ ...this.query, status: value.value }, () => {});
-            },
-          },
-
-          {
-            label: '任务创建时间',
-            prop: 'createTime',
-            type: 'date',
-            addDisplay: false,
-            editDisplay: false,
-            labelWidth: 130,
-            width: 160,
-            format: 'YYYY-MM-DD HH:mm:ss',
-            // valueFormat: 'YYYY-MM-DD HH:mm:ss',
-          },
-          {
-            label: '完成时间',
-            prop: 'completedTime',
-            type: 'date',
-            addDisplay: false,
-            editDisplay: false,
-            searchPlaceholder: '任务完成时间',
-            labelWidth: 130,
-            search: true,
-            searchSpan: 4,
-            // searchLabelWidth: 100,
-            //valueFormat: 'YYYY-MM-DD',
-            width: 160,
-            change: value => {
-              this.searchChange({ ...this.query, completedTime: value.value }, () => {});
-            },
-          },
-        ],
-      },
-      data: [],
-      isClickSearch: true,
-    };
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList() {
-      return {
-        viewBtn: this.validData(this.permission.odm_task_view, true),
-        delBtn: this.validData(this.permission.odm_task_delete, true),
-        // editBtn: this.validData(this.permission.workspace_edit, true),
-      };
-    },
-    ids() {
-      let ids = [];
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id);
-      });
-      return ids.join(',');
-    },
-  },
-  methods: {
-    // 立即处理
-    atHandle(row) {
-      createOdmTask(row.waylineJobId, row.gsd).then(
-        () => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          done();
-        },
-        error => {
-          window.console.log(error);
-          loading();
-        }
-      );
-    },
-    // 重启启动
-    restartHandle(row) {
-      if (!row.taskName) {
-        this.$message({
-          type: 'error',
-          message: '该航线任务已删除,无法进行重启启动!',
-        });
-        return;
-      }
-      restartOdmTask(row.taskId).then(
-        () => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          done();
-        },
-        error => {
-          window.console.log(error);
-          loading();
-        }
-      );
-    },
-    // 时间格式化
-    formatSeconds(value) {
-      // 如果value不是数字或者小于0,则直接返回'00:00:00'
-      if (isNaN(value) || value < 0) {
-        return '00:00:00';
-      }
-
-      // 计算小时、分钟和秒
-      let seconds = Math.floor(value / 1000);
-      let minutes = Math.floor(seconds / 60);
-      let hours = Math.floor(minutes / 60);
-
-      // 格式化为两位数字的字符串
-      seconds %= 60;
-      minutes %= 60;
-
-      const formattedTime = `${this.padZero(hours)}:${this.padZero(minutes)}:${this.padZero(
-        seconds
-      )}`;
-
-      // 返回格式化后的时间字符串
-      return formattedTime;
-    },
-    // 函数用于在数字不足两位数时,在前面补零
-    padZero(value) {
-      return String(value).padStart(2, '0');
-    },
-    rowSave(row, done, loading) {
-      add(row).then(
-        () => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          done();
-        },
-        error => {
-          window.console.log(error);
-          loading();
-        }
-      );
-    },
-    rowUpdate(row, index, done, loading) {
-      update(row).then(
-        () => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          done();
-        },
-        error => {
-          window.console.log(error);
-          loading();
-        }
-      );
-    },
-    rowDel(row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-        });
-    },
-    searchReset() {
-      this.query = {};
-      this.onLoad(this.page);
-    },
-    searchChange(params, done) {
-      if (!this.isClickSearch) return;
-
-      this.query = params;
-      this.page.currentPage = 1;
-      this.onLoad(this.page, params);
-      done();
-    },
-    selectionChange(list) {
-      this.selectionList = list;
-    },
-    selectionClear() {
-      this.selectionList = [];
-      this.$refs.crud.toggleSelection();
-    },
-    handleDelete() {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据');
-        return;
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          this.$refs.crud.toggleSelection();
-        });
-    },
-    beforeOpen(done, type) {
-      // if (['edit', 'view'].includes(type)) {
-      //   getDetail(this.form.id).then(res => {
-      //     this.form = res.data.data;
-      //   });
-      // }
-      this.isClickSearch = false;
-
-      done();
-    },
-
-    beforeClose(done, type) {
-      this.isClickSearch = true;
-
-      done();
-    },
-
-    currentChange(currentPage) {
-      this.page.currentPage = currentPage;
-    },
-    sizeChange(pageSize) {
-      this.page.pageSize = pageSize;
-    },
-    refreshChange() {
-      this.onLoad(this.page, this.query);
-    },
-    onLoad(page, params = {}) {
-      const { releaseTimeRange } = this.query;
-
-      let values = {
-        ...params,
-        ...this.query,
-      };
-      if (releaseTimeRange) {
-        values = {
-          ...values,
-          releaseTime_datege: releaseTimeRange[0],
-          releaseTime_datelt: releaseTimeRange[1],
-        };
-        values.releaseTimeRange = null;
-      }
-      this.loading = true;
-      getList(page.currentPage, page.pageSize, values).then(res => {
-        const data = res.data.data;
-        this.page.total = data.total;
-        this.data = data.records;
-        this.loading = false;
-        this.selectionClear();
-      });
-    },
-  },
-};
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/applications/task-work-order/src/views/report/reportlist.vue b/applications/task-work-order/src/views/report/reportlist.vue
deleted file mode 100644
index d7072f8..0000000
--- a/applications/task-work-order/src/views/report/reportlist.vue
+++ /dev/null
@@ -1,199 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud
-      :option="option"
-      :table-loading="loading"
-      :data="data"
-      ref="crud"
-      v-model="form"
-      v-model:page="page"
-      :permission="permissionList"
-      @row-del="rowDel"
-      @search-change="searchChange"
-      @search-reset="searchReset"
-      @selection-change="selectionChange"
-      @current-change="currentChange"
-      @size-change="sizeChange"
-      @refresh-change="refreshChange"
-      @on-load="onLoad"
-    >
-      <template #menu-left>
-        <el-button type="danger" icon="el-icon-delete" plain @click="handleDelete"
-          >删 除
-        </el-button>
-      </template>
-      <template #menu="scope">
-        <el-button
-          type="primary"
-          text
-          icon="el-icon-edit"
-          @click.stop="handleDesign(scope.row.name)"
-          v-if="userInfo.role_name.includes('admin')"
-          >设计
-        </el-button>
-        <el-button
-          type="primary"
-          text
-          icon="el-icon-view"
-          @click.stop="handlePreview(scope.row.name)"
-          v-if="userInfo.role_name.includes('admin')"
-          >预览
-        </el-button>
-      </template>
-      <template #name="{ row }">
-        <el-tag style="cursor: pointer" @click="handlePreview(row.name)">{{ row.name }}</el-tag>
-      </template>
-    </avue-crud>
-  </basic-container>
-</template>
-
-<script>
-import { getList, remove } from '@/api/report/report';
-import { mapGetters } from 'vuex';
-
-export default {
-  data() {
-    return {
-      form: {},
-      selectionList: [],
-      query: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      option: {
-        tip: false,
-        searchShow: true,
-        searchMenuSpan: 6,
-        border: true,
-        index: true,
-        selection: true,
-        viewBtn: true,
-        dialogClickModal: false,
-        column: [
-          {
-            label: '文件名',
-            prop: 'name',
-            search: true,
-            slot: true,
-          },
-          {
-            label: '创建时间',
-            prop: 'createTime',
-          },
-          {
-            label: '更新时间',
-            prop: 'updateTime',
-          },
-        ],
-      },
-      data: [],
-    };
-  },
-  computed: {
-    ...mapGetters(['userInfo', 'permission']),
-    permissionList() {
-      return {
-        addBtn: false,
-        viewBtn: false,
-        delBtn: true,
-        editBtn: false,
-      };
-    },
-    ids() {
-      let ids = [];
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id);
-      });
-      return ids.join(',');
-    },
-  },
-  methods: {
-    handlePreview(name) {
-      window.open(`${this.website.design.reportUrl}/preview?_u=blade-${name}`);
-    },
-    handleDesign(name) {
-      window.open(`${this.website.design.reportUrl}/designer?_u=blade-${name}`);
-    },
-    rowDel(row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-        });
-    },
-    searchReset() {
-      this.query = {};
-      this.onLoad(this.page);
-    },
-    searchChange(params, done) {
-      this.query = params;
-      this.page.currentPage = 1;
-      this.onLoad(this.page, params);
-      done();
-    },
-    selectionChange(list) {
-      this.selectionList = list;
-    },
-    selectionClear() {
-      this.selectionList = [];
-      this.$refs.crud.toggleSelection();
-    },
-    handleDelete() {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据');
-        return;
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          this.$refs.crud.toggleSelection();
-        });
-    },
-    currentChange(currentPage) {
-      this.page.currentPage = currentPage;
-    },
-    sizeChange(pageSize) {
-      this.page.pageSize = pageSize;
-    },
-    refreshChange() {
-      this.onLoad(this.page, this.query);
-    },
-    onLoad(page, params = {}) {
-      this.loading = true;
-      getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
-        const data = res.data.data;
-        this.page.total = data.total;
-        this.data = data.records;
-        this.loading = false;
-        this.selectionClear();
-      });
-    },
-  },
-};
-</script>
-
-<style></style>
diff --git a/applications/task-work-order/src/views/resource/components/spotDetails.vue b/applications/task-work-order/src/views/resource/components/spotDetails.vue
index 6b346d1..ad71420 100644
--- a/applications/task-work-order/src/views/resource/components/spotDetails.vue
+++ b/applications/task-work-order/src/views/resource/components/spotDetails.vue
@@ -168,7 +168,7 @@
 const viewInstance = shallowRef(null);
 const homeViewer = shallowRef(null);
 let tbJwdList = [];
-const loading = ref(false);
+const loading = ref(true);
 const tableLoading = ref(true);
 const tableData = ref([]);
 const AlltableData = ref([]);
diff --git a/applications/task-work-order/src/views/system/menu.vue b/applications/task-work-order/src/views/system/menu.vue
index 6c16852..1991771 100644
--- a/applications/task-work-order/src/views/system/menu.vue
+++ b/applications/task-work-order/src/views/system/menu.vue
@@ -202,6 +202,10 @@
                 label: '新大屏',
                 value: 4,
               },
+              {
+                label: '无人机管控',
+                value: 5,
+              },
             ],
             hide: true,
             rules: [
diff --git a/applications/task-work-order/src/views/system/user/FormDiaLog.vue b/applications/task-work-order/src/views/system/user/FormDiaLog.vue
new file mode 100644
index 0000000..8aba6fe
--- /dev/null
+++ b/applications/task-work-order/src/views/system/user/FormDiaLog.vue
@@ -0,0 +1,451 @@
+<template>
+	<el-dialog v-model="visible" :title="titleEnum[dialogMode]" :close-on-click-modal="false" width="800px">
+		<!-- 查看模式 -->
+		<div v-if="readonly" class="view-mode">
+			<el-row :gutter="16">
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">登录账号:</span>
+						{{ formData.account }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">用户姓名:</span>
+						{{ formData.realName }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">手机号码:</span>
+						{{ formData.phone }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">电子邮箱:</span>
+						{{ formData.email }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">用户性别:</span>
+						{{ getSexLabel(formData.sex) }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">用户生日:</span>
+						{{ formData.birthday }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">所属角色:</span>
+						{{ formData.roleName }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">所属部门:</span>
+						{{ formData.deptName }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">用户编号:</span>
+						{{ formData.code }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">账号状态:</span>
+						{{ formData.statusName }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">到期时间:</span>
+						{{ formData.expireTime }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">次数限制:</span>
+						{{ formData.maxLoginNum }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">飞行开始时间:</span>
+						{{ formData.flightStartTime }}
+					</div>
+				</el-col>
+				<el-col :span="12">
+					<div class="view-item">
+						<span class="label">飞行结束时间:</span>
+						{{ formData.flightEndTime }}
+					</div>
+				</el-col>
+			</el-row>
+		</div>
+
+		<!-- 编辑/新增模式 -->
+		<el-form v-else ref="formRef" :model="formData" :rules="rules" label-width="110px">
+			<el-divider content-position="left">基础信息</el-divider>
+			<el-row :gutter="16">
+				<el-col :span="12">
+					<el-form-item label="登录账号" prop="account">
+						<el-input v-model="formData.account" maxlength="50" placeholder="请输入" clearable />
+					</el-form-item>
+				</el-col>
+				<el-col :span="12" v-if="dialogMode === 'add'">
+					<el-form-item label="密码" prop="password">
+						<el-input
+							v-model="formData.password"
+							type="password"
+							maxlength="50"
+							placeholder="请输入"
+							clearable
+							show-password
+						/>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12" v-if="dialogMode === 'add'">
+					<el-form-item label="确认密码" prop="password2">
+						<el-input
+							v-model="formData.password2"
+							type="password"
+							maxlength="50"
+							placeholder="请输入"
+							clearable
+							show-password
+						/>
+					</el-form-item>
+				</el-col>
+			</el-row>
+
+			<el-divider content-position="left">详细信息</el-divider>
+			<el-row :gutter="16">
+				<el-col :span="12">
+					<el-form-item label="用户姓名" prop="realName">
+						<el-input v-model="formData.realName" maxlength="50" placeholder="请输入" clearable />
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="手机号码" prop="phone">
+						<el-input v-model="formData.phone" maxlength="20" placeholder="请输入" clearable />
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="电子邮箱" prop="email">
+						<el-input v-model="formData.email" maxlength="50" placeholder="请输入" clearable />
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="用户性别" prop="sex">
+						<el-select v-model="formData.sex" placeholder="请选择" clearable>
+							<el-option label="男" :value="1" />
+							<el-option label="女" :value="2" />
+							<el-option label="未知" :value="3" />
+						</el-select>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="用户生日" prop="birthday">
+						<el-date-picker
+							v-model="formData.birthday"
+							type="datetime"
+							placeholder="请选择"
+							format="YYYY-MM-DD HH:mm:ss"
+							value-format="YYYY-MM-DD HH:mm:ss"
+							clearable
+						/>
+					</el-form-item>
+				</el-col>
+			</el-row>
+
+			<el-divider content-position="left">职责信息</el-divider>
+			<el-row :gutter="16">
+				<el-col :span="12">
+					<el-form-item label="用户编号" prop="code">
+						<el-input v-model="formData.code" maxlength="50" placeholder="请输入" clearable />
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="所属角色" prop="roleId">
+						<el-tree-select
+							v-model="formData.roleId"
+							:data="roleTree"
+							:props="treeProps"
+							node-key="id"
+							check-strictly
+							clearable
+							placeholder="请选择"
+						/>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="所属部门" prop="deptId">
+						<el-tree-select
+							v-model="formData.deptId"
+							:data="deptTree"
+							:props="deptTreeSelectProps"
+							node-key="id"
+							check-strictly
+							clearable
+							placeholder="请选择"
+						/>
+					</el-form-item>
+				</el-col>
+			</el-row>
+
+			<el-divider content-position="left">登录限制</el-divider>
+			<el-row :gutter="16">
+				<el-col :span="12">
+					<el-form-item label="到期时间" prop="expireTime">
+						<el-date-picker
+							v-model="formData.expireTime"
+							type="datetime"
+							placeholder="请选择"
+							format="YYYY-MM-DD HH:mm:ss"
+							value-format="YYYY-MM-DD HH:mm:ss"
+							clearable
+						/>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="次数限制" prop="maxLoginNum">
+						<el-input v-model="formData.maxLoginNum" placeholder="请输入" clearable />
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="飞行开始时间" prop="flightStartTime">
+						<el-time-picker
+							v-model="formData.flightStartTime"
+							placeholder="请选择"
+							format="HH:mm"
+							value-format="HH:mm"
+							clearable
+						/>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="飞行结束时间" prop="flightEndTime">
+						<el-time-picker
+							v-model="formData.flightEndTime"
+							placeholder="请选择"
+							format="HH:mm"
+							value-format="HH:mm"
+							clearable
+						/>
+					</el-form-item>
+				</el-col>
+			</el-row>
+		</el-form>
+
+		<template #footer>
+			<el-button @click="handleCancel">{{ readonly ? '关闭' : '取消' }}</el-button>
+			<el-button v-if="!readonly" type="primary" :loading="submitting" :disabled="submitting" @click="handleSubmit">
+				确定
+			</el-button>
+		</template>
+	</el-dialog>
+</template>
+
+<script setup>
+import { computed, onMounted, ref } from 'vue'
+import { ElMessage } from 'element-plus'
+import { getUser, add, update } from '@/api/system/user'
+import { getDeptTree } from '@/api/system/dept'
+import { getRoleTree } from '@/api/system/role'
+import func from '@/utils/func'
+
+// 初始化表单
+const initForm = () => ({
+	account: '',
+	password: '',
+	password2: '',
+	realName: '',
+	phone: '',
+	email: '',
+	sex: null,
+	birthday: '',
+	code: '',
+	roleId: '',
+	deptId: '',
+	expireTime: '',
+	maxLoginNum: '',
+	flightStartTime: '',
+	flightEndTime: '',
+})
+
+const treeProps = {
+	label: 'title',
+	children: 'children',
+}
+const deptTreeSelectProps = {
+	label: 'name',
+	value: 'id',
+	children: 'children',
+}
+
+const emit = defineEmits(['success'])
+const formRef = ref(null)
+const formData = ref(initForm())
+const visible = defineModel()
+const dialogMode = ref('add')
+const submitting = ref(false)
+const readonly = computed(() => dialogMode.value === 'view')
+const titleEnum = ref({ edit: '编辑用户', view: '查看用户', add: '新增用户' })
+const roleTree = ref([])
+const deptTree = ref([])
+
+// 密码验证
+const validatePass = (rule, value, callback) => {
+	if (value === '') {
+		callback(new Error('请输入密码'))
+	} else {
+		callback()
+	}
+}
+const validatePass2 = (rule, value, callback) => {
+	if (value === '') {
+		callback(new Error('请再次输入密码'))
+	} else if (value !== formData.value.password) {
+		callback(new Error('两次输入密码不一致!'))
+	} else {
+		callback()
+	}
+}
+
+const rules = {
+	account: [{ required: true, message: '请输入登录账号', trigger: 'blur' }],
+	password: [{ required: true, validator: validatePass, trigger: 'blur' }],
+	password2: [{ required: true, validator: validatePass2, trigger: 'blur' }],
+	realName: [
+		{ required: true, message: '请输入用户姓名', trigger: 'blur' },
+		{ min: 2, max: 50, message: '姓名长度在2到50个字符', trigger: 'blur' },
+	],
+	roleId: [{ required: true, message: '请选择所属角色', trigger: 'change' }],
+	deptId: [{ required: true, message: '请选择所属部门', trigger: 'change' }],
+}
+
+// 获取性别标签
+function getSexLabel(sex) {
+	const map = { 1: '男', 2: '女', 3: '未知' }
+	return map[sex] || ''
+}
+
+// 获取角色树
+async function getRoleTreeData() {
+	const res = await getRoleTree('000000')
+	roleTree.value = res.data.data
+}
+
+// 获取部门树
+async function getDeptTreeData() {
+	const res = await getDeptTree('000000')
+	deptTree.value = res.data.data
+}
+
+// 关闭弹框
+function handleCancel() {
+	visible.value = false
+}
+
+// 验证飞行时间
+function validateFlightTime() {
+	if (formData.value.flightStartTime && formData.value.flightEndTime) {
+		const [startHours, startMinutes] = formData.value.flightStartTime.split(':').map(Number)
+		const [endHours, endMinutes] = formData.value.flightEndTime.split(':').map(Number)
+		const startTotalMinutes = startHours * 60 + startMinutes
+		const endTotalMinutes = endHours * 60 + endMinutes
+		if (endTotalMinutes < startTotalMinutes) {
+			ElMessage.error('飞行结束时间不能小于飞行开始时间')
+			return false
+		}
+	}
+	return true
+}
+
+// 提交新增/编辑
+async function handleSubmit() {
+	const isValid = await formRef.value?.validate().catch(() => false)
+	if (!isValid) return
+	if (!validateFlightTime()) return
+
+	submitting.value = true
+	try {
+		const submitData = { ...formData.value }
+		submitData.roleId = func.toStr(submitData.roleId)
+		submitData.name = submitData.realName
+
+		if (dialogMode.value === 'add') {
+			await add(submitData)
+			ElMessage.success('新增成功')
+		} else {
+			await update(submitData)
+			ElMessage.success('更新成功')
+		}
+		visible.value = false
+		emit('success')
+	} finally {
+		submitting.value = false
+	}
+}
+
+// 加载详情
+async function loadDetail() {
+	if (!formData.value.id) return
+	const res = await getUser(formData.value.id)
+	const data = res?.data?.data ?? {}
+	// 处理 roleId
+	if (data.roleId) {
+		data.roleId = func.split(data.roleId)[0] || data.roleId
+	}
+	formData.value = data
+}
+
+// 打开弹框
+async function open({ mode, row } = {}) {
+	dialogMode.value = mode || 'add'
+	if (dialogMode.value === 'add') {
+		formData.value = initForm()
+	} else {
+		formData.value = { id: row.id }
+		await loadDetail()
+	}
+}
+
+onMounted(() => {
+	getRoleTreeData()
+	getDeptTreeData()
+})
+
+defineExpose({ open })
+</script>
+
+<style scoped lang="scss">
+.view-mode {
+	.view-item {
+		padding: 10px 0;
+		.label {
+			color: #606266;
+			font-weight: 500;
+		}
+	}
+}
+
+:deep(.el-select) {
+	width: 100%;
+}
+
+:deep(.el-date-editor) {
+	width: 100%;
+}
+
+:deep(.el-tree-select) {
+	width: 100%;
+}
+</style>
diff --git a/applications/task-work-order/src/views/system/user/index.vue b/applications/task-work-order/src/views/system/user/index.vue
new file mode 100644
index 0000000..af2de07
--- /dev/null
+++ b/applications/task-work-order/src/views/system/user/index.vue
@@ -0,0 +1,504 @@
+<template>
+	<basic-container>
+		<!-- 左侧部门树 -->
+		<el-row :gutter="16" class="user-container">
+			<el-col :span="4">
+				<div class="tree-box">
+					<el-scrollbar>
+						<el-tree
+							:data="deptTree"
+							:props="deptTreeProps"
+							node-key="id"
+							:load="loadDeptTree"
+							lazy
+							@node-click="handleDeptNodeClick"
+						/>
+					</el-scrollbar>
+				</div>
+			</el-col>
+			<!-- 右侧列表区 -->
+			<el-col :span="20">
+				<!-- 搜索表单 -->
+				<el-form ref="queryParamsRef" :model="searchParams">
+					<el-row :gutter="16">
+						<el-col :span="5">
+							<el-form-item label="登录账号" prop="account">
+								<el-input v-model="searchParams.account" placeholder="请输入" clearable @clear="handleSearch" />
+							</el-form-item>
+						</el-col>
+						<el-col :span="5">
+							<el-form-item label="用户姓名" prop="realName">
+								<el-input v-model="searchParams.realName" placeholder="请输入" clearable @clear="handleSearch" />
+							</el-form-item>
+						</el-col>
+						<el-col :span="4">
+							<el-form-item>
+								<el-button @click="resetForm">重置</el-button>
+								<el-button type="primary" @click="handleSearch">查询</el-button>
+							</el-form-item>
+						</el-col>
+					</el-row>
+				</el-form>
+
+				<!-- 操作按钮 -->
+				<div class="btn-group">
+					<el-button v-if="permission.user_add && !auditMode" type="primary" @click="openForm('add')">新增</el-button>
+					<el-button
+						v-if="permission.user_delete && !auditMode"
+						type="danger"
+						:disabled="!selectedIds.length"
+						@click="handleDelete()"
+					>
+						删除
+					</el-button>
+					<el-button
+						v-if="userInfo.role_name?.includes('admin') && auditMode"
+						type="success"
+						:disabled="!selectedIds.length"
+						@click="handleAuditPass"
+					>
+						通过
+					</el-button>
+					<el-button
+						v-if="userInfo.role_name?.includes('admin') && auditMode"
+						type="danger"
+						:disabled="!selectedIds.length"
+						@click="handleAuditRefuse"
+					>
+						拒绝
+					</el-button>
+					<el-button
+						v-if="userInfo.role_name?.includes('admin') && auditMode"
+						type="primary"
+						plain
+						@click="handleAuditBack"
+					>
+						返回
+					</el-button>
+					<el-button
+						v-if="permission.user_role && !auditMode"
+						type="info"
+						plain
+						:disabled="!selectedIds.length"
+						@click="handleGrant"
+					>
+						角色配置
+					</el-button>
+					<el-button
+						v-if="permission.user_reset && !auditMode"
+						type="info"
+						plain
+						:disabled="!selectedIds.length"
+						@click="handleReset"
+					>
+						密码重置
+					</el-button>
+					<el-button
+						v-if="userInfo.role_name?.includes('admin') && !auditMode"
+						type="info"
+						plain
+						:disabled="!selectedIds.length"
+						@click="handleLock"
+					>
+						账号解封
+					</el-button>
+					<el-button
+						v-if="userInfo.role_name?.includes('admin') && !auditMode"
+						type="success"
+						plain
+						@click="handleImport"
+					>
+						导入
+					</el-button>
+					<el-button
+						v-if="userInfo.role_name?.includes('admin') && !auditMode"
+						type="warning"
+						plain
+						@click="handleExport"
+					>
+						导出
+					</el-button>
+				</div>
+
+				<!-- 用户列表 -->
+				<el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
+					<el-table-column type="selection" width="55" />
+					<el-table-column type="index" width="60" label="序号" />
+					<el-table-column prop="account" label="登录账号" />
+					<el-table-column prop="realName" label="用户姓名" />
+					<el-table-column prop="roleName" label="所属角色">
+						<template v-slot="{ row }">
+							<el-tag v-if="row.roleName">{{ row.roleName }}</el-tag>
+						</template>
+					</el-table-column>
+					<el-table-column prop="deptName" label="所属部门">
+						<template v-slot="{ row }">
+							<el-tag v-if="row.deptName">{{ row.deptName }}</el-tag>
+						</template>
+					</el-table-column>
+					<el-table-column prop="phone" label="手机号码" />
+					<el-table-column label="操作" width="180">
+						<template v-slot="{ row }">
+							<el-link v-if="permission.user_view" @click="openForm('view', row)" type="primary">查看</el-link>
+							<el-link v-if="permission.user_edit && !auditMode" @click="openForm('edit', row)" type="warning">
+								编辑
+							</el-link>
+							<el-link v-if="permission.user_delete && !auditMode" @click="handleDelete(row)" type="danger">
+								删除
+							</el-link>
+						</template>
+					</el-table-column>
+				</el-table>
+
+				<!-- 分页 -->
+				<div>
+					<el-pagination
+						v-model:current-page="searchParams.current"
+						v-model:page-size="searchParams.size"
+						:total="total"
+						@change="getList"
+					/>
+				</div>
+			</el-col>
+		</el-row>
+
+		<!-- 用户表单弹框 -->
+		<FormDiaLog v-if="dialogVisible" v-model="dialogVisible" ref="dialogRef" @success="getList" />
+
+		<!-- 角色配置弹框 -->
+		<el-dialog title="用户角色配置" append-to-body v-model="roleBox" width="345px">
+			<el-tree
+				:data="roleGrantList"
+				show-checkbox
+				check-strictly
+				default-expand-all
+				node-key="id"
+				ref="treeRoleRef"
+				:default-checked-keys="roleTreeObj"
+				:props="roleProps"
+			></el-tree>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="roleBox = false">取 消</el-button>
+					<el-button type="primary" @click="submitRole">确 定</el-button>
+				</span>
+			</template>
+		</el-dialog>
+
+		<!-- 导入弹框 -->
+		<el-dialog title="用户数据导入" append-to-body v-model="excelBox" width="555px">
+			<el-form :model="excelForm" label-width="100px">
+				<el-form-item label="数据覆盖">
+					<el-switch v-model="excelForm.isCovered" :active-value="1" :inactive-value="0" />
+				</el-form-item>
+				<el-form-item label="模板上传">
+					<el-upload
+						:action="uploadAction"
+						:on-success="handleUploadSuccess"
+						accept=".xls,.xlsx"
+						:show-file-list="false"
+					>
+						<el-button type="primary">点击上传</el-button>
+					</el-upload>
+					<div class="upload-tip">请上传 .xls,.xlsx 标准格式文件</div>
+				</el-form-item>
+				<el-form-item label="模板下载">
+					<el-button type="primary" @click="handleTemplate">点击下载</el-button>
+				</el-form-item>
+			</el-form>
+		</el-dialog>
+	</basic-container>
+</template>
+
+<script setup>
+import { computed, nextTick, onMounted, ref } from 'vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { useStore } from 'vuex'
+import FormDiaLog from './FormDiaLog.vue'
+import { getList as getListApi, remove, grant, resetPassword, unlock, auditPass, auditRefuse } from '@/api/system/user'
+import { exportBlob } from '@/api/common'
+import { getDeptTree, getDeptLazyTree } from '@/api/system/dept'
+import { getRoleTree } from '@/api/system/role'
+import website from '@/config/website'
+import { getToken } from '@/utils/auth'
+import { downloadXls } from '@/utils/util'
+import NProgress from 'nprogress'
+import 'nprogress/nprogress.css'
+import func from '@/utils/func'
+
+const store = useStore()
+const userInfo = computed(() => store.getters.userInfo)
+const permission = computed(() => store.getters.permission)
+
+// 初始化搜索参数
+const initSearchParams = () => ({
+	account: '',
+	realName: '',
+	current: 1,
+	size: 10,
+})
+
+const searchParams = ref(initSearchParams())
+const total = ref(0)
+const loading = ref(false)
+const list = ref([])
+const selectedIds = ref([])
+const selectionList = ref([])
+const queryParamsRef = ref(null)
+const dialogRef = ref(null)
+const dialogVisible = ref(false)
+const auditMode = ref(false)
+const treeDeptId = ref('')
+
+// 部门树
+const deptTree = ref([])
+const deptTreeProps = {
+	label: 'title',
+	children: 'children',
+	isLeaf: 'leaf',
+}
+
+// 角色配置
+const roleBox = ref(false)
+const roleGrantList = ref([])
+const roleTreeObj = ref([])
+const treeRoleRef = ref(null)
+const roleProps = {
+	label: 'title',
+	value: 'key',
+}
+
+// 导入相关
+const excelBox = ref(false)
+const excelForm = ref({
+	isCovered: 0,
+})
+const uploadAction = computed(() => `/blade-system/user/import-user?isCovered=${excelForm.value.isCovered}`)
+
+provide('treeDeptId', treeDeptId)
+
+// 加载部门树节点
+async function loadDeptTree(node, resolve) {
+	const parentId = node.level === 0 ? 0 : node.data.id
+	const param = {
+		parentId: parentId,
+		level: node.level,
+	}
+	const res = await getDeptLazyTree(param)
+	resolve(
+		res.data.data.map(item => ({
+			...item,
+			leaf: !item.hasChildren,
+		}))
+	)
+}
+
+// 部门节点点击
+function handleDeptNodeClick(data) {
+	treeDeptId.value = data.id
+	searchParams.value.current = 1
+	getList()
+}
+
+// 获取列表
+async function getList() {
+	loading.value = true
+	try {
+		const res = await getListApi(
+			searchParams.value.current,
+			searchParams.value.size,
+			{
+				account: searchParams.value.account,
+				realName: searchParams.value.realName,
+				status: auditMode.value ? 0 : 1,
+			},
+			treeDeptId.value
+		)
+		list.value = res?.data?.data?.records ?? []
+		total.value = res?.data?.data?.total ?? 0
+	} finally {
+		loading.value = false
+	}
+}
+
+// 查询
+function handleSearch() {
+	searchParams.value.current = 1
+	getList()
+}
+
+// 重置查询
+function resetForm() {
+	queryParamsRef.value?.resetFields()
+	searchParams.value = initSearchParams()
+	treeDeptId.value = ''
+	getList()
+}
+
+// 删除
+async function handleDelete(row) {
+	const tips = row ? '该条' : '选中的项'
+	await ElMessageBox.confirm(`确认删除${tips}吗?`, '提示', { type: 'warning' })
+	const ids = row ? row.id : selectedIds.value.join(',')
+	await remove(ids)
+	ElMessage.success('删除成功')
+	selectedIds.value = []
+	getList()
+}
+
+// 勾选值设置
+function handleSelectionChange(rows) {
+	selectionList.value = rows
+	selectedIds.value = rows.map(item => item.id)
+}
+
+// 角色配置
+async function handleGrant() {
+	if (selectedIds.value.length === 0) {
+		ElMessage.warning('请选择至少一条数据')
+		return
+	}
+	roleTreeObj.value = []
+	if (selectionList.value.length === 1) {
+		roleTreeObj.value = selectionList.value[0].roleId?.split(',') || []
+	}
+	const res = await getRoleTree()
+	roleGrantList.value = res.data.data
+	roleBox.value = true
+}
+
+// 提交角色配置
+async function submitRole() {
+	const roleList = treeRoleRef.value.getCheckedKeys().join(',')
+	await grant(selectedIds.value.join(','), roleList)
+	roleBox.value = false
+	ElMessage.success('操作成功')
+	getList()
+}
+
+// 密码重置
+async function handleReset() {
+	if (selectedIds.value.length === 0) {
+		ElMessage.warning('请选择至少一条数据')
+		return
+	}
+	await ElMessageBox.confirm('确定将选择账号密码重置为123456?', '提示', { type: 'warning' })
+	await resetPassword(selectedIds.value.join(','))
+	ElMessage.success('操作成功')
+}
+
+// 账号解封
+async function handleLock() {
+	if (selectedIds.value.length === 0) {
+		ElMessage.warning('请选择至少一条数据')
+		return
+	}
+	await ElMessageBox.confirm('确定将选择账号解封?', '提示', { type: 'warning' })
+	await unlock(selectedIds.value.join(','))
+	ElMessage.success('操作成功')
+}
+
+// 审核通过
+async function handleAuditPass() {
+	if (selectedIds.value.length === 0) {
+		ElMessage.warning('请选择至少一条数据')
+		return
+	}
+	await ElMessageBox.confirm('确定将选择数据通过审核?', '提示', { type: 'warning' })
+	await auditPass(selectedIds.value.join(','))
+	ElMessage.success('操作成功')
+	getList()
+}
+
+// 审核拒绝
+async function handleAuditRefuse() {
+	if (selectedIds.value.length === 0) {
+		ElMessage.warning('请选择至少一条数据')
+		return
+	}
+	await ElMessageBox.confirm('确定将选择数据拒绝审核?', '提示', { type: 'warning' })
+	await auditRefuse(selectedIds.value.join(','))
+	ElMessage.success('操作成功')
+	getList()
+}
+
+// 返回正常模式
+function handleAuditBack() {
+	auditMode.value = false
+	getList()
+}
+
+// 导入
+function handleImport() {
+	excelBox.value = true
+}
+
+// 上传成功
+function handleUploadSuccess() {
+	excelBox.value = false
+	getList()
+	ElMessage.success('导入成功')
+}
+
+// 导出
+function handleExport() {
+	const account = func.toStr(searchParams.value.account)
+	const realName = func.toStr(searchParams.value.realName)
+	ElMessageBox.confirm('是否导出用户数据?', '提示', { type: 'warning' }).then(() => {
+		NProgress.start()
+		exportBlob(
+			`/blade-system/user/export-user?${website.tokenHeader}=${getToken()}&account=${account}&realName=${realName}`
+		).then(res => {
+			downloadXls(res.data, `用户数据表${new Date().toISOString().slice(0, 10)}.xlsx`)
+			NProgress.done()
+		})
+	})
+}
+
+// 下载模板
+function handleTemplate() {
+	exportBlob(`/blade-system/user/export-template?${website.tokenHeader}=${getToken()}`).then(res => {
+		downloadXls(res.data, '用户数据模板.xlsx')
+	})
+}
+
+// 新增/编辑/查看 弹框
+function openForm(mode, row) {
+	dialogVisible.value = true
+	nextTick(() => {
+		dialogRef.value?.open({ mode, row })
+	})
+}
+
+onMounted(() => {
+	getList()
+})
+</script>
+
+<style scoped lang="scss">
+.user-container {
+	height: 100%;
+}
+
+.tree-box {
+	height: 100%;
+	padding: 10px;
+	border-radius: 5px;
+	background-color: #fff;
+	box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+
+	:deep(.el-scrollbar) {
+		height: 100%;
+	}
+}
+
+.btn-group {
+	margin-bottom: 16px;
+}
+
+.upload-tip {
+	color: #999;
+	font-size: 12px;
+	margin-top: 8px;
+}
+</style>
diff --git a/applications/task-work-order/src/views/test.vue b/applications/task-work-order/src/views/test.vue
deleted file mode 100644
index f9864ea..0000000
--- a/applications/task-work-order/src/views/test.vue
+++ /dev/null
@@ -1,9 +0,0 @@
-<template>
-  <basic-container>测试页</basic-container>
-</template>
-
-<script>
-export default {};
-</script>
-
-<style></style>
diff --git a/applications/task-work-order/src/views/tickets/component/AddEditDetails.vue b/applications/task-work-order/src/views/tickets/component/AddEditDetails.vue
deleted file mode 100644
index b0810d6..0000000
--- a/applications/task-work-order/src/views/tickets/component/AddEditDetails.vue
+++ /dev/null
@@ -1,622 +0,0 @@
-<template>
-	<el-dialog class="ztzf-dialog-mange" modal-class="add-edit-details" v-model="isShowAddEditDetails" :title="txtTitle"
-						 width="70%" :close-on-click-modal="false" :destroy-on-close="true" @close="closeFun"
-	>
-		<div class="add-edit-details">
-			<div class="process" v-if="txtTitle !== '新建工单'">
-				<div class="order_title">{{ formParams.name }}</div>
-				<div class="custom-steps-container">
-					<!-- 标题行 -->
-					<div class="steps-titles">
-						<div class="step-title" v-for="(record, index) in formParams.record_list"
-								 :class="{ active: record.user_id >= 0 }" :key="index">
-							{{ record.status_str }}
-						</div>
-					</div>
-					<!-- Element Steps 组件 -->
-					<el-steps :active="formParams.active" align-center class="custom-steps">
-						<el-step v-for="(record, index) in formParams.record_list" :key="index">
-							<template #description>
-                <span class="step-description" style="position: relative; display: inline-block">
-                  {{ record.user_name }}
-                </span>
-								<span class="step-timer">
-                  {{ record.interval_time_str }}
-                </span>
-								<div class="step-description">
-									{{ record.create_time_str }}
-								</div>
-							</template>
-						</el-step>
-					</el-steps>
-				</div>
-			</div>
-			<el-form ref="orderFormRef" :model="formParams" :rules="rules" label-width="100px">
-				<el-row :gutter="20">
-					<el-col :span="12">
-						<el-form-item label="工单名称" prop="name">
-							<el-input v-model="formParams.name" placeholder="请输入工单名称" maxlength="100" show-word-limit
-												:disabled="txtTitle === '工单审核' || txtTitle === '工单详情'"></el-input>
-						</el-form-item>
-					</el-col>
-					<el-col :span="6">
-						<el-form-item label="关联航线" prop="file_id">
-							<el-input
-								v-if="formParams?.wayline_file_region_vo?.is_deleted"
-								v-model="formParams.wayline_file_region_vo.name"
-								:disabled="txtTitle === '工单审核' || txtTitle === '工单详情'">
-							</el-input>
-							<el-select
-								v-if="!formParams?.wayline_file_region_vo?.is_deleted || txtTitle === '新建工单'"
-								v-model="formParams.file_id" placeholder="请选择航线"
-								filterable
-								@change="getFlyingNest"
-								:disabled="txtTitle === '工单审核' || txtTitle === '工单详情'">
-								<el-option v-for="item in lineList" :key="item.wayline_id" :label="item.name" :value="item.wayline_id" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :span="6">
-						<el-form-item label="安全返航真高" prop="rth_altitude" class="safe-height">
-							<el-input-number v-model="formParams.rth_altitude" :min="50" :max="500"
-															 :disabled="txtTitle === '工单审核' || txtTitle === '工单详情'"></el-input-number>
-						</el-form-item>
-					</el-col>
-				</el-row>
-				<el-row :gutter="20">
-					<el-col :span="12">
-						<el-form-item label="关联机巢" prop="device_sns">
-							<el-select v-model="formParams.device_sns" placeholder="请选择机巢" multiple
-												 :disabled="(txtTitle === '工单审核' || txtTitle === '工单详情')">
-								<el-option v-for="item in drone_sns" :key="item.device_sn" :label="item.nickname"
-													 :value="item.device_sn" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :span="6">
-						<el-form-item label="关联算法" prop="ai_types">
-							<el-select v-model="formParams.ai_types" placeholder="请选择关联算法" :multiple-limit="3" multiple
-												 :disabled="logCollect || (txtTitle === '工单审核' || txtTitle === '工单详情')" @change="aiTypeChange">
-								<el-option v-for="item in aiTypeList" :key="item.dictKey" :label="item.dictValue"
-													 :value="item.dictKey" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-					<el-col :span="6">
-						<el-form-item  class="safe-height" label="自定义识别区" prop="enable_custom_area">
-							<el-checkbox v-model="formParams.enable_custom_area" :disabled="txtTitle === '工单审核' || txtTitle === '工单详情'"></el-checkbox>
-						</el-form-item>
-					</el-col>
-				</el-row>
-
-				<el-row :gutter="20">
-					<el-col :span="12" v-if="txtTitle === '新建工单'">
-						<el-form-item label="工单内容" prop="content">
-							<el-input type="textarea" v-model="formParams.content" rows="4" placeholder="请输入工单内容" maxlength="255"
-												show-word-limit :disabled="txtTitle === '工单审核' || txtTitle === '工单详情'"></el-input>
-						</el-form-item>
-					</el-col>
-
-					<el-col :span="12" prop="statusStr" v-else>
-						<el-form-item label="当前状态">
-							{{ getOrderStatus(formParams.status) }}
-						</el-form-item>
-					</el-col>
-
-					<el-col :span="7">
-						<el-form-item label="周期频次" prop="date_range">
-							<el-date-picker :disabled="txtTitle === '工单审核' || txtTitle === '工单详情'" v-model="formParams.date_range"
-															type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
-															:disabled-date="disabledDate" />
-						</el-form-item>
-					</el-col>
-					<el-col :span="2">
-						<el-select v-model="formParams.rep_fre_type" placeholder="请选择频次"
-											 :disabled="txtTitle === '工单审核' || txtTitle === '工单详情'">
-							<el-option v-for="item in weeks" :key="item" :label="item" :value="item" />
-						</el-select>
-					</el-col>
-					<el-col :span="3">
-						<el-time-picker :style="{ width: pxToRem(140) }" v-model="formParams.deal_time"
-														:disabled="txtTitle === '工单审核' || txtTitle === '工单详情'" prop="deal_time" value-format="HH:mm"
-														:picker-options="{ selectableRange: '00:00 - 23:59' }" />
-					</el-col>
-				</el-row>
-
-				<el-row :gutter="20" v-if="txtTitle === '工单审核' || txtTitle === '工单详情' || txtTitle === '工单编辑'">
-					<el-col :span="12">
-						<el-form-item label="工单内容" prop="content">
-							<el-input type="textarea" v-model="formParams.content" rows="4" placeholder="请输入工单内容" maxlength="255"
-												show-word-limit :disabled="txtTitle === '工单审核' || txtTitle === '工单详情'"></el-input>
-						</el-form-item>
-					</el-col>
-				</el-row>
-
-				<el-row :gutter="20" style="height: 400px">
-					<el-col :span="24">
-						<map-container v-if="isShowAddEditDetails" ref="mapContainerRef"></map-container>
-					</el-col>
-				</el-row>
-			</el-form>
-		</div>
-		<template #footer v-if="txtTitle === '新建工单'">
-			<div class="dialog-footer">
-				<el-button type="danger" @click="submitForm(1)" icon="el-icon-position">发起</el-button>
-				<!--        <el-button type="primary" @click="submitForm(0)" icon="el-icon-document-add">存草稿</el-button>-->
-				<el-button @click="cancel" icon="el-icon-circle-close">取消</el-button>
-			</div>
-		</template>
-		<template #footer v-if="txtTitle === '工单审核'">
-			<div class="dialog-footer">
-				<el-button type="primary" v-if="formParams.status == 1 && permission.orderLogpass"
-									 @click="orderPass(formParams.id)">通过
-				</el-button>
-				<el-button type="danger" v-if="formParams.status == 1 && permission.rejection_btn"
-									 @click="orderReject(formParams.id)">驳回
-				</el-button>
-				<el-button @click="cancel" icon="el-icon-circle-close">取消</el-button>
-			</div>
-		</template>
-		<template #footer v-if="txtTitle === '工单编辑'">
-			<div class="dialog-footer">
-				<el-button type="danger"
-									 v-if="formParams.status == 0 || (formParams.status == 2 && userInfo.user_id === formParams.create_user)"
-									 @click="submitForm(1)" icon="el-icon-position">发布
-				</el-button>
-				<el-button @click="cancel" icon="el-icon-circle-close">取消</el-button>
-			</div>
-		</template>
-	</el-dialog>
-</template>
-
-<script setup>
-import { pxToRem, pxToRemNum } from '@/utils/rem'
-import { ref, shallowRef, onMounted, computed } from 'vue'
-import { newGetWorkspacesPage } from '@/api/resource/wayline'
-import { getDictionaryByCode } from '@/api/system/dictbiz'
-import { getFlyingNestBy } from '@/api/device/device'
-import {
-	saveUpdateOrderLog,
-	orderLogDetails,
-	orderLogPass,
-	orderLogReject,
-	orderLogRecall, getWaylineMaxTerrainHeight
-} from '@/api/tickets/orderLog'
-import dayjs from 'dayjs'
-import 'dayjs/locale/zh-cn' // 导入中文语言包
-import _ from 'lodash'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import weekday from 'dayjs/plugin/weekday'
-dayjs.extend(weekday)
-dayjs.locale('zh-cn')
-import { useStore } from 'vuex'
-import { useIdentificationArea } from '@ztzf/hooks'
-
-const emit = defineEmits(['refresh'])
-
-const store = useStore()
-const userInfo = computed(() => store.state.user.userInfo)
-const permission = computed(() => store.state.user.permission)
-
-const waylineTypes = ref('')
-const logCollect = ref(false)
-
-// safeHeight 计算属性
-const safeHeight = computed(() => {
-	const height = store.state.common.safeHeight
-	return Number(height) || 0 // 确保是数字类型
-})
-
-// positionsArr 计算属性
-const positionsArr = computed(() => {
-	const arr = store.state.common.positionsArr
-	return arr || [] // 确保是数组类型
-})
-
-const txtTitle = inject('txtTitle')
-const rowObj = inject('rowObj')
-
-const isShowAddEditDetails = defineModel('show')
-const mapContainerRef = ref(null)
-const orderFormRef = ref(null)
-const formParams = ref({})
-const rules = ref({
-	name: [
-		{ required: true, message: '请输入工单名称', trigger: 'blur' },
-		{ max: 100, message: '工单名称不能超过100个字', trigger: 'blur' }
-	],
-	file_id: [{ required: true, message: '需要选择航线', trigger: 'change' }],
-	device_sns: [{ required: true, message: '请选择机巢', trigger: 'change' }],
-	content: [
-		{ required: true, message: '请输入工单内容', trigger: 'blur' },
-		{ max: 255, message: '工单内容不能超过255个字', trigger: 'blur' }
-	],
-	date_range: [{ required: true, message: '请选择时间不能为空', trigger: 'blur' }],
-	rep_fre_type: [{ required: true, message: '请选择周期', trigger: 'blur' }],
-	deal_time: [{ required: true, message: '请选择执行时间', trigger: 'blur' }]
-})
-//周期
-const weeks = ref(['每天', '周一', '周二', '周三', '周四', '周五', '周六', '周末', '周天', '工作日'])
-
-let lineList = inject('lineList')
-let aiTypeList = inject('aiTypeList')
-
-// 获取航线
-// let lineList = ref([])
-// function getLines() {
-//   const formData = {
-//     name: '',
-//     waylineType: undefined,
-//     current: 1,
-//     size: 99999999,
-//     descs: 'update_time'
-//   }
-//   newGetWorkspacesPage(formData).then(res => {
-//     lineList.value = res.data.data.records
-//   })
-// }
-
-function getOrderStatus (status) {
-	const statusTextMap = {
-		0: '草稿',
-		1: '待审核',
-		2: '已驳回',
-		3: '已通过'
-	}
-	return statusTextMap[status] || '未知状态'
-}
-
-function disabledDate (time) {
-	return time.getTime() < Date.now() - 8.64e7 // 86400000 = 24 * 60 * 60 * 1000
-}
-
-// 关联机巢
-const drone_sns = ref([])
-function getFlyingNest (waylineId) {
-	let currentLine = lineList.value.find(item => item.wayline_id === waylineId)
-	if (!formParams.ai_types || formParams.ai_types.length === 0) {
-		if (currentLine.wayline_type === '0' || currentLine.wayline_type === '3') {
-			logCollect.value = false
-		} else {
-			logCollect.value = true
-		}
-	}
-	// 选中航线对象
-	initMapLine({}, polygon => {
-		const params = {
-			type: ['2', '4', '5', '7', '8', '9', '10'].includes(currentLine.wayline_type) ? 2 : 0,
-			wayline_id: waylineId,
-			polygon
-		}
-		// 重置
-		formParams.value.device_sns = []
-		drone_sns.value = []
-		getFlyingNestBy(params).then(res => {
-			drone_sns.value = res.data.data
-			initMapLine()
-		})
-	})
-}
-
-// 根据算法 重新加载航线
-function aiTypeChange(val) {
-	formParams.ai_types = val
-	waylineTypes.value = ''
-	if(val.length > 0) {
-		waylineTypes.value = '3'
-	}
-	const formData = {
-		name: '',
-		waylineType: undefined,
-		current: 1,
-		size: 99999999,
-		descs: 'update_time',
-		waylineTypes: waylineTypes.value
-	}
-	newGetWorkspacesPage(formData).then(res => {
-		lineList.value = res.data.data.records
-	})
-}
-
-// 获取算法
-// let aiTypeList = ref([])
-// function aitypeList() {
-//   getDictionaryByCode('SF').then(res => {
-//     aiTypeList.value = res.data.data['SF']
-//   })
-// }
-
-// initMapLine 方法
-const initMapLine = async (infos = {}, cb = () => { }) => {
-	let currentLine = lineList.value.find(item => item.wayline_id == formParams.value.file_id)
-
-	if (!currentLine) {
-		currentLine = formParams.value.wayline_file_region_vo
-	}
-
-	await nextTick()
-	if (mapContainerRef.value?.initAddEntity) {
-		mapContainerRef.value.initAddEntity('polyline', {
-			url: `${import.meta.env.VITE_APP_AIRLINE_URL + currentLine.object_key}?_t=${new Date().getTime()}`,
-			type: currentLine.wayline_type,
-			cb,
-			infos
-		})
-	}
-}
-
-function formatDate (date) {
-	if (!date) return undefined
-	const d = new Date(date)
-	return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(
-		d.getDate()
-	).padStart(2, '0')} 00:00:00`
-}
-
-async function returnHeight () {
-	let checkedList = drone_sns.value.filter(item => formParams.value.device_sns.includes(item.device_sn))
-	const maxItem = checkedList.reduce((max, item) => {
-		return item.drone_height > max.drone_height ? item : max
-	})
-	// 返航绝对高度
-	let backHeight = formParams.value.rth_altitude // + maxItem.drone_height
-	console.log(backHeight, 'backHeight')
-	// 安全起飞高度
-	let positions = positionsArr.value
-	positions.unshift({ latitude: maxItem.latitude, longitude: maxItem.longitude, height: maxItem.drone_height })
-	positions.push({ latitude: maxItem.latitude, longitude: maxItem.longitude, height: maxItem.drone_height })
-	let resultHeight = 0
-	await getWaylineMaxTerrainHeight(positions).then(res => {
-		resultHeight = safeHeight.value > (res.data.data + 30) ? safeHeight.value : (res.data.data + 30)
-	})
-	let valueHeight = _.round(backHeight - resultHeight, 2)
-	return _.round(backHeight - resultHeight, 2)
-}
-
-function submitForm (status) {
-	orderFormRef.value?.validate(async (valid, fields) => {
-		if (valid) {
-			if (formParams.value?.wayline_file_region_vo?.is_deleted) {
-				await ElMessageBox.confirm(`当前的航线已被删除,是否重新选择航线?`, '提示', {
-					confirmButtonText: '确定',
-					cancelButtonText: '取消',
-					type: 'warning'
-				});
-				// 如果是还确定那边重新把关联航线和机巢放出来选
-				// 确保wayline_file_region_vo对象存在再进行赋值
-				if (formParams.value && formParams.value.wayline_file_region_vo) {
-					formParams.value.wayline_file_region_vo.is_deleted = false;
-				}
-				formParams.value.file_id = '';
-				formParams.value.device_sns = [];
-			}
-
-			formParams.value.begin_time = formatDate(formParams.value.date_range[0])
-			formParams.value.end_time = formatDate(formParams.value.date_range[1])
-			// 如果选中日期包含当前天,那么选中的时间点不能小于当前时间
-			if (formParams.value.deal_time) {
-				const selectedDate = dayjs(formParams.value.date_range[0]).format('YYYY-MM-DD')
-				const selectedTime = dayjs(selectedDate + ' ' + formParams.value.deal_time).toDate()
-				const now = new Date()
-
-				if (selectedDate === dayjs().format('YYYY-MM-DD') && selectedTime < now) {
-					return ElMessage({ message: '任务时间不能小于当前时间', type: 'warning' })
-				}
-			}
-			let checkedList = drone_sns.value.filter(item => formParams.value.device_sns.includes(item.device_sn))
-			const maxItem = checkedList.reduce((max, item) => {
-				return item.drone_height > max.drone_height ? item : max
-			})
-			// 返航绝对高度
-			let backHeight = formParams.value.rth_altitude // + maxItem.drone_height
-			console.log(backHeight, 'backHeight')
-			// 安全起飞高度
-			let positions = positionsArr.value
-			positions.unshift({ latitude: maxItem.latitude, longitude: maxItem.longitude, height: maxItem.drone_height })
-			positions.push({ latitude: maxItem.latitude, longitude: maxItem.longitude, height: maxItem.drone_height })
-			let resultHeight = 0
-			let valueHeight = 0
-			await getWaylineMaxTerrainHeight(positions).then(res => {
-				resultHeight = (safeHeight.value + maxItem.drone_height) > (res.data.data + 30) ? (safeHeight.value + maxItem.drone_height) : (res.data.data + 30)
-				console.log(resultHeight, maxItem.drone_height, '999')
-				valueHeight = (resultHeight - maxItem.drone_height) > backHeight ? _.round(resultHeight - maxItem.drone_height) : 0
-			})
-			if (valueHeight > 0) {
-				await ElMessageBox.confirm(`当前返航高度存在安全隐患,建议调整为${valueHeight}米以上后进行发布`, '提示', {
-					confirmButtonText: '确定',
-					cancelButtonText: '取消',
-					type: 'warning'
-				})
-			}
-			formParams.value.enable_custom_area = formParams.value.enable_custom_area ? 1 : 0
-			const submitData = {
-				...formParams.value,
-				status: status,
-				ai_types: formParams.value.ai_types?.length ? formParams.value.ai_types : []
-			}
-			await saveUpdateOrderLog(submitData)
-			if (txtTitle === '新建工单') {
-				ElMessage({ message: '工单创建成功', type: 'success' })
-			} else {
-				ElMessage({ message: '工单发布成功', type: 'success' })
-			}
-			cancel()
-		} else {
-			console.log('表单验证失败', fields)
-		}
-	})
-}
-// 审核通过
-function orderPass (id) {
-	orderLogPass(id).then(res => {
-		ElMessage.success('审核通过')
-		cancel()
-	})
-}
-// 驳回
-const orderReject = async (id) => {
-	try {
-		const { value } = await ElMessageBox.prompt('', '驳回原因', {
-			confirmButtonText: '确定',
-			cancelButtonText: '取消',
-			inputPlaceholder: '请输入驳回原因',
-			inputValidator: (value) => {
-				if (!value) {
-					return '驳回原因不能为空'
-				}
-			}
-		})
-		// 用户输入了内容并点击确定
-		await orderLogReject(id, value)
-		ElMessage.success('驳回成功')
-		cancel()
-	} catch (error) {
-		// 用户点击取消或关闭弹窗
-		if (error !== 'cancel' && error !== 'close') {
-			ElMessage.error('驳回失败')
-			console.error('驳回错误:', error)
-		}
-	}
-}
-
-const initMapPosition = async () => {
-	await nextTick()
-
-	if (mapContainerRef.value?.initAddEntity) {
-		mapContainerRef.value.initAddEntity('initPosition')
-	}
-}
-
-// 监听txtTitle
-watch(isShowAddEditDetails, async (newVal, oldVal) => {
-	formParams.value = { rth_altitude: 120 }
-	if (txtTitle.value === '工单审核' || txtTitle.value === '工单详情' || txtTitle.value === '工单编辑') {
-		const response = await orderLogDetails(rowObj.value.id)
-		const data = response.data.data
-		formParams.value = {
-			...data
-		}
-		formParams.value.enable_custom_area = formParams.value.enable_custom_area === 1 ? true : false
-		drone_sns.value = data.device_list
-		initMapLine(data.device_map_infos)
-	} else {
-		initMapPosition()
-	}
-}, {
-	immediate: true // 立即执行一次
-})
-function closeFun() {
-	formParams.value = {}
-	isShowAddEditDetails.value = false
-}
-
-// function handleBeforeClose () {
-//   cancel()
-// }
-function cancel () {
-	formParams.value = {}
-	isShowAddEditDetails.value = false
-	emit('refresh')
-}
-
-// 自定义识别区渲染
-const {setArea,removeArea } = useIdentificationArea()
-watch(()=>[formParams.value.enable_custom_area,formParams.value.ai_types],async () => {
-	const {enable_custom_area,ai_types} = formParams.value
-	if (enable_custom_area && ai_types?.length > 0) {
-		setArea(formParams.value.ai_types,mapContainerRef.value?.getViewer())
-	} else{
-		removeArea()
-	}
-},{ immediate: true }) // 待验证 等后端加enable_custom_area
-
-// onMounted(async () => {
-//   aitypeList()
-//   getLines()
-// });
-</script>
-
-<style lang="scss" scoped>
-.add-edit-details {
-	.safe-height {
-		display: flex;
-		align-items: center;
-		:deep(.el-form-item__label) {
-			width: 120px !important;
-		}
-
-		:deep(.el-input-number) {
-			width: 180px !important;
-		}
-	}
-
-	.week_pc_one {
-		flex: 1;
-
-		.week-r {
-			margin-right: 4px;
-		}
-
-		&> ::v-deep(div) {
-			width: 100% !important;
-		}
-	}
-
-	.process {
-		.order_title {
-			height: 30px;
-			line-height: 30px;
-			text-align: center;
-			font-size: 20px;
-			font-weight: bold;
-			color: #333;
-		}
-
-		.custom-steps-container {
-			width: 100%;
-			margin: 7px 0;
-		}
-
-		.steps-titles {
-			display: flex;
-			justify-content: space-between;
-			margin-bottom: 16px;
-			position: relative;
-		}
-
-		.step-title {
-			text-align: center;
-			flex: 1;
-			font-size: 16px;
-			color: #999;
-			position: relative;
-			padding-bottom: 10px;
-		}
-
-		.step-title.active {
-			color: #409eff;
-			font-weight: bold;
-		}
-
-		.custom-steps {
-			margin-top: -20px;
-			/* 向上移动与标题重叠 */
-		}
-
-		.el-step__head {
-			margin-top: 0;
-		}
-
-		.el-step__description {
-			margin-top: 8px;
-			padding: 0 20px;
-		}
-
-		.step-description {
-			font-size: 14px;
-			color: #666;
-			line-height: 2.2;
-		}
-	}
-}
-</style>
diff --git a/applications/task-work-order/src/views/tickets/component/SearchBox.vue b/applications/task-work-order/src/views/tickets/component/SearchBox.vue
deleted file mode 100644
index 967ca72..0000000
--- a/applications/task-work-order/src/views/tickets/component/SearchBox.vue
+++ /dev/null
@@ -1,313 +0,0 @@
-<template>
-  <div class="search-box-test">
-    <el-form :model="searchForm" inline>
-      <div class="search-first">
-        <el-form-item label="关键字:">
-          <el-input v-model="searchForm.key_word" placeholder="编号/名称/内容/姓名" clearable />
-        </el-form-item>
-        <el-form-item label="选择日期:" :style="{ width: pxToRem(460) }">
-          <el-date-picker
-            v-model="dateRange"
-            type="daterange"
-            range-separator="至" start-placeholder="开始日期"
-            end-placeholder="结束日期"
-            :default-value="datePickerDefaultVal" @change="handleSearch" />
-        </el-form-item>
-        <el-form-item label="关联航线:">
-          <el-select
-            :teleported="false"
-            v-model="searchForm.file_id"
-            placeholder="请选择关联航线"
-            clearable
-            @change="handleSearch"
-          >
-            <el-option
-              v-for="item in lineList"
-              :key="item.wayline_id"
-              :label="item.name"
-              :value="item.wayline_id"
-            />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="关联算法:">
-          <el-select
-            :teleported="false"
-            v-model="searchForm.ai_typesValue"
-            placeholder="请选择关联算法"
-            clearable @change="handleSearch">
-            <el-option
-              v-for="item in aiTypeList"
-              :key="item.dictKey"
-              :label="item.dictValue"
-              :value="item.dictKey"
-            />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="工单状态:">
-          <el-select
-            :teleported="false"
-            :disabled="activeTab === 'WAIT_AUDIT' || activeTab === 'REJECTED' || activeTab === 'PASS'"
-            v-model="searchForm.status"
-            placeholder="请选择单状态"
-            @change="handleSearch"
-            clearable>
-            <el-option
-              v-for="item in orderStatus"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="工单周期:" :style="{ width: pxToRem(460) }">
-          <el-date-picker
-            v-model="cycleDateRange"
-            type="daterange"
-            range-separator="至" start-placeholder="开始日期"
-            end-placeholder="结束日期"
-            :default-value="datePickerDefaultVal" @change="handleSearch"/>
-        </el-form-item>
-        <el-form-item label="选择频次:">
-          <el-select v-model="searchForm.rep_fre_type" placeholder="请选择频次" clearable @change="handleSearch">
-            <el-option v-for="item in cycles" :key="item" :label="item" :value="item" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="执行时间:">
-          <el-time-picker @change="handleSearch"
-            v-model="searchForm.deal_time"
-            placeholder="请选择执行时间"
-            prop="deal_time"
-            value-format="HH:mm"
-            :picker-options="{ selectableRange: '00:00 - 23:59'}" />
-        </el-form-item>
-        <el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button>
-        <el-button icon="el-icon-refresh" @click="handleReset">重置</el-button>
-      </div>
-    </el-form>
-  </div>
-</template>
-<script setup>
-import { pxToRem } from '@/utils/rem';
-import { calculateDefaultRange } from '@/utils/util'
-import { newGetWorkspacesPage } from '@/api/resource/wayline'
-import { getDictionaryByCode } from '@/api/system/dictbiz'
-import dayjs from 'dayjs';
-// 选择日期
-const dateRange = ref('')
-let datePickerDefaultVal = calculateDefaultRange()
-// 选择周期
-const cycleDateRange = ref('')
-const searchForm = reactive({
-  ai_types: [],
-  ai_typesValue: '',
-  deal_time: "",
-  file_id: "",
-  key_word: "",
-  status: '',
-  rep_fre_type: '',
-})
-
-const emit = defineEmits(['search']);
-
-const rowObj = inject('rowObj')
-const activeTab = inject('activeTab')
-const lineList = inject('lineList')
-const aiTypeList = inject('aiTypeList')
-
-watch(activeTab, (newTab, oldTab) => {
-  if (newTab === 'all') {
-    searchForm.status = ''
-  }
-  if(newTab === 'WAIT_AUDIT') {
-    searchForm.status = '1'
-  }
-  if(newTab === 'REJECTED') {
-    searchForm.status = '2'
-  }
-  if(newTab === 'PASS') {
-    searchForm.status = '3'
-  }
-  emit('search', searchForm);
-})
-
-// 周期
-const cycles = ref(['每天', '周一', '周二', '周三', '周四', '周五', '周六', '周末', '周天', '工作日'])
-// 工单状态
-const orderStatus = ref([
-  { label: '待审核', value: '1' },
-  { label: '已驳回', value: '2' },
-  { label: '已通过', value: '3' }
-])
-const timeFormat = 'YYYY-MM-DD HH:mm:ss';
-// 搜索
-const handleSearch = () => {
-  if (!dateRange.value) {
-    dateRange.value = [];
-  }
-  if (!cycleDateRange.value) {
-    cycleDateRange.value = [];
-  }
-  // if (dateRange.value && dateRange.value.length) {
-  //   checked.value = '';
-  //   searchForm.date_enum = '';
-  // }
-  // 提交至store
-  let params = {
-    ...searchForm,
-    create_start_date: dateRange.value.length
-      ? dayjs(dateRange?.value[0]).startOf('day').format(timeFormat)
-      : null,
-    create_end_date: dateRange?.value.length
-      ? dayjs(dateRange?.value[1]).endOf('day').format(timeFormat)
-      : null,
-    start_date: cycleDateRange?.value.length
-      ? dayjs(cycleDateRange?.value[0]).startOf('day').format(timeFormat)
-      : null,
-    end_date: cycleDateRange?.value.length
-      ? dayjs(cycleDateRange?.value[1]).startOf('day').format(timeFormat)
-      : null,
-  };
-  emit('search', params);
-};
-
-function handleReset () {
-  searchForm.ai_types = []
-  searchForm.ai_typesValue = ''
-  searchForm.deal_time = ""
-  searchForm.file_id = ""
-  searchForm.key_word = ""
-  if (activeTab.value === 'all') {
-    searchForm.status = ''
-  }
-  searchForm.rep_fre_type = ''
-  dateRange.value = ''
-  searchForm.create_start_date = null
-  searchForm.create_end_date = null
-  cycleDateRange.value = ''
-  searchForm.start_date = null
-  searchForm.emd_date = null
-  emit('search', searchForm);
-}
-
-// onMounted(() => {
-//   aitypeList()
-//   getLines()
-// });
-</script>
-
-<style lang="scss" scoped>
-// .taskAlgorithm {
-// 	:deep() {
-// 		.task-algorithm > div {
-// 			width: 233px !important;
-// 		}
-// 	}
-// }
-.search-box-test {
-  margin-bottom: 16px;
-  transition: all 0.3s;
-
-  .search-first {
-    position: relative;
-    display: flex;
-    flex-wrap: wrap;
-    align-items: center;
-    gap: 20px 15px; // 设置行间距和列间距
-
-    .more {
-      cursor: pointer;
-      width: 32px;
-      height: 32px;
-      color: #1c5cff;
-      line-height: 32px;
-      font-size: 16px;
-      margin: 0 28px;
-    }
-
-    .search-btn {
-      // position: absolute;
-      // right: 0;
-      display: flex;
-      justify-content: space-between;
-      cursor: pointer;
-      font-size: 14px;
-
-      .btn {
-        width: 80px;
-        height: 32px;
-        border-radius: 4px 4px 4px 4px;
-        line-height: 32px;
-        display: flex;
-        justify-content: center;
-        align-items: center;
-        // margin-left: px;
-        img {
-          width: 14px;
-          height: 14px;
-        }
-      }
-      .search {
-        background: #409eff;
-        color: #fff;
-        margin-right: 10px;
-      }
-      .clear {
-        border: 1px solid #d2d1d1;
-        color: #676767;
-        margin-right: 10px;
-      }
-      .add {
-        background: #ff9243;
-        color: #fff;
-      }
-    }
-
-    .time-card {
-      text-align: center;
-      background: #ffffff;
-      border-radius: 4px 0px 0px 4px;
-      border: 1px solid #e5e5e5;
-      font-family: Source Han Sans CN, Source Han Sans CN;
-      font-weight: 400;
-      font-size: 14px;
-      color: #7c8091;
-      display: flex;
-      height: 32px;
-
-      .card-item {
-        width: 60px;
-        height: 100%;
-        line-height: 32px;
-        cursor: pointer;
-      }
-
-      .active {
-        background: #ffffff;
-        border-radius: 0px 0px 0px 0px;
-        border: 1px solid #1c5cff;
-        color: #1441ff;
-      }
-    }
-  }
-
-  :deep(.el-form) {
-    :deep(.el-input__wrapper.is-disabled) {
-      box-shadow: 0 0 0 1px #026ad6;
-    }
-    .el-form-item__label {
-      width: 80px;
-    }
-
-    .el-form-item {
-      margin-bottom: 0;
-      width: 280px;
-      margin-right: 20px;
-
-      .el-form-item__label {
-        color: #363636;
-        line-height: 32px;
-      }
-    }
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/tickets/orderLog.vue b/applications/task-work-order/src/views/tickets/orderLog.vue
deleted file mode 100644
index 5cbacaf..0000000
--- a/applications/task-work-order/src/views/tickets/orderLog.vue
+++ /dev/null
@@ -1,528 +0,0 @@
-<!-- 任务统计表格 -->
-<template>
-  <div class="order-log-update">
-    <el-tabs v-model="activeTab" @tab-click="handleTabChange">
-      <el-tab-pane v-for="tab in tabsList" :key="tab.name" :label="`${tab.label} (${tab.count})`" :name="tab.name">
-        <SearchBox @search="searchClick"></SearchBox>
-        <el-button v-if="permission?.order_log_add && activeTab != 'WAIT_AUDIT'" type="primary" icon="el-icon-plus" @click="handleAddOrder">新建工单
-        </el-button>
-        <el-button type="success" plain icon="el-icon-download" @click="exportData">导出
-        </el-button>
-        <div class="task-table">
-          <el-table border :data="orderListTable" class="custom-header" @cell-click="handleCellClick">
-            <el-table-column label="序号" type="index" width="60">
-              <template #default="{ $index }">
-                {{ ($index + 1 + (orderListParams.current - 1) * orderListParams.size).toString().padStart(2,
-                '0') }}
-              </template>
-            </el-table-column>
-            <el-table-column prop="job_info_num" label="工单编号" width="150" show-overflow-tooltip>
-              <template #default="scope">
-                <el-tooltip-copy :content="scope.row.job_info_num" :showCopyText="true">
-                  {{scope.row.job_info_num}}
-                </el-tooltip-copy>
-              </template>
-            </el-table-column>
-            <el-table-column prop="name" label="工单名称" width="100" show-overflow-tooltip>
-              <template #default="scope">
-                <el-tooltip-copy :content="scope.row.name" :showCopyText="true">
-                  {{scope.row.name}}
-                </el-tooltip-copy>
-              </template>
-            </el-table-column>
-            <el-table-column prop="dept_name" label="工单状态" width="88">
-              <template #default="scope">
-                <el-tag :type="getStatusTagType(scope.row.status)">{{ getOrderStatus(scope.row.status) }}</el-tag>
-              </template>
-            </el-table-column>
-            <el-table-column prop="dept_name" label="所属单位" width="88" show-overflow-tooltip/>
-            <el-table-column prop="create_time" label="创建时间" width="120" show-overflow-tooltip/>
-            <el-table-column prop="job_num" label="已执行次数" width="100" align="center" />
-            <el-table-column prop="content" label="工单内容" show-overflow-tooltip align="center"/>
-            <el-table-column prop="wayline_name" label="关联航线" show-overflow-tooltip />
-            <el-table-column prop="ai_type_str" label="关联算法" width="100" align="center" show-overflow-tooltip/>
-            <el-table-column prop="device_names" label="关联机巢" width="100" align="center" show-overflow-tooltip/>
-            <el-table-column prop="creator_name" label="创建人" width="100" align="center" show-overflow-tooltip />
-            <el-table-column prop="cycle_time_value" label="工单周期频次" width="110" align="center" show-overflow-tooltip />
-            <el-table-column label="操作" width="200" fixed="right" align="center">
-              <template #default="scope">
-<!--                {{scope.row.status}}-->
-                <template v-if="scope.row.status === 1">
-                  <el-button type="text" icon="el-icon-view" v-if="permission.order_log_review" @click="handleCheckDetail(scope.row, '工单审核')">审核</el-button>
-                  <!--待审核状态-->
-                  <el-button type="text" icon="el-icon-warning" v-if="permission.order_log_recall" @click="revokeOrder(scope.row.id)">撤回</el-button>
-                  <el-button type="text" icon="el-icon-view" @click="handleViewDetail(scope.row, '工单详情')">详情</el-button>
-                </template>
-                <!--已驳回-->
-                <template v-if="scope.row.status === 2">
-                  <el-button type="text" icon="el-icon-warning" @click="rejectReason(scope.row.id, scope.row)">驳回原因</el-button>
-                  <el-button type="text" icon="el-icon-view" @click="handleViewDetail(scope.row, '工单详情')">详情</el-button>
-<!--                  <el-button type="text" icon="el-icon-view" v-if="userInfo.user_id === scope.row.create_user" @click="handleViewDetail(scope.row, '工单编辑')">编辑</el-button>-->
-<!--                  <el-button type="text" icon="el-icon-view" v-else @click="handleViewDetail(scope.row, '工单详情')">详情</el-button>-->
-                </template>
-                <!-- 已通过 -->
-                <template v-if="scope.row.status === 3">
-                  <el-button type="text" icon="el-icon-view" @click="handleViewDetail(scope.row, '工单详情')">详情</el-button>
-                </template>
-                <!--草稿-->
-<!--                <template v-if="scope.row.status === 0">-->
-<!--                  <el-button type="text" icon="el-icon-edit" @click="handleViewDetail(scope.row, '工单编辑')">编辑</el-button>-->
-<!--                  <el-button type="text" icon="el-icon-position" @click="userPublishPush(scope.row.id)">发布</el-button>-->
-<!--                  <el-button type="text" icon="el-icon-delete" @click="deleteOrder(scope.row.id)">删除</el-button>-->
-<!--                </template>-->
-              </template>
-            </el-table-column>
-            <template #empty>
-              <el-empty
-                class="custom-empty"
-                :image-size="100"
-              >
-                <template #description>
-                  <span class="custom-text">暂无数据</span>
-                </template>
-              </el-empty>
-            </template>
-          </el-table>
-        </div>
-        <div class="pagination" v-if="orderListTable.length > 0">
-          <el-pagination class="ztzf-pagination" popper-class="custom-pagination-dropdown" background
-                         :page-sizes="[10, 20, 30, 40, 50, 100]" v-model:current-page="orderListParams.current"
-                         v-model:page-size="orderListParams.size" layout="total, sizes, prev, pager, next, jumper" :total="total"
-                         @size-change="handleSizeChange" @current-change="handleCurrentChange" />
-        </div>
-      </el-tab-pane>
-    </el-tabs>
-  </div>
-  <AddEditDetails v-model:show="isShowAddEditDetails" @refresh="refreshGetOrderList" />
-</template>
-
-<script setup>
-import SearchBox from './component/SearchBox.vue'
-import AddEditDetails from './component/AddEditDetails.vue'
-import NProgress from 'nprogress'
-import { useStore } from 'vuex'
-import { useRoute } from 'vue-router'
-import { downloadXls } from '@/utils/util'
-import {
-  getList,
-  orderLogDetails,
-  orderLogExport,
-  jobStatusNum,
-  deleteOrderLog,
-} from '@/api/tickets/orderLog'
-import { newGetWorkspacesPage } from '@/api/resource/wayline'
-import { getDictionaryByCode } from '@/api/system/dictbiz'
-import { cloneDeep } from 'lodash';
-import { computed, onMounted } from 'vue';
-import { ElMessage, ElMessageBox } from 'element-plus'
-import dayjs from 'dayjs'
-import 'dayjs/locale/zh-cn' // 导入中文语言包
-import weekday from 'dayjs/plugin/weekday'
-import { aiImagesPage } from '@/api/dataCenter/dataCenter';
-
-const store = useStore()
-const route = useRoute()
-
-const userInfo = computed(() => store.state.user.userInfo)
-const permission = computed(() => store.state.user.permission);
-
-const isShowAddEditDetails = ref(false)
-
-const activeTab = ref('all')
-provide('activeTab', activeTab)
-let tabsList = ref([
-  // { label: '我的工单', name: 'my_order', value: null, count: 0 },
-  // { label: '全部工单', name: 'all', value: null, count: 0 },
-  // { label: '待审核', name: 'WAIT_AUDIT', value: 1, count: 0 },
-  // { label: '已驳回', name: 'REJECTED', value: 2, count: 0 },
-  // { label: '已通过', name: 'PASS', value: 3, count: 0 },
-  // { label: '草稿', name: 'DRAFT', value: 0, count: 0 }
-])
-function filteredTabs () {
-  if (permission?.value.orderLog_tab_allOrders) {
-    tabsList.value.push({ label: '全部工单', name: 'all', value: null, count: 0 })
-  }
-  if (permission?.value.orderLog_tab_pending) {
-    tabsList.value.push({ label: '待审核', name: 'WAIT_AUDIT', value: 1, count: 0 })
-  }
-  if (permission?.value.orderLog_tab_reject) {
-    tabsList.value.push({ label: '已驳回', name: 'REJECTED', value: 2, count: 0 })
-  }
-  if (permission?.value.orderLog_tab_pass) {
-    tabsList.value.push({ label: '已通过', name: 'PASS', value: 3, count: 0 })
-  }
-  activeTab.value = tabsList.value[0].name
-  // tab值传
-  orderListParams.status = tabsList.value[0].value
-  // tabsList.value
-  //   .map(tab => {
-  //     if (tab.name === 'all') {
-  //       return { ...tab, isShow: permission?.value.orderLog_tab_allOrders }
-  //     }
-  //     if (tab.name === 'WAIT_AUDIT') {
-  //       return { ...tab, isShow: permission?.value.orderLog_tab_pending }
-  //     }
-  //     if (tab.name === 'REJECTED') {
-  //       return { ...tab, isShow: permission?.value.orderLog_tab_reject }
-  //     }
-  //     if (tab.name === 'PASS') {
-  //       return { ...tab, isShow: permission?.value.orderLog_tab_pass }
-  //     }
-  //     // return { ...tab, isShow: true }
-  //   })
-  //   .filter(tab => tab.isShow)
-}
-
-// tab切换
-function handleTabChange (tab) {
-  activeTab.value = tab.paneName
-  // orderListParams.status = ''
-  // if (tab.paneName === 'WAIT_AUDIT') {
-  //   orderListParams.status = '1'
-  // } else if (tab.paneName === 'REJECTED') {
-  //   orderListParams.status = '2'
-  // } else if (tab.paneName === 'PASS') {
-  //   orderListParams.status = '3'
-  // } else if (tab.paneName === 'DRAFT') {
-  //   orderListParams.status = '0'
-  // }
-  // refreshGetOrderList()
-}
-
-// 更新统计数
-async function updateGlobalCounts() {
-  let res = await jobStatusNum()
-  res.data.data.forEach(item => {
-    const tab = tabsList.value.find(t => t.name === item.dict_key)
-    if (tab) {
-      tab.count = item.num
-    }
-  })
-}
-
-// 获取航线
-let lineList = ref([])
-provide('lineList', lineList)
-function getLines() {
-  const formData = {
-    name: '',
-    waylineType: undefined,
-    current: 1,
-    size: 99999999,
-    descs: 'update_time'
-  }
-  newGetWorkspacesPage(formData).then(res => {
-    lineList.value = res.data.data.records
-  })
-}
-
-// 获取算法
-let aiTypeList = ref([])
-provide('aiTypeList', aiTypeList)
-function aitypeList() {
-  getDictionaryByCode('SF').then(res => {
-    aiTypeList.value = res.data.data['SF']
-  })
-}
-
-const total = ref(0)
-const orderListParams = reactive({
-  current: 1,
-  size: 10,
-  searchParams: {},
-  status: ''
-})
-
-const orderListTable = ref([])
-function getTableList() {
-  orderListParams.searchParams.ai_types =  orderListParams.searchParams.ai_typesValue ? [ orderListParams.searchParams.ai_typesValue] : null
-  const apiParams = {
-    ...cloneDeep(orderListParams),
-    ...cloneDeep(orderListParams.searchParams)
-  }
-  getList(apiParams, orderListParams.current, orderListParams.size).then(res => {
-    orderListTable.value = res.data.data.records
-    total.value = res.data.data.total
-    // updateGlobalCounts()
-  })
-}
-
-// 分页大小改变
-const handleSizeChange = val => {
-  orderListParams.size = val
-  getTableList()
-}
-
-// 页码改变
-const handleCurrentChange = val => {
-  orderListParams.current = val
-  getTableList()
-}
-
-// 传参查询条件
-const searchClick = params => {
-  orderListParams.current = 1
-  orderListParams.size = 10
-  orderListParams.searchParams = params
-  getTableList()
-}
-
-const refreshGetOrderList = () => {
-  orderListParams.current = 1
-  orderListParams.size = 10
-  getTableList()
-}
-
-function getOrderStatus (status) {
-  const statusTextMap = {
-    // 0: '草稿',
-    1: '待审核',
-    2: '已驳回',
-    3: '已通过'
-  }
-  return statusTextMap[status] || '未知状态'
-}
-function getStatusTagType (status) {
-  const statusMap = {
-    1: 'warning',
-    2: 'info',
-    3: 'primary',
-    4: 'success',
-    5: 'danger'
-  }
-  return statusMap[status] || 'info'
-}
-// 新增按钮 和 导出按钮
-// function hasAddBtnPermission () {
-//   return permission && permission?.value.order_log_add
-// }
-
-// 新建工单、编辑、详情
-const txtTitle = ref('新建工单')
-const rowObj = ref({})
-provide('txtTitle', txtTitle)
-provide('rowObj', rowObj)
-function handleAddOrder() {
-  txtTitle.value = '新建工单'
-  isShowAddEditDetails.value = true
-}
-// 详情、编辑
-function handleViewDetail(row, txt) {
-  rowObj.value = row
-  txtTitle.value = txt
-  isShowAddEditDetails.value = true
-}
-
-// 审核
-function handleCheckDetail(row, txt) {
-  rowObj.value = row
-  txtTitle.value = txt
-  isShowAddEditDetails.value = true
-}
-
-// 导出
-async function exportData() {
-  try {
-    await ElMessageBox.confirm('是否导出智飞工单数据?', '提示', {
-      confirmButtonText: '确定',
-      cancelButtonText: '取消',
-      type: 'warning',
-    })
-
-    NProgress.start()
-
-    orderListParams.searchParams.ai_types =  orderListParams.searchParams.ai_typesValue ? [ orderListParams.searchParams.ai_typesValue] : null
-    const apiParams = {
-      ...cloneDeep(orderListParams),
-      ...cloneDeep(orderListParams.searchParams)
-    }
-    const res = await orderLogExport(apiParams)
-    downloadXls(res.data, `智飞工单${dayjs().format('YYYY-MM-DD')}.xlsx`)
-    ElMessage.success('导出成功')
-
-  } catch (error) {
-    if (error !== 'cancel') {
-      ElMessage.error('导出失败')
-      console.error('导出错误:', error)
-    }
-  } finally {
-    NProgress.done()
-  }
-}
-
-// 撤回工单
-async function revokeOrder(id) {
-  try {
-    await ElMessageBox.confirm('撤回会删除本工单,需重新提交?', '是否撤回', {
-      confirmButtonText: '确定',
-      cancelButtonText: '取消',
-      type: 'warning'
-    })
-    // 用户点击确定,执行撤回操作
-    // await orderLogRecall(id)
-    await deleteOrderLog(id)
-    // 显示成功消息
-    ElMessage.success('撤回成功')
-    // 触发搜索刷新
-    refreshGetOrderList()
-  } catch (error) {
-    // 用户点击取消,不执行任何操作
-    if (error !== 'cancel') {
-      ElMessage.error('撤回失败')
-      console.error('撤回错误:', error)
-    }
-  }
-}
-
-// 驳回原因
-async function rejectReason(id, row) {
-  try {
-    const res = await orderLogDetails(id)
-    const data = res.data.data
-
-    await ElMessageBox.confirm(data.remark, '驳回原因', {
-      confirmButtonText: '确定',
-      cancelButtonText: '取消',
-      type: 'warning'
-    })
-
-    // 用户点击确定后的逻辑 TODO
-    // form.value = { ...res.data.data }
-    handleViewDetail(row, userInfo.value.user_id === row.create_user ? '工单编辑':'工单详情')
-
-  } catch (error) {
-    // 用户点击取消,不执行任何操作
-    if (error !== 'cancel') {
-      ElMessage.error('操作失败')
-      console.error('错误:', error)
-    }
-  }
-}
-
-function handleCellClick (row, column) {
-  if (column.no === 1) {
-    navigator.clipboard.writeText(row.job_info_num).then(() => {
-      ElMessage.success('复制工单编号成功')
-    })
-  } else if (column.no === 2) {
-    navigator.clipboard.writeText(row.name).then(() => {
-      ElMessage.success('复制工单名称成功')
-    })
-  } else if (column.no === 4) {
-    navigator.clipboard.writeText(row.dept_name).then(() => {
-      ElMessage.success('复制所属单位成功')
-    })
-  } else if (column.no === 8) {
-    navigator.clipboard.writeText(row.wayline_name).then(() => {
-      ElMessage.success('复制关联航线成功')
-    })
-  } else if (column.no === 9) {
-    navigator.clipboard.writeText(row.ai_type_str).then(() => {
-      ElMessage.success('复制关联算法成功')
-    })
-  }
-}
-
-// 删除
-async function deleteOrder(id) {
-  try {
-    await ElMessageBox.confirm('确定删除吗?', '提示', {
-      confirmButtonText: '确定',
-      cancelButtonText: '取消',
-      type: 'warning'
-    })
-    deleteOrderLog(id)
-    ElMessage.success('删除成功')
-    // 触发搜索刷新
-    refreshGetOrderList()
-  } catch (error) {
-    if (error !== 'cancel') {
-      ElMessage.error('删除失败')
-      console.error('删除错误:', error)
-    }
-  }
-}
-
-onMounted(() => {
-  getLines()
-  aitypeList()
-  filteredTabs()
-  getTableList()
-  updateGlobalCounts()
-  if (route.query.id) {
-    route.query.status === '1' ? handleCheckDetail({ id:  route.query.id}, '工单审核') : handleCheckDetail({ id:  route.query.id}, '工单详情')
-  }
-})
-</script>
-
-<style lang="scss" scoped>
-.order-log-update {
-  height: 0;
-  flex: 1;
-  margin: 0 10px 10px 10px;
-  background-color: #ffffff;
-  padding: 10px 20px;
-  border-radius: 5px;
-  display: flex;
-  flex-direction: column;
-
-  // 表格
-  .task-table {
-    //height: 0;
-    //flex: 1;
-    height: calc(100vh - 380px);
-    margin-top: 18px;
-    overflow: auto;
-    :deep(.el-scrollbar__view) {
-      height: 100%;
-    }
-    :deep(.el-table--fit,.el-scrollbar__view) {
-      height: 100%;
-    }
-  }
-
-  .btnItem {
-    height: 27px;
-    line-height: 27px;
-    border-radius: 0px 0px 0px 0px;
-    border: 1px solid #51a8ff;
-    font-family: Segoe UI, Segoe UI;
-    font-weight: 400;
-    font-size: 14px;
-    color: #1C5CFF;
-    padding: 0 10px;
-    display: inline-block;
-    margin-right: 10px;
-    cursor: pointer;
-
-    &.turnBack {
-      border: 1px solid #ffa500;
-      color: #ffa500;
-    }
-
-    &.cancelTask {
-      border: 1px solid #00AA2D;
-      color: #00AA2D;
-    }
-  }
-  // 分页
-  :deep(.custom-header th.el-table__cell) {
-    color: rgba(0, 0, 0, 0.85);
-  }
-
-  :deep(.el-table td.el-table__cell) {
-    color: #606266;
-  }
-
-  :deep(.el-pagination) {
-    display: flex;
-    justify-content: right;
-    padding: 20px 0;
-  }
-
-  :deep(.el-pagination button) {
-    background: center center no-repeat none !important;
-    color: #8eb8ea !important;
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/tickets/orderLogCopy.vue b/applications/task-work-order/src/views/tickets/orderLogCopy.vue
deleted file mode 100644
index baed5a8..0000000
--- a/applications/task-work-order/src/views/tickets/orderLogCopy.vue
+++ /dev/null
@@ -1,1666 +0,0 @@
-<template>
-  <basic-container>
-    <el-tabs v-model="activeTab" @tab-click="handleTabChange">
-      <el-tab-pane v-for="tab in filteredTabs" :key="tab.name" :label="`${tab.label} (${tab.count})`" :name="tab.name">
-        <basic-main-content>
-          <!-- 查询条件筛选栏 -->
-          <div class="ztzf-form-search">
-            <el-form :model="filters" inline>
-              <el-row :gutter="24">
-                <el-col :span="4">
-                  <el-form-item label="关键字:">
-                    <el-input v-model="filters.key_word" placeholder="编号/名称/内容/姓名" clearable
-                      @keyup.enter="handleSearch" />
-                  </el-form-item>
-
-                  <!--              <div class="search-bar-box-item">-->
-                  <!--                <el-select placeholder="请选择所属单位" v-model="filters.create_dept" clearable>-->
-                  <!--                  <el-option v-for="dept in departments" :key="dept.value" :label="dept.label" :value="dept.value" />-->
-                  <!--                </el-select>-->
-                  <!--              </div>-->
-
-                </el-col>
-                <el-col :span="8">
-                  <el-form-item label="选择日期:">
-                    <el-date-picker @change="handleSearch" v-model="filters.dateRange" type="daterange"
-                      range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
-                      :default-value="datePickerDefaultVal" />
-                  </el-form-item>
-                </el-col>
-                <el-col :span="4">
-                  <el-form-item label="关联航线:">
-                    <el-select @change="handleSearch" v-model="filters.file_id" placeholder="请选择关联航线" filterable
-                      clearable>
-                      <el-option v-for="item in wayLineList" :key="item.wayline_id" :label="item.name"
-                        :value="item.wayline_id" />
-                    </el-select>
-                  </el-form-item>
-                </el-col>
-                <el-col :span="4">
-                  <el-form-item label="关联算法:">
-                    <el-select @change="handleSearch" v-model="filters.ai_types" placeholder="关联算法" clearable>
-                      <el-option v-for="item in ai_types" :key="item.dictKey" :label="item.dictValue"
-                        :value="item.dictKey" />
-                    </el-select>
-                  </el-form-item>
-
-                  <!-- <div class="search-bar-box-item">
-                    <el-select v-model="filters.type" placeholder="请选择工单类型" clearable>
-                      <el-option v-for="item in types" :key="item.dictValue" :label="item.dictValue"
-                        :value="item.dictKey" />
-                    </el-select>
-                  </div> -->
-
-                </el-col>
-                <el-col :span="4">
-                  <el-form-item label="工单状态:">
-                    <el-select @change="handleSearch" v-model="filters.status" placeholder="请选择工单状态" clearable
-                      :disabled="activeTab !== 'all'">
-                      <el-option v-for="item in statuses" :key="item.value" :label="item.label" :value="item.value" />
-                    </el-select>
-                  </el-form-item>
-                </el-col>
-              </el-row>
-              <el-row :gutter="24">
-                <el-col :span="8">
-                  <el-form-item label="工单周期:">
-                    <el-date-picker @change="handleSearch" v-model="filters.cycleDateRange" type="daterange"
-                      range-separator="至" start-placeholder="工单周期开始日期" end-placeholder="工单周期结束日期"
-                      :default-value="datePickerDefaultVal" />
-                  </el-form-item>
-                </el-col>
-                <el-col :span="4">
-                  <el-form-item label="选择频次:">
-                    <el-select @change="handleSearch" v-model="filters.rep_fre_type" placeholder="请选择频次" clearable>
-                      <el-option v-for="item in cycles" :key="item" :label="item" :value="item" />
-                    </el-select>
-                  </el-form-item>
-                </el-col>
-                <el-col :span="4">
-                  <el-form-item label="执行时间:">
-                    <el-time-picker @change="handleSearch" v-model="filters.deal_time" placeholder="请选择执行时间"
-                      prop="deal_time" value-format="HH:mm" :picker-options="{
-                        selectableRange: '00:00 - 23:59',
-                      }" />
-                  </el-form-item>
-                </el-col>
-                <el-col :span="4">
-                  <el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索
-                  </el-button>
-                  <el-button icon="el-icon-refresh" @click="handleReset">清空</el-button>
-                </el-col>
-              </el-row>
-            </el-form>
-          </div>
-
-          <!-- 表格部分 -->
-          <avue-crud class="ztzf-public-general-avue-crud" :data="tableData" :option="option" v-model:page="page"
-            ref="crud" :table-loading="loading" @current-change="currentChange" @refresh-change="refreshChange"
-            @on-load="onLoad" @search-change="searchChange" @size-change="sizeChange" v-if="activeTab === tab.name">
-            <template #job_info_num="{ row }">
-              <el-tooltip-copy :content="row.job_info_num" :showCopyText="true" textAlign="left">
-                {{ row.job_info_num }}
-              </el-tooltip-copy>
-            </template>
-
-            <template #name="{ row }">
-              <el-tooltip-copy :content="row.name" :showCopyText="true" textAlign="left">
-                {{ row.name }}
-              </el-tooltip-copy>
-            </template>
-
-            <template #menu-left>
-              <el-button v-if="hasAddBtnPermission() && activeTab != 'WAIT_AUDIT'" type="primary" icon="el-icon-plus"
-                @click="handleAdd">新建工单
-              </el-button>
-              <el-button type="success" plain icon="el-icon-download" @click="exportData">导出
-              </el-button>
-            </template>
-
-            <template #menu="{ row }">
-              <div class="menu-custom-box">
-                <template v-if="row.status == 1">
-                  <el-button v-if="hasPaddingBtnPermission()" type="text" icon="el-icon-view"
-                    @click="handleCheckDetail(row)">审核
-                  </el-button>
-                </template>
-                <!-- v-if="
-                    (userInfo.user_id == row.create_user || hasRecallPaddingBtnPermission()) &&
-                    row.status == 1
-                  " -->
-                <template v-if="row.status == 1">
-                  <!--待审核状态-->
-                  <el-button type="text" icon="el-icon-warning" v-if="hasRecallPaddingBtnPermission()"
-                    @click="orderLogRecall(row.id)">撤回
-                  </el-button>
-                  <!-- <el-button type="text" icon="el-icon-view" @click="handleViewDetail(row)">详情</el-button> -->
-                </template>
-                <!--已驳回-->
-                <template v-if="row.status == 2">
-                  <el-button type="text" icon="el-icon-warning" @click="rejectDetail(row.id)">驳回原因
-                  </el-button>
-                  <el-button v-if="userInfo.user_id == row.create_user" type="text" icon="el-icon-view"
-                    @click="handleViewDetail(row)">编辑
-                  </el-button>
-                  <el-button v-else type="text" icon="el-icon-view" @click="handleViewDetail(row)">详情
-                  </el-button>
-                </template>
-                <!-- 已通过 -->
-                <template v-if="row.status == 3">
-                  <el-button type="text" icon="el-icon-view" @click="handleViewDetail(row)">详情
-                  </el-button>
-                </template>
-                <!--草稿-->
-                <template v-if="row.status == 0">
-                  <el-button type="text" icon="el-icon-edit" @click="handleViewDetail(row)">编辑
-                  </el-button>
-                  <el-button type="text" icon="el-icon-position" @click="userPublishPush(row.id)">发布
-                  </el-button>
-                  <el-button type="text" icon="el-icon-delete" @click="deleteOrderLog(row.id)">删除
-                  </el-button>
-                </template>
-              </div>
-            </template>
-            <template #status="{ row }">
-              <el-tag :type="getStatusTagType(row.status)">{{ mapStatus(row.status) }}</el-tag>
-            </template>
-            <template #keyData="{ row }">
-              <el-tooltip :content="row.address" placement="top" effect="light">
-                <span>{{ row.keyData }}</span>
-              </el-tooltip>
-            </template>
-          </avue-crud>
-        </basic-main-content>
-      </el-tab-pane>
-    </el-tabs>
-
-    <!-- 新建工单对话框 -->
-    <el-dialog class="ztzf-dialog-mange" v-model="dialogVisible" title="新建工单" width="70%" :close-on-click-modal="false"
-      @close="resetForm">
-      <el-form :model="form" :rules="rules" ref="testform" label-width="100px">
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="工单名称" prop="name">
-              <el-input v-model="form.name" placeholder="请输入工单名称" maxlength="100" show-word-limit></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="关联航线" prop="file_id">
-              <el-select v-model="form.file_id" placeholder="请选择航线" filterable @change="getFlyingNestBy">
-                <el-option v-for="item in wayLineList" :key="item.wayline_id" :label="item.name"
-                  :value="item.wayline_id" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="安全返航真高" prop="rth_altitude" class="safe-height">
-              <el-input-number v-model="form.rth_altitude" :min="50" :max="500"></el-input-number>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="关联机巢" prop="device_sns">
-              <el-select v-model="form.device_sns" placeholder="请选择机巢" multiple :disabled="!device_sns.length">
-                <el-option v-for="item in device_sns" :key="item.device_sn" :label="item.nickname"
-                  :value="item.device_sn" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="关联算法" prop="ai_types">
-              <el-select v-model="form.ai_types" placeholder="请选择关联算法" multiple>
-                <el-option v-for="item in ai_types" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="工单内容" prop="content">
-              <el-input type="textarea" v-model="form.content" rows="4" placeholder="请输入工单内容" maxlength="255"
-                show-word-limit></el-input>
-            </el-form-item>
-          </el-col>
-
-          <el-col :span="8">
-            <el-form-item label="周期频次" prop="date_range">
-              <el-date-picker v-model="form.date_range" type="daterange" range-separator="至" start-placeholder="开始日期"
-                end-placeholder="结束日期" :disabled-date="disabledDate" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="4">
-            <div class="flex">
-              <div class="flex-1">
-                <el-select v-model="form.rep_fre_type" placeholder="请选择频次">
-                  <el-option v-for="item in cycles" :key="item" :label="item" :value="item" />
-                </el-select>
-              </div>
-              <div class="flex-1">
-                <el-time-picker style="width: 100px" v-model="form.deal_time" prop="deal_time" value-format="HH:mm"
-                  :picker-options="{
-                    selectableRange: '00:00 - 23:59',
-                  }" />
-              </div>
-            </div>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20" style="height: 400px">
-          <el-col :span="24">
-            <map-container v-if="dialogVisible" ref="MapContainer"></map-container>
-          </el-col>
-        </el-row>
-
-        <!--        <el-row>-->
-        <!--          <div class="add-box-btns">-->
-        <!--            <el-button type="danger" @click="submitForm(1)">发起</el-button>-->
-        <!--            <el-button type="primary" @click="submitForm(0)">存草稿</el-button>-->
-        <!--            <el-button @click="dialogVisible = false">取消</el-button>-->
-        <!--          </div>-->
-        <!--        </el-row>-->
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="danger" @click="submitForm(1)" icon="el-icon-position">发起</el-button>
-          <el-button type="primary" @click="submitForm(0)" icon="el-icon-document-add">存草稿</el-button>
-          <el-button @click="dialogVisible = false" icon="el-icon-circle-close">取消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-
-    <!-- 工单详情对话框 -->
-    <el-dialog class="ztzf-dialog-mange" align-center v-model="detailVisible" :title="detailTitle" width="70%"
-      :close-on-click-modal="false" @close="resetForm">
-      <div class="event-title-center">{{ form.name }}</div>
-      <el-form :model="form" :rules="rules" ref="testform" label-width="100px">
-        <div class="custom-steps-container">
-          <!-- 标题行 -->
-          <div class="steps-titles" v-if="filters.status !== '0'">
-            <div v-for="(record, index) in form.record_list" :class="{ active: record.user_id >= 0 }" :key="index"
-              class="step-title">
-              {{ record.status_str }}
-            </div>
-          </div>
-
-          <!-- Element Steps 组件 -->
-          <el-steps :active="form.active" align-center class="custom-steps" v-if="filters.status !== '0'">
-            <el-step v-for="(record, index) in form.record_list" :key="index">
-              <template #description>
-                <span class="step-description" style="position: relative; display: inline-block">
-                  {{ record.user_name }}
-                </span>
-                <span class="step-timer">
-                  {{ record.interval_time_str }}
-                </span>
-                <div class="step-description">
-                  {{ record.create_time_str }}
-                </div>
-              </template>
-            </el-step>
-          </el-steps>
-        </div>
-
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="工单名称" prop="name">
-              <el-input v-model="form.name" placeholder="请输入工单名称" :disabled="detailTitle === '工单详情'"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="关联航线" prop="file_id">
-              <el-select v-model="form.file_id" placeholder="请选择航线" @change="getFlyingNestBy" filterable
-                :disabled="detailTitle === '工单详情'">
-                <el-option v-for="item in wayLineList" :key="item.wayline_id" :label="item.name"
-                  :value="item.wayline_id" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="安全返航真高" prop="rth_altitude" class="safe-height">
-              <el-input-number :disabled="detailTitle === '工单详情'" v-model="form.rth_altitude" :min="50"
-                :max="500"></el-input-number>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="关联机巢" prop="device_sns">
-              <el-select v-model="form.device_sns" placeholder="请选择机巢" multiple :disabled="detailTitle === '工单详情'">
-                <el-option v-for="item in device_sns" :key="item.device_sn" :label="item.nickname"
-                  :value="item.device_sn" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="关联算法" prop="ai_types">
-              <el-select v-model="form.ai_types" placeholder="请选择关联算法" multiple :disabled="detailTitle === '工单详情'">
-                <el-option v-for="item in ai_types" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="12" prop="statusStr">
-            <el-form-item label="当前状态">
-              {{ mapStatus(form.status) }}
-            </el-form-item>
-          </el-col>
-
-          <el-col :span="6">
-            <el-form-item label="周期频次" prop="date_range">
-              <el-date-picker v-model="form.date_range" type="daterange" range-separator="至" start-placeholder="开始日期"
-                end-placeholder="结束日期" :disabled-date="disabledDate" :disabled="detailTitle === '工单详情'" />
-            </el-form-item>
-          </el-col>
-
-          <el-col :span="3">
-            <el-select v-model="form.rep_fre_type" placeholder="请选择频次" :disabled="detailTitle === '工单详情'">
-              <el-option v-for="item in cycles" :key="item" :label="item" :value="item" />
-            </el-select>
-          </el-col>
-
-          <el-col :span="3">
-            <el-time-picker class="timeStyle" :style="{ width: pxToRem(140) }" v-model="form.deal_time" prop="deal_time"
-              value-format="HH:mm" :picker-options="{
-                selectableRange: '00:00 - 23:59',
-              }" :disabled="detailTitle === '工单详情'" />
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="工单内容" prop="content">
-              <el-input type="textarea" v-model="form.content" rows="4" placeholder="请输入工单内容" maxlength="255"
-                show-word-limit :disabled="detailTitle === '工单详情'"></el-input>
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20" style="height: 400px">
-          <el-col :span="24">
-            <map-container v-if="detailVisible" ref="MapContainer"></map-container>
-          </el-col>
-        </el-row>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="danger" v-if="form.status == 0 || (form.status == 2 && userInfo.user_id == form.create_user)"
-            @click="submitForm(1)" icon="el-icon-position">发布
-          </el-button>
-          <el-button type="primary"
-            v-if="form.status == 0 || (form.status == 2 && userInfo.user_id == form.create_user)" @click="submitForm(0)"
-            icon="el-icon-plus">保存
-          </el-button>
-          <!-- <el-button type="primary" v-if="form.status == 0 || userInfo.user_id == form.create_user"
-                          @click="submitForm(0)">保存</el-button> -->
-
-          <el-button type="primary" v-if="form.status == 1 && hasPaddingBtnPermission()"
-            @click="orderLogPass(form.id)">通过
-          </el-button>
-          <el-button type="danger" v-if="form.status == 1 && hasRejectionBtnPermission()"
-            @click="orderLogReject(form.id)">驳回
-          </el-button>
-        </div>
-      </template>
-    </el-dialog>
-
-    <!-- 工单详情 -->
-    <el-dialog class="ztzf-dialog-mange" align-center v-model="detailVisibleCopy" title="工单详情" width="70%"
-      :close-on-click-modal="false" @close="resetForm">
-      <div class="event-title-center">{{ form.name }}</div>
-      <el-form :model="form" ref="testform" label-width="100px">
-        <div class="custom-steps-container">
-          <!-- 标题行 -->
-          <div class="steps-titles" v-if="filters.status !== '0'">
-            <div v-for="(record, index) in form.record_list" :class="{ active: record.user_id >= 0 }" :key="index"
-              class="step-title">
-              {{ record.status_str }}
-            </div>
-          </div>
-
-          <!-- Element Steps 组件 -->
-          <el-steps :active="form.active" align-center class="custom-steps" v-if="filters.status !== '0'">
-            <el-step v-for="(record, index) in form.record_list" :key="index">
-              <template #description>
-                <span class="step-description" style="position: relative; display: inline-block">
-                  {{ record.user_name }}
-                </span>
-                <span class="step-timer">
-                  {{ record.interval_time_str }}
-                </span>
-                <div class="step-description">
-                  {{ record.create_time_str }}
-                </div>
-              </template>
-            </el-step>
-          </el-steps>
-        </div>
-
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="工单名称" prop="name">
-              <el-input v-model="form.name" placeholder="请输入工单名称" :disabled="true"></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="关联航线" prop="file_id">
-              <el-select v-model="form.file_id" placeholder="请选择航线" :disabled="true">
-                <el-option v-for="item in wayLineList" :key="item.wayline_id" :label="item.name"
-                  :value="item.wayline_id" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="6">
-            <el-form-item label="安全返航真高" prop="rth_altitude" class="safe-height">
-              <el-input-number :disabled="true" v-model="form.rth_altitude" :min="50" :max="500"></el-input-number>
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="关联机巢" prop="device_sns">
-              <el-select v-model="form.device_sns" placeholder="请选择机巢" multiple :disabled="true">
-                <el-option v-for="item in device_sns" :key="item.device_sn" :label="item.nickname"
-                  :value="item.device_sn" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="关联算法" prop="ai_types">
-              <el-select v-model="form.ai_types" placeholder="请选择关联算法" multiple :disabled="true">
-                <el-option v-for="item in ai_types" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="12" prop="statusStr">
-            <el-form-item label="当前状态">
-              {{ mapStatus(form.status) }}
-            </el-form-item>
-          </el-col>
-
-          <el-col :span="6">
-            <el-form-item label="周期频次" prop="date_range">
-              <el-date-picker v-model="form.date_range" type="daterange" range-separator="至" start-placeholder="开始日期"
-                end-placeholder="结束日期" :disabled="true" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="3">
-            <el-select v-model="form.rep_fre_type" placeholder="请选择频次" :disabled="true">
-              <el-option v-for="item in cycles" :key="item" :label="item" :value="item" />
-            </el-select>
-          </el-col>
-
-          <el-col :span="3">
-            <el-time-picker style="width: 100px" v-model="form.deal_time" prop="deal_time" :disabled="true"
-              value-format="HH:mm" :picker-options="{
-                selectableRange: '00:00 - 23:59',
-              }" />
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="工单内容" prop="content">
-              <el-input type="textarea" v-model="form.content" rows="2" placeholder="请输入工单内容" maxlength="255"
-                show-word-limit :readonly="true" :disabled="true"></el-input>
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="20" style="height: 400px">
-          <el-col :span="24">
-            <map-container v-if="detailVisibleCopy" ref="MapContainer"></map-container>
-          </el-col>
-        </el-row>
-
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="danger" v-if="form.status == 0 || (form.status == 2 && userInfo.user_id == form.create_user)"
-            @click="submitForm(1)" icon="el-icon-position">发布
-          </el-button>
-          <!-- <el-button type="primary" v-if="form.status == 0 || userInfo.user_id == form.create_user"
-                          @click="submitForm(0)">保存</el-button> -->
-
-          <el-button type="primary" v-if="form.status == 1 && hasPaddingBtnPermission()" @click="orderLogPass(form.id)"
-            icon="el-icon-check">通过
-          </el-button>
-          <el-button type="danger" v-if="form.status == 1 && hasRejectionBtnPermission()"
-            @click="orderLogReject(form.id)" icon="el-icon-close">驳回
-          </el-button>
-          <el-button @click="detailVisibleCopy = false" icon="el-icon-circle-close">取消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </basic-container>
-</template>
-
-<script>
-import { pxToRem, pxToRemNum } from '@/utils/rem'
-import { calculateDefaultRange } from '@/utils/util'
-import {
-  getList,
-  saveUpdateOrderLog,
-  orderLogDetails,
-  orderLogRecall,
-  orderLogReject,
-  orderLogPass,
-  orderLogExport,
-  jobStatusNum,
-  userPublish,
-  deleteOrderLog,
-  getWaylineMaxTerrainHeight
-} from '@/api/tickets/orderLog'
-import { getTicketInfo } from '@/api/tickets/ticket'
-import { getDictionaryByCode } from '@/api/system/dictbiz'
-import { getWaylineFileListByArea, newGetWorkspacesPage } from '@/api/resource/wayline'
-import { export_json_to_excel } from '@/utils/exportExcel'
-import { getFlyingNestBy } from '@/api/device/device'
-import { mapGetters } from 'vuex'
-import NProgress from 'nprogress'
-import { downloadXls } from '@/utils/util'
-import 'nprogress/nprogress.css'
-import { analyzeKmzFile, removeTextKey, XMLToJSON } from '@/utils/cesium/kmz'
-import dayjs from 'dayjs'
-import 'dayjs/locale/zh-cn' // 导入中文语言包
-import weekday from 'dayjs/plugin/weekday'
-import elTooltipCopy from '@/components/ElTooltipCopy.vue'
-import { CircleClose, Promotion, Select } from '@element-plus/icons-vue'
-import { useStore } from 'vuex'
-import _ from 'lodash'
-// const store = useStore()
-dayjs.extend(weekday)
-dayjs.locale('zh-cn')
-
-// const lastHeight = computed(() => store.state.common.lastHeight)
-
-export default {
-  components: { elTooltipCopy },
-  name: 'TicketPage',
-  data () {
-    return {
-      activeTab: 'all',
-      getlastHeight: 0,
-      tabs: [
-        { label: '全部工单', name: 'all', value: null, count: 0 },
-        { label: '待审核', name: 'WAIT_AUDIT', value: 1, count: 0 },
-        { label: '已驳回', name: 'REJECTED', value: 2, count: 0 },
-        { label: '已通过', name: 'PASS', value: 3, count: 0 },
-        { label: '草稿', name: 'DRAFT', value: 0, count: 0 }
-      ],
-      filters: {
-        key_word: '',
-        create_dept: '',
-        start_date: null,
-        end_date: null,
-        file_id: '',
-        ai_types: [],
-        status: '',
-        dateRange: []
-      },
-      departments: [],
-      types: [],
-      device_sns: [],
-      ai_types: [],
-      wayLineList: [],
-      detailTitle: '编辑工单',
-      detailVisibleCopy: false,
-
-      statuses: [
-        { label: '草稿', value: '0' },
-        { label: '待审核', value: '1' },
-        { label: '已驳回', value: '2' },
-        { label: '已通过', value: '3' }
-      ],
-      //周期
-      cycles: ['每天', '周一', '周二', '周三', '周四', '周五', '周六', '周末', '周天', '工作日'],
-
-      tableData: [],
-      option: {
-        index: true,
-        indexWidth: 66,
-        indexLabel: '序号',
-        indexFixed: true,
-
-        align: 'left',
-        border: true,
-        stripe: false,
-        searchShow: true,
-        searchBtnText: '搜索',
-        searchMenuSpan: 6,
-        addBtnText: '新建工单',
-        addBtn: false,
-        viewBtn: false,
-        editBtn: false,
-        delBtn: false,
-        cancelBtn: true,
-        cancelBtnText: '取消',
-
-        menu: true,
-        menuWidth: 210,
-        menuClassName: 'cur-menu',
-
-        height: 'auto',
-        calcHeight: 196,
-
-        column: [
-          {
-            label: '工单编号',
-            prop: 'job_info_num',
-            width: 150
-          },
-          {
-            label: '工单名称',
-            prop: 'name',
-            width: 100,
-            ellipsis: true,
-            overHidden: true,
-            showOverflowTooltip: true
-          },
-          {
-            label: '工单状态',
-            prop: 'status',
-            width: 88,
-            showOverflowTooltip: true
-          },
-          {
-            label: '所属单位',
-            prop: 'dept_name',
-            ellipsis: true,
-            showOverflowTooltip: true
-          },
-          {
-            label: '创建时间',
-            prop: 'create_time',
-            width: 144,
-            ellipsis: true,
-            showOverflowTooltip: true
-          },
-          {
-            label: '已执行次数',
-            prop: 'job_num',
-            width: 70,
-            ellipsis: true,
-            showOverflowTooltip: true
-          },
-          {
-            label: '工单内容',
-            prop: 'content',
-            ellipsis: true,
-            overHidden: true,
-            showOverflowTooltip: true
-          },
-          {
-            label: '关联航线',
-            prop: 'wayline_name',
-            ellipsis: true,
-            overHidden: true,
-            showOverflowTooltip: true
-          },
-          {
-            label: '关联算法',
-            prop: 'ai_type_str',
-            width: 100,
-            ellipsis: true,
-            overHidden: true,
-            showOverflowTooltip: true
-          },
-          {
-            label: '关联机巢',
-            prop: 'device_names',
-            width: 100,
-            ellipsis: true,
-            overHidden: true,
-            showOverflowTooltip: true
-          },
-
-          {
-            label: '创建人',
-            prop: 'creator_name',
-            width: 96,
-            ellipsis: true,
-            overHidden: true,
-            showOverflowTooltip: true
-          },
-          // {
-          //   label: '关联机巢', prop: 'device_names', width: 112, ellipsis: true, overHidden: true,
-          //   showOverflowTooltip: true,
-          // },
-          {
-            label: '工单周期频次',
-            prop: '',
-            width: 110,
-            formatter: row => this.formatCycleTime(row),
-            html: true,
-            ellipsis: true,
-            showOverflowTooltip: true
-            // overHidden: true
-          }
-        ]
-      },
-
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0
-      },
-      dialogVisible: false,
-      detailVisible: false,
-      currentDetail: {},
-      form: {},
-      rules: {
-        name: [
-          { required: true, message: '请输入工单名称', trigger: 'blur' },
-          { max: 100, message: '工单名称不能超过100个字', trigger: 'blur' }
-        ],
-        file_id: [{ required: true, message: '需要选择航线', trigger: 'change' }],
-        device_sns: [{ required: true, message: '请选择机巢', trigger: 'change' }],
-        content: [
-          { required: true, message: '请输入工单内容', trigger: 'blur' },
-          { max: 255, message: '工单内容不能超过255个字', trigger: 'blur' }
-        ],
-        date_range: [{ required: true, message: '请选择时间不能为空', trigger: 'blur' }],
-        rep_fre_type: [{ required: true, message: '请选择周期', trigger: 'blur' }],
-        deal_time: [{ required: true, message: '请选择执行时间', trigger: 'blur' }]
-      },
-      loading: false,
-      globalCounts: {},
-      mapLoaded: false,
-
-      // 配置时间选择器默认配置
-      datePickerDefaultVal: calculateDefaultRange()
-    }
-  },
-  async created () {
-    var response = await getDictionaryByCode('SF')
-    var word_order_typeResponse = await getDictionaryByCode('WORK_ORDER_TYPE')
-    this.ai_types = response.data.data['SF']
-    this.types = word_order_typeResponse.data.data['WORK_ORDER_TYPE']
-    //获取航线
-    this.asyncgetWaylineFileListByArea()
-    const response2 = await getTicketInfo()
-    const { dept_data, event_type, ai_type } = response2.data.data
-    this.departments = dept_data.map(item => ({
-      label: item.dept_name,
-      value: item.id
-    }))
-  },
-  mounted () {
-    this.fetchTableData()
-    const id = this.$route.query.id
-    console.log('idddddd', id)
-
-    if (id) {
-      // 确保 id 存在
-      this.handleViewDetail({ id })
-      const find = this.$store.state.tags.bsTagList.find(i => i.path === '/tickets/orderLog')
-      find && (find.query = {})
-    } else {
-      console.error('工单ID不存在!')
-    }
-  },
-  computed: {
-    CircleClose () {
-      return CircleClose
-    },
-    ...mapGetters(['userInfo', 'permission']),
-    safeHeight () {
-      const safeHeight = this.$store.state.common.safeHeight
-      return Number(safeHeight) || 0 // 确保是数字类型
-    },
-    positionsArr () {
-      const positionsArr = this.$store.state.common.positionsArr
-      return positionsArr || [] // 确保是数字类型
-    },
-    filteredTabs () {
-      // rejection_and_draft 权限控制“已驳回”和“草稿”tab
-      // console.log(this.permission, '权限信息')
-      // console.log(this.userInfo, '权限信息22')
-      const canShowRejectAndDraft = this.permission?.rejection_and_draft === true
-      return this.tabs
-        .map(tab => {
-          if (tab.name === 'DRAFT') {
-            return { ...tab, isShow: canShowRejectAndDraft }
-          }
-          if (tab.name === 'REJECTED') {
-            return { ...tab, isShow: canShowRejectAndDraft }
-          }
-          return { ...tab, isShow: true }
-        })
-        .filter(tab => tab.isShow)
-    }
-  },
-
-  methods: {
-    handleCellClick (row, column) {
-      if (column.no === 1) {
-        navigator.clipboard.writeText(row.job_info_num).then(() => {
-          this.$message.success('复制工单编号成功')
-        })
-      } else if (column.no === 2) {
-        navigator.clipboard.writeText(row.name).then(() => {
-          this.$message.success('复制工单名称成功')
-        })
-      } else if (column.no === 4) {
-        navigator.clipboard.writeText(row.dept_name).then(() => {
-          this.$message.success('复制所属单位成功')
-        })
-      } else if (column.no === 8) {
-        navigator.clipboard.writeText(row.wayline_name).then(() => {
-          this.$message.success('复制关联航线成功')
-        })
-      } else if (column.no === 9) {
-        navigator.clipboard.writeText(row.ai_type_str).then(() => {
-          this.$message.success('复制关联算法成功')
-        })
-      }
-    },
-    disabledDate (time) {
-      return time.getTime() < Date.now() - 8.64e7 // 86400000 = 24 * 60 * 60 * 1000
-    },
-    searchChange (params, done) {
-      // console.log('searchChange')
-      this.query = params
-      this.parentId = ''
-      this.page.currentPage = 1
-      this.onLoad(this.page, params)
-      done()
-    },
-    async onLoad (page, params = {}) {
-      this.loading = true
-      getList(
-        null,
-        this.page.currentPage,
-        this.page.pageSize,
-        Object.assign(params, this.query)
-      ).then(res => {
-        this.tableData = res.data.data
-        this.loading = false
-        this.selectionClear()
-      })
-    },
-    selectionClear () {
-      this.selectionList = []
-      this.$refs.crud.toggleSelection()
-    },
-    async loadAMapScripts () {
-      try {
-        // await loadAMap();
-        // await loadAMapUI();
-        this.mapLoaded = true
-      } catch (error) {
-        console.error('Failed to load AMap scripts:', error)
-        this.$message.error('地图加载失败,请检查网络或API Key配置')
-      }
-    },
-    formatCycleTime (row) {
-      return `${row.cycle_time_value}`
-    },
-
-    async fetchTableData () {
-      this.loading = true
-      try {
-        let params = this.getQueryParam()
-        // console.log('发送的参数:', params)
-        const response = await getList(params, this.page.currentPage, this.page.pageSize)
-        if (!response?.data?.data?.records) {
-          throw new Error('接口返回数据格式不正确')
-        }
-
-        const { total, records } = response.data.data
-        this.tableData = records.map(item => {
-          return item
-        })
-
-        // console.log('权限检查:', this.permission)
-        this.page.total = total || 0
-        this.updateGlobalCounts()
-      } catch (error) {
-        // console.error('获取数据失败:', error)
-        this.$message.error(error.message || '获取数据失败')
-        this.tableData = []
-        this.page.total = 0
-      } finally {
-        this.loading = false
-      }
-    },
-
-    getQueryParam () {
-      const currentTab = this.tabs.find(tab => tab.name === this.activeTab)
-      if (this.filters.dateRange) {
-        // console.log(
-        //   'this.formatDate(this.filters.dateRange[0])',
-        //   this.formatDate(this.filters.dateRange[0])
-        // )
-      }
-
-      const params = {
-        key_word: this.filters.key_word || undefined,
-        create_dept: this.filters.create_dept || undefined,
-        ai_types:
-          this.filters.ai_types && this.filters.ai_types.length > 0
-            ? [this.filters.ai_types]
-            : null,
-        file_id: this.filters.file_id || undefined,
-        status: this.filters.status !== '' ? Number(this.filters.status) : currentTab?.value,
-        dept_id: this.filters.department || undefined,
-        create_start_date: this.filters.dateRange?.[0]
-          ? this.formatDate(this.filters.dateRange[0])
-          : undefined,
-        create_end_date: this.filters.dateRange?.[1]
-          ? this.formatDate(this.filters.dateRange[1]).replace('00:00:00', '23:59:59')
-          : undefined,
-
-        start_date: this.filters.cycleDateRange?.[0]
-          ? this.formatDate(this.filters.cycleDateRange[0])
-          : undefined,
-        end_date: this.filters.cycleDateRange?.[1]
-          ? this.formatDate(this.filters.cycleDateRange[1]).replace('00:00:00', '23:59:59')
-          : undefined,
-        rep_fre_type: this.filters.rep_fre_type || undefined,
-        deal_time: this.filters.deal_time || undefined,
-        current: this.page.currentPage,
-        size: this.page.pageSize
-      }
-      return params
-    },
-    sizeChange (pageSize) {
-      this.page.pageSize = pageSize
-    },
-    async submitForm (status) {
-      this.$refs.testform.validate(async valid => {
-        if (valid) {
-          let dateRange = this.form.date_range
-          // console.log('dateRange' + dateRange)
-
-          this.form.begin_time = this.formatDate(dateRange[0])
-          this.form.end_time = this.formatDate(dateRange[1])
-
-          // 如果选中日期包含当前天,那么选中的时间点不能小于当前时间
-          if (this.form.deal_time) {
-            const selectedDate = dayjs(this.form.date_range[0]).format('YYYY-MM-DD')
-            const selectedTime = dayjs(selectedDate + ' ' + this.form.deal_time).toDate()
-            const now = new Date()
-
-            if (selectedDate === dayjs().format('YYYY-MM-DD') && selectedTime < now) {
-              return this.$message.warning('任务时间不能小于当前时间')
-            }
-          }
-          let checkedList = this.device_sns.filter(item => this.form.device_sns.includes(item.device_sn))
-          const maxItem = checkedList.reduce((max, item) => {
-            return item.drone_height > max.drone_height ? item : max
-          })
-          // 返航绝对高度
-          let backHeight = this.form.rth_altitude // + maxItem.drone_height
-          console.log(backHeight, 'backHeight')
-          // 安全起飞高度
-          let positions = this.positionsArr
-          positions.unshift({ latitude: maxItem.latitude, longitude: maxItem.longitude, height: maxItem.drone_height })
-          positions.push({ latitude: maxItem.latitude, longitude: maxItem.longitude, height: maxItem.drone_height })
-          let resultHeight = 0
-          await getWaylineMaxTerrainHeight(positions).then(res => {
-            resultHeight = this.safeHeight > (res.data.data + 30) ? this.safeHeight : (res.data.data + 30)
-          })
-          let valueHeight = _.round(backHeight - resultHeight, 2)
-          console.log('打印比较值', valueHeight)
-
-          if (valueHeight < 0) {
-            this.$confirm(`当前返航高度存在安全隐患,建议调整为${resultHeight}米以上后进行发布`, '提示', {
-              confirmButtonText: '确定',
-              cancelButtonText: '取消',
-              type: 'warning'
-            }).then(async () => {
-              const submitData = {
-                ...this.form,
-                status: status,
-                ai_types: this.form.ai_types?.length ? this.form.ai_types : []
-              }
-              await saveUpdateOrderLog(submitData)
-              let id = this.form.id
-              if (id) {
-                this.$message.success('工单发布成功')
-              } else {
-                this.$message.success('工单创建成功')
-              }
-              this.dialogVisible = false
-              this.detailVisible = false;
-              (this.device_sns = []), (this.wayLineList = []), this.fetchTableData()
-            }).catch(() => {
-
-            })
-          } else {
-            const submitData = {
-              ...this.form,
-              status: status,
-              ai_types: this.form.ai_types?.length ? this.form.ai_types : []
-            }
-            await saveUpdateOrderLog(submitData)
-            let id = this.form.id
-            if (id) {
-              this.$message.success('工单发布成功')
-            } else {
-              this.$message.success('工单创建成功')
-            }
-            this.dialogVisible = false
-            this.detailVisible = false;
-            (this.device_sns = []), (this.wayLineList = []), this.fetchTableData()
-          }
-        }
-      })
-    },
-    //驳回原因显示
-    async rejectDetail (id) {
-      const response = await orderLogDetails(id)
-      let data = response.data.data
-      this.$confirm(data.remark, '驳回原因', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        this.form = {
-          ...response.data.data
-        }
-        // this.detailVisible = true
-        this.handleViewDetail(data)
-      })
-    },
-    formatDate (date) {
-      if (!date) return undefined
-      const d = new Date(date)
-      return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(
-        d.getDate()
-      ).padStart(2, '0')} 00:00:00`
-    },
-
-    mapStatus (status) {
-      const statusTextMap = {
-        0: '草稿',
-        1: '待审核',
-        2: '已驳回',
-        3: '已通过'
-      }
-      return statusTextMap[status] || '未知状态'
-    },
-
-    getStatusTagType (status) {
-      const statusMap = {
-        1: 'warning',
-        2: 'info',
-        3: 'primary',
-        4: 'success',
-        5: 'danger'
-      }
-      return statusMap[status] || 'info'
-    },
-
-    handleTabChange (tab) {
-      this.activeTab = tab.props?.name || tab.name
-      this.filters.status = ''
-      if (tab.props?.name === 'WAIT_AUDIT') {
-        this.filters.status = '1'
-      } else if (tab.props?.name === 'REJECTED') {
-        this.filters.status = '2'
-      } else if (tab.props?.name === 'PASS') {
-        this.filters.status = '3'
-      } else if (tab.props?.name === 'DRAFT') {
-        this.filters.status = '0'
-      }
-      this.page.currentPage = 1
-      this.fetchTableData()
-    },
-
-    handleSearch () {
-      this.page.currentPage = 1
-      this.fetchTableData()
-    },
-
-    handleReset () {
-      this.filters = {
-        keyword: '',
-        department: '',
-        type: '',
-        dateRange: [],
-        status: ''
-      }
-      this.page.currentPage = 1
-      this.fetchTableData()
-    },
-
-    currentChange (currentPage) {
-      this.page.currentPage = currentPage
-    },
-
-    async updateGlobalCounts () {
-      const counts = {
-        all: 0,
-        DRAFT: 0,
-        WAIT_AUDIT: 0,
-        REJECTED: 0,
-        PASS: 0
-      }
-      var reponse = await jobStatusNum()
-      // console.log('统计' + reponse.data.data)
-      reponse.data.data.forEach(item => {
-        const tab = this.tabs.find(t => t.name === item.dict_key)
-        if (tab) {
-          tab.count = item.num
-        }
-      })
-    },
-
-    handleAdd () {
-      this.form = {}
-      this.form.rth_altitude = 120
-      this.dialogVisible = true
-
-      this.$nextTick(() => {
-        if (this.$refs.MapContainer && this.$refs.MapContainer.initAddEntity) {
-          this.$refs.MapContainer.initAddEntity('initPosition')
-        }
-      })
-
-      //航线列表
-      this.asyncgetWaylineFileListByArea()
-    },
-
-    resetForm () {
-      this.form = {
-        name: '',
-        type: '',
-        handler: '',
-        algorithm: '',
-        location: '',
-        address: '',
-        content: '',
-        photos: []
-      }
-      if (this.$refs.testform) {
-        this.$refs.testform.resetFields()
-      }
-    },
-
-    formatLocation (location) {
-      if (!Array.isArray(location)) {
-        return '未知位置'
-      }
-      return `${location[0].toFixed(6)}, ${location[1].toFixed(6)}`
-    },
-    async handleViewDetail (row) {
-      const response = await orderLogDetails(row.id)
-      const data = response.data.data
-      this.form = {
-        ...data
-      }
-
-      // 更新机巢列表
-      this.device_sns = data.device_map_infos// data.device_list;
-      this.permission &&
-        (this.permission.order_log_review || this.permission.order_log_recall) &&
-        (data.status == 1 || data.status == 3 || (data.status == 2 && this.userInfo.user_id !== this.form.create_user))
-        ? (this.detailTitle = '工单详情')
-        : (this.detailTitle = '编辑工单')
-
-      this.detailVisible = true
-      // 更新航线列表,追加 wayline_file_region_vo 数据
-      if (data.wayline_file_region_vo) {
-        const newWayline = data.wayline_file_region_vo
-
-        // 检查是否已经存在于 this.wayLineList 中
-        const isDuplicate = this.wayLineList.some(
-          item => item.wayline_id === newWayline.wayline_id
-        )
-
-        if (!isDuplicate) {
-          this.wayLineList.push(newWayline)
-        }
-      }
-
-      this.initMapLine(data.device_map_infos)
-      const find = this.$store.state.tags.bsTagList.find(i => i.path === '/tickets/orderLog')
-      find && (find.query = {})
-    },
-    async handleCheckDetail (row) {
-      const response = await orderLogDetails(row.id)
-      const data = response.data.data
-      this.form = {
-        ...data
-      }
-      // 更新航线列表,追加 wayline_file_region_vo 数据
-      // 更新航线列表,追加 wayline_file_region_vo 数据
-      if (data.wayline_file_region_vo) {
-        const newWayline = data.wayline_file_region_vo
-
-        // 检查是否已经存在于 this.wayLineList 中
-        const isDuplicate = this.wayLineList.some(
-          item => item.wayline_id === newWayline.wayline_id
-        )
-
-        if (!isDuplicate) {
-          this.wayLineList.push(newWayline)
-        }
-      }
-      // 更新机巢列表
-      this.device_sns = data.device_list
-      this.detailVisibleCopy = true
-      this.initMapLine(data.device_map_infos)
-    },
-    //导出
-    async exportData () {
-      this.$confirm('是否智飞工单数据?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        NProgress.start()
-        let params = this.getQueryParam()
-        orderLogExport(params).then(res => {
-          downloadXls(res.data, `智飞工单${this.$dayjs().format('YYYY-MM-DD')}.xlsx`)
-          NProgress.done()
-        })
-      })
-    },
-    hasAddBtnPermission () {
-      // undefined 或 false 都返回 false,只有 true 返回 true
-      // console.log('this.permission.order_log_add :', this.permission.order_log_add)
-      return this.permission && this.permission.order_log_add === true
-    },
-    hasPaddingBtnPermission () {
-      // undefined 或 false 都返回 false,只有 true 返回 true
-      // console.log('权限检查:', this.permission)
-      return this.permission && this.permission.order_log_review === true
-    },
-    hasRecallPaddingBtnPermission () {
-      // undefined 或 false 都返回 false,只有 true 返回 true
-      // console.log('权限检查:', this.permission)
-      // 智飞工单撤回
-      return this.permission && this.permission.order_log_recall === true
-    },
-    //驳回按钮权限
-    hasRejectionBtnPermission () {
-      // undefined 或 false 都返回 false,只有 true 返回 true
-      // console.log('权限检查:', this.permission)
-      return this.permission && this.permission.rejection_btn === true
-    },
-    //自己点发布
-    userPublishPush (id) {
-      this.$confirm('确定发布吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        let response = userPublish(id)
-        this.$message.success('发布成功')
-        this.fetchTableData()
-      })
-    },
-
-    //删除
-    deleteOrderLog (id) {
-      this.$confirm('确定删除吗?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(() => {
-        let response = deleteOrderLog(id)
-        this.$message.success('删除')
-        this.fetchTableData()
-      })
-    },
-    refreshChange () {
-      this.fetchTableData()
-    },
-    //获取航线列表
-    async asyncgetWaylineFileListByArea (name) {
-      const formData = {
-        name: '',
-        waylineType: undefined,
-        current: 1,
-        size: 99999999,
-        descs: 'update_time'
-      }
-      var wayLineListResponse = await newGetWorkspacesPage(formData)
-      this.wayLineList = wayLineListResponse.data.data.records
-
-      this.initMapLine()
-    },
-
-    initMapLine (infos = {}, cb = () => {
-    }) {
-      let currentLine = this.wayLineList.find(item => item.wayline_id == this.form.file_id)
-
-      if (!currentLine) return
-
-      this.$nextTick(() => {
-        if (this.$refs.MapContainer && this.$refs.MapContainer.initAddEntity) {
-          this.$refs.MapContainer.initAddEntity('polyline', {
-            url: `${import.meta.env.VITE_APP_AIRLINE_URL + currentLine.object_key
-              }?_t=${new Date().getTime()}`,
-            type: currentLine.wayline_type,
-            cb,
-            infos
-          })
-        }
-      })
-    },
-
-    //可飞行机巢列表
-    async getFlyingNestBy (waylineId) {
-      const that = this
-
-      // 先清空
-      that.form.device_sns = []
-      that.device_sns = []
-
-      this.initMapLine({}, async polygon => {
-        const currentLine = that.wayLineList.find(item => item.wayline_id === waylineId)
-        //按照航线来
-        const params = {
-          type: ['2', '4', '5', '7', '8', '9', '10'].includes(currentLine.wayline_type) ? 2 : 0,
-          wayline_id: waylineId,
-          polygon
-        }
-        var wayLineListResponse = await getFlyingNestBy(params)
-        // 再赋值
-        that.device_sns = wayLineListResponse.data.data
-      })
-    },
-
-    //撤回
-    async orderLogRecall (id) {
-      this.$confirm('确定撤回则到草稿箱。', '是否撤回?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning'
-      }).then(async () => {
-        let reposne = await orderLogRecall(id)
-        this.handleSearch()
-      })
-    },
-    onLoad () {
-      this.fetchTableData()
-    },
-    /**
-     * 通过
-     */
-    async orderLogPass (id) {
-      let response = await orderLogPass(id)
-      let data = response.data.data
-      this.$message.success('审核通过')
-      this.detailVisibleCopy = false
-
-      this.detailVisible = false
-
-      this.page.currentPage = 1
-      this.onLoad(this.page, this.query)
-      // this.handleViewDetail()
-    },
-    /**
-     * 驳回
-     */
-    async orderLogReject (id) {
-      this.$prompt('', '驳回原因', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消'
-      }).then(async ({ value }) => {
-        let response = await orderLogReject(id, value)
-        let data = response.data.data
-        this.$message.success('驳回成功')
-        this.detailVisibleCopy = false
-
-        // this.detailVisible = false
-
-        this.page.currentPage = 1
-        this.onLoad(this.page, this.query)
-      })
-    }
-  },
-  watch: {
-    // lastHeight(newVal, oldVal) {
-    //   console.log('lastHeight', newVal, oldVal);
-    //   this.getlastHeight = newVal;
-    // },
-    tableData: {
-      handler () {
-        // this.updateTabCounts()
-      },
-      deep: true
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-//:deep(.el-input-number) {
-//  width: 200px;
-//}
-
-//:deep(.el-form-item__label) {
-//  width: 100px !important;
-//}
-
-::v-deep(.el-tabs) {
-  height: 100%;
-  display: flex;
-  flex-direction: column;
-
-  .el-tabs__header {
-    order: 1;
-  }
-
-  .el-tabs__content {
-    order: 2;
-  }
-
-  .el-tabs__content {
-    height: 0;
-    flex: 1;
-    display: flex;
-    flex-direction: column;
-
-    .el-tab-pane {
-      height: 0;
-      flex: 1;
-      display: flex;
-      flex-direction: column;
-    }
-  }
-}
-
-.filter-bar {
-  // align-items: center;
-
-  .search-bar-box {
-    margin-bottom: 15px;
-    display: flex;
-    justify-content: space-between;
-    gap: 8px;
-
-    &-item {
-      flex: 1;
-
-      &> ::v-deep(.el-date-editor) {
-        width: 100%;
-        box-sizing: border-box;
-      }
-    }
-
-    .search-btn {
-      flex: 1;
-      display: flex;
-      justify-content: flex-end;
-    }
-
-    .flex-2 {
-      min-width: 454px;
-    }
-  }
-}
-
-:deep(.el-pagination .el-select) {
-  width: 128px !important;
-}
-
-.step-timer {
-  position: absolute;
-  left: 80%;
-  top: 50%;
-  transform: translateY(-50%);
-  width: 100px;
-  margin-left: 4px;
-  color: #666;
-  font-size: 12px;
-}
-
-:deep(.el-textarea__inner) {
-  padding: 8px 12px;
-}
-
-:deep(.el-input__inner),
-:deep(.el-select),
-:deep(.el-select .el-input) {
-  width: 100%; // 确保所有输入框和选择框宽度一致
-}
-
-:deep(.el-textarea__inner) {
-  resize: none;
-}
-
-.action-bar {
-  margin-bottom: 16px;
-}
-
-.el-tabs {
-  :deep(.el-tabs__content) {
-    overflow: visible;
-  }
-}
-
-.el-dialog {
-  .el-form-item {
-    margin-bottom: 10px;
-  }
-}
-
-.el-upload {
-  width: 100%;
-  display: flex;
-  flex-wrap: wrap;
-
-  :deep(.el-upload-list__item) {
-    transition: all 0.3s ease;
-  }
-
-  :deep(.el-upload-list__item:hover) {
-    background-color: #f5f7fa;
-  }
-}
-
-.el-upload__tip {
-  font-size: 12px;
-  color: #909399;
-  margin-top: 7px;
-}
-
-.custom-steps-container {
-  width: 100%;
-  margin: 20px 0;
-}
-
-.steps-titles {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 16px;
-  position: relative;
-}
-
-.step-title {
-  text-align: center;
-  flex: 1;
-  font-size: 16px;
-  color: #999;
-  position: relative;
-  padding-bottom: 10px;
-}
-
-.step-title.active {
-  color: #409eff;
-  font-weight: bold;
-}
-
-.custom-steps {
-  margin-top: -20px;
-  /* 向上移动与标题重叠 */
-}
-
-.el-step__head {
-  margin-top: 0;
-}
-
-.el-step__description {
-  margin-top: 8px;
-  padding: 0 20px;
-}
-
-.step-description {
-  font-size: 14px;
-  color: #666;
-  line-height: 1.5;
-}
-
-.event-title-center {
-  text-align: center;
-  font-size: 20px;
-  font-weight: bold;
-  margin-bottom: 12px;
-  color: #333;
-}
-
-.cur-menu {
-  .menu-custom-box {
-    display: flex;
-    justify-content: center;
-    flex-wrap: wrap;
-
-    &> ::v-deep(.el-button) {
-      flex: 1;
-      margin-left: 0;
-      margin-right: 10px;
-    }
-  }
-}
-
-.add-box-btns {
-  width: 100%;
-  display: flex;
-  justify-content: center;
-}
-
-.safe-height {
-  :deep(.el-form-item__label) {
-    width: 120px !important;
-  }
-
-  :deep(.el-input-number) {
-    width: 180px !important;
-  }
-}
-
-.flex {
-  display: flex;
-}
-
-.flex-1 {
-  flex: 1;
-
-  &> ::v-deep(div) {
-    width: 100% !important;
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/tickets/ticket-copy.vue b/applications/task-work-order/src/views/tickets/ticket-copy.vue
deleted file mode 100644
index fa7c9dd..0000000
--- a/applications/task-work-order/src/views/tickets/ticket-copy.vue
+++ /dev/null
@@ -1,4072 +0,0 @@
-<template>
-  <basic-container>
-    <el-tabs v-model="activeTab" @tab-click="handleTabChange">
-      <el-tab-pane
-        v-for="tab in filteredTabs"
-        :key="tab.name"
-        :label="`${tab.label} (${tab.count})`"
-        :name="tab.name"
-      >
-        <basic-main-content>
-          <!-- 查询条件筛选栏 -->
-          <!-- 查询条件筛选栏 -->
-          <div class="ztzf-form-search">
-            <el-form :model="filters" inline>
-              <el-row :gutter="24">
-                <el-col :span="4">
-                  <el-form-item label="关键字:">
-                    <el-input
-                      v-model="filters.keyword"
-                      placeholder="请输入关键字"
-                      class="filter-item"
-                      clearable
-                      @clear="handleKeyWords"
-                      @keyup.enter="handleSearch"
-                    />
-                  </el-form-item>
-                </el-col>
-
-                <!-- <el-select
-                  v-model="filters.department"
-                  placeholder="请选择所属部门"
-                  class="filter-item"
-                  clearable
-                >
-                  <el-option
-                    v-for="item in departments"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  />
-                </el-select> -->
-                <!-- <el-select
-                  v-model="filters.type"
-                  placeholder="请选择工单类型"
-                  class="filter-item"
-                  clearable
-                  @change="handleSearch"
-                >
-                  <el-option
-                    v-for="item in types"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  />
-                </el-select> -->
-                <el-col :span="5">
-                  <el-form-item label="选择日期:">
-                  <el-date-picker
-                    v-model="filters.dateRange"
-                    type="daterange"
-                    class="filter-item"
-                    range-separator="至"
-                    start-placeholder="开始日期"
-                    end-placeholder="结束日期"
-                    :default-value="datePickerDefaultVal"
-                  >
-                  </el-date-picker>
-                  </el-form-item>
-                </el-col>
-                <el-col :span="4">
-                  <el-form-item label="选择状态:">
-                  <el-select
-                  :disabled="activeTab !== 'all'"
-                    v-model="filters.status"
-                    placeholder="请选择状态"
-                    class="filter-item"
-                    clearable
-                    @change="handleSearch"
-                  >
-                    <el-option
-                      v-for="item in statuses"
-                      :key="item.value"
-                      :label="item.label"
-                      :value="item.value"
-                    />
-                  </el-select>
-                  </el-form-item>
-                </el-col>
-
-                <!-- <el-select
-                  v-model="filters.algorithm"
-                  placeholder="请选择关联算法"
-                  class="filter-item"
-                  clearable
-                  @change="handleSearch"
-                >
-                  <el-option
-                    v-for="item in algorithms"
-                    :key="item.dict_key"
-                    :label="item.dict_value"
-                    :value="item.dict_key"
-                  />
-                </el-select> -->
-                <!-- <el-tree-select
-                  popper-class="custom-tree-select"
-                  :style="{ width: pxToRem(186) }"
-                  placeholder="请选择关联算法"
-                  v-model="dictKey"
-                  :data="dataList"
-                  :default-expanded-keys="[dictKey]"
-                  check-strictly
-                  node-key="id"
-                  :props="treePropsSF"
-                  @node-click="handleSFNodeClick"
-                  clearable
-                  @clear="handleClear"
-                /> -->
-                <el-col :span="4">
-                  <el-form-item label="选择算法:">
-                  <el-tree-select
-                    style="z-index: 1000"
-                    :teleported="false"
-                    class="custom-tree-select"
-                    :style="{ width: pxToRem(186) }"
-                    v-model="dictKey"
-                    :data="dataList"
-                    :default-expanded-keys="[dictKey]"
-                    :props="treePropsSF"
-                    :render-after-expand="false"
-                    :default-checked-keys="checkedKeys"
-                    node-key="id"
-                    multiple
-                    show-checkbox
-                    collapse-tags
-                    collapse-tags-tooltip
-                    clearable
-                    @check="handleCheck"
-                    @clear="handleClear"
-                  />
-                  </el-form-item>
-                </el-col>
-                <el-col :span="4">
-                  <el-form-item label="复核状态:">
-                  <el-select
-                    v-model="filters.isReview"
-                    placeholder="请选择复核状态"
-                    class="filter-item"
-                    clearable
-                    @change="handleSearch"
-                  >
-                    <el-option
-                      v-for="item in reviewStatuses"
-                      :key="item.value"
-                      :label="item.label"
-                      :value="item.value"
-                    />
-                  </el-select>
-                  </el-form-item>
-                </el-col>
-                <el-col :span="3">
-                  <el-button type="primary" icon="el-icon-search" @click="handleSearch"
-                    >搜索</el-button
-                  >
-                  <el-button icon="el-icon-refresh" @click="handleReset">清空</el-button>
-                </el-col>
-              </el-row>
-            </el-form>
-          </div>
-          <!-- 表格部分 -->
-          <avue-crud
-            class="ztzf-public-general-avue-crud"
-            ref="avueCrud"
-            v-model="tableData"
-            :option="option"
-            :data="tableData"
-            v-model:page="page"
-            @size-change="sizeChange"
-            @current-change="handleCurrentChange"
-            @refresh-change="refreshChange"
-            :table-loading="loading"
-            @selection-change="handleSelectionChange"
-            :permission="permissionList"
-            v-if="activeTab === tab.name"
-          >
-            <template #orderNumber="{ row }">
-              <el-tooltip-copy :content="row.orderNumber" :showCopyText="true" textAlign="left">
-                {{ row.orderNumber }}
-              </el-tooltip-copy>
-            </template>
-            <template #orderName="{ row }">
-              <el-tooltip-copy :content="row.orderName" :showCopyText="true" textAlign="left">
-                {{ row.orderName }}
-              </el-tooltip-copy>
-            </template>
-            <template #menu-left>
-              <el-button
-                v-if="(activeTab === 'all' || activeTab === 'myTickets') && permissionList.addBtn"
-                type="primary"
-                icon="el-icon-plus"
-                @click="handleAdd"
-                >新建工单
-              </el-button>
-              <el-button
-                v-if="activeTab === 'pending' && permissionList.reviewBtn"
-                type="success"
-                icon="el-icon-check"
-                @click="openReviewDialog"
-                >批量审核
-              </el-button>
-            
-              <el-button
-                v-if="permissionList.exportBtn"
-                type="success"
-                plain
-                icon="el-icon-download"
-                @click="exportData"
-                >导出
-              </el-button>
-            </template>
-            <template #menu="{ row }">
-              <template v-if="row.status === -1">
-                <el-button type="text" icon="el-icon-edit" @click="handleEdit(row)">编辑</el-button>
-                <el-button
-                  type="text"
-                  icon="el-icon-delete"
-                  class="danger-button"
-                  @click="handleDelete(row)"
-                  >删除
-                </el-button>
-              </template>
-
-              <template v-else>
-                <el-button type="text" icon="el-icon-view" @click="handleViewDetail(row)"
-                  >详情
-                </el-button>
-              </template>
-     
-              <template  v-if="row.status === 4 && activeTab === 'completed'">
-                <el-button type="text" icon="el-icon-download"  @click="exportTheTick(row)"
-                  >导出
-                </el-button>
-              </template>
-              <template v-if="permission.tickets_repeat_review">
-                <el-button
-                  v-if="row.status === 4 && row.isReview !== 1"
-                  type="text"
-                  icon="el-icon-check"
-                  @click="reCheck(row)"
-                  >复核
-                </el-button>
-              </template>
-            </template>
-            <template #status="{ row }">
-              <span
-                :style="getStatusTagType(row.status) ? 'color:' + getStatusTagType(row.status) : ''"
-              >
-                {{ mapStatus(row.status) }}
-              </span>
-            </template>
-            <template #keyData="{ row }">
-              <span>{{ row.address }}</span>
-            </template>
-
-            <template #isReview="{ row }">
-              <span>{{ showIsReviewText(row) }}</span>
-            </template>
-          </avue-crud>
-        </basic-main-content>
-      </el-tab-pane>
-    </el-tabs>
-
-    <!-- 新建工单对话框 -->
-    <el-dialog
-      v-model="dialogVisible"
-      v-if="dialogVisible"
-      title="新建工单"
-      width="70%"
-      :close-on-click-modal="false"
-      @close="resetForm"
-    >
-      <el-form
-        :model="form"
-        :rules="rules"
-        ref="form"
-        label-width="90px"
-        class="create-ticket-form"
-      >
-        <div class="form-section">
-          <el-row :gutter="16">
-            <el-col :span="12">
-              <el-form-item label="工单名称" prop="name">
-                <el-input v-model="form.name" placeholder="请输入工单名称"></el-input>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="工单类型" prop="type">
-                <el-select
-                  @change="handleTypeChange"
-                  v-model="form.type"
-                  placeholder="请选择工单类型"
-                  class="full-width"
-                >
-                  <el-option
-                    v-for="item in types"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  />
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row :gutter="16">
-            <el-col :span="12">
-              <el-form-item label="处理部门" prop="department">
-                <el-select
-                  v-model="form.department"
-                  placeholder="请选择处理部门"
-                  @change="handleDepartmentChange"
-                  class="full-width"
-                >
-                  <el-option
-                    v-for="dept in departments"
-                    :key="dept.value"
-                    :label="dept.label"
-                    :value="dept.value"
-                  />
-                </el-select>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="处理人员" prop="handler">
-                <el-select
-                  v-model="form.handler"
-                  placeholder="请先选择处理人员"
-                  :disabled="!form.department"
-                  class="full-width"
-                >
-                  <el-option
-                    v-for="user in availableHandlers"
-                    :key="user.id"
-                    :label="user.name"
-                    :value="user.id"
-                  />
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row :gutter="16">
-            <el-col :span="12">
-              <el-form-item label="关联算法" prop="algorithm">
-                <el-select
-                  v-model="form.algorithm"
-                  multiple
-                  placeholder="请选择关联算法"
-                  class="full-width"
-                  :disabled="!form.type"
-                >
-                  <el-option
-                    v-for="item in algorithms2"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  />
-                </el-select>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="事件位置" prop="location">
-                <div class="location-wrapper">
-                  <avue-input-map
-                    v-model="form.location"
-                    :clearable="false"
-                    :params="mapParams"
-                    @change="handleLocationChange"
-                    type="button"
-                  >
-                    <el-button type="primary" plain class="map-button">
-                      <i class="el-icon-map-location"></i> 地图选点
-                    </el-button>
-                  </avue-input-map>
-                  <!-- <div v-if="form.location?.length >= 3">
-	{{ form.location[2] || '获取地址中...' }}
-  </div> -->
-                </div>
-              </el-form-item>
-            </el-col>
-          </el-row>
-
-          <el-row :gutter="16">
-            <el-col :span="12">
-              <el-form-item label="工单内容" prop="content">
-                <el-input
-                  type="textarea"
-                  v-model="form.content"
-                  :rows="4"
-                  placeholder="请输入工单内容描述"
-                ></el-input>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="事件图片" prop="photos" required class="upload-wrapper">
-                <el-upload
-                  v-if="createoredit === 1"
-                  ref="upload"
-                  :action="'#'"
-                  :auto-upload="false"
-                  list-type="picture-card"
-                  :on-change="handleFileChange"
-                  :on-remove="handleUploadRemove"
-                  :before-upload="beforeUpload"
-                  :file-list="form.photos"
-                  :limit="1"
-                  accept="image/*"
-                  class="create-upload"
-                >
-                  <template v-if="form.photos.length < 1">
-                    <!-- <i class="el-icon-plus">+</i> -->
-                    <div class="el-icon-plus">
-                      <span>+</span>
-                    </div>
-                  </template>
-                </el-upload>
-                <el-upload
-                  v-else
-                  ref="upload"
-                  :action="'#'"
-                  :auto-upload="false"
-                  list-type="picture-card"
-                  :on-change="handleFileChange"
-                  :on-remove="handleUploadRemove"
-                  :before-upload="beforeUpload"
-                  :file-list="popupShowImage(form.photos)"
-                  :limit="1"
-                  accept="image/*"
-                  class="create-upload"
-                >
-                  <template v-if="form.photos.length < 1">
-                    <div class="el-icon-plus">
-                      <span>+</span>
-                    </div>
-                  </template>
-                </el-upload>
-                <div class="upload-tip">需上传含有地址信息的照片(jpg、jpeg、png),且不超过5M</div>
-              </el-form-item>
-            </el-col>
-          </el-row>
-        </div>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer-new">
-          <el-button
-            type="danger"
-            :loading="submitLoading"
-            @click="submitForm"
-            icon="el-icon-position"
-            >发布
-          </el-button>
-          <el-button
-            type="infoprimary"
-            plain
-            :loading="draftLoading"
-            @click="saveDraft"
-            icon="el-icon-document-add"
-            >存草稿
-          </el-button>
-
-          <el-button @click="handleCancel" icon="el-icon-circle-close">取 消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-
-    <!-- 工单详情对话框 -->
-    <el-dialog
-      class="custom-dialog"
-      align-center
-      v-model="detailVisible"
-      title="工单详情"
-      width="80%"
-      append-to-body
-    >
-      <div class="detail-container">
-        <div class="detail-top-title">
-          <div class="event-title-center event-orderNumber">
-            {{ currentDetail.orderNumber || '工单编号' }}
-          </div>
-          <div class="event-title-center">{{ currentDetail.orderName || '事件名称' }}</div>
-        </div>
-        <div v-if="totalTime" class="event-total-time">总耗时:{{ totalTime }}</div>
-        <!-- 工单状态流程 -->
-        <div class="custom-steps-container">
-          <!-- 标题行 -->
-          <div class="steps-titles">
-            <div
-              v-for="(status, index) in stepStatusList"
-              :key="index"
-              :class="{
-                'step-title': true,
-                active: index <= stepStatusList.indexOf(String(currentDetail.status)),
-              }"
-            >
-              {{ mapStatus(status) }}
-            </div>
-          </div>
-
-          <!-- Element Steps 组件 -->
-          <el-steps :active="getActiveStep() - 1" align-center class="custom-steps">
-            <el-step v-for="(status, index) in stepStatusList" :key="index">
-              <template #description>
-                <span class="step-description">
-                  {{ getStepHandler(status) }}
-                </span>
-                <div class="step-description" v-if="getStepTime(status)">
-                  <span class="step-timer"> 耗时:{{ getStepTime(status) }} </span>
-                </div>
-                <div class="step-description">
-                  {{ getStepCreateTime(status) }}
-                </div>
-              </template>
-            </el-step>
-          </el-steps>
-        </div>
-
-        <div class="PopUpTableScrolls">
-          <!-- 基本信息表格 -->
-          <el-table :show-header="false" :data="formattedDetailFields" border class="tableCss">
-            <el-table-column prop="label1" label="基本信息" width="150">
-              <template #default="{ row }">
-                <!-- 添加必填星号的标签 -->
-                <span
-                  v-if="
-                    currentDetail.status === 0 &&
-                    (row.label1 === '关联算法' || row.label1 === '工单名称')
-                  "
-                  class="required-label"
-                >
-                  <span class="required-star">*</span>{{ row.label1 }}
-                </span>
-                <span v-else>{{ row.label1 }}</span>
-              </template>
-            </el-table-column>
-            <el-table-column>
-              <template #default="{ row }">
-                <template
-                  v-if="
-                    currentDetail.status === 0 &&
-                    row.label1 === '工单名称' &&
-                    hasProcessingBtnPermission()
-                  "
-                >
-                  <el-input
-                    v-model="currentDetail.orderName"
-                    placeholder="请输入工单名称"
-                    class="required-input"
-                  />
-                </template>
-                <template
-                  v-else-if="
-                    currentDetail.status === 0 &&
-                    row.label1 === '关联算法' &&
-                    hasProcessingBtnPermission()
-                  "
-                >
-                  <el-select
-                    v-model="currentDetail.aiType"
-                    placeholder="请选择关联算法"
-                    class="required-input"
-                  >
-                    <el-option
-                      v-for="item in algorithms2"
-                      :key="item.value"
-                      :label="item.label"
-                      :value="item.value"
-                    />
-                  </el-select>
-                </template>
-                <template v-else>{{ row.value1 }}</template>
-              </template>
-            </el-table-column>
-            <el-table-column prop="label2" label="基本信息" width="150">
-              <template #default="{ row }">
-                <!-- 添加必填星号的标签 -->
-
-                <span
-                  v-if="currentDetail.status === 0 && row.label2 === '工单内容'"
-                  class="required-label"
-                >
-                  <span class="required-star">*</span>{{ row.label2 }}
-                </span>
-                <span v-else>{{ row.label2 }}</span>
-              </template>
-            </el-table-column>
-            <el-table-column>
-              <template #default="{ row }">
-                <!-- 修改工单类型和工单内容的显示 -->
-
-                <template
-                  v-if="
-                    currentDetail.status === 0 &&
-                    row.label2 === '工单内容' &&
-                    hasProcessingBtnPermission()
-                  "
-                >
-                  <el-input
-                    type="textarea"
-                    v-model="currentDetail.content"
-                    placeholder="请输入工单内容"
-                    class="required-input"
-                  />
-                </template>
-                <template v-else>{{ row.value2 }}</template>
-              </template>
-            </el-table-column>
-          </el-table>
-
-          <!-- 事件处理详情 -->
-          <div v-if="[3, 4].includes(currentDetail.status)" class="form-section">
-            <div class="section-title">
-              <!-- 处理中状态显示必填星号 -->
-              <template v-if="currentDetail.status === 3">
-                <span class="required-label">
-                  <span class="required-star">*</span>事件处理详情
-                </span>
-              </template>
-              <template v-else> 事件处理详情</template>
-            </div>
-            <!-- 处理中状态显示输入框 -->
-            <template v-if="currentDetail.status === 3 && hasProcessedAndOverBtnPermission()">
-              <el-input
-                type="textarea"
-                v-model="currentDetail.processingDetail"
-                placeholder="请输入事件处理详情"
-                :rows="4"
-                style="width: 100%; margin-bottom: 10px"
-              />
-            </template>
-            <!-- 已完成和已完结状态显示只读文本 -->
-            <template v-else>
-              <div class="readonly-processing-detail">
-                {{ currentDetail.processingDetail }}
-              </div>
-            </template>
-          </div>
-
-          <!-- 上传图片 -->
-          <div v-if="[3].includes(currentDetail.status)" class="form-section uploadImg">
-            <div class="section-title" v-if="hasProcessedAndOverBtnPermission()">
-              <!-- 已完成状态显示必填星号 -->
-              <template v-if="currentDetail.status === 3">
-                <span class="required-label"> <span class="required-star">*</span>上传图片 </span>
-              </template>
-              <template v-else> 上传图片</template>
-            </div>
-            <el-upload
-              v-if="hasProcessedAndOverBtnPermission()"
-              ref="upload"
-              :action="'#'"
-              :auto-upload="false"
-              list-type="picture-card"
-              :on-change="handleFileChange"
-              :on-remove="handleUploadRemove"
-              :before-upload="beforeUpload"
-              :file-list="currentDetail.photos || []"
-              :limit="1"
-              accept="image/*"
-              class="detail-upload"
-            >
-              <template v-if="!currentDetail.photos || currentDetail.photos.length < 1">
-                <!-- <i class="el-icon-plus">+</i> -->
-                <div class="el-icon-plus">
-                  <span>+</span>
-                </div>
-              </template>
-            </el-upload>
-            <div class="el-upload__tip" v-if="hasProcessedAndOverBtnPermission()">
-              (上传照片即可完结工单,只能上传jpg、jpeg、png照片,且不超过5M)
-            </div>
-          </div>
-
-          <!-- 图片和地图部分 -->
-          <div class="media-section">
-            <el-row :gutter="20">
-              <el-col :span="12">
-                <div class="media-box">
-                  <div class="media-title">事件图片</div>
-                  <div class="media-content">
-                    <el-image
-                      v-if="currentDetail.mediaUrl"
-                      :src="getThumbUrl(currentDetail.mediaUrl)"
-                      :preview-src-list="[getPreviewUrl(currentDetail.mediaUrl)]"
-                      fit="contain"
-                      style=" cursor: pointer"
-                    >
-                      <template #placeholder>
-                        <div class="image-placeholder">
-                          <i class="el-icon-picture-outline"></i>
-                          <span>加载中...</span>
-                        </div>
-                      </template>
-                      <template #error>
-                        <div class="image-error">
-                          <i class="el-icon-picture-outline"></i>
-                          <span>加载失败</span>
-                        </div>
-                      </template>
-                    </el-image>
-                    <div v-else class="no-media">暂无图片/视频</div>
-                  </div>
-                </div>
-              </el-col>
-              <el-col :span="12">
-                <div class="media-box">
-                  <!-- 根据状态显示不同的标题和内容 -->
-
-                  <template v-if="currentDetail.status === 4">
-                    <div class="media-title">工单处理图片</div>
-                    <div class="media-content">
-                      <el-image
-                        v-if="currentDetail.updatePhotoUrl"
-                        :src="getThumbUrl(currentDetail.updatePhotoUrl)"
-                        :preview-src-list="[getPreviewUrl(currentDetail.updatePhotoUrl)]"
-                        fit="fill"
-                      >
-                        <template #placeholder>
-                          <div class="image-placeholder">
-                            <i class="el-icon-picture-outline"></i>
-                            <span>加载中...</span>
-                          </div>
-                        </template>
-                        <template #error>
-                          <div class="image-error">
-                            <i class="el-icon-picture-outline"></i>
-                            <span>加载失败</span>
-                          </div>
-                        </template>
-                      </el-image>
-                      <div v-else class="no-media">暂无处理图片</div>
-                    </div>
-                  </template>
-                  <template v-else>
-                    <div class="media-title">
-                      地图标记事件点
-                      <el-popover
-                        v-if="currentDetail.status === 3 || currentDetail.status === 0"
-                        popper-class="custom-qrcode-popover"
-                        :width="120"
-                        :visible="currentDetail.showQR && detailVisible"
-                        placement="top"
-                        title=""
-                        trigger="click"
-                      >
-                        <template #reference>
-                          <img
-                            @click.stop="handleQRCode(currentDetail)"
-                            class="QRCodeImg"
-                            src="@/assets/images/dataCenter/qrCode.svg"
-                            alt=""
-                            title="事件导航"
-                          />
-                        </template>
-                        <div class="qrcode-content">
-                          <div class="close-btn" @click.stop="currentDetail.showQR = false">×</div>
-                          <CreateQRcode
-                            v-if="currentDetail.showQR && detailVisible"
-                            :latAndLon="currentDetail.location"
-                          ></CreateQRcode>
-                        </div>
-                      </el-popover>
-                    </div>
-                    <div class="media-content">
-                      <map-container v-if="detailVisible" ref="MapContainer"></map-container>
-                    </div>
-                  </template>
-                </div>
-              </el-col>
-            </el-row>
-          </div>
-        </div>
-
-        <!-- 操作按钮 -->
-        <div class="dialog-footer1-new">
-          <div class="leftBtn" :class="currentIndex === 0 ? 'disableds' : ''" @click="leftClick">
-            上一页
-          </div>
-          <div class="btngroups">
-            <template v-if="currentDetail.status === 2">
-              <!-- 待审核 -->
-              <el-button
-                v-if="hasReviewBtnPermission()"
-                type="primary"
-                :loading="approveLoading"
-                @click="approveTicket"
-                icon="el-icon-check"
-                >通过
-              </el-button>
-              <el-button
-                v-if="hasReviewBtnPermission()"
-                type="danger"
-                :loading="rejectLoading"
-                @click="rejectTicket"
-                icon="el-icon-close"
-                >不通过
-              </el-button>
-              <el-button @click="detailVisible = false" icon="el-icon-circle-close">取消</el-button>
-            </template>
-            <template v-else-if="currentDetail.status === 0">
-              <el-button
-                v-if="hasProcessingBtnPermission()"
-                type="primary"
-                :loading="dispatchLoading"
-                @click="approveAndDispatch"
-                icon="el-icon-check"
-                >受理
-              </el-button>
-              <el-button
-                v-if="hasProcessingBtnPermission()"
-                type="danger"
-                :loading="rejectLoading"
-                @click="rejectTicket"
-                icon="el-icon-close"
-                >不受理
-              </el-button>
-              <el-button @click="detailVisible = false" icon="el-icon-circle-close">取消</el-button>
-            </template>
-            <template v-if="currentDetail.status === 3">
-              <!-- 处理中 -->
-              <el-button
-                v-if="hasProcessedAndOverBtnPermission()"
-                type="primary"
-                :loading="completeLoading"
-                @click="completeTicket"
-                icon="el-icon-circle-check"
-                >完成工单
-              </el-button>
-              <el-button @click="detailVisible = false" icon="el-icon-circle-close">取消</el-button>
-            </template>
-            <template v-else-if="currentDetail.status === 4">
-              <!-- 已完成 -->
-              <!-- <el-button v-if="hasProcessedAndOverBtnPermission()" type="primary" :loading="finalizeLoading"
-              @click="finalizeTicket">完结工单</el-button> -->
-              <el-button @click="detailVisible = false" icon="el-icon-circle-close">取消</el-button>
-            </template>
-          </div>
-          <div
-            :class="currentIndex === tableData.length - 1 ? 'disableds' : ''"
-            class="leftBtn"
-            @click="rightClick"
-          >
-            下一页
-          </div>
-        </div>
-      </div>
-    </el-dialog>
-
-    <!-- 派发工单对话框 -->
-    <el-dialog
-      v-model="dispatchDialogVisible"
-      title="派发工单"
-      width="40%"
-      :close-on-click-modal="false"
-    >
-      <el-form :model="dispatchForm" :rules="dispatchRules" ref="dispatchForm" label-width="100px">
-        <el-form-item label="选择部门" prop="department">
-          <el-select
-            v-model="dispatchForm.department"
-            placeholder="请选择部门"
-            @change="handleDispatchDepartmentChange"
-          >
-            <el-option
-              v-for="dept in departments"
-              :key="dept.value"
-              :label="dept.label"
-              :value="dept.value"
-            />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="选择处理人" prop="handler">
-          <el-select
-            filterable
-            v-model="dispatchForm.handler"
-            placeholder="请选择处理人"
-            :disabled="!dispatchForm.department"
-          >
-            <el-option
-              v-for="user in availableDispatchHandlers"
-              :key="user.id"
-              :label="user.name"
-              :value="user.id"
-            />
-          </el-select>
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <el-button @click="dispatchDialogVisible = false" icon="el-icon-circle-close"
-          >取消
-        </el-button>
-        <el-button type="primary" :loading="dispatchLoading" @click="submitDispatch"
-          >确认派发
-        </el-button>
-      </template>
-    </el-dialog>
-
-    <!-- 添加在其他 dialog 组件之后 -->
-    <el-dialog
-      v-model="reviewDialogVisible"
-      title="批量审核"
-      width="1100"
-      append-to-body
-      class="ztzf-dialog-mange"
-      custom-class="review-dialog"
-      @close="cancleBatchReject"
-    >
-      <div class="review-container">
-        <div class="review-image-wrapper">
-          <!-- 修改左右箭头的显示条件 -->
-          <el-button
-            v-if="selections.length > 1 && currentReviewImage"
-            class="arrow-button left"
-            @click="handlePrevImage"
-            icon="el-icon-arrow-left"
-          >
-          </el-button>
-
-          <div class="review-image-container">
-            <!-- <el-image v-if="currentReviewImage" :src="getThumbUrl(currentReviewImage)" fit="fill"
-              :preview-src-list="getImageList()" :initial-index="currentImageIndex - 1" class="preview-image"
-              style="cursor: pointer"> -->
-            <el-image
-              v-if="currentReviewImage"
-              :src="getPreviewUrl(currentReviewImage)"
-              fit="fill"
-              :initial-index="currentImageIndex - 1"
-              class="preview-image"
-              style="cursor: pointer"
-            >
-              <template #error>
-                <div class="image-error">
-                  <i class="el-icon-picture-outline"></i>
-                  <span>图片加载失败</span>
-                </div>
-              </template>
-            </el-image>
-            <div v-else class="no-image">暂无图片</div>
-          </div>
-
-          <!-- 修改右箭头的显示条件 -->
-          <el-button
-            v-if="selections.length > 1 && currentReviewImage"
-            class="arrow-button right"
-            @click="handleNextImage"
-            icon="el-icon-arrow-right"
-          >
-          </el-button>
-        </div>
-
-        <!-- 修改分页器的显示条件 -->
-        <div class="review-pagination" v-if="selections.length > 1 && currentReviewImage">
-          <el-pagination
-            small
-            layout="prev, pager, next"
-            hide-on-single-page
-            :total="selections.length"
-            :current-page="currentImageIndex"
-            :page-size="1"
-            @current-change="handleImagePageChange"
-          >
-          </el-pagination>
-        </div>
-      </div>
-
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="handleBatchApprove" icon="el-icon-check"
-            >通过
-          </el-button>
-          <el-button type="danger" @click="handleBatchReject" icon="el-icon-close"
-            >不通过
-          </el-button>
-          <el-button @click="cancleBatchReject" icon="el-icon-circle-close">取消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-
-    <!-- 复核弹出层 -->
-
-    <el-dialog
-      v-model="reCheckDialog"
-      title="工单复核"
-      width="30%"
-      append-to-body
-      class="ztzf-dialog-mange"
-      @close="reCheckDialog = false"
-    >
-      <div class="dialog-footer">
-        <el-button type="primary" @click="reCheckConfirm(1)">人工复核</el-button>
-        <el-button type="primary" @click="reCheckConfirm(2)">无人机复核</el-button>
-      </div>
-    </el-dialog>
-  </basic-container>
-</template>
-
-<script>
-import {ALL_WORK_ORDER_TYPE_OPTIONS} from '@ztzf/constants'
-  
-import { pxToRem, pxToRemNum } from '@/utils/rem';
-import { getSmallImg, getShowImg } from '@/utils/util';
-import { ElMessageBox, ElLoading } from 'element-plus';
-import { calculateDefaultRange } from '@/utils/util';
-import { gcj02ToWgs84, wgs84ToGcj02 } from '@/utils/coordinateTransformation';
-import _ from 'lodash';
-import {
-  getList,
-  createTicket,
-  getTicketInfo,
-  flowEvent,
-  getstatusCount,
-  getStepInfo,
-  getReviewById,
-  getCreateEventJob,
-  exportTheTicket
-} from '@/api/tickets/ticket';
-import { getSFDictionaryTree } from '@/api/job/task';
-import { export_json_to_excel } from '@/utils/exportExcel';
-import geoJson from '@/assets/geoJson.json';
-import { mapGetters } from 'vuex';
-import { getAdcodeObj } from '@/utils/disposeData';
-import elTooltipCopy from '@/components/ElTooltipCopy.vue';
-import getBaseConfig from '@/buildConfig/config';
-import CreateQRcode from '@/components/CreateQRcode/CreateQRcode.vue';
-import { CircleClose } from '@element-plus/icons-vue';
-
-const { envName } = getBaseConfig();
-
-function regExp(label, name) {
-  var reg = new RegExp(label + '=([^&]*)(&|$)', 'g');
-  return name.match(reg)[0].split('=')[1];
-}
-
-export default {
-  components: { elTooltipCopy, CreateQRcode },
-  name: 'TicketPage',
-  data() {
-    return {
-      currentIndex: null, // 当前显示的数据索引
-      submitLoading: false, // 新增loading状态
-      draftLoading: false,
-      approveLoading: false,
-      rejectLoading: false,
-      dispatchLoading: false,
-      completeLoading: false,
-      finalizeLoading: false,
-      createoredit: '',
-      activeTab: 'all',
-      // tabs 只保留静态结构,不做权限判断
-      tabs: [
-        { label: '全部工单', name: 'all', value: null, count: 0 },
-        { label: '待审核', name: 'pending', value: 2, count: 0 },
-        { label: '待处理', name: 'processing', value: 0, count: 0 },
-        { label: '处理中', name: 'inProgress', value: 3, count: 0 },
-        { label: '已完成', name: 'completed', value: 4, count: 0 },
-        // { label: "已完结", name: "closed", value: 5, count: 0 },
-        { label: '我的工单', name: 'myTickets', value: null, count: 0 },
-      ],
-      filters: {
-        keyword: '',
-        department: '',
-        type: '',
-        dateRange: [],
-        status: '',
-        algorithm: '', // 新增算法筛选字段
-        isReview: '', // 添加复核状态筛选字段
-      },
-      departments: [],
-      types: [],
-      allAlgorithms: [],
-      handlers: [
-        { label: '处理人A', value: 'handlerA' },
-        { label: '处理人B', value: 'handlerB' },
-      ],
-
-      algorithms: [],
-      algorithms2: [],
-      statuses: [
-        { label: '待审核', value: '2' },
-        { label: '待处理', value: '0' },
-        { label: '处理中', value: '3' },
-        { label: '已完成', value: '4' },
-      ],
-      reviewStatuses: [
-        { label: '否', value: 0 },
-        { label: '是', value: 1 },
-      ],
-      tableData: [],
-      option: {
-        border: true,
-        stripe: false,
-        selection: true, // 添加多选功能
-        index: true, // 保留序号功能
-        indexLabel: '序号',
-        indexWidth: 60,
-        menuWidth: 150,
-        searchMenuSpan: 6,
-        viewBtn: false,
-        editBtn: false,
-        delBtn: false,
-        addBtn: false,
-        menu: true,
-        page: true,
-
-        height: 'auto',
-        calcHeight: 196,
-
-        column: [
-          // { label: "序号", prop: "id", width: 70 },
-          { label: '工单编号', prop: 'orderNumber', width: 170 },
-          { label: '工单名称', prop: 'orderName', width: 150, overHidden: true, tooltip: true },
-          { label: '所属部门', prop: 'department', overHidden: true, tooltip: true },
-          { label: '发起任务时间', prop: 'startTime', width: 160, overHidden: true },
-          { label: '关联算法', prop: 'aiType', overHidden: true, tooltip: true },
-          {
-            label: '工单类型',
-            prop: 'type',
-            width: 110,
-            overHidden: true,
-            tooltip: true,
-            type: 'select',
-            dicData: [],
-          },
-          {
-            label: '工单内容',
-            prop: 'content',
-            slot: true,
-            width: 152,
-            overHidden: true,
-          },
-          { label: '创建人', prop: 'creator', width: 120, overHidden: true },
-          { label: '处理人', prop: 'handler', width: 120, overHidden: true },
-          {
-            slot: true,
-            hide: envName === 'jiangwu' ? true : false,
-            label: '复核状态',
-            prop: 'isReview',
-            width: 90,
-          },
-          { label: '工单状态', prop: 'status', slot: true, width: 90 },
-        ],
-      },
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      dialogVisible: false,
-      detailVisible: false,
-      currentDetail: {},
-      form: {
-        name: '',
-        type: '',
-        department: '',
-        handler: '',
-        algorithm: [], // 关联算法改为数组
-        location: [], // 将存储为[经度, 纬度, 地址]格式
-        address: '',
-        photos: [],
-        content: '', // 新增字段,用于存储后端返回的 content
-      },
-      rules: {
-        name: [{ required: true, message: '请输入工单名称', trigger: 'blur' }],
-        type: [{ required: true, message: '请选择工单类型', trigger: 'change' }],
-        department: [{ required: true, message: '请选择所属部门', trigger: 'change' }],
-        handler: [{ required: true, message: '请选择处理人员', trigger: 'change' }],
-        content: [{ required: true, message: '请输入工单内容', trigger: 'blur' }],
-        algorithm: [{ required: true, message: '请选择关联算法', trigger: 'change' }],
-        location: [
-          {
-            required: true,
-            validator: (rule, value, callback) => {
-              if (!value || value.length < 2) {
-                callback(new Error('请选择位置信息'));
-              } else if (!value[0] || !value[1]) {
-                callback(new Error('请选择位置信息'));
-              } else {
-                callback();
-              }
-            },
-            trigger: 'change',
-          },
-        ],
-        photos: [
-          {
-            validator: (rule, value, callback) => {
-              if (!this.form.photos || this.form.photos.length === 0) {
-                callback(new Error('请上传工单图片'));
-              } else {
-                callback();
-              }
-            },
-            trigger: 'change',
-          },
-        ],
-      },
-      departmentUsers: {},
-      loading: false,
-      globalCounts: {},
-      mapLoaded: false,
-      isFetching: false,
-      mapParams: {
-        zoom: 15,
-        center: null, // 初始设为 null,等待动态设置
-      },
-      dispatchDepartment: '', // 新增:派发部门
-      dispatchHandler: '', // 新增:派发处理人
-      dispatchDialogVisible: false, // 新增:派发对话框可见性
-      dispatchForm: {
-        department: '',
-        handler: '',
-      }, // 新增:派发表单数据
-      dispatchRules: {
-        department: [{ required: true, message: '请选择部门', trigger: 'change' }],
-        handler: [{ required: true, message: '请选择处理人', trigger: 'change' }],
-      }, // 新增:派发表单验证规则
-      stepInfos: [], // 新增:存储步骤信息
-      fixedStatuses: ['2', '0', '3', '4'], // 固定的五个状态
-      userNameToIdMap: {}, // 新增用户名到ID的映射
-      workType: 0, // 新增:当前工单work_type
-      selections: [], // 添加选中行数据数组
-      reviewDialogVisible: false, // 新增:审核对话框可见性
-      currentReviewImage: '', // 新增:当前审核图片
-      currentImageIndex: 1, // 新增:当前图片索引
-      totalTime: '',
-      isShowInfo: false,
-
-      // 配置时间选择器默认配置
-      datePickerDefaultVal: calculateDefaultRange(),
-
-      // 复核弹窗
-      reCheckDialog: false,
-      treePropsSF: {
-        label: 'dictValue',
-        value: 'id',
-        children: 'children',
-      },
-      dictKey: '',
-      dataList: [],
-      checkedKeys: [],
-    };
-  },
-  created() {
-    this.inputMapShowDefaultCenter = null;
-
-    this.loadAMapScripts();
-    this.fetchDropdownData();
-  },
-
-  mounted() {
-    this.getAlgorithmList();
-
-    const href = this.$route.href;
-    if (this.$route?.query?.status !== undefined && this.$route?.query?.status !== null) {
-      this.filters.status = this.$route?.query?.status + '';
-      this.$router.replace({});
-    }
-
-    let curQueryParams = {};
-    let isTabProcessed = false;
-    if (href.indexOf('?') != -1 && href.split('?').length > 0) {
-      curQueryParams = href
-        .split('?')[1]
-        .split('&')
-        .reduce((pre, cur) => {
-          let newArr = cur.split('=');
-
-          pre[newArr[0]] = newArr[1];
-
-          return pre;
-        }, {});
-
-      const { orderNumber = undefined, day = undefined, tab = undefined } = curQueryParams;
-
-      // 日历传值
-      if (day) {
-        const date = new Date(day + 'T00:00:00+08:00');
-        const dateArray = [date, date];
-        const handler = {
-          get(target, prop) {
-            if (typeof prop === 'string' && /^\d+$/.test(prop)) {
-              const index = parseInt(prop);
-              const dateObj = target[index];
-              return dateObj.toDateString() + ' 00:00:00 GMT+0800 (中国标准时间)';
-            }
-            return Reflect.get(target, prop);
-          },
-        };
-
-        const proxyArray = new Proxy(dateArray, handler);
-        this.filters.dateRange = proxyArray;
-      }
-
-      if (orderNumber) {
-        this.filters.keyword = orderNumber;
-        this.$nextTick(() => {
-          this.isShowInfo = true;
-          const find = this.$store.state.tags.bsTagList.find(i => i.path === '/tickets/ticket');
-          find && (find.query = {});
-        });
-      }
-      if (tab) {
-        const isTabValid = this.filteredTabs.some(t => t.name === tab);
-        if (isTabValid) {
-          this.activeTab = tab;
-          this.handleTabChangeAfterJump();
-          isTabProcessed = true;
-          const find = this.$store.state.tags.bsTagList.find(i => i.path === '/tickets/ticket');
-          find && (find.query = {});
-        }
-      }
-    }
-
-    this.fetchTabCounts(); // 新增:初始化时获取 tab 数据
-    this.fetchTableData();
-  },
-  computed: {
-    CircleClose() {
-      return CircleClose;
-    },
-    firstRowData() {
-      return this.tableData.length > 0 ? this.tableData[0] : null;
-    },
-    availableHandlers() {
-      return this.form.department ? this.departmentUsers[this.form.department] || [] : [];
-    },
-    availableDispatchHandlers() {
-      return this.dispatchForm.department
-        ? this.departmentUsers[this.dispatchForm.department] || []
-        : [];
-    },
-    detailTableData() {
-      return [
-        {
-          label: '工单名称',
-          value: this.currentDetail.orderName,
-          editable: this.currentDetail.status === 0,
-          type: 'input',
-        },
-        {
-          label: '关键任务',
-          value: this.currentDetail.keyData,
-          editable: false,
-        },
-        {
-          label: '工单创建人',
-          value: this.currentDetail.creator,
-          editable: false,
-        },
-        {
-          label: '当前状态',
-          value: this.mapStatus(this.currentDetail.status),
-          editable: false,
-        },
-        {
-          label: '事件地址',
-          value: this.currentDetail.address,
-          editable: false,
-        },
-        {
-          label: '工单类型',
-          value: this.currentDetail.type,
-          editable: this.currentDetail.status === 0,
-          type: 'select',
-          options: this.types,
-        },
-        {
-          label: '关联算法',
-          value: this.currentDetail.aiType,
-          editable: false,
-        },
-        {
-          label: '发起单位',
-          value: this.currentDetail.department,
-          editable: false,
-        },
-        {
-          label: '发起任务时间',
-          value: this.currentDetail.startTime,
-          editable: false,
-        },
-        {
-          label: '工单内容',
-          value: this.currentDetail.content,
-          editable: this.currentDetail.status === 0,
-          type: 'textarea',
-        },
-      ];
-    },
-    detailFields() {
-      return [
-        {
-          label: '工单名称',
-          value: this.currentDetail.orderName,
-          editable: this.currentDetail.status === 0,
-          type: 'input',
-        },
-        { label: '关键任务', value: this.currentDetail.keyData, editable: false },
-        { label: '工单创建人', value: this.currentDetail.creator, editable: false },
-        { label: '当前状态', value: this.mapStatus(this.currentDetail.status), editable: false },
-        { label: '事件地址', value: this.currentDetail.address, editable: false },
-        {
-          label: '工单类型',
-          value: this.currentDetail.type,
-          editable: this.currentDetail.status === 0,
-          type: 'select',
-          options: this.types,
-        },
-        { label: '关联算法', value: this.currentDetail.aiType, editable: false },
-        { label: '发起单位', value: this.currentDetail.department, editable: false },
-        { label: '发起任务时间', value: this.currentDetail.startTime, editable: false },
-        {
-          label: '工单内容',
-          value: this.currentDetail.content,
-          editable: this.currentDetail.status === 0,
-          type: 'textarea',
-        },
-      ];
-    },
-    formattedDetailFields() {
-      const fields = [
-        { label: '工单名称', value: this.currentDetail.orderName },
-        {
-          label: '工单类型',
-          // 修改这里:使用 types 数组查找对应的 label
-          value:
-            this.types.find(t => t.value === this.currentDetail.type)?.label ||
-            this.currentDetail.type,
-        },
-        { label: '关联任务', value: this.currentDetail.job_name || '/' },
-        { label: '工单创建人', value: this.currentDetail.creator },
-        { label: '当前状态', value: this.mapStatus(this.currentDetail.status) },
-        { label: '事件地址', value: this.currentDetail.address || this.currentDetail.latAndLon }, // 包含经纬度信息
-        {
-          label: '关联算法',
-          value:
-            this.algorithms.find(t => t.value === this.currentDetail.aiType)?.label ||
-            this.currentDetail.aiType,
-        },
-        { label: '发起单位', value: this.currentDetail.department },
-        { label: '发起任务时间', value: this.currentDetail.startTime },
-        { label: '工单内容', value: this.currentDetail.content },
-      ];
-
-      // 过滤掉值为 '/' 的列
-      const filteredFields = fields.filter(field => field.value !== '/');
-      // 将字段分成两列
-      const formattedFields = [];
-      for (let i = 0; i < filteredFields.length; i += 2) {
-        formattedFields.push({
-          label1: filteredFields[i]?.label || '',
-          value1: filteredFields[i]?.value || (filteredFields[i]?.label ? '暂无数据' : ''),
-          label2: filteredFields[i + 1]?.label || '',
-          value2: filteredFields[i + 1]?.value || (filteredFields[i + 1]?.label ? '暂无数据' : ''),
-        });
-      }
-
-      return formattedFields;
-    },
-    dynamicFixedStatuses() {
-      // 直接使用接口返回的 stepInfos
-      return this.stepInfos.map(step => String(step.status));
-    },
-    ...mapGetters(['userInfo', 'permission']),
-    // 动态过滤tabs,保证isShow为true/false
-    filteredTabs() {
-      // 统一处理权限,undefined视为false
-      const tabStatus = this.permission?.tickets_tab_status === true;
-      const tabPending = this.permission?.tickets_tab_pending === true;
-      const tabMyTickets = this.permission?.tickets_tab_mytickets === true;
-      return this.tabs
-        .map(tab => {
-          if (tab.name === 'all') {
-            return { ...tab, isShow: true };
-          }
-          if (tab.name === 'pending') {
-            return { ...tab, isShow: tabPending };
-          }
-          if (['processing', 'inProgress', 'completed', 'closed'].includes(tab.name)) {
-            return { ...tab, isShow: tabStatus };
-          }
-          if (tab.name === 'myTickets') {
-            return { ...tab, isShow: tabMyTickets };
-          }
-          return { ...tab, isShow: false };
-        })
-        .filter(tab => tab.isShow);
-    },
-    permissionList() {
-      // 可根据实际后端权限key调整
-      return {
-        addBtn: this.validData(this.permission.tickets_add, false),
-        delBtn: this.validData(this.permission.tickets_delete, false),
-        exportBtn: this.validData(this.permission.tickets_export, false),
-        reviewBtn: this.validData(this.permission.tickets_review, false),
-      };
-    },
-    stepStatusList() {
-      // “我发起的工单”tab用默认流程,其它tab用接口返回的stepInfos
-      if (this.activeTab === 'myTickets') {
-        if (this.workType === 1) {
-          return ['3', '4'];
-        }
-        return this.fixedStatuses;
-      }
-
-      // 其它tab直接用接口返回的stepInfos
-      return this.stepInfos.map(step => String(step.status));
-    },
-
-    showIsReviewText() {
-      return row => {
-        if (['4'].includes(String(row.status))) return row.isReview === 1 ? '是' : '否';
-
-        return '/';
-      };
-    },
-
-    popupShowImage() {
-      return list => {
-        return list.map(item => ({
-          ...item,
-          url: getShowImg(item.url),
-        }));
-      };
-    },
-  },
-
-  methods: {
-    handleCheck(data, { checkedKeys, checkedNodes }) {
-      this.checkedKeys = checkedKeys;
-      // 获取所有选中节点的 dictKey
-      const selectedDictKeys = checkedNodes.map(node => node.dictKey).filter(Boolean);
-      this.filters.type = selectedDictKeys;
-      this.fetchTableData();
-    },
-    // 算法
-    getAlgorithmList() {
-      getSFDictionaryTree({ code: 'SF' }).then(res => {
-        if (res.data.code === 200) {
-          const result = res.data.data[0].children;
-          // 过滤第一层数据
-          const filteredData = result.map(item => {
-            // 过滤第二层数据
-            const children = item.children?.map(child => ({
-              ...child,
-              children: [], // 清空第三层数据
-            }));
-            return {
-              ...item,
-              children: children || [],
-            };
-          });
-          this.dataList = filteredData;
-        }
-      });
-    },
-
-    handleSFNodeClick(data) {
-      this.filters.type = '';
-      this.filters.algorithm = '';
-      this.filters.type = data.dictKey;
-      // 更新列表请求
-      this.fetchTableData();
-    },
-    handleClear() {
-      this.dictKey = '';
-      this.filters.algorithm = '';
-      this.filters.type = '';
-      this.fetchTableData();
-    },
-    handleCellClick(row, column) {
-      console.log(row, column.no);
-      if (column.no === 2) {
-        navigator.clipboard.writeText(row.orderNumber).then(() => {
-          this.$message.success('复制工单编号成功');
-        });
-      } else if (column.no === 3) {
-        navigator.clipboard.writeText(row.orderName).then(() => {
-          this.$message.success('复制工单名称成功');
-        });
-      } else if (column.no === 4) {
-        navigator.clipboard.writeText(row.department).then(() => {
-          this.$message.success('复制所属部门成功');
-        });
-      }
-    },
-    // 左切换
-    leftClick() {
-      if (this.tableData.length === 0) return;
-      this.currentIndex = Math.max(0, this.currentIndex - 1);
-      this.updateCurrentDetail();
-    },
-    // 右切换
-    rightClick() {
-      if (this.tableData.length === 0) return;
-      this.currentIndex = Math.min(this.tableData.length - 1, this.currentIndex + 1);
-      this.updateCurrentDetail();
-    },
-    // 更新当前详情
-    updateCurrentDetail() {
-      this.currentDetail = this.tableData[this.currentIndex];
-      this.currentDetail.mediaUrl = this.currentDetail.photo_url;
-      this.currentDetail.updatePhotoUrl = this.currentDetail.update_photo_url;
-      this.currentDetail.processingDetail = this.currentDetail.content;
-      this.handleViewDetail(this.currentDetail);
-
-      // 如果使用地图组件,需要更新地图标记
-      this.$nextTick(() => {
-        if (this.$refs.MapContainer && this.currentDetail.location) {
-          this.$refs.MapContainer.initAddEntity('point', this.currentDetail.location);
-        }
-      });
-    },
-    async handleQRCode(val) {
-      val.showQR = !val.showQR;
-    },
-    async loadAMapScripts() {
-      try {
-        const areaCode = this.userInfo.detail.areaCode;
-        const subAreaCode = areaCode ? areaCode.substring(0, 6) : '';
-        const adcodeObj = getAdcodeObj(geoJson, 'adcode', subAreaCode);
-
-        // console.log('区域代码:', subAreaCode);
-
-        // 直接从返回对象中获取正确的路径
-        const center = adcodeObj?.payload?.objects?.collection?.geometries?.[0]?.properties?.center;
-
-        if (Array.isArray(center) && center.length === 2) {
-          this.inputMapShowDefaultCenter = center;
-        } else {
-          // 如果找不到中心点,尝试使用 bbox 的中心点
-          const bbox = adcodeObj?.payload?.bbox;
-          if (Array.isArray(bbox) && bbox.length === 4) {
-            const centerX = (bbox[0] + bbox[2]) / 2;
-            const centerY = (bbox[1] + bbox[3]) / 2;
-            this.inputMapShowDefaultCenter = [centerX, centerY];
-          } else {
-            this.inputMapShowDefaultCenter = [115.861365, 28.621311];
-          }
-        }
-        this.mapParams.center = [...this.inputMapShowDefaultCenter];
-
-        this.mapLoaded = true;
-      } catch (error) {
-        this.$message.error('地图加载失败,请检查网络或API Key配置');
-      }
-    },
-    async handleBatchApprove() {
-      try {
-        if (this.selections.length === 0) {
-          this.$message.warning('没有选中的工单');
-          return;
-        }
-
-        const currentItem = this.selections[this.currentImageIndex - 1];
-        if (!currentItem) {
-          this.$message.warning('当前工单数据无效');
-          return;
-        }
-
-        await this.$confirm('确认审核通过当前工单?', '提示', {
-          confirmButtonText: '确定',
-          cancelButtonText: '取消',
-          type: 'warning',
-        });
-
-        const data = {
-          id: currentItem.id,
-          status: currentItem.status,
-          isPass: 0,
-          eventNum: currentItem.orderNumber,
-          eventName: currentItem.orderName,
-        };
-
-        const response = await flowEvent(data);
-        if (response.data.code === 0) {
-          this.$message.success('工单审核通过');
-
-          // 创建新的数组而不是修改原数组
-          const newSelections = [...this.selections];
-          newSelections.splice(this.currentImageIndex - 1, 1);
-          this.selections = newSelections;
-
-          // 修正索引并更新图片
-          if (this.selections.length > 0) {
-            if (this.currentImageIndex > this.selections.length) {
-              this.currentImageIndex = this.selections.length;
-            }
-            this.updateCurrentReviewImage();
-          } else {
-            this.reviewDialogVisible = false;
-            this.currentImageIndex = 1;
-            this.currentReviewImage = '';
-          }
-
-          // 刷新表格数据
-          this.fetchTableData();
-        } else {
-          throw new Error(response.data.msg || '审核失败');
-        }
-      } catch (error) {
-        if (error === 'cancel') return;
-        this.$message.error(error.message || '审核失败,请稍后重试');
-      }
-    },
-    async fetchDropdownData() {
-      try {
-        const response = await getTicketInfo();
-
-        const { dept_data, event_type, ai_type, info } = response.data.data;
-
-        this.departments = dept_data.map(item => ({
-          label: item.dept_name,
-          value: item.id,
-        }));
-
-        this.departmentUsers = dept_data.reduce((acc, dept) => {
-          acc[dept.id] = dept.user_data || [];
-          return acc;
-        }, {});
-
-        this.types = Object.entries(event_type).map(([key, value]) => ({
-          label: value,
-          value: key,
-        }));
-
-        const columnType = this.findObject(this.option.column, 'type');
-        columnType.dicData = this.types;
-        this.allAlgorithms = info;
-
-        console.log('工单类型', this.types);
-        console.log('关联算法', this.allAlgorithms);
-        // 确保算法数据的映射一致
-        this.algorithms =
-          ai_type?.map(item => ({
-            dict_key: item.dict_key,
-            dict_value: item.dict_value,
-            // 同时添加 label 和 value 以兼容两处使用
-            label: item.dict_value,
-            value: item.dict_key,
-          })) || [];
-
-        this.algorithms2 = _.cloneDeep(this.algorithms);
-
-        // 构建用户ID和名称的映射关系
-        this.userNameToIdMap = {};
-        dept_data.forEach(dept => {
-          (dept.user_data || []).forEach(user => {
-            this.userNameToIdMap[user.name] = user.id;
-          });
-        });
-      } catch (error) {
-        this.$message.error('加载下拉框数据失败');
-      }
-    },
-    // 工单类型变化时触发
-    handleTypeChange(typeValue) {
-      this.form.algorithm = [];
-      if (!typeValue) {
-        // 未选择类型时清空算法列表
-        this.algorithms2 = [];
-        return;
-      }
-
-      const matchedCategory = this.allAlgorithms.find(category => category.dict_key === typeValue);
-
-      if (
-        !matchedCategory ||
-        !matchedCategory.algorithms ||
-        matchedCategory.algorithms.length === 0
-      ) {
-        // 无匹配的算法时清空
-        this.algorithms2 = [];
-        this.$message.info('该工单类型暂无关联算法');
-        return;
-      }
-      this.algorithms2 = matchedCategory.algorithms.map(algo => ({
-        label: algo.dict_value,
-        value: algo.dict_key,
-        dict_key: algo.dict_key,
-        dict_value: algo.dict_value,
-      }));
-    },
-
-    async fetchTableData() {
-      if (this.isFetching) return;
-      this.isFetching = true;
-      this.loading = true;
-      try {
-        const currentTab = this.tabs.find(tab => tab.name === this.activeTab);
-        const params = {
-          // word_order_types: this.filters.type || undefined,
-          ai_types: this.filters.type || undefined, // 算法使用该字段筛选
-          status:
-            currentTab?.name === 'myTickets'
-              ? undefined
-              : this.filters.status !== ''
-              ? Number(this.filters.status)
-              : currentTab?.value,
-          event_name: this.filters.keyword || undefined,
-          dept_id: this.filters.department || undefined,
-          start_date: this.filters.dateRange?.[0]
-            ? this.formatDate(this.filters.dateRange[0])
-            : undefined,
-          end_date: this.filters.dateRange?.[1]
-            ? this.formatDate(this.filters.dateRange[1]).replace('00:00:00', '23:59:59')
-            : undefined,
-          current: Number(this.page.currentPage), // 使用当前页码
-          size: Number(this.page.pageSize), // 使用每页条数
-          ai_type: this.filters.algorithm || undefined, // 添加算法参数
-          // 添加 is_draft 参数,仅在"我发起的"标签页时设置为1
-          is_draft: currentTab?.name === 'myTickets' ? 1 : undefined,
-
-          user_id: currentTab?.name === 'myTickets' ? this.userInfo.user_id : undefined,
-          is_review: this.filters.isReview === '' ? undefined : this.filters.isReview, // 添加复核状态查询参数
-          source:1  ,//数据来源
-		      work_types: ALL_WORK_ORDER_TYPE_OPTIONS
-       };
-
-        const response = await getList(params);
-        if (!response?.data?.data?.records) {
-          throw new Error('接口返回数据格式不正确');
-        }
-
-        const { total, records } = response.data.data;
-        let filteredRecords = records;
-
-        // 如果是"我发起的"tab,过滤数据
-        // if (currentTab?.name === 'myTickets') {
-        //   filteredRecords = records.filter(item =>
-        //     String(item.create_user_id) === String(item.user_id)
-        //   );
-        // }
-
-        this.tableData = filteredRecords.map(item => {
-          const longitude = Number(item.longitude) || 0;
-          const latitude = Number(item.latitude) || 0;
-          return {
-            id: item.id,
-            orderNumber: item.event_num, // 修改这里:优先使用 event_num
-            orderName: item.event_name,
-            department:
-              this.departments.find(d => d.value === item.dept_id)?.label || item.dept_name,
-            startTime: item.job_create_time || '/',
-            aiType: item.ai_types,
-            content: item.content, // 将后端返回的 content 映射为 content
-            type: item.work_order_type_dict_key,
-            keyData:
-              !isNaN(longitude) && !isNaN(latitude)
-                ? `${longitude.toFixed(6)}, ${latitude.toFixed(6)}`
-                : '未知位置',
-            address: item.address,
-            creator: item.event_num?.slice(0, 2) === 'AI' ? '智飞agent' : item.create_user,
-            handler: item.update_user || '未分配',
-            status: Number(item.status || 0),
-            // 保存原始字段
-            photo_url: item.photo_url || '', // 保存原始 photo_url
-            video_url: item.video_url || '', // 保存原始 video_url
-            location: !isNaN(longitude) && !isNaN(latitude) ? [longitude, latitude] : null,
-            processing_details: item.processing_details || '', // 添加处理详情字段
-            update_photo_url: item.update_photo_url || '', // 添加处理图片字段
-            work_type: item.work_type !== undefined ? Number(item.work_type) : 0, // 保留work_type字段并转为数字
-            job_name: item.job_name || '',
-            job_create_time: item.job_create_time || '',
-            isReview: item.is_review, // 添加复核状态字段映射
-
-
-          };
-        });
-
-        // 更新总数显示
-        this.page.total = total || 0;
-
-        // 是否弹出详情页
-        if (this.isShowInfo) {
-          this.handleViewDetail(this.firstRowData);
-          this.isShowInfo = false; // 生效一次
-        }
-        await this.fetchTabCounts();
-      } catch (error) {
-        this.$message.error(error.message || '获取数据失败');
-        this.tableData = [];
-        this.page.total = 0;
-      } finally {
-        this.loading = false;
-        this.isFetching = false;
-      }
-    },
-
-    async submitForm() {
-      if (this.submitLoading) return; // 防止重复提交
-      this.submitLoading = true;
-      try {
-        // 提交时需要完整验证
-        await this.$refs.form.validate();
-
-        // 验证位置信息
-        if (!this.form.location || this.form.location.length < 2) {
-          this.$message.warning('请在地图上选择位置');
-          return;
-        }
-
-        // 修改图片验证逻辑
-        if (!this.form.photos || this.form.photos.length === 0) {
-          this.$message.warning('请上传工单图片');
-          return;
-        }
-
-        let [lng, lat] = this.disposeLocation(true, this.form);
-
-        const submitData = {
-          eventName: this.form.name,
-          content: this.form.content,
-          workType: '1',
-          longitude: lng,
-          latitude: lat,
-          address: this.form.address,
-          workOrderTypeDictKey: this.form.type,
-          aiType: Array.isArray(this.form.algorithm) ? this.form.algorithm : [this.form.algorithm], // 传数组
-          updateUser: this.form.handler,
-          createDept: this.form.department,
-          isDraft: 0,
-        };
-
-        if (this.form.id) {
-          submitData.id = this.form.id;
-        }
-
-        // 修改获取文件的逻辑
-        let file = null;
-        const photoInfo = this.form.photos[0];
-
-        if (photoInfo.raw) {
-          // 如果有新上传的文件,使用新文件
-          file = photoInfo.raw;
-        } else if (photoInfo.existingUrl) {
-          // 如果是已存在的图片,将URL添加到提交数据中
-          submitData.photoUrl = photoInfo.existingUrl;
-        } else {
-          this.$message.warning('图片文件无效,请重新上传');
-          return;
-        }
-
-        const response = await createTicket(submitData, file);
-        if (response.data.code === 0) {
-          this.$message.success('工单创建成功');
-          this.dialogVisible = false;
-          this.fetchTableData();
-        } else {
-          throw new Error(response.data.msg || '创建失败');
-        }
-      } catch (error) {
-        if (error.message.includes('验证未通过')) {
-          this.$message.warning('请填写完整的工单信息');
-        } else {
-          this.$message.error(error.message || '工单创建失败,请稍后重试');
-        }
-      } finally {
-        this.submitLoading = false;
-      }
-    },
-
-    async saveDraft() {
-      if (this.draftLoading) return; // 防止重复提交
-      this.draftLoading = true;
-      try {
-        let handlerValue = this.form.handler;
-        if (!handlerValue || handlerValue === '未分配') {
-          handlerValue = undefined;
-        }
-
-        // 验证位置信息
-        if (
-          !this.form.location ||
-          this.form.location.length < 2 ||
-          !this.form.location[0] ||
-          !this.form.location[1]
-        ) {
-          this.$message.warning('请在地图上选择位置');
-          return;
-        }
-
-        let [lng, lat] = this.disposeLocation(true, this.form);
-
-        const submitData = {
-          id: this.form.id,
-          eventName: this.form.name || undefined,
-          content: this.form.content || undefined,
-          workType: '1',
-          longitude: lng,
-          latitude: lat,
-          address: this.form.address || undefined,
-          workOrderTypeDictKey: this.form.type || undefined,
-          aiType:
-            this.form.algorithm && this.form.algorithm.length > 0 ? this.form.algorithm : undefined, // 传数组
-          updateUser: handlerValue,
-          createDept: this.form.department || undefined,
-          isDraft: 1,
-        };
-
-        // 草稿时也至少需要工单名称
-        if (!submitData.eventName) {
-          this.$message.warning('请输入工单名称');
-          return;
-        }
-
-        // 过滤掉所有 undefined 的字段
-        Object.keys(submitData).forEach(
-          key => submitData[key] === undefined && delete submitData[key]
-        );
-
-        let file = null;
-        if (this.form.photos && this.form.photos.length > 0) {
-          file = this.form.photos[0].raw;
-        }
-
-        const response = await createTicket(submitData, file);
-        if (response.data.code === 0) {
-          this.$message.success('草稿保存成功');
-          this.dialogVisible = false;
-          (this.form = {
-            name: '',
-            type: '',
-            department: '',
-            handler: '',
-            algorithm: [], // 关联算法改为数组
-            location: [], // 将存储为[经度, 纬度, 地址]格式
-            address: '',
-            photos: [],
-            content: '', // 新增字段,用于存储后端返回的 content
-          }),
-            this.fetchTableData();
-        } else {
-          throw new Error(response.data.msg || '保存失败');
-        }
-      } catch (error) {
-        this.$message.error(error.message || '保存草稿失败,请稍后重试');
-      } finally {
-        this.draftLoading = false;
-      }
-    },
-    handleCancel() {
-      this.resetForm();
-      this.dialogVisible = false;
-    },
-    handleLocationChange(val) {
-      let locationValue = val.value;
-      if (locationValue && locationValue.length >= 2) {
-        // 兼容第三项为地址
-        const [lng, lat] = gcj02ToWgs84(locationValue[0], locationValue[1]);
-        this.form.location = [Number(lng), Number(lat), locationValue[2] || ''];
-        this.form.address = locationValue[2] || '';
-      } else {
-        this.form.location = [];
-        this.form.address = '';
-      }
-    },
-
-    formatDate(date) {
-      if (!date) return undefined;
-      const d = new Date(date);
-      return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(
-        d.getDate()
-      ).padStart(2, '0')} 00:00:00`;
-    },
-
-    mapStatus(status) {
-      const statusTextMap = {
-        '-1': '草稿', // 添加草稿状态
-        2: '待审核',
-        0: '待处理',
-        3: '处理中',
-        4: '已完成',
-      };
-      return statusTextMap[status] || '未知状态';
-    },
-
-    getStatusTagType(status) {
-      // 草稿不加颜色
-      if (status === -1 || status === '-1') return '';
-      // 状态颜色映射
-      const colorMap = {
-        0: '#FF7411', // 待处理-淡红
-        3: '#FFC300', // 处理中-更淡红
-        2: '#FF472F', // 待审核-橙色
-        4: '#0291A1', // 已完成-淡蓝
-      };
-      return colorMap[String(status)] || '';
-    },
-
-    async fetchTabCounts() {
-      try {
-        // 判断是否有部门筛选
-        let params = {};
-        if (this.filters.department) {
-          params.deptId = this.filters.department;
-        }
-        const response = await getstatusCount(params);
-        const { statusCount, totalCount, userCount } = response.data.data;
-        this.tabs.forEach(tab => {
-          if (tab.name === 'all') {
-            tab.count = totalCount || 0; // 总工单数
-          } else if (tab.name === 'myTickets') {
-            tab.count = userCount || 0; // 我发起的工单数
-          } else {
-            tab.count = statusCount[String(tab.value)] || 0; // 根据状态值映射
-          }
-        });
-      } catch (error) {
-        this.$message.error('获取 tab 数据失败');
-      }
-    },
-
-    handleTabChange(tab) {
-      this.activeTab = tab.props?.name || tab.name;
-      const isReview = this.findObject(this.option.column, 'isReview');
-      // 根据条件切换显隐
-      isReview.hide = !['all', 'completed', 'myTickets'].includes(this.activeTab);
-
-      this.handleReset();
-      this.page.currentPage = 1;
-      this.fetchTableData();
-      this.fetchTabCounts(); // 切换 tab 时重新获取数据
-    },
-    //新增 跳转后触发的Tab切换
-    handleTabChangeAfterJump() {
-      const isReview = this.findObject(this.option.column, 'isReview');
-      isReview.hide = !['all', 'completed', 'myTickets'].includes(this.activeTab);
-      this.handleReset();
-      this.page.currentPage = 1;
-      this.fetchTableData();
-      this.fetchTabCounts();
-    },
-    handleSearch() {
-      this.page.currentPage = 1;
-      this.fetchTableData();
-      this.fetchTabCounts();
-    },
-
-    handleReset() {
-      this.dictKey = '';
-      this.filters = {
-        keyword: '',
-        department: '',
-        type: '',
-        dateRange: [],
-        status: '',
-        algorithm: '', // 重置时清空算法筛选
-        isReview: '', // 重置时清空复核状态
-      };
-      this.page.currentPage = 1;
-      this.$router.replace({}); //清除url参数
-      this.fetchTableData();
-    },
-    handleKeyWords() {
-      this.$router.replace({}); //清除url参数
-    },
-
-    async handleCurrentChange(val) {
-      // 先更新页码
-      this.page.currentPage = val;
-      // 等待 DOM 更新后再请求数据
-      await this.$nextTick();
-      await this.fetchTableData();
-    },
-
-    async sizeChange(val) {
-      this.page.pageSize = val;
-      this.page.currentPage = 1; // 重置到第一页
-      await this.$nextTick();
-      await this.fetchTableData();
-    },
-
-    handleAdd() {
-      this.createoredit = 1;
-      this.dialogVisible = true;
-      this.mapParams.center = [...this.inputMapShowDefaultCenter];
-      this.form.location = [];
-    },
-
-    resetForm() {
-      this.form = {
-        name: '',
-        type: '',
-        department: '',
-        handler: '',
-        algorithm: [], // 关联算法改为数组
-        location: [], // 将存储为[经度, 纬度, 地址]格式
-        address: '',
-        content: '',
-        photos: [],
-        content: '', // 新增字段,用于存储后端返回的 content
-      };
-      if (this.$refs.form) {
-        this.$refs.form.resetFields();
-      }
-    },
-
-    formatLocation(location) {
-      if (!Array.isArray(location)) {
-        return '未知位置';
-      }
-      return `${location[0].toFixed(6)}, ${location[1].toFixed(6)}`;
-    },
-
-    async handleViewDetail(row) {
-      // 找到当前行在tableData中的索引
-      this.currentIndex = this.tableData.findIndex(item => item.id === row.id);
-      // 先设置workType,直接从row读取
-      this.workType = row.work_type !== undefined ? Number(row.work_type) : 0;
-
-      // 重置上传组件的文件列表
-      this.$nextTick(() => {
-        if (this.$refs.MapContainer && this.$refs.MapContainer.initAddEntity) {
-          this.$refs.MapContainer.initAddEntity('point', this.currentDetail.location);
-        }
-      });
-
-      const detailData = {
-        ...row,
-        processingDetail: row.processing_details || '',
-        mediaUrl: row.photo_url || row.video_url || '',
-        updatePhotoUrl: row.update_photo_url || '',
-        photos: [],
-        job_name: row.job_name || '', // 新增
-      };
-
-      let stepArr = [];
-      try {
-        const stepResponse = await getStepInfo(row.orderNumber);
-        const steps = Array.isArray(stepResponse.data.data)
-          ? stepResponse.data.data
-          : stepResponse.data.data?.steps || [];
-        const finishedStep = steps.find(s => String(s.status) === '4');
-        this.totalTime = finishedStep && finishedStep.total_time ? finishedStep.total_time : '';
-        if (this.activeTab !== 'myTickets') {
-          this.stepInfos = steps.map(step => ({
-            status: String(step.status),
-            name: step.name,
-            time: step.time,
-            create_time: step.create_time,
-          }));
-        } else {
-          const statusArr = this.workType === 1 ? ['3', '4'] : this.fixedStatuses;
-          this.stepInfos = statusArr.map(status => {
-            const step = steps.find(s => String(s.status) === String(status));
-            return {
-              status,
-              name: step ? step.name : '',
-              time: step ? step.time : null,
-              create_time: step ? step.create_time : null,
-            };
-          });
-        }
-        this.currentDetail.status = row.status;
-      } catch (error) {
-        if (this.activeTab === 'myTickets') {
-          const statusArr = this.workType === 1 ? ['3', '4'] : this.fixedStatuses;
-          this.stepInfos = statusArr.map(status => ({
-            status,
-            name: status === row.status ? row.handler || '未分配' : '未处理',
-            time: status === row.status ? row.startTime || '未知时间' : null,
-          }));
-        } else {
-          this.stepInfos = [];
-        }
-      }
-      console.log(detailData, 'detailDatadetailDatadetailData');
-      this.currentDetail = {
-        ...detailData,
-        // address: null,
-        showQR: false,
-        latAndLon: _.round(detailData.location[0], 6) + ',' + _.round(detailData.location[1], 6),
-      };
-
-      console.log('this.currentDetail', this.currentDetail);
-
-      this.detailVisible = true;
-      this.handleTypeChange(this.currentDetail.type);
-
-
-      this.$nextTick(() => {
-        if (this.$refs.MapContainer && this.$refs.MapContainer.initAddEntity) {
-          this.$refs.MapContainer.initAddEntity('point', this.currentDetail.location);
-        }
-      });
-    },
-
-    getStepHandler(status) {
-      const step = this.stepInfos.find(step => step.status === status);
-      return step ? step.name : '';
-    },
-
-    getStepTime(status) {
-      const step = this.stepInfos.find(step => step.status === status);
-      // 如果 step 不存在或 step.time 为 0,返回 false
-      return step && step.time && step.time !== '0' ? step.time : false;
-    },
-    getStepCreateTime(status) {
-      const step = this.stepInfos.find(step => step.status === status);
-      return step ? step.create_time : null;
-    },
-    getActiveStep() {
-      // 步骤索引适配
-      const arr = this.stepStatusList;
-      const index = arr.indexOf(String(this.currentDetail.status));
-      return index !== -1 ? index + 2 : 1;
-    },
-
-    openMap() {
-      const areaCode = this.userInfo.detail.areaCode;
-      const subAreaCode = areaCode ? areaCode.substring(0, 6) : '';
-      getAdcodeObj(geoJson, 'adcode', subAreaCode);
-      this.$message.info('地图选址功能暂未实现');
-    },
-
-    handlePreview(file) {
-      this.$message.info(`预览图片:${file.name}`);
-    },
-
-    handleRemove(file) {
-      this.$message.info(`移除图片:${file.name}`);
-    },
-
-    refreshChange() {
-      if (this.isFetching) return;
-      this.fetchTableData();
-    },
-
-    onLoad() {
-      if (this.isFetching) return;
-      this.fetchTableData();
-    },
-
-    async exportData() {
-      try {
-        this.loading = true;
-        let exportData = [];
-
-        // 如果有选中的数据,则导出选中的数据
-        if (this.selections.length > 0) {
-          exportData = this.selections.map(item => this.formatExportItem(item));
-        } else {
-          // 没有选中数据时,导出当前页面的数据
-          exportData = this.tableData.map(item => this.formatExportItem(item));
-        }
-
-        if (exportData.length === 0) {
-          this.$message.warning('没有数据可供导出');
-          return;
-        }
-
-        const headers = [
-          '工单编号',
-          '工单名称',
-          '所属部门',
-          '发起时间',
-          '关联算法',
-          '工单内容',
-          '工单类型',
-          '经纬度',
-          '创建人',
-          '处理人',
-          '工单状态',
-        ];
-
-        export_json_to_excel(headers, exportData, '工单数据');
-        this.$message.success('数据导出成功');
-      } catch (error) {
-        // console.error('导出失败:', error);
-        this.$message.error(error.message || '导出失败,请稍后重试');
-      } finally {
-        this.loading = false;
-      }
-    },
-
-    formatExportItem(item) {
-      const longitude = Number(item.longitude) || Number(item.location?.[0]) || 0;
-      const latitude = Number(item.latitude) || Number(item.location?.[1]) || 0;
-
-      return {
-        工单编号: item.orderNumber || item.event_num || '',
-        工单名称: item.orderName || item.event_name || '',
-        所属部门: item.department || item.dept_name || '',
-        发起时间: item.startTime || item.create_time || '',
-        关联算法: item.aiType || item.ai_types || '',
-        工单内容: item.address || item.content || '',
-        工单类型:
-          this.types.find(t => t.value === (item.type || item.work_order_type_dict_key))?.label ||
-          '',
-        经纬度:
-          !isNaN(longitude) && !isNaN(latitude)
-            ? `${longitude.toFixed(6)}, ${latitude.toFixed(6)}`
-            : '',
-        创建人: item.creator || item.create_user || '',
-        处理人: item.handler || item.update_user || '',
-        工单状态: this.mapStatus(Number(item.status || 0)),
-      };
-    },
-
-    handleDepartmentChange(deptId) {
-      this.form.handler = '';
-    },
-
-    handleDispatchDepartmentChange(deptId) {
-      this.dispatchForm.handler = ''; // 清空处理人选择
-    },
-
-    // 文件改变时的钩子
-    handleFileChange(file, fileList) {
-      // 保持最新的文件列表
-      this.form.photos = fileList.map(item => ({
-        ...item,
-        existingUrl: item.url && !item.raw ? item.url : null, // 标记已存在的图片URL
-      }));
-      this.currentDetail.photos = this.form.photos;
-    },
-
-    // 文件移除时的钩子
-    handleUploadRemove(file, fileList) {
-      this.form.photos = fileList;
-      this.currentDetail.photos = fileList;
-    },
-
-    // 上传前的验证
-    beforeUpload(file) {
-      const isImage = file.type.includes('image');
-      const isLt5M = file.size / 1024 / 1024 < 5;
-
-      if (!isImage) {
-        this.$message.error('只能上传图片文件!');
-        return false;
-      }
-      if (!isLt5M) {
-        this.$message.error('图片大小不能超过5MB!');
-        return false;
-      }
-      return true;
-    },
-
-    async approveTicket() {
-      if (this.approveLoading) return;
-      this.approveLoading = true;
-      try {
-        const data = {
-          id: this.currentDetail.id,
-          status: this.currentDetail.status,
-          isPass: 0, // 0 表示通过
-          eventNum: this.currentDetail.orderNumber,
-        };
-
-        const file = this.currentDetail.file || null; // 如果没有文件,则为 null
-
-        const response = await flowEvent(data, file);
-        if (response.data.code === 0) {
-          this.$message.success('工单已通过');
-          this.detailVisible = false;
-          this.fetchTableData();
-        } else {
-          throw new Error(response.data.msg || '操作失败');
-        }
-      } catch (error) {
-        this.$message.error(error.message || '操作失败,请稍后重试');
-      } finally {
-        this.approveLoading = false;
-      }
-    },
-    async rejectTicket() {
-      if (this.rejectLoading) return;
-      this.rejectLoading = true;
-      try {
-        const data = {
-          id: this.currentDetail.id,
-          status: this.currentDetail.status,
-          isPass: 1, // 1 表示不通过
-        };
-
-        const response = await flowEvent(data);
-        if (response.data.code === 0) {
-          this.$message.success('工单未通过');
-          this.detailVisible = false;
-          this.fetchTableData();
-        } else {
-          throw new Error(response.data.msg || '操作失败');
-        }
-      } catch (error) {
-        this.$message.error(error.message || '操作失败,请稍后重试');
-      } finally {
-        this.rejectLoading = false;
-      }
-    },
-    async submitProcessing() {
-      if (this.currentDetail.status !== 3) {
-        this.$message.warning('只有处理中状态的工单可以提交处理详情');
-        return;
-      }
-
-      try {
-        const data = {
-          id: this.currentDetail.id, // 当前工单 ID
-          status: this.currentDetail.status, // 当前工单状态
-          processing_details: this.currentDetail.processingDetail, // 事件处理详情
-        };
-
-        // 如果有图片,添加 file 参数
-        const file = this.currentDetail.photos?.[0]?.raw || null;
-
-        const response = await flowEvent(data, file);
-        if (response.data.code === 0) {
-          this.$message.success('处理详情提交成功');
-          this.detailVisible = false;
-          this.fetchTableData();
-        } else {
-          throw new Error(response.data.msg || '提交失败');
-        }
-      } catch (error) {
-        console.error('处理详情提交失败:', error);
-        this.$message.error(error.message || '提交失败,请稍后重试');
-      }
-    },
-    markAsCompleted() {
-      this.$message.success('工单已标记为完成');
-    },
-    async completeTicket() {
-      if (this.completeLoading) return;
-      this.completeLoading = true;
-      try {
-        if (!this.currentDetail.processingDetail) {
-          this.$message.warning('请先填写事件处理详情');
-          return;
-        }
-        // 检查图片上传
-        if (!this.currentDetail.photos || this.currentDetail.photos.length === 0) {
-          this.$message.warning('请选择上传图片');
-          this.completeLoading = false;
-          return;
-        }
-
-        const data = {
-          id: this.currentDetail.id,
-          status: this.currentDetail.status,
-          processingDetails: this.currentDetail.processingDetail,
-          eventNum: this.currentDetail.orderNumber,
-        };
-
-        // 如果有上传的图片,添加到请求中
-        const file = this.currentDetail.photos?.[0]?.raw || null;
-
-        const response = await flowEvent(data, file);
-
-        if (response.data.code === 0) {
-          this.$message.success('工单已完成');
-          this.detailVisible = false;
-          this.fetchTableData(); // 刷新列表数据
-        } else {
-          throw new Error(response.data.msg || '操作失败');
-        }
-      } catch (error) {
-        console.error('完成工单失败:', error);
-        this.$message.error(error.message || '操作失败,请稍后重试');
-      } finally {
-        this.completeLoading = false;
-      }
-    },
-    async approveAndDispatch() {
-      if (this.dispatchLoading) return;
-
-      // 添加必填项检查
-      if (!this.currentDetail.orderName || !this.currentDetail.orderName.trim()) {
-        this.$message.warning('请填写工单名称');
-        return;
-      }
-      if (!this.currentDetail.aiType) {
-        this.$message.warning('请选择关联算法');
-        return;
-      }
-      if (!this.currentDetail.content || !this.currentDetail.content.trim()) {
-        this.$message.warning('请填写工单内容');
-        return;
-      }
-
-      // 通过验证后,打开派发对话框
-      this.dispatchDialogVisible = true;
-
-      console.log('受理', this.currentDetail);
-    },
-    hasProcessingBtnPermission() {
-      // undefined 或 false 都返回 false,只有 true 返回 true
-      //  console.log('权限检查:', this.permission.tickets_processing_btn)
-      return this.permission && this.permission.tickets_processing_btn === true;
-    },
-    hasProcessedAndOverBtnPermission() {
-      // undefined 或 false 都返回 false,只有 true 返回 true
-      //console.log('权限检查:', this.permission)
-      return this.permission && this.permission.tickets_view_processedAndOver === true;
-    },
-    hasReviewBtnPermission() {
-      // undefined 或 false 都返回 false,只有 true 返回 true
-      // console.log('权限检查:', this.permission)
-      return this.permission && this.permission.tickets_review_btn === true;
-    },
-
-    async submitDispatch() {
-      if (this.dispatchLoading) return;
-      if (!this.currentDetail.orderName || !this.currentDetail.orderName.trim()) {
-        this.$message.warning('请填写工单名称');
-        return;
-      }
-      if (!this.currentDetail.type) {
-        this.$message.warning('请选择工单类型');
-        return;
-      }
-      if (!this.currentDetail.content || !this.currentDetail.content.trim()) {
-        this.$message.warning('请填写工单内容');
-        return;
-      }
-      if (!this.dispatchForm.department) {
-        this.$message.warning('请选择部门');
-        return;
-      }
-      if (!this.dispatchForm.handler) {
-        this.$message.warning('请选择处理人');
-        return;
-      }
-      this.dispatchLoading = true;
-      console.log('派发成功', this.currentDetail);
-      const isValue = this.algorithms.some(item => item.value === this.currentDetail.aiType);
-      let resultValue;
-
-      if (isValue) {
-        // 如果已经是value,直接使用
-        resultValue = this.currentDetail.aiType;
-      } else {
-        // 否则查找对应的value
-        const matched = this.algorithms.find(
-          item => item.dict_value === this.currentDetail.aiType ||
-                  item.label === this.currentDetail.aiType
-        );
-        resultValue = matched ? matched.value : null;
-      }
-
-// console.log('resultValue',resultValue);
-      this.$refs.dispatchForm.validate(async valid => {
-        if (valid) {
-          try {
-            const data = {
-              id: this.currentDetail.id,
-              status: this.currentDetail.status,
-              isPass: 0, // 0 表示通过
-              eventName: this.currentDetail.orderName, // 工单名称
-              eventNum: this.currentDetail.orderNumber,
-              workOrderTypeDictKey: this.currentDetail.type, // 直接使用原始的 dict_key
-              content: this.currentDetail.content, // 使用 content 替代原来的 remark
-              createDept: this.dispatchForm.department, // 派发部门 ID
-              updateUser: this.dispatchForm.handler, // 处理人 ID
-              aiType:resultValue,
-            };
-            console.log('派发', data);
-
-            const file = this.currentDetail.file || null; // 如果没有文件,则为 null
-
-            const response = await flowEvent(data, file);
-            if (response.data.code === 0) {
-              this.$message.success('工单已成功派发');
-              this.dispatchDialogVisible = false;
-              this.detailVisible = false;
-              this.fetchTableData();
-            } else {
-              throw new Error(response.data.msg || '派发失败');
-            }
-          } catch (error) {
-            console.error('派发失败:', error);
-            this.$message.error(error.message || '派发失败,请稍后重试');
-          } finally {
-            this.dispatchLoading = false;
-          }
-        } else {
-          this.dispatchLoading = false;
-        }
-      });
-    },
-    async finalizeTicket() {
-      if (this.finalizeLoading) return;
-      this.finalizeLoading = true;
-      try {
-        // 检查是否上传了图片
-        if (!this.currentDetail.photos || !this.currentDetail.photos.length) {
-          this.$message.warning('请上传事件处理照片,或飞行任务结束核验工单是否完结');
-          return;
-        }
-
-        const data = {
-          id: this.currentDetail.id,
-          status: this.currentDetail.status,
-          eventNum: this.currentDetail.orderNumber,
-        };
-
-        const file = this.currentDetail.photos[0].raw;
-
-        const response = await flowEvent(data, file);
-
-        if (response.data.code === 0) {
-          this.$message.success('工单已完结');
-          this.detailVisible = false;
-          this.fetchTableData();
-        } else {
-          throw new Error(response.data.msg || '操作失败');
-        }
-      } catch (error) {
-        console.error('完结工单失败:', error);
-        this.$message.error(error.message || '操作失败,请稍后重试');
-      } finally {
-        this.finalizeLoading = false;
-      }
-    },
-
-    // 添加编辑方法
-    handleEdit(row) {
-      this.createoredit = 2;
-      console.log('编辑原始数据:', row);
-
-      // 尝试从row.dept_id或通过部门名称查找对应的部门ID
-      let deptId = row.dept_id; // 优先使用原始数据中的dept_id
-
-      // 如果没有dept_id,则通过部门名称查找
-      if (!deptId) {
-        // 输出所有可用的部门数据用于调试
-        console.log('可用部门列表:', this.departments);
-        console.log('当前部门名称:', row.department);
-
-        const deptInfo = this.departments.find(
-          dept => dept.label && dept.label.trim() === row.department.trim()
-        );
-        deptId = deptInfo?.value;
-      }
-
-      // 获取工单类型值 - 从types中找到匹配的值
-      const typeValue =
-        this.types.find(t => t.value === row.type)?.value || row.work_order_type_dict_key;
-      // 获取处理人ID - 使用userNameToIdMap映射
-      const handlerId = this.userNameToIdMap[row.handler] || row.handler;
-
-      console.log('数据映射:', {
-        部门名称: row.department,
-        找到的部门ID: deptId,
-        原始处理人: row.handler,
-        处理人ID: handlerId,
-        原始工单类型: row.type,
-        映射后类型值: typeValue,
-      });
-
-      // 修改算法数组的处理逻辑
-      let algorithmArr = [];
-      if (Array.isArray(row.aiType)) {
-        algorithmArr = row.aiType;
-      } else if (typeof row.aiType === 'string' && row.aiType) {
-        // 首先尝试将字符串按照逗号或顿号分割
-        algorithmArr = row.aiType.split(/[,、]/).map(item => item.trim());
-      }
-
-      // 确保算法值与选项匹配
-      algorithmArr = algorithmArr
-        .map(item => {
-          // 如果是字符串值,尝试找到对应的 dict_key
-          if (typeof item === 'string') {
-            const matchedAlgorithm = this.algorithms.find(
-              algo => algo.dict_value === item || algo.dict_key === item
-            );
-            return matchedAlgorithm ? matchedAlgorithm.dict_key : item;
-          }
-          return item;
-        })
-        .filter(Boolean); // 过滤掉无效值
-
-      console.log('算法处理:', {
-        原始值: row.aiType,
-        分割后: algorithmArr,
-      });
-
-      this.form = {
-        id: row.id,
-        name: row.orderName,
-        type: typeValue,
-        department: deptId,
-        handler: handlerId,
-        algorithm: algorithmArr,
-        location:
-          Array.isArray(row.location) && row.location.length >= 2
-            ? [Number(row.location[0]), Number(row.location[1])]
-            : [],
-        address: row.address || '',
-        content: row.content,
-        photos: [],
-      };
-
-      let curLocation = [];
-
-      if (Array.isArray(row.location) && row.location.length >= 2) {
-        let [lng, lat] = this.disposeLocation(false, row);
-
-        curLocation = [lng, lat, row.location[2] || row.address || ''];
-      }
-
-      this.form.location = curLocation;
-      this.form.address = this.form.location[2] || '';
-      // 设置地图中心点
-      if (Array.isArray(this.form.location) && this.form.location.length >= 2) {
-        this.mapParams.center = [Number(this.form.location[0]), Number(this.form.location[1])];
-      } else {
-        this.mapParams.center = [...this.inputMapShowDefaultCenter];
-      }
-      // 如果有图片,添加到表单中
-      if (row.photo_url) {
-        // 创建一个带有必要信息的文件对象
-        this.form.photos = [
-          {
-            name: 'existing-photo.jpg', // 添加默认扩展名
-            url: row.photo_url, // 用于预览的URL
-            status: 'success', // 标记为已上传成功
-            raw: null, // 初始化为null
-            existingUrl: row.photo_url, // 保存原始URL,用于区分是否为已存在的图片
-          },
-        ];
-      }
-
-      // 调试输出
-      console.log('编辑表单数据:', {
-        原始算法值: row.aiType,
-        处理后算法值: algorithmArr,
-        表单数据: this.form,
-      });
-
-      this.dialogVisible = true;
-    },
-
-    // 添加删除方法
-    handleDelete(row) {
-      this.$confirm('确认删除该工单?', '提示', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(async () => {
-          try {
-            const response = await flowEvent({
-              id: row.id,
-              status: 0,
-              isDelete: 1,
-            });
-
-            if (response.data.code === 0) {
-              this.$message.success('删除成功');
-              this.fetchTableData();
-            } else {
-              throw new Error(response.data.msg || '删除失败');
-            }
-          } catch (error) {
-            console.error('删除失败:', error);
-            this.$message.error(error.message || '删除失败,请稍后重试');
-          }
-        })
-        .catch(() => {});
-    },
-
-    // 添加选择变化处理方法
-    handleSelectionChange(selection) {
-      this.selections = selection;
-      console.log('已选择的行:', selection);
-    },
-
-    // 添加全选方法
-    handleSelectAll(val) {
-      this.$refs.avueCrud.toggleSelection(val);
-    },
-
-    // 添加单行选择方法
-    handleSelect(selection, row) {
-      console.log('选中行变化:', selection, row);
-    },
-
-    // 如果需要手动选中某些行
-    setSelection(rows) {
-      this.$nextTick(() => {
-        rows.forEach(row => {
-          this.$refs.avueCrud.toggleSelection(row, true);
-        });
-      });
-    },
-
-    // 清空选择
-    clearSelection() {
-      this.$refs.avueCrud.clearSelection();
-    },
-
-    // 打开审核对话框
-    openReviewDialog() {
-      if (this.selections.length === 0) {
-        this.$message.warning('请先选择要审核的工单');
-        return;
-      }
-      this.currentImageIndex = 1;
-      this.updateCurrentReviewImage();
-      this.reviewDialogVisible = true;
-    },
-
-    // 更新当前审核图片
-    updateCurrentReviewImage() {
-      // 修正索引范围
-      if (!this.selections || this.selections.length === 0) {
-        this.currentReviewImage = '';
-        this.currentImageIndex = 1;
-        return;
-      }
-      // 如果当前索引超出范围,自动回退到最后一张
-      if (this.currentImageIndex > this.selections.length) {
-        this.currentImageIndex = this.selections.length;
-      }
-      if (this.currentImageIndex < 1) {
-        this.currentImageIndex = 1;
-      }
-      const index = this.currentImageIndex - 1;
-      if (index >= 0 && index < this.selections.length) {
-        const currentItem = this.selections[index];
-        this.currentReviewImage = currentItem.photo_url || '';
-      } else {
-        this.currentReviewImage = '';
-      }
-    },
-
-    // 处理图片分页变化
-    handleImagePageChange(page) {
-      if (page > 0 && page <= this.selections.length) {
-        this.currentImageIndex = page;
-        this.updateCurrentReviewImage();
-      }
-    },
-
-    // 批量审核通过
-    async handleBatchApprove() {
-      try {
-        if (this.selections.length === 0) {
-          this.$message.warning('没有选中的工单');
-          return;
-        }
-
-        const currentItem = this.selections[this.currentImageIndex - 1];
-        if (!currentItem) {
-          this.$message.warning('当前工单数据无效');
-          return;
-        }
-
-        await this.$confirm('确认审核通过当前工单?', '提示', {
-          confirmButtonText: '确定',
-          cancelButtonText: '取消',
-          type: 'warning',
-        });
-
-        const data = {
-          id: currentItem.id,
-          status: currentItem.status,
-          isPass: 0,
-          eventNum: currentItem.orderNumber,
-        };
-        console.log('删除前:', this.selections);
-        const response = await flowEvent(data);
-        if (response.data.code === 0) {
-          this.$message.success('工单审核通过');
-
-          // 创建新的数组而不是修改原数组
-          const newSelections = [...this.selections];
-          newSelections.splice(this.currentImageIndex - 1, 1);
-
-          // 修正索引并更新图片
-          if (newSelections.length > 0) {
-            if (this.currentImageIndex > this.selections.length) {
-              this.currentImageIndex = this.selections.length;
-            }
-            this.updateCurrentReviewImage();
-          } else {
-            this.reviewDialogVisible = false;
-            this.currentImageIndex = 1;
-            this.currentReviewImage = '';
-            this.fetchTableData();
-          }
-
-          // 刷新表格数据
-          // this.fetchTableData();
-          this.selections = newSelections;
-        } else {
-          throw new Error(response.data.msg || '审核失败');
-        }
-      } catch (error) {
-        if (error === 'cancel') return;
-        this.$message.error(error.message || '审核失败,请稍后重试');
-      }
-    },
-
-    cancleBatchReject() {
-      this.reviewDialogVisible = false;
-      this.selections = [];
-      this.currentImageIndex = 1;
-      this.currentReviewImage = '';
-      this.fetchTableData();
-    },
-    // 批量审核不通过
-    async handleBatchReject() {
-      try {
-        if (this.selections.length === 0) {
-          this.$message.warning('没有选中的工单');
-          return;
-        }
-
-        const currentItem = this.selections[this.currentImageIndex - 1];
-        if (!currentItem) {
-          this.$message.warning('当前工单数据无效');
-          return;
-        }
-
-        await this.$confirm('确认该工单审核不通过?', '提示', {
-          confirmButtonText: '确定',
-          cancelButtonText: '取消',
-          type: 'warning',
-        });
-
-        const data = {
-          id: currentItem.id,
-          status: currentItem.status,
-          isPass: 1,
-          eventNum: currentItem.orderNumber,
-          eventName: currentItem.orderName,
-        };
-
-        const response = await flowEvent(data);
-        if (response.data.code === 0) {
-          this.$message.success('工单审核不通过');
-
-          // 创建新的数组而不是修改原数组
-          const newSelections = [...this.selections];
-          newSelections.splice(this.currentImageIndex - 1, 1);
-          this.selections = newSelections;
-
-          // 修正索引并更新图片
-          if (this.selections.length > 0) {
-            if (this.currentImageIndex > this.selections.length) {
-              this.currentImageIndex = this.selections.length;
-            }
-            this.updateCurrentReviewImage();
-          } else {
-            this.reviewDialogVisible = false;
-            this.currentImageIndex = 1;
-            this.currentReviewImage = '';
-            this.fetchTableData();
-          }
-
-          // 刷新表格数据
-          // this.fetchTableData();
-        } else {
-          throw new Error(response.data.msg || '驳回失败');
-        }
-      } catch (error) {
-        if (error === 'cancel') return;
-        this.$message.error(error.message || '驳回失败,请稍后重试');
-      }
-    },
-
-    // 获取所有图片列表用于预览
-    getImageList() {
-      return this.selections.map(item => this.getPreviewUrl(item.photo_url)).filter(url => url); // 过滤掉空值
-    },
-
-    // 处理图片点击
-    handleImageClick() {
-      // 图片点击事件由 el-image 的预览功能处理
-    },
-
-    // 处理上一张图片
-    handlePrevImage() {
-      if (this.currentImageIndex > 1) {
-        this.currentImageIndex--;
-        this.updateCurrentReviewImage();
-      }
-    },
-
-    // 处理下一张图片
-    handleNextImage() {
-      if (this.currentImageIndex < this.selections.length) {
-        this.currentImageIndex++;
-        this.updateCurrentReviewImage();
-      }
-    },
-
-    /**
-     * 获取缩略图地址
-     * @param {string} url 原图地址
-     * @returns {string} 缩略图地址
-     */
-    getThumbUrl(url) {
-      if (!url) return '';
-      const lastDot = url.lastIndexOf('.');
-      if (lastDot === -1) return url;
-      return url.slice(0, lastDot) + '_small' + url.slice(lastDot);
-    },
-
-    // 添加新方法:获取预览图地址
-    getPreviewUrl(url) {
-      if (!url) return '';
-      const lastDot = url.lastIndexOf('.');
-      if (lastDot === -1) return url;
-      return url.slice(0, lastDot) + '_show' + url.slice(lastDot);
-    },
-
-    /**
-     * 坐标转换方法处理
-     * @param goWgs84 是否由国测转换到84,默认false----由84转换到国测
-     */
-    disposeLocation(goWgs84 = false, data) {
-      let lng = '',
-        lat = '';
-
-      if (Array.isArray(data.location) && data.location.length > 0) {
-        if (goWgs84) {
-          lng = data.location?.[0] ? String(data.location[0]) : undefined;
-          lat = data.location?.[1] ? String(data.location[1]) : undefined;
-
-          if (lng && lat) {
-            [lng, lat] = gcj02ToWgs84(Number(lng), Number(lat));
-          }
-        } else {
-          lng = Number(data.location[0]);
-          lat = Number(data.location[1]);
-
-          if (lng && lat) {
-            [lng, lat] = wgs84ToGcj02(Number(lng), Number(lat));
-          }
-        }
-      }
-
-      return [String(lng), String(lat)];
-    },
-
-    // 复核按钮
-    reCheck(row) {
-      this.reCheckData = row;
-      this.reCheckDialog = true;
-    },
-
-    // 复核确认框按钮事件
-    reCheckConfirm(key) {
-      const that = this;
-      if (key == 1) {
-        getReviewById(that.reCheckData.id).then(res => {
-          that.reCheckDialog = false;
-          that.page.currentPage = 1;
-          that.fetchTableData();
-          that.fetchTabCounts();
-        });
-      } else {
-        const loading = ElLoading.service({
-          lock: true,
-          text: '复核任务创建中……',
-          background: 'rgba(0, 0, 0, 0.7)',
-        });
-
-        function closeConfirm() {
-          that.reCheckDialog = false;
-          that.page.currentPage = 1;
-          that.fetchTableData();
-          that.fetchTabCounts();
-          loading.close();
-        }
-
-        // 获取时间的接口
-        getCreateEventJob(that.reCheckData.id)
-          .then(res => {
-            ElMessageBox.confirm(`预计复核执行时间为${res.data.data}`, '提示', {
-              confirmButtonText: '确定',
-              showCancelButton: false, // 关键配置
-              closeOnClickModal: false,
-              closeOnPressEscape: false,
-              type: 'warning',
-            })
-              .then(() => {
-                closeConfirm();
-              })
-              .catch(() => {
-                closeConfirm();
-              });
-          })
-          .catch(() => {
-            closeConfirm();
-          });
-      }
-    },
-    // 导出工单报表
-    exportTheTick(row){
-      const params = {
-        num:row.orderNumber
-      }   
-      exportTheTicket(params).then(res=>{
-      const elink = document.createElement('a')
-      elink.download = row.orderName + '.docx'
-      elink.style.display = 'none'
-      const blob = new Blob([res.data])
-      elink.href = URL.createObjectURL(blob)
-      document.body.appendChild(elink)
-      elink.click()
-      document.body.removeChild(elink)
-      })
-       this.$message.success('数据导出成功');
-    }
-  },
-  activated() {
-    this.handleReset();
-  },
-};
-</script>
-<style lang="scss">
-.custom-dialog {
-  max-height: 96vh;
-
-  .el-dialog__body {
-    border-top: 0.1rem solid #f0f0f0;
-  }
-}
-
-.custom-qrcode-popover {
-  min-width: 160px !important;
-  min-height: 140px !important;
-  position: relative;
-
-  .qrcode-content {
-    margin-top: 8px;
-
-    .close-btn {
-      position: absolute;
-      top: 2px;
-      right: 2px;
-      width: 16px;
-      height: 16px;
-      line-height: 16px;
-      text-align: center;
-      cursor: pointer;
-      color: #999;
-      font-size: 16px;
-      z-index: 10;
-    }
-  }
-}
-</style>
-<style lang="scss" scoped>
-::v-deep(.el-tabs) {
-  height: 100%;
-  display: flex;
-  flex-direction: column;
-
-  .el-tabs__header {
-    order: 1;
-  }
-
-  .el-tabs__content {
-    order: 2;
-  }
-
-  .el-tabs__content {
-    height: 0;
-    flex: 1;
-    display: flex;
-    flex-direction: column;
-
-    .el-tab-pane {
-      height: 0;
-      flex: 1;
-      display: flex;
-      flex-direction: column;
-    }
-  }
-}
-
-.filter-bar {
-  display: flex;
-  align-items: center;
-  margin-bottom: 15px;
-  flex-wrap: wrap;
-  gap: 8px; // 使用 gap 统一设置间距
-
-  .filter-item {
-    width: 280px; // 减小宽度
-  }
-
-  .date-picker {
-    // width: 240px; // 日期选择器宽度适当调整
-  }
-
-  .el-button {
-    margin-left: 0; // 覆盖 element-ui 默认的按钮间距
-  }
-}
-
-.uploadImg {
-  margin-bottom: 32px;
-}
-
-.tableCss {
-  width: 100%;
-  margin-bottom: 10px;
-}
-
-.step-timer {
-  position: absolute;
-  right: 80%;
-  top: 50%;
-  transform: translateY(-50%);
-  width: 100px;
-  margin-left: 4px;
-  color: #666;
-  font-size: 12px;
-}
-
-.event-total-time {
-  text-align: center;
-  color: #666;
-  font-size: 15px;
-  margin-bottom: 12px;
-}
-
-.action-bar {
-  margin-bottom: 16px;
-}
-
-.el-dialog {
-  .el-form-item {
-    margin-bottom: 20px;
-  }
-}
-
-.el-upload {
-  width: 100%;
-  display: flex;
-  flex-wrap: wrap;
-
-  :deep(.el-upload-list__item) {
-    transition: all 0.3s ease;
-  }
-
-  :deep(.el-upload-list__item:hover) {
-    background-color: #f5f7fa;
-  }
-}
-
-.el-upload__tip {
-  font-size: 12px;
-  color: #909399;
-  margin-top: 12px;
-}
-
-.create-ticket-form {
-  padding: 20px 10px;
-
-  .form-section {
-    background-color: #fff;
-    border-radius: 4px;
-
-    .el-row {
-      margin-bottom: 16px;
-
-      &:last-child {
-        margin-bottom: 0;
-      }
-    }
-  }
-
-  .location-wrapper {
-    width: 100%; // 修改为100%以适应父容器
-    height: auto; // 修改为auto以自适应内容
-
-    .map-button {
-      width: 100%; // 让按钮填满容器宽度
-      height: 36px; // 与其他输入框保持一致的高度
-      display: flex;
-      align-items: center;
-      justify-content: center;
-
-      i {
-        margin-right: 4px;
-      }
-    }
-
-    .location-text {
-      margin-top: 8px;
-      padding: 8px 12px;
-      background-color: #f5f7fa;
-      border-radius: 4px;
-      color: #606266;
-      font-size: 13px;
-      line-height: 1.4;
-    }
-  }
-
-  .upload-wrapper {
-    .uploader {
-      :deep(.el-upload--picture-card) {
-        width: 120px;
-        height: 100px;
-        line-height: 128px;
-      }
-
-      :deep(.el-upload-list__item) {
-        width: 120px;
-        height: 120px;
-      }
-    }
-
-    .upload-tip {
-      font-size: 12px;
-      color: #909399;
-      line-height: 1.4;
-      margin-top: 8px;
-    }
-  }
-
-  .el-form-item {
-    margin-bottom: 18px;
-
-    &:last-child {
-      margin-bottom: 0;
-    }
-  }
-
-  :deep(.el-form-item__label) {
-    font-weight: 500;
-    color: #606266;
-  }
-
-  // :deep(.el-input__inner) {
-  //   height: 36px;
-  //   line-height: 36px;
-  // }
-
-  :deep(.el-textarea__inner) {
-    padding: 8px 12px;
-  }
-
-  // :deep(.el-input__inner),
-  // :deep(.el-select),
-  // :deep(.el-select .el-input) {
-  //   width: 100%; // 确保所有输入框和选择框宽度一致
-  // }
-
-  .full-width {
-    width: 100%;
-  }
-}
-
-:deep(.el-dialog__body) {
-  border-top: 0.1rem solid #f0f0f0;
-}
-
-.dialog-footer-new {
-  text-align: right;
-  padding-top: 16px;
-  border-top: 1px solid #ebeef5;
-
-  .el-button + .el-button {
-    margin-left: 12px;
-  }
-
-  .el-button {
-    padding: 9px 20px;
-
-    &:last-child {
-      margin-left: 12px;
-    }
-  }
-}
-
-.dialog-footer1-new {
-  position: sticky;
-  bottom: 28px;
-  left: 0;
-  right: 0;
-  background: white;
-  z-index: 10;
-  padding: 16px 20px;
-  border-top: 1px solid #ebeef5;
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-
-  .el-button + .el-button {
-    margin-left: 12px;
-  }
-
-  .btngroups {
-    margin-left: 12px;
-  }
-
-  .el-button {
-    padding: 9px 20px;
-
-    &:last-child {
-      margin-left: 12px;
-      margin-right: 12px;
-    }
-  }
-}
-
-.map-container {
-  width: 100%;
-  height: 400px;
-  margin-bottom: 15px;
-  border: 1px solid #dcdfe6;
-  border-radius: 4px;
-  overflow: hidden;
-
-  :deep(.el-input-map) {
-    height: 100%;
-  }
-}
-
-.location-info {
-  margin-top: 10px;
-  padding: 10px;
-  background-color: #f5f7fa;
-  border-radius: 4px;
-
-  p {
-    margin: 5px 0;
-    color: #606266;
-    font-size: 14px;
-  }
-}
-
-.map-select {
-  display: flex;
-  align-items: flex-start;
-  gap: 15px;
-
-  .selected-location {
-    flex: 1;
-    padding: 5px 10px;
-    background-color: #f5f7fa;
-    border-radius: 4px;
-
-    p {
-      margin: 5px 0;
-      color: #606266;
-      font-size: 14px;
-    }
-  }
-}
-
-.preview-image {
-  border-radius: 4px;
-  overflow: hidden;
-  background-color: #f5f7fa;
-}
-
-.image-placeholder,
-.image-error,
-.no-media {
-  height: 200px;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  color: #909399;
-  background-color: #f5f7fa;
-  border-radius: 4px;
-
-  i {
-    font-size: 32px;
-    margin-bottom: 8px;
-  }
-}
-
-.no-media {
-  border: 1px dashed #d9d9d9;
-}
-
-.detail-container {
-  padding: 0 20px;
-
-  .detail-top-title {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-
-    .event-orderNumber {
-      margin-right: 10px;
-    }
-  }
-}
-
-.status-flow {
-  margin-bottom: 20px;
-
-  .custom-steps {
-    .el-step__description {
-      position: relative;
-      margin: 0;
-      padding: 0;
-    }
-
-    // 添加发起任务步骤的特殊样式
-    .init-step-info {
-      display: flex;
-      flex-direction: column;
-      align-items: center;
-      text-align: center;
-      width: 130px;
-
-      .creator-name {
-        font-size: 14px;
-        font-weight: bold;
-        color: #303133;
-        margin-bottom: 4px;
-      }
-
-      .create-time {
-        font-size: 10px;
-        color: #909399;
-      }
-    }
-
-    // 保持其他步骤的原有样式
-    .step-info {
-      display: flex;
-      margin: 0;
-      padding: 0;
-      justify-content: space-between;
-      align-items: center;
-      width: 200px;
-
-      .process-time {
-        font-size: 10px;
-        color: #909399;
-        text-align: left;
-        margin-left: -50%;
-        padding-left: 0%;
-        flex: 1;
-      }
-
-      .handler-name {
-        font-size: 14px;
-        font-weight: bold;
-        color: #303133;
-        text-align: left;
-        flex: 1;
-      }
-    }
-  }
-}
-
-.basic-info {
-  margin-bottom: 20px;
-}
-
-.media-section {
-  // margin-bottom: 20px;
-
-  .el-row {
-    display: flex;
-    align-items: center;
-  }
-}
-
-.leftBtn {
-  width: 70px;
-  height: 32px;
-  background-color: #999;
-  border-radius: 5px;
-  text-align: center;
-  line-height: 32px;
-  color: #fff;
-  cursor: pointer;
-  opacity: 0.8;
-}
-
-.disableds {
-  background: #999 !important;
-  cursor: not-allowed !important;
-  pointer-events: none;
-  opacity: 0.3 !important;
-}
-
-.PopUpTableScrolls {
-  max-height: 600px;
-  overflow-y: scroll;
-  overflow-x: hidden;
-}
-
-.media-box {
-  width: 100%;
-  border: 1px solid #dcdfe6;
-  border-radius: 4px;
-  padding: 10px;
-  background: #fff;
-  box-sizing: border-box;
-
-  .media-title {
-    font-weight: bold;
-    margin-bottom: 5px;
-    display: flex;
-    align-items: center;
-
-    .QRCodeImg {
-      width: 18px;
-      height: 18px;
-      cursor: pointer;
-      padding-bottom: 1px;
-    }
-  }
-
-  .media-content {
-    position: relative;
-    height: 500px;
-
-    :deep(.el-image) {
-      width: 100% !important;
-      max-width: 100%;
-      max-height: 100%;
-
-      .el-image__inner {
-        width: 100%;
-        height: 100%;
-        object-fit: cover !important;
-      }
-    }
-  }
-}
-
-.image-placeholder,
-.image-error,
-.no-media {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  height: 100%;
-  color: #909399;
-  background-color: #f5f7fa;
-  border-radius: 4px;
-}
-
-.image-placeholder i,
-.image-error i {
-  font-size: 32px;
-  margin-bottom: 8px;
-}
-
-.no-media {
-  border: 1px dashed #d9d9d9;
-}
-
-.info-table {
-  margin-bottom: 20px;
-}
-
-.info-item {
-  display: flex;
-  margin-bottom: 10px;
-}
-
-.info-label {
-  font-weight: bold;
-  width: 120px;
-  color: #606266;
-}
-
-.info-value {
-  flex: 1;
-  color: #303133;
-  word-break: break-word;
-}
-
-.readonly-processing-detail {
-  background-color: #f5f7fa;
-  padding: 12px;
-  border-radius: 4px;
-  min-height: 30px;
-  color: #606266;
-  line-height: 1.5;
-  display: block;
-  text-align: left;
-  margin-bottom: 5px;
-
-  &:first-child {
-    font-weight: bold;
-    margin-bottom: 4px;
-  }
-}
-
-// 添加删除按钮样式
-.danger-button {
-  color: #f56c6c;
-}
-
-.danger-button:hover {
-  color: #f78989;
-}
-
-.custom-steps-container {
-  width: 100%;
-  margin: 10px 0;
-}
-
-.steps-titles {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 14px;
-  position: relative;
-}
-
-.step-title {
-  text-align: center;
-  flex: 1;
-  font-size: 14px;
-  color: #999;
-  position: relative;
-  padding-bottom: 5px;
-}
-
-.step-title.active {
-  color: #409eff;
-  font-weight: bold;
-}
-
-.event-title-center {
-  text-align: center;
-  font-size: 20px;
-  font-weight: bold;
-  margin-bottom: 5px;
-  color: #333;
-}
-
-.custom-steps {
-  margin-top: -20px;
-
-  :deep(.el-step__description) {
-    margin-top: 8px;
-    padding: 0 20px;
-  }
-}
-
-.step-description {
-  font-size: 14px;
-  color: #666;
-  line-height: 1.5;
-  display: block;
-  text-align: center;
-
-  &:first-child {
-    font-weight: bold;
-    margin-bottom: 4px;
-  }
-}
-
-// 覆盖其他相关样式
-.status-flow {
-  .custom-steps {
-    .el-step__description {
-      position: relative;
-      margin: 0;
-      padding: 0;
-    }
-
-    // 移除之前的样式
-    .init-step-info,
-    .step-info {
-      display: block;
-      width: auto;
-      text-align: center;
-    }
-  }
-}
-
-// 添加新的样式
-.review-dialog {
-  :deep(.el-dialog__body) {
-    padding: 0;
-    background-color: #f5f7fa;
-    border-top: 0.1rem solid #f0f0f0;
-  }
-}
-
-.re-check-dialog {
-  :deep(.el-dialog__body) {
-    padding: 0;
-    background-color: #f5f7fa;
-    border-top: 0.1rem solid #f0f0f0;
-  }
-}
-
-.review-container {
-  position: relative;
-
-  .review-image-wrapper {
-    position: relative;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    height: 600px;
-    background-color: #f5f7fa;
-  }
-
-  .review-image-container {
-    width: 100%;
-    height: 100%;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-
-    :deep(.el-image) {
-      width: 100%;
-      height: 100%;
-      display: flex;
-      align-items: center;
-      justify-content: center;
-
-      .el-image__inner {
-        max-height: 100%;
-        max-width: 100%;
-        object-fit: contain;
-      }
-    }
-  }
-
-  .arrow-button {
-    position: absolute;
-    top: 50%;
-    transform: translateY(-50%);
-    width: 44px;
-    height: 44px;
-    background: rgba(0, 0, 0, 0.3);
-    border-radius: 50%;
-    border: none;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    cursor: pointer;
-    transition: all 0.3s;
-    z-index: 100;
-
-    &:hover {
-      background: rgba(0, 0, 0, 0.6);
-    }
-
-    i {
-      color: #fff;
-      font-size: 24px;
-    }
-
-    &.left {
-      left: 20px;
-      color: #ffffff;
-    }
-
-    &.right {
-      right: 20px;
-      color: #ffffff;
-    }
-  }
-
-  .preview-image {
-    max-width: 100%;
-    max-height: 100%;
-  }
-
-  .review-pagination {
-    padding: 16px 0;
-    display: flex;
-    justify-content: center;
-    background-color: #fff;
-
-    :deep(.el-pagination) {
-      .btn-prev,
-      .btn-next {
-        display: none;
-      }
-
-      .el-pager {
-        .number {
-          margin: 0 4px;
-        }
-      }
-    }
-  }
-
-  .image-error {
-    height: 100%;
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    color: #909399;
-
-    i {
-      font-size: 48px;
-      margin-bottom: 16px;
-    }
-
-    span {
-      font-size: 16px;
-    }
-  }
-}
-
-/* 新建工单和处理工单的上传组件样式 */
-.create-upload,
-.detail-upload {
-  :deep(.el-upload--picture-card) {
-    width: 120px;
-    height: 100px;
-    line-height: 100px;
-  }
-
-  /* 隐藏额外的上传按钮 */
-  :deep(.el-upload.el-upload--picture-card) {
-    display: none;
-  }
-
-  /* 当没有图片时显示上传按钮 */
-  :deep(.el-upload.el-upload--picture-card:first-child) {
-    display: flex;
-  }
-
-  /* 上传组件的预览图片样式 */
-  :deep(.el-upload-list--picture-card .el-upload-list__item) {
-    width: 120px;
-    height: 100px;
-  }
-}
-
-/* 原有图片预览的样式 */
-.el-image-viewer__wrapper {
-  :deep(.el-image-viewer__img) {
-    max-width: 100%;
-    max-height: 100%;
-    object-fit: contain;
-  }
-}
-
-/* 必填项样式 */
-.required-label {
-  position: relative;
-  display: inline-block;
-
-  .required-star {
-    color: #f56c6c;
-    margin-right: 4px;
-  }
-}
-
-/* 必填输入框样式 */
-.required-input {
-  width: 100%;
-
-  :deep(.el-input__inner),
-  :deep(.el-textarea__inner) {
-    &:focus {
-      border-color: #409eff;
-    }
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/tickets/ticket.vue b/applications/task-work-order/src/views/tickets/ticket.vue
deleted file mode 100644
index a5bd6ed..0000000
--- a/applications/task-work-order/src/views/tickets/ticket.vue
+++ /dev/null
@@ -1,2358 +0,0 @@
-<template>
-  <basic-container>
-    <el-tabs v-model="activeTab" @tab-click="handleTabChange">
-      <el-tab-pane
-        v-for="tab in filteredTabs"
-        :key="tab.name"
-        :label="tab.name === 'myTickets' ? tab.label : `${tab.label} (${tab.count})`"
-        :name="tab.name"
-      >
-        <basic-main-content>
-            <!-- 查询条件筛选栏 -->
-           <div class="ztzf-form-search">
-            <el-form :model="filters" inline>
-              <div class="searchBox">
-                <el-form-item label="关键字:">
-                  <el-input
-                    v-model="filters.keyword"
-                    placeholder="请输入关键字"
-                    class="filter-item"
-                    clearable
-                    @clear="handleKeyWords"
-                    @keyup.enter="handleSearch"
-                  />
-                </el-form-item>
-                <el-form-item label="选择日期:">
-                  <el-date-picker
-                    clearable
-                    @clear="handleKeyWords"
-                    @change="handleSearch"
-                    v-model="filters.dateRange"
-                    type="daterange"
-                    class="filter-item"
-                    range-separator="至"
-                    start-placeholder="开始日期"
-                    end-placeholder="结束日期"
-                    :default-value="datePickerDefaultVal"
-                  >
-                  </el-date-picker>
-                </el-form-item>
-                <el-form-item label="选择状态:">
-                  <el-select
-                    :disabled="activeTab !== 'all'"
-                    v-model="filters.status"
-                    placeholder="请选择状态"
-                    class="filter-item"
-                    clearable
-                    @change="handleSearch"
-                  >
-                    <el-option
-                      v-for="item in statuses"
-                      :key="item.value"
-                      :label="item.label"
-                      :value="item.value"
-                    />
-                  </el-select>
-                </el-form-item>
-                <el-form-item label="选择机巢:">
-                  <el-select
-                    v-model="filters.device_sn"
-                    placeholder="请选择机巢"
-                    class="filter-item"
-                    clearable
-                    @change="handleSearch"
-                  >
-                    <el-option
-                      v-for="item in machineData"
-                      :key="item.device_sn"
-                      :label="item.nickname"
-                      :value="item.device_sn"
-                    />
-                  </el-select>
-                </el-form-item>
-                <el-form-item label="选择算法:">
-                  <el-tree-select
-                    style="z-index: 1200"
-                    :teleported="false"
-                    class="custom-tree-select"
-
-                    v-model="dictKey"
-                    :data="dataList"
-                    :default-expanded-keys="[dictKey]"
-                    :props="treePropsSF"
-                    :render-after-expand="false"
-                    :default-checked-keys="checkedKeys"
-                    node-key="id"
-                    multiple
-                    show-checkbox
-                    collapse-tags
-                    collapse-tags-tooltip
-                    clearable
-                    @check="handleCheck"
-                    @clear="handleClear"
-                  />
-                </el-form-item>
-                <el-form-item label="复核状态:" v-if="activeTab === 'completed'">
-                  <el-select
-                    v-model="filters.isReview"
-                    placeholder="请选择复核状态"
-                    class="filter-item"
-                    clearable
-                    @change="handleSearch"
-                  >
-                    <el-option
-                      v-for="item in reviewStatuses"
-                      :key="item.value"
-                      :label="item.label"
-                      :value="item.value"
-                    />
-                  </el-select>
-                </el-form-item>
-                <div class="btnGroup">
-                  <el-button type="primary" icon="el-icon-search" @click="handleSearch"
-                    >搜索</el-button
-                  >
-                  <el-button icon="el-icon-refresh" @click="handleReset">重置</el-button>
-                </div>
-              </div>
-            </el-form>
-          </div>
-          <!-- 表格部分 -->
-          <div class="table-operations">
-            <div class="left-operations">
-              <el-button
-                v-if="(activeTab === 'all' || activeTab === 'myTickets') && permissionList.addBtn"
-                type="primary"
-                icon="el-icon-plus"
-                @click="handleAdd"
-              >
-                新建工单
-              </el-button>
-              <el-button
-                v-if="activeTab === 'pending' && permissionList.reviewBtn"
-                type="success"
-                icon="el-icon-check"
-                @click="openReviewDialog"
-              >
-                批量审核
-              </el-button>
-
-              <el-button
-                v-if="permissionList.exportBtn"
-                type="success"
-                plain
-                icon="el-icon-download"
-                @click="exportData"
-              >
-                导出
-              </el-button>
-            </div>
-          </div>
-          <div class="titketBox">
-          <div class="dataTable">
-        <el-table
-           class="ztzf-public-general-el-table custom-header"
-          ref="elTable"
-          :data="tableData"
-          v-loading="loading"
-          @selection-change="handleSelectionChange"
-          border
-          style="width: 100%"
-          v-if="activeTab === tab.name"
-        >
-          <el-table-column type="selection" width="55" v-if="permissionList.reviewBtn || permissionList.exportBtn" />
-          <el-table-column type="index" label="序号" width="60" />
-          <el-table-column prop="orderNumber" label="工单编号" width="170">
-            <template #default="{ row }">
-              <el-tooltip-copy :content="row.orderNumber" :showCopyText="true" textAlign="left">
-                {{ row.orderNumber }}
-              </el-tooltip-copy>
-            </template>
-          </el-table-column>
-          <el-table-column prop="orderName" label="工单名称" width="150" show-overflow-tooltip>
-            <template #default="{ row }">
-              <el-tooltip-copy :content="row.orderName" :showCopyText="true" textAlign="left">
-                {{ row.orderName }}
-              </el-tooltip-copy>
-            </template>
-          </el-table-column>
-
-          <el-table-column prop="department" label="所属部门" width="120" show-overflow-tooltip />
-
-
-          <el-table-column prop="startTime" label="发起任务时间" width="160" show-overflow-tooltip />
-
-          <el-table-column prop="aiType" label="关联算法" width="120" show-overflow-tooltip />
-
-          <el-table-column prop="type" label="工单类型" width="110" show-overflow-tooltip>
-            <template #default="{ row }">
-              {{ getTypeLabel(row.type) }}
-            </template>
-          </el-table-column>
-           <el-table-column prop="device_names" label="所属机巢" width="120" show-overflow-tooltip />
-        <el-table-column prop="dataSources" label="工单来源" width="90">
-        </el-table-column>
-          <el-table-column prop="content" label="工单内容" width="132" show-overflow-tooltip>
-            <template #default="{ row }">
-              {{ row.address || row.content }}
-            </template>
-          </el-table-column>
-
-          <el-table-column prop="creator" label="创建人" width="120" show-overflow-tooltip />
-
-          <el-table-column prop="handler" label="处理人" width="120" show-overflow-tooltip />
-
-          <el-table-column
-            v-if="['all', 'completed', 'myTickets'].includes(activeTab)"
-            label="复核状态"
-            prop="isReview"
-            width="90"
-          >
-            <template #default="{ row }">
-              <span>{{ showIsReviewText(row) }}</span>
-            </template>
-          </el-table-column>
-
-          <el-table-column label="工单状态" prop="status" width="90">
-            <template #default="{ row }">
-              <span :style="getStatusTagType(row.status) ? 'color:' + getStatusTagType(row.status) : ''">
-                {{ mapStatus(row.status) }}
-              </span>
-            </template>
-          </el-table-column>
-
-          <!-- 操作列 -->
-          <el-table-column label="操作" width="200" align="center">
-            <template #default="{ row }">
-              <template v-if="row.status === -1">
-                <el-button type="text" icon="el-icon-edit" @click="handleEdit(row)">编辑</el-button>
-                <el-button type="text" icon="el-icon-delete" class="danger-button" @click="handleDelete(row)">
-                  删除
-                </el-button>
-              </template>
-
-              <template v-else>
-                <el-button type="text" icon="el-icon-view" @click="handleViewDetail(row)">详情</el-button>
-              </template>
-
-              <!-- <template v-if="row.status === 4 && !isProd">
-                <el-button type="text" icon="el-icon-download" @click="exportTheTick(row)">导出</el-button>
-              </template> -->
-
-              <template v-if="permission.tickets_repeat_review">
-                <el-button
-                  v-if="row.status === 4 && row.isReview !== 1"
-                  type="text"
-                  icon="el-icon-check"
-                  @click="reCheck(row)"
-                >
-                  复核
-                </el-button>
-              </template>
-            </template>
-            </el-table-column>
-          <template #empty>
-            <el-empty
-              class="custom-empty"
-              :image-size="100"
-            >
-              <template #description>
-                <span class="custom-text">暂无数据</span>
-              </template>
-            </el-empty>
-          </template>
-          </el-table>
-          </div>
-           <div  class="pagination" v-if="tableData.length > 0">
-             <el-pagination
-            class="table-pagination"
-            v-model:current-page="page.currentPage"
-            v-model:page-size="page.pageSize"
-            :page-sizes="[10, 20, 30, 40]"
-            :total="page.total"
-             background
-            layout="total, sizes, prev, pager, next, jumper"
-            @size-change="sizeChange"
-            @current-change="handleCurrentChange"
-          />
-           </div>
-     </div>
-        </basic-main-content>
-      </el-tab-pane>
-    </el-tabs>
-
-    <!-- 新建工单对话框 -->
-        <create-ticket-dialog
-        v-model="dialogVisible"
-        :departments="departments"
-        :department-users="departmentUsers"
-        :types="types"
-        :all-algorithms="allAlgorithms"
-        :edit-data="editFormData"
-        :map-center="inputMapShowDefaultCenter"
-        @create-success="handleCreateSuccess"
-        @draft-success="handleDraftSuccess"
-        @create-error="handleCreateError"
-      />
-    <!-- 工单详情对话框 -->
-      <ticket-detail-dialog
-        v-model="detailVisible"
-        :current-detail="currentDetail"
-        :current-index="currentIndex"
-        :total-items="tableData.length"
-        :algorithms="algorithms2"
-        :types="types"
-        :permission="permission"
-        :step-status-list="stepStatusList"
-        :work-type="workType"
-        @detail-success="handleDetailSuccess"
-        @detail-error="handleDetailError"
-        @prev-item="handlePrevItem"
-        @next-item="handleNextItem"
-        @update:current-detail="handleCurrentDetailUpdate"
-        @approve-and-dispatch="handleApproveAndDispatch"
-      />
-
-    <!-- 派发工单对话框 -->
-      <dispatch-dialog
-        v-model="dispatchDialogVisible"
-        :current-detail="currentDetail"
-        :department-users="departmentUsers"
-        :algorithms="algorithms"
-        :types="types"
-        @dispatch-success="handleDispatchSuccess"
-        @dispatch-error="handleDispatchError"
-      />
-
-    <!-- 批量审核对话框 -->
-    <el-dialog
-      v-model="reviewDialogVisible"
-      title="批量审核"
-      width="1100"
-       align-center
-      append-to-body
-      class="ztzf-dialog-mange"
-      custom-class="review-dialog"
-      @close="cancleBatchReject"
-    >
-      <div class="review-container">
-        <div class="review-image-wrapper">
-          <!-- 修改左右箭头的显示条件 -->
-          <el-button
-            v-if="selections.length > 1 && currentReviewImage"
-            class="arrow-button left"
-            @click="handlePrevImage"
-            icon="el-icon-arrow-left"
-          >
-          </el-button>
-
-          <div class="review-image-container">
-            <!-- <el-image v-if="currentReviewImage" :src="getThumbUrl(currentReviewImage)" fit="fill"
-              :preview-src-list="getImageList()" :initial-index="currentImageIndex - 1" class="preview-image"
-              style="cursor: pointer"> -->
-            <el-image
-              v-if="currentReviewImage"
-              :src="getPreviewUrl(currentReviewImage)"
-              fit="fill"
-              :initial-index="currentImageIndex - 1"
-              class="preview-image"
-              style="cursor: pointer"
-            >
-              <template #error>
-                <div class="image-error">
-                  <i class="el-icon-picture-outline"></i>
-                  <span>图片加载失败</span>
-                </div>
-              </template>
-            </el-image>
-            <div v-else class="no-image">暂无图片</div>
-          </div>
-
-          <!-- 修改右箭头的显示条件 -->
-          <el-button
-            v-if="selections.length > 1 && currentReviewImage"
-            class="arrow-button right"
-            @click="handleNextImage"
-            icon="el-icon-arrow-right"
-          >
-          </el-button>
-        </div>
-
-        <!-- 修改分页器的显示条件 -->
-        <div class="review-pagination" v-if="selections.length > 1 && currentReviewImage">
-          <el-pagination
-            small
-            layout="prev, pager, next"
-            hide-on-single-page
-            :total="selections.length"
-            :current-page="currentImageIndex"
-            :page-size="1"
-            @current-change="handleImagePageChange"
-          >
-          </el-pagination>
-        </div>
-      </div>
-
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="handleBatchApprove" icon="el-icon-check"
-            >通过
-          </el-button>
-          <el-button type="danger" @click="handleBatchReject" icon="el-icon-close"
-            >不通过
-          </el-button>
-          <el-button @click="cancleBatchReject" icon="el-icon-circle-close">取消</el-button>
-        </div>
-      </template>
-    </el-dialog>
-    <!-- 复核弹出层 -->
-    <recheck-dialog
-  v-model="reCheckDialog"
-  :recheck-data="reCheckData"
-  @recheck-success="handleRecheckSuccess"
-/>
-  </basic-container>
-</template>
-
-<script setup>
-import {ALL_WORK_ORDER_TYPE_OPTIONS} from '@ztzf/constants'
-import { getDateRange } from '@/utils/date'
-import {  getDeviceRegion } from '@/api/job/task';
-import { ElMessage} from 'element-plus';
-import { useRoute, useRouter } from 'vue-router'
-import { useStore } from 'vuex'
-import { pxToRem, pxToRemNum } from '@/utils/rem';
-import { getSmallImg, getShowImg } from '@/utils/util';
-import { calculateDefaultRange } from '@/utils/util';
-import { gcj02ToWgs84, wgs84ToGcj02 } from '@/utils/coordinateTransformation';
-import _ from 'lodash';
-import {
-  getList,
-  getTicketInfo,
-  flowEvent,
-  getstatusCount,
-  getStepInfo,
-  exportTheTicket
-} from '@/api/tickets/ticket';
-import { getSFDictionaryTree } from '@/api/job/task';
-import { export_json_to_excel } from '@/utils/exportExcel';
-import geoJson from '@/assets/geoJson.json';
-import { mapGetters } from 'vuex';
-import { getAdcodeObj } from '@/utils/disposeData';
-import elTooltipCopy from '@/components/ElTooltipCopy.vue';
-import getBaseConfig from '@/buildConfig/config';
-import RecheckDialog from '@/views/tickets/ticketComponent/RecheckDialog.vue';
-import DispatchDialog from '@/views/tickets/ticketComponent/DispatchDialog.vue';
-import CreateTicketDialog from '@/views/tickets/ticketComponent/CreateTicketDialog.vue';
-import TicketDetailDialog from '@/views/tickets/ticketComponent/TicketDetailDialog.vue';
-const { envName } = getBaseConfig();
-const isProd = import.meta.env.VITE_APP_ENV === 'production'
-const route = useRoute()
-const router = useRouter()
-const store = useStore()
-const userAreaCode = computed(() => store.getters.userInfo.detail.areaCode);
-const currentIndex = ref(null)
-const finalizeLoading = ref(false)
-const activeTab = ref('all')
-let machineData = ref([]);
-const tabs = ref([
-  { label: '我的工单', name: 'myTickets', value: null, count: 0 },
-  { label: '全部工单', name: 'all', value: null, count: 0 },
-  { label: '待审核', name: 'pending', value: 2, count: 0 },
-  { label: '待处理', name: 'processing', value: 0, count: 0 },
-  { label: '处理中', name: 'inProgress', value: 3, count: 0 },
-  { label: '已完成', name: 'completed', value: 4, count: 0 },
-])
-const dateRanges = {
-  today: getDateRange('today').map(d => new Date(d)), // 转为 Date 对象
-  week: getDateRange('week').map(d => new Date(d)),
-  month: getDateRange('month').map(d => new Date(d)),
-  year: getDateRange('year').map(d => new Date(d)),
-}
-const filters = reactive({
-  keyword: '',
-  department: '',
-  type: '',
-  dateRange: [],
-  status: '',
-  algorithm: '',
-  isReview: '',
-  device_sn:''
-})
-const departments = ref([])
-const types = ref([])
-const allAlgorithms = ref([])
-const handlers = ref([
-  { label: '处理人A', value: 'handlerA' },
-  { label: '处理人B', value: 'handlerB' },
-])
-const algorithms = ref([])
-const algorithms2 = ref([])
-const statuses = ref([
-  { label: '待审核', value: '2' },
-  { label: '待处理', value: '0' },
-  { label: '处理中', value: '3' },
-  { label: '已完成', value: '4' },
-])
-const reviewStatuses = ref([
-  { label: '否', value: 0 },
-  { label: '是', value: 1 },
-])
-const tableData = ref([])
-const page = reactive({
-  pageSize: 10,
-  currentPage: 1,
-  total: 0,
-})
-const dialogVisible = ref(false)
-const editFormData = ref(null)
-const detailVisible = ref(false)
-const currentDetail = ref({})
-const departmentUsers = ref({})
-const loading = ref(false)
-const globalCounts = ref({})
-const mapLoaded = ref(false)
-const isFetching = ref(false)
-const mapParams = reactive({
-  zoom: 15,
-  center: null,
-})
-const dispatchDialogVisible = ref(false)
-const stepInfos = ref([])
-const userNameToIdMap = ref({})
-const workType = ref(0)
-const selections = ref([])
-const reviewDialogVisible = ref(false)
-const currentReviewImage = ref('')
-const currentImageIndex = ref(1)
-const totalTime = ref('')
-const isShowInfo = ref(false)
-const datePickerDefaultVal = ref(calculateDefaultRange())
-const reCheckDialog = ref(false)
-const reCheckData = ref({})
-const treePropsSF = reactive({
-  label: 'dictValue',
-  value: 'id',
-  children: 'children',
-})
-const dictKey = ref('')
-const dataList = ref([])
-const checkedKeys = ref([])
-const inputMapShowDefaultCenter = ref(null)
-const userInfo = computed(() => store.state.user.userInfo)
-const permission = computed(() => store.state.user.permission);
-
-// 计算属性
-const firstRowData = computed(() => {
-  return tableData.value.length > 0 ? tableData.value[0] : null
-})
- // 动态过滤tabs,保证isShow为true/false
- const filteredTabs = computed(() => {
-  const tabPending = permission.value?.tickets_tab_pending === true//待审核
-  const tabMyTickets = permission.value?.tickets_tab_mytickets === true  //我的工单
-  const tabALL = permission.value?.tickets_allWorkOrders === true //全部工单
-  const tabInProgress= permission.value?.tickets_inProgress === true //处理中
-  const tabProcessing= permission.value?.tickets_pending === true //待处理
-  const tabCompleted= permission.value?.tickets_wasDone === true //已完成
-  return tabs.value
-  .map(tab => {
-      switch (tab.name) {
-        case 'all':
-          return { ...tab, isShow: tabALL } // 全部工单
-        case 'pending':
-          return { ...tab, isShow: tabPending } // 待审核
-        case 'myTickets':
-          return { ...tab, isShow: tabMyTickets } // 我的工单
-        case 'processing':
-          return { ...tab, isShow: tabProcessing } // 待处理
-        case 'inProgress':
-          return { ...tab, isShow: tabInProgress } // 处理中
-        case 'completed':
-          return { ...tab, isShow: tabCompleted } // 已完成
-        default:
-          return { ...tab, isShow: false } // 其他标签默认隐藏
-      }
-    })
-    .filter(tab => tab.isShow)
-})
- // 可根据实际后端权限key调整
-const permissionList = computed(() => {
-  return {
-    addBtn: validData(permission.value.tickets_add, false),
-    delBtn: validData(permission.value.tickets_delete, false),
-    exportBtn: validData(permission.value.tickets_export, false),
-    reviewBtn: validData(permission.value.tickets_review_btn, false),
-  }
-})
-// 计算默认激活的标签(无全部工单时优先激活待审核)
-const defaultActiveTab = computed(() => {
-  const hasAllTab = filteredTabs.value.some(tab => tab.name === 'all')
-  const hasPendingTab = filteredTabs.value.some(tab => tab.name === 'pending')
-  if (!hasAllTab && hasPendingTab) {
-    return 'pending'
-  }
-  else if (hasAllTab) {
-    return 'all'
-  }
-  else {
-    return filteredTabs.value[0]?.name || 'all'
-  }
-})
-
-
-const handleNodeClick = async data => {
-  const droneList = await getDeviceRegion({ areaCode: userAreaCode.value });
-  machineData.value = droneList?.data?.data;
-
-};
-// 提取状态列表计算属性
-const statusList = computed(() => {
-  const visibleTabs = filteredTabs.value;
-  return visibleTabs
-    .filter(tab => tab.name !== 'all' && tab.name !== 'myTickets' && tab.value !== undefined)
-    .map(tab => String(tab.value));
-});
-const stepStatusList = computed(() => {
-  return stepInfos.value.map(step => String(step.status))
-})
-const showIsReviewText = computed(() => (row) => {
-  if (['4'].includes(String(row.status))) return row.isReview === 1 ? '是' : '否'
-  return '/'
-})
-const popupShowImage = computed(() => (list) => {
-  return list.map(item => ({
-    ...item,
-    url: getShowImg(item.url),
-  }))
-})
-// 方法
-function validData(value, defaultValue) {
-  return value !== undefined ? value : defaultValue
-}
-// 获取表格数据
-async function fetchTableData() {
-  if (isFetching.value) return
-  isFetching.value = true
-  loading.value = true
-  const statusListVal = statusList.value;
-  try {
-    const currentTab = tabs.value.find(tab => tab.name === activeTab.value)
-    const params = {
-      ai_types: filters.type || undefined,
-      status: currentTab?.name === 'myTickets'
-        ? undefined
-        : filters.status !== ''
-        ? Number(filters.status)
-        : currentTab?.value,
-      event_name: filters.keyword || undefined,
-      dept_id: filters.department || undefined,
-      start_date: filters.dateRange?.[0]
-        ? formatDate(filters.dateRange[0])
-        : undefined,
-      end_date: filters.dateRange?.[1]
-        ? formatDate(filters.dateRange[1]).replace('00:00:00', '23:59:59')
-        : undefined,
-      current: Number(page.currentPage),
-      size: Number(page.pageSize),
-      ai_type: filters.algorithm || undefined,
-      is_draft: currentTab?.name === 'myTickets' ? 1 : undefined,
-      user_id: currentTab?.name === 'myTickets' ? userInfo.value.user_id : undefined,
-      is_review: filters.isReview === '' ? undefined : filters.isReview,
-      source: 1,
-      status_list:currentTab?.name !== 'myTickets'?  statusListVal : undefined,
-      device_sn:filters.device_sn,
-		  work_types: ALL_WORK_ORDER_TYPE_OPTIONS
-    }
-
-    const response = await getList(params)
-    if (!response?.data?.data?.records) {
-      throw new Error('接口返回数据格式不正确')
-    }
-    const { total, records } = response.data.data
-    let filteredRecords = records
-    tableData.value = filteredRecords.map(item => {
-      const longitude = Number(item.longitude) || 0
-      const latitude = Number(item.latitude) || 0
-      const matchedMachine = machineData.value.find(m => m.device_sn === item.device_sn);
-      const deviceNickname = matchedMachine?.nickname || ''
-      return {
-        id: item.id,
-        orderNumber: item.event_num,
-        orderName: item.event_name,
-        department: departments.value.find(d => d.value === item.dept_id)?.label || item.dept_name,
-        startTime: item.job_create_time || '/',
-        aiType: item.ai_types,
-        content: item.content,
-        type: item.work_order_type_dict_key,
-        keyData: !isNaN(longitude) && !isNaN(latitude)
-          ? `${longitude.toFixed(6)}, ${latitude.toFixed(6)}`
-          : '未知位置',
-        address: item.address,
-        creator: item.event_num?.slice(0, 2) === 'AI' ? '智飞agent' : item.create_user,
-        handler: item.update_user || '未分配',
-        status: Number(item.status || 0),
-        photo_url: item.photo_url || '',
-        video_url: item.video_url || '',
-        location: !isNaN(longitude) && !isNaN(latitude) ? [longitude, latitude] : null,
-        processing_details: item.processing_details || '',
-        update_photo_url: item.update_photo_url || '',
-        work_type: item.work_type !== undefined ? Number(item.work_type) : 0,
-        job_name: item.job_name || '',
-        job_create_time: item.job_create_time || '',
-        isReview: item.is_review,
-        handle_user_id:item.handle_user_id,
-        dataSources:item.work_type === '0' ? '巡检任务' :
-              item.work_type === '1' ? '人工上报' :
-              item.work_type === '2' ? '识别分析' :
-                  item.work_type === '3' ? '变化检测' :
-                  '',
-        device_names:deviceNickname ? deviceNickname :''
-
-      }
-
-    })
-
-    page.total = total || 0
-    if (isShowInfo.value) {
-      handleViewDetail(firstRowData.value)
-      isShowInfo.value = false
-    }
-    await fetchTabCounts()
-  } catch (error) {
-    console.error('获取数据失败:', error)
-    tableData.value = []
-    page.total = 0
-  } finally {
-    loading.value = false
-    isFetching.value = false
-  }
-}
-// 获取工单类型标签
-function getTypeLabel(typeValue) {
-  const typeObj = types.value.find(item => item.value === typeValue)
-  return typeObj ? typeObj.label : typeValue
-}
-function handleCheck(data, { checkedKeys: keys, checkedNodes }) {
-  checkedKeys.value = keys
-  const selectedDictKeys = checkedNodes.map(node => node.dictKey).filter(Boolean)
-  filters.type = selectedDictKeys
-  fetchTableData()
-}
-// 算法
-function getAlgorithmList() {
-  getSFDictionaryTree({ code: 'SF' }).then(res => {
-    if (res.data.code === 200) {
-      const result = res.data.data[0].children
-      const filteredData = result.map(item => {
-        const children = item.children?.map(child => ({
-          ...child,
-          children: [],
-        }))
-        return {
-          ...item,
-          children: children || [],
-        }
-      })
-      dataList.value = filteredData
-
-    }
-  })
-}
-function handleSFNodeClick(data) {
-  filters.type = ''
-  filters.algorithm = ''
-  filters.type = data.dictKey
-  fetchTableData()
-}
-function handleClear() {
-  dictKey.value = ''
-  filters.algorithm = ''
-  filters.type = ''
-  fetchTableData()
-}
-// 上一项
-function handlePrevItem() {
-  currentIndex.value = Math.max(0, currentIndex.value - 1)
-  updateCurrentDetail()
-}
-
-// 下一项
-function handleNextItem() {
-  currentIndex.value = Math.min(tableData.value.length - 1, currentIndex.value + 1)
-  updateCurrentDetail()
-}
-
-// 更新当前详情
-function updateCurrentDetail() {
-  currentDetail.value = tableData.value[currentIndex.value]
-  currentDetail.value.mediaUrl = currentDetail.value.photo_url
-  currentDetail.value.updatePhotoUrl = currentDetail.value.update_photo_url
-  currentDetail.value.processingDetail = currentDetail.value.processing_details
-  currentDetail.value.showQR = false
-  currentDetail.value.latAndLon = _.round(currentDetail.value.location[0], 6) + ',' + _.round(currentDetail.value.location[1], 6)
-  getStepInfoData(currentDetail.value.orderNumber)
-}
-
-// 更新当前详情数据
-function handleCurrentDetailUpdate(updatedDetail) {
-  currentDetail.value = updatedDetail
-}
-// 受理并派发
-function handleApproveAndDispatch(detail) {
-if(!detail.orderName){
-   ElMessage.warning('请填写工单名称');
-      return;
-}
-if(!detail.aiType){
-   ElMessage.warning('请选择关联算法');
-      return;
-}
-
-if(!detail.content){
-   ElMessage.warning('请填写工单内容');
-      return;
-}
-  currentDetail.value = detail
-  dispatchDialogVisible.value = true
-}
-async function loadAMapScripts() {
-  try {
-    const areaCode = userInfo.value.detail.areaCode
-    const subAreaCode = areaCode ? areaCode.substring(0, 6) : ''
-    const adcodeObj = getAdcodeObj(geoJson, 'adcode', subAreaCode)
-
-    const center = adcodeObj?.payload?.objects?.collection?.geometries?.[0]?.properties?.center
-
-    if (Array.isArray(center) && center.length === 2) {
-      inputMapShowDefaultCenter.value = center
-    } else {
-      const bbox = adcodeObj?.payload?.bbox
-      if (Array.isArray(bbox) && bbox.length === 4) {
-        const centerX = (bbox[0] + bbox[2]) / 2
-        const centerY = (bbox[1] + bbox[3]) / 2
-        inputMapShowDefaultCenter.value = [centerX, centerY]
-      } else {
-        inputMapShowDefaultCenter.value = [115.861365, 28.621311]
-      }
-    }
-    mapParams.center = [...inputMapShowDefaultCenter.value]
-    mapLoaded.value = true
-  } catch (error) {
-    console.error('地图加载失败:', error)
-  }
-}
-async function fetchDropdownData() {
-  try {
-    const response = await getTicketInfo()
-    const { dept_data, event_type, ai_type, info } = response.data.data
-    departments.value = dept_data.map(item => ({
-      label: item.dept_name,
-      value: item.id,
-    }))
-
-    departmentUsers.value = dept_data.reduce((acc, dept) => {
-      acc[dept.id] = dept.user_data || []
-      return acc
-    }, {})
-
-    types.value = Object.entries(event_type).map(([key, value]) => ({
-      label: value,
-      value: key,
-    }))
-    allAlgorithms.value = info
-
-    algorithms.value = ai_type?.map(item => ({
-      dict_key: item.dict_key,
-      dict_value: item.dict_value,
-      label: item.dict_value,
-      value: item.dict_key,
-    })) || []
-
-    algorithms2.value = _.cloneDeep(algorithms.value)
-
-    userNameToIdMap.value = {}
-    dept_data.forEach(dept => {
-      (dept.user_data || []).forEach(user => {
-        userNameToIdMap.value[user.name] = user.id
-      })
-    })
-  } catch (error) {
-    console.error('加载下拉框数据失败:', error)
-  }
-}
-
-function handleTypeChange(typeValue) {
-  if (!typeValue) {
-    algorithms2.value = []
-    return
-  }
-  const matchedCategory = allAlgorithms.value.find(category => category.dict_key === typeValue)
-  if (!matchedCategory || !matchedCategory.algorithms || matchedCategory.algorithms.length === 0) {
-    algorithms2.value = []
-    return
-  }
-  algorithms2.value = matchedCategory.algorithms.map(algo => ({
-    label: algo.dict_value,
-    value: algo.dict_key,
-    dict_key: algo.dict_key,
-    dict_value: algo.dict_value,
-  }))
-}
-function formatDate(date) {
-  if (!date) return undefined
-  const d = new Date(date)
-  return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(
-    d.getDate()
-  ).padStart(2, '0')} 00:00:00`
-}
-
-function mapStatus(status) {
-  const statusTextMap = {
-
-    2: '待审核',
-    0: '待处理',
-    3: '处理中',
-    4: '已完成',
-  }
-  return statusTextMap[status] || '未知状态'
-}
-function getStatusTagType(status) {
-  if (status === -1 || status === '-1') return ''
-  const colorMap = {
-    0: '#FF7411',
-    3: '#FFC300',
-    2: '#FF472F',
-    4: '#0291A1',
-  }
-  return colorMap[String(status)] || ''
-}
-// 获取tab数据
-async function fetchTabCounts() {
- const statusListVal = statusList.value;
-  const params = {
-    status_list: statusListVal,
-    work_types: ALL_WORK_ORDER_TYPE_OPTIONS
-  }
-  try {
-    const response = await getstatusCount(params)
-    const statusCount = response.data.data || {}
-  	const totalCount = Object.entries(statusCount).reduce((sum, [key, count]) => {
-			if (key === '6') return sum
-			return sum + (count || 0)
-		}, 0)
-    tabs.value.forEach(tab => {
-      if (tab.name === 'all') {
-        tab.count = totalCount
-      } else if (tab.name === 'myTickets') {
-        tab.count = 0
-      } else {
-        tab.count = statusCount[String(tab.value)] || 0
-      }
-    })
-  } catch (error) {
-    console.error('获取标签页计数失败:', error)
-    tabs.value.forEach(tab => {
-      tab.count = 0
-    })
-  }
-}
-
-function handleTabChange(tab) {
-  activeTab.value = tab.props?.name || tab.name
-  fetchTabCounts()
-  handleReset()
-  page.currentPage = 1
-  fetchTableData()
-}
-
-// 跳转后触发的Tab切换
-function handleTabChangeAfterJump() {
-  // handleReset()
-  page.currentPage = 1
-  handleSearch()
-  fetchTableData()
-  fetchTabCounts()
-}
-function handleSearch() {
-  page.currentPage = 1
-  fetchTableData()
-  fetchTabCounts()
-}
-function handleReset() {
-  dictKey.value = ''
-  Object.assign(filters, {
-    keyword: '',
-    department: '',
-    type: '',
-    dateRange: [],
-    status: '',
-    algorithm: '',
-    isReview: '',
-    device_sn:''
-  })
-  page.currentPage = 1
-  router.replace({})
-  fetchTableData()
-}
-
-function handleKeyWords() {
-  router.replace({})
-}
-
-// 分页
-async function handleCurrentChange(val) {
-  page.currentPage = val
-  await nextTick()
-  await fetchTableData()
-}
-
-async function sizeChange(val) {
-  page.pageSize = val
-  page.currentPage = 1
-  await nextTick()
-  await fetchTableData()
-}
-
-function handleAdd() {
-  editFormData.value = null
-  dialogVisible.value = true
-}
-
-async function getStepInfoData(val) {
-    const orderNum = val
-    const stepResponse = await getStepInfo(orderNum)
-    const steps = Array.isArray(stepResponse.data.data)
-      ? stepResponse.data.data
-      : stepResponse.data.data?.steps || []
-    const finishedStep = steps.find(s => String(s.status) === '4')
-    totalTime.value = finishedStep && finishedStep.total_time ? finishedStep.total_time : ''
-      stepInfos.value = steps.map(step => ({
-        status: String(step.status),
-        name: step.name,
-        time: step.time,
-        create_time: step.create_time,
-      }))
-}
-// 详情
-async function handleViewDetail(row) {
-console.log('row',row);
-
-  currentIndex.value = tableData.value.findIndex(item => item.id === row.id)
-  workType.value = row.work_type !== undefined ? Number(row.work_type) : 0
-  const detailData = {
-    ...row,
-    processingDetail: row.processing_details || '',
-    mediaUrl: row.photo_url || row.video_url || '',
-    updatePhotoUrl: row.update_photo_url || '',
-    photos: [],
-    job_name: row.job_name || '',
-  }
-
-  await getStepInfoData(row.orderNumber)
-  currentDetail.value.status = row.status
-
-  currentDetail.value = {
-    ...detailData,
-    showQR: false,
-    latAndLon: _.round(detailData.location[0], 6) + ',' + _.round(detailData.location[1], 6),
-  }
-// console.log('currentDetail.value',currentDetail.value);
-
-  detailVisible.value = true
-  handleTypeChange(currentDetail.value.type)
-}
-
-// 详情成功回调
-function handleDetailSuccess() {
-  fetchTableData()
-}
-
-// 详情错误回调
-function handleDetailError(error) {
-  console.error('工单操作失败:', error)
-}
-
-function refreshChange() {
-  if (isFetching.value) return
-  fetchTableData()
-}
-
-function onLoad() {
-  if (isFetching.value) return
-  fetchTableData()
-}
-// 导出数据
-async function exportData() {
-  try {
-    loading.value = true
-    let exportData = []
-
-    if (selections.value.length > 0) {
-      exportData = selections.value.map(item => formatExportItem(item))
-    } else {
-      exportData = tableData.value.map(item => formatExportItem(item))
-    }
-
-    if (exportData.length === 0) {
-      console.warn('没有数据可供导出')
-      ElMessage.warning('没有数据可供导出');
-      return
-    }
-
-    const headers = [
-      '工单编号',
-      '工单名称',
-      '所属部门',
-      '发起时间',
-      '关联算法',
-      '工单内容',
-      '工单类型',
-      '经纬度',
-      '创建人',
-      '处理人',
-      '工单状态',
-    ]
-
-    export_json_to_excel(headers, exportData, '工单数据')
-  } catch (error) {
-    console.error('导出失败:', error)
-  } finally {
-    loading.value = false
-  }
-}
-
-function formatExportItem(item) {
-  const longitude = Number(item.longitude) || Number(item.location?.[0]) || 0
-  const latitude = Number(item.latitude) || Number(item.location?.[1]) || 0
-
-  return {
-    工单编号: item.orderNumber || item.event_num || '',
-    工单名称: item.orderName || item.event_name || '',
-    所属部门: item.department || item.dept_name || '',
-    发起时间: item.startTime || item.create_time || '',
-    关联算法: item.aiType || item.ai_types || '',
-    工单内容: item.address || item.content || '',
-    工单类型: types.value.find(t => t.value === (item.type || item.work_order_type_dict_key))?.label || '',
-    经纬度: !isNaN(longitude) && !isNaN(latitude)
-      ? `${longitude.toFixed(6)}, ${latitude.toFixed(6)}`
-      : '',
-    创建人: item.creator || item.create_user || '',
-    处理人: item.handler || item.update_user || '',
-    工单状态: mapStatus(Number(item.status || 0)),
-  }
-}
-// 派发成功回调
-function handleDispatchSuccess() {
-  detailVisible.value = false
-  fetchTableData()
-}
-// 派发错误回调
-function handleDispatchError(error) {
-  console.error('派发失败:', error)
-}
-// 编辑工单
-function handleEdit(row) {
-  editFormData.value = row
-  dialogVisible.value = true
-}
-
-// 创建成功回调
-function handleCreateSuccess() {
-  fetchTableData()
-}
-
-// 草稿保存成功回调
-function handleDraftSuccess() {
-  fetchTableData()
-}
-
-// 创建失败回调
-function handleCreateError(error) {
-  console.error('工单操作失败:', error)
-}
-
-// 删除方法
-function handleDelete(row) {
-
-}
-
-// 添加选择变化处理方法
-function handleSelectionChange(selection) {
-  selections.value = selection
-}
-
-// 打开审核对话框
-function openReviewDialog() {
-  if (selections.value.length === 0) {
-       ElMessage.warning('请先选择要审核的工单');
-    return
-  }
-  currentImageIndex.value = 1
-  updateCurrentReviewImage()
-  reviewDialogVisible.value = true
-}
-
-// 更新当前审核图片
-function updateCurrentReviewImage() {
-  if (!selections.value || selections.value.length === 0) {
-    currentReviewImage.value = ''
-    currentImageIndex.value = 1
-    return
-  }
-  if (currentImageIndex.value > selections.value.length) {
-    currentImageIndex.value = selections.value.length
-  }
-  if (currentImageIndex.value < 1) {
-    currentImageIndex.value = 1
-  }
-  const index = currentImageIndex.value - 1
-  if (index >= 0 && index < selections.value.length) {
-    const currentItem = selections.value[index]
-    currentReviewImage.value = currentItem.photo_url || ''
-  } else {
-    currentReviewImage.value = ''
-  }
-}
-
-// 处理图片分页变化
-function handleImagePageChange(page) {
-  if (page > 0 && page <= selections.value.length) {
-    currentImageIndex.value = page
-    updateCurrentReviewImage()
-  }
-}
-
-// 批量审核通过
-async function handleBatchApprove() {
-  try {
-    if (selections.value.length === 0) {
-      console.warn('没有选中的工单')
-      return
-    }
-
-    const currentItem = selections.value[currentImageIndex.value - 1]
-    if (!currentItem) {
-      console.warn('当前工单数据无效')
-      return
-    }
-
-    // 在Vue 3中需要使用ElMessageBox.confirm
-
-    const data = {
-      id: currentItem.id,
-      status: currentItem.status,
-      isPass: 0,
-      eventNum: currentItem.orderNumber,
-    }
-
-    const response = await flowEvent(data)
-    if (response.data.code === 0) {
-
-
-      const newSelections = [...selections.value]
-      newSelections.splice(currentImageIndex.value - 1, 1)
-
-      if (newSelections.length > 0) {
-        if (currentImageIndex.value > selections.value.length) {
-          currentImageIndex.value = selections.value.length
-        }
-        updateCurrentReviewImage()
-      } else {
-        reviewDialogVisible.value = false
-        currentImageIndex.value = 1
-        currentReviewImage.value = ''
-        fetchTableData()
-      }
-
-      selections.value = newSelections
-    } else {
-      throw new Error(response.data.msg || '审核失败')
-    }
-  } catch (error) {
-    console.error('审核失败:', error)
-  }
-}
-
-function cancleBatchReject() {
-  reviewDialogVisible.value = false
-  selections.value = []
-  currentImageIndex.value = 1
-  currentReviewImage.value = ''
-  fetchTableData()
-}
-
-// 批量审核不通过
-async function handleBatchReject() {
-  try {
-    if (selections.value.length === 0) {
-      console.warn('没有选中的工单')
-      return
-    }
-
-    const currentItem = selections.value[currentImageIndex.value - 1]
-    if (!currentItem) {
-      console.warn('当前工单数据无效')
-      return
-    }
-
-    // 在Vue 3中需要使用ElMessageBox.confirm
-    const data = {
-      id: currentItem.id,
-      status: currentItem.status,
-      isPass: 1,
-      eventNum: currentItem.orderNumber,
-      eventName: currentItem.orderName,
-    }
-
-    const response = await flowEvent(data)
-    if (response.data.code === 0) {
-
-
-      const newSelections = [...selections.value]
-      newSelections.splice(currentImageIndex.value - 1, 1)
-      selections.value = newSelections
-
-      if (selections.value.length > 0) {
-        if (currentImageIndex.value > selections.value.length) {
-          currentImageIndex.value = selections.value.length
-        }
-        updateCurrentReviewImage()
-      } else {
-        reviewDialogVisible.value = false
-        currentImageIndex.value = 1
-        currentReviewImage.value = ''
-        fetchTableData()
-      }
-    } else {
-      throw new Error(response.data.msg || '驳回失败')
-    }
-  } catch (error) {
-    console.error('驳回失败:', error)
-  }
-}
-
-// 获取所有图片列表用于预览
-function getImageList() {
-  return selections.value.map(item => getPreviewUrl(item.photo_url)).filter(url => url)
-}
-
-// 处理上一张图片
-function handlePrevImage() {
-  if (currentImageIndex.value > 1) {
-    currentImageIndex.value--
-    updateCurrentReviewImage()
-  }
-}
-
-// 处理下一张图片
-function handleNextImage() {
-  if (currentImageIndex.value < selections.value.length) {
-    currentImageIndex.value++
-    updateCurrentReviewImage()
-  }
-}
-
-/**
- * 获取缩略图地址
- */
-function getThumbUrl(url) {
-  if (!url) return ''
-  const lastDot = url.lastIndexOf('.')
-  if (lastDot === -1) return url
-  return url.slice(0, lastDot) + '_small' + url.slice(lastDot)
-}
-
-// 获取预览图地址
-function getPreviewUrl(url) {
-  if (!url) return ''
-  const lastDot = url.lastIndexOf('.')
-  if (lastDot === -1) return url
-  return url.slice(0, lastDot) + '_show' + url.slice(lastDot)
-}
-
-/**
- * 坐标转换方法处理
- */
-function disposeLocation(goWgs84 = false, data) {
-  let lng = ''
-  let lat = ''
-
-  if (Array.isArray(data.location) && data.location.length > 0) {
-    if (goWgs84) {
-      lng = data.location?.[0] ? String(data.location[0]) : undefined
-      lat = data.location?.[1] ? String(data.location[1]) : undefined
-
-      if (lng && lat) {
-        [lng, lat] = gcj02ToWgs84(Number(lng), Number(lat))
-      }
-    } else {
-      lng = Number(data.location[0])
-      lat = Number(data.location[1])
-
-      if (lng && lat) {
-        [lng, lat] = wgs84ToGcj02(Number(lng), Number(lat))
-      }
-    }
-  }
-
-  return [String(lng), String(lat)]
-}
-
-// 复核按钮
-function reCheck(row) {
-  reCheckData.value = row
-  reCheckDialog.value = true
-}
-
-// 复核成功回调
-function handleRecheckSuccess() {
-  page.currentPage = 1
-  fetchTableData()
-  fetchTabCounts()
-}
-
-// 导出工单报表
-function exportTheTick(row) {
-  const params = {
-    num: row.orderNumber
-  }
-  exportTheTicket(params).then(res => {
-    const elink = document.createElement('a')
-    elink.download = row.orderName + '.docx'
-    elink.style.display = 'none'
-    const blob = new Blob([res.data])
-    elink.href = URL.createObjectURL(blob)
-    document.body.appendChild(elink)
-    elink.click()
-    document.body.removeChild(elink)
-  })
-
-}
-
-// 生命周期
-onMounted(() => {
-  handleNodeClick()
-  inputMapShowDefaultCenter.value = null
-  loadAMapScripts()
-  fetchDropdownData()
-  getAlgorithmList()
- // 设置默认activeTab
-  activeTab.value = defaultActiveTab.value
- const href = window.location.href;
-  if (route?.query?.status !== undefined && route?.query?.status !== null) {
-    filters.status = route?.query?.status + ''
-    router.replace({})
-  }
-
-  let curQueryParams = {}
-
-  if (href?.indexOf('?') != -1 && href?.split('?').length > 0) {
-    curQueryParams = href
-      .split('?')[1]
-      .split('&')
-      .reduce((pre, cur) => {
-        let newArr = cur.split('=')
-        pre[newArr[0]] = newArr[1]
-        return pre
-      }, {})
-
-    const { orderNumber = undefined, day = undefined, tab = undefined,enumerateDates=undefined } = curQueryParams
-
-    if (day) {
-      const date = new Date(day + 'T00:00:00+08:00')
-      const dateArray = [date, date]
-      const handler = {
-        get(target, prop) {
-          if (typeof prop === 'string' && /^\d+$/.test(prop)) {
-            const index = parseInt(prop)
-            const dateObj = target[index]
-            return dateObj.toDateString() + ' 00:00:00 GMT+0800 (中国标准时间)'
-          }
-          return Reflect.get(target, prop)
-        },
-      }
-
-      const proxyArray = new Proxy(dateArray, handler)
-      filters.dateRange = proxyArray
-    }
-
-    if (orderNumber) {
-      filters.keyword = orderNumber
-      nextTick(() => {
-        isShowInfo.value = true
-        const find = store.state.tags.bsTagList.find(i => i.path === '/tickets/ticket')
-        if (find) {
-          find.query = {}
-        }
-      })
-    }
-
-    if (tab) {
-   
-       if(enumerateDates === 'CURRENT_WEEK') {
-        filters.dateRange = [...dateRanges['week']]
-      } else if(enumerateDates === 'CURRENT_MONTH') {
-        filters.dateRange = [...dateRanges['month']]
-      } else {
-        filters.dateRange = [...dateRanges['year']]
-      }
-      const isTabValid = filteredTabs.value.some(t => t.name === tab)
-      if (isTabValid) {
-        activeTab.value = tab
-        handleTabChangeAfterJump()
-        const find = store.state.tags.bsTagList.find(i => i.path === '/tickets/ticket')
-        if (find) {
-          find.query = {}
-        }
-      }
-    }
-  }
-
-  fetchTabCounts()
-  fetchTableData()
-})
-
-onActivated(() => {
-  handleReset()
-})
-</script>
-
-<style lang="scss" scoped>
-.searchBox {
-  display: flex;
-  align-items: center;
-  flex-wrap: wrap;
-  margin-bottom: 15px;
-  gap: 15px 15px;
-
-  :deep() {
-    .el-form-item__label {
-      width: 80px;
-    }
-    .el-form-item {
-      width: 350px;
-      margin-bottom: 0 !important;
-      margin-right: 20px !important;
-      .el-form-item__label {
-        color: #363636;
-        line-height: 32px;
-      }
-      // .el-form-item__content{
-      //   width: 280px;
-      // }
-    }
-  }
-  .btnGroup {
-    display: flex;
-    align-items: center;
-  }
-}
-.el-card__body {
-height: 100%;}
-.titketBox {
-
-  flex: 1;
-  display: flex;
-  flex-direction: column;
-}
-.dataTable {
-    // height: 0;
-    // flex: 1;
-     height: calc(100vh - 374px);
-     :deep(.el-scrollbar__view) {
-      height: 100%;
-    }
-    :deep(.el-table--fit,.el-scrollbar__view) {
-      height: 100%;
-    }
-}
-
-.pagination {
-  display: flex;
-  justify-content: flex-end;
-  margin-top: 20px;
-  position: fixed;
-  bottom: 20px;
-  left: 0;
-  right: 0;
-  padding: 0 30px;
-
-  z-index: 1000;
-}
-:deep(.custom-header th.el-table__cell) {
-  color: rgba(0, 0, 0, 0.85);
-  background: #fafafa;
-  height: 55px !important;
-}
-/* 表格操作区域样式 */
-.table-operations {
-  margin-bottom: 16px;
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.left-operations {
-  display: flex;
-  gap: 8px;
-}
-
-/* 表格样式 */
-.ztzf-public-general-el-table {
-  margin-bottom: 16px;
-}
-
-/* 分页样式 */
-.table-pagination {
-  display: flex;
-  justify-content: flex-end;
-  margin-top: 10px;
-}
-.ztzf-public-general-el-table {
-  :deep(.el-table__header-wrapper) {
-    background-color: #f5f7fa;
-  }
-
-  :deep(.el-table th) {
-    background-color: #f5f7fa;
-    color: #606266;
-    font-weight: 600;
-  }
-
-  :deep(.el-table--border) {
-    border: 1px solid #ebeef5;
-  }
-
-  :deep(.el-table__empty-block) {
-    height: calc(100vh - 400px) !important;
-  }
-}
-::v-deep(.el-tabs) {
-  height: 100%;
-  display: flex;
-  flex-direction: column;
-
-  .el-tabs__header {
-    order: 1;
-  }
-
-  .el-tabs__content {
-    order: 2;
-  }
-
-  .el-tabs__content {
-    height: 0;
-    flex: 1;
-    display: flex;
-    flex-direction: column;
-
-    .el-tab-pane {
-      height: 0;
-      flex: 1;
-      display: flex;
-      flex-direction: column;
-    }
-  }
-}
-
-.filter-bar {
-  display: flex;
-  align-items: center;
-  margin-bottom: 15px;
-  flex-wrap: wrap;
-  gap: 8px; // 使用 gap 统一设置间距
-
-  .filter-item {
-    width: 280px; // 减小宽度
-  }
-
-  .date-picker {
-    // width: 240px; // 日期选择器宽度适当调整
-  }
-
-  .el-button {
-    margin-left: 0; // 覆盖 element-ui 默认的按钮间距
-  }
-}
-
-.uploadImg {
-  margin-bottom: 32px;
-}
-
-
-.action-bar {
-  margin-bottom: 16px;
-}
-
-.el-dialog {
-  .el-form-item {
-    margin-bottom: 20px;
-  }
-}
-
-.el-upload {
-  width: 100%;
-  display: flex;
-  flex-wrap: wrap;
-
-  :deep(.el-upload-list__item) {
-    transition: all 0.3s ease;
-  }
-
-  :deep(.el-upload-list__item:hover) {
-    background-color: #f5f7fa;
-  }
-}
-
-.el-upload__tip {
-  font-size: 12px;
-  color: #909399;
-  margin-top: 12px;
-}
-
-.create-ticket-form {
-  padding: 20px 10px;
-
-  .form-section {
-    background-color: #fff;
-    border-radius: 4px;
-
-    .el-row {
-      margin-bottom: 16px;
-
-      &:last-child {
-        margin-bottom: 0;
-      }
-    }
-  }
-
-  .location-wrapper {
-    width: 100%; // 修改为100%以适应父容器
-    height: auto; // 修改为auto以自适应内容
-
-    .map-button {
-      width: 100%; // 让按钮填满容器宽度
-      height: 36px; // 与其他输入框保持一致的高度
-      display: flex;
-      align-items: center;
-      justify-content: center;
-
-      i {
-        margin-right: 4px;
-      }
-    }
-
-    .location-text {
-      margin-top: 8px;
-      padding: 8px 12px;
-      background-color: #f5f7fa;
-      border-radius: 4px;
-      color: #606266;
-      font-size: 13px;
-      line-height: 1.4;
-    }
-  }
-
-  .upload-wrapper {
-    .uploader {
-      :deep(.el-upload--picture-card) {
-        width: 120px;
-        height: 100px;
-        line-height: 128px;
-      }
-
-      :deep(.el-upload-list__item) {
-        width: 120px;
-        height: 120px;
-      }
-    }
-
-    .upload-tip {
-      font-size: 12px;
-      color: #909399;
-      line-height: 1.4;
-      margin-top: 8px;
-    }
-  }
-
-  .el-form-item {
-    margin-bottom: 18px;
-
-    &:last-child {
-      margin-bottom: 0;
-    }
-  }
-
-  :deep(.el-form-item__label) {
-    font-weight: 500;
-    color: #606266;
-  }
-
-  // :deep(.el-input__inner) {
-  //   height: 36px;
-  //   line-height: 36px;
-  // }
-
-  :deep(.el-textarea__inner) {
-    padding: 8px 12px;
-  }
-
-  // :deep(.el-input__inner),
-  // :deep(.el-select),
-  // :deep(.el-select .el-input) {
-  //   width: 100%; // 确保所有输入框和选择框宽度一致
-  // }
-
-  .full-width {
-    width: 100%;
-  }
-}
-
-:deep(.el-dialog__body) {
-  border-top: 0.1rem solid #f0f0f0;
-}
-
-.dialog-footer-new {
-  text-align: right;
-  padding-top: 16px;
-  border-top: 1px solid #ebeef5;
-
-  .el-button + .el-button {
-    margin-left: 12px;
-  }
-
-  .el-button {
-    padding: 9px 20px;
-
-    &:last-child {
-      margin-left: 12px;
-    }
-  }
-}
-
-.dialog-footer1-new {
-  position: sticky;
-  bottom: 28px;
-  left: 0;
-  right: 0;
-  background: white;
-  z-index: 10;
-  padding: 16px 20px;
-  border-top: 1px solid #ebeef5;
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-
-  .el-button + .el-button {
-    margin-left: 12px;
-  }
-
-  .btngroups {
-    margin-left: 12px;
-  }
-
-  .el-button {
-    padding: 9px 20px;
-
-    &:last-child {
-      margin-left: 12px;
-      margin-right: 12px;
-    }
-  }
-}
-
-.map-container {
-  width: 100%;
-  height: 400px;
-  margin-bottom: 15px;
-  border: 1px solid #dcdfe6;
-  border-radius: 4px;
-  overflow: hidden;
-
-  :deep(.el-input-map) {
-    height: 100%;
-  }
-}
-
-.location-info {
-  margin-top: 10px;
-  padding: 10px;
-  background-color: #f5f7fa;
-  border-radius: 4px;
-
-  p {
-    margin: 5px 0;
-    color: #606266;
-    font-size: 14px;
-  }
-}
-
-.map-select {
-  display: flex;
-  align-items: flex-start;
-  gap: 15px;
-
-  .selected-location {
-    flex: 1;
-    padding: 5px 10px;
-    background-color: #f5f7fa;
-    border-radius: 4px;
-
-    p {
-      margin: 5px 0;
-      color: #606266;
-      font-size: 14px;
-    }
-  }
-}
-
-.preview-image {
-  border-radius: 4px;
-  overflow: hidden;
-  background-color: #f5f7fa;
-}
-
-.image-placeholder,
-.image-error,
-.no-media {
-  height: 200px;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  color: #909399;
-  background-color: #f5f7fa;
-  border-radius: 4px;
-
-  i {
-    font-size: 32px;
-    margin-bottom: 8px;
-  }
-}
-
-.no-media {
-  border: 1px dashed #d9d9d9;
-}
-
-.detail-container {
-  padding: 0 20px;
-
-  .detail-top-title {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-
-    .event-orderNumber {
-      margin-right: 10px;
-    }
-  }
-}
-
-.status-flow {
-  margin-bottom: 20px;
-
-  .custom-steps {
-    .el-step__description {
-      position: relative;
-      margin: 0;
-      padding: 0;
-    }
-
-    // 添加发起任务步骤的特殊样式
-    .init-step-info {
-      display: flex;
-      flex-direction: column;
-      align-items: center;
-      text-align: center;
-      width: 130px;
-
-      .creator-name {
-        font-size: 14px;
-        font-weight: bold;
-        color: #303133;
-        margin-bottom: 4px;
-      }
-
-      .create-time {
-        font-size: 10px;
-        color: #909399;
-      }
-    }
-
-    // 保持其他步骤的原有样式
-    .step-info {
-      display: flex;
-      margin: 0;
-      padding: 0;
-      justify-content: space-between;
-      align-items: center;
-      width: 200px;
-
-      .process-time {
-        font-size: 10px;
-        color: #909399;
-        text-align: left;
-        margin-left: -50%;
-        padding-left: 0%;
-        flex: 1;
-      }
-
-      .handler-name {
-        font-size: 14px;
-        font-weight: bold;
-        color: #303133;
-        text-align: left;
-        flex: 1;
-      }
-    }
-  }
-}
-
-.basic-info {
-  margin-bottom: 20px;
-}
-
-.media-section {
-  // margin-bottom: 20px;
-
-  .el-row {
-    display: flex;
-    align-items: center;
-  }
-}
-
-.leftBtn {
-  width: 70px;
-  height: 32px;
-  background-color: #999;
-  border-radius: 5px;
-  text-align: center;
-  line-height: 32px;
-  color: #fff;
-  cursor: pointer;
-  opacity: 0.8;
-}
-
-.disableds {
-  background: #999 !important;
-  cursor: not-allowed !important;
-  pointer-events: none;
-  opacity: 0.3 !important;
-}
-
-.PopUpTableScrolls {
-  max-height: 600px;
-  overflow-y: scroll;
-  overflow-x: hidden;
-}
-
-.media-box {
-  width: 100%;
-  border: 1px solid #dcdfe6;
-  border-radius: 4px;
-  padding: 10px;
-  background: #fff;
-  box-sizing: border-box;
-
-  .media-title {
-    font-weight: bold;
-    margin-bottom: 5px;
-    display: flex;
-    align-items: center;
-
-    .QRCodeImg {
-      width: 18px;
-      height: 18px;
-      cursor: pointer;
-      padding-bottom: 1px;
-    }
-  }
-
-  .media-content {
-    position: relative;
-    height: 500px;
-
-    :deep(.el-image) {
-      width: 100% !important;
-      max-width: 100%;
-      max-height: 100%;
-
-      .el-image__inner {
-        width: 100%;
-        height: 100%;
-        object-fit: cover !important;
-      }
-    }
-  }
-}
-
-.image-placeholder,
-.image-error,
-.no-media {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  height: 100%;
-  color: #909399;
-  background-color: #f5f7fa;
-  border-radius: 4px;
-}
-
-.image-placeholder i,
-.image-error i {
-  font-size: 32px;
-  margin-bottom: 8px;
-}
-
-.no-media {
-  border: 1px dashed #d9d9d9;
-}
-
-.info-table {
-  margin-bottom: 20px;
-}
-
-.info-item {
-  display: flex;
-  margin-bottom: 10px;
-}
-
-.info-label {
-  font-weight: bold;
-  width: 120px;
-  color: #606266;
-}
-
-.info-value {
-  flex: 1;
-  color: #303133;
-  word-break: break-word;
-}
-
-
-
-// 添加删除按钮样式
-.danger-button {
-  color: #f56c6c;
-}
-
-.danger-button:hover {
-  color: #f78989;
-}
-
-.custom-steps-container {
-  width: 100%;
-  margin: 10px 0;
-}
-
-.steps-titles {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 14px;
-  position: relative;
-}
-
-.step-title {
-  text-align: center;
-  flex: 1;
-  font-size: 14px;
-  color: #999;
-  position: relative;
-  padding-bottom: 5px;
-}
-
-.step-title.active {
-  color: #409eff;
-  font-weight: bold;
-}
-
-.event-title-center {
-  text-align: center;
-  font-size: 20px;
-  font-weight: bold;
-  margin-bottom: 5px;
-  color: #333;
-}
-
-.custom-steps {
-  margin-top: -20px;
-
-  :deep(.el-step__description) {
-    margin-top: 8px;
-    padding: 0 20px;
-  }
-}
-
-.step-description {
-  font-size: 14px;
-  color: #666;
-  line-height: 1.5;
-  display: block;
-  text-align: center;
-
-  &:first-child {
-    font-weight: bold;
-    margin-bottom: 4px;
-  }
-}
-
-// 覆盖其他相关样式
-.status-flow {
-  .custom-steps {
-    .el-step__description {
-      position: relative;
-      margin: 0;
-      padding: 0;
-    }
-
-    // 移除之前的样式
-    .init-step-info,
-    .step-info {
-      display: block;
-      width: auto;
-      text-align: center;
-    }
-  }
-}
-
-// 添加新的样式
-.review-dialog {
-  :deep(.el-dialog__body) {
-    padding: 0;
-    background-color: #f5f7fa;
-    border-top: 0.1rem solid #f0f0f0;
-  }
-}
-
-.re-check-dialog {
-  :deep(.el-dialog__body) {
-    padding: 0;
-    background-color: #f5f7fa;
-    border-top: 0.1rem solid #f0f0f0;
-  }
-}
-
-.review-container {
-  position: relative;
-
-  .review-image-wrapper {
-    position: relative;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    height: 600px;
-    background-color: #f5f7fa;
-  }
-
-  .review-image-container {
-    width: 100%;
-    height: 100%;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-
-    :deep(.el-image) {
-      width: 100%;
-      height: 100%;
-      display: flex;
-      align-items: center;
-      justify-content: center;
-
-      .el-image__inner {
-        max-height: 100%;
-        max-width: 100%;
-        object-fit: contain;
-      }
-    }
-  }
-
-  .arrow-button {
-    position: absolute;
-    top: 50%;
-    transform: translateY(-50%);
-    width: 44px;
-    height: 44px;
-    background: rgba(0, 0, 0, 0.3);
-    border-radius: 50%;
-    border: none;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    cursor: pointer;
-    transition: all 0.3s;
-    z-index: 100;
-
-    &:hover {
-      background: rgba(0, 0, 0, 0.6);
-    }
-
-    i {
-      color: #fff;
-      font-size: 24px;
-    }
-
-    &.left {
-      left: 20px;
-      color: #ffffff;
-    }
-
-    &.right {
-      right: 20px;
-      color: #ffffff;
-    }
-  }
-
-  .preview-image {
-    max-width: 100%;
-    max-height: 100%;
-  }
-
-  .review-pagination {
-    padding: 16px 0;
-    display: flex;
-    justify-content: center;
-    background-color: #fff;
-
-    :deep(.el-pagination) {
-      .btn-prev,
-      .btn-next {
-        display: none;
-      }
-
-      .el-pager {
-        .number {
-          margin: 0 4px;
-        }
-      }
-    }
-  }
-
-  .image-error {
-    height: 100%;
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    justify-content: center;
-    color: #909399;
-
-    i {
-      font-size: 48px;
-      margin-bottom: 16px;
-    }
-
-    span {
-      font-size: 16px;
-    }
-  }
-}
-
-
-/* 原有图片预览的样式 */
-.el-image-viewer__wrapper {
-  :deep(.el-image-viewer__img) {
-    max-width: 100%;
-    max-height: 100%;
-    object-fit: contain;
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/tickets/ticketComponent/CreateTicketDialog.vue b/applications/task-work-order/src/views/tickets/ticketComponent/CreateTicketDialog.vue
deleted file mode 100644
index a5beef5..0000000
--- a/applications/task-work-order/src/views/tickets/ticketComponent/CreateTicketDialog.vue
+++ /dev/null
@@ -1,713 +0,0 @@
-<template>
-  <el-dialog
-    v-model="dialogVisible"
-    title="新建工单"
-    width="70%"
-    :close-on-click-modal="false"
-    @close="handleClose"
-  >
-    <el-form
-      :model="form"
-      :rules="rules"
-      ref="formRef"
-      label-width="90px"
-      class="create-ticket-form"
-      @submit.prevent
-    >
-      <div class="form-section">
-        <el-row :gutter="16">
-          <el-col :span="12">
-            <el-form-item label="工单名称" prop="name">
-              <el-input 
-                v-model="form.name" 
-                placeholder="请输入工单名称"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="事件位置" prop="location">
-              <div class="location-wrapper">
-                <avue-input-map
-                    v-model="form.location"
-                    :clearable="false"
-                    :params="mapParams"
-                    @change="handleLocationChange"
-                    type="button"
-                >
-                  <el-button type="primary" plain class="map-button">
-                    <i class="el-icon-map-location"></i> 地图选点
-                  </el-button>
-                </avue-input-map>
-              </div>
-            </el-form-item>
-          </el-col>
-
-        </el-row>
-
-        <el-row :gutter="16">
-          <el-col :span="12">
-            <el-form-item label="处理部门" prop="department">
-              <el-select
-                v-model="form.department"
-                placeholder="请选择处理部门"
-                @change="handleDepartmentChange"
-                class="full-width"
-                clearable
-              >
-                <el-option
-                  v-for="dept in departments"
-                  :key="dept.value"
-                  :label="dept.label"
-                  :value="dept.value"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="处理人员" prop="handler">
-              <el-select
-                v-model="form.handler"
-                placeholder="请先选择处理人员"
-                :disabled="!form.department"
-                class="full-width"
-                clearable
-              >
-                <el-option
-                  v-for="user in availableHandlers"
-                  :key="user.id"
-                  :label="user.name"
-                  :value="user.id"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
-
-        <el-row :gutter="16">
-          <el-col :span="12">
-            <el-form-item label="工单类型" prop="type">
-              <el-select
-                  @change="handleTypeChange"
-                  v-model="form.type"
-                  placeholder="请选择工单类型"
-                  class="full-width"
-                  clearable
-              >
-                <el-option
-                    v-for="item in types"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <el-col :span="12">
-            <el-form-item label="关联算法" prop="algorithm">
-              <el-select
-                v-model="form.algorithm"
-                multiple
-                placeholder="请选择关联算法"
-                class="full-width"
-                :disabled="!form.type"
-                clearable
-              >
-                <el-option
-                  v-for="item in availableAlgorithms"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-        </el-row>
-
-        <el-row :gutter="16">
-          <el-col :span="12">
-            <el-form-item label="工单内容" prop="content">
-              <el-input
-                type="textarea"
-                v-model="form.content"
-                :rows="4"
-                placeholder="请输入工单内容描述"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="事件图片" prop="photos" required class="upload-wrapper">
-              <el-upload
-                ref="uploadRef"
-                :action="'#'"
-                :auto-upload="false"
-                list-type="picture-card"
-                :on-change="handleFileChange"
-                :on-remove="handleUploadRemove"
-                :before-upload="beforeUpload"
-                :file-list="form.photos"
-                :limit="1"
-                accept="image/*"
-                class="create-upload"
-              >
-                <template v-if="form.photos.length < 1">
-                  <div class="el-icon-plus">
-                    <span>+</span>
-                  </div>
-                </template>
-              </el-upload>
-              <div class="upload-tip">需上传含有地址信息的照片(jpg、jpeg、png),且不超过5M</div>
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </div>
-    </el-form>
-    
-    <template #footer>
-      <div class="dialog-footer-new">
-        <el-button
-          type="danger"
-          :loading="submitLoading"
-          @click="handleSubmit"
-          icon="el-icon-position"
-        >
-          发布
-        </el-button>
-       
-        <el-button @click="handleClose" icon="el-icon-circle-close">取 消</el-button>
-      </div>
-    </template>
-  </el-dialog>
-</template>
-
-<script>
-import { createTicket } from '@/api/tickets/ticket';
-import { gcj02ToWgs84, wgs84ToGcj02 } from '@/utils/coordinateTransformation';
-
-export default {
-  name: 'CreateTicketDialog',
-  props: {
-    modelValue: {
-      type: Boolean,
-      default: false
-    },
-    departments: {
-      type: Array,
-      default: () => []
-    },
-    departmentUsers: {
-      type: Object,
-      default: () => ({})
-    },
-    types: {
-      type: Array,
-      default: () => []
-    },
-    allAlgorithms: {
-      type: Array,
-      default: () => []
-    },
-    editData: {
-      type: Object,
-      default: null
-    },
-    mapCenter: {
-      type: Array,
-      default: () => [115.861365, 28.621311]
-    }
-  },
-  emits: ['update:modelValue', 'create-success', 'draft-success', 'create-error'],
-  data() {
-    return {
-      form: {
-        name: '',
-        type: '',
-        department: '',
-        handler: '',
-        algorithm: [],
-        location: [],
-        address: '',
-        content: '',
-        photos: []
-      },
-      rules: {
-        name: [{ required: true, message: '请输入工单名称', trigger: 'blur' }],
-        type: [{ required: true, message: '请选择工单类型', trigger: 'change' }],
-        department: [{ required: true, message: '请选择所属部门', trigger: 'change' }],
-        handler: [{ required: true, message: '请选择处理人员', trigger: 'change' }],
-        content: [{ required: true, message: '请输入工单内容', trigger: 'blur' }],
-        algorithm: [{ required: true, message: '请选择关联算法', trigger: 'change' }],
-        location: [
-          {
-            required: true,
-            validator: (rule, value, callback) => {
-              if (!value || value.length < 2) {
-                callback(new Error('请选择位置信息'));
-              } else if (!value[0] || !value[1]) {
-                callback(new Error('请选择位置信息'));
-              } else {
-                callback();
-              }
-            },
-            trigger: 'change',
-          },
-        ],
-        photos: [
-          {
-            validator: (rule, value, callback) => {
-              if (!this.form.photos || this.form.photos.length === 0) {
-                callback(new Error('请上传工单图片'));
-              } else {
-                callback();
-              }
-            },
-            trigger: 'change',
-          },
-        ],
-      },
-      availableAlgorithms: [],
-      mapParams: {
-        zoom: 15,
-        center: null
-      },
-      submitLoading: false,
-      draftLoading: false
-    };
-  },
-  computed: {
-    dialogVisible: {
-      get() {
-        return this.modelValue;
-      },
-      set(value) {
-        this.$emit('update:modelValue', value);
-      }
-    },
-    availableHandlers() {
-      return this.form.department ? this.departmentUsers[this.form.department] || [] : [];
-    },
-    isEditMode() {
-      return !!this.editData;
-    }
-  },
-  watch: {
-    modelValue(newVal) {
-      if (newVal) {
-        this.initForm();
-        this.mapParams.center = [...this.mapCenter];
-      }
-    }
-  },
-  methods: {
-    initForm() {
-      if (this.isEditMode && this.editData) {
-        // 编辑模式:填充表单数据
-        this.loadEditData();
-      } else {
-        // 新建模式:重置表单
-        this.resetForm();
-      }
-    },
-
-    loadEditData() {
-      const data = this.editData;
-      
-      // 获取部门ID
-      let deptId = data.dept_id;
-      if (!deptId) {
-        const deptInfo = this.departments.find(
-          dept => dept.label && dept.label.trim() === data.department.trim()
-        );
-        deptId = deptInfo?.value;
-      }
-
-      // 获取工单类型值
-      const typeValue = this.types.find(t => t.value === data.type)?.value || data.work_order_type_dict_key;
-
-      // 处理算法数组
-      let algorithmArr = [];
-      if (Array.isArray(data.aiType)) {
-        algorithmArr = data.aiType;
-      } else if (typeof data.aiType === 'string' && data.aiType) {
-        algorithmArr = data.aiType.split(/[,、]/).map(item => item.trim());
-      }
-
-      // 确保算法值与选项匹配
-      algorithmArr = algorithmArr
-        .map(item => {
-          if (typeof item === 'string') {
-            const matchedAlgorithm = this.allAlgorithms.find(
-              algo => algo.dict_value === item || algo.dict_key === item
-            );
-            return matchedAlgorithm ? matchedAlgorithm.dict_key : item;
-          }
-          return item;
-        })
-        .filter(Boolean);
-
-      // 处理位置数据
-      let curLocation = [];
-      if (Array.isArray(data.location) && data.location.length >= 2) {
-        let [lng, lat] = this.disposeLocation(false, data);
-        curLocation = [lng, lat, data.location[2] || data.address || ''];
-      }
-
-      this.form = {
-        id: data.id,
-        name: data.orderName,
-        type: typeValue,
-        department: deptId,
-        handler: data.handler,
-        algorithm: algorithmArr,
-        location: curLocation,
-        address: curLocation[2] || '',
-        content: data.content,
-        photos: data.photo_url ? [{
-          name: 'existing-photo.jpg',
-          url: data.photo_url,
-          status: 'success',
-          raw: null,
-          existingUrl: data.photo_url,
-        }] : []
-      };
-
-      // 更新算法选项
-      this.handleTypeChange(typeValue);
-    },
-
-    resetForm() {
-      this.form = {
-        name: '',
-        type: '',
-        department: '',
-        handler: '',
-        algorithm: [],
-        location: [],
-        address: '',
-        content: '',
-        photos: []
-      };
-      this.availableAlgorithms = [];
-      
-      if (this.$refs.formRef) {
-        this.$refs.formRef.clearValidate();
-      }
-    },
-
-    handleClose() {
-      this.dialogVisible = false;
-      this.resetForm();
-    },
-    handleTypeChange(typeValue) {
-      this.form.algorithm = [];
-      if (!typeValue) {
-        this.availableAlgorithms = [];
-        return;
-      }
-      const matchedCategory = this.allAlgorithms.find(category => category.dict_key === typeValue);
-      if (!matchedCategory || !matchedCategory.algorithms || matchedCategory.algorithms.length === 0) {
-        this.availableAlgorithms = [];
-        this.$message.info('该工单类型暂无关联算法');
-        return;
-      }
-
-      this.availableAlgorithms = matchedCategory.algorithms.map(algo => ({
-        label: algo.dict_value,
-        value: algo.dict_key,
-        dict_key: algo.dict_key,
-        dict_value: algo.dict_value,
-      }));
-    },
-
-    handleDepartmentChange() {
-      this.form.handler = '';
-    },
-
-    handleLocationChange(val) {
-      let locationValue = val.value;
-      if (locationValue && locationValue.length >= 2) {
-        const [lng, lat] = gcj02ToWgs84(locationValue[0], locationValue[1]);
-        this.form.location = [Number(lng), Number(lat), locationValue[2] || ''];
-        this.form.address = locationValue[2] || '';
-      } else {
-        this.form.location = [];
-        this.form.address = '';
-      }
-    },
-
-    handleFileChange(file, fileList) {
-      this.form.photos = fileList.map(item => ({
-        ...item,
-        existingUrl: item.url && !item.raw ? item.url : null,
-      }));
-    },
-
-    handleUploadRemove(file, fileList) {
-      this.form.photos = fileList;
-    },
-
-    beforeUpload(file) {
-      const isImage = file.type.includes('image');
-      const isLt5M = file.size / 1024 / 1024 < 5;
-
-      if (!isImage) {
-        this.$message.error('只能上传图片文件!');
-        return false;
-      }
-      if (!isLt5M) {
-        this.$message.error('图片大小不能超过5MB!');
-        return false;
-      }
-      return true;
-    },
-
-    async handleSubmit() {
-      if (this.submitLoading) return;
-      
-      try {
-        await this.$refs.formRef.validate();
-        
-        // 验证位置信息
-        if (!this.form.location || this.form.location.length < 2) {
-          this.$message.warning('请在地图上选择位置');
-          return;
-        }
-
-        // 验证图片
-        if (!this.form.photos || this.form.photos.length === 0) {
-          this.$message.warning('请上传工单图片');
-          return;
-        }
-
-        this.submitLoading = true;
-        
-        let [lng, lat] = this.disposeLocation(true, this.form);
-
-        const submitData = {
-          eventName: this.form.name,
-          content: this.form.content,
-          workType: '1',
-          longitude: lng,
-          latitude: lat,
-          address: this.form.address,
-          workOrderTypeDictKey: this.form.type,
-          aiType: Array.isArray(this.form.algorithm) ? this.form.algorithm : [this.form.algorithm],
-          updateUser: this.form.handler,
-          createDept: this.form.department,
-          isDraft: 0,
-        };
-
-        if (this.form.id) {
-          submitData.id = this.form.id;
-        }
-
-        // 获取文件
-        let file = null;
-        const photoInfo = this.form.photos[0];
-
-        if (photoInfo.raw) {
-          file = photoInfo.raw;
-        } else if (photoInfo.existingUrl) {
-          submitData.photoUrl = photoInfo.existingUrl;
-        } else {
-          this.$message.warning('图片文件无效,请重新上传');
-          return;
-        }
-
-        const response = await createTicket(submitData, file);
-        if (response.data.code === 0) {
-          this.$message.success(this.isEditMode ? '工单编辑成功' : '工单创建成功');
-          this.$emit('create-success');
-          this.handleClose();
-        } else {
-          throw new Error(response.data.msg || '操作失败');
-        }
-      } catch (error) {
-        if (error.message.includes('验证未通过')) {
-          this.$message.warning('请填写完整的工单信息');
-        } else {
-          this.$message.error(error.message || '操作失败,请稍后重试');
-          this.$emit('create-error', error);
-        }
-      } finally {
-        this.submitLoading = false;
-      }
-    },
-
-
-    disposeLocation(goWgs84 = false, data) {
-      let lng = '', lat = '';
-
-      if (Array.isArray(data.location) && data.location.length > 0) {
-        if (goWgs84) {
-          lng = data.location?.[0] ? String(data.location[0]) : undefined;
-          lat = data.location?.[1] ? String(data.location[1]) : undefined;
-
-          if (lng && lat) {
-            [lng, lat] = gcj02ToWgs84(Number(lng), Number(lat));
-          }
-        } else {
-          lng = Number(data.location[0]);
-          lat = Number(data.location[1]);
-
-          if (lng && lat) {
-            [lng, lat] = this.wgs84ToGcj02(Number(lng), Number(lat));
-          }
-        }
-      }
-
-      return [String(lng), String(lat)];
-    },
-
- 
-  }
-};
-</script>
-
-<style lang="scss" scoped>
-.full-width {
-  width: 100%;
-}
-
-.location-wrapper {
-  width: 100%;
-  height: auto;
-}
-
-.map-button {
-  width: 100%;
-  height: 36px;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-}
-
-.create-ticket-form {
-  padding: 20px 10px;
-
-  .form-section {
-    background-color: #fff;
-    border-radius: 4px;
-
-    .el-row {
-      margin-bottom: 16px;
-
-      &:last-child {
-        margin-bottom: 0;
-      }
-    }
-  }
-
-  .location-wrapper {
-    width: 100%; // 修改为100%以适应父容器
-    height: auto; // 修改为auto以自适应内容
-
-    .map-button {
-      width: 100%; // 让按钮填满容器宽度
-      height: 36px; // 与其他输入框保持一致的高度
-      display: flex;
-      align-items: center;
-      justify-content: center;
-
-      i {
-        margin-right: 4px;
-      }
-    }
-
-    .location-text {
-      margin-top: 8px;
-      padding: 8px 12px;
-      background-color: #f5f7fa;
-      border-radius: 4px;
-      color: #606266;
-      font-size: 13px;
-      line-height: 1.4;
-    }
-  }
-
-  .upload-wrapper {
-    .uploader {
-      :deep(.el-upload--picture-card) {
-        width: 120px;
-        height: 100px;
-        line-height: 128px;
-      }
-
-      :deep(.el-upload-list__item) {
-        width: 120px;
-        height: 120px;
-      }
-    }
-
-    .upload-tip {
-      font-size: 12px;
-      color: #909399;
-      line-height: 1.4;
-      margin-top: 8px;
-    }
-  }
-
-  .el-form-item {
-    margin-bottom: 18px;
-
-    &:last-child {
-      margin-bottom: 0;
-    }
-  }
-
-  :deep(.el-form-item__label) {
-    font-weight: 500;
-    color: #606266;
-  }
-
-  // :deep(.el-input__inner) {
-  //   height: 36px;
-  //   line-height: 36px;
-  // }
-
-  :deep(.el-textarea__inner) {
-    padding: 8px 12px;
-  }
-
-  // :deep(.el-input__inner),
-  // :deep(.el-select),
-  // :deep(.el-select .el-input) {
-  //   width: 100%; // 确保所有输入框和选择框宽度一致
-  // }
-
-  .full-width {
-    width: 100%;
-  }
-}
-
-:deep(.el-dialog__body) {
-  border-top: 0.1rem solid #f0f0f0;
-}
-/* 新建工单和处理工单的上传组件样式 */
-.create-upload,
-.detail-upload {
-  :deep(.el-upload--picture-card) {
-    width: 120px;
-    height: 100px;
-    line-height: 100px;
-  }
-
-  /* 隐藏额外的上传按钮 */
-  :deep(.el-upload.el-upload--picture-card) {
-    display: none;
-  }
-
-  /* 当没有图片时显示上传按钮 */
-  :deep(.el-upload.el-upload--picture-card:first-child) {
-    display: flex;
-  }
-
-  /* 上传组件的预览图片样式 */
-  :deep(.el-upload-list--picture-card .el-upload-list__item) {
-    width: 120px;
-    height: 100px;
-  }
-}
-</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/tickets/ticketComponent/DispatchDialog.vue b/applications/task-work-order/src/views/tickets/ticketComponent/DispatchDialog.vue
deleted file mode 100644
index 11046da..0000000
--- a/applications/task-work-order/src/views/tickets/ticketComponent/DispatchDialog.vue
+++ /dev/null
@@ -1,244 +0,0 @@
-<template>
-  <el-dialog
-    v-model="dialogVisible"
-    title="派发工单"
-    width="40%"
-    :close-on-click-modal="false"
-    @close="handleClose"
-  >
-    <el-form 
-      :model="form" 
-      :rules="rules" 
-      ref="formRef" 
-      label-width="100px"
-      @submit.prevent
-    >
-      <el-form-item label="选择部门" prop="department">
-        <el-tree-select
-          v-model="form.department"
-          placeholder="请选择部门"
-          :data="deptTreeData"
-          :props="treeProps"
-          :filterable="true"
-          :allow-clear="true"
-          :check-strictly="true"
-          @change="handleDepartmentChange"
-          class="full-width"
-        />
-      </el-form-item>
-      <el-form-item label="选择处理人" prop="handler">
-        <el-select
-          filterable
-          v-model="form.handler"
-          placeholder="请选择处理人"
-          :disabled="!form.department"
-          class="full-width"
-        >
-          <el-option
-            v-for="user in availableHandlers"
-            :key="user.id"
-            :label="user.name"
-            :value="user.id"
-          />
-        </el-select>
-      </el-form-item>
-    </el-form>
-    
-    <template #footer>
-      <el-button @click="handleClose" icon="el-icon-circle-close">取消</el-button>
-      <el-button 
-        type="primary" 
-        :loading="loading" 
-        @click="handleSubmit"
-        icon="el-icon-check"
-      >
-        确认派发
-      </el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script setup>
-import { getDeptTree, getDeptLazyTree } from '@/api/system/dept'
-import { ElMessage } from 'element-plus';
-import { flowEvent } from '@/api/tickets/ticket';
-import { onMounted } from 'vue';
-const props = defineProps({
-  modelValue: {
-    type: Boolean,
-    default: false
-  },
-  currentDetail: {
-    type: Object,
-    default: () => ({})
-  },
-
-  departmentUsers: {
-    type: Object,
-    default: () => ({})
-  },
-  algorithms: {
-    type: Array,
-    default: () => []
-  },
-  types: {
-    type: Array,
-    default: () => []
-  }
-});
-const emit = defineEmits(['update:modelValue', 'dispatch-success', 'dispatch-error']);
-const formRef = ref(null); // 表单引用
-const loading = ref(false);
-const form = ref({
-  department: '',
-  handler: ''
-});
-const deptTreeData =ref([])
-// 树形选择器配置
-const treeProps = ref({
-  value: 'id', // 对应部门数据的id字段(作为选中值)
-  label: 'name', // 对应部门数据的name字段(作为显示文本)
-  children: 'children' // 对应子部门字段
-});
-// 获取树形数据
-    const getDepartmentTree=() =>{
-    const tenantId = '000000'
-    getDeptTree(tenantId).then(res => {
-    deptTreeData.value = res.data.data
-    
-      })
-}
-// 表单校验规则
-const rules = ref({
-  department: [{ required: true, message: '请选择部门', trigger: 'change' }],
-  handler: [{ required: true, message: '请选择处理人', trigger: 'change' }]
-});
-const dialogVisible = computed({
-  get() {
-    return props.modelValue;
-  },
-  set(value) {
-    emit('update:modelValue', value);
-  }
-});
-
-// 处理人列表
-const availableHandlers = computed(() => {
-  return form.value.department ? props.departmentUsers[form.value.department] || [] : [];
-});
-watch(
-  () => props.modelValue,
-  (newVal) => {
-    if (newVal) {
-      resetForm();
-    }
-  },
-  { immediate: true }
-);
-
-// 重置表单
-const resetForm = () => {
-  form.value = {
-    department: '',
-    handler: ''
-  };
-  if (formRef.value) {
-    formRef.value.clearValidate(); 
-  }
-};
-
-// 关闭对话框
-const handleClose = () => {
-  dialogVisible.value = false;
-  resetForm();
-};
-
-// 部门切换时清空处理人
-const handleDepartmentChange = () => {
-  form.value.handler = '';
-};
-
-// 验证必填字段(currentDetail 中的必填项)
-const validateRequiredFields = () => {
-  if (!props.currentDetail.orderName || !props.currentDetail.orderName.trim()) {
-    ElMessage.warning('请填写工单名称');
-    return false;
-  }
-  if (!props.currentDetail.type) {
-    ElMessage.warning('请选择工单类型');
-    return false;
-  }
-  if (!props.currentDetail.content || !props.currentDetail.content.trim()) {
-    ElMessage.warning('请填写工单内容');
-    return false;
-  }
-  return true;
-};
-
-// 获取算法值
-const getAlgorithmValue = () => {
-  const { aiType } = props.currentDetail;
-  // 检查是否直接匹配 value
-  const isValueMatch = props.algorithms.some(item => item.value === aiType);
-  if (isValueMatch) {
-    return aiType;
-  }
-  // 尝试匹配 dict_value 或 label
-  const matched = props.algorithms.find(
-    item => item.dict_value === aiType || item.label === aiType
-  );
-  return matched ? matched.value : null;
-};
-
-// 提交派发
-const handleSubmit = async () => {
-  try {
-    const valid = await formRef.value.validate();
-    if (!valid) return;
-    if (!validateRequiredFields()) {
-      return;
-    }
-
-    loading.value = true;
-    const algorithmValue = getAlgorithmValue();
-    const data = {
-      id: props.currentDetail.id,
-      status: props.currentDetail.status,
-      isPass: 0, // 0 表示通过
-      eventName: props.currentDetail.orderName,
-      eventNum: props.currentDetail.orderNumber,
-      workOrderTypeDictKey: props.currentDetail.type,
-      content: props.currentDetail.content,
-      createDept: form.value.department,
-      updateUser: form.value.handler,
-      aiType: algorithmValue,
-    };
-
-    // 发送请求
-    const response = await flowEvent(data);
-    if (response.data.code === 0) {
-      ElMessage.success('工单已成功派发');
-      emit('dispatch-success');
-      handleClose();
-    } else {
-      throw new Error(response.data.msg || '派发失败');
-    }
-  } catch (error) {
-    console.error('派发失败:', error);
-    emit('dispatch-error', error);
-    ElMessage.error(error.message || '派发失败,请稍后重试');
-  } finally {
-    loading.value = false;
-  }
-};
-onMounted(()=>{
-  getDepartmentTree()
-})
-</script>
-<style scoped>
-.full-width {
-  width: 100%;
-}
-.el-form {
-margin-top: 20px;}
-</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/tickets/ticketComponent/RecheckDialog.vue b/applications/task-work-order/src/views/tickets/ticketComponent/RecheckDialog.vue
deleted file mode 100644
index 30e3673..0000000
--- a/applications/task-work-order/src/views/tickets/ticketComponent/RecheckDialog.vue
+++ /dev/null
@@ -1,117 +0,0 @@
-<template>
-  <el-dialog
-    v-model="dialogVisible"
-    title="工单复核"
-    width="30%"
-    append-to-body
-    class="ztzf-dialog-mange"
-    @close="handleClose"
-  >
-    <div class="dialog-footer">
-      <el-button type="primary" @click="handleConfirm(1)">人工复核</el-button>
-      <el-button type="primary" @click="handleConfirm(2)">无人机复核</el-button>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import { ElMessageBox, ElLoading } from 'element-plus';
-import { getReviewById, getCreateEventJob } from '@/api/tickets/ticket';
-
-export default {
-  name: 'RecheckDialog',
-  props: {
-    modelValue: {
-      type: Boolean,
-      default: false
-    },
-    recheckData: {
-      type: Object,
-      default: () => ({})
-    }
-  },
-  emits: ['update:modelValue', 'recheck-success'],
-  computed: {
-    dialogVisible: {
-      get() {
-        return this.modelValue;
-      },
-      set(value) {
-        this.$emit('update:modelValue', value);
-      }
-    }
-  },
-  methods: {
-    handleClose() {
-      this.dialogVisible = false;
-    },
-    
-    handleConfirm(key) {
-      if (key === 1) {
-        this.handleManualRecheck();
-      } else {
-        this.handleUAVRecheck();
-      }
-    },
-    
-    async handleManualRecheck() {
-      try {
-        await getReviewById(this.recheckData.id);
-        this.$message.success('人工复核成功');
-        this.$emit('recheck-success');
-        this.dialogVisible = false;
-      } catch (error) {
-        this.$message.error('人工复核失败');
-        console.error('人工复核失败:', error);
-      }
-    },
-    
-    async handleUAVRecheck() {
-      const loading = ElLoading.service({
-        lock: true,
-        text: '复核任务创建中……',
-        background: 'rgba(0, 0, 0, 0.7)',
-      });
-
-      try {
-        const response = await getCreateEventJob(this.recheckData.id);
-        const estimatedTime = response.data.data;
-        
-        loading.close();
-        
-        await ElMessageBox.confirm(
-          `预计复核执行时间为${estimatedTime}`,
-          '提示',
-          {
-            confirmButtonText: '确定',
-            showCancelButton: false,
-            closeOnClickModal: false,
-            closeOnPressEscape: false,
-            type: 'warning',
-          }
-        );
-        
-        this.$message.success('无人机复核任务创建成功');
-        this.$emit('recheck-success');
-        this.dialogVisible = false;
-      } catch (error) {
-        loading.close();
-        if (error !== 'cancel') {
-          this.$message.error('无人机复核任务创建失败');
-          console.error('无人机复核失败:', error);
-        }
-        this.dialogVisible = false;
-      }
-    }
-  }
-};
-</script>
-
-<style scoped>
-.dialog-footer {
-  display: flex;
-  justify-content: center;
-  gap: 20px;
-  padding: 20px 0;
-}
-</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/tickets/ticketComponent/TicketDetailDialog.vue b/applications/task-work-order/src/views/tickets/ticketComponent/TicketDetailDialog.vue
deleted file mode 100644
index 94f84ad..0000000
--- a/applications/task-work-order/src/views/tickets/ticketComponent/TicketDetailDialog.vue
+++ /dev/null
@@ -1,1441 +0,0 @@
-<template>
-  <el-dialog
-    class="custom-dialog"
-    align-center
-    v-model="dialogVisible"
-    :title="isEditMode ? '编辑工单' : '工单详情'"
-    width="80%"
-    append-to-body
-    @close="handleClose"
-  >
-    <div class="detail-container">
-      <div class="detail-top-title">
-        <div class="event-title-center event-orderNumber">
-          {{ currentDetail.orderNumber || '工单编号' }}
-        </div>
-        <div class="event-title-center">{{ currentDetail.orderName || '事件名称' }}</div>
-      </div>
-      <div v-if="totalTime" class="event-total-time">总耗时:{{ totalTime }}</div>
-      <!-- 工单状态流程 -->
-      <div class="custom-steps-container">
-        <!-- 标题行 -->
-        <div class="steps-titles">
-          <div
-            v-for="(status, index) in stepStatusList"
-            :key="index"
-            :class="{
-              'step-title': true,
-              active: index <= stepStatusList.indexOf(String(currentDetail.status)),
-            }"
-          >
-            {{ mapStatus(status) }}
-          </div>
-        </div>
-
-        <!-- Element Steps 组件 -->
-        <el-steps :active="getActiveStep() - 1" align-center class="custom-steps">
-          <el-step v-for="(status, index) in stepStatusList" :key="index">
-            <template #description>
-              <span class="step-description">
-                {{ getStepHandler(status) }}
-              </span>
-              <div class="step-description" v-if="getStepTime(status)">
-                <span class="step-timer"> 耗时:{{ getStepTime(status) }} </span>
-              </div>
-              <div class="step-description">
-                {{ getStepCreateTime(status) }}
-              </div>
-            </template>
-          </el-step>
-        </el-steps>
-      </div>
-
-      <div class="PopUpTableScrolls">
-        <!-- 基本信息表格 -->
-        <el-table :show-header="false" :data="formattedDetailFields" border class="tableCss">
-          <el-table-column prop="label1" label="基本信息" width="150">
-            <template #default="{ row }">
-              <span
-                v-if="
-                  currentDetail.status === 0 &&
-                  (row.label1 === '关联算法' || row.label1 === '工单名称')
-                "
-                class="required-label"
-              >
-                <span class="required-star">*</span>{{ row.label1 }}
-              </span>
-              <span v-else>{{ row.label1 }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column>
-            <template #default="{ row }">
-              <template
-                v-if="
-                  currentDetail.status === 0 &&
-                  row.label1 === '工单名称' &&
-                  hasProcessingBtnPermission()
-                "
-              >
-                <el-input
-                  v-model="currentDetail.orderName"
-                  placeholder="请输入工单名称"
-                  class="required-input"
-                />
-              </template>
-              <template
-                v-else-if="
-                  currentDetail.status === 0 &&
-                  row.label1 === '关联算法' &&
-                  hasProcessingBtnPermission()
-                "
-              >
-                <el-select
-                  v-model="currentDetail.aiType"
-                  placeholder="请选择关联算法"
-                  class="required-input"
-                >
-                  <el-option
-                    v-for="item in algorithms"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  />
-                </el-select>
-              </template>
-              <template v-else>{{ row.value1 }}</template>
-            </template>
-          </el-table-column>
-          <el-table-column prop="label2" label="基本信息" width="150">
-            <template #default="{ row }">
-              <span
-                v-if="currentDetail.status === 0 && row.label2 === '工单内容'"
-                class="required-label"
-              >
-                <span class="required-star">*</span>{{ row.label2 }}
-              </span>
-              <span v-else>{{ row.label2 }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column>
-            <template #default="{ row }">
-              <template
-                v-if="
-                  currentDetail.status === 0 &&
-                  row.label2 === '工单内容' &&
-                  hasProcessingBtnPermission()
-                "
-              >
-                <el-input
-                  type="textarea"
-                  :maxlength="200"
-                  show-word-limit
-                  v-model="currentDetail.content"
-                  placeholder="请输入工单内容"
-                  class="required-input"
-                />
-              </template>
-              <template v-else>{{ row.value2 }}</template>
-            </template>
-          </el-table-column>
-        </el-table>
-
-        <!-- 事件处理详情 -->
-        <div v-if="[3, 4].includes(currentDetail.status)" class="form-section">
-          <div class="section-title">
-            <template v-if="currentDetail.status === 3">
-              <span class="required-label">
-                <span class="required-star">*</span>事件处理详情
-              </span>
-            </template>
-            <template v-else> 事件处理详情</template>
-          </div>
-          <!-- 处理中状态显示输入框 -->
-          <template v-if="currentDetail.status === 3 && hasProcessedAndOverBtnPermission()">
-            <el-input
-              type="textarea"
-              v-model="currentDetail.processingDetail"
-              placeholder="请输入事件处理详情"
-              :rows="4"
-              :maxlength="200"
-              show-word-limit
-              style="width: 100%; margin-bottom: 10px"
-              :disabled="!isCurrentUserAssigned"
-            />
-          </template>
-          <!-- 已完成和已完结状态显示只读文本 -->
-          <template v-else>
-            <div class="readonly-processing-detail">
-              {{ currentDetail.processingDetail }}
-            </div>
-          </template>
-        </div>
-
-        <!-- 上传图片 -->
-        <div v-if="[3].includes(currentDetail.status)" class="form-section uploadImg">
-          <div class="section-title" v-if="hasProcessedAndOverBtnPermission()">
-            <template v-if="currentDetail.status === 3">
-              <span class="required-label"> <span class="required-star">*</span>上传图片 </span>
-            </template>
-            <template v-else> 上传图片</template>
-          </div>
-          <el-upload
-          :disabled="!isCurrentUserAssigned"
-            v-if="hasProcessedAndOverBtnPermission()"
-            ref="uploadRef"
-            :action="'#'"
-            :auto-upload="false"
-            list-type="picture-card"
-            :on-change="handleFileChange"
-            :on-remove="handleUploadRemove"
-            :before-upload="beforeUpload"
-            :file-list="currentDetail.photos || []"
-            :limit="1"
-            accept="image/*"
-            class="detail-upload"
-          >
-            <template v-if="!currentDetail.photos || currentDetail.photos.length < 1">
-              <div class="el-icon-plus">
-                <span>+</span>
-              </div>
-            </template>
-          </el-upload>
-          <div class="el-upload__tip" v-if="hasProcessedAndOverBtnPermission()">
-            (上传照片即可完结工单,只能上传jpg、jpeg、png照片,且不超过5M)
-          </div>
-        </div>
-
-        <!-- 图片和地图部分 -->
-        <div class="media-section">
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <div class="media-box">
-                <div class="media-title">事件图片</div>
-                <div class="media-content">
-                  <el-image
-                    v-if="currentDetail.mediaUrl"
-                    :src="getThumbUrl(currentDetail.mediaUrl)"
-                    :preview-src-list="[getPreviewUrl(currentDetail.mediaUrl)]"
-                    fit="contain"
-                    style="cursor: pointer"
-                  >
-                    <template #placeholder>
-                      <div class="image-placeholder">
-                        <i class="el-icon-picture-outline"></i>
-                        <span>加载中...</span>
-                      </div>
-                    </template>
-                    <template #error>
-                      <div class="image-error">
-                        <i class="el-icon-picture-outline"></i>
-                        <span>加载失败</span>
-                      </div>
-                    </template>
-                  </el-image>
-                  <div v-else class="no-media">暂无图片/视频</div>
-                </div>
-              </div>
-            </el-col>
-            <el-col :span="12">
-              <div class="media-box">
-                <template v-if="currentDetail.status === 4">
-                  <div class="media-title">工单处理图片</div>
-                  <div class="media-content">
-                    <el-image
-                      v-if="currentDetail.updatePhotoUrl"
-                      :src="getThumbUrl(currentDetail.updatePhotoUrl)"
-                      :preview-src-list="[getPreviewUrl(currentDetail.updatePhotoUrl)]"
-                      fit="fill"
-                    >
-                      <template #placeholder>
-                        <div class="image-placeholder">
-                          <i class="el-icon-picture-outline"></i>
-                          <span>加载中...</span>
-                        </div>
-                      </template>
-                      <template #error>
-                        <div class="image-error">
-                          <i class="el-icon-picture-outline"></i>
-                          <span>加载失败</span>
-                        </div>
-                      </template>
-                    </el-image>
-                    <div v-else class="no-media">暂无处理图片</div>
-                  </div>
-                </template>
-                <template v-else>
-                  <div class="media-title">
-                    地图标记事件点
-                    <el-popover
-                      v-if="currentDetail.status === 3 || currentDetail.status === 0"
-                      popper-class="custom-qrcode-popover"
-                      :width="120"
-                      :visible="currentDetail.showQR && dialogVisible"
-                      placement="top"
-                      title=""
-                      trigger="click"
-                    >
-                      <template #reference>
-                        <img
-                          @click.stop="handleQRCode(currentDetail)"
-                          class="QRCodeImg"
-                          src="@/assets/images/dataCenter/qrCode.svg"
-                          alt=""
-                          title="事件导航"
-                        />
-                      </template>
-                      <div class="qrcode-content">
-                        <div class="close-btn" @click.stop="currentDetail.showQR = false">×</div>
-                        <CreateQRcode
-                          v-if="currentDetail.showQR && dialogVisible"
-                          :lat-and-lon="currentDetail.location"
-                        />
-                      </div>
-                    </el-popover>
-                  </div>
-                  <div class="media-content">
-                    <map-container v-if="dialogVisible" ref="mapContainerRef" />
-                  </div>
-                </template>
-              </div>
-            </el-col>
-          </el-row>
-        </div>
-      </div>
-
-      <!-- 操作按钮 -->
-      <div class="dialog-footer1-new">
-        <div
-          :class="currentIndex === 0 ? 'disableds' : ''"
-          class="leftBtn"
-          @click="handlePrev"
-        >
-          上一页
-        </div>
-        <div class="btngroups">
-          <template v-if="currentDetail.status === 2">
-            <!-- 待审核 -->
-            <el-button
-              v-if="hasReviewBtnPermission()"
-              type="primary"
-              :loading="approveLoading"
-              @click="handleApprove"
-              icon="el-icon-check"
-            >
-              通过
-            </el-button>
-            <el-button
-              v-if="hasReviewBtnPermission()"
-              type="danger"
-              :loading="rejectLoading"
-              @click="handleReject"
-              icon="el-icon-close"
-            >
-              不通过
-            </el-button>
-            <el-button @click="handleClose" icon="el-icon-circle-close">取消</el-button>
-          </template>
-          <template v-else-if="currentDetail.status === 0">
-            <el-button
-              v-if="hasProcessingBtnPermission()"
-              type="primary"
-              :loading="dispatchLoading"
-              @click="handleApproveAndDispatch"
-              icon="el-icon-check"
-            >
-              受理
-            </el-button>
-            <el-button
-              v-if="hasProcessingBtnPermission()"
-              type="danger"
-              :loading="rejectLoading"
-              @click="handleReject"
-              icon="el-icon-close"
-            >
-              不受理
-            </el-button>
-            <el-button @click="handleClose" icon="el-icon-circle-close">取消</el-button>
-          </template>
-          <template v-if="currentDetail.status === 3">
-            <!-- 处理中 -->
-            <el-button
-              v-if="hasProcessedAndOverBtnPermission()"
-              type="primary"
-              :loading="completeLoading"
-              @click="handleComplete"
-              icon="el-icon-circle-check"
-              :disabled="!isCurrentUserAssigned"
-            >
-              完成工单
-            </el-button>
-            <el-button @click="handleClose" icon="el-icon-circle-close">取消</el-button>
-          </template>
-          <template v-else-if="currentDetail.status === 4">
-            <!-- 已完成 -->
-            <el-button @click="handleClose" icon="el-icon-circle-close">取消</el-button>
-          </template>
-        </div>
-        <div
-          :class="currentIndex === totalItems - 1 ? 'disableds' : ''"
-          class="leftBtn"
-          @click="handleNext"
-        >
-          下一页
-        </div>
-      </div>
-    </div>
-  </el-dialog>
-</template>
-
-<script setup>
-import { useStore } from 'vuex'
-import { ref, computed, watch, nextTick } from 'vue';
-import { flowEvent, getStepInfo } from '@/api/tickets/ticket';
-import { getSmallImg, getShowImg } from '@/utils/util';
-import CreateQRcode from '@/components/CreateQRcode/CreateQRcode.vue';
-import { ElMessage} from 'element-plus';
-const store = useStore()
-const userInfo = computed(() => store.state.user.userInfo)
-const isLoading = ref(false);
-// console.log('userInfo',userInfo.value);
-// 定义props
-const props = defineProps({
-  modelValue: {
-    type: Boolean,
-    default: false
-  },
-  currentDetail: {
-    type: Object,
-    default: () => ({})
-  },
-  currentIndex: {
-    type: Number,
-    default: 0
-  },
-  totalItems: {
-    type: Number,
-    default: 0
-  },
-  algorithms: {
-    type: Array,
-    default: () => []
-  },
-  types: {
-    type: Array,
-    default: () => []
-  },
-  permission: {
-    type: Object,
-    default: () => ({})
-  },
-  stepStatusList: {
-    type: Array,
-    default: () => []
-  },
-  workType: {
-    type: Number,
-    default: 0
-  }
-});
-
-// 定义emits
-
-const emit = defineEmits([
-  'update:modelValue',
-  'detail-success',
-  'detail-error',
-  'prev-item',
-  'next-item',
-  'update:currentDetail',
-  'approve-and-dispatch'
-]);
-
-// 响应式数据
-const stepInfos = ref([]);
-const totalTime = ref('');
-const approveLoading = ref(false);
-const rejectLoading = ref(false);
-const dispatchLoading = ref(false);
-const completeLoading = ref(false);
-const finalizeLoading = ref(false);
-const uploadRef = ref(null);
-const mapContainerRef = ref(null);
-
-// 计算属性
-const dialogVisible = computed({
-  get() {
-    return props.modelValue;
-  },
-  set(value) {
-    emit('update:modelValue', value);
-  }
-});
-
-const isEditMode = computed(() => {
-  return props.currentDetail.status === -1;
-});
-// 是否有权限完成工单
-const isCurrentUserAssigned  =computed(()=>{
-  const handleUserId = props.currentDetail?.handle_user_id;
-  const currentUserId = userInfo.value?.user_id;
-   return !!handleUserId && !!currentUserId && String(handleUserId) === String(currentUserId);
-})
-const formattedDetailFields = computed(() => {
-  const fields = [
-    { label: '工单名称', value: props.currentDetail.orderName },
-    {
-      label: '工单类型',
-      value: props.types.find(t => t.value === props.currentDetail.type)?.label || props.currentDetail.type,
-    },
-    { label: '关联任务', value: props.currentDetail.job_name || '/' },
-    { label: '工单创建人', value: props.currentDetail.creator },
-    { label: '当前状态', value: mapStatus(props.currentDetail.status) },
-    { label: '事件地址', value: props.currentDetail.address || props.currentDetail.latAndLon },
-    {
-      label: '关联算法',
-      value: props.algorithms.find(t => t.value === props.currentDetail.aiType)?.label || props.currentDetail.aiType,
-    },
-    { label: '发起单位', value: props.currentDetail.department },
-    { label: '发起任务时间', value: props.currentDetail.startTime },
-    { label: '所属机巢', value: props.currentDetail.device_names },
-    { label: '工单来源', value: props.currentDetail.dataSources },
-    { label: '工单内容', value: props.currentDetail.content },
-  ];
-
-  const filteredFields = fields.filter(field => field.value !== '/');
-  const formattedFields = [];
-  for (let i = 0; i < filteredFields.length; i += 2) {
-    formattedFields.push({
-      label1: filteredFields[i]?.label || '',
-      value1: filteredFields[i]?.value || (filteredFields[i]?.label ? '暂无数据' : ''),
-      label2: filteredFields[i + 1]?.label || '',
-      value2: filteredFields[i + 1]?.value || (filteredFields[i + 1]?.label ? '暂无数据' : ''),
-    });
-  }
-
-  return formattedFields;
-});
-
-// 监听
-watch(
-  () => props.modelValue,
-  (newVal) => {
-    if (newVal) {
-      loadStepInfo();
-      initMap();
-    }
-  }
-);
-
-watch(
-  () => props.currentDetail,
-  (newVal) => {
-    if (newVal && dialogVisible.value) {
-    isLoading.value = true;
-     setTimeout(() => {
-        loadStepInfo();
-        initMap();
-        isLoading.value = false;
-      }, 50);
-
-    }
-  },
-  { deep: true }
-);
-
-// 方法
-const handleClose = () => {
-  dialogVisible.value = false;
-};
-
-const handlePrev = () => {
-  if (props.currentIndex > 0) {
-    emit('prev-item');
-  }
-};
-
-const handleNext = () => {
-  if (props.currentIndex < props.totalItems - 1) {
-    emit('next-item');
-  }
-};
-
-const loadStepInfo = async () => {
-  try {
-    const stepResponse = await getStepInfo(props.currentDetail.orderNumber);
-    const steps = Array.isArray(stepResponse.data.data)
-      ? stepResponse.data.data
-      : stepResponse.data.data?.steps || [];
-
-    const finishedStep = steps.find(s => String(s.status) === '4');
-    totalTime.value = finishedStep && finishedStep.total_time ? finishedStep.total_time : '';
-
-    stepInfos.value = steps.map(step => ({
-      status: String(step.status),
-      name: step.name,
-      time: step.time,
-      create_time: step.create_time,
-    }));
-  } catch (error) {
-    stepInfos.value = [];
-  }
-};
-
-const initMap = () => {
-  nextTick(() => {
-    if (mapContainerRef.value && mapContainerRef.value.initAddEntity && props.currentDetail.location) {
-      mapContainerRef.value.initAddEntity('point', props.currentDetail.location);
-    }
-  });
-};
-
-const mapStatus = (status) => {
-  const statusTextMap = {
-    2: '待审核',
-    0: '待处理',
-    3: '处理中',
-    4: '已完成',
-  };
-  return statusTextMap[status] || '未知状态';
-};
-
-const getStepHandler = (status) => {
-  const step = stepInfos.value.find(step => step.status === status);
-  return step ? step.name : '';
-};
-
-const getStepTime = (status) => {
-  const step = stepInfos.value.find(step => step.status === status);
-  return step && step.time && step.time !== '0' ? step.time : false;
-};
-
-const getStepCreateTime = (status) => {
-  const step = stepInfos.value.find(step => step.status === status);
-  return step ? step.create_time : null;
-};
-
-const getActiveStep = () => {
-  const arr = props.stepStatusList;
-  const index = arr.indexOf(String(props.currentDetail.status));
-  return index !== -1 ? index + 2 : 1;
-};
-
-const handleQRCode = (val) => {
-  emit('update:currentDetail', {
-    ...props.currentDetail,
-    showQR: !val.showQR
-  });
-};
-
-const getThumbUrl = (url) => {
-  if (!url) return '';
-  return getSmallImg(url);
-};
-
-const getPreviewUrl = (url) => {
-  if (!url) return '';
-  return getShowImg(url);
-};
-
-const hasProcessingBtnPermission = () => {
-  return props.permission && props.permission.tickets_processing_btn === true;
-};
-
-const hasProcessedAndOverBtnPermission = () => {
-  return props.permission && props.permission.tickets_view_processedAndOver === true;
-};
-// 通过不通过
-const hasReviewBtnPermission = () => {
-  return props.permission && props.permission.tickets_review_btn === true;
-};
-
-// 文件操作方法
-const handleFileChange = (file, fileList) => {
-  emit('update:currentDetail', {
-    ...props.currentDetail,
-    photos: fileList
-  });
-};
-
-const handleUploadRemove = (file, fileList) => {
-  emit('update:currentDetail', {
-    ...props.currentDetail,
-    photos: fileList
-  });
-};
-
-const beforeUpload = (file) => {
-  const isImage = file.type.includes('image');
-  const isLt5M = file.size / 1024 / 1024 < 5;
-
-  if (!isImage) {
-    ElMessage.error('只能上传图片文件!');
-    return false;
-  }
-  if (!isLt5M) {
-    ElMessage.error('图片大小不能超过5MB!');
-    return false;
-  }
-  return true;
-};
-
-// 工单操作方法
-const handleApprove = async () => {
-  if (approveLoading.value) return;
-  approveLoading.value = true;
-
-  try {
-    const data = {
-      id: props.currentDetail.id,
-      status: props.currentDetail.status,
-      isPass: 0,
-      eventNum: props.currentDetail.orderNumber,
-    };
-
-    const response = await flowEvent(data);
-    if (response.data.code === 0) {
-      ElMessage.success('工单已通过');
-      emit('detail-success');
-      handleClose();
-    } else {
-      throw new Error(response.data.msg || '操作失败');
-    }
-  } catch (error) {
-    ElMessage.error(error.message || '操作失败,请稍后重试');
-    emit('detail-error', error);
-  } finally {
-    approveLoading.value = false;
-  }
-};
-
-const handleReject = async () => {
-  if (rejectLoading.value) return;
-  rejectLoading.value = true;
-
-  try {
-    const data = {
-      id: props.currentDetail.id,
-      status: props.currentDetail.status,
-      isPass: 1,
-    };
-
-    const response = await flowEvent(data);
-    if (response.data.code === 0) {
-      ElMessage.success('工单未通过');
-      emit('detail-success');
-      handleClose();
-    } else {
-      throw new Error(response.data.msg || '操作失败');
-    }
-  } catch (error) {
-    ElMessage.error(error.message || '操作失败,请稍后重试');
-    emit('detail-error', error);
-  } finally {
-    rejectLoading.value = false;
-  }
-};
-
-const handleApproveAndDispatch = () => {
-  // 触发派发工单操作,由父组件处理
-  emit('approve-and-dispatch', props.currentDetail);
-};
-
-const handleComplete = async () => {
-  if (completeLoading.value) return;
-  completeLoading.value = true;
-    if (!props.currentDetail.processingDetail) {
-      ElMessage.warning('请先填写事件处理详情');
-      completeLoading.value = false;
-      return;
-    }
-
-    if (!props.currentDetail.photos || props.currentDetail.photos.length === 0) {
-      ElMessage.warning('请选择上传图片');
-      completeLoading.value = false;
-      return;
-    }
-  try {
-    const data = {
-      id: props.currentDetail.id,
-      status: props.currentDetail.status,
-      processingDetails: props.currentDetail.processingDetail,
-      eventNum: props.currentDetail.orderNumber,
-    };
-    const file = props.currentDetail.photos?.[0]?.raw || null;
-    const response = await flowEvent(data, file);
-    if (response.data.code === 0) {
-      ElMessage.success('工单已完成');
-      emit('detail-success');
-      handleClose();
-    } else {
-      throw new Error(response.data.msg || '操作失败');
-    }
-      handleClose();
-  } catch (error) {
-    console.error('完成工单失败:', error);
-    ElMessage.error(error.message || '操作失败,请稍后重试');
-    emit('detail-error', error);
-      handleClose();
-  } finally {
-    completeLoading.value = false;
-      handleClose();
-  }
-};
-</script>
-
-<style lang="scss">
-.custom-dialog {
-  height: 96vh;
-// min-height: 50vh;
-  .el-dialog__body {
-    border-top: 0.1rem solid #f0f0f0;
-  }
-}
-
-.custom-qrcode-popover {
-  min-width: 160px !important;
-  min-height: 140px !important;
-  position: relative;
-
-  .qrcode-content {
-    margin-top: 8px;
-
-    .close-btn {
-      position: absolute;
-      top: 2px;
-      right: 2px;
-      width: 16px;
-      height: 16px;
-      line-height: 16px;
-      text-align: center;
-      cursor: pointer;
-      color: #999;
-      font-size: 16px;
-      z-index: 10;
-    }
-  }
-}
-</style>
-<style lang="scss" scoped>
-.uploadImg {
-  margin-bottom: 32px;
-}
-
-.tableCss {
-  width: 100%;
-  margin-bottom: 10px;
-}
-
-.step-timer {
-  position: absolute;
-  right: 92%;
-  top: 50%;
-  transform: translateY(-50%);
-  width: 100px;
-  margin-left: 4px;
-  color: #666;
-  font-size: 12px;
-  white-space: nowrap;
-}
-
-.event-total-time {
-  text-align: center;
-  color: #666;
-  font-size: 15px;
-  margin-bottom: 12px;
-}
-
-.action-bar {
-  margin-bottom: 16px;
-}
-
-.el-dialog {
-  .el-form-item {
-    margin-bottom: 20px;
-  }
-}
-
-.el-upload {
-  width: 100%;
-  display: flex;
-  flex-wrap: wrap;
-
-  :deep(.el-upload-list__item) {
-    transition: all 0.3s ease;
-  }
-
-  :deep(.el-upload-list__item:hover) {
-    background-color: #f5f7fa;
-  }
-}
-
-.el-upload__tip {
-  font-size: 12px;
-  color: #909399;
-  margin-top: 12px;
-}
-
-.create-ticket-form {
-  padding: 20px 10px;
-
-  .form-section {
-    background-color: #fff;
-    border-radius: 4px;
-
-    .el-row {
-      margin-bottom: 16px;
-
-      &:last-child {
-        margin-bottom: 0;
-      }
-    }
-  }
-
-  .location-wrapper {
-    width: 100%; // 修改为100%以适应父容器
-    height: auto; // 修改为auto以自适应内容
-
-    .map-button {
-      width: 100%; // 让按钮填满容器宽度
-      height: 36px; // 与其他输入框保持一致的高度
-      display: flex;
-      align-items: center;
-      justify-content: center;
-
-      i {
-        margin-right: 4px;
-      }
-    }
-
-    .location-text {
-      margin-top: 8px;
-      padding: 8px 12px;
-      background-color: #f5f7fa;
-      border-radius: 4px;
-      color: #606266;
-      font-size: 13px;
-      line-height: 1.4;
-    }
-  }
-
-  .upload-wrapper {
-    .uploader {
-      :deep(.el-upload--picture-card) {
-        width: 120px;
-        height: 100px;
-        line-height: 128px;
-      }
-
-      :deep(.el-upload-list__item) {
-        width: 120px;
-        height: 120px;
-      }
-    }
-
-    .upload-tip {
-      font-size: 12px;
-      color: #909399;
-      line-height: 1.4;
-      margin-top: 8px;
-    }
-  }
-
-  .el-form-item {
-    margin-bottom: 18px;
-
-    &:last-child {
-      margin-bottom: 0;
-    }
-  }
-
-  :deep(.el-form-item__label) {
-    font-weight: 500;
-    color: #606266;
-  }
-  :deep(.el-textarea__inner) {
-    padding: 8px 12px;
-  }
-  .full-width {
-    width: 100%;
-  }
-}
-
-:deep(.el-dialog__body) {
-  border-top: 0.1rem solid #f0f0f0;
-}
-
-.dialog-footer-new {
-  text-align: right;
-  padding-top: 16px;
-  border-top: 1px solid #ebeef5;
-
-  .el-button + .el-button {
-    margin-left: 12px;
-  }
-
-  .el-button {
-    padding: 9px 20px;
-
-    &:last-child {
-      margin-left: 12px;
-    }
-  }
-}
-
-.dialog-footer1-new {
-  position: sticky;
-  bottom: 28px;
-  left: 0;
-  right: 0;
-  background: white;
-  z-index: 10;
-  padding: 16px 20px;
-  border-top: 1px solid #ebeef5;
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-
-  .el-button + .el-button {
-    margin-left: 12px;
-  }
-
-  .btngroups {
-    margin-left: 12px;
-  }
-
-  .el-button {
-    padding: 9px 20px;
-
-    &:last-child {
-      margin-left: 12px;
-      margin-right: 12px;
-    }
-  }
-}
-
-.map-container {
-  width: 100%;
-  height: 400px;
-  margin-bottom: 15px;
-  border: 1px solid #dcdfe6;
-  border-radius: 4px;
-  overflow: hidden;
-
-  :deep(.el-input-map) {
-    height: 100%;
-  }
-}
-
-.location-info {
-  margin-top: 10px;
-  padding: 10px;
-  background-color: #f5f7fa;
-  border-radius: 4px;
-
-  p {
-    margin: 5px 0;
-    color: #606266;
-    font-size: 14px;
-  }
-}
-
-.map-select {
-  display: flex;
-  align-items: flex-start;
-  gap: 15px;
-
-  .selected-location {
-    flex: 1;
-    padding: 5px 10px;
-    background-color: #f5f7fa;
-    border-radius: 4px;
-
-    p {
-      margin: 5px 0;
-      color: #606266;
-      font-size: 14px;
-    }
-  }
-}
-
-.preview-image {
-  border-radius: 4px;
-  overflow: hidden;
-  background-color: #f5f7fa;
-}
-
-.image-placeholder,
-.image-error,
-.no-media {
-  height: 200px;
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  color: #909399;
-  background-color: #f5f7fa;
-  border-radius: 4px;
-
-  i {
-    font-size: 32px;
-    margin-bottom: 8px;
-  }
-}
-
-.no-media {
-  border: 1px dashed #d9d9d9;
-}
-
-.detail-container {
-  padding: 0 20px;
-
-  .detail-top-title {
-    display: flex;
-    justify-content: center;
-    align-items: center;
-
-    .event-orderNumber {
-      margin-right: 10px;
-    }
-  }
-}
-
-.status-flow {
-  margin-bottom: 20px;
-
-  .custom-steps {
-    .el-step__description {
-      position: relative;
-      margin: 0;
-      padding: 0;
-    }
-
-    // 添加发起任务步骤的特殊样式
-    .init-step-info {
-      display: flex;
-      flex-direction: column;
-      align-items: center;
-      text-align: center;
-      width: 130px;
-
-      .creator-name {
-        font-size: 14px;
-        font-weight: bold;
-        color: #303133;
-        margin-bottom: 4px;
-      }
-
-      .create-time {
-        font-size: 10px;
-        color: #909399;
-      }
-    }
-
-    // 保持其他步骤的原有样式
-    .step-info {
-      display: flex;
-      margin: 0;
-      padding: 0;
-      justify-content: space-between;
-      align-items: center;
-      width: 200px;
-
-      .process-time {
-        font-size: 10px;
-        color: #909399;
-        text-align: left;
-        margin-left: -50%;
-        padding-left: 0%;
-        flex: 1;
-      }
-
-      .handler-name {
-        font-size: 14px;
-        font-weight: bold;
-        color: #303133;
-        text-align: left;
-        flex: 1;
-      }
-    }
-  }
-}
-
-.basic-info {
-  margin-bottom: 20px;
-}
-
-.media-section {
-  // margin-bottom: 20px;
-
-  .el-row {
-    display: flex;
-    align-items: center;
-  }
-}
-
-.leftBtn {
-  width: 70px;
-  height: 32px;
-  background-color: #999;
-  border-radius: 5px;
-  text-align: center;
-  line-height: 32px;
-  color: #fff;
-  cursor: pointer;
-  opacity: 0.8;
-}
-
-.disableds {
-  background: #999 !important;
-  cursor: not-allowed !important;
-  pointer-events: none;
-  opacity: 0.3 !important;
-}
-
-.PopUpTableScrolls {
-  max-height: 600px;
-  overflow-y: scroll;
-  overflow-x: hidden;
-
-}
-
-.media-box {
-  width: 100%;
-  border: 1px solid #dcdfe6;
-  border-radius: 4px;
-  padding: 10px;
-  background: #fff;
-  box-sizing: border-box;
-
-  .media-title {
-    font-weight: bold;
-    margin-bottom: 5px;
-    display: flex;
-    align-items: center;
-
-    .QRCodeImg {
-      width: 18px;
-      height: 18px;
-      cursor: pointer;
-      padding-bottom: 1px;
-    }
-  }
-
-  .media-content {
-    position: relative;
-    height: 500px;
-
-    :deep(.el-image) {
-      width: 100% !important;
-      max-width: 100%;
-      max-height: 100%;
-
-      .el-image__inner {
-        width: 100%;
-        height: 100%;
-        object-fit: cover !important;
-      }
-    }
-  }
-}
-
-.image-placeholder,
-.image-error,
-.no-media {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  height: 100%;
-  color: #909399;
-  background-color: #f5f7fa;
-  border-radius: 4px;
-}
-
-.image-placeholder i,
-.image-error i {
-  font-size: 32px;
-  margin-bottom: 8px;
-}
-
-.no-media {
-  border: 1px dashed #d9d9d9;
-}
-
-.info-table {
-  margin-bottom: 20px;
-}
-
-.info-item {
-  display: flex;
-  margin-bottom: 10px;
-}
-
-.info-label {
-  font-weight: bold;
-  width: 120px;
-  color: #606266;
-}
-
-.info-value {
-  flex: 1;
-  color: #303133;
-  word-break: break-word;
-}
-
-.readonly-processing-detail {
-  background-color: #f5f7fa;
-  padding: 12px;
-  border-radius: 4px;
-  min-height: 30px;
-  color: #606266;
-  line-height: 1.5;
-  display: block;
-  text-align: left;
-  margin-bottom: 5px;
-
-  &:first-child {
-    font-weight: bold;
-    margin-bottom: 4px;
-  }
-}
-
-// 添加删除按钮样式
-.danger-button {
-  color: #f56c6c;
-}
-
-.danger-button:hover {
-  color: #f78989;
-}
-
-.custom-steps-container {
-  width: 100%;
-  margin: 10px 0;
-}
-
-.steps-titles {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 14px;
-  position: relative;
-}
-
-.step-title {
-  text-align: center;
-  flex: 1;
-  font-size: 14px;
-  color: #999;
-  position: relative;
-  padding-bottom: 5px;
-}
-
-.step-title.active {
-  color: #409eff;
-  font-weight: bold;
-}
-
-.event-title-center {
-  text-align: center;
-  font-size: 20px;
-  font-weight: bold;
-  margin-bottom: 5px;
-  color: #333;
-}
-
-.custom-steps {
-  margin-top: -20px;
-
-  :deep(.el-step__description) {
-    margin-top: 8px;
-    padding: 0 20px;
-  }
-}
-
-.step-description {
-  font-size: 14px;
-  color: #666;
-  line-height: 1.5;
-  display: block;
-  text-align: center;
-
-  &:first-child {
-    font-weight: bold;
-    margin-bottom: 4px;
-  }
-}
-
-// 覆盖其他相关样式
-.status-flow {
-  .custom-steps {
-    .el-step__description {
-      position: relative;
-      margin: 0;
-      padding: 0;
-    }
-
-    // 移除之前的样式
-    .init-step-info,
-    .step-info {
-      display: block;
-      width: auto;
-      text-align: center;
-    }
-  }
-}
-/* 新建工单和处理工单的上传组件样式 */
-.create-upload,
-.detail-upload {
-  :deep(.el-upload--picture-card) {
-    width: 120px;
-    height: 100px;
-    line-height: 100px;
-  }
-
-  /* 隐藏额外的上传按钮 */
-  :deep(.el-upload.el-upload--picture-card) {
-    display: none;
-  }
-
-  /* 当没有图片时显示上传按钮 */
-  :deep(.el-upload.el-upload--picture-card:first-child) {
-    display: flex;
-  }
-
-  /* 上传组件的预览图片样式 */
-  :deep(.el-upload-list--picture-card .el-upload-list__item) {
-    width: 120px;
-    height: 100px;
-  }
-}
-
-/* 原有图片预览的样式 */
-.el-image-viewer__wrapper {
-  :deep(.el-image-viewer__img) {
-    max-width: 100%;
-    max-height: 100%;
-    object-fit: contain;
-  }
-}
-
-/* 必填项样式 */
-.required-label {
-  position: relative;
-  display: inline-block;
-
-  .required-star {
-    color: #f56c6c;
-    margin-right: 4px;
-  }
-}
-
-/* 必填输入框样式 */
-.required-input {
-  width: 100%;
-
-  :deep(.el-input__inner),
-  :deep(.el-textarea__inner) {
-    &:focus {
-      border-color: #409eff;
-    }
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/tool/code.vue b/applications/task-work-order/src/views/tool/code.vue
deleted file mode 100644
index a398b4d..0000000
--- a/applications/task-work-order/src/views/tool/code.vue
+++ /dev/null
@@ -1,659 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud
-      :option="option"
-      :table-loading="loading"
-      :data="data"
-      ref="crud"
-      v-model="form"
-      :permission="permissionList"
-      v-model:page="page"
-      @row-del="rowDel"
-      @row-update="rowUpdate"
-      @row-save="rowSave"
-      :before-open="beforeOpen"
-      @search-change="searchChange"
-      @search-reset="searchReset"
-      @selection-change="selectionChange"
-      @current-change="currentChange"
-      @size-change="sizeChange"
-      @refresh-change="refreshChange"
-      @on-load="onLoad"
-    >
-      <template #menu-left>
-        <el-button
-          type="danger"
-          icon="el-icon-delete"
-          v-if="permission.code_delete"
-          plain
-          @click="handleDelete"
-          >删 除
-        </el-button>
-        <el-button type="primary" plain icon="el-icon-refresh" @click="handleBuild"
-          >代码生成
-        </el-button>
-      </template>
-      <template #menu="scope">
-        <el-button
-          type="primary"
-          text
-          icon="el-icon-document-copy"
-          v-if="permission.code_edit"
-          class="none-border"
-          @click.stop="handleCopy(scope.row)"
-          >复制
-        </el-button>
-      </template>
-    </avue-crud>
-  </basic-container>
-</template>
-
-<script>
-import { getList, getCode, build, remove, add, update, copy } from '@/api/tool/code';
-import { getDetail as modelDetail, prototypeDetail } from '@/api/tool/model';
-import { templateDic } from '@/const/tool/model';
-import { validatenull } from '@/utils/validate';
-import { mapGetters } from 'vuex';
-
-export default {
-  data() {
-    return {
-      form: {},
-      selectionList: [],
-      loading: true,
-      query: {},
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      option: {
-        dialogWidth: 900,
-        tip: false,
-        searchShow: true,
-        searchMenuSpan: 6,
-        border: true,
-        index: true,
-        selection: true,
-        labelWidth: 120,
-        menuWidth: 300,
-        viewBtn: true,
-        grid: true,
-        dialogClickModal: false,
-        tabs: true,
-        column: [
-          {
-            label: '模块名',
-            prop: 'codeName',
-            search: true,
-            display: false,
-          },
-          {
-            label: '模版类型',
-            prop: 'templateType',
-            type: 'select',
-            dicData: templateDic,
-            display: false,
-          },
-          {
-            label: '表名',
-            prop: 'tableName',
-            search: true,
-            display: false,
-          },
-          {
-            label: '服务名',
-            prop: 'serviceName',
-            search: true,
-            display: false,
-          },
-          {
-            label: '包名',
-            prop: 'packageName',
-            display: false,
-          },
-        ],
-        group: [
-          {
-            label: '模型配置',
-            prop: 'modelSetting',
-            icon: 'el-icon-tickets',
-            column: [
-              {
-                label: '数据模型',
-                prop: 'modelId',
-                search: true,
-                span: 24,
-                type: 'select',
-                dicUrl: '/blade-develop/model/select',
-                props: {
-                  label: 'modelName',
-                  value: 'id',
-                },
-                rules: [
-                  {
-                    required: true,
-                    message: '请选择数据模型',
-                    trigger: 'blur',
-                  },
-                ],
-              },
-              {
-                label: '模块名',
-                prop: 'codeName',
-                search: true,
-                rules: [
-                  {
-                    required: true,
-                    message: '请输入模块名',
-                    trigger: 'blur',
-                  },
-                ],
-              },
-              {
-                label: '服务名',
-                prop: 'serviceName',
-                search: true,
-                rules: [
-                  {
-                    required: true,
-                    message: '请输入服务名',
-                    trigger: 'blur',
-                  },
-                ],
-              },
-              {
-                label: '表名',
-                prop: 'tableName',
-                rules: [
-                  {
-                    required: true,
-                    message: '请输入表名',
-                    trigger: 'blur',
-                  },
-                ],
-              },
-              {
-                label: '表前缀',
-                prop: 'tablePrefix',
-                hide: true,
-                rules: [
-                  {
-                    required: true,
-                    message: '请输入表前缀',
-                    trigger: 'blur',
-                  },
-                ],
-              },
-              {
-                label: '主键名',
-                prop: 'pkName',
-                hide: true,
-                rules: [
-                  {
-                    required: true,
-                    message: '请输入主键名',
-                    trigger: 'blur',
-                  },
-                ],
-              },
-              {
-                label: '包名',
-                prop: 'packageName',
-                overHidden: true,
-                rules: [
-                  {
-                    required: true,
-                    message: '请输入包名',
-                    trigger: 'blur',
-                  },
-                ],
-              },
-            ],
-          },
-          {
-            label: '模版配置',
-            prop: 'templateSetting',
-            icon: 'el-icon-copy-document',
-            column: [
-              {
-                label: '模版类型',
-                prop: 'templateType',
-                type: 'select',
-                dicData: templateDic,
-                value: 'crud',
-                rules: [
-                  {
-                    required: true,
-                    message: '请选择模版类型',
-                    trigger: 'blur',
-                  },
-                ],
-              },
-              {
-                label: '作者信息',
-                prop: 'author',
-                value: 'BladeX',
-                rules: [
-                  {
-                    required: true,
-                    message: '请输入作者',
-                    trigger: 'blur',
-                  },
-                ],
-              },
-              {
-                label: '子表模型',
-                prop: 'subModelId',
-                type: 'select',
-                dicUrl: '/blade-develop/model/select',
-                props: {
-                  label: 'modelName',
-                  value: 'id',
-                },
-                display: false,
-                hide: true,
-              },
-              {
-                label: '子表外键',
-                prop: 'subFkId',
-                display: false,
-                hide: true,
-              },
-              {
-                label: '树主键字段',
-                prop: 'treeId',
-                type: 'select',
-                dicData: [],
-                props: {
-                  label: 'jdbcComment',
-                  value: 'jdbcName',
-                },
-                display: false,
-                hide: true,
-              },
-              {
-                label: '树父主键字段',
-                prop: 'treePid',
-                type: 'select',
-                dicData: [],
-                props: {
-                  label: 'jdbcComment',
-                  value: 'jdbcName',
-                },
-                display: false,
-                hide: true,
-              },
-              {
-                label: '树名称字段',
-                prop: 'treeName',
-                type: 'select',
-                dicData: [],
-                props: {
-                  label: 'jdbcComment',
-                  value: 'jdbcName',
-                },
-                display: false,
-                hide: true,
-              },
-            ],
-          },
-          {
-            label: '生成配置',
-            prop: 'codingSetting',
-            icon: 'el-icon-printer',
-            column: [
-              {
-                label: '基础业务',
-                labelTip: '配置是否使用BladeX封装的BaseService解锁更多功能',
-                prop: 'baseMode',
-                type: 'radio',
-                dicUrl: '/blade-system/dict/dictionary?code=yes_no',
-                props: {
-                  label: 'dictValue',
-                  value: 'dictKey',
-                },
-                value: 2,
-                dataType: 'number',
-                hide: true,
-                rules: [
-                  {
-                    required: true,
-                    message: '请选择基础业务',
-                    trigger: 'blur',
-                  },
-                ],
-              },
-              {
-                label: '包装器',
-                labelTip: '配置是否使用Wrapper包装器来拓展Controller返回列表的字段',
-                prop: 'wrapMode',
-                type: 'radio',
-                dicUrl: '/blade-system/dict/dictionary?code=yes_no',
-                props: {
-                  label: 'dictValue',
-                  value: 'dictKey',
-                },
-                value: 2,
-                dataType: 'number',
-                hide: true,
-                rules: [
-                  {
-                    required: true,
-                    message: '请选择包装器',
-                    trigger: 'blur',
-                  },
-                ],
-              },
-              {
-                label: '远程调用',
-                labelTip: '配置是否使用Feign远程调用',
-                prop: 'feignMode',
-                type: 'radio',
-                dicUrl: '/blade-system/dict/dictionary?code=yes_no',
-                props: {
-                  label: 'dictValue',
-                  value: 'dictKey',
-                },
-                value: 1,
-                dataType: 'number',
-                hide: true,
-                rules: [
-                  {
-                    required: true,
-                    message: '请选择基础业务',
-                    trigger: 'blur',
-                  },
-                ],
-              },
-              {
-                label: '代码风格',
-                labelTip: '选择不同底层实现的代码模版',
-                prop: 'codeStyle',
-                type: 'radio',
-                dicData: [
-                  {
-                    label: 'saber3',
-                    value: 'saber3',
-                  },
-                  {
-                    label: 'element-plus',
-                    value: 'element-plus',
-                  },
-                ],
-                value: 'saber3',
-                hide: true,
-                rules: [
-                  {
-                    required: true,
-                    message: '请选择代码风格',
-                    trigger: 'blur',
-                  },
-                ],
-              },
-              {
-                label: '后端生成路径',
-                prop: 'apiPath',
-                span: 24,
-                hide: true,
-                rules: [
-                  {
-                    required: true,
-                    message: '请输入后端生成路径',
-                    trigger: 'blur',
-                  },
-                ],
-              },
-              {
-                label: '前端生成路径',
-                prop: 'webPath',
-                span: 24,
-                hide: true,
-                rules: [
-                  {
-                    required: true,
-                    message: '请输入前端生成路径',
-                    trigger: 'blur',
-                  },
-                ],
-              },
-            ],
-          },
-        ],
-      },
-      data: [],
-    };
-  },
-  watch: {
-    'form.modelId'() {
-      if (!validatenull(this.form.modelId)) {
-        // 获取数据模型信息
-        modelDetail(this.form.modelId).then(res => {
-          const result = res.data;
-          if (result.success) {
-            const { modelName, modelTable, modelCode } = result.data;
-            const lowerModelCode = modelCode.toLowerCase();
-            //if (validatenull(this.form.tablePrefix)) {
-            this.form.tablePrefix = modelTable.split('_')[0] + '_';
-            //}
-            //if (validatenull(this.form.tableName)) {
-            this.form.tableName = modelTable;
-            //}
-            //if (validatenull(this.form.codeName)) {
-            this.form.codeName = modelName;
-            //}
-            //if (validatenull(this.form.serviceName)) {
-            this.form.serviceName = `blade-${lowerModelCode}`;
-            //}
-            //if (validatenull(this.form.pkName)) {
-            this.form.pkName = 'id';
-            //}
-            //if (validatenull(this.form.packageName)) {
-            this.form.packageName = `org.springblade.${lowerModelCode}`;
-            //}
-            //if (validatenull(this.form.subFkId) && !validatenull(this.form.tablePrefix)) {
-            this.form.subFkId = modelTable.replace(this.form.tablePrefix, '') + '_id';
-            //}
-
-            // 获取数据原型信息
-            prototypeDetail(this.form.modelId).then(res => {
-              const result = res.data;
-              if (result.success) {
-                const columnTreeId = this.findObject(this.option.group, 'treeId');
-                const columnTreePid = this.findObject(this.option.group, 'treePid');
-                const columnTreeName = this.findObject(this.option.group, 'treeName');
-                columnTreeId.dicData = result.data;
-                columnTreePid.dicData = result.data;
-                columnTreeName.dicData = result.data;
-              }
-            });
-          }
-        });
-      }
-    },
-    'form.templateType'() {
-      // 模版类型
-      const type = this.form.templateType;
-
-      // 主子表字段显隐
-      const columnSubModelId = this.findObject(this.option.group, 'subModelId');
-      const columnSubFkId = this.findObject(this.option.group, 'subFkId');
-      columnSubModelId.display = type === 'sub';
-      columnSubFkId.display = type === 'sub';
-
-      // 树表字段显隐
-      const columnTreeId = this.findObject(this.option.group, 'treeId');
-      const columnTreePid = this.findObject(this.option.group, 'treePid');
-      const columnTreeName = this.findObject(this.option.group, 'treeName');
-      columnTreeId.display = type === 'tree';
-      columnTreePid.display = type === 'tree';
-      columnTreeName.display = type === 'tree';
-    },
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList() {
-      return {
-        addBtn: this.validData(this.permission.code_add, false),
-        viewBtn: this.validData(this.permission.code_view, false),
-        delBtn: this.validData(this.permission.code_delete, false),
-        editBtn: this.validData(this.permission.code_edit, false),
-      };
-    },
-    ids() {
-      let ids = [];
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id);
-      });
-      return ids.join(',');
-    },
-  },
-  methods: {
-    rowSave(row, done, loading) {
-      add(row).then(
-        () => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          done();
-        },
-        error => {
-          window.console.log(error);
-          loading();
-        }
-      );
-    },
-    rowUpdate(row, index, done, loading) {
-      update(row).then(
-        () => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          done();
-        },
-        error => {
-          window.console.log(error);
-          loading();
-        }
-      );
-    },
-    rowDel(row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-        });
-    },
-    searchReset() {
-      this.query = {};
-      this.onLoad(this.page);
-    },
-    searchChange(params, done) {
-      this.query = params;
-      this.page.currentPage = 1;
-      this.onLoad(this.page, params);
-      done();
-    },
-    selectionChange(list) {
-      this.selectionList = list;
-    },
-    selectionClear() {
-      this.selectionList = [];
-      this.$refs.crud.toggleSelection();
-    },
-    handleDelete() {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据');
-        return;
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          this.$refs.crud.toggleSelection();
-        });
-    },
-    handleBuild() {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据');
-        return;
-      }
-      this.$confirm('是否生成选中模块的代码?', {
-        title: '代码生成确认',
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      }).then(() => {
-        return build(this.ids).then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          this.$refs.crud.toggleSelection();
-        });
-      });
-    },
-    handleCopy(row) {
-      copy(row.id).then(() => {
-        this.onLoad(this.page);
-        this.$message({
-          type: 'success',
-          message: '复制成功!',
-        });
-      });
-    },
-    beforeOpen(done, type) {
-      if (['edit', 'view'].includes(type)) {
-        getCode(this.form.id).then(res => {
-          this.form = res.data.data;
-        });
-      }
-      done();
-    },
-    currentChange(currentPage) {
-      this.page.currentPage = currentPage;
-    },
-    sizeChange(pageSize) {
-      this.page.pageSize = pageSize;
-    },
-    refreshChange() {
-      this.onLoad(this.page, this.query);
-    },
-    onLoad(page, params = {}) {
-      this.loading = true;
-      getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
-        const data = res.data.data;
-        this.page.total = data.total;
-        this.data = data.records;
-        this.loading = false;
-        this.selectionClear();
-      });
-    },
-  },
-};
-</script>
diff --git a/applications/task-work-order/src/views/tool/datasource.vue b/applications/task-work-order/src/views/tool/datasource.vue
deleted file mode 100644
index a5d42e6..0000000
--- a/applications/task-work-order/src/views/tool/datasource.vue
+++ /dev/null
@@ -1,375 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud
-      :option="option"
-      :table-loading="loading"
-      :data="data"
-      v-model:page="page"
-      :permission="permissionList"
-      :before-open="beforeOpen"
-      v-model="form"
-      ref="crud"
-      @row-update="rowUpdate"
-      @row-save="rowSave"
-      @row-del="rowDel"
-      @search-change="searchChange"
-      @search-reset="searchReset"
-      @selection-change="selectionChange"
-      @current-change="currentChange"
-      @size-change="sizeChange"
-      @refresh-change="refreshChange"
-      @on-load="onLoad"
-    >
-      <template #menu-left>
-        <el-button
-          type="danger"
-          icon="el-icon-delete"
-          plain
-          v-if="permission.datasource_delete"
-          @click="handleDelete"
-          >删 除
-        </el-button>
-      </template>
-    </avue-crud>
-  </basic-container>
-</template>
-
-<script>
-import { getList, getDetail, add, update, remove } from '@/api/tool/datasource';
-import { mapGetters } from 'vuex';
-import func from '@/utils/func';
-
-export default {
-  data() {
-    return {
-      form: {},
-      query: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      selectionList: [],
-      option: {
-        dialogWidth: 900,
-        tip: false,
-        searchShow: true,
-        searchMenuSpan: 6,
-        border: true,
-        index: true,
-        viewBtn: true,
-        grid: true,
-        selection: true,
-        dialogClickModal: false,
-        column: [
-          {
-            label: '名称',
-            prop: 'name',
-            width: 120,
-            span: 24,
-            search: true,
-            gridRow: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入数据源名称',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '数据类型',
-            type: 'radio',
-            value: 1,
-            span: 24,
-            width: 120,
-            searchLabelWidth: 100,
-            row: true,
-            gridRow: true,
-            dicUrl: '/blade-system/dict/dictionary?code=datasource_category',
-            props: {
-              label: 'dictValue',
-              value: 'dictKey',
-            },
-            dataType: 'number',
-            prop: 'category',
-            search: true,
-            rules: [
-              {
-                required: true,
-                message: '请选择分类',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: 'YAML',
-            prop: 'shardingConfig',
-            span: 24,
-            minRows: 5,
-            hide: true,
-            display: false,
-            gridRow: true,
-            type: 'textarea',
-            rules: [
-              {
-                required: true,
-                message: '请输入YAML配置',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '驱动类',
-            prop: 'driverClass',
-            type: 'select',
-            span: 24,
-            gridRow: true,
-            dicData: [
-              {
-                label: 'com.mysql.cj.jdbc.Driver',
-                value: 'com.mysql.cj.jdbc.Driver',
-              },
-              {
-                label: 'org.postgresql.Driver',
-                value: 'org.postgresql.Driver',
-              },
-              {
-                label: 'oracle.jdbc.OracleDriver',
-                value: 'oracle.jdbc.OracleDriver',
-              },
-              {
-                label: 'com.microsoft.sqlserver.jdbc.SQLServerDriver',
-                value: 'com.microsoft.sqlserver.jdbc.SQLServerDriver',
-              },
-              {
-                label: 'dm.jdbc.driver.DmDriver',
-                value: 'dm.jdbc.driver.DmDriver',
-              },
-            ],
-            width: 200,
-            display: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入驱动类',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '用户名',
-            prop: 'username',
-            width: 120,
-            display: true,
-            gridRow: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入用户名',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '密码',
-            prop: 'password',
-            hide: true,
-            display: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入密码',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '连接地址',
-            prop: 'url',
-            span: 24,
-            display: true,
-            gridRow: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入连接地址',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '备注',
-            prop: 'remark',
-            span: 24,
-            minRows: 3,
-            hide: true,
-            type: 'textarea',
-          },
-        ],
-      },
-      data: [],
-    };
-  },
-  watch: {
-    'form.category'() {
-      const category = func.toInt(this.form.category);
-      this.$refs.crud.option.column.filter(item => {
-        if (item.prop === 'driverClass') {
-          item.display = category === 1;
-        }
-        if (item.prop === 'url') {
-          item.display = category === 1;
-        }
-        if (item.prop === 'username') {
-          item.display = category === 1;
-        }
-        if (item.prop === 'password') {
-          item.display = category === 1;
-        }
-        if (item.prop === 'shardingConfig') {
-          item.display = category === 2;
-        }
-      });
-    },
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList() {
-      return {
-        addBtn: this.validData(this.permission.datasource_add, false),
-        viewBtn: this.validData(this.permission.datasource_view, false),
-        delBtn: this.validData(this.permission.datasource_delete, false),
-        editBtn: this.validData(this.permission.datasource_edit, false),
-      };
-    },
-    ids() {
-      let ids = [];
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id);
-      });
-      return ids.join(',');
-    },
-  },
-  methods: {
-    rowSave(row, done, loading) {
-      add(row).then(
-        () => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          done();
-        },
-        error => {
-          window.console.log(error);
-          loading();
-        }
-      );
-    },
-    rowUpdate(row, index, done, loading) {
-      update(row).then(
-        () => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          done();
-        },
-        error => {
-          window.console.log(error);
-          loading();
-        }
-      );
-    },
-    rowDel(row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-        });
-    },
-    handleDelete() {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据');
-        return;
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          this.$refs.crud.toggleSelection();
-        });
-    },
-    beforeOpen(done, type) {
-      if (['edit', 'view'].includes(type)) {
-        getDetail(this.form.id).then(res => {
-          this.form = res.data.data;
-        });
-      }
-      done();
-    },
-    searchReset() {
-      this.query = {};
-      this.onLoad(this.page);
-    },
-    searchChange(params, done) {
-      this.query = params;
-      this.page.currentPage = 1;
-      this.onLoad(this.page, params);
-      done();
-    },
-    selectionChange(list) {
-      this.selectionList = list;
-    },
-    selectionClear() {
-      this.selectionList = [];
-      this.$refs.crud.toggleSelection();
-    },
-    currentChange(currentPage) {
-      this.page.currentPage = currentPage;
-    },
-    sizeChange(pageSize) {
-      this.page.pageSize = pageSize;
-    },
-    refreshChange() {
-      this.onLoad(this.page, this.query);
-    },
-    onLoad(page, params = {}) {
-      this.loading = true;
-      getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
-        const data = res.data.data;
-        this.page.total = data.total;
-        this.data = data.records;
-        this.loading = false;
-        this.selectionClear();
-      });
-    },
-  },
-};
-</script>
-
-<style></style>
diff --git a/applications/task-work-order/src/views/tool/model.vue b/applications/task-work-order/src/views/tool/model.vue
deleted file mode 100644
index 9f252fc..0000000
--- a/applications/task-work-order/src/views/tool/model.vue
+++ /dev/null
@@ -1,393 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud
-      :option="option"
-      :table-loading="loading"
-      :data="data"
-      :page="page"
-      :permission="permissionList"
-      :before-open="beforeOpen"
-      v-model="form"
-      v-loading.fullscreen.lock="fullscreenLoading"
-      ref="crud"
-      @row-update="rowUpdate"
-      @row-save="rowSave"
-      @row-del="rowDel"
-      @search-change="searchChange"
-      @search-reset="searchReset"
-      @selection-change="selectionChange"
-      @current-change="currentChange"
-      @size-change="sizeChange"
-      @on-load="onLoad"
-    >
-      <template #menu-left>
-        <el-button type="danger" icon="el-icon-delete" plain @click="handleDelete"
-          >删 除
-        </el-button>
-      </template>
-      <template #menu="{ row }">
-        <el-button
-          type="primary"
-          text
-          icon="el-icon-setting"
-          plain
-          class="none-border"
-          @click.stop="handleModel(row)"
-          >模型配置
-        </el-button>
-      </template>
-      <template #modelTable="{ row }">
-        <el-tag>{{ row.modelTable }}</el-tag>
-      </template>
-    </avue-crud>
-    <el-dialog title="数据库模型配置" v-model="modelBox" :fullscreen="true" append-to-body>
-      <avue-crud
-        ref="crudModel"
-        :option="optionModel"
-        :table-loading="loading"
-        :data="fields"
-      ></avue-crud>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button type="danger" @click="modelBox = false">关 闭</el-button>
-          <el-button type="primary" @click="handleSubmit">提 交</el-button>
-        </span>
-      </template>
-    </el-dialog>
-  </basic-container>
-</template>
-
-<script>
-import {
-  getList,
-  getDetail,
-  add,
-  update,
-  remove,
-  getTableList,
-  getTableInfoByName,
-  getModelPrototype,
-  submitModelPrototype,
-} from '@/api/tool/model';
-import { entityDic, option, optionModel } from '@/const/tool/model';
-import { validatenull } from '@/utils/validate';
-import { mapGetters } from 'vuex';
-
-export default {
-  data() {
-    return {
-      form: {},
-      query: {},
-      loading: true,
-      loadingOption: {
-        lock: true,
-        text: '物理表读取中',
-        background: 'rgba(0, 0, 0, 0.7)',
-      },
-      fullscreenLoading: false,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      selectionList: [],
-      modelBox: false,
-      modelId: 0,
-      datasourceId: 1,
-      tableInfo: {},
-      active: 0,
-      stepStart: 0,
-      stepEnd: 4,
-      data: [],
-      option: option,
-      optionModel: optionModel,
-      formStep: {},
-      fields: [],
-      selectionModelList: [],
-      // 默认不需要显示的字段名
-      hideFields: [
-        'id',
-        'tenant_id',
-        'create_user',
-        'create_dept',
-        'create_time',
-        'update_user',
-        'update_time',
-        'status',
-        'is_deleted',
-      ],
-    };
-  },
-  watch: {
-    'form.datasourceId'() {
-      if (!validatenull(this.form.datasourceId)) {
-        const fullLoading = this.$loading(this.loadingOption);
-        getTableList(this.form.datasourceId)
-          .then(res => {
-            const column = this.findObject(this.option.column, 'modelTable');
-            column.dicData = res.data.data;
-            fullLoading.close();
-          })
-          .catch(() => {
-            fullLoading.close();
-          });
-      }
-    },
-    'form.modelTable'() {
-      if (!validatenull(this.form.modelTable)) {
-        const fullLoading = this.$loading(this.loadingOption);
-        getTableInfoByName(this.form.modelTable, this.form.datasourceId)
-          .then(res => {
-            const result = res.data;
-            if (result.success) {
-              const { comment, entityName } = result.data;
-              //if (validatenull(this.form.modelClass)) {
-              this.form.modelClass = entityName;
-              //}
-              //if (validatenull(this.form.modelName)) {
-              this.form.modelName = comment;
-              //}
-              //if (validatenull(this.form.modelCode)) {
-              this.form.modelCode = entityName.replace(/^\S/, s => s.toLowerCase());
-              //}
-              fullLoading.close();
-            }
-          })
-          .catch(() => {
-            fullLoading.close();
-          });
-      }
-    },
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList() {
-      return {
-        addBtn: true,
-        delBtn: true,
-        editBtn: true,
-        viewBtn: false,
-      };
-    },
-    ids() {
-      let ids = [];
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id);
-      });
-      return ids.join(',');
-    },
-  },
-  methods: {
-    rowSave(row, done, loading) {
-      add(row).then(
-        res => {
-          done();
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          this.$confirm('是否进行模型配置?', {
-            confirmButtonText: '确定',
-            cancelButtonText: '取消',
-            type: 'warning',
-          }).then(() => {
-            let model = {
-              id: res.data.data.id,
-              datasourceId: res.data.data.datasourceId,
-            };
-            this.handleModel(model);
-          });
-        },
-        error => {
-          loading();
-          window.console.log(error);
-        }
-      );
-    },
-    rowUpdate(row, index, done, loading) {
-      update(row).then(
-        () => {
-          done();
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-        },
-        error => {
-          loading();
-          window.console.log(error);
-        }
-      );
-    },
-    rowDel(row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-        });
-    },
-    handleDelete() {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据');
-        return;
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          this.$refs.crud.toggleSelection();
-        });
-    },
-    beforeOpen(done, type) {
-      if (['edit', 'view'].includes(type)) {
-        getDetail(this.form.id).then(res => {
-          this.form = res.data.data;
-        });
-      }
-      done();
-    },
-    searchReset() {
-      this.query = {};
-      this.onLoad(this.page);
-    },
-    searchChange(params, done) {
-      this.query = params;
-      this.onLoad(this.page, params);
-      done();
-    },
-    selectionChange(list) {
-      this.selectionList = list;
-    },
-    selectionModelChange(list) {
-      this.selectionModelList = list;
-    },
-    selectionClear() {
-      this.selectionList = [];
-      this.$refs.crud.toggleSelection();
-    },
-    currentChange(currentPage) {
-      this.page.currentPage = currentPage;
-    },
-    sizeChange(pageSize) {
-      this.page.pageSize = pageSize;
-    },
-    onLoad(page, params = {}) {
-      this.loading = true;
-      getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
-        const data = res.data.data;
-        this.page.total = data.total;
-        this.data = data.records;
-        this.loading = false;
-        this.selectionClear();
-      });
-    },
-    handleModel(row) {
-      this.fields = [];
-      this.modelBox = true;
-      this.loading = true;
-      this.modelId = row.id;
-      this.datasourceId = row.datasourceId;
-      getModelPrototype(this.modelId, this.datasourceId).then(res => {
-        const result = res.data;
-        if (result.success) {
-          this.fields = result.data;
-          this.fields.forEach(item => {
-            item.$cellEdit = true;
-            item.modelId = this.modelId;
-            // 根据字段物理类型自动适配实体类型
-            if (!validatenull(item.name)) {
-              item.jdbcName = item.name;
-              item.jdbcType = item.propertyType;
-              item.jdbcComment = item.comment;
-              if (item.propertyType === 'LocalDateTime') {
-                item.propertyType = 'Date';
-                item.propertyEntity = 'java.util.Date';
-              } else {
-                entityDic.forEach(d => {
-                  if (d.label === item.propertyType) {
-                    item.propertyType = d.label;
-                    item.propertyEntity = d.value;
-                  }
-                });
-              }
-            }
-            // 首次加载配置默认值
-            if (validatenull(item.id)) {
-              item.isList = 1;
-              item.isForm = 1;
-              item.isRow = 0;
-              item.isRequired = 0;
-              item.isQuery = 0;
-              item.componentType = 'input';
-              // 默认不需要显示的字段名配置
-              if (this.hideFields.includes(item.jdbcName)) {
-                item.isList = 0;
-                item.isForm = 0;
-                item.isRequired = 0;
-              }
-            }
-          });
-          this.loading = false;
-        }
-      });
-    },
-    handleSubmit() {
-      console.log(this.fields);
-      this.$confirm('确定提交模型配置?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      }).then(() => {
-        this.fields.forEach(item => {
-          entityDic.forEach(d => {
-            if (d.value === item.propertyEntity) {
-              item.propertyType = d.label;
-            }
-          });
-        });
-        submitModelPrototype(this.fields).then(res => {
-          const result = res.data;
-          if (result.success) {
-            this.$message.success(result.msg);
-            this.modelBox = false;
-          } else {
-            this.$message.error(result.msg);
-          }
-        });
-      });
-    },
-  },
-};
-</script>
-<style scoped>
-.none-border {
-  border: 0;
-  background-color: transparent !important;
-}
-
-.step-div {
-  margin-top: 30px;
-}
-</style>
diff --git a/applications/task-work-order/src/views/wel/components/backlog.vue b/applications/task-work-order/src/views/wel/components/backlog.vue
deleted file mode 100644
index d2b2162..0000000
--- a/applications/task-work-order/src/views/wel/components/backlog.vue
+++ /dev/null
@@ -1,434 +0,0 @@
-<template>
-  <div class="bocklogBox">
-    <div class="block">
-      <div class="titleBox">
-        <div class="title">待办事项</div>
-        <div class="rightTab">
-          <div class="titleItem" :class="item.name === checked ? 'activeItem' : ''" v-for="(item, index) in titleList"
-            :key="index" @click="titleClick(item, index)">
-            <div>
-              {{ item.name }}
-              <div class="dots">{{ item.number >= 100 ? '99+' : item.number }}</div>
-              
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <div class="todo-items" v-if="todos.length > 0" v-loading="loading" element-loading-background="rgba(255, 255, 255, 0.5)">
-        <div v-for="(item, index) in todos" :key="index" class="todo-item" :style="getStatusStyle(item.status)"
-          @click="jumporder(item)">
-          <div class="status-indicator"><img :src="getStatus(item.status)" alt=""></div>
-
-          <div class="content-wrapper">
-            <div class="main-content">
-              <span class="status-tag" :style="{ color: getStatusColor(item.status) }">{{
-                checked == '智飞工单' ? zfstatusMap[item.status] : statusMap[item.status]
-              }}</span>
-              <span class="reads" :class="item.is_read === 0 ? 'unread' : ''"></span>
-              <span class="todo-text">{{ item.event_num }}</span>
-            </div>
-
-            <div class="action-area">
-          <!-- <span class="todo-date">{{ item.name }}</span> -->
-          <el-tooltip effect="dark" :content="item.name" placement="top">
-            <span class="todo-date">{{item.name}}</span>
-          </el-tooltip>
-            </div>
-          </div>
-        </div>
-      </div>
-      <div v-else>
-        <el-empty>
-          <template #description>
-            <span class="custom-text">暂无数据</span>
-          </template>
-        </el-empty>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-
-import db1 from '@/assets/images/workbench/db1.svg'
-import db2 from '@/assets/images/workbench/db2.svg'
-import db3 from '@/assets/images/workbench/db3.svg'
-import db4 from '@/assets/images/workbench/db4.svg'
-import db5 from '@/assets/images/workbench/db5.svg'
-import { getOrderCountApi, addOrderRecordApi, getOrderOrEventApi } from '@/api/home/index'
-import { onMounted } from 'vue'
-import { useRouter } from 'vue-router'
-import { useStore } from 'vuex'
-const userInfo = computed(() => store.getters.userInfo)
-const todos = ref([])
-const loading = ref(false)
-const router = useRouter()
-const store = useStore()
-const permission = computed(() => store.getters.permission)
-const checked = ref('事件工单')
-const todosCache = reactive({
-  '事件工单': [],
-  '智飞工单': []
-})
-const titleList = ref([
-  {
-    label: 'event_order_count',
-    name: '事件工单',
-    number: 0,
-  },
-  {
-    label: 'wayline_order_count',
-    name: '智飞工单',
-    number: 0,
-  },
-])
-
-const titleClick = async (item, index) => {
-todos.value =[]
-  checked.value = item.name
-  await getListMatter()
-}
-
-// * 事件工单中2=待审核,0=待处理,3=处理中
-// * 智飞工单中1: 待审核,2=已驳回,3=已通过
-const statusMap = {
-  0: '待处理',
-  2: '待审核',
-  3: '处理中',
-}
-const statusMapColor = {
-  0: { color: '#FF7411', backgroundImage: db3, borderLeftColor: '#FF7411' },
-  2: { color: '#FF472F', backgroundImage: db1, borderLeftColor: '#FF472F' },
-  3: { color: '#FFC300', backgroundImage: db4, borderLeftColor: '#FFC300' },
-}
-const zfstatusMap = {
-  1: '待审核',
-  2: '已驳回',
-  3: '已通过',
-}
-const zfstatusMapColor = {
-  1: { color: '#FF472F', backgroundImage: db2, borderLeftColor: '#FF472F' },
-  2: { color: '#4200DD', backgroundImage: db5, borderLeftColor: '#4200DD' },
-  3: { color: '#FF472F', backgroundImage: db2, borderLeftColor: '#FF472F' },
-}
-
-const getStatus = statusIndex => {
-  if (checked.value === '智飞工单') {
-    const style = zfstatusMapColor[statusIndex]
-    return style ? style.backgroundImage : ''
-  } else {
-    const style = statusMapColor[statusIndex]
-    return style ? style.backgroundImage : ''
-  }
-}
-const getStatusStyle = statusIndex => {
-  if (checked.value === '智飞工单') {
-    const style = zfstatusMapColor[statusIndex] || {
-      color: '#999',
-      borderLeftColor: '#999',
-    }
-    return {
-      color: style.color,
-      borderLeft: `3px solid ${style.borderLeftColor}`,
-    }
-  } else {
-    const style = statusMapColor[statusIndex] || {
-      color: '#999',
-      borderLeftColor: '#999',
-    }
-    return {
-      color: style.color,
-      borderLeft: `3px solid ${style.borderLeftColor}`,
-    }
-  }
-}
-// 获取状态对应的文字颜色
-const getStatusColor = statusIndex => {
-  if (checked.value === '智飞工单') {
-    return zfstatusMapColor[statusIndex]?.color || '#999'
-  } else {
-    return statusMapColor[statusIndex]?.color || '#999'
-  }
-}
-// 跳转到对应详情页
-const jumporder = val => {
-  if (checked.value === '智飞工单') {
-    const id = val.id
-    const status = val.status
-    getaddOrderRecord(id)
-    router.replace({
-      path: `/tickets/orderLog`,
-      query: {
-        id,
-        status,
-      },
-    })
-  } else {
-    getaddOrderRecord(val.id)
-    const orderNumber = val.event_num
-    router.replace({
-    path: `/tickets/ticket`,
-    query: { orderNumber },
-})
-  }
-}
-// 标记事件工单或智飞工单已读
-const getaddOrderRecord = async id => {
-  const ticketId = id
-  if (checked.value === '事件工单') {
-    loading.value = true
-    const type = 1
-    const res = await addOrderRecordApi(type, ticketId)
- 
-    
-  } else if (checked.value === '智飞工单') {
-    loading.value = true
-    const type = 2
-    const res = await addOrderRecordApi(type, ticketId)
-  }
-}
-// 获取事件工单和智飞工单的数量
-const getOrderCount = async () => {
-  const res = await getOrderCountApi(userInfo.value.detail.areaCode)
-  const data = res.data.data
-  titleList.value.forEach(item => {
-    if (data[item.label] !== undefined) {
-      item.number = data[item.label]
-    }
-  })
-}
-// 获取事件工单或者智飞工单的信息
-
-const getListMatter = async () => {
-  loading.value = true
-  const type = checked.value === '事件工单' ? 1 : 2
-  
-  // 使用缓存数据
-  if (todosCache[checked.value].length > 0) {
-    todos.value = todosCache[checked.value]
-  }
-  const todosParams = {
-    type:type,
-    area_code: userInfo.value.detail.areaCode,
-  }
-  try {
-    const res = await getOrderOrEventApi(todosParams)
-    const data = res.data.data || []
-    todos.value = data.sort((a, b) => a.is_read - b.is_read)  
-    todosCache[checked.value] = todos.value
-  } finally {
-    loading.value = false
-  }
-}
-onMounted(() => {
-  getListMatter()
-  getOrderCount()
-})
-</script>
-<style>
-.el-empty__image {
-  width: 100px !important;
-}
-</style>
-<style lang="scss" scoped>
-.bocklogBox {
-  width: 100%;
-  // height: 306px;
-  height: pxToVh(316);
-  background: rgba(255, 255, 255, 0.41);
-  box-shadow: 0px 3px 4px -1px rgba(125, 125, 125, 0.25);
-  border-radius: 8px 8px 8px 8px;
-  border: 2px solid #ffffff;
-  box-sizing: border-box;
-
-  .block {
-    margin: 11px 21px 13px 22px;
-
-    .titleBox {
-      display: flex;
-      justify-content: space-between;
-    }
-
-    .title {
-      font-family: 'Source Han Sans CN';
-      font-weight: bold;
-      font-size: 16px;
-      color: #363636;
-    }
-
-    .rightTab {
-      display: flex;
-      text-align: center;
-      padding-right: 10px;
-
-      .titleItem {
-        position: relative;
-        font-weight: 400;
-        font-size: 14px;
-        color: #7c8091;
-        margin-left: 18px;
-        cursor: pointer;
-      }
-
-      .activeItem {
-        border-radius: 0px 0px 0px 0px;
-        font-family: Source Han Sans CN, Source Han Sans CN;
-        font-weight: bold;
-        font-size: 14px;
-        color: #1c5cff;
-        border-bottom: 2px solid #1c5cff;
-      }
-
-      .dots {
-        width: 17px;
-        // height: 17px;
-        height: pxToVh(17);
-        border-radius: 50%;
-        background: #366fff;
-        color: #fff;
-        font-size: 9px;
-        position: absolute;
-        top: -10px;
-        right: -13px;
-        padding: 1px;
-        line-height: 17px;
-      }
-
-      .dots1 {
-        width: 17px;
-        // height: 17px;
-        height: pxToVh(17);
-        border-radius: 50%;
-        background: none !important;
-        color: #366fff !important;
-        font-size: 9px;
-        position: absolute;
-        top: -10px;
-        right: -13px;
-        padding: 1px;
-        line-height: 17px;
-      }
-    }
-
-    .todo-items {
-      margin-top: 10px;
-  transition: opacity 0.3s ease;
-      height: pxToVh(250);
-      overflow-y: scroll;
-       &:empty {
-    display: none;
-  }
-    }
-
-    .todo-item {
-      transition: 
-    transform 0.2s ease,
-    box-shadow 0.2s ease,
-    opacity 0.3s ease;
-      margin: 6px 0;
-      display: flex;
-      align-items: center;
-      cursor: pointer;
-      background: #ffffff;
-      border-radius: 8px;
-      box-shadow: 0px 2px 4px 0px rgba(173, 173, 173, 0.18);
-      transition: all 0.2s ease;
-      border-left: 4px solid transparent;
-      // height: 42px;
-      height: pxToVh(42);
-
-      &:hover {
-        transform: translateY(-2px);
-        box-shadow: 0 3px 8px rgba(0, 0, 0, 0.05);
-      }
-
-      .status-indicator {
-        margin-left: 3px;
-        width: 1.6rem;
-        height: 1.6rem;
-
-        img {
-          width: 100%;
-          height: 100%;
-        }
-      }
-
-      .content-wrapper {
-        flex: 1;
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-        // gap: 1rem;
-      }
-
-      .main-content {
-        display: flex;
-        align-items: center;
-        // gap: 0.8rem;
-
-        .status-tag {
-          font-weight: 400;
-          font-size: 14px;
-          margin-left: 2px;
-          // padding: 0.3rem 0;
-          border-radius: 12px;
-        }
-
-        .todo-text {
-          font-weight: 400;
-          font-size: 14px;
-         color: #5C6476;
-        }
-
-        .unread {
-          width: 5px;
-          height: 5px;
-          background: #1c5cff !important;
-          border-radius: 50%;
-          margin: 0 4px;
-        }
-
-        .reads {
-          width: 5px;
-          height: 5px;
-          background: transparent;
-          border-radius: 50%;
-          margin: 0 4px;
-        }
-      }
-
-      .action-area {
-        display: flex;
-        align-items: center;
-        margin-right: 22px;
-
-        img {
-          width: 15px;
-          height: 15px;
-        }
-
-        .todo-date {
-          font-weight: 400;
-      font-size: 14px;
-      color: #343434;
-      margin-left: 2px;
-      white-space: nowrap;      
-      overflow: hidden;          
-      text-overflow: ellipsis;  
-      max-width: 200px;        
-      display: inline-block;     
-        }
-      }
-    }
-  }
-
-  .custom-text {
-    font-size: 14px;
-    color: #7c8091;
-  }
-  .el-empty {
-  transition: opacity 0.3s ease;
-}
-}
-</style>
diff --git a/applications/task-work-order/src/views/wel/components/calendarBox.vue b/applications/task-work-order/src/views/wel/components/calendarBox.vue
deleted file mode 100644
index c2ed96c..0000000
--- a/applications/task-work-order/src/views/wel/components/calendarBox.vue
+++ /dev/null
@@ -1,398 +0,0 @@
-<template>
-  <div class="calenBox">
-    <el-calendar ref="calendar" v-model="currentMonth"  :class="{
-    'five-rows': weeksNeeded === 5,
-    'six-rows': weeksNeeded === 6
-  }">
-      <template #header="{ date }">
-        <div>
-          <img :src="caleft" alt="" @click="selectDate('prev-month')" />
-          <el-date-picker
-            v-model="currentMonth"
-            type="month"
-            :clearable="false"
-            :prefix-icon="''"
-            @change="handleMonthChange"
-            :format="'YYYY年M月'"
-          />
-          <img :src="caright" alt="" @click="selectDate('next-month')" />
-        </div>
-      </template>
-      <template #date-cell="{ data }">
-        <div :class="data.isSelected ? 'is-selected' : ''">
-          <div class="date-number">{{ data.day.slice(8, 10) }}</div>
-          <div class="events">
-            <div
-              v-for="(event, index) in getEvents(data.day)"
-              :key="index"
-              class="event-item"
-              :class="event.type"
-              @click="jumpcalendar(event, data.day)"
-            >
-              <div class="imgBox">
-                <img :src="getEventIcon(event.type)" alt="" /> {{ event.name }}
-              </div>
-              <span>{{ event.value }}</span>
-            </div>
-          </div>
-        </div>
-      </template>
-    </el-calendar>
-  </div>
-</template>
-<script setup>
-import dayjs from 'dayjs';
-import { ref, watch, onMounted, nextTick } from 'vue';
-import { getCalen } from '@/api/home/index';
-import { useRouter } from 'vue-router';
-import ev1 from '@/assets/images/workbench/ev1.svg';
-import ev2 from '@/assets/images/workbench/ev2.svg';
-import caleft from '@/assets/images/workbench/caleft.png';
-import caright from '@/assets/images/workbench/caright.png';
-const router = useRouter();
-const calendar = ref();
-const events = ref({});
-const currentMonth = ref(new Date()); // 控制当前显示的月份
-const selectedDate = ref(null); // 控制选中的日期
-const params = ref({
-  end_date: undefined,
-  start_date: undefined,
-});
-
-const eventIcons = ref({
-  'work-order': ev1,
-  task: ev2,
-});
-
-const monthRange = getCurrentMonthRange();
-params.value = monthRange;
-// 检查日期是否是当前月份
-const isCurrentMonth = date => {
-  return dayjs(date).isSame(dayjs(), 'month');
-};
-// 处理月份选择器变化
-const handleMonthChange = val => {
-  const selectedMonth = new Date(val);
-  currentMonth.value = selectedMonth;
-
-  // 如果是当前月份,则选中当天;否则不选中
-  if (isCurrentMonth(selectedMonth)) {
-    selectedDate.value = new Date();
-  } else {
-    selectedDate.value = null;
-  }
-
-  // 强制更新日历视图
-  nextTick(() => {
-    updateCalendarSelection();
-  });
-};
-
-// 获取日历数据
-const getJobEventBar = () => {
-  getCalen(params.value).then(res => {
-    if (res.data.code !== 0) return;
-    const a = res.data.data;
-    const filteredData = {};
-    for (let date in a) {
-      filteredData[date] = a[date].filter(item => item.type !== 'work-order');
-    }
-    events.value = filteredData;
-  });
-};
-
-// 获取事件图标
-const getEventIcon = type => {
-  return eventIcons.value[type] || eventIcons.value.default;
-};
-
-// 获取当前月份范围
-function getCurrentMonthRange() {
-  return {
-    start_date: dayjs().startOf('month').format('YYYY-MM-DD HH:mm:ss'),
-    end_date: dayjs().endOf('month').format('YYYY-MM-DD HH:mm:ss'),
-  };
-}
-
-// 月份切换处理
-const selectDate = async val => {
-  if (!calendar.value) return;
-
-  if (val === 'prev-month') {
-    currentMonth.value = dayjs(currentMonth.value).subtract(1, 'month').toDate();
-  } else if (val === 'next-month') {
-    currentMonth.value = dayjs(currentMonth.value).add(1, 'month').toDate();
-  }
-
-  // 如果是当前月份,则选中当天;否则不选中
-  if (isCurrentMonth(currentMonth.value)) {
-    selectedDate.value = new Date();
-  } else {
-    selectedDate.value = null;
-  }
-
-  await nextTick();
-  updateCalendarSelection();
-};
-const updateCalendarSelection = () => {
-  // 清除所有选中状态
-  const selectedCells = document.querySelectorAll('.el-calendar-table td.is-selected');
-  selectedCells.forEach(cell => {
-    cell.classList.remove('is-selected');
-  });
-
-  // 如果是当前月份,设置当前日为选中状态
-  if (isCurrentMonth(currentMonth.value) && selectedDate.value) {
-    const currentDay = dayjs(selectedDate.value).date();
-    const calendarCells = document.querySelectorAll('.el-calendar-table td');
-
-    calendarCells.forEach(cell => {
-      const day = parseInt(cell.querySelector('.date-number').textContent);
-      if (day === currentDay) {
-        cell.classList.add('is-selected');
-      }
-    });
-  }
-};
-
-// 监听当前月份变化
-watch(
-  () => currentMonth.value,
-  newMonth => {
-    const newDate = dayjs(newMonth);
-    params.value = {
-      start_date: newDate.startOf('month').format('YYYY-MM-DD HH:mm:ss'),
-      end_date: newDate.endOf('month').format('YYYY-MM-DD HH:mm:ss'),
-    };
-    // 如果是当前月份,则选中当天;否则清除选中
-    if (isCurrentMonth(newMonth)) {
-      selectedDate.value = new Date();
-    } else {
-      selectedDate.value = null;
-    }
-    nextTick(() => {
-      updateCalendarSelection();
-    });
-
-    getJobEventBar();
-  },
-  { deep: true, immediate: true }
-);
-
-// 获取日期数字
-const getDate = date => {
-  return date.getDate();
-};
-
-// 获取对应日期的事件
-const getEvents = dateString => {
-  return events.value[dateString] || [];
-};
-const jumpcalendar = (event, day) => {
-  if (event.name === '工单') {
-    router.push({
-      path: '/tickets/ticket',
-      query: {
-        day: day,
-      },
-    });
-  } else {
-    router.push({
-      path: '/job/jobstatistics',
-      query: {
-        day: day,
-      },
-    });
-  }
-};
-
-const weeksNeeded = computed(() => {
-  const date = dayjs(currentMonth.value);
-  const firstDay = date.startOf('month').day(); // 0-6 (周日到周六)
-  const days = date.daysInMonth();
-
-  // 强制 2025 年 6 月显示六行
-   //if (date.year() === 2025 && date.month() === 5) {
-   //  return 6;
-  // }
-
-  // 其他月份按原逻辑计算
-  return Math.ceil((firstDay + days) / 7);
-})
-const isSixRows = computed(() => weeksNeeded.value > 5);
-onMounted(() => {
-  // 初始化时如果是当前月份,选中当天;否则不选中
-  if (isCurrentMonth(currentMonth.value)) {
-    selectedDate.value = new Date();
-  } else {
-    selectedDate.value = null;
-  }
-
-  nextTick(() => {
-    updateCalendarSelection();
-  });
-
-  getJobEventBar();
-});
-</script>
-
-<style lang="scss">
-.calenBox {
-  height: pxToVh(670);
-  // 隐藏按钮组中间按钮
-  .el-button-group > .el-button:not(:first-child):not(:last-child) {
-    display: none;
-  }
-  .el-calendar__body {
-    padding-top: 0 !important;
-  }
-  .date-number {
-    font-size: 13px !important;
-  }
-  .el-calendar__header {
-    justify-content: center;
-    margin-top: 10px;
-    padding-bottom: 0;
-    border-bottom: transparent;
-    div {
-      display: flex;
-      justify-content: center;
-      align-items: center;
-      img {
-        width: 28px;
-        height: 28px;
-        cursor: pointer;
-      }
-      span {
-        font-weight: bold;
-        font-size: 14px;
-        color: #363636;
-        margin: 0 18px;
-      }
-    }
-  }
-  .el-calendar-table td {
-    border: none;
-  }
-  .el-calendar-table tr td {
-    border: none;
-  }
-  .el-calendar-table .el-calendar-day {
-    box-sizing: border-box;
-    padding: 0.4rem 0.8rem 0.8rem 0.8rem;
-    background: #f5f7fa;
-    border-radius: 6px 6px 6px 6px;
-    border: 1px solid #efefef;
-    margin-right: 5px;
-    margin-bottom: 8px;
-  }
-  .el-input__prefix-inner {
-    display: none !important;
-  }
-  .el-input__suffix {
-    width: 0 !important;
-  }
-  .el-input__wrapper {
-    align-items: center !important;
-    cursor: text;
-    box-shadow: none !important;
-    display: inline-flex !important;
-    flex-grow: 1;
-    justify-content: center;
-  }
-  .el-input__inner {
-    font-weight: bold;
-    font-size: 14px;
-    color: #363636;
-  }
-  .el-date-editor.el-input,
-  .el-date-editor.el-input__wrapper {
-    height: var(--el-input-height, var(--el-component-size));
-
-    width: 170px !important;
-  }
-}
-</style>
-
-<style lang="scss" scoped>
-.calenBox {
-  margin-top: 10px;
-  height: pxToVh(632);
-  border-radius: 10px;
-  overflow: hidden;
-  background-color: #fff;
-  :deep(.el-date-picker .el-input__prefix-inner) {
-    display: none !important;
-  }
-  ::v-deep(.el-calendar) {
-    // 标题样式
-    .el-calendar__title {
-      font-weight: bold;
-      font-size: 14px;
-      color: #363636;
-    }
-
- &.five-rows .el-calendar-table .el-calendar-day {
-    height: pxToVh(92) !important;
-  }
-
-  &.six-rows .el-calendar-table .el-calendar-day {
-    height: pxToVh(78) !important;
-  }
-    // 选中日期样式
-    .el-calendar-table td.is-selected.is-today {
-      .el-calendar-day {
-        outline: 2px solid #409eff;
-        outline-offset: -2px;
-        border: none !important;
-        .date-number {
-          font-weight: bold;
-          color: #409eff;
-        }
-      }
-    }
-    .el-calendar-table td.is-selected {
-      background-color: transparent;
-    }
-
-  }
-
-  .event-item {
-    font-size: 12px;
-    text-align: center;
-    border-radius: 3px;
-    white-space: nowrap;
-    position: relative;
-    z-index: 2;
-
-    &.work-order {
-      font-weight: 400;
-      font-size: 12px;
-      color: #7b7b7b;
-
-      span {
-        font-weight: 600;
-        font-size: 14px;
-        color: #1c5cff;
-        margin-left: 2px;
-      }
-    }
-
-    &.task {
-      font-weight: 400;
-      font-size: 12px;
-      color: #7b7b7b;
-
-      span {
-        font-weight: 600;
-        font-size: 17px;
-        color: #029d36;
-        margin-left: 2px;
-      }
-    }
-    .imgBox {
-      font-size: 12px;
-    }
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/wel/components/flightStatistics.vue b/applications/task-work-order/src/views/wel/components/flightStatistics.vue
deleted file mode 100644
index d37d615..0000000
--- a/applications/task-work-order/src/views/wel/components/flightStatistics.vue
+++ /dev/null
@@ -1,524 +0,0 @@
-<template>
-  <div class="flyOrder">
-    <div class="fytitle">
-      <div class="cardtotal">
-        <p>飞行统计</p>
-        <img @click="refresh" src="/src/assets/images/workbench/st1.svg" alt="" />
-      </div>
-      <div class="time-card">
-        <div
-          class="card-item"
-          :class="item === checked ? 'active' : ''"
-          v-for="(item, index) in timeListEnum"
-          :key="index"
-          @click="timeClick(item, index)"
-        >
-          {{ timeListStr[index] }}
-        </div>
-      </div>
-    </div>
-    <div class="flycenter">
-      <div class="centerBox">
-        <div class="centerItem" v-for="(itemfly, index) in flyTypeList" :key="index">
-          <div class="flyimg"><img :src="itemfly.img" alt="" />{{ itemfly.name }}</div>
-          <div class="flydata">
-            <span>{{ itemfly.value }}</span
-            >{{ unitMap[itemfly.name] }}
-          </div>
-        </div>
-      </div>
-      <div class="lineChart">
-        <div class="lineBox" ref="chartRef"></div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { getFly, getFlyTime, tongjiNestApi } from '@/api/home/index';
-import flyImg1 from '@/assets/images/workbench/fy2.svg';
-import flyImg2 from '@/assets/images/workbench/fy3.svg';
-import flyImg3 from '@/assets/images/workbench/fy4.svg';
-import * as echarts from 'echarts';
-import useEchartsResize from '@/hooks/useEchartsResize';
-let checked = ref('CURRENT_YEAR');
-let timeListStr = ['本周', '本月', '本年'];
-let timeListEnum = ['CURRENT_WEEK', 'CURRENT_MONTH', 'CURRENT_YEAR'];
-const dateSelect = ref('CURRENT_YEAR');
-const params = ref({
-  date_enum: 'CURRENT_YEAR',
-  device_sn: '',
-  end_date: undefined,
-  start_date: undefined,
-});
-const flyparams = ref({
-  date_enum: 'YEAR',
-  device_sn: '',
-  end_date: undefined,
-  start_date: undefined,
-});
-const chartRef = ref(null);
-let { chart: lineChart } = useEchartsResize(chartRef);
-// const keyMapping = {
-//   '飞行时长': 'total_flight_time',
-//   '飞行里程': 'total_flight_distance',
-//   //   任务成果: 'event_num',
-// };
-const unitMap = {
-  '飞行时长': '小时',
-  '飞行里程': '公里',
-
-};
-const flyTypeList = ref([
-  { name: '飞行时长', value: 0, img: flyImg1, key: 'hour_count' },
-  { name: '飞行里程', value: 0, img: flyImg2, key: 'flight_mileage' },
-
-]);
-// 飞行统计
-const getFlyList = () => {
- 
-
-  tongjiNestApi(flyparams.value).then(res => {
-    flyTypeList.value = flyTypeList.value.map(item => ({
-      ...item,
-      value: res.data.data[item.key] || 0,
-    }));
-
-  });
-};
-const getFlyTimeList = () => {
-  getFlyTime(params.value).then(res => {
-    const resList = res?.data?.data || [];
-
-    lineCharts(resList);
-  });
-};
-const refresh = () => {
-
-  getFlyList();
-  getFlyTimeList();
-
-  
-};
-let timeClick = (item, index) => {
-  checked.value = item;
-  params.value.date_enum = item;
-  dateSelect.value = item;
-  if (item === 'CURRENT_MONTH') {
-    flyparams.value.date_enum = 'MONTH';
-  } else if (item === 'CURRENT_WEEK') {
-    flyparams.value.date_enum = 'WEEK';
-  } else {
-    flyparams.value.date_enum = 'YEAR';
-  }
-  getFlyList();
-  getFlyTimeList();
-};
-// 折线/柱状图
-const lineCharts = bardata => {
-  const categories = bardata?.map(item => item.name); // x轴类别
-  const flight_distance = [];
-  const flight_time = [];
-  const event_num = [];
-  // /遍历数据填充各系列
-  bardata?.forEach(period => {
-    let hasDuration = false,
-      hasDistance = false,
-      hasResult = false;
-
-    period.data?.forEach(item => {
-      switch (item.name) {
-        case '飞行时长':
-          flight_time.push(parseFloat(item.value) || 0);
-          hasDuration = true;
-          break;
-        case '飞行里程':
-          flight_distance.push(parseFloat(item.value) || 0);
-          hasDistance = true;
-          break;
-      }
-    });
-
-    // 处理可能缺失的数据项
-    if (!hasDuration) flight_time.push(0);
-    if (!hasDistance) flight_distance.push(0);
-  });
-  var option = {
-    tooltip: {
-      trigger: 'axis',
-      axisPointer: {
-        type: 'shadow'
-      },
-      // position: 'top'
-
-    },
-    grid: {
-      left: '2%',
-      right: '4%',
-      bottom: '14%',
-      top: '9%', 
-      containLabel: true,
-    },
-    legend: {
-      data: ['飞行时长', '飞行里程'],
-      left: 'center',
-      // top: '5%',
-      color: '#383838',
-      itemWidth: 15,
-      itemHeight: 10,
-      itemGap: 25,
-      fontSize: '1.2rem',
-    },
-    xAxis: {
-      type: 'category',
-      data: categories,
-      axisLine: {
-        lineStyle: {
-          color: '#cdd5e2',
-        },
-      },
-      axisLabel: {
-        // interval: 0,
-        color: '#383838',
-      },
-    },
-    yAxis: [
-      {
-    type: 'value', 
-    name: '单位:小时',
-    nameTextStyle: {
-      color: '#383838',
-      fontSize: '1.2rem',
-      // padding: [0, 0, 14, 0]
-
-    },
-    axisLine: {
-      show: false,
-      lineStyle: {
-        color: '#cdd5e2',
-      },
-    },
-    splitLine: {
-      show: true,
-      lineStyle: {
-        type: 'dashed',
-        color: '#cdd5e2',
-        width: 1,
-        opacity: 0.5,
-      },
-    },
-    axisLabel: {
-      color: '#666666',
-    }
-  },
-      {
-        type: 'value', 
-        name: '单位:公里',
-        nameTextStyle: {
-          color: '#383838',
-          fontSize: '1.2rem',
-          // padding: [0, 0, 14, 0]
-        },
-     
-    
-        axisLine: {
-          show: false,
-          lineStyle: {
-            color: '#cdd5e2',
-          },
-        },
-        splitLine: {
-          show: false,
-          lineStyle: {
-            type: 'dashed',
-            color: '#cdd5e2',
-            width: 1,
-            opacity: 0.5,
-          },
-        },
-     
-        axisLabel: {
-          color: '#383838', // 直接配置颜色
-        },
-      },
-    ],
-    series: [
-    
-  // {//柱底圆片
-  //           name: "",
-  //           type: "pictorialBar",
-  //           symbolSize: [8, 10],//调整截面形状
-  //           symbolOffset: [0, 5],
-  //           z: 12,
-  //           itemStyle: {
-  //                   "normal": {
-  //                     color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
-  //                               offset: 0,
-  //                              "color": "#91C1FF"
-  //                           },
-  //                           {
-  //                               offset: 1,
-  //                               "color": "#2970FF"
-  //                           }
-  //                       ],false)
-  //                   }
-  //               },
-  //           data: flight_time,
-  //       }, 
-        
-        //柱体
-        {
-            name: '飞行时长',
-            type: 'bar',
-             barWidth: '8px',
-            itemStyle: {
-
-                    "normal": {
-                        "color": {
-                            "x": 0,
-                            "y": 0,
-                            "x2": 0,
-                            "y2": 1,
-                            "type": "linear",
-                            "global": false,
-                            "colorStops": [{//第一节下面
-                                "offset": 0,
-                                "color": "#91C1FF"
-                            }, {
-                                "offset": 1,
-                                "color": "#2970FF"
-                            }]
-                        }
-                    }
-                },
-           data: flight_time,
-        },
-
-        //柱顶圆片
-        {
-           name: '',
-            type: "pictorialBar",
-          tooltip: { show: false },
-            symbolSize: [8, 8],//调整截面形状
-            symbolOffset: [0, -3],
-            z: 12,
-            symbolPosition: "end",
-                "itemStyle": {
-                    "normal": {
-                         color: new echarts.graphic.LinearGradient(0,0,0,1,
-                            [{
-                                    offset: 0,
-                                    color: "#9DC9FD"
-                                },
-                                {
-                                    offset: 1,
-                                    color: "#3279FA"
-                                }
-                            ],
-                            false
-                        ),
-                    }
-                },
-            data: flight_time,
-        },
-      {
-        name: '飞行里程',
-        type: 'line',
-        yAxisIndex: 1,
-        smooth: true,
-        itemStyle: {
-          color: '#01D0A7',
-        },
-        lineStyle: {
-          width: 2,
-          type: 'solid',
-          color: '#01D0A7',
-        },
-        symbol: 'circle',
-        symbolSize: 6,
-        areaStyle: {
-          color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-            {
-              offset: 0,
-              color: 'rgba(1,208,167,0.4) '
-            },
-            {
-              offset: 1,
-              color: 'rgba(1,208,167,0) '
-            }
-          ])
-        },
-        data: flight_distance,
-      },
-    ],
-  };
-  lineChart.value.setOption(option);
-};
-onMounted(() => {
-  lineCharts();
-  getFlyList();
-  getFlyTimeList();
-});
-</script>
-
-<style scoped lang="scss">
-// 飞行统计
-.flyOrder {
-  border-radius: 8px 8px 8px 8px;
-  padding: 4px 14px 0 15px;
-  background: #ffffff !important;
-  margin-top: 5px;
-    height: pxToVh(471);
-
-  .fytitle {
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    .cardtotal {
-      display: flex;
-      align-items: center;
-      margin-left: 9px;
-      img {
-        width: 17px;
-        height: 17px;
-        margin-left: 6px;
-        cursor: pointer;
-      }
-      p {
-        font-weight: bold;
-        font-size: 14px;
-        color: #363636;
-      }
-
-      span {
-        font-weight: 400;
-        font-size: 14px;
-        color: #7c8091;
-      }
-
-      .total-number {
-        font-family: 'Source Han Sans CN';
-
-        font-weight: bold;
-        font-size: 32px;
-        color: #2a54ff;
-      }
-    }
-    img {
-      width: 39px;
-      height: 38px;
-    }
-
-    span {
-      font-weight: bold;
-      font-size: 14px;
-      color: #363636;
-    }
-  }
-
-  .flycenter {
-    margin-top: 8px;
-
-    .centerBox {
-      display: flex;
-      justify-content: space-between;
-      margin-bottom: 10px;
-
-      .centerItem {
-        padding: 7px 7px 0 15px;
-        width: 196px;
-        flex: 1;
-       height: 41px;
-        //height: pxToVh(41);
-        background: #f6f8fe;
-        box-shadow: 0px 5px 4px 0px #ebf1ff;
-        border-radius: 8px 8px 8px 8px;
-        border: 1px solid #ffffff;
-        margin-right: 16px;
-        display: flex;
-        align-items: center;
-
-        img {
-          width: 15px;
-          height: 15px;
-          margin-right: 5px;
-        }
-
-        .flyimg {
-          display: flex;
-          align-items: center;
-          font-weight: 400;
-          font-size: 14px;
-          color: #7c8091;
-        }
-
-        .flydata {
-      margin-left: 11px;
-          text-align: right;
-          font-size: 14px;
-          color: #7c8091;
-
-          span {
-            font-weight: bold;
-            font-size: 24px;
-            color: #343434;
-            margin-right: 6px;
-          }
-        }
-      }
-    }
-
-    .lineChart {
-     height: pxToVh(374) ;
-      width: 100%;
-      .lineBox {
-        width: 100%;
-        height: 100%;
-      }
-    }
-  }
-}
-.time-card {
-  text-align: center;
-  // height: 30px;
-  height: pxToVh(30);
-  background: #ffffff;
-
-  border: 1px solid #e5e5e5;
-  font-weight: 400;
-  font-size: 14px;
-  color: #7c8091;
-  display: flex;
-  width: 282px;
-  margin-left: 15px;
-  border-radius: 4px;
-
-.card-item {
-    width: 94px;
-    height: 100%;
-    // line-height: 28px;
-    cursor: pointer;
-    font-family: 'Source Han Sans CN';
-    font-weight: 400;
-    font-size: 14px;
-    color: #7c8091;
-      border: 1px solid transparent;
-      display: flex;
-      align-items: center;
-      justify-content: center;
-  }
-
-  .card-item:first-child {
-    border-right: 1px solid #e5e5e5;
-  }
-
-  .card-item:nth-child(2) {
-    border-right: 1px solid #e5e5e5;
-  }
-
-  .card-item.active {
-    color: #1441ff;
-    border: 1px solid #1c5cff;
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/wel/components/flyratio.vue b/applications/task-work-order/src/views/wel/components/flyratio.vue
deleted file mode 100644
index dccb14e..0000000
--- a/applications/task-work-order/src/views/wel/components/flyratio.vue
+++ /dev/null
@@ -1,357 +0,0 @@
-<template>
-  <div class="machineNest">
-    <div class="nestTop">
-      <div class="card-title">
-       
-        <div class="cardtotal">
-          <p>机巢工单数量排名</p>
-           <img @click="refresh" src="/src/assets/images/workbench/st1.svg" alt="" />
-        </div>
-         <div class="time-card">
-        <div
-          class="card-item"
-          :class="item === checked ? 'active' : ''"
-          v-for="(item, index) in timeListEnum"
-          :key="index"
-          @click="timeClick(item, index)"
-        >
-          {{ timeListStr[index] }}
-        </div>
-      </div>
-      </div>
-    </div>
-    <div class="nestCenter">
-      <div class="chart" ref="echartsRef"></div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import * as echarts from 'echarts';
-import useEchartsResize from '@/hooks/useEchartsResize';
-import jc1 from '@/assets/images/workbench/jc1.png';
-import jc2 from '@/assets/images/workbench/jc2.png';
-import { industryJobNumPieChart } from '@/api/home/index';
-import { nextTick } from 'vue';
-let checked = ref('CURRENT_YEAR');
-let timeListStr = ['本周', '本月', '本年'];
-let timeListEnum = ['CURRENT_WEEK', 'CURRENT_MONTH', 'CURRENT_YEAR'];
-const params = ref({
-  date_enum: 'CURRENT_YEAR',
-  device_sn: '',
-  end_date: undefined,
-  start_date: undefined,
-});
-const dateSelect = ref('CURRENT_YEAR');
-const echartsRef = ref(null);
-let { chart: jcchart } = useEchartsResize(echartsRef);
-const jcOrder = ref([]);
-const props = defineProps({
-  dateSelect: {
-    type: String,
-  },
-});
-const refresh = () => {
-  // params.value.date_enum = 'CURRENT_YEAR';
-  // checked.value = 'CURRENT_YEAR';
-  // dateSelect.value = 'CURRENT_YEAR';
-getIndustryJobNumPieChart();
-};
-let timeClick = (item, index) => {
-  checked.value = item;
-  params.value.date_enum = item;
-  dateSelect.value = item;
-getIndustryJobNumPieChart();
-};
-// 空数据计算
-const isEmptyData = computed(() => {
-  return jcOrder.value.length === 0 ||
-         jcOrder.value.every(item => !item.name || item.value === 0)
-})
-// 图表初始化
-const initChart = () => {
-  if (echartsRef.value && !jcchart.value) {
-    jcchart.value = echarts.init(echartsRef.value)
-  }
-}
-// 获取机巢事件数据
-const getIndustryJobNumPieChart = () => {
-  industryJobNumPieChart(params.value).then(res => {
-    const resList = res?.data?.data || [];
-    jcOrder.value = resList;
-     nextTick(() => {
-        initChart()
-        pieInit(resList)
-      })
-  });
-};
-watch(
-  () => props.dateSelect,
-  newVal => {
-    params.date_enum = newVal;
-    getIndustryJobNumPieChart();
-  },
-  { immediate: true }
-);
-const pieInit = resList => {
-
-// if (!jcchart.value || !resList?.length) return
-  const validData = resList?.filter(item => item.name).sort((a, b) => b.value - a.value); // 从大到小排序
-  const colors = [
-    '#F87E04', // 橙色
-    '#FFC400', // 黄色
-    '#08BC44', // 绿色
-    '#07B5FF', // 蓝色
-    '#A98DFF', // 紫色
-    '#9ABFFF', // 浅蓝
-  ];
-
-  const optionData = {
-    yAxisData: validData.map(item => item.name),
-    seriesData: validData.map(item => item.value),
-  };
-
-  
-  const option = {
-    title: {
-      text: resList.length  ? '' :'暂无数据',
-      left: 'center',
-      top: 'center',
-      textStyle: {
-        color: '#999',
-        fontSize: '1.6rem',
-        fontWeight: 'normal'
-      }
-    },
-    tooltip: {
-      trigger: 'axis',
-      axisPointer: { type: 'shadow' },
-      formatter: '{b}: {c}',
-    },
-    grid: {
-      left: '5%',
-      right: '5%',
-      bottom: '3%',
-         top: '-3%', // 添加顶部间距
-      containLabel: true,
-    },
-    xAxis: {
-      type: 'value',
-      splitLine: { lineStyle: { color: '#E5E5E5' },show:false },
-      axisLabel: { color: '#7C8091',fontSize:'1.2rem',show:false },
-      boundaryGap: [0, 0.01],
-    },
-    yAxis: {
-      type: 'category',
-      data: optionData.yAxisData,
-      axisLabel: { color: '#7C8091' ,fontSize:'1.2rem',},
-      axisLine: { lineStyle: { color: '#D1D1D1' } ,show:false},
-      axisTick: { show: false },
-      // 确保排序后的数据从上到下显示(最大值在顶部)
-      inverse: true,
-      show:optionData.seriesData?.length  ? true : false
-    },
-    series: [
-      {
-        type: 'bar',
-        data: optionData.seriesData,
-        itemStyle: {
-        barBorderRadius: [0, 20, 20, 0],
-          color: params => {
-            // 前6项使用固定颜色循环,之后使用渐变
-            return params.dataIndex < colors.length
-              ? colors[params.dataIndex]
-              : new echarts.graphic.LinearGradient(0, 0, 1, 0, [
-                  { offset: 0, color: '#93BAFF' },
-                  { offset: 1, color: '#C5DEFF' },
-                ]);
-          },
-        },
-        barWidth: '30%',
-        label: {
-          show: true,
-          position: 'right',
-          formatter: '{c}',
-          itemStyle:{
-             fontSize: '1.4rem',
-             color: '#414243',
-             
-          }
-        },
-      },
-    ],
-  };
-
-  jcchart.value.setOption(option, true);
-};
-
-onMounted(() => {
-  getIndustryJobNumPieChart();
-});
-onBeforeUnmount(() => {
-  if (jcchart.value) {
-    jcchart.value.dispose()
-    jcchart.value = null
-  }
-})
-</script>
-
-<style scoped lang="scss">
-.machineNest {
-  width: 93%;
-  margin-left: 10px;
-  height: pxToVh(282);
-    border-radius: 8px 8px 8px 8px;
-  padding: 4px 14px 0 15px;
-  background: #ffffff !important;
-  .custom-text {
-    font-size: 14px;
-    color: #7c8091;
-  }
-  .nestTop {
-   .card-title {
-    display: flex;
-    margin-bottom: 10px;
-    align-items: center;
-    justify-content: space-between;
-    .cardtotal {
-      display: flex;
-      align-items: center;
-   
-      img {
-        width: 17px;
-        height: 17px;
-        margin-left: 6px;
-        cursor: pointer;
-      }
-      p {
-        font-weight: bold;
-        font-size: 14px;
-        color: #363636;
-      }
-
-      span {
-        font-weight: 400;
-        font-size: 14px;
-        color: #7c8091;
-      }
-
-      .total-number {
-        font-family: 'Source Han Sans CN';
-
-        font-weight: bold;
-        font-size: 32px;
-        color: #2a54ff;
-      }
-    }
-
-    img {
-      width: 36px;
-      height: 40px;
-    }
-  }
-    .cardtotal {
-      display: flex;
-      align-items: center;
-      margin-left: 9px;
-      p {
-        font-weight: bold;
-        font-size: 14px;
-        color: #363636;
-      }
-      span {
-        font-weight: 400;
-        font-size: 14px;
-        color: #7c8091;
-      }
-      .total-number {
-        font-family: 'Source Han Sans CN';
-        font-weight: bold;
-        font-size: 32px;
-        color: #2a54ff;
-      }
-    }
-    .status-grid {
-      margin-left: 30px;
-      display: grid;
-      grid-template-columns: repeat(2, 1fr);
-      row-gap: 17px;
-      .status-item {
-        display: flex;
-        text-align: center;
-        align-items: center;
-        justify-content: center;
-        background: #f6f8fe;
-        margin-right: 10px;
-        padding: 10px;
-        img {
-          width: 40px;
-          height: 40px;
-          margin-right: 13px;
-        }
-        .status-label {
-          font-size: 14px;
-          color: #383838;
-        }
-        .status-value {
-          font-family: 'Source Han Sans CN';
-          font-weight: bold;
-          font-size: 20px;
-        }
-      }
-    }
-  }
-  .nestCenter {
-    width: 100%;
- 
-    height: pxToVh(226);
-    .chart {
-      width: 100%;
-      height: 100%;
-    }
-  }
-}
-.time-card {
-  text-align: center;
-  // height: 30px;
-  height: pxToVh(30);
-  background: #ffffff;
-
-  border: 1px solid #e5e5e5;
-  font-weight: 400;
-  font-size: 14px;
-  color: #7c8091;
-  display: flex;
-  width: 282px;
-  margin-left: 15px;
-  border-radius: 4px;
-
-.card-item {
-    width: 94px;
-    height: 100%;
-    // line-height: 28px;
-    cursor: pointer;
-    font-family: 'Source Han Sans CN';
-    font-weight: 400;
-    font-size: 14px;
-    color: #7c8091;
-      border: 1px solid transparent;
-      display: flex;
-      align-items: center;
-      justify-content: center;
-  }
-
-  .card-item:first-child {
-    border-right: 1px solid #e5e5e5;
-  }
-
-  .card-item:nth-child(2) {
-    border-right: 1px solid #e5e5e5;
-  }
-
-  .card-item.active {
-    color: #1441ff;
-    border: 1px solid #1c5cff;
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/wel/components/proportionStatic.vue b/applications/task-work-order/src/views/wel/components/proportionStatic.vue
deleted file mode 100644
index 7e0b1ae..0000000
--- a/applications/task-work-order/src/views/wel/components/proportionStatic.vue
+++ /dev/null
@@ -1,395 +0,0 @@
-<template>
-  <div class="workOrder">
-    <div class="card-title">
-      <div class="cardtotal">
-        <p>工单统计占比</p>
-        <img @click="refresh" src="/src/assets/images/workbench/st1.svg" alt="" />
-      </div>
-      <div class="time-card">
-        <div
-          class="card-item"
-          :class="item === checked ? 'active' : ''"
-          v-for="(item, index) in timeListEnum"
-          :key="index"
-          @click="timeClick(item, index)"
-        >
-          {{ timeListStr[index] }} 
-        </div>
-      </div>
-    </div>
-    <div class="workorderbox">
-      <div class="card-group">
-        <div class="main-card">
-          <div class="status-grid">
-            <div class="status-item" v-for="(item, index) in eventTypeList" :key="index" @click="jumpEventDetails(item,index)">
-              <div class="statusCon">
-                <div class="status-label">{{ item.name }}</div>
-                <div class="status-value">{{ item.value }}<span>个</span></div>
-                <div class="ratio">
-                  占比
-                  <span :style="{ color: item.color }"
-                    >{{ item.rate || 0 }}%</span
-                  >
-                </div>
-              </div>
-              <img :src="item.img" alt="" />
-            </div>
-          </div>
-        </div>
-      </div>
-      <div class="charts">
-        <div class="chart" ref="echartsRef"></div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import useEchartsResize from '@/hooks/useEchartsResize';
-import { getJobEventByStatus, getEventStatusNum } from '@/api/home/index';
-import { getDateRange } from '@/utils/date'
-import overviewImg2 from '@/assets/images/workbench/tc2.svg';
-import overviewImg3 from '@/assets/images/workbench/tc3.svg';
-import overviewImg4 from '@/assets/images/workbench/tc4.svg';
-import overviewImg5 from '@/assets/images/workbench/tc5.svg';
-import { useRouter } from 'vue-router'
-import _ from 'lodash'
-const router = useRouter()
-let checked = ref('CURRENT_YEAR');
-let timeListStr = ['本周', '本月', '本年'];
-let timeListEnum = ['CURRENT_WEEK', 'CURRENT_MONTH', 'CURRENT_YEAR'];
-
-const dateRanges = {
-  today: getDateRange('today'),
-  week: getDateRange('week'),
-  month: getDateRange('month'),
-  year: getDateRange('year'),
-}
-
-const params = ref({
-  // date_enum: 'CURRENT_YEAR',
-  device_sn: '',
-  end_date: dateRanges['year'][1], // undefined,
-  start_date: dateRanges['year'][0], // undefined,
-  source:1,//数据来源
-});
-const dateSelect = ref('CURRENT_YEAR');
-const eventTypeList = ref([
-  { name: '待审核', value: 0, img: overviewImg2, color: '#FF472F', status: '2', rate: 0 ,tagging:'pending' },
-  { name: '待处理', value: 0, img: overviewImg3, color: '#FF7411', status: '0', rate: 0 ,tagging:'processing' },
-  { name: '处理中', value: 0, img: overviewImg4, color: '#FFC300', status: '3', rate: 0 ,tagging:'inProgress'},
-  { name: '已完成', value: 0, img: overviewImg5, color: '#0291A1', status: '4', rate: 0 ,tagging:'completed'},
-]);
-//  工单统计
-const getTypeData = () => {
-  getEventStatusNum(params.value).then(res => {
-    const resList = res?.data?.data || [];
-    let totalNum = resList.reduce((sum, item) => sum + (item.num || 0), 0) - resList[0].num;
-    resList.forEach(item => {
-      eventTypeList.value.forEach(item1 => {
-        if (item1.name === item.name) {
-          item1.value = item.num;
-          item1.rate = _.round((item.num/totalNum)*100, 1);
-        }
-      });
-    });
-    initChart(resList);
-  });
-};
-const refresh = () => {
-  // params.value.date_enum = 'CURRENT_YEAR';
-  // checked.value = 'CURRENT_YEAR';
-  // dateSelect.value = 'CURRENT_YEAR';
-  getTypeData();
-};
-
-let timeClick = (item, index) => {
-  checked.value = item;
-  // params.value.date_enum = item;
-  if(item === 'CURRENT_WEEK') {
-    params.value.start_date = dateRanges['week'][0]
-    params.value.end_date = dateRanges['week'][1]
-  } else if(item === 'CURRENT_MONTH') {
-    params.value.start_date = dateRanges['month'][0]
-    params.value.end_date = dateRanges['month'][1]
-  } else {
-    params.value.start_date = dateRanges['year'][0]
-    params.value.end_date = dateRanges['year'][1]
-  }
-
-  dateSelect.value = item;
-  getTypeData();
-};
-// 跳转事件工单
-const jumpEventDetails = (item,index)=>{
-// console.log('tiaozhuan',item);
-  router.replace({
-    path: `/tickets/ticket`, 
-    query: { tab: item.tagging,enumerateDates:checked.value }
-  });
-}
-// 图表
-const echartsRef = ref(null);
-let { chart } = useEchartsResize(echartsRef);
-const initChart = val => {
-  let totalNum = val[0].num //val.reduce((sum, item) => sum + item.num, 0);
-  let filteredData = val.filter(item => item.name !== "全部状态");
-  const data = {
-    total: {
-      title: '总计',
-      figure: totalNum.toString(), // 动态计算总数
-    },
-    data: filteredData.map(item => ({
-      value: item.num,
-      name: item.name,
-      rate: _.round((item.num/totalNum)*100, 1),
-    })),
-  };
-  const containerWidth = chart.value.clientWidth;
-  const isSmallScreen = containerWidth < 768; // 移动端判断
-  const echartsOption = {
-    color: ['#0291A1', '#FF7411', '#FFC300', '#FF472F'],
-    tooltip: {
-      trigger: 'item',
-      padding: 0,
-      borderWidth: 0,
-      formatter: params => {
-        return `<div style="background-color: rgba($color: #FFFFFF, $alpha: 0.95);
-          box-shadow: 0 0.4rem 0.9rem 0 rgba($color: #000000, $alpha: 0.1);
-          padding:0 1.2rem;
-          display: flex;
-          align-items: center;
-          border-radius: 0.4rem;
-          font-size: 1.2rem;" class="tooltip-area">
-          <p>${params.marker}${params.name}</p>
-          <h4 style="margin-left: 1rem;">${params.data.rate || params.percent}%</h4>
-        </div>`;
-      },
-    },
-    legend: {
-      show: false,
-    },
-    title: {
-      text: data.total.title,
-      textStyle: {
-        color: 'rgba(28, 31, 35, 0.80)',
-        fontSize: '1.2rem',
-        fontWeight: 'bold',
-      },
-      subtext: data.total.figure,
-      subtextStyle: {
-        color: '#1C1F23',
-        fontSize: '2rem',
-        fontWeight: '600',
-      },
-      top: '40%',
-      left: '48%',
-      textAlign: 'center', // 文本对齐
-    },
-    series: [
-      {
-        name: '',
-        type: 'pie',
-        radius: ['55%', '83%'],
-
-        label: {
-          show: false,
-        },
-        labelLine: {
-          show: false,
-          length: 3, // 调整引导线长度
-          length2: 5,
-          lineStyle: {
-            cap: 'round',
-          },
-          minTurnAngle: 45, // 防止小角度重叠
-        },
-        data: data.data,
-      },
-    ],
-  };
-
-  chart.value.setOption(echartsOption);
-};
-onMounted(() => {
-  getTypeData();
-});
-</script>
-
-<style scoped lang="scss">
-.workOrder {
-  border-radius: 8px 8px 8px 8px;
-  padding: 4px 14px 0 15px;
-  background: #ffffff !important;
-
-  height: pxToVh(282);
-  margin-bottom: 10px;
-  .card-title {
-    display: flex;
-    margin-bottom: 4px;
-    align-items: center;
-    justify-content: space-between;
-    .cardtotal {
-      display: flex;
-      align-items: center;
-      margin-left: 9px;
-      img {
-        width: 17px;
-        height: 17px;
-        margin-left: 6px;
-        cursor: pointer;
-      }
-      p {
-        font-weight: bold;
-        font-size: 14px;
-        color: #363636;
-      }
-
-      span {
-        font-weight: 400;
-        font-size: 14px;
-        color: #7c8091;
-      }
-
-      .total-number {
-        font-family: 'Source Han Sans CN';
-
-        font-weight: bold;
-        font-size: 32px;
-        color: #2a54ff;
-      }
-    }
-
-    img {
-      width: 36px;
-      height: 40px;
-    }
-  }
-  .workorderbox {
-    display: flex;
-    justify-content: space-between;
-    .card-group {
-      width: 60%;
-
-      .status-grid {
-        display: grid;
-        grid-template-columns: repeat(2, 1fr);
-        .status-item {
-          display: flex;
-          text-align: center;
-          justify-content: space-between;
-          height: pxToVh(97);
-          margin-bottom: 10px;
-          margin-right: 14px;
-          width: 144px;
-          background: #f6f8fe;
-          border-radius: 8px 8px 8px 8px;
-          cursor: pointer;
-          img {
-            width: 26px;
-            height: 26px;
-            padding: 9px 10px 9px 2px;
-          }
-
-          .statusCon {
-            box-sizing: border-box;
-            display: flex;
-            flex-direction: column;
-          justify-content: space-between;
-            padding: 10px 4px 39px 10px;
-            text-align: left;
-
-            .status-label {
-              font-weight: 400;
-              font-size: 14px;
-              text-align: left;
-              color: #383838;
-              margin: 0;
-            }
-
-            .ratio {
-              font-weight: 400;
-              font-size: 12px;
-              color: #363636;
-              white-space: nowrap;
-              text-align: left;
-              margin-top: 10px;
-            }
-
-            .status-value {
-              font-family: 'Source Han Sans CN';
-              font-weight: bold;
-              font-size: 28px;
-              height: 28px;
-              color: #363636;
-            margin-top: -6px;
-              display: inline-block;
-              transform: skewX(-5deg);
-
-              span {
-                font-weight: 400;
-                font-size: 14px;
-                color: #7c8091;
-              }
-            }
-          }
-        }
-      }
-    }
-
-    .charts {
-      margin-top: 20px;
-      width: 40%;
-      height: auto;
-
-      .chart {
-        width: 100%;
-        height: 100%;
-      }
-    }
-  }
-}
-.time-card {
-  text-align: center;
-  // height: 30px;
-  height: pxToVh(30);
-  background: #ffffff;
-
-  border: 1px solid #e5e5e5;
-  font-weight: 400;
-  font-size: 14px;
-  color: #7c8091;
-  display: flex;
-  width: 282px;
-  margin-left: 15px;
-  border-radius: 4px;
-
-  .card-item {
-    width: 94px;
-    height: 100%;
-    // line-height: 28px;
-    cursor: pointer;
-    font-family: 'Source Han Sans CN';
-    font-weight: 400;
-    font-size: 14px;
-    color: #7c8091;
-      border: 1px solid transparent;
-      display: flex;
-      align-items: center;
-      justify-content: center;
-  }
-
-  .card-item:first-child {
-    border-right: 1px solid #e5e5e5;
-  }
-
-  .card-item:nth-child(2) {
-    border-right: 1px solid #e5e5e5;
-  }
-
-  .card-item.active {
-    color: #1441ff;
-    border: 1px solid #1c5cff;
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/wel/components/statistics.vue b/applications/task-work-order/src/views/wel/components/statistics.vue
deleted file mode 100644
index d8bf2d0..0000000
--- a/applications/task-work-order/src/views/wel/components/statistics.vue
+++ /dev/null
@@ -1,498 +0,0 @@
-<template>
-  <div class="statistics">
-    <div class="title">
-      <div class="name">
-        <span> 设备统计</span>
-        <img @click="refresh" src="/src/assets/images/workbench/st1.png" alt="" />
-      </div>
-      <div class="arrow" @click="jumppage">
-        <img src="/src/assets/images/workbench/st2.png" alt="" />
-      </div>
-    </div>
-
-    <div class="grid-container" v-if="Object.keys(newtitleData).length > 0">
-      <div v-for="(item, index) in Object.keys(newtitleData)" :key="index" class="device-card">
-        <div class="device-title">
-          <img :src="test[item].img" :alt="newtitleData[item].name" />
-          <div class="itemcenter">
-            <div>{{ test[item]?.name || '--' }}</div>
-            <span class="shu">{{ newtitleData[item].total_num }}</span>
-            <span>{{ unitMap[test[item]?.name] }}</span>
-          </div>
-        </div>
-        <div class="status-list">
-          <template v-if="test[item]?.name == '机巢' || test[item]?.name == '无人机'">
-            <div v-for="statusKey in [4, 0, -1]" :key="statusKey" class="status-item"
-              :class="getStatusStyle(test[item]?.name, statusKey)"
-              :style="{ color: getStatusColor(test[item]?.name, statusKey) }">
-              <span class="indicator" :style="{
-                backgroundColor: getStatusBackground(test[item]?.name, statusKey),
-                color: getStatusColor(test[item]?.name, statusKey),
-              }"></span>
-              <span class="label">{{ getStatusLabel(test[item]?.name, statusKey) }}</span>
-              <span class="count">
-                {{ newtitleData[item].status_map[statusKey] }}
-                {{ unitMap[test[item]?.name] }}
-              </span>
-            </div>
-          </template>
-          <template v-else-if="test[item]?.name == '监控设备'">
-            <div v-for="statusKey in [1, 0]" :key="statusKey" class="status-item"
-              :class="getStatusStyle(test[item]?.name, statusKey)"
-              :style="{ color: getStatusColor(test[item]?.name, statusKey) }">
-              <span class="indicator" :style="{
-                backgroundColor: getStatusBackground(test[item]?.name, statusKey),
-                color: getStatusColor(test[item]?.name, statusKey),
-              }"></span>
-              <span class="label">{{ getStatusLabel(test[item]?.name, statusKey) }}</span>
-              <span class="count">
-                {{ newtitleData[item].status_map[statusKey] }}
-                {{ unitMap[test[item]?.name] }}
-              </span>
-            </div>
-          </template>
-          <template v-else-if="test[item]?.name == '无人机保险'">
-            <div v-for="statusKey in [1, 0, 2]" :key="statusKey" class="status-item"
-              :class="getStatusStyle(test[item]?.name, statusKey)"
-              :style="{ color: getStatusColor(test[item]?.name, statusKey) }">
-              <span class="indicator" :style="{
-                backgroundColor: getStatusBackground(test[item]?.name, statusKey),
-                color: getStatusColor(test[item]?.name, statusKey),
-              }"></span>
-              <span class="label">{{ getStatusLabel(test[item]?.name, statusKey) }}</span>
-              <span class="count">
-                {{ newtitleData[item].status_map[statusKey] }}
-                {{ test[item]?.name === '无人机' ? '架' : '个' }}
-              </span>
-            </div>
-          </template>
-          <template v-else-if="test[item]?.name == '无人机流量'">
-            <div v-for="statusKey in [0, 2, 1]" :key="statusKey" class="status-item"
-              :class="getStatusStyle(test[item]?.name, statusKey)"
-              :style="{ color: getStatusColor(test[item]?.name, statusKey) }">
-              <span class="indicator" :style="{
-                backgroundColor: getStatusBackground(test[item]?.name, statusKey),
-                color: getStatusColor(test[item]?.name, statusKey),
-              }"></span>
-              <span class="label">{{ getStatusLabel(test[item]?.name, statusKey) }}</span>
-              <span class="count">
-                {{ newtitleData[item].status_map[statusKey] }}
-                {{ test[item]?.name === '无人机流量' ? '架' : '个' }}
-              </span>
-            </div>
-          </template>
-          <template v-else>
-            <div v-for="(status, statusIndex) in newtitleData[item].status_map" :key="statusIndex" class="status-item"
-              :class="getStatusStyle(test[item]?.name, statusIndex)"
-              :style="{ color: getStatusColor(test[item]?.name, statusIndex) }">
-              <span class="indicator" :style="{
-                backgroundColor: getStatusBackground(test[item]?.name, statusIndex),
-                color: getStatusColor(test[item]?.name, statusIndex),
-              }"></span>
-              <span class="label">{{ getStatusLabel(test[item]?.name, statusIndex) }}</span>
-              <span class="count">{{ status }} {{ unitMap[test[item]?.name] }}</span>
-            </div>
-          </template>
-        </div>
-      </div>
-    </div>
-    <div class="grid-container" v-else>
-      <el-empty>
-        <template #description>
-          <span class="custom-text">暂无数据</span>
-        </template>
-      </el-empty>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { useStore } from 'vuex'
-import { computed } from 'vue'
-import titleImg1 from '@/assets/images/workbench/st3.svg'
-import titleImg2 from '@/assets/images/workbench/st4.svg'
-import titleImg3 from '@/assets/images/workbench/st8.svg'
-import titleImg4 from '@/assets/images/workbench/st5.svg'
-import titleImg5 from '@/assets/images/workbench/st6.svg'
-import titleImg6 from '@/assets/images/workbench/st9.svg'
-import { getStatics } from '@/api/home/index'
-import { useRouter } from 'vue-router'
-const router = useRouter()
-const store = useStore()
-const refresh = () => {
-  getStaticsList()
-}
-const jumppage = () => {
-  router.push({
-    path: '/device/index',
-  })
-}
-const userInfo = computed(() => store.getters.userInfo)
-const permission = computed(() => store.getters.permission)
-
-const newtitleData = ref({})
-
-const test = {
-  no_move_list: {
-    name: '机巢',
-    img: titleImg1,
-  },
-  plant_list: {
-    name: '无人机',
-    img: titleImg2,
-  },
-  flow_type_list: {
-    name: '无人机流量',
-    img: titleImg3,
-  },
-  monitor_list: {
-    name: '监控设备',
-    img: titleImg4,
-  },
-  move_list: {
-    name: '移动机巢',
-    img: titleImg5,
-  },
-
-  insure_list: {
-    name: '无人机保险',
-    img: titleImg6,
-  },
-}
-const statusSelect = {
-  4: '作业中',
-  0: '空闲中',
-  '-1': '离线中',
-}
-const flowStatus = {
-  0: '无忧',
-  1: '临期',
-  2: '不足',
-}
-const monitorStatus = {
-  0: '离线中',
-  1: '在线中',
-}
-
-const insureStatus = {
-  0: '临近到期',
-  1: '正常期限',
-  2: '保险过期'
-}
-const moveListStatus = {
-  '-1': '离线中',
-  4: '在线中',
-}
-// 样式配置对象
-const statusStyles = {
-  无人机保险: {
-    0: { class: 'expired', color: '#FFA600', background: '#FFA600' },
-    1: { class: 'normal', color: 'rgba(0, 180, 69, 1)', background: 'rgba(0, 180, 69, 1)' },
-    2: { class: 'flying', color: 'rgba(255, 36, 36, 1)', background: 'rgba(255, 36, 36, 1)' },
-  },
-
-  无人机流量: {
-    0: { class: 'offline', color: 'rgba(0, 180, 69, 1)', background: 'rgba(0, 180, 69, 1)' },
-    1: { class: 'flying', color: 'rgba(255, 36, 36, 1)', background: 'rgba(255, 36, 36, 1)' },
-    2: { class: 'flying', color: '#FFA600', background: '#FFA600' },
-  },
-  监控设备: {
-    0: { class: 'offline', color: 'rgba(186, 186, 186, 1)', background: 'rgba(186, 186, 186, 1)' },
-    1: { class: 'flying', color: 'rgba(255, 106, 0, 1)', background: 'rgba(255, 106, 0, 1)' },
-  },
-  移动机巢: {
-    '-1': { class: 'offline', color: 'rgba(186, 186, 186, 1)', background: 'rgba(186, 186, 186, 1)' },
-    4: { class: 'flying', color: 'rgba(255, 106, 0, 1)', background: 'rgba(255, 106, 0, 1)' },
-  },
-  // 默认样式配置
-  default: {
-    0: { class: 'warning', color: 'rgba(0, 180, 69, 1)', background: 'rgba(0, 180, 69, 1)' },
-    4: { class: 'success', color: 'rgba(255, 106, 0, 1)', background: 'rgba(255, 106, 0, 1)' },
-    '-1': { class: 'success', color: 'rgba(186, 186, 186, 1)', background: 'rgba(186, 186, 186, 1)' },
-  },
-}
-
-const getStatusStyle = (name, statusIndex) => {
-  const styleConfig = statusStyles[name] || statusStyles.default
-  return styleConfig[statusIndex]?.class || ''
-}
-const getStatusColor = (name, statusIndex) => {
-  const styleConfig = statusStyles[name] || statusStyles.default
-  return styleConfig[statusIndex]?.color || '#333'
-}
-//背景颜色获取方法
-const getStatusBackground = (name, statusIndex) => {
-  const styleConfig = statusStyles[name] || statusStyles.default
-  return styleConfig[statusIndex]?.background || styleConfig[statusIndex]?.color || '#F0F0F0'
-}
-const getStatusLabel = (itemName, statusCode) => {
-  switch (itemName) {
-    case '无人机流量':
-      return flowStatus[statusCode] || statusSelect[statusCode]
-    case '监控设备':
-      return monitorStatus[statusCode] || statusSelect[statusCode]
-    case '无人机保险':
-      return insureStatus[statusCode] || statusSelect[statusCode]
-    case '移动机巢':
-      return moveListStatus[statusCode] || statusSelect[statusCode]
-    default:
-      return statusSelect[statusCode] || `未知状态(${statusCode})`
-  }
-}
-
-const getStaticsList = () => {
-  getStatics(userInfo.value.detail.areaCode).then(res => {
-    //  console.log('permission.value', permission.value);
-    // console.log('设备', res.data.data);
-    if (permission.value?.device_statistics_six) {
-      const { move_list, monitor_list, ...filteredData } = res.data.data
-      newtitleData.value = filteredData
-      return
-    }
-
-    for (let key in res.data.data) {
-      if (permission.value?.device_statistics_four) {
-        const { flow_type_list, insure_list, ...filteredData } = res.data.data
-        newtitleData.value = filteredData
-        return
-      }
-    }
-  })
-}
-
-const unitMap = {
-  无人机流量: '架',
-  无人机: '架',
-  机巢: '个',
-  无人机保险: '个',
-  监控设备: '个',
-  移动机巢: '个',
-}
-watch(
-  () => [
-    userInfo.value.detail?.areaCode,
-    permission.value.device_statistics_six,
-    permission.value?.device_statistics_four,
-  ],
-  () => getStaticsList(),
-  { immediate: true }
-)
-onMounted(() => {
-  getStaticsList()
-})
-</script>
-
-<style scoped lang="scss">
-.statistics {
-  // height: 174px;
-  height: pxToVh(174);
-  background: #ffffff;
-  border-radius: 8px 8px 8px 8px;
-  margin-bottom: 10px;
-  font-size: clamp(12px, 2vw, 24px);
-
-  .title {
-    padding: 14px 14px 0 21px;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-
-    .name {
-      display: flex;
-      align-items: center;
-
-      span {
-        margin-right: 4px;
-        font-weight: bold;
-        font-size: 16px;
-        color: #363636;
-        font-family: 'Source Han Sans CN';
-      }
-
-      img {
-        cursor: pointer;
-      }
-    }
-
-    .arrow {
-      cursor: pointer;
-    }
-  }
-
-  .grid-container {
-    padding: 0 14px 0 21px;
-    // display: grid;
-    // grid-template-columns: repeat(4, 1fr);
-    height: pxToVh(80);
-    display: flex;
-    justify-content: space-around;
-
-    :deep(.el-empty) {
-      width: 60px;
-      height: pxToVh(60);
-
-      .el-empty__image {
-        width: 60px !important;
-        height: pxToVh(60) !important;
-      }
-
-      .custom-text {
-        font-size: 12px;
-        color: #7c8091;
-      }
-    }
-
-    .device-card {
-      display: flex;
-      align-items: center;
-      margin-top: 30px;
-
-      .device-title {
-        display: flex;
-        align-items: center;
-
-        img {
-          width: 64px;
-          height: 64px;
-        }
-      }
-
-      .itemcenter {
-        margin-left: 5px;
-        font-weight: 400;
-        font-size: 14px;
-        color: #343434;
-
-        div {
-          margin-top: 5px;
-        }
-
-        .shu {
-          font-weight: bold;
-          font-size: 36px;
-          color: #363636;
-          display: inline-block;
-          transform: skewX(-5deg);
-          font-family: 'Source Han Sans CN';
-          // font-size: calc(12px + 0.5vw);
-          margin-right: 2px;
-        }
-
-        span {
-          font-weight: 400;
-          font-size: 12px;
-          color: #7c8091;
-        }
-      }
-    }
-
-    .status-list {
-      display: grid;
-      margin-left: 5px;
-
-      .status-item {
-        display: flex;
-        align-items: center;
-        border-radius: 6px;
-        background: #fff;
-        font-size: 12px;
-        gap: 10px;
-        margin-bottom: 5px;
-
-        .indicator {
-          width: 6px;
-          height: 6px;
-          border-radius: 50%;
-        }
-
-        .label {
-          flex: 1;
-          // font-size: clamp(12px, 1vw, 14px);
-        }
-
-        .count {
-          // font-size: clamp(14px, 1.1vw, 16px);
-          font-size: 14px;
-          color: #7c8091;
-        }
-      }
-    }
-  }
-
-  .grid-container1 {
-    // padding: 0 14px 0 21px;
-    display: grid;
-    grid-template-columns: repeat(6, 1fr);
-
-    .device-card {
-      display: flex;
-      flex-direction: column;
-      align-items: center;
-
-      .device-title {
-        display: flex;
-        align-items: center;
-
-        img {
-          width: 64px;
-          height: 64px;
-        }
-      }
-
-      .itemcenter {
-        margin-left: 14px;
-        font-weight: 400;
-        font-size: 14px;
-        color: #343434;
-
-        .shu {
-          font-weight: bold;
-          font-size: 36px;
-          color: #363636;
-          display: inline-block;
-          transform: skewX(-5deg);
-          font-family: 'Source Han Sans CN';
-          margin-right: 2px;
-        }
-
-        span {
-          font-weight: 400;
-          font-size: 12px;
-          color: #7c8091;
-        }
-      }
-    }
-
-    .status-list {
-      display: grid;
-
-      .status-item {
-        display: flex;
-        align-items: center;
-        border-radius: 6px;
-        background: #fff;
-        font-size: 12px;
-        gap: 10px;
-        margin-bottom: 5px;
-
-        .indicator {
-          width: 6px;
-          height: 6px;
-          border-radius: 50%;
-        }
-
-        .label {
-          flex: 1;
-          font-size: clamp(12px, 1vw, 14px);
-        }
-
-        .count {
-          font-size: clamp(12px, 1.1vw, 16px);
-          font-size: 14px;
-          color: #7c8091;
-        }
-      }
-    }
-  }
-}
-</style>
diff --git a/applications/task-work-order/src/views/wel/components/taskOutcome.vue b/applications/task-work-order/src/views/wel/components/taskOutcome.vue
deleted file mode 100644
index e1ea1ad..0000000
--- a/applications/task-work-order/src/views/wel/components/taskOutcome.vue
+++ /dev/null
@@ -1,315 +0,0 @@
-<template>
-  <div class="taskOutcome">
-    <div class="card-title">
-      <div class="cardtotal">
-        <p>任务成果</p>
-        <span class="total-number">{{totalNum}}</span>
-        <p>个</p>
-        <img @click="refresh" src="/src/assets/images/workbench/st1.svg" alt="" />
-      </div>
-      <div class="time-card">
-        <div
-          class="card-item"
-          :class="item === checked ? 'active' : ''"
-          v-for="(item, index) in timeListEnum"
-          :key="index"
-          @click="timeClick(item, index)"
-        >
-          {{ timeListStr[index] }}
-        </div>
-      </div>
-    </div>
-    <div class="chart" ref="echartsRef"></div>
-  </div>
-</template>
-
-<script setup>
-import { getdisposeApi, gettaskOutcomApi } from '@/api/home/index';
-import * as echarts from 'echarts';
-import dayjs from 'dayjs';
-import useEchartsResize from '@/hooks/useEchartsResize';
-let checked = ref('CURRENT_YEAR');
-let timeListStr = ['本周', '本月', '本年'];
-let timeListEnum = ['CURRENT_WEEK', 'CURRENT_MONTH', 'CURRENT_YEAR'];
-const params = ref({
-  dateEnum: 'CURRENT_YEAR',
-  device_sn: '',
-  end_date: undefined,
-  start_date: undefined,
-});
-const totalNum = ref(0)
-const dateSelect = ref('CURRENT_YEAR');
-const refresh = () => {
-
-  getBarChartData(params.value);
-};
-let timeClick = (item, index) => {
-  checked.value = item;
-  params.value.dateEnum = item;
-  dateSelect.value = item;
- getBarChartData(params.value);
-};
-const seriesObj = {};
-const echartsOption = {
-    title: {
-      text: seriesObj ? '' :'暂无数据',
-      left: 'center',
-      top: 'center',
-      textStyle: {
-        color: '#999',
-        fontSize: '1.6rem',
-        fontWeight: 'normal'
-      }
-    },
-  tooltip: {
-    trigger: 'axis',
-    axisPointer: {
-      type: 'shadow',
-    },
-  },
-  legend: {
-    itemWidth: 14,
-    itemHeight: 8,
-    data: ['照片总数', '视频总数', 'AI识别', '全景', '三维', '正射'], 
-    top: '-1%',
-    textStyle: {
-      color: '#383838',
-      fontSize: 12,
-    },
-  },
-  grid: {
-    top: '9%', 
-    left: 0,
-    right: 0,
-    bottom: 0,
-    containLabel: true,
-  },
-  xAxis: {
-    type: 'category',
-    axisLine: {
-      show: true, // 隐藏轴线
-      lineStyle: {
-        color: '#cdd5e2',
-      },
-    },
-    axisLabel: {
-      color: '#383838',
-      // interval: 0, // 显示所有标签
-    },
-    data: [],
-  },
-  yAxis: [
-    {
-      type: 'value',
-      name: '',
-      nameTextStyle: {
-        color: '#E6F7FF',
-        fontSize: '1rem',
-        padding: [-8, 0, 0, 0], // 调整单位文字位置,向左偏移
-        verticalAlign: 'top',
-        lineHeight: 12,
-      },
-      axisLabel: {
-        interval: 0, // 显示所有标签
-        color: '#383838',
-        fontFamily: 'Source Han Sans CN, Source Han Sans CN',
-        fontWeight: 400,
-        fontSize: 10,
-      },
-      axisLine: {
-        lineStyle: {
-          color: '#383838',
-        },
-      },
-      splitLine: {
-        lineStyle: {
-          color: '#cdd5e2',
-          type: 'dashed', // 设置为虚线
-        },
-      },
-    },
-  ],
-  series: [],
-};
-const eventTypeList = ref([
-  {name: '照片总数', value: 0, type: '0', color: '#ED672D' },
-  { name: '视频总数', value: 0, type: '1', color: '#F5B763' },
-  { name: 'AI识别', value: 0, type: '2', color: '#6851C3' },
-  {  name: '全景', value: 0, type: '5', color: '#FFE100' },
-  {  name: '三维', value: 0, type: '3', color: '#04C598' },
-  {  name: '正射', value: 0, type: '4', color: '#3673E8' },
-]);
-
-eventTypeList.value.forEach(item => {
-  seriesObj[item.name] = {
-    type: 'bar',
-    stack: 'Ad',
-    barWidth: 8,
-    emphasis: {
-      focus: 'series',
-    },
-    name: item.name,
-    itemStyle: { color: item.color },
-    data: [],
-  };
-});
-const echartsRef = ref(null);
-let { chart } = useEchartsResize(echartsRef);
-// 获取柱状图数据
-const getBarChartData = value => {
-  gettaskOutcomApi(value).then(res => {
-    const list = res?.data?.data || [];
-
-    
-    eventTypeList.value.forEach(item => {
-      item.value = 0;
-    });
-    const typeMap = new Map();
-    eventTypeList.value.forEach(item => {
-      typeMap.set(item.type, item);
-    });
-    echartsOption.xAxis.data = list.map(item => item.name);
-
-    Object.keys(seriesObj).forEach(key => {
-      seriesObj[key].data = [];
-    });   
-    // 遍历所有月份
-    list.forEach(month => {
-    totalNum.value = month.total
-      const monthData = new Map();
-      month.data.forEach(item => {
-        monthData.set(item.name, item.value);
-      });   
-      eventTypeList.value.forEach(typeItem => {
-        const value = monthData.get(typeItem.type) || 0;
-        if (seriesObj[typeItem.name]) {
-          seriesObj[typeItem.name].data.push(value);
-        }
-      });
-    });
-    if (list.length > 0) {
-      const lastMonth = list[list.length - 1];
-      const lastMonthData = new Map();
-      lastMonth.data.forEach(item => {
-        lastMonthData.set(item.name, item.value);
-      });
-      
-      eventTypeList.value.forEach(item => {
-        const value = lastMonthData.get(item.type);
-        if (value !== undefined) {
-          item.value = value;
-        }
-      });
-    }
-    
-    // 更新图表
-    echartsOption.series = Object.values(seriesObj);
-    chart.value.setOption(echartsOption);
-  });
-};
-onMounted(() => {
-  getBarChartData(params.value);
-});
-</script>
-
-<style scoped lang="scss">
-.taskOutcome {
-  border-radius: 8px 8px 8px 8px;
-  padding: 4px 14px 0 15px;
-  background: #ffffff !important;
-  margin-top: 10px;
-  margin-left: 10px;
-  height: pxToVh(473);
-  .card-title {
-    display: flex;
-    // margin-bottom: 10px;
-    align-items: center;
-    justify-content: space-between;
-    .cardtotal {
-      display: flex;
-      align-items: center;
-      margin-left: 9px;
-      img {
-        width: 17px;
-        height: 17px;
-        margin-left: 6px;
-        cursor: pointer;
-      }
-      p {
-        font-weight: bold;
-        font-size: 14px;
-        color: #363636;
-      }
-
-      span {
-        font-weight: 400;
-        font-size: 14px;
-        color: #7c8091;
-      }
-
-      .total-number {
-        font-family: 'Source Han Sans CN';
-
-        font-weight: bold;
-        font-size: 32px;
-        color: #2a54ff;
-      }
-    }
-
-    img {
-      width: 36px;
-      height: 40px;
-    }
-  }
-}
-
-.time-card {
-  text-align: center;
-  // height: 30px;
-  height: pxToVh(30);
-  background: #ffffff;
-
-  border: 1px solid #e5e5e5;
-  font-weight: 400;
-  font-size: 14px;
-  color: #7c8091;
-  display: flex;
-  width: 282px;
-  margin-left: 15px;
-  border-radius: 4px;
-
-.card-item {
-    width: 94px;
-    height: 100%;
-    // line-height: 28px;
-    cursor: pointer;
-    font-family: 'Source Han Sans CN';
-    font-weight: 400;
-    font-size: 14px;
-    color: #7c8091;
-      border: 1px solid transparent;
-      display: flex;
-      align-items: center;
-      justify-content: center;
-  }
-
-  .card-item:first-child {
-    border-right: 1px solid #e5e5e5;
-  }
-
-  .card-item:nth-child(2) {
-    border-right: 1px solid #e5e5e5;
-  }
-
-  .card-item.active {
-    color: #1441ff;
-    border: 1px solid #1c5cff;
-  }
-}
-.chart {
-  width: 98%;
-  height: pxToVh(380);
-  padding-left: 10px;
-  margin-top: 10px;
-}
-</style>
diff --git a/applications/task-work-order/src/views/wel/dashboard.vue b/applications/task-work-order/src/views/wel/dashboard.vue
deleted file mode 100644
index 62f5612..0000000
--- a/applications/task-work-order/src/views/wel/dashboard.vue
+++ /dev/null
@@ -1,196 +0,0 @@
-<template>
-  <basic-container>
-    <div class="wel">
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-platform-eleme"
-        text="开始菜单1"
-        time="1"
-        background="/img/bg/bg3.jpg"
-        color="#d56259"
-      ></basic-block>
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-eleme"
-        text="开始菜单2"
-        time="2"
-        background="/img/bg/bg2.jpg"
-        color="#419ce7"
-      ></basic-block>
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-delete-solid"
-        text="开始菜单3"
-        time="3"
-        color="#56b69b"
-      ></basic-block>
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-delete"
-        text="开始菜单4"
-        time="4"
-        color="#d44858"
-      ></basic-block>
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-s-tools"
-        text="开始菜单5"
-        time="5"
-        color="#3a1f7e"
-      ></basic-block>
-      <basic-block
-        :width="410"
-        :height="height"
-        icon="el-icon-setting"
-        text="开始菜单6"
-        time="6"
-        background="/img/bg/bg1.jpg"
-        dept="这是一段很长的很长很长很长的描述这是一段很长的很长很长很长的描述"
-        color="#422829"
-      ></basic-block>
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-user-solid"
-        text="开始菜单7"
-        time="7"
-        color="#613cbd"
-      ></basic-block>
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-star-off"
-        text="开始菜单8"
-        time="8"
-        color="#da542e"
-      ></basic-block>
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-goods"
-        text="开始菜单9"
-        time="9"
-        color="#2e8aef"
-      ></basic-block>
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-circle-check"
-        text="开始菜单10"
-        time="10"
-        color="#3d17b8"
-      ></basic-block>
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-s-platform"
-        text="开始菜单11"
-        time="11"
-        color="#e31462"
-      ></basic-block>
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-s-fold"
-        text="开始菜单12"
-        time="12"
-        color="#d9532d"
-      ></basic-block>
-      <basic-block
-        :width="410"
-        :height="height"
-        icon="el-icon-s-open"
-        text="开始菜单13"
-        time="13"
-        dept="这是一段很长的很长很长很长的描述这是一段很长的很长很长很长的描述"
-        color="#b72147"
-      ></basic-block>
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-s-flag"
-        text="开始菜单14"
-        time="14"
-        color="#01a100"
-      ></basic-block>
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-s-data"
-        text="开始菜单15"
-        time="15"
-        color="#0c56bf"
-      ></basic-block>
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-s-grid"
-        text="开始菜单16"
-        time="16"
-        color="#0098a9"
-      ></basic-block>
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-s-release"
-        text="开始菜单17"
-        time="17"
-        background="/img/bg/bg2.jpg"
-        color="#209bdf"
-      ></basic-block>
-      <basic-block
-        :width="width"
-        :height="height"
-        icon="el-icon-s-home"
-        text="开始菜单18"
-        time="18"
-        background="/img/bg/bg3.jpg"
-        color="#603bbc"
-      ></basic-block>
-      <basic-block
-        :width="515"
-        :height="height"
-        icon="el-icon-s-promotion"
-        text="开始菜单19"
-        time="19"
-        dept="这是一段很长的很长很长很长的描述这是一段很长的很长很长很长的描述"
-        color="#009bad"
-      ></basic-block>
-      <basic-block
-        :width="515"
-        :height="height"
-        icon="el-icon-s-custom"
-        text="开始菜单20"
-        time="20"
-        background="/img/bg/bg4.jpg"
-        dept="这是一段很长的很长很长很长的描述这是一段很长的很长很长很长的描述"
-        color="#d74e2a"
-      ></basic-block>
-    </div>
-  </basic-container>
-</template>
-
-<script>
-export default {
-  data() {
-    return {
-      width: 200,
-      height: 120,
-    };
-  },
-};
-</script>
-
-<style lang="scss">
-.wel {
-  display: flex;
-  flex-wrap: wrap;
-  width: 1100px;
-  margin: 0 auto;
-}
-</style>
diff --git a/applications/task-work-order/src/views/wel/index.vue b/applications/task-work-order/src/views/wel/index.vue
index 1881964..f59947f 100644
--- a/applications/task-work-order/src/views/wel/index.vue
+++ b/applications/task-work-order/src/views/wel/index.vue
@@ -1,217 +1,13 @@
 <template>
-  <wel-container>
-    <div class="workbench" v-if="display">
-      <div class="workleft">
-        <!-- 设备统计  -->
-        <statistics></statistics>
-        <!-- 综合统计分析 -->
-        <div class="comprehensiveCon">
-          <div class="comprehensive">
+	<div>
 
-            <div class="center">
-              <div class="centerLeft">
-                <!-- 工单统计 -->
-                <proportionStatic></proportionStatic>
-                <!-- 飞行统计 -->
-                <flightStatistics></flightStatistics>
-
-              </div>
-              <div class="centerRight">
-                <!-- 机巢工单数量排名(件) -->
-                <flyratio></flyratio>
-                <!-- 任务成果 -->
-                <taskOutcome></taskOutcome>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
-
-      <div class="workright">
-        <Bocklog></Bocklog>
-        <CalenBox></CalenBox>
-      </div>
-    </div>
-  </wel-container>
+	</div>
 </template>
 
 <script setup>
-import taskOutcome from './components/taskOutcome.vue'
-import flightStatistics from './components/flightStatistics.vue'
-import proportionStatic from './components/proportionStatic.vue'
-import flyratio from './components/flyratio.vue'
-import Bocklog from './components/backlog.vue'
-import CalenBox from './components/calendarBox.vue'
-import * as echarts from 'echarts'
-import useEchartsResize from '@/hooks/useEchartsResize'
-import { mapGetters } from 'vuex'
-import { getJobEventByStatus, getJobEventTotal, getFly, getFlyTime } from '@/api/home/index'
-import overviewImg1 from '@/assets/images/workbench/tc1.png'
 
-import fy1 from '@/assets/images/workbench/fy1.png'
-
-import statistics from './components/statistics.vue'
-import { ElMessage } from 'element-plus'
-let checked = ref('CURRENT_YEAR')
-const display = ref(false)
-let timeListStr = ['本周', '本月', '本年']
-let timeListEnum = ['CURRENT_WEEK', 'CURRENT_MONTH', 'CURRENT_YEAR']
-const params = ref({
-  date_enum: 'CURRENT_YEAR',
-  device_sn: '',
-  end_date: undefined,
-  start_date: undefined,
-})
-const dateSelect = ref('CURRENT_YEAR')
-let timeClick = (item, index) => {
-  checked.value = item
-  params.value.date_enum = item
-  dateSelect.value = item
-
-
-
-}
-const refresh = () => {
-  params.value.date_enum = 'CURRENT_YEAR'
-  checked.value = 'CURRENT_YEAR'
-  dateSelect.value = 'CURRENT_YEAR'
-
-
-}
-// 跳转
-const jumpshebei = () => {
-  ElMessage.warning('加急开发中...')
-}
-
-const eventTotal = ref(0)
-const data = ref([])
-
-onMounted(() => {
-  getJobEventTotal().then(res => {
-    eventTotal.value = res?.data?.data || 0
-  })
-  setTimeout(() => {
-    display.value = true
-  },100)
-})
 </script>
 
-<style>
-.el-font-size {
-  font-size: 14px;
-}
-</style>
-<style scoped lang="scss">
-.workbench {
-  height: 100%;
-  flex: 1;
-  // padding: 0px 20px 0 10px;
-  display: flex;
-  justify-content: space-between;
-}
+<style lang="scss" scoped>
 
-.workleft {
-  width: 68%;
-  margin-right: 10px;
-  height: 100%;
-
-  .comprehensiveCon {
-    // background: #ffffff !important;
-    height: pxToVh(776);
-    border-radius: 8px 8px 8px 8px;
-
-    .comprehensive {
-
-      // padding: 14px 14px 0 21px;
-
-      .title {
-        display: flex;
-        justify-content: space-between;
-        align-items: center;
-
-        .name {
-          display: flex;
-          align-items: center;
-          font-weight: bold;
-          font-size: 16px;
-          color: #363636;
-          font-family: 'Source Han Sans CN';
-
-          span {
-            margin-right: 4px;
-          }
-
-          img {
-            cursor: pointer;
-          }
-        }
-
-        .arrow {
-          cursor: pointer;
-        }
-
-        .time-card {
-          text-align: center;
-          // height: 30px;
-          height: pxToVh(30);
-          background: #ffffff;
-          border-radius: 4px 0px 0px 4px;
-          border: 1px solid #e5e5e5;
-          font-weight: 400;
-          font-size: 14px;
-          color: #7c8091;
-          display: flex;
-          width: 282px;
-          margin-left: 15px;
-
-          .card-item {
-            width: 94px;
-            height: 100%;
-            line-height: 28px;
-            cursor: pointer;
-            font-family: 'Source Han Sans CN';
-            font-weight: 400;
-            font-size: 14px;
-            color: #7c8091;
-          }
-
-          .card-item:first-child {
-            border-right: 1px solid #e5e5e5;
-          }
-
-          .card-item:nth-child(2) {
-            border-right: 1px solid #e5e5e5;
-          }
-
-          .card-item.active {
-            color: #1441ff;
-            border: 1px solid #1c5cff;
-          }
-        }
-      }
-
-      // 工、单
-      .center {
-        display: flex;
-        .centerLeft {
-          width: 50%;
-
-
-        }
-
-        .centerRight {
-          width: 50%;
-        }
-      }
-    }
-  }
-}
-
-.workright {
-  width: 0;
-  flex: 1;
-  height: 100%;
-  // display: flex;
-  // flex-direction: column;
-}
-</style>
+</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/workspace/index.vue b/applications/task-work-order/src/views/workspace/index.vue
deleted file mode 100644
index 136b8a2..0000000
--- a/applications/task-work-order/src/views/workspace/index.vue
+++ /dev/null
@@ -1,303 +0,0 @@
-<template>
-  <basic-container>
-    <avue-crud
-      :option="option"
-      :table-loading="loading"
-      :data="data"
-      v-model:page="page"
-      ref="crud"
-      @row-del="rowDel"
-      v-model="form"
-      :permission="permissionList"
-      @row-update="rowUpdate"
-      @row-save="rowSave"
-      :before-open="beforeOpen"
-      @search-change="searchChange"
-      @search-reset="searchReset"
-      @selection-change="selectionChange"
-      @current-change="currentChange"
-      @size-change="sizeChange"
-      @refresh-change="refreshChange"
-      @on-load="onLoad"
-    >
-      <template #menu-left>
-        <el-button
-          type="danger"
-          icon="el-icon-delete"
-          plain
-          v-if="permission.workspace_delete"
-          @click="handleDelete"
-          >删 除
-        </el-button>
-      </template>
-    </avue-crud>
-  </basic-container>
-</template>
-
-<script>
-import { getList, remove, update, add, getDetail } from '@/api/workspace/workspace';
-import { mapGetters } from 'vuex';
-
-export default {
-  data() {
-    return {
-      form: {},
-      query: {},
-      loading: true,
-      page: {
-        pageSize: 10,
-        currentPage: 1,
-        total: 0,
-      },
-      selectionList: [],
-      option: {
-        dialogWidth: 950,
-        tip: false,
-        searchShow: true,
-        searchMenuSpan: 6,
-        border: true,
-        index: true,
-        viewBtn: true,
-        selection: true,
-        excelBtn: true,
-        dialogClickModal: false,
-        grid: false,
-        column: [
-          {
-            label: '项目名称',
-            prop: 'workspace_name',
-            span: 24,
-            row: true,
-            search: true,
-            rules: [
-              {
-                required: true,
-                message: '请输入项目名称',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '项目描述',
-            prop: 'workspace_desc',
-            rules: [
-              {
-                required: true,
-                message: '请输入项目描述',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '平台名称',
-            prop: 'platform_name',
-            rules: [
-              {
-                required: true,
-                message: '请输入平台名称',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '绑定编号',
-            prop: 'bind_code',
-            rules: [
-              {
-                required: true,
-                message: '请输入绑定编号',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '所属部门',
-            prop: 'dept_name',
-            addDisplay:false,
-            editDisplay:false,
-            viewDisplay:false,
-            rules: [
-              {
-                required: true,
-                message: '请输入所属部门',
-                trigger: 'blur',
-              },
-            ],
-          },
-          {
-            label: '所属部门',
-            prop: 'dept_id',
-            hide: true,
-            type: 'tree',
-            defaultExpandAll:true,
-            dicUrl: '/blade-system/dept/getTree',
-            props: {
-              label: 'name',
-              value: 'id',
-            },
-            // dataType: 'number',
-            rules: [
-              {
-                required: true,
-                message: '请输入所属部门',
-                trigger: 'blur',
-              },
-            ],
-          },
-        ],
-      },
-      data: [],
-    };
-  },
-  computed: {
-    ...mapGetters(['permission']),
-    permissionList() {
-      return {
-        addBtn: this.validData(this.permission.workspace_add, true),
-        viewBtn: this.validData(this.permission.workspace_view, true),
-        delBtn: this.validData(this.permission.workspace_delete, true),
-        editBtn: this.validData(this.permission.workspace_edit, true),
-      };
-    },
-    ids() {
-      let ids = [];
-      this.selectionList.forEach(ele => {
-        ids.push(ele.id);
-      });
-      return ids.join(',');
-    },
-  },
-  methods: {
-    rowSave(row, done, loading) {
-      add(row).then(
-        () => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          done();
-        },
-        error => {
-          window.console.log(error);
-          loading();
-        }
-      );
-    },
-    rowUpdate(row, index, done, loading) {
-      update(row).then(
-        () => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          done();
-        },
-        error => {
-          window.console.log(error);
-          loading();
-        }
-      );
-    },
-    rowDel(row) {
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(row.id);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-        });
-    },
-    searchReset() {
-      this.query = {};
-      this.onLoad(this.page);
-    },
-    searchChange(params, done) {
-      this.query = params;
-      this.page.currentPage = 1;
-      this.onLoad(this.page, params);
-      done();
-    },
-    selectionChange(list) {
-      this.selectionList = list;
-    },
-    selectionClear() {
-      this.selectionList = [];
-      this.$refs.crud.toggleSelection();
-    },
-    handleDelete() {
-      if (this.selectionList.length === 0) {
-        this.$message.warning('请选择至少一条数据');
-        return;
-      }
-      this.$confirm('确定将选择数据删除?', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        type: 'warning',
-      })
-        .then(() => {
-          return remove(this.ids);
-        })
-        .then(() => {
-          this.onLoad(this.page);
-          this.$message({
-            type: 'success',
-            message: '操作成功!',
-          });
-          this.$refs.crud.toggleSelection();
-        });
-    },
-    beforeOpen(done, type) {
-      if (['edit', 'view'].includes(type)) {
-        getDetail(this.form.id).then(res => {
-          this.form = res.data.data;
-        });
-      }
-      done();
-    },
-    currentChange(currentPage) {
-      this.page.currentPage = currentPage;
-    },
-    sizeChange(pageSize) {
-      this.page.pageSize = pageSize;
-    },
-    refreshChange() {
-      this.onLoad(this.page, this.query);
-    },
-    onLoad(page, params = {}) {
-      const { releaseTimeRange } = this.query;
-      let values = {
-        ...params,
-        ...this.query,
-      };
-      if (releaseTimeRange) {
-        values = {
-          ...values,
-          releaseTime_datege: releaseTimeRange[0],
-          releaseTime_datelt: releaseTimeRange[1],
-        };
-        values.releaseTimeRange = null;
-      }
-      this.loading = true;
-      getList(page.currentPage, page.pageSize, values).then(res => {
-        const data = res.data.data;
-        this.page.total = data.total;
-        this.data = data.records;
-        this.loading = false;
-        this.selectionClear();
-      });
-    },
-  },
-};
-</script>
-
-<style></style>

--
Gitblit v1.9.3