From a4201c87e9428d230d3778a940c2cbb114efd89a Mon Sep 17 00:00:00 2001
From: chenyao <1219716595@qq.com>
Date: Tue, 27 Jan 2026 08:45:26 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/index.vue | 12
applications/drone-command/public/fonts/font_5099981_va3gbv2bkxo.woff | 0
applications/drone-command/src/styles/common.scss | 1
applications/task-work-order/src/styles/common.scss | 4
applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/index.vue | 6
applications/task-work-order/src/views/orderView/orderDataManage/appInnovation/index.vue | 10
uniapps/work-app/src/pages/map/index.vue | 10
applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/reasonForRejectionDialog.vue | 19
applications/task-work-order/src/assets/images/menuIcon/order-manage.png | 0
pnpm-lock.yaml | 72
applications/task-work-order/src/views/orderView/orderManage/clueEvents/index.vue | 9
applications/task-work-order/public/fonts/font_5099981_va3gbv2bkxo.woff | 0
applications/drone-command/src/components/map-container/device-map-container.vue | 126 +
applications/task-work-order/src/api/zkxt/index.js | 17
applications/drone-command/src/views/dataCockpit/components/LegendBar.vue | 8
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue | 136 ++
applications/task-work-order/env/.env.development | 2
applications/task-work-order/public/fonts/font_5099981_va3gbv2bkxo.ttf | 0
applications/drone-command/src/api/dataCockpit/index.js | 28
applications/task-work-order/src/assets/images/common/n-checkbox.png | 0
applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/FormDiaLog.vue | 11
applications/task-work-order/src/views/orderView/organizational/agenciesManagement/FormDiaLog.vue | 181 +++
applications/task-work-order/src/views/orderView/organizational/agenciesManagement/index.vue | 336 +++++++
applications/task-work-order/src/views/orderView/orderDataManage/evaluate/index.vue | 8
applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/auditRecord.vue | 67
applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue | 8
applications/task-work-order/src/components/map-container/common-cesium-map.vue | 18
applications/task-work-order/src/assets/images/common/checkbox.png | 0
applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue | 152 ++-
applications/drone-command/src/views/dataCockpit/components/templateComponents/RealEquipmentTemplate.vue | 2
applications/task-work-order/src/views/orderView/orderManage/orderManage/RefuseOrderDialog.vue | 2
applications/task-work-order/src/views/orderView/orderManage/clueEvents/DistributeDiaLog.vue | 2
applications/drone-command/src/views/dataCockpit/components/RealWarning.vue | 63 +
applications/task-work-order/src/styles/customFont.scss | 60 +
applications/task-work-order/src/views/orderView/organizationalMessage/agenciesManagement/agenciesApi.js | 66 +
applications/drone-command/src/views/api.txt | 127 +
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue | 18
applications/drone-command/env/.env.development | 4
applications/task-work-order/public/fonts/font_5099981_va3gbv2bkxo.woff2 | 0
applications/task-work-order/src/views/orderView/orderDataManage/appInnovation/FormDiaLog.vue | 4
applications/drone-command/src/components/map-container/device-map-materials.js | 40
applications/drone-command/src/views/detectionCountermeasure/detectionRange/index.vue | 6
applications/task-work-order/src/views/orderView/orderManage/inspectionReport/index.vue | 8
pnpm-workspace.yaml | 4
uniapps/work-app/src/pages/work/index.vue | 26
applications/task-work-order/src/views/orderView/organizational/agenciesManagement/agenciesApi.js | 66 +
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/RefuseOrderDialog1.vue | 2
applications/task-work-order/src/views/orderView/orderDataManage/evaluate/FormDiaLog.vue | 2
applications/task-work-order/src/views/orderView/organizational/zoningManagement/index.vue | 20
applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/FormDiaLog.vue | 2
applications/drone-command/src/styles/customFont.scss | 60 +
applications/task-work-order/src/config/iconList.js | 7
applications/drone-command/public/fonts/font_5099981_va3gbv2bkxo.woff2 | 0
applications/task-work-order/src/views/orderView/orderManage/operatingIncome/index.vue | 294 +++--
applications/task-work-order/src/styles/common/cockpit.scss | 391 +++++++
applications/task-work-order/src/views/orderView/orderManage/clueEvents/ViewDiaLog.vue | 80
applications/task-work-order/src/views/orderView/orderManage/orderManage/orderManageApi.js | 2
applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/index.vue | 14
uniapps/work-app/src/api/map.js | 8
applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/ApplyViewDialog.vue | 17
applications/drone-command/src/config/iconList.js | 7
applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue | 22
applications/task-work-order/env/.env | 3
applications/task-work-order/src/styles/tags.scss | 13
applications/mobile-web-view/src/appPages/work/workDetail/mapWork/index.vue | 12
applications/drone-command/public/fonts/font_5099981_va3gbv2bkxo.ttf | 0
applications/drone-command/src/views/basicManage/deviceStock/index.vue | 3
uniapps/work-app/src/store/modules/location.js | 34
applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue | 30
applications/mobile-web-view/src/appComponents/workMap/index.vue | 2
70 files changed, 2,157 insertions(+), 607 deletions(-)
diff --git a/applications/drone-command/env/.env.development b/applications/drone-command/env/.env.development
index 585cd95..82b533b 100644
--- a/applications/drone-command/env/.env.development
+++ b/applications/drone-command/env/.env.development
@@ -2,7 +2,7 @@
# @Author : yuan
# @Date : 2026-01-07 14:58:30
# @LastEditors : yuan
- # @LastEditTime : 2026-01-23 17:51:43
+ # @LastEditTime : 2026-01-26 17:29:11
# @FilePath : \applications\drone-command\env\.env.development
# @Description :
# Copyright 2026 OBKoro1, All Rights Reserved.
@@ -16,7 +16,7 @@
#开发环境代理地址(推荐本地新建文件 .env.development.local 来进行覆盖)
# VITE_APP_URL = https://wrj.shuixiongit.com/api
-VITE_APP_URL= http://192.168.1.33
+VITE_APP_URL= http://192.168.1.204
#新大屏地址
VITE_APP_DASHBOARD_URL = 'https://wrj.shuixiongit.com/command-center-dashboard/'
diff --git a/applications/drone-command/public/fonts/font_5099981_va3gbv2bkxo.ttf b/applications/drone-command/public/fonts/font_5099981_va3gbv2bkxo.ttf
new file mode 100644
index 0000000..8d29e36
--- /dev/null
+++ b/applications/drone-command/public/fonts/font_5099981_va3gbv2bkxo.ttf
Binary files differ
diff --git a/applications/drone-command/public/fonts/font_5099981_va3gbv2bkxo.woff b/applications/drone-command/public/fonts/font_5099981_va3gbv2bkxo.woff
new file mode 100644
index 0000000..042931c
--- /dev/null
+++ b/applications/drone-command/public/fonts/font_5099981_va3gbv2bkxo.woff
Binary files differ
diff --git a/applications/drone-command/public/fonts/font_5099981_va3gbv2bkxo.woff2 b/applications/drone-command/public/fonts/font_5099981_va3gbv2bkxo.woff2
new file mode 100644
index 0000000..b7023c0
--- /dev/null
+++ b/applications/drone-command/public/fonts/font_5099981_va3gbv2bkxo.woff2
Binary files differ
diff --git a/applications/drone-command/src/api/dataCockpit/index.js b/applications/drone-command/src/api/dataCockpit/index.js
index ef20f28..68024bd 100644
--- a/applications/drone-command/src/api/dataCockpit/index.js
+++ b/applications/drone-command/src/api/dataCockpit/index.js
@@ -2,7 +2,7 @@
* @Author : yuan
* @Date : 2026-01-09 11:14:04
* @LastEditors : yuan
- * @LastEditTime : 2026-01-09 11:35:14
+ * @LastEditTime : 2026-01-26 19:02:07
* @FilePath : \applications\drone-command\src\api\dataCockpit\index.js
* @Description :
* Copyright 2026 OBKoro1, All Rights Reserved.
@@ -53,11 +53,33 @@
})
}
+// ????
+export const alarmFavoriteSaveApi = (data) => {
+ return request({
+ url: '/drone-fw/record/fwAlarmFavorite/save',
+ method: 'post',
+ data
+ })
+}
+
+// ??????
+export const alarmFavoriteRemoveApi = (ids) => {
+ const formattedIds = Array.isArray(ids) ? ids.join(',') : ids
+ return request({
+ url: '/drone-fw/record/fwAlarmFavorite/cancelFavorite',
+ method: 'post',
+ params: {
+ ids: formattedIds
+ }
+ })
+}
+
// 数据驾驶舱地图聚合
-export const cockpitAggregationApi = () => {
+export const cockpitAggregationApi = (params) => {
return request({
url: '/drone-fw/device/fwDevice/statisticalDeviceOut',
- method: 'get'
+ method: 'get',
+ params
})
}
diff --git a/applications/drone-command/src/components/map-container/device-map-container.vue b/applications/drone-command/src/components/map-container/device-map-container.vue
index 723c82f..f5813aa 100644
--- a/applications/drone-command/src/components/map-container/device-map-container.vue
+++ b/applications/drone-command/src/components/map-container/device-map-container.vue
@@ -2,8 +2,9 @@
<div class="map-shell">
<CommonCesiumMap ref="mapRef" class="command-cesium map-container" :dom-id="props.containerId" :active="true"
:flat-mode="false" :terrain="true" :layer-mode="4" :contour="false" :boundary="false"
- :show-admin-boundary="true" :zoom-to-boundary="true" :enable-stage-emit="true" :cluster-height="100000"
- @ready="handleMapReady" @stage-change="handleStageChange" />
+ :show-admin-boundary="true" :zoom-to-boundary="true" :enable-stage-emit="true"
+ :cluster-height="CLUSTER_HEIGHT" :detail-height="DETAIL_HEIGHT" @ready="handleMapReady"
+ @stage-change="handleStageChange" />
<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">
@@ -63,6 +64,9 @@
createRadialGradientMaterial,
getTexturedVertexFormat,
} from './device-map-materials'
+
+const CLUSTER_HEIGHT = 100000
+const DETAIL_HEIGHT = 10000
const props = defineProps({
onlineDevices: {
@@ -157,6 +161,14 @@
const latitude = Number(latitudeRaw)
if (!Number.isFinite(longitude) || !Number.isFinite(latitude)) return null
return { longitude, latitude }
+}
+
+const getDeviceRange = item => {
+ if (!item) return null
+ const rawRange = item.effectiveRangeKm ?? item.range ?? item.coverRadiusM
+ const range = Number(rawRange)
+ if (!Number.isFinite(range) || range <= 0) return null
+ return range
}
const ensureCockpitPrimitiveLayer = () => {
@@ -305,6 +317,20 @@
if (aggregationSource) aggregationSource.show = visible
}
+const setDroneVisibility = visible => {
+ if (droneTrackBillboardCollection) droneTrackBillboardCollection.show = visible
+ if (droneTrackPolylineCollection) droneTrackPolylineCollection.show = visible
+ if (!visible && selectedTargetType.value === 'drone') {
+ closePopup()
+ }
+}
+const getStageByHeight = height => {
+ if (height == null) return 'detail'
+ if (height >= CLUSTER_HEIGHT) return 'cluster'
+ if (height <= DETAIL_HEIGHT) return 'detail'
+ return 'mid'
+}
+
const ensureCountyCenterMap = () => {
if (countyCenterMap.size) return
const geojson = JSON.parse(jaGeojsonRaw)
@@ -316,24 +342,44 @@
})
}
-const buildSimulatedTrackPoints = base => {
- ensureCountyCenterMap()
- const anchor = base || { longitude: 116.397, latitude: 39.908 }
- const offsets = [
- [0, 0, 120],
- [0.02, 0.012, 150],
- [0.04, 0.006, 180],
- [0.06, -0.008, 200],
- [0.03, -0.02, 160],
- [0.0, -0.015, 140],
- [-0.02, -0.005, 120],
- [-0.01, 0.01, 130],
+const buildSimulatedTrackPoints = () => {
+ return [
+ {
+ longitude: 114.963191,
+ latitude: 27.136716,
+ height: 120
+ },
+ {
+ longitude:114.957308,
+ latitude: 27.138452,
+ height: 120
+ },
+ {
+ longitude:114.952,
+ latitude: 27.136317,
+ height: 120
+ },
+ {
+ longitude:114.949293,
+ latitude: 27.133864,
+ height: 120
+ },
+ {
+ longitude:114.944666,
+ latitude: 27.130526,
+ height: 120
+ },
+ {
+ longitude:114.945909,
+ latitude:27.127845,
+ height: 120
+ },
+ {
+ longitude:114.962974,
+ latitude:27.136242,
+ height: 120
+ },
]
- return offsets.map(item => ({
- longitude: anchor.longitude + item[0],
- latitude: anchor.latitude + item[1],
- height: item[2],
- }))
}
@@ -422,13 +468,11 @@
const renderSimulatedDroneTrack = () => {
if (!viewer) return
clearDroneTrackEntities()
- ensureCountyCenterMap()
ensureDroneTrackCollections()
+ droneTrackBillboardCollection.show = detailVisible.value
+ droneTrackPolylineCollection.show = detailVisible.value
droneTrackRuntime = []
- const centers = Array.from(countyCenterMap.entries())
- const baseCenters = centers.length
- ? centers.slice(0, 4)
- : [['默认区域', { longitude: 116.397, latitude: 39.908 }]]
+ const baseCenters = [['默认区域', { longitude:114.958541, latitude: 27.121917 }]]
const segmentDuration = 6
const baseTrackColor = Cesium.Color.fromCssColorString('red')
baseCenters.forEach(([centerName, center], trackIndex) => {
@@ -454,7 +498,7 @@
})
const droneId = `drone-track-${trackIndex}`
const billboard = droneTrackBillboardCollection.add({
- position: positions[0],
+ position: positions[positions.length - 1],
image: droneIcon,
width: 36,
height: 36,
@@ -511,7 +555,8 @@
const position = getDevicePosition(item)
if (!position) return
const entityId = `online-device-${item.id ?? index}-${index}`
- addDeviceRings(position, ringFillInstancesByStyle, ringOutlineInstancesByStyle)
+ const rangeMeters = getDeviceRange(item)
+ addDeviceRings(position, ringFillInstancesByStyle, ringOutlineInstancesByStyle, rangeMeters)
const billboard = deviceBillboardCollection.add({
position: Cesium.Cartesian3.fromDegrees(position.longitude, position.latitude, 0),
image: equipmentIcon,
@@ -528,9 +573,20 @@
ringFillInstancesByStyle.forEach((instances, index) => {
if (!instances.length) return
const ring = RING_STYLES[index]
+ const alpha = ring.alpha ?? 0.64
+ const innerRatio =
+ typeof ring.innerRatio === 'number'
+ ? ring.innerRatio
+ : ring.inner && ring.outer
+ ? Math.min(Math.max(ring.inner / ring.outer, 0), 0.9)
+ : 0
const material = createRadialGradientMaterial(
- Cesium.Color.fromCssColorString(ring.gradient[0]).withAlpha(0.64),
- Cesium.Color.fromCssColorString(ring.gradient[1]).withAlpha(0.64)
+ Cesium.Color.fromCssColorString(ring.gradient[0]).withAlpha(alpha),
+ Cesium.Color.fromCssColorString(ring.gradient[1]).withAlpha(alpha),
+ {
+ gamma: 1.7,
+ innerCutoff: innerRatio,
+ }
)
const primitive = new Cesium.GroundPrimitive({
geometryInstances: instances,
@@ -629,7 +685,7 @@
const renderDefenseZones = zones => {
if (!viewer) return
clearDefenseZoneEntities()
- const result = buildZonePrimitives(zones, '#19D266', '#2AEDBF', '#012B11')
+ const result = buildZonePrimitives(zones, '#72F3FF', '#72F3FF', '#0A7C88')
defenseZonePrimitive = result.primitive
defenseZoneOutlinePrimitive = result.outlinePrimitive
if (defenseZonePrimitive) defenseZonePrimitive.show = detailVisible.value
@@ -640,7 +696,7 @@
const renderPartitions = zones => {
if (!viewer) return
clearPartitionEntities()
- const result = buildZonePrimitives(zones, '#FFCD2A', '#FFC609', '#583300')
+ const result = buildZonePrimitives(zones, '#FFD772', '#FFD772', '#A86B00')
partitionPrimitive = result.primitive
partitionOutlinePrimitive = result.outlinePrimitive
if (partitionPrimitive) partitionPrimitive.show = detailVisible.value
@@ -693,7 +749,7 @@
width: 66.73,
height: 43,
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
- heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+ // disableDepthTestDistance: Number.POSITIVE_INFINITY,
},
label: {
text: `${count}`,
@@ -706,7 +762,6 @@
pixelOffset: new Cesium.Cartesian2(0, -35),
disableDepthTestDistance: Number.POSITIVE_INFINITY,
- heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
},
})
})
@@ -812,7 +867,9 @@
const loadAggregation = async () => {
try {
- const res = await cockpitAggregationApi()
+ const res = await cockpitAggregationApi({
+ effectiveRangeKmIsNotNull: 1
+ })
renderAggregation(res?.data?.data ?? [])
} catch (error) {
renderAggregation([])
@@ -853,13 +910,14 @@
const showCluster = stage === 'cluster'
setClusterVisibility(showCluster)
setDetailVisibility(!showCluster)
+ setDroneVisibility(!showCluster)
}
const handleMapReady = ({ viewer: mapViewer }) => {
viewer = mapViewer
ensureCockpitPrimitiveLayer()
const height = viewer?.camera?.positionCartographic?.height
- const stage = height != null && height >= 100000 ? 'cluster' : 'detail'
+ const stage = getStageByHeight(height)
updateStageDisplay(stage)
renderDeviceEntities(props.onlineDevices)
loadDefenseZones()
diff --git a/applications/drone-command/src/components/map-container/device-map-materials.js b/applications/drone-command/src/components/map-container/device-map-materials.js
index bf2edc8..6177bb7 100644
--- a/applications/drone-command/src/components/map-container/device-map-materials.js
+++ b/applications/drone-command/src/components/map-container/device-map-materials.js
@@ -1,6 +1,15 @@
import * as Cesium from 'cesium'
-export const RING_STYLES = [{ inner: 0, outer: 2000, gradient: ['#FF361C', '#360B00'] }]
+export const RING_STYLES = [
+ {
+ inner: 0,
+ outer: 2000,
+ gradient: ['#FF6A57', '#A11806'],
+ alpha: 0.42,
+ outlineAlpha: 0.85,
+ innerRatio: 0.12,
+ },
+]
export const MATERIAL_TYPE = 'RadialGradientMaterial'
export const DRONE_TRACK_MATERIAL_TYPE = 'DroneTrackFlowMaterial'
@@ -26,15 +35,25 @@
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),
+ gamma: 1.7,
+ innerCutoff: 0.0,
},
source: `
+ uniform vec4 color1;
+ uniform vec4 color2;
+ uniform float gamma;
+ uniform float innerCutoff;
+
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);
+ float ramp = smoothstep(innerCutoff, 1.0, t);
+ float shaped = pow(t, gamma);
+ float alpha = color.a * ramp * shaped;
material.diffuse = color.rgb;
- material.alpha = color.a;
+ material.alpha = alpha;
return material;
}
`,
@@ -82,9 +101,9 @@
})
}
-export const createRadialGradientMaterial = (color1, color2) => {
+export const createRadialGradientMaterial = (color1, color2, options = {}) => {
registerRadialGradientMaterial()
- return Cesium.Material.fromType(MATERIAL_TYPE, { color1, color2 })
+ return Cesium.Material.fromType(MATERIAL_TYPE, { color1, color2, ...(options || {}) })
}
export const createDroneTrackMaterial = options => {
@@ -115,18 +134,19 @@
return positions
}
-export const addDeviceRings = (center, ringFillInstancesByStyle, ringOutlineInstancesByStyle) => {
+export const addDeviceRings = (center, ringFillInstancesByStyle, ringOutlineInstancesByStyle, rangeMeters) => {
if (!ringFillInstancesByStyle) return
const centerPosition = Cesium.Cartesian3.fromDegrees(center.longitude, center.latitude, 0)
const vertexFormat = getTexturedVertexFormat()
RING_STYLES.forEach((ring, index) => {
if (!ringFillInstancesByStyle[index]) return
+ const outer = Number.isFinite(rangeMeters) && rangeMeters > 0 ? rangeMeters : ring.outer
ringFillInstancesByStyle[index].push(
new Cesium.GeometryInstance({
geometry: new Cesium.EllipseGeometry({
center: centerPosition,
- semiMajorAxis: ring.outer,
- semiMinorAxis: ring.outer,
+ semiMajorAxis: outer,
+ semiMinorAxis: outer,
vertexFormat,
}),
})
@@ -135,7 +155,9 @@
if (!ringOutlineInstancesByStyle) return
RING_STYLES.forEach((ring, index) => {
if (!ringOutlineInstancesByStyle[index]) return
- const positions = buildCirclePositions(center, ring.outer)
+ const outer = Number.isFinite(rangeMeters) && rangeMeters > 0 ? rangeMeters : ring.outer
+ const positions = buildCirclePositions(center, outer)
+ const outlineAlpha = typeof ring.outlineAlpha === 'number' ? ring.outlineAlpha : 0.8
ringOutlineInstancesByStyle[index].push(
new Cesium.GeometryInstance({
geometry: new Cesium.GroundPolylineGeometry({
@@ -144,7 +166,7 @@
}),
attributes: {
color: Cesium.ColorGeometryInstanceAttribute.fromColor(
- Cesium.Color.fromCssColorString(ring.gradient[0]).withAlpha(0.8)
+ Cesium.Color.fromCssColorString(ring.gradient[0]).withAlpha(outlineAlpha)
),
},
})
diff --git a/applications/drone-command/src/config/iconList.js b/applications/drone-command/src/config/iconList.js
index 38e50cb..65f400f 100644
--- a/applications/drone-command/src/config/iconList.js
+++ b/applications/drone-command/src/config/iconList.js
@@ -113,6 +113,13 @@
'iconfont icon-msnui-360',
'iconfont icon-iframe',
'iconfont icon-huanyingye',
+ 'iconfont_com icon-a-1',
+ 'iconfont_com icon-a-4',
+ 'iconfont_com icon-a-3',
+ 'iconfont_com icon-a-2',
+ 'iconfont_com icon-a-6',
+ 'iconfont_com icon-a-5',
+ 'iconfont_com icon-Frame',
],
},
];
diff --git a/applications/drone-command/src/styles/common.scss b/applications/drone-command/src/styles/common.scss
index ff83617..1cadaa7 100644
--- a/applications/drone-command/src/styles/common.scss
+++ b/applications/drone-command/src/styles/common.scss
@@ -9,6 +9,7 @@
@import './mapEdit.scss';
@import './common/cockpit.scss';
+@import './customFont.scss';
a {
text-decoration: none;
diff --git a/applications/drone-command/src/styles/customFont.scss b/applications/drone-command/src/styles/customFont.scss
new file mode 100644
index 0000000..522fc05
--- /dev/null
+++ b/applications/drone-command/src/styles/customFont.scss
@@ -0,0 +1,60 @@
+@font-face {
+ font-family: "iconfont_com";
+ /* Project id 5099981 */
+ src: url('//at.alicdn.com/t/c/font_5099981_ysrl5v42ycd.woff2?t=1769414361186') format('woff2'),
+ url('//at.alicdn.com/t/c/font_5099981_ysrl5v42ycd.woff?t=1769414361186') format('woff'),
+ url('//at.alicdn.com/t/c/font_5099981_ysrl5v42ycd.ttf?t=1769414361186') format('truetype'),
+ url('//at.alicdn.com/t/c/font_5099981_ysrl5v42ycd.svg?t=1769414361186#iconfont') format('svg');
+}
+
+.iconfont_com {
+ font-family: "iconfont_com" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-a-1:before {
+ content: "\e609";
+ }
+
+.icon-a-4:before {
+ content: "\e604";
+}
+
+.icon-a-3:before {
+ content: "\e605";
+}
+
+.icon-a-2:before {
+ content: "\e606";
+}
+
+.icon-a-6:before {
+ content: "\e607";
+}
+
+.icon-a-5:before {
+ content: "\e608";
+}
+
+.icon-Frame:before {
+ content: "\e602";
+}
+
+.icon-a-:before {
+ content: "\e601";
+}
+
+.icon-MenuIcon-biaozhunshujutuisong-heise:before {
+ content: "\e611";
+}
+
+.icon-MenuIcon-xuncharenwujiankong-heise:before {
+ content: "\e614";
+}
+
+.icon-MenuIcon-shebeirizhi-heise:before {
+ content: "\e615";
+}
\ No newline at end of file
diff --git a/applications/drone-command/src/views/api.txt b/applications/drone-command/src/views/api.txt
index a385ddf..22ac09a 100644
--- a/applications/drone-command/src/views/api.txt
+++ b/applications/drone-command/src/views/api.txt
@@ -1,22 +1,32 @@
-## 分页
+## 重点关注
-**接口地址**:`/blade-log/log/operationLog/page`
+**接口地址**:`/drone-fw/record/fwAlarmFavorite/save`
-**请求方式**:`GET`
+**请求方式**:`POST`
-**请求数据类型**:`application/x-www-form-urlencoded`
+**请求数据类型**:`application/json`
**响应数据类型**:`*/*`
-**接口描述**:<p>分页</p>
+**接口描述**:<p>传入fwAlarmFavorite</p>
+
+
+**请求示例**:
+
+
+```javascript
+{
+ "alarmRecordId": 0
+}
+```
**请求参数**:
@@ -27,12 +37,8 @@
| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
| -------- | -------- | ----- | -------- | -------- | ------ |
-|createBy|操作人|query|false|string||
-|current|当前页|query|false|integer(int32)||
-|endTime|结束时间|query|false|string||
-|size|每页的数量|query|false|integer(int32)||
-|startTime|开始时间|query|false|string||
-|title|日志类型(0菜单/1按钮)|query|false|string||
+|fwAlarmFavorite|告警记录关注表|body|true|FwAlarmFavorite对象|FwAlarmFavorite对象|
+|  alarmRecordId|告警记录id||false|integer(int64)||
**响应状态**:
@@ -40,7 +46,8 @@
| 状态码 | 说明 | schema |
| -------- | -------- | ----- |
-|200|OK|R«IPage«OperationLogVO»»|
+|200|OK|R|
+|201|Created||
|401|Unauthorized||
|403|Forbidden||
|404|Not Found||
@@ -52,18 +59,7 @@
| 参数名称 | 参数说明 | 类型 | schema |
| -------- | -------- | ----- |----- |
|code|状态码|integer(int32)|integer(int32)|
-|data|承载数据|IPage«OperationLogVO»|IPage«OperationLogVO»|
-|  current||integer(int64)||
-|  pages||integer(int64)||
-|  records||array|OperationLogVO|
-|    createBy|操作人|string||
-|    remoteIp|客户端IP|string||
-|    requestUri|请求地址|string||
-|    title|日志标题|string||
-|    type|日志类型(0菜单/1按钮)|string||
-|    userAgent|客户端|string||
-|  size||integer(int64)||
-|  total||integer(int64)||
+|data|承载数据|object||
|msg|返回消息|string||
|success|是否成功|boolean||
@@ -72,22 +68,73 @@
```javascript
{
"code": 0,
- "data": {
- "current": 0,
- "pages": 0,
- "records": [
- {
- "createBy": "",
- "remoteIp": "",
- "requestUri": "",
- "title": "",
- "type": "",
- "userAgent": ""
- }
- ],
- "size": 0,
- "total": 0
- },
+ "data": {},
+ "msg": "",
+ "success": true
+}
+```
+
+
+
+
+## 取消关注
+
+
+**接口地址**:`/drone-fw/record/fwAlarmFavorite/remove`
+
+
+**请求方式**:`POST`
+
+
+**请求数据类型**:`application/json`
+
+
+**响应数据类型**:`*/*`
+
+
+**接口描述**:<p>传入ids</p>
+
+
+
+**请求参数**:
+
+
+**请求参数**:
+
+
+| 参数名称 | 参数说明 | 请求类型 | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|ids|主键集合|query|true|string||
+
+
+**响应状态**:
+
+
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- |
+|200|OK|R|
+|201|Created||
+|401|Unauthorized||
+|403|Forbidden||
+|404|Not Found||
+
+
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- |
+|code|状态码|integer(int32)|integer(int32)|
+|data|承载数据|object||
+|msg|返回消息|string||
+|success|是否成功|boolean||
+
+
+**响应示例**:
+```javascript
+{
+ "code": 0,
+ "data": {},
"msg": "",
"success": true
}
diff --git a/applications/drone-command/src/views/basicManage/deviceStock/index.vue b/applications/drone-command/src/views/basicManage/deviceStock/index.vue
index 4933b82..e635bdd 100644
--- a/applications/drone-command/src/views/basicManage/deviceStock/index.vue
+++ b/applications/drone-command/src/views/basicManage/deviceStock/index.vue
@@ -62,7 +62,6 @@
<div class="command-table-container" v-loading="loading" element-loading-background="rgba(5, 5, 15, 0.6)">
<div class="command-table-content command-table-content-bg">
<el-table class="command-table" :data="list" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="46" />
<el-table-column type="index" show-overflow-tooltip width="64" label="序号" />
<el-table-column prop="deviceName" show-overflow-tooltip width="130" label="设备名称" />
<el-table-column prop="deviceType" show-overflow-tooltip width="130" label="设备类型">
@@ -80,7 +79,7 @@
</el-table-column>
<el-table-column prop="source" show-overflow-tooltip width="112" label="来源" />
<el-table-column prop="purpose" show-overflow-tooltip width="206" label="用途" />
- <el-table-column prop="belongDeptName" show-overflow-tooltip width="124" label="所属部门" />
+ <el-table-column prop="belongDeptName" show-overflow-tooltip label="所属部门" />
<el-table-column prop="charger" show-overflow-tooltip width="100" label="负责人" />
<el-table-column prop="yxzt" show-overflow-tooltip width="116" label="运行状态">
<template v-slot="{ row }">
diff --git a/applications/drone-command/src/views/dataCockpit/components/LegendBar.vue b/applications/drone-command/src/views/dataCockpit/components/LegendBar.vue
index d115225..52535aa 100644
--- a/applications/drone-command/src/views/dataCockpit/components/LegendBar.vue
+++ b/applications/drone-command/src/views/dataCockpit/components/LegendBar.vue
@@ -85,13 +85,13 @@
}
.legend-color.defense {
- background: radial-gradient(50% 50% at 50% 50%, #2aedbf 0%, #012b11 100%);
- border: 1px solid #19d266;
+ background: radial-gradient(50% 50% at 50% 50%, rgba(114, 243, 255, 0.45) 0%, rgba(10, 124, 136, 0.55) 100%);
+ border: 1px solid rgba(114, 243, 255, 0.85);
}
.legend-color.partition {
- background: radial-gradient(50% 50% at 50% 50%, #ffc609 0%, #583300 100%);
- border: 1px solid #ffcd2a;
+ background: radial-gradient(50% 50% at 50% 50%, rgba(255, 215, 114, 0.5) 0%, rgba(168, 107, 0, 0.6) 100%);
+ border: 1px solid rgba(255, 215, 114, 0.9);
}
.legend-icon {
diff --git a/applications/drone-command/src/views/dataCockpit/components/RealWarning.vue b/applications/drone-command/src/views/dataCockpit/components/RealWarning.vue
index e40f246..132e7a2 100644
--- a/applications/drone-command/src/views/dataCockpit/components/RealWarning.vue
+++ b/applications/drone-command/src/views/dataCockpit/components/RealWarning.vue
@@ -2,7 +2,7 @@
* @Author : yuan
* @Date : 2026-01-08 09:29:07
* @LastEditors : yuan
- * @LastEditTime : 2026-01-19 11:31:09
+ * @LastEditTime : 2026-01-26 09:59:52
* @FilePath : \applications\drone-command\src\views\dataCockpit\components\RealWarning.vue
* @Description :
* Copyright 2026 OBKoro1, All Rights Reserved.
@@ -24,7 +24,7 @@
:data="item"
@signal="() => handleAction('signal', item)"
@counter="() => handleAction('counter', item)"
- @favorite="() => console.log('收藏', item.id)"
+ @favorite="() => handleFavorite(item)"
/>
</div>
</div>
@@ -32,7 +32,12 @@
<script setup>
import RealTemplate from './templateComponents/RealTemplate.vue'
-import { alarmLogApi, interferenceAndExpulsionApi } from '@/api/dataCockpit'
+import {
+ alarmLogApi,
+ alarmFavoriteRemoveApi,
+ alarmFavoriteSaveApi,
+ interferenceAndExpulsionApi
+} from '@/api/dataCockpit'
import { onMounted, ref } from 'vue'
import EmptyState from './EmptyState.vue'
import { ElMessage } from 'element-plus'
@@ -46,9 +51,23 @@
counter: '诱导驱离'
}
+
+const getAlarmRecordId = (item) => item?.alarmRecordId ?? item?.id
+const getFavoriteId = (item) =>
+ item?.favoriteId ??
+ item?.alarmFavoriteId ??
+ item?.fwAlarmFavoriteId ??
+ item?.favoriteRecordId ??
+ getAlarmRecordId(item)
+
+const isFavorited = (item) => {
+ const value = item?.favorited ?? item?.isFavorite
+ return value === 1 || value === '1' || value === true
+}
+
const buildPayload = (type, item) => ({
counterWay: type === 'signal' ? 1 : type === 'counter' ? 2 : '',
- alarmRecordId: item?.alarmRecordId ?? item?.id
+ alarmRecordId: getAlarmRecordId(item)
})
const handleAction = async (type, item) => {
@@ -56,13 +75,36 @@
try {
const res = await interferenceAndExpulsionApi(buildPayload(type, item))
if (res?.data?.success) {
- ElMessage({ type: 'success', message: `${actionText}成功` })
+ ElMessage({ type: 'success', message: actionText + '成功' })
await fetchRealWarning()
} else {
- ElMessage({ type: 'error', message: res?.data?.msg || `${actionText}失败` })
+ ElMessage({ type: 'error', message: res?.data?.msg || actionText + '失败' })
}
} catch (error) {
- ElMessage({ type: 'error', message: `${actionText}失败` })
+ ElMessage({ type: 'error', message: actionText + '失败' })
+ }
+}
+
+const handleFavorite = async (item) => {
+ const alarmRecordId = getAlarmRecordId(item)
+ if (!alarmRecordId) {
+ ElMessage({ type: 'warning', message: '缺少告警记录ID' })
+ return
+ }
+ const isFavorite = isFavorited(item)
+ const actionText = isFavorite ? '取消关注' : '关注'
+ try {
+ const res = isFavorite
+ ? await alarmFavoriteRemoveApi(getFavoriteId(item))
+ : await alarmFavoriteSaveApi({ alarmRecordId })
+ if (res?.data?.success) {
+ ElMessage({ type: 'success', message: actionText + '成功' })
+ await fetchRealWarning()
+ } else {
+ ElMessage({ type: 'error', message: res?.data?.msg || actionText + '失败' })
+ }
+ } catch (error) {
+ ElMessage({ type: 'error', message: actionText + '失败' })
}
}
@@ -73,7 +115,12 @@
const params = { current: 1, size: 20, alarmType: '1' }
const res = await alarmLogApi(params)
const records = res?.data?.data?.records ?? []
- realWarningData.value = records
+ realWarningData.value = records.map((record) => ({
+ ...record,
+ isFavorite:
+ record?.isFavorite ??
+ (record?.favorited === 1 || record?.favorited === '1')
+ }))
} finally {
const elapsed = Date.now() - startAt
if (elapsed < minLoadingMs) {
diff --git a/applications/drone-command/src/views/dataCockpit/components/templateComponents/RealEquipmentTemplate.vue b/applications/drone-command/src/views/dataCockpit/components/templateComponents/RealEquipmentTemplate.vue
index 12f9ae5..0315403 100644
--- a/applications/drone-command/src/views/dataCockpit/components/templateComponents/RealEquipmentTemplate.vue
+++ b/applications/drone-command/src/views/dataCockpit/components/templateComponents/RealEquipmentTemplate.vue
@@ -67,7 +67,7 @@
</div>
<div class="col">
<span class="label">有效范围</span>
- {{ data.effectiveRangeKm }}KM
+ {{ Number(data.effectiveRangeKm).toFixed(0) }}m
</div>
</div>
</div>
diff --git a/applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue b/applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue
index 79a1287..a939219 100644
--- a/applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue
+++ b/applications/drone-command/src/views/detectionCountermeasure/detectionRange/DetectionRangeDialog.vue
@@ -122,7 +122,8 @@
class="command-input"
v-model="formData.effectiveRangeKm"
:min="0"
- :precision="2"
+ :precision="0"
+ :step="1"
:controls="false"
placeholder="请输入"
/>
@@ -227,7 +228,14 @@
function formatRange(value) {
if (value == null || value === '') return '-'
- return `${value}`
+ const normalized = normalizeRange(value)
+ return normalized == null ? '-' : `${normalized}`
+}
+
+function normalizeRange(value) {
+ const numeric = Number(value)
+ if (!Number.isFinite(numeric)) return null
+ return Math.trunc(numeric)
}
// 关闭弹框
@@ -242,14 +250,16 @@
submitting.value = true
try {
const {longitude, latitude} = parseDeployLocation(formData.value.deployLocation)
+ const normalizedRange = normalizeRange(formData.value.effectiveRangeKm)
const payload = {
id: formData.value.id || formData.value.deviceId || undefined,
- effectiveRangeKmIsNotNull: formData.value.effectiveRangeKm ? 1 : 2,
- effectiveRangeKm: formData.value.effectiveRangeKm,
+ effectiveRangeKmIsNotNull: normalizedRange != null ? 1 : 2,
+ effectiveRangeKm: normalizedRange,
longitude,
latitude
}
+ formData.value.effectiveRangeKm = normalizedRange
delete payload.deviceId
await detectionRangeSubmitApi(payload)
@@ -280,6 +290,7 @@
current: 1,
size: 200,
effectiveRangeKmIsNotNull: 2,
+ isTrack: 1
})
const records = res?.data?.data?.records ?? []
deviceOptions.value = records.map(item => ({
@@ -432,9 +443,18 @@
watch(
() => formData.value.effectiveRangeKm,
value => {
+ const normalized = normalizeRange(value)
+ if (value != null && normalized == null) {
+ formData.value.effectiveRangeKm = null
+ return
+ }
+ if (value != null && normalized !== value) {
+ formData.value.effectiveRangeKm = normalized
+ return
+ }
const parsed = parseDeployLocation(formData.value.deployLocation)
if (!parsed) return
- updateRangeCircle(parsed.longitude, parsed.latitude, value)
+ updateRangeCircle(parsed.longitude, parsed.latitude, normalized)
}
)
</script>
diff --git a/applications/drone-command/src/views/detectionCountermeasure/detectionRange/index.vue b/applications/drone-command/src/views/detectionCountermeasure/detectionRange/index.vue
index c2bda53..34735d3 100644
--- a/applications/drone-command/src/views/detectionCountermeasure/detectionRange/index.vue
+++ b/applications/drone-command/src/views/detectionCountermeasure/detectionRange/index.vue
@@ -204,8 +204,10 @@
function formatRange(row) {
if (!row) return '-'
- const value = row.effectiveRangeKm ?? row.range
- return value === null || value === undefined || value === '' ? '-' : value
+
+ let value = row.effectiveRangeKm ?? row.range
+
+ return value === null || value === undefined || value === '' ? '-' : Number(value).toFixed(0)
}
function formatDeviceCode(row) {
diff --git a/applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/index.vue b/applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/index.vue
index ea7f4af..d56f1f3 100644
--- a/applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/index.vue
+++ b/applications/drone-command/src/views/detectionCountermeasure/deviceAppConfig/index.vue
@@ -151,7 +151,10 @@
async function getList() {
loading.value = true
try {
- const res = await fwDevicePageApi(searchParams.value)
+ const res = await fwDevicePageApi({
+ ...searchParams.value,
+ deviceStatusList: '0,1,2'
+ })
list.value = res?.data?.data?.records ?? []
total.value = res?.data?.data?.total ?? 0
} finally {
@@ -176,6 +179,7 @@
function getDictList() {
getDictionaryByCode('deviceType,deviceStatus,deviceAtt').then(res => {
dictObj.value = res.data.data
+ dictObj.value.deviceStatus = dictObj.value.deviceStatus.filter(item => item.dictKey != 3)
})
}
diff --git a/applications/mobile-web-view/src/appComponents/workMap/index.vue b/applications/mobile-web-view/src/appComponents/workMap/index.vue
index 38bfc99..5df7896 100644
--- a/applications/mobile-web-view/src/appComponents/workMap/index.vue
+++ b/applications/mobile-web-view/src/appComponents/workMap/index.vue
@@ -291,7 +291,7 @@
watch(
() => mapCurrentDetail,
newVal => {
-const newDataMap=JSON.parse(newVal)
+const newDataMap=newVal
// 只有 workNavigationShow 为 true 且有经纬度时才添加标记
if (workNavigationShow && newDataMap?.longitude && newDataMap?.latitude) {
addIncidentMarker(newDataMap)
diff --git a/applications/mobile-web-view/src/appPages/work/workDetail/mapWork/index.vue b/applications/mobile-web-view/src/appPages/work/workDetail/mapWork/index.vue
index 1865bf6..b45f3ed 100644
--- a/applications/mobile-web-view/src/appPages/work/workDetail/mapWork/index.vue
+++ b/applications/mobile-web-view/src/appPages/work/workDetail/mapWork/index.vue
@@ -7,31 +7,21 @@
:workNavigationShow="true"
:mapCurrentDetail="mapCurrentDetail"
>
-<!-- <template #eventNav>-->
-<!-- <EventNavigation :mapCurrentDetail="mapCurrentDetail"></EventNavigation>-->
-<!-- </template>-->
</WorkMap>
</div>
</template>
<script setup>
-import { getDeviceRegion } from '@/api/home/aggregation'
import WorkMap from '@/appComponents/workMap/index.vue'
-import EventNavigation from '@/appPages/work/workDetail/mapWork/eventNavigation.vue'
import { useRoute } from 'vue-router'
import { showToast } from 'vant'
-import { getList } from '/src/api/work/index.js'
import { useStore } from 'vuex'
const store = useStore()
const userInfo = computed(() => store?.state?.user?.userInfo)
const route = useRoute()
const mapCurrentDetail = ref({})
-const eventNum = ref('')
-
-
onMounted(async () => {
- eventNum.value = route.query.currentItem
- mapCurrentDetail.value = eventNum.value
+mapCurrentDetail.value = JSON.parse(decodeURIComponent(route.query.currentItem))
})
</script>
diff --git a/applications/task-work-order/env/.env b/applications/task-work-order/env/.env
index 5204ccb..f02486b 100644
--- a/applications/task-work-order/env/.env
+++ b/applications/task-work-order/env/.env
@@ -15,3 +15,6 @@
# 是否在打包时开启压缩,支持 gzip 和 brotli
VITE_BUILD_COMPRESS=gzip
+
+# xt接口地址
+VITE_APP_URL_XT=http://218.202.104.82:8200
diff --git a/applications/task-work-order/env/.env.development b/applications/task-work-order/env/.env.development
index 40d319b..fe1504c 100644
--- a/applications/task-work-order/env/.env.development
+++ b/applications/task-work-order/env/.env.development
@@ -17,7 +17,7 @@
# VITE_APP_URL = https://wrj.shuixiongit.com/api
VITE_APP_URL= http://192.168.1.204
-VITE_APP_URL_XT=http://218.202.104.82:8200
+
#新大屏地址
VITE_APP_DASHBOARD_URL = 'https://wrj.shuixiongit.com/command-center-dashboard/'
diff --git a/applications/task-work-order/public/fonts/font_5099981_va3gbv2bkxo.ttf b/applications/task-work-order/public/fonts/font_5099981_va3gbv2bkxo.ttf
new file mode 100644
index 0000000..8d29e36
--- /dev/null
+++ b/applications/task-work-order/public/fonts/font_5099981_va3gbv2bkxo.ttf
Binary files differ
diff --git a/applications/task-work-order/public/fonts/font_5099981_va3gbv2bkxo.woff b/applications/task-work-order/public/fonts/font_5099981_va3gbv2bkxo.woff
new file mode 100644
index 0000000..042931c
--- /dev/null
+++ b/applications/task-work-order/public/fonts/font_5099981_va3gbv2bkxo.woff
Binary files differ
diff --git a/applications/task-work-order/public/fonts/font_5099981_va3gbv2bkxo.woff2 b/applications/task-work-order/public/fonts/font_5099981_va3gbv2bkxo.woff2
new file mode 100644
index 0000000..b7023c0
--- /dev/null
+++ b/applications/task-work-order/public/fonts/font_5099981_va3gbv2bkxo.woff2
Binary files differ
diff --git a/applications/task-work-order/src/api/zkxt/index.js b/applications/task-work-order/src/api/zkxt/index.js
index a68ca10..fb32733 100644
--- a/applications/task-work-order/src/api/zkxt/index.js
+++ b/applications/task-work-order/src/api/zkxt/index.js
@@ -28,4 +28,21 @@
})
}
+// 获取航线列表
+export const airlineListApi = (data) => {
+ return request({
+ url: `/webservice/webservice/airline/queryList`,
+ method: 'post',
+ data: data,
+ })
+}
+
+// 获取航线详情
+export const queryAirById = (id) => {
+ return request({
+ url: `/webservice/webservice/airline/queryById/${id}`,
+ method: 'get',
+ })
+}
+
diff --git a/applications/task-work-order/src/assets/images/common/checkbox.png b/applications/task-work-order/src/assets/images/common/checkbox.png
new file mode 100644
index 0000000..7786e87
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/common/checkbox.png
Binary files differ
diff --git a/applications/task-work-order/src/assets/images/common/n-checkbox.png b/applications/task-work-order/src/assets/images/common/n-checkbox.png
new file mode 100644
index 0000000..b002276
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/common/n-checkbox.png
Binary files differ
diff --git a/applications/task-work-order/src/assets/images/menuIcon/order-manage.png b/applications/task-work-order/src/assets/images/menuIcon/order-manage.png
new file mode 100644
index 0000000..6d85589
--- /dev/null
+++ b/applications/task-work-order/src/assets/images/menuIcon/order-manage.png
Binary files differ
diff --git a/applications/task-work-order/src/components/map-container/common-cesium-map.vue b/applications/task-work-order/src/components/map-container/common-cesium-map.vue
index f7773f7..47d6ad1 100644
--- a/applications/task-work-order/src/components/map-container/common-cesium-map.vue
+++ b/applications/task-work-order/src/components/map-container/common-cesium-map.vue
@@ -66,6 +66,22 @@
let initialized = false
let removeCameraListener = null
+
+const preventDefault = event => {
+ event.preventDefault()
+ return
+}
+
+const cesiumContextMenu = (isAdd = true) => {
+ let cesium = document.getElementById(mapId)
+ if (!cesium) return
+ if (isAdd) {
+ cesium.addEventListener('contextmenu', preventDefault)
+ } else {
+ cesium.removeEventListener('contextmenu', preventDefault)
+ }
+}
+
const initMap = async () => {
if (initialized) return
initialized = true
@@ -77,6 +93,7 @@
boundary: props.boundary,
contour: props.contour,
})
+ cesiumContextMenu(true)
viewer.value = viewInstance.value.getViewer()
if (props.showAdminBoundary) {
adminBoundarySources = await loadJaAdminBoundary(viewer.value, {
@@ -118,6 +135,7 @@
if (removeCameraListener) removeCameraListener()
removeJaAdminBoundary(viewer.value, adminBoundarySources)
viewInstance.value?.viewerDestroy?.()
+ cesiumContextMenu(false)
})
const getMap = () => ({ viewer: viewer.value, publicCesium: viewInstance.value })
diff --git a/applications/task-work-order/src/config/iconList.js b/applications/task-work-order/src/config/iconList.js
index 38e50cb..65f400f 100644
--- a/applications/task-work-order/src/config/iconList.js
+++ b/applications/task-work-order/src/config/iconList.js
@@ -113,6 +113,13 @@
'iconfont icon-msnui-360',
'iconfont icon-iframe',
'iconfont icon-huanyingye',
+ 'iconfont_com icon-a-1',
+ 'iconfont_com icon-a-4',
+ 'iconfont_com icon-a-3',
+ 'iconfont_com icon-a-2',
+ 'iconfont_com icon-a-6',
+ 'iconfont_com icon-a-5',
+ 'iconfont_com icon-Frame',
],
},
];
diff --git a/applications/task-work-order/src/styles/common.scss b/applications/task-work-order/src/styles/common.scss
index d256339..d1cea41 100644
--- a/applications/task-work-order/src/styles/common.scss
+++ b/applications/task-work-order/src/styles/common.scss
@@ -9,6 +9,7 @@
@import './mapEdit.scss';
@import './common/cockpit.scss';
+@import './customFont.scss';
a {
text-decoration: none;
@@ -17,6 +18,7 @@
* {
outline: none;
+ box-sizing: border-box;
}
.avue-sidebar,
@@ -107,6 +109,7 @@
height: 100%;
box-sizing: border-box;
background: url('@/assets/images/layoutBg.png') repeat;
+ background-position: 0 -20px;
.layer-content-bottom {
width: 100%;
@@ -270,6 +273,7 @@
}
.gd-cesium {
+ position: relative;
.cesium-viewer {
height: 100%;
overflow: hidden;
diff --git a/applications/task-work-order/src/styles/common/cockpit.scss b/applications/task-work-order/src/styles/common/cockpit.scss
index bdd93cd..e84887a 100644
--- a/applications/task-work-order/src/styles/common/cockpit.scss
+++ b/applications/task-work-order/src/styles/common/cockpit.scss
@@ -4,6 +4,12 @@
$form-bg-gray: #DDE2ED;
$form-tips-gray: #A1A3D4;
+$search-item-icon-color: #383874;
+$search-item-symbol-color: #383874;
+
+$search-item-symbol-bg: #fff;
+$search-item-symbol-txt: #4E5969;
+
.gd-input {
--bg: #{$form-bg};
--tips: #{$form-tips};
@@ -13,12 +19,15 @@
--tips: #{$form-tips-gray};
}
- .el-input__wrapper, .el-textarea__inner {
+ .el-input__wrapper,
+ .el-textarea__inner {
box-shadow: none !important;
background: var(--bg);
border: none;
}
- .el-input__inner, .el-textarea__inner {
+
+ .el-input__inner,
+ .el-textarea__inner {
&::placeholder {
color: var(--tips);
}
@@ -31,7 +40,19 @@
}
}
-.gd-select, {
+.gd-button-main {
+ --el-button-bg-color: #4C34FF;
+ --el-button-text-color: #ffffff;
+ --el-button-border-color: #4C34FF;
+ --el-button-hover-bg-color: rgb(130, 113, 255);
+ --el-button-hover-text-color: #ffffff;
+ --el-button-hover-border-color: rgb(130, 113, 255);
+ --el-button-active-bg-color: rgb(65, 46, 208);
+ --el-button-active-border-color: rgb(65, 46, 208);
+ color: #ffffff;
+}
+
+.gd-select {
--bg: #{$form-bg};
--tips: #{$form-tips};
@@ -45,6 +66,13 @@
background: var(--bg);
box-shadow: none !important;
border: none;
+
+
+ .el-select__suffix {
+ .el-icon {
+ color: $search-item-icon-color;
+ }
+ }
}
.el-select__placeholder {
@@ -65,6 +93,14 @@
&.gray {
--bg: #{$form-bg-gray};
--tips: #{$form-tips-gray};
+ }
+
+ .el-icon {
+ color: $search-item-icon-color;
+ }
+
+ .el-range-separator {
+ color: $search-item-symbol-color !important;
}
box-shadow: none !important;
@@ -114,7 +150,7 @@
background: none !important;
}
- .el-tree-node.is-current > .el-tree-node__content {
+ .el-tree-node.is-current>.el-tree-node__content {
color: #479dff !important;
}
}
@@ -172,26 +208,26 @@
}
.gd-date-picker-popper {
- background: #DDE2ED !important;
+ background: #fff !important;
border: none !important;
border-radius: 0px 0px 8px 8px;
.el-date-picker__prev-btn,
.el-date-picker__next-btn {
.el-icon {
- color: #fff !important;
+ color: #4E5969 !important;
}
}
.el-date-picker__header-label {
- color: #fff !important;
+ color: #4E5969 !important;
}
.el-picker-panel {
.el-picker-panel__body-wrapper {
.el-picker-panel__body {
- background: #DDE2ED !important;
- color: #fff !important;
+ background: #fff !important;
+ color: #4E5969 !important;
.el-date-range-picker__time-header {
.el-input__wrapper {
@@ -259,7 +295,7 @@
.el-picker-panel__content {
.el-date-range-picker__header {
.el-picker-panel__icon-btn {
- color: #fff !important;
+ color: #4E5969 !important;
&:hover {
color: var(--el-color-primary) !important;
@@ -272,9 +308,9 @@
}
}
- & > div {
+ &>div {
span {
- color: #fff !important;
+ color: #4E5969 !important;
}
}
}
@@ -299,14 +335,15 @@
td.start-date span,
td.start-date span,
td.end-date span {
- background-color: #DDE2ED !important;
+ color: #fff !important;
+ background-color: #354DFF !important;
}
td.in-range div,
td.in-range div:hover,
&.is-week-mode .el-date-table__row.current div,
&.is-week-mode .el-date-table__row:hover div {
- background-color: rgba(60, 121, 202) !important;
+ background-color: rgba(71, 126, 255, .1) !important;
}
}
}
@@ -380,12 +417,14 @@
.el-overlay-dialog {
display: flex;
- justify-content: center; /* 水平居中 */
- align-items: center; /* 垂直居中 */
+ justify-content: center;
+ /* 水平居中 */
+ align-items: center;
+ /* 垂直居中 */
}
.gd-dialog {
- padding: 30px;
+ padding: 20px;
display: flex;
flex-direction: column;
background: #FFFFFF;
@@ -394,6 +433,9 @@
max-height: 90vh;
.el-dialog__header {
+ padding-bottom: 20px;
+ position: relative;
+
span {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: bold;
@@ -403,6 +445,13 @@
text-align: left;
font-style: normal;
text-transform: none;
+ }
+
+ &>button {
+ width: auto;
+ height: auto;
+ display: flex;
+ align-items: center;
}
.el-icon {
@@ -420,6 +469,33 @@
font-weight: 400;
font-size: 14px;
color: #161B2C;
+ }
+
+
+ .detail-container {
+ display: flex;
+ justify-content: space-between;
+
+ .detail-left {
+ margin-right: 20px;
+ width: 312px;
+ padding: 24px;
+ border: 1px solid #E4E4E4;
+ }
+
+ .detail-right {
+ &>div {
+ .detail-title {
+ margin: 10px 0;
+ }
+
+ &:first-child {
+ .detail-title {
+ margin-top: 0;
+ }
+ }
+ }
+ }
}
// 查看
@@ -460,6 +536,13 @@
}
}
}
+
+ .el-upload {
+ button {
+ background: #4C34FF;
+ border: none;
+ }
+ }
}
.el-dialog__footer {
@@ -470,15 +553,10 @@
margin-left: 16px;
width: 96px;
height: 36px;
- color: #161B2C;
&:first-child {
margin-left: 0;
}
- }
-
- .save-btn {
- color: #FFFFFF;
}
}
}
@@ -488,15 +566,14 @@
flex: 1;
background: transparent !important;
- .el-table--border .el-table__inner-wrapper:after,
- .el-table--border:after,
- .el-table--border:before,
- .el-table__inner-wrapper:before {
- height: 0;
- }
-
tr {
background: transparent !important;
+ }
+
+ tr.el-table__row {
+ &:hover {
+ background: #F7F8FC !important;
+ }
}
th.el-table__cell {
@@ -534,17 +611,42 @@
td.operation-btns .cell {
display: flex;
flex-wrap: nowrap;
- gap: 12px;
/* 按钮间距(推荐) */
white-space: nowrap;
/* 双保险 */
a {
+ display: flex;
+ align-items: center;
+ position: relative;
+ margin: 0 10px;
min-width: 28px;
- color: #0075FF;
+
+ span {
+ color: #0075FF;
+ }
+
+ &:first-child {
+ margin-left: 0;
+ }
+
+ &::before {
+ content: '';
+ position: absolute;
+ top: 50%;
+ right: -10px;
+ width: 1px;
+ height: 12px;
+ background: #BCC8E3;
+ transform: translateY(calc(-50% - 1px));
+ }
&:last-child {
margin-right: 0;
+
+ &::before {
+ display: none;
+ }
}
}
}
@@ -554,8 +656,53 @@
background: transparent !important;
}
+ .el-checkbox {
+ width: 16px;
+ height: 16px;
+
+ .el-checkbox__input {
+ width: 16px;
+ height: 16px;
+
+ .el-checkbox__inner {
+ width: 16px;
+ height: 16px;
+
+ border: none;
+ background: url("@/assets/images/common/n-checkbox.png") no-repeat center / 100% 100% !important;
+ }
+ }
+
+ &.is-checked {
+ .el-checkbox__input {
+ .el-checkbox__inner {
+ border: none;
+ background: url("@/assets/images/common/checkbox.png") no-repeat center / 100% 100% !important;
+
+ &::after {
+ content: none;
+ }
+ }
+ }
+ }
+ }
+
.fixed-column {
background-color: #1A1A2A !important;
+ }
+}
+
+.el-table {
+
+ .el-table--border .el-table__inner-wrapper:after,
+ .el-table--border:after,
+ .el-table--border:before,
+ .el-table__inner-wrapper:before {
+ height: 0;
+ }
+
+ td.el-table__cell {
+ border: none !important;
}
}
@@ -628,16 +775,16 @@
}
.gd-confirm-custom {
- background: #1A1A2A;
+ background: #fff;
border-radius: 6px;
- border: 1px solid #2E2E46;
+ border: none;
.el-message-box__header {
.el-message-box__title {
font-family: Source Han Sans CN, Source Han Sans CN;
font-weight: bold;
font-size: 18px;
- color: #FFFFFF;
+ color: #383874;
line-height: 22px;
text-align: left;
font-style: normal;
@@ -646,7 +793,7 @@
}
.el-message-box__content {
- color: #D4D5D7;
+ color: #4E5969;
}
.el-message-box__btns {
@@ -666,14 +813,15 @@
}
.gd-confirm-button {
- background: #284FE3 !important;
- border-color: #284FE3 !important;
+ background: #4C34FF !important;
+ border: none !important;
+ color: #fff !important;
}
.gd-confirm-cancel-button {
- background: #2B2B4C !important;
- border-color: #2B2B4C !important;
- color: #FFFFFF !important;
+ background: #F2F3F5 !important;
+ border: none !important;
+ color: #161B2C !important;
}
.gd-search-form {
@@ -790,14 +938,14 @@
.gd-select-popper {
border: none;
- background: $form-bg !important;
+ background: $search-item-symbol-bg !important;
.el-select-dropdown {
.el-scrollbar {
.el-select-dropdown__wrap {
.el-select-dropdown__list {
.el-select-dropdown__item {
- color: #4E5969;
+ color: $search-item-symbol-txt;
&.hover {
background-color: rgba(0, 120, 233, 0.63) !important;
@@ -866,3 +1014,162 @@
}
}
}
+
+.gd-tabs {
+ .el-tabs__header {
+ .el-tabs__item.is-active {
+ color: #3247E5;
+ }
+
+ .el-tabs__active-bar {
+ background: #3247E5;
+ }
+ }
+}
+
+.gd-dialog-table {
+ background: transparent !important;
+
+ tr {
+ background: transparent !important;
+ }
+
+ tr.el-table__row {
+ &:hover {
+ background: #F7F8FC !important;
+ }
+ }
+
+ th.el-table__cell {
+ height: 40px;
+ border-bottom: 1px solid #DBDFF1 !important;
+
+ .cell {
+ padding: 0 0 0 16px;
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: 400;
+ font-size: 14px;
+ color: #9292C1;
+ text-align: left;
+ font-style: normal;
+ text-transform: none;
+ }
+ }
+
+ td.el-table__cell {
+ padding: 9px 0;
+ height: 56px;
+
+ .cell {
+ padding: 0 0 0 16px;
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: 400;
+ font-size: 14px;
+ color: #383874;
+ text-align: left;
+ font-style: normal;
+ text-transform: none;
+ }
+ }
+
+ td.operation-btns .cell {
+ display: flex;
+ flex-wrap: nowrap;
+ /* 按钮间距(推荐) */
+ white-space: nowrap;
+ /* 双保险 */
+
+ a {
+ display: flex;
+ align-items: center;
+ position: relative;
+ margin: 0 10px;
+ min-width: 28px;
+
+ span {
+ color: #0075FF;
+ }
+
+ &:first-child {
+ margin-left: 0;
+ }
+
+ &::before {
+ content: '';
+ position: absolute;
+ top: 50%;
+ right: -10px;
+ width: 1px;
+ height: 12px;
+ background: #BCC8E3;
+ transform: translateY(calc(-50% - 1px));
+ }
+
+ &:last-child {
+ margin-right: 0;
+
+ &::before {
+ display: none;
+ }
+ }
+ }
+ }
+
+ th.el-table__cell:not(.fixed-column),
+ td.el-table__cell:not(.fixed-column) {
+ background: transparent !important;
+ }
+
+ .el-checkbox {
+ width: 16px;
+ height: 16px;
+
+ .el-checkbox__input {
+ width: 16px;
+ height: 16px;
+
+ .el-checkbox__inner {
+ width: 16px;
+ height: 16px;
+
+ border: none;
+ background: url("@/assets/images/common/n-checkbox.png") no-repeat center / 100% 100% !important;
+ }
+ }
+
+ &.is-checked {
+ .el-checkbox__input {
+ .el-checkbox__inner {
+ border: none;
+ background: url("@/assets/images/common/checkbox.png") no-repeat center / 100% 100% !important;
+
+ &::after {
+ content: none;
+ }
+ }
+ }
+ }
+ }
+
+ .fixed-column {
+ background-color: #1A1A2A !important;
+ }
+}
+
+.el-popper {
+ .el-menu--popup-container {
+ .el-menu {
+ .el-menu-item.is-active {
+ &::before {
+ display: none;
+ }
+
+ background: #4C34FF;
+
+ span {
+ color: #fff;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/applications/task-work-order/src/styles/customFont.scss b/applications/task-work-order/src/styles/customFont.scss
new file mode 100644
index 0000000..522fc05
--- /dev/null
+++ b/applications/task-work-order/src/styles/customFont.scss
@@ -0,0 +1,60 @@
+@font-face {
+ font-family: "iconfont_com";
+ /* Project id 5099981 */
+ src: url('//at.alicdn.com/t/c/font_5099981_ysrl5v42ycd.woff2?t=1769414361186') format('woff2'),
+ url('//at.alicdn.com/t/c/font_5099981_ysrl5v42ycd.woff?t=1769414361186') format('woff'),
+ url('//at.alicdn.com/t/c/font_5099981_ysrl5v42ycd.ttf?t=1769414361186') format('truetype'),
+ url('//at.alicdn.com/t/c/font_5099981_ysrl5v42ycd.svg?t=1769414361186#iconfont') format('svg');
+}
+
+.iconfont_com {
+ font-family: "iconfont_com" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-a-1:before {
+ content: "\e609";
+ }
+
+.icon-a-4:before {
+ content: "\e604";
+}
+
+.icon-a-3:before {
+ content: "\e605";
+}
+
+.icon-a-2:before {
+ content: "\e606";
+}
+
+.icon-a-6:before {
+ content: "\e607";
+}
+
+.icon-a-5:before {
+ content: "\e608";
+}
+
+.icon-Frame:before {
+ content: "\e602";
+}
+
+.icon-a-:before {
+ content: "\e601";
+}
+
+.icon-MenuIcon-biaozhunshujutuisong-heise:before {
+ content: "\e611";
+}
+
+.icon-MenuIcon-xuncharenwujiankong-heise:before {
+ content: "\e614";
+}
+
+.icon-MenuIcon-shebeirizhi-heise:before {
+ content: "\e615";
+}
\ No newline at end of file
diff --git a/applications/task-work-order/src/styles/tags.scss b/applications/task-work-order/src/styles/tags.scss
index e47bba3..0495822 100644
--- a/applications/task-work-order/src/styles/tags.scss
+++ b/applications/task-work-order/src/styles/tags.scss
@@ -37,11 +37,20 @@
border-radius: 3px 3px 3px 3px;
+ &:active {
+ color: #FFFFFF !important;
+ background: #5B6BFF !important;
+
+ span {
+ color: #fff !important;
+ }
+ }
+
&.is-active {
//padding: 0 !important;
//padding-left: 20px !important;
- color: #FFFFFF;
- background: #5B6BFF;
+ color: #FFFFFF !important;
+ background: #5B6BFF !important;
.is-icon-close {
//margin: 0 10px;
diff --git a/applications/task-work-order/src/views/orderView/orderDataManage/appInnovation/FormDiaLog.vue b/applications/task-work-order/src/views/orderView/orderDataManage/appInnovation/FormDiaLog.vue
index c933f19..d236c6a 100644
--- a/applications/task-work-order/src/views/orderView/orderDataManage/appInnovation/FormDiaLog.vue
+++ b/applications/task-work-order/src/views/orderView/orderDataManage/appInnovation/FormDiaLog.vue
@@ -98,7 +98,7 @@
<template v-if="!dialogReadonly">
<el-button color="#F2F3F5" @click="visible = false">取消</el-button>
<el-button
- class="save-btn"
+ class=""
color="#4C34FF"
:loading="submitting"
@@ -111,7 +111,7 @@
<template v-if="dialogReadonly && innovationDetailsStatus ==='0'">
<el-button color="#F2F3F5" @click="handleReject">不通过</el-button>
<el-button
- class="save-btn"
+ class=""
color="#4C34FF"
:loading="submitting"
:disabled="submitting"
diff --git a/applications/task-work-order/src/views/orderView/orderDataManage/appInnovation/index.vue b/applications/task-work-order/src/views/orderView/orderDataManage/appInnovation/index.vue
index f01cb6e..36caab1 100644
--- a/applications/task-work-order/src/views/orderView/orderDataManage/appInnovation/index.vue
+++ b/applications/task-work-order/src/views/orderView/orderDataManage/appInnovation/index.vue
@@ -43,7 +43,7 @@
<div class="gd-table-container" v-loading="loading">
<div class="gd-table-content gd-table-content-bg">
<el-table class="gd-table" :data="list" @selection-change="handleSelectionChange">
- <el-table-column label="序号" width="60" align="center">
+ <el-table-column label="序号" width="70" align="center">
<template #default="{ $index }">
{{ formatNumber((searchParams.current - 1) * searchParams.size + $index + 1) }}
</template>
@@ -60,11 +60,11 @@
<el-table-column prop="resourceName" show-overflow-tooltip label="资源名称" />
<el-table-column prop="resourceCode" show-overflow-tooltip label="资源编码" />
<el-table-column prop="caseDesc" show-overflow-tooltip label="案例描述" />
- <el-table-column label="操作" class-name="operation-btns" width="180">
+ <el-table-column label="操作" class-name="operation-btns" width="240">
<template v-slot="{ row }">
- <el-link @click="openForm('view', row)">查看</el-link>
-<!-- <el-link @click="openForm('edit', row)">编辑</el-link>-->
- <el-link @click="handleDelete(row)" v-if="!['1', '2'].includes(row.innovationStatus)">删除</el-link>
+ <el-link type="primary" @click="openForm('view', row)">查看</el-link>
+<!-- <el-link type="primary" @click="openForm('edit', row)">编辑</el-link>-->
+ <el-link type="primary" @click="handleDelete(row)" v-if="!['1', '2'].includes(row.innovationStatus)">删除</el-link>
</template>
</el-table-column>
</el-table>
diff --git a/applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/FormDiaLog.vue b/applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/FormDiaLog.vue
index de830e5..c5d77b1 100644
--- a/applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/FormDiaLog.vue
+++ b/applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/FormDiaLog.vue
@@ -187,13 +187,13 @@
>
保存
</el-button>
- <el-button class="save-btn" color="#4C34FF" :loading="submitting" :disabled="submitting" @click="handleApply">申请</el-button>
+ <el-button class="" color="#4C34FF" :loading="submitting" :disabled="submitting" @click="handleApply">申请</el-button>
</template>
<template v-if="dialogReadonly && detailObjectionStatus === '1'">
<el-button color="#F2F3F5" :loading="submitting" :disabled="submitting" @click="visible = false">取消</el-button>
<el-button
- class="save-btn"
+ class=""
color="#4C34FF"
:loading="submitting"
@@ -204,7 +204,7 @@
反馈
</el-button>
<el-button
- class="save-btn"
+ class=""
color="#4C34FF"
:loading="submitting"
@@ -444,7 +444,7 @@
ElMessage.warning('没有可下载的附件')
return
}
-
+
// 遍历所有附件并下载
attachmentDetailsList.value.forEach(attach => {
if (attach.link) {
@@ -479,9 +479,6 @@
</script>
<style scoped lang="scss">
-.detail-container {
- padding: 20px;
-}
.upload-container {
width: 100%;
}
diff --git a/applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/index.vue b/applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/index.vue
index e32abdf..54902ce 100644
--- a/applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/index.vue
+++ b/applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/index.vue
@@ -43,7 +43,7 @@
<div class="gd-table-container" v-loading="loading">
<div class="gd-table-content gd-table-content-bg">
<el-table class="gd-table" :data="list">
- <el-table-column label="序号" width="60">
+ <el-table-column label="序号" width="70">
<template v-slot="{ $index }">
{{ String($index + 1).padStart(2, '0') }}
</template>
@@ -59,21 +59,21 @@
{{ getDictLabel(row.objectionStatus, dictObj.objectionStatus) }}
</template>
</el-table-column>
- <el-table-column prop="catalogResourceName" width="170" show-overflow-tooltip label="目录/申请资源名称" />
+ <el-table-column prop="catalogResourceName" width="130" show-overflow-tooltip label="目录/申请资源名称" />
<el-table-column prop="otherObjectionDetail" show-overflow-tooltip label="其他异议详情" />
<el-table-column prop="submitter" show-overflow-tooltip label="问题提交人" />
- <el-table-column prop="submitterContact" show-overflow-tooltip width="145" label="提交人联系方式" />
+ <el-table-column prop="submitterContact" show-overflow-tooltip width="120" label="提交人联系方式" />
<el-table-column prop="submitUnitName" show-overflow-tooltip label="提交单位" />
<el-table-column prop="handleUnit" show-overflow-tooltip label="处理单位" />
<el-table-column prop="objectionDesc" show-overflow-tooltip label="异议描述" />
<el-table-column prop="objectionBasis" show-overflow-tooltip label="异议依据" />
<el-table-column prop="attachName" show-overflow-tooltip label="附件名称" />
<el-table-column prop="reviewOpinion" show-overflow-tooltip label="审核意见" />
- <el-table-column label="操作" class-name="operation-btns" width="180">
+ <el-table-column label="操作" class-name="operation-btns" width="240">
<template v-slot="{ row }">
- <el-link @click="openForm('view', row)">查看</el-link>
- <el-link @click="openForm('edit', row)" v-if="!['1', '2'].includes(row.objectionStatus)">编辑</el-link>
- <el-link @click="handleDelete(row)" v-if="!['1', '2'].includes(row.objectionStatus)">删除</el-link>
+ <el-link type="primary" @click="openForm('view', row)">查看</el-link>
+ <el-link type="primary" @click="openForm('edit', row)" v-if="!['1', '2'].includes(row.objectionStatus)">编辑</el-link>
+ <el-link type="primary" @click="handleDelete(row)" v-if="!['1', '2'].includes(row.objectionStatus)">删除</el-link>
</template>
</el-table-column>
</el-table>
diff --git a/applications/task-work-order/src/views/orderView/orderDataManage/evaluate/FormDiaLog.vue b/applications/task-work-order/src/views/orderView/orderDataManage/evaluate/FormDiaLog.vue
index 7be9b7c..84b0373 100644
--- a/applications/task-work-order/src/views/orderView/orderDataManage/evaluate/FormDiaLog.vue
+++ b/applications/task-work-order/src/views/orderView/orderDataManage/evaluate/FormDiaLog.vue
@@ -128,7 +128,7 @@
<template #footer v-if="!dialogReadonly">
<el-button color="#F2F3F5" @click="visible = false">{{ dialogReadonly ? '关闭' : '取消' }}</el-button>
<el-button
- class="save-btn"
+ class=""
color="#4C34FF"
:loading="submitting"
diff --git a/applications/task-work-order/src/views/orderView/orderDataManage/evaluate/index.vue b/applications/task-work-order/src/views/orderView/orderDataManage/evaluate/index.vue
index de01bab..2ab783b 100644
--- a/applications/task-work-order/src/views/orderView/orderDataManage/evaluate/index.vue
+++ b/applications/task-work-order/src/views/orderView/orderDataManage/evaluate/index.vue
@@ -53,11 +53,11 @@
</template>
</el-table-column>
<el-table-column prop="evaluationContent" show-overflow-tooltip label="评价内容" />
- <el-table-column label="操作" class-name="operation-btns" width="180">
+ <el-table-column label="操作" class-name="operation-btns" width="240">
<template v-slot="{ row }">
- <el-link @click="openForm('view', row)">查看</el-link>
- <el-link @click="openForm('edit', row)">编辑</el-link>
- <el-link @click="handleDelete(row)">删除</el-link>
+ <el-link type="primary" @click="openForm('view', row)">查看</el-link>
+ <el-link type="primary" @click="openForm('edit', row)">编辑</el-link>
+ <el-link type="primary" @click="handleDelete(row)">删除</el-link>
</template>
</el-table-column>
</el-table>
diff --git a/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/ApplyViewDialog.vue b/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/ApplyViewDialog.vue
index 4c96dc6..34c28df 100644
--- a/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/ApplyViewDialog.vue
+++ b/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/ApplyViewDialog.vue
@@ -108,13 +108,13 @@
<template #footer>
<template v-if="detailDemandStatus === '1' && !requesterProvider">
<el-button color="#F2F3F5" @click="rejectTheApplication">拒绝申请</el-button>
- <el-button class="save-btn" color="#4C34FF" @click="approvedByTheReview">审核通过</el-button>
+ <el-button class="" color="#4C34FF" @click="approvedByTheReview">审核通过</el-button>
</template>
<template v-if="detailDemandStatus === '2'">
- <el-button class="save-btn" color="#4C34FF" @click="downloadAllFiles">全部下载</el-button>
+ <el-button class="" color="#4C34FF" @click="downloadAllFiles">全部下载</el-button>
</template>
<template v-if="detailDemandStatus === '3'">
- <el-button class="save-btn" color="#4C34FF" @click="visible =false">关闭</el-button>
+ <el-button class="" color="#4C34FF" @click="visible =false">关闭</el-button>
</template>
</template>
</el-dialog>
@@ -419,23 +419,16 @@
</script>
<style scoped lang="scss">
-.detail-container {
- padding: 20px;
- display: flex;
- gap: 30px;
- align-items: stretch;
-}
-
/* 左侧步骤条 */
.detail-left {
- width: 25%;
+ width: 35%;
padding-right: 20px;
border-right: 1px solid #e8e8e8;
}
/* 右侧表单 */
.detail-right {
- width: 75%;
+ width: 65%;
.reject-reason {
margin-bottom: 20px;
background: #f2f3f5;
diff --git a/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/FormDiaLog.vue b/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/FormDiaLog.vue
index 2031353..183d06d 100644
--- a/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/FormDiaLog.vue
+++ b/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/FormDiaLog.vue
@@ -194,7 +194,7 @@
>
保存
</el-button>
- <el-button class="save-btn" color="#4C34FF" :loading="submitting" :disabled="submitting" @click="handleApply">申请</el-button>
+ <el-button color="#4C34FF" :loading="submitting" :disabled="submitting" @click="handleApply">申请</el-button>
</template>
</el-dialog>
diff --git a/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/auditRecord.vue b/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/auditRecord.vue
index 1966e5b..0136cc5 100644
--- a/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/auditRecord.vue
+++ b/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/auditRecord.vue
@@ -1,14 +1,25 @@
<template>
<div class="audit-record-container">
- <div class="label">审批记录</div>
- <el-steps direction="vertical" :active="displayedSteps.length">
- <el-step v-for="step in displayedSteps" :key="step.status" :title="step.title" :description="`${step.person || ''}\n${step.time || ''}`" />
- </el-steps>
+ <el-timeline class="gd-timeline">
+ <el-timeline-item
+ v-for="(step, index) in displayedSteps"
+ :key="step.status"
+ :icon="Check"
+ :type="index === displayedSteps.length - 1 ? 'success' : 'info'"
+ :timestamp="step.time"
+ >
+ <div class="item-content">
+ <div class="flowName">{{ step.title }}</div>
+ <div >{{ step.person }}</div>
+ </div>
+ </el-timeline-item>
+ </el-timeline>
</div>
</template>
<script setup>
import { ref, watch } from 'vue'
+import { Check } from '@element-plus/icons-vue'
import { gdSupplyDemandAuditListApi } from '@/views/orderView/orderDataManage/supplyAdd/supplyAddApi'
const props = defineProps({
@@ -89,32 +100,32 @@
<style scoped lang="scss">
.audit-record-container {
- height: 95%;
- .label {
- font-weight: 500;
- margin-bottom: 8px;
- color: #333;
+width:100%;
+ // height: 95%;
+
+}
+
+/* 时间线样式 */
+:deep(.gd-timeline) {
+ padding-left: 90px;
+}
+
+:deep(.el-timeline-item) {
+ padding-bottom: 20px;
+ .item-content {
+ position: relative;
+ .flowName {
+ width: 80px;
+ position: absolute;
+ left: -120px;
+ top: 0px;
+ }
}
}
-/* 步骤条样式 */
-:deep(.el-steps) {
- align-items: flex-start;
-}
-
-:deep(.el-step) {
- // margin-bottom: 20px;
-}
-
-:deep(.el-step__title) {
- font-size: 14px;
- font-weight: 500;
-}
-
-:deep(.el-step__description) {
- font-size: 13px;
- color: #666;
- white-space: pre-wrap;
- line-height: 1.4;
+:deep(.el-timeline-item__timestamp) {
+ font-size: 12px;
+ color: #999;
+ margin-top: 2px;
}
</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/index.vue b/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/index.vue
index cc0df97..3a4fcf5 100644
--- a/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/index.vue
+++ b/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/index.vue
@@ -42,7 +42,7 @@
<div class="gd-table-container" v-loading="loading">
<div class="gd-table-content gd-table-content-bg">
<el-table class="gd-table" :data="list">
- <el-table-column label="序号" width="60" align="center">
+ <el-table-column label="序号" width="70" align="center">
<template #default="scope">
{{ ((searchParams.current - 1) * searchParams.size + scope.$index + 1).toString().padStart(2, '0') }}
</template>
@@ -54,7 +54,7 @@
</template>
</el-table-column>
<el-table-column prop="contactPerson" show-overflow-tooltip label="需求联系人" />
- <el-table-column prop="contactPhone" show-overflow-tooltip width="150" label="需求联系人电话" />
+ <el-table-column prop="contactPhone" show-overflow-tooltip width="180" label="需求联系人电话" />
<el-table-column prop="contactEmail" show-overflow-tooltip label="需求邮箱" />
<el-table-column prop="demandStatus" show-overflow-tooltip label="需求状态">
<template v-slot="{ row }">
@@ -76,12 +76,12 @@
<el-table-column prop="responsibleDeptName" show-overflow-tooltip label="责任部门" />
<el-table-column prop="dataSource" show-overflow-tooltip label="数据来源依据" />
<el-table-column prop="demandInfo" show-overflow-tooltip label="需求信息项" />
- <el-table-column label="操作" class-name="operation-btns" width="180">
+ <el-table-column label="操作" class-name="operation-btns" width="240">
<template v-slot="{ row }">
- <el-link @click="openForm('view', row)">查看</el-link>
+ <el-link type="primary" @click="openForm('view', row)">查看</el-link>
<!-- 只对非审批状态显示编辑和删除按钮 -->
- <el-link @click="openForm('edit', row)" v-if="!['1', '2', '3'].includes(row.demandStatus)">编辑</el-link>
- <el-link @click="handleDelete(row)" v-if="!['1', '2', '3'].includes(row.demandStatus)">删除</el-link>
+ <el-link type="primary" @click="openForm('edit', row)" v-if="!['1', '2', '3'].includes(row.demandStatus)">编辑</el-link>
+ <el-link type="primary" @click="handleDelete(row)" v-if="!['1', '2', '3'].includes(row.demandStatus)">删除</el-link>
</template>
</el-table-column>
</el-table>
diff --git a/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/reasonForRejectionDialog.vue b/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/reasonForRejectionDialog.vue
index 7b0e0b2..3fa0b0e 100644
--- a/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/reasonForRejectionDialog.vue
+++ b/applications/task-work-order/src/views/orderView/orderDataManage/supplyAdd/reasonForRejectionDialog.vue
@@ -16,7 +16,7 @@
</div>
</div>
<template #footer>
- <el-button class="save-btn" color="#4C34FF" @click="handleConfirm">确认</el-button>
+ <el-button class="" color="#4C34FF" @click="handleConfirm">确认</el-button>
</template>
</el-dialog>
</template>
@@ -65,21 +65,4 @@
</script>
<style scoped lang="scss">
-.detail-container {
- padding: 20px;
- display: flex;
- align-items: flex-start;
- gap: 30px;
- .detail-cell {
- display: flex;
- justify-content: center;
- .cell-label {
- min-width: 80px;
- flex-shrink: 0;
- }
- :deep(.el-textarea__inner) {
- height: 100px !important;
- }
- }
-}
</style>
diff --git a/applications/task-work-order/src/views/orderView/orderManage/clueEvents/DistributeDiaLog.vue b/applications/task-work-order/src/views/orderView/orderManage/clueEvents/DistributeDiaLog.vue
index 59ed882..e4b392e 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/clueEvents/DistributeDiaLog.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/clueEvents/DistributeDiaLog.vue
@@ -43,7 +43,7 @@
</el-form>
<template #footer>
<el-button color="#F2F3F5" @click="visible = false">取消</el-button>
- <el-button class="save-btn" color="#4C34FF" :loading="submitting" :disabled="submitting" @click="handleSubmit">
+ <el-button class="" color="#4C34FF" :loading="submitting" :disabled="submitting" @click="handleSubmit">
保存
</el-button>
</template>
diff --git a/applications/task-work-order/src/views/orderView/orderManage/clueEvents/ViewDiaLog.vue b/applications/task-work-order/src/views/orderView/orderManage/clueEvents/ViewDiaLog.vue
index e7a1057..19c592f 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/clueEvents/ViewDiaLog.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/clueEvents/ViewDiaLog.vue
@@ -1,45 +1,45 @@
<template>
<el-dialog class="gd-dialog" v-model="visible" title="查看" @closed="visible = false" width="1000px" destroy-on-close>
- <div class="gd-table-container" v-loading="loading" style="height: 600px">
- <div class="gd-table-content gd-table-content-bg">
- <el-table class="gd-table" :data="list">
- <el-table-column label="线索缩略图" width="120">
- <template v-slot="{ row }">
- <el-image
- v-if="row.resultUrl"
- :src="row.resultUrl"
- :preview-src-list="[row.resultUrl]"
- fit="cover"
- style="width: 80px; height: 60px"
- preview-teleported
- />
- <span v-else>-</span>
- </template>
- </el-table-column>
- <el-table-column prop="resultCode" show-overflow-tooltip label="线索编号" />
- <el-table-column prop="shootTime" show-overflow-tooltip label="拍摄时间" />
- <el-table-column label="线索位置" show-overflow-tooltip>
- <template v-slot="{ row }">
- {{ formatLocation(row) }}
- </template>
- </el-table-column>
- <el-table-column prop="distributeStatus" show-overflow-tooltip label="线索状态">
- <template v-slot="{ row }">
- {{ getDistributeStatusLabel(row.distributeStatus) }}
- </template>
- </el-table-column>
- <el-table-column prop="distributeDeptName" show-overflow-tooltip label="分发部门" />
- <el-table-column prop="distributeUserName" show-overflow-tooltip label="分发人员" />
- <el-table-column label="操作" class-name="operation-btns" width="140">
- <template v-slot="{ row }">
- <el-link v-if="row.distributeStatus === 0" @click="openDistributeDialog(row)" :disabled="row.distributeStatus === 1">
- 转为事件并分发
- </el-link>
- <div class="disabled-text" v-else>转为事件并分发</div>
- </template>
- </el-table-column>
- </el-table>
- </div>
+ <div v-loading="loading">
+ <el-table :data="list">
+ <el-table-column label="线索缩略图" width="120">
+ <template v-slot="{ row }">
+ <el-image
+ v-if="row.resultUrl"
+ :src="row.resultUrl"
+ :preview-src-list="[row.resultUrl]"
+ fit="cover"
+ style="width: 80px; height: 60px"
+ preview-teleported
+ />
+ <span v-else>-</span>
+ </template>
+ </el-table-column>
+ <el-table-column prop="resultCode" show-overflow-tooltip label="线索编号" />
+ <el-table-column prop="shootTime" show-overflow-tooltip label="拍摄时间" />
+ <el-table-column label="线索位置" show-overflow-tooltip>
+ <template v-slot="{ row }">
+ {{ formatLocation(row) }}
+ </template>
+ </el-table-column>
+ <el-table-column prop="distributeStatus" show-overflow-tooltip label="线索状态">
+ <template v-slot="{ row }">
+ {{ getDistributeStatusLabel(row.distributeStatus) }}
+ </template>
+ </el-table-column>
+ <el-table-column prop="distributeDeptName" show-overflow-tooltip label="分发部门" />
+ <el-table-column prop="distributeUserName" show-overflow-tooltip label="分发人员" />
+ <el-table-column label="操作" class-name="operation-btns" width="140">
+ <template v-slot="{ row }">
+ <el-link type="primary"
+ @click="openDistributeDialog(row)"
+ :disabled="row.distributeStatus === 1 || currentRow.taskStatus !== '8'"
+ >
+ 转为事件并分发
+ </el-link>
+ </template>
+ </el-table-column>
+ </el-table>
</div>
<template #footer>
diff --git a/applications/task-work-order/src/views/orderView/orderManage/clueEvents/index.vue b/applications/task-work-order/src/views/orderView/orderManage/clueEvents/index.vue
index 8402090..520a358 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/clueEvents/index.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/clueEvents/index.vue
@@ -92,7 +92,7 @@
<el-table-column prop="taskDesc" show-overflow-tooltip label="巡查任务描述" />
<el-table-column label="操作" class-name="operation-btns">
<template v-slot="{ row }">
- <el-link @click="viewDiaLogView(row)">查看线索</el-link>
+ <el-link type="primary" @click="viewDiaLogView(row)">查看线索</el-link>
</template>
</el-table-column>
</el-table>
@@ -159,7 +159,12 @@
const range = dateRangeFormat(dateRange.value)
loading.value = true
try {
- const res = await gdPatrolTaskPageApi({ ...searchParams.value, startTime: range[0], endTime: range[1] })
+ const res = await gdPatrolTaskPageApi({
+ ...searchParams.value,
+ startTime: range[0],
+ endTime: range[1],
+ taskStatus: 8
+ })
list.value = res?.data?.data?.records ?? []
total.value = res?.data?.data?.total ?? 0
} finally {
diff --git a/applications/task-work-order/src/views/orderView/orderManage/inspectionReport/index.vue b/applications/task-work-order/src/views/orderView/orderManage/inspectionReport/index.vue
index 3e3cfb9..f0a01e1 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/inspectionReport/index.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/inspectionReport/index.vue
@@ -57,9 +57,9 @@
</el-table-column>
<el-table-column label="操作" class-name="operation-btns">
<template v-slot="{ row }">
- <el-link @click="seeOnlineWord(row)">查看</el-link>
- <el-link @click="openForm(row)">在线编辑</el-link>
- <el-link @click="handleDelete(row)">删除</el-link>
+ <el-link type="primary" @click="seeOnlineWord(row)">查看</el-link>
+ <el-link type="primary" @click="openForm(row)">在线编辑</el-link>
+ <el-link type="primary" @click="handleDelete(row)">删除</el-link>
</template>
</el-table-column>
</el-table>
@@ -117,7 +117,7 @@
<template #footer>
<el-button color="#F2F3F5" @click="isShowEditView = false">取消</el-button>
<el-button
- class="save-btn"
+ class=""
color="#4C34FF"
:loading="submitting"
:disabled="submitting"
diff --git a/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue b/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue
index 98916f3..78266a5 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/FormDiaLog.vue
@@ -179,7 +179,7 @@
<template #footer>
<el-button color="#F2F3F5" @click="visible = false">{{ dialogReadonly ? '关闭' : '取消' }}</el-button>
<el-button
- class="save-btn"
+ class=""
color="#4C34FF"
v-if="!dialogReadonly"
:loading="submitting"
@@ -201,6 +201,7 @@
import { gdWorkOrderPageApi } from '../orderManage/orderManageApi'
import { gdManageDeviceListApi } from '../orderManage/gdManageDeviceApi'
import { pxToRem } from '@/utils/rem'
+import { airlineListApi } from '@/api/zkxt'
// 初始化任务行
const initTaskRow = () => ({
@@ -220,7 +221,7 @@
const dialogMode = ref('add') // 弹框模式
const submitting = ref(false) // 提交中
const dialogReadonly = computed(() => dialogMode.value === 'view')
-const titleEnum = ref({ edit: '编辑', view: '查看', add: '新增' })
+const titleEnum = ref({ edit: '新增', view: '查看', add: '新增' })
// 工单相关
const workOrderList = ref([]) // 工单列表
@@ -230,11 +231,7 @@
// 下拉选项
const flyerListMap = ref({}) // 飞手列表,按行索引存储
const deviceList = ref([]) // 设备列表
-const routeOptions = ref([
- { name: '航线1', id: '1' },
- { name: '航线2', id: '2' },
- { name: '航线3', id: '3' },
-]) // 航线假数据
+const routeOptions = inject('routeOptions')
// 子任务列表
const taskList = ref([initTaskRow()])
@@ -273,7 +270,7 @@
// 获取工单列表
async function getWorkOrderList() {
- const res = await gdWorkOrderPageApi({ size: 999, workOrderStatus: '20' })
+ const res = await gdWorkOrderPageApi({ size: 999, workOrderStatus: dialogMode.value ==='add' ? '20' : '' })
workOrderList.value = res?.data?.data?.records ?? []
}
@@ -297,7 +294,7 @@
// 获取设备列表
async function getDeviceList() {
const res = await gdManageDeviceListApi({
- deviceIds: selectedWorkOrder.value.recommendDeviceIds,
+ deviceIds: selectedWorkOrder.value?.recommendDeviceIds,
})
deviceList.value = res?.data?.data ?? []
}
@@ -305,6 +302,7 @@
watch(
() => selectedWorkOrderId.value,
() => {
+ handleWorkOrderChange(selectedWorkOrderId.value)
getDeviceList()
}
)
@@ -367,9 +365,9 @@
// 打开弹框
async function open({ mode = 'add', row } = {}) {
- console.log(row, 'rowrow')
dialogMode.value = mode
- if (mode === 'add') {
+ await getWorkOrderList()
+ if (dialogMode.value === 'add') {
selectedWorkOrderId.value = null
selectedWorkOrder.value = null
taskList.value = [initTaskRow()]
@@ -388,7 +386,7 @@
}
onMounted(() => {
- getWorkOrderList()
+
})
defineExpose({ open })
diff --git a/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/RefuseOrderDialog1.vue b/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/RefuseOrderDialog1.vue
index 51b0d79..50b19e9 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/RefuseOrderDialog1.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/RefuseOrderDialog1.vue
@@ -42,7 +42,7 @@
<template #footer>
<el-button color="#F2F3F5" @click="visible = false">{{ dialogReadonly ? '关闭' : '取消' }}</el-button>
<el-button
- class="save-btn"
+ class=""
color="#4C34FF"
v-if="!dialogReadonly"
:loading="submitting"
diff --git a/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue b/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue
index 8d7bd7b..ccbe7a3 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue
@@ -5,6 +5,7 @@
:title="titleEnum[dialogMode]"
@closed="visible = false"
destroy-on-close
+ width="auto"
:close-on-click-modal="false"
>
<div class="content" style="display: flex">
@@ -17,10 +18,10 @@
:type="index === processList.length - 1 ? 'success' : 'info'"
:color="activity.color"
:hollow="activity.hollow"
- :timestamp="activity.flowDesc.split(' ')[1]"
+ :timestamp="activity.createTime"
>
<div class="item-content">
- <div>{{ activity.flowDesc.split(' ')[0] }}</div>
+ <div>{{ activity.operator }}</div>
<div class="flowName">{{ activity.flowName }}</div>
</div>
</el-timeline-item>
@@ -45,7 +46,7 @@
</el-col>
<el-col :span="12">
<div class="label">巡查任务航线</div>
- <div class="val">{{ getRouteName(formData.patrolRouteUrl) }}</div>
+ <div class="val">{{ getAirName(formData.patrolRouteUrl) }}</div>
</el-col>
<el-col :span="12">
<div class="label">推荐飞手</div>
@@ -59,15 +60,17 @@
<div class="label">关联工单</div>
<div class="val">{{ getWorkOrderName(formData.workOrderId) }}</div>
</el-col>
- <el-col :span="24">
+ <el-col :span="12">
<div class="label">巡查任务描述</div>
<div class="val">{{ formData.taskDesc }}</div>
</el-col>
</el-row>
<template v-if="['6', '7', '8'].includes(taskStatus)">
- <div class="detail-title" :style="{ marginTop: pxToRem(10) }">任务成功({{ list.length || 0 }}条)</div>
+ <div class="detail-title" :style="{ marginTop: pxToRem(10) }">
+ 任务成果({{ taskResultList.length || 0 }}条)
+ </div>
<div class="imgBox">
- <div v-for="item in list">
+ <div v-for="item in taskResultList">
<el-image
v-if="item.resultUrl"
:src="item.resultUrl"
@@ -179,6 +182,7 @@
</el-row>
</el-form>
+ <div class="detail-title" :style="{ marginTop: pxToRem(10) }">任务航线</div>
<!-- 地图组件 -->
<CommonCesiumMap
ref="mapRef"
@@ -189,36 +193,37 @@
:layer-mode="4"
:boundary="false"
:zoomToBoundary="false"
- @ready="() => mapRef.flyBoundary()"
+ @ready="readyMap"
/>
</div>
</div>
<template #footer>
<template v-if="requester">
+ <el-button v-if="['1', '4'].includes(taskStatus)" @click="viewDescription" color="#F2F3F5">
+ {{ gdStatusObj[taskStatus].reason }}
+ </el-button>
+ <el-button @click="statusChange(3)" v-if="taskStatus === '3'" color="#4C34FF">撤回任务</el-button>
+ <el-button @click="refusalToAccept" v-if="taskStatus === '6'" color="#F2F3F5">拒绝验收</el-button>
+ <el-button @click="statusChange(6)" v-if="taskStatus === '6'" color="#4C34FF">验收通过</el-button>
<el-button
v-if="!dialogReadonly || ['1', '4'].includes(taskStatus)"
:loading="submitting"
:disabled="submitting"
+ color="#4C34FF"
@click="handleSubmit"
>
提交
</el-button>
- <el-button v-if="['1', '4'].includes(taskStatus)" @click="viewDescription">
- {{ gdStatusObj[taskStatus].reason }}
- </el-button>
- <el-button @click="statusChange(3)" v-if="taskStatus === '3'">撤回任务</el-button>
- <el-button @click="refusalToAccept" v-if="taskStatus === '6'">拒绝验收</el-button>
- <el-button @click="statusChange(6)" v-if="taskStatus === '6'">验收通过</el-button>
</template>
<template v-else>
- <el-button v-if="['7'].includes(taskStatus)" @click="viewDescription">
+ <el-button v-if="['7'].includes(taskStatus)" @click="viewDescription" color="#F2F3F5">
{{ gdStatusObj[taskStatus].reason }}
</el-button>
- <el-button v-if="taskStatus === '0'" @click="addDescription">拒绝签收</el-button>
- <el-button v-if="taskStatus === '0'" @click="statusChange(1)">签收</el-button>
- <el-button v-if="taskStatus === '3'" @click="addDescription">驳回</el-button>
- <el-button v-if="taskStatus === '3'" @click="statusChange(4)">同意</el-button>
+ <el-button v-if="taskStatus === '0'" @click="addDescription" color="#F2F3F5">拒绝签收</el-button>
+ <el-button v-if="taskStatus === '0'" @click="statusChange(1)" color="#4C34FF">签收</el-button>
+ <el-button v-if="taskStatus === '3'" @click="addDescription" color="#F2F3F5">驳回</el-button>
+ <el-button v-if="taskStatus === '3'" @click="statusChange(4)" color="#4C34FF">同意</el-button>
</template>
</template>
@@ -234,7 +239,7 @@
<script setup>
import { computed, ref, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
-import { fieldRules, getDictLabel } from '@ztzf/utils'
+import { fieldRules, flyVisual, getDictLabel } from '@ztzf/utils'
import { gdPatrolTaskRepublish, gdFlyerPageApi, gdPatrolTaskAuditApi } from './inspectionRequestApi'
import { gdWorkOrderFlowListApi, gdWorkOrderPageApi } from '../orderManage/orderManageApi'
import { gdManageDeviceListApi } from '../orderManage/gdManageDeviceApi'
@@ -244,6 +249,8 @@
import RefuseOrderDialog from '@/views/orderView/orderManage/orderManage/RefuseOrderDialog.vue'
import RefuseOrderDialog1 from '@/views/orderView/orderManage/inspectionRequest/RefuseOrderDialog1.vue'
import { Check } from '@element-plus/icons-vue'
+import { queryAirById } from '@/api/zkxt'
+import * as Cesium from 'cesium'
// 初始化表单数据
const initForm = () => ({
@@ -277,11 +284,8 @@
const flyerList = ref([])
const deviceList = ref([])
const workOrderList = ref([])
-const routeOptions = ref([
- { name: '航线1', id: '1' },
- { name: '航线2', id: '2' },
- { name: '航线3', id: '3' },
-])
+const routeOptions = inject('routeOptions')
+const getAirName = inject('getAirName')
const gdStatusObj = {
'0': { reason: '拒绝原因', operationType: '2' },
@@ -388,7 +392,7 @@
const processList = ref([])
// 加载时间线list
function loadList() {
- gdWorkOrderFlowListApi({ workOrderId: formData.value.id,type: '1' }).then(res => {
+ gdWorkOrderFlowListApi({ workOrderId: formData.value.id, type: '1' }).then(res => {
processList.value = res.data.data
})
}
@@ -408,25 +412,82 @@
}
}
-let list = ref([])
+let taskResultList = ref([])
// 获取成果列表
-async function getList() {
+async function getTaskResultList() {
if (!formData.value?.id) return
try {
const res = await gdTaskResultListApi({ patrolTaskId: formData.value.id })
- list.value = res?.data?.data ?? []
+ taskResultList.value = res?.data?.data ?? []
} finally {
}
+}
+
+// 获取航线详情
+function getAirDetails() {
+ queryAirById(formData.value.patrolRouteUrl).then(res => {
+ const list = res.data.data.airlineWaypoints
+ if (!list.length) return mapRef.value?.flyBoundary()
+ const result = list.map(item => [Number(item.longitude), Number(item.latitude)]).flat()
+ viewer.entities.add({
+ polyline: {
+ positions: Cesium.Cartesian3.fromDegreesArray(result),
+ clampToGround: true,
+ width: 3,
+ material: Cesium.Color.RED,
+ },
+ })
+ // 渲染起点(蓝色)
+ const startPoint = list[0]
+ viewer.entities.add({
+ position: Cesium.Cartesian3.fromDegrees(
+ Number(startPoint.longitude),
+ Number(startPoint.latitude),
+ startPoint.height || 0
+ ),
+ point: {
+ pixelSize: 12,
+ color: Cesium.Color.BLUE,
+ outlineColor: Cesium.Color.WHITE,
+ outlineWidth: 2,
+ heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+ },
+ })
+ // 渲染终点(红色)
+ const endPoint = list[list.length - 1]
+ viewer.entities.add({
+ position: Cesium.Cartesian3.fromDegrees(
+ Number(endPoint.longitude),
+ Number(endPoint.latitude),
+ endPoint.height || 0
+ ),
+ point: {
+ pixelSize: 12,
+ color: Cesium.Color.RED,
+ outlineColor: Cesium.Color.WHITE,
+ outlineWidth: 2,
+ heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+ },
+ })
+ flyVisual({
+ positionsData: list.map(i => [Number(i.longitude), Number(i.latitude), i.height || 0]),
+ viewer,
+ })
+ })
}
// 打开弹框
async function open({ mode = 'view', row } = {}) {
dialogMode.value = mode
formData.value = { ...initForm(), ...row }
- console.log(row)
- ;['6', '7', '8'].includes(row.taskStatus) && getList()
+ ;['6', '7', '8'].includes(row.taskStatus) && getTaskResultList()
loadList()
initMap()
+}
+
+const readyMap = () => {
+ // mapRef.value?.flyBoundary()
+ getAirDetails()
}
// 初始化地图实例
@@ -449,17 +510,26 @@
.content {
display: flex;
gap: 0 20px;
+ height: 680px;
+
.leftBox {
width: 920px;
+ flex: 1;
+ overflow: auto;
+ display: flex;
+ flex-direction: column;
.gd-cesium {
- padding-top: 10px;
width: 100%;
- height: 423px;
+ min-height: 380px;
+ flex: 1;
}
-
}
.processBox {
width: 312px;
+ padding: 24px 0;
+ border: 1px solid #e4e4e4;
+ overflow: auto;
+
.item-content {
position: relative;
.flowName {
diff --git a/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue b/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue
index 6d64be5..08fcba2 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/inspectionRequest/index.vue
@@ -98,8 +98,7 @@
<el-table-column prop="taskDesc" show-overflow-tooltip label="巡查任务描述" />
<el-table-column label="操作" class-name="operation-btns">
<template v-slot="{ row }">
- <el-link @click="viewDiaLogView(row)">查看</el-link>
- <!-- <el-link @click="openForm('edit', row)">编辑</el-link>-->
+ <el-link type="primary" @click="viewDiaLogView(row)">查看</el-link>
</template>
</el-table-column>
</el-table>
@@ -137,6 +136,7 @@
import { gdPatrolTaskPageApi, gdPatrolTaskRemoveApi } from './inspectionRequestApi'
import ViewDiaLog from '@/views/orderView/orderManage/inspectionRequest/ViewDiaLog.vue'
import { useStore } from 'vuex'
+import { airlineListApi } from '@/api/zkxt'
const store = useStore()
const requester = computed(() => store.state.user.userInfo?.role_id === '2014158512610869250')
@@ -232,6 +232,19 @@
selectedIds.value = rows.map(item => item.id)
}
+const routeOptions = ref([])
+const getAirName = id => {
+ const item = routeOptions.value.find(item => item.id === id)
+ return item ? item.name : id
+}
+provide('routeOptions', routeOptions)
+provide('getAirName', getAirName)
+function getAirList() {
+ airlineListApi({}).then(res => {
+ routeOptions.value = res.data.data || []
+ })
+}
+
// 获取字典
function getDictList() {
getDictionaryByCode('patrolTaskType,workOrderType,deviceLoadDemand,taskStatus').then(res => {
@@ -249,6 +262,7 @@
onMounted(() => {
getList()
getDictList()
+ getAirList()
})
</script>
<style scoped lang="scss"></style>
diff --git a/applications/task-work-order/src/views/orderView/orderManage/operatingIncome/index.vue b/applications/task-work-order/src/views/orderView/orderManage/operatingIncome/index.vue
index 52abda1..6f42727 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/operatingIncome/index.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/operatingIncome/index.vue
@@ -1,81 +1,93 @@
<!-- 运营收益 -->
<template>
<basic-container>
- <div class="gd-table-toolbar">
- <el-button :icon="Plus" color="#4C34FF" type="primary" @click="handleAdd">新增</el-button>
+ <div class="gd-table-toolbar">
+ <el-button :icon="Plus" color="#4C34FF" type="primary" @click="handleAdd">新增</el-button>
<el-button :icon="Delete" color="#4C34FF" :disabled="!selectedIds.length" @click="handleDelete()">删除</el-button>
- </div>
- <div class="gd-table-container" v-loading="loading">
- <div class="gd-table-content gd-table-content-bg">
- <el-table class="gd-table" :data="tableList" @selection-change="handleSelectionChange">
- <el-table-column type="selection" width="46" />
- <el-table-column label="序号" type="index" width="60"></el-table-column>
- <el-table-column prop="operatingIncome" label="营业收入" align="center"></el-table-column>
- <el-table-column prop="totalCost" label="综合总成本费用" align="center"></el-table-column>
- <el-table-column prop="netProfit" label="净利润" align="center"></el-table-column>
- <el-table-column prop="financialIrr" label="财务内部收益率" align="center"></el-table-column>
- <el-table-column prop="marketSpace" label="市场空间" align="center" show-overflow-tooltip></el-table-column>
- <el-table-column prop="createTime" label="创建时间" align="center"></el-table-column>
- <el-table-column prop="nickName" label="创建人" align="center"></el-table-column>
- <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 type="text" @click="handleEdit(scope.row)">编辑</el-button>
- <el-button type="text" @click="handleDelete(scope.row)">删除</el-button>
- </template>
- </el-table-column>
- </el-table>
- </div>
- <div class="gd-pagination-parent">
- <el-pagination
- popper-class="gd-select-popper"
- v-model:current-page="params.current"
- v-model:page-size="params.size"
- layout="total, prev, pager, next, sizes"
- :total="total"
- @change="getList"
- />
- </div>
</div>
- <el-dialog class="gd-dialog" append-to-body v-model="isShowEditView" :title="titleTxt"
- :width="pxToRem(800)" :close-on-click-modal="false" :destroy-on-close="true" @close="handleClose">
+ <div class="gd-table-container" v-loading="loading">
+ <div class="gd-table-content gd-table-content-bg">
+ <el-table class="gd-table" :data="tableList" @selection-change="handleSelectionChange">
+ <el-table-column type="selection" width="46" />
+ <el-table-column label="序号" type="index" width="60"></el-table-column>
+ <el-table-column prop="operatingIncome" label="营业收入" align="center"></el-table-column>
+ <el-table-column prop="totalCost" label="综合总成本费用" align="center"></el-table-column>
+ <el-table-column prop="netProfit" label="净利润" align="center"></el-table-column>
+ <el-table-column prop="financialIrr" label="财务内部收益率" align="center"></el-table-column>
+ <el-table-column prop="marketSpace" label="市场空间" align="center" show-overflow-tooltip></el-table-column>
+ <el-table-column prop="createTime" label="创建时间" align="center"></el-table-column>
+ <el-table-column prop="nickName" label="创建人" align="center"></el-table-column>
+ <el-table-column label="操作" width="180" align="center" class-name="operation-btns">
+ <template #default="scope">
+ <!-- <el-button icon="el-icon-view" type="text" @click="handleDetail(scope.row)">查看</el-button> -->
+ <el-link type="primary" @click="handleEdit(scope.row)">编辑</el-link>
+ <el-link type="primary" @click="handleDelete(scope.row)">删除</el-link>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+ <div class="gd-pagination-parent">
+ <el-pagination popper-class="gd-select-popper" v-model:current-page="params.current"
+ v-model:page-size="params.size" layout="total, prev, pager, next, sizes" :total="total" @change="getList" />
+ </div>
+ </div>
+ <el-dialog class="gd-dialog" append-to-body v-model="isShowEditView" :title="titleTxt" :width="pxToRem(800)"
+ :close-on-click-modal="false" :destroy-on-close="true" @close="handleClose">
<el-form class="gd-dialog-form" ref="ruleFormRef" :model="editParams" :rules="rules" label-width="140px">
- <el-form-item label="营业收入" prop="operatingIncome">
- <el-input class="gd-input" v-model="editParams.operatingIncome" />
- </el-form-item>
- <el-form-item label="综合总成本费用" prop="totalCost">
- <el-input class="gd-input" v-model="editParams.totalCost" />
- </el-form-item>
- <el-form-item label="净利润" prop="netProfit">
- <el-input class="gd-input" v-model="editParams.netProfit" />
- </el-form-item>
- <el-form-item label="财务内部收益率" prop="financialIrr">
- <el-input class="gd-input" v-model="editParams.financialIrr" />
- </el-form-item>
- <el-form-item label="市场空间" prop="marketSpace">
- <el-input class="gd-input" v-model="editParams.marketSpace" />
- </el-form-item>
+ <el-row>
+ <el-col span="12">
+ <el-form-item label="营业收入" prop="operatingIncome">
+ <el-input class="gd-input" v-model="editParams.operatingIncome" />
+ </el-form-item>
+ </el-col>
+ <el-col span="12">
+ <el-form-item label="综合总成本费用" prop="totalCost">
+ <el-input class="gd-input" v-model="editParams.totalCost" />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row>
+ <el-col span="12">
+ <el-form-item label="净利润" prop="netProfit">
+ <el-input class="gd-input" v-model="editParams.netProfit" />
+ </el-form-item>
+ </el-col>
+ <el-col span="12">
+ <el-form-item label="财务内部收益率" prop="financialIrr">
+ <el-input class="gd-input" v-model="editParams.financialIrr" />
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row>
+ <el-col span="12">
+ <el-form-item label="市场空间" prop="marketSpace">
+ <el-input class="gd-input" v-model="editParams.marketSpace" />
+ </el-form-item>
+ </el-col>
+ </el-row>
</el-form>
- <!-- </div> -->
- <template #footer>
- <el-button color="#F2F3F5" @click="isShowEditView = false">取消</el-button>
- <el-button class="save-btn" color="#4C34FF" :loading="submitting" :disabled="submitting" @click="submit(ruleFormRef)">
- 保存
- </el-button>
- </template>
- </el-dialog>
+ <!-- </div> -->
+ <template #footer>
+ <el-button color="#F2F3F5" @click="isShowEditView = false">取消</el-button>
+ <el-button class="" color="#4C34FF" :loading="submitting" :disabled="submitting" @click="submit(ruleFormRef)">
+ 保存
+ </el-button>
+ </template>
+ </el-dialog>
</basic-container>
</template>
<script setup>
-import { ElMessage, ElMessageBox, ElLoading } from 'element-plus';
-import { operatingIncomePage, operatingIncomeUpdate, operatingIncomeAdd, operatingIncomeBatchDelete } from './operatingIncomeApi';
+import { ElMessage, ElMessageBox, ElLoading } from 'element-plus'
+import { operatingIncomePage, operatingIncomeUpdate, operatingIncomeAdd, operatingIncomeBatchDelete } from './operatingIncomeApi'
let titleTxt = ref('新增')
const total = ref(0)
const params = ref({
current: 1,
size: 10,
-});
+})
const submitting = ref(false)
const loading = ref(true) // 列表加载中
const selectedIds = ref([]) // 勾选的ID列表
@@ -98,9 +110,9 @@
{
validator: (rule, value, callback) => {
if (!/^\d+(\.\d+)?$/.test(value)) {
- callback(new Error('请输入有效的数字(整数或小数)'));
+ callback(new Error('请输入有效的数字(整数或小数)'))
} else {
- callback();
+ callback()
}
},
trigger: 'blur'
@@ -111,9 +123,9 @@
{
validator: (rule, value, callback) => {
if (!/^\d+(\.\d+)?$/.test(value)) {
- callback(new Error('请输入有效的数字(整数或小数)'));
+ callback(new Error('请输入有效的数字(整数或小数)'))
} else {
- callback();
+ callback()
}
},
trigger: 'blur'
@@ -124,9 +136,9 @@
{
validator: (rule, value, callback) => {
if (!/^\d+(\.\d+)?$/.test(value)) {
- callback(new Error('请输入有效的数字(整数或小数)'));
+ callback(new Error('请输入有效的数字(整数或小数)'))
} else {
- callback();
+ callback()
}
},
trigger: 'blur'
@@ -137,9 +149,9 @@
{
validator: (rule, value, callback) => {
if (!/^\d+(\.\d+)?$/.test(value)) {
- callback(new Error('请输入有效的数字(整数或小数)'));
+ callback(new Error('请输入有效的数字(整数或小数)'))
} else {
- callback();
+ callback()
}
},
trigger: 'blur'
@@ -151,11 +163,11 @@
})
// 勾选值设置
-function handleSelectionChange(rows) {
- selectedIds.value = rows.map(item => item.id)
+function handleSelectionChange (rows) {
+ selectedIds.value = rows.map(item => item.id)
}
-function getList() {
+function getList () {
loading.value = true
operatingIncomePage(params.value).then(res => {
tableList.value = res.data.data.records || []
@@ -164,34 +176,34 @@
loading.value = false
})
}
-function handleEdit(row) {
+function handleEdit (row) {
titleTxt.value = '编辑'
isShowEditView.value = true
editParams.value = { ...row }
}
// 删除
-async function handleDelete(row) {
- const tips = row ? '该条' : '选中的项'
- await ElMessageBox.confirm(`确认删除${tips}吗?`, '提示', {
- type: 'warning',
- customClass: 'gd-confirm-custom',
- confirmButtonClass: 'gd-confirm-button',
- cancelButtonClass: 'gd-confirm-cancel-button',
- })
- const ids = row ? row.id : selectedIds.value
- await operatingIncomeBatchDelete(ids)
- ElMessage.success('删除成功')
- selectedIds.value = []
- getList()
+async function handleDelete (row) {
+ const tips = row ? '该条' : '选中的项'
+ await ElMessageBox.confirm(`确认删除${tips}吗?`, '提示', {
+ type: 'warning',
+ customClass: 'gd-confirm-custom',
+ confirmButtonClass: 'gd-confirm-button',
+ cancelButtonClass: 'gd-confirm-cancel-button',
+ })
+ const ids = row ? row.id : selectedIds.value
+ await operatingIncomeBatchDelete(ids)
+ ElMessage.success('删除成功')
+ selectedIds.value = []
+ getList()
}
-function handleAdd() {
+function handleAdd () {
titleTxt.value = '新增'
isShowEditView.value = true
}
-async function submit(formValidate) {
+async function submit (formValidate) {
if (!formValidate) return
await formValidate.validate((valid, fields) => {
if (valid) {
@@ -217,7 +229,7 @@
})
}
-function handleClose() {
+function handleClose () {
// 清除表单内容
editParams.value = {
id: '',
@@ -234,65 +246,68 @@
})
</script>
<style lang="scss" scoped>
- .operatingIncome {
- 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 {
- margin-top: 20px;
- height: 40px;
- }
+.operatingIncome {
+ height: 0;
+ flex: 1;
+ margin: 0 10px 10px 10px;
+ background-color: #ffffff;
+ padding: 10px 20px;
+ border-radius: 5px;
+ display: flex;
+ flex-direction: column;
- :deep(.el-input) {
- .el-input__wrapper {
- width: 200px;
- }
- }
+ .search-box {
+ margin-top: 20px;
+ height: 40px;
+ }
- // 表格
- .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;
- }
+ :deep(.el-input) {
+ .el-input__wrapper {
+ width: 200px;
}
}
-
- .content {
+
+ // 表格
+ .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;
@@ -300,7 +315,7 @@
// background-color: #F5F7FA;
border-right: 1px solid #EBEEF5;
}
-
+
&.value {
width: 180px;
// color: #303133;
@@ -309,21 +324,24 @@
}
}
}
+
.content-edit {
.el-form {
.el-form-item {
width: 320px;
+
:deep(.el-form-item__label) {
width: 140px;
}
}
+
// .el-form-item:last-child {
// width: 640px;
// }
.btns {
- display: flex;
- justify-content: center
- }
+ display: flex;
+ justify-content: center
+ }
}
}
</style>
diff --git a/applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue b/applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
index c635df7..02b0a4b 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/orderManage/FormDiaLog.vue
@@ -18,10 +18,10 @@
:type="index === processList.length - 1 ? 'success' : 'info'"
:color="activity.color"
:hollow="activity.hollow"
- :timestamp="activity.flowDesc.split(' ')[1]"
+ :timestamp="activity.createTime"
>
<div class="item-content">
- <div>{{ activity.flowDesc.split(' ')[0] }}</div>
+ <div>{{ activity.operator }}</div>
<div class="flowName">{{ activity.flowName }}</div>
</div>
</el-timeline-item>
@@ -56,7 +56,7 @@
</el-col>
</el-row>
<div class="detail-title" :style="{ marginTop: pxToRem(20) }">已选设备</div>
- <el-table class="setHeight" ref="deviceTableRef" :data="deviceList" row-key="id">
+ <el-table class="setHeight gd-dialog-table" ref="deviceTableRef" :data="deviceList" row-key="id">
<el-table-column prop="nickname" label="设备名称" />
<el-table-column prop="deviceName" label="设备型号" />
<el-table-column prop="devicePayload" label="设备负载" />
@@ -164,7 +164,7 @@
<div class="detail-title" :style="{ marginTop: pxToRem(20) }">工单执行范围</div>
<CommonCesiumMap
ref="mapRef"
- class="leftMap gd-cesium"
+ class="gd-cesium"
:active="visible"
:flat-mode="false"
:terrain="true"
@@ -195,34 +195,43 @@
<template #footer>
<template v-if="requester">
+ <template v-if="!suddenlyEdit">
+ <el-button
+ v-if="['11', '21', '23', '24', '25', '31', '60'].includes(gdStatus)"
+ @click="viewDescription"
+ color="#F2F3F5"
+ >
+ {{ gdStatusObj[gdStatus].reason }}
+ </el-button>
+ <el-button @click="addDescription" v-if="['20', '24', '25', '50'].includes(gdStatus)" color="#F2F3F5">
+ {{ gdStatus === '50' ? '结算' : '申请取消' }}
+ </el-button>
+ <el-button color="#4C34FF" @click="requestModification" v-if="['20', '25'].includes(gdStatus)">
+ 申请修改
+ </el-button>
+ </template>
<el-button
v-if="['11'].includes(gdStatus) || suddenlyEdit || (!dialogReadonly && !formData.id)"
:loading="submitting"
:disabled="submitting"
+ color="#4C34FF"
@click="handleSubmit"
>
{{ gdStatus === '11' || !gdStatus ? '发布' : '提交修改' }}
</el-button>
- <el-button v-if="['11', '21', '23', '24', '25', '31', '60'].includes(gdStatus)" @click="viewDescription">
- {{ gdStatusObj[gdStatus].reason }}
- </el-button>
- <el-button @click="addDescription" v-if="['20', '24', '25', '50'].includes(gdStatus)">
- {{ gdStatus === '50' ? '结算' : '申请取消' }}
- </el-button>
- <el-button @click="requestModification" v-if="['20', '25'].includes(gdStatus)">申请修改</el-button>
</template>
<template v-else>
- <el-button v-if="['21', '23'].includes(gdStatus)" @click="viewDescription">
+ <el-button v-if="['21', '23'].includes(gdStatus)" @click="viewDescription" color="#F2F3F5">
{{ gdStatusObj[gdStatus].reason }}
</el-button>
- <el-button v-if="gdStatus === '10'" @click="addDescription">拒绝接单</el-button>
- <el-button v-if="gdStatus === '10'" @click="statusChange(1)">接单</el-button>
- <el-button v-if="gdStatus === '22'" @click="statusChange(8)">不同意修改</el-button>
- <el-button v-if="gdStatus === '22'" @click="statusChange(7)">同意修改</el-button>
- <el-button v-if="gdStatus === '21'" @click="addDescription">不同意取消</el-button>
- <el-button v-if="gdStatus === '21'" @click="statusChange(5)">同意取消</el-button>
- <el-button v-if="gdStatus === '30'" @click="addDescription">协商修改</el-button>
- <el-button v-if="gdStatus === '31'" @click="statusChange(10)">同意</el-button>
+ <el-button v-if="gdStatus === '10'" @click="addDescription" color="#F2F3F5">拒绝接单</el-button>
+ <el-button v-if="gdStatus === '10'" @click="statusChange(1)" color="#4C34FF">接单</el-button>
+ <el-button v-if="gdStatus === '22'" @click="addDescription" color="#F2F3F5">不同意修改</el-button>
+ <el-button v-if="gdStatus === '22'" @click="statusChange(7)" color="#4C34FF">同意修改</el-button>
+ <el-button v-if="gdStatus === '21'" @click="addDescription" color="#F2F3F5">不同意取消</el-button>
+ <el-button v-if="gdStatus === '21'" @click="statusChange(5)" color="#4C34FF">同意取消</el-button>
+ <el-button v-if="gdStatus === '30'" @click="addDescription" color="#4C34FF">协商修改</el-button>
+ <el-button v-if="gdStatus === '31'" @click="statusChange(10)" color="#4C34FF">同意</el-button>
</template>
</template>
@@ -292,13 +301,14 @@
const processList = ref([])
let viewPlane
const hasPatrolTaskList = computed(() => ['30', '40', '50', '60'].includes(String(formData.value.workOrderStatus)))
+import droneIcon from '@/assets/images/orderView/orderManage/drone.png'
const gdStatusObj = {
'10': { reason: '拒绝原因', operationType: '2' },
'11': { reason: '拒绝原因' },
'20': { reason: '取消原因', operationType: '3' },
'21': { reason: '原因', operationType: '6' },
- '22': { reason: '驳回原因' },
+ '22': { reason: '驳回原因', operationType: '8' },
'23': { reason: '取消原因' },
'24': { reason: '驳回原因', operationType: '3' },
'25': { reason: '驳回原因', operationType: '3' },
@@ -332,9 +342,11 @@
})
}
-function requestModification() {
+// 申请修改按钮
+async function requestModification() {
suddenlyEdit.value = true
dialogMode.value = 'edit'
+ await getDeviceList()
nextTick(() => {
syncSelection()
viewPlane && viewer.entities.remove(viewPlane)
@@ -342,6 +354,7 @@
})
}
+// 填写说明弹框回调
function rejectSuccess() {
visible.value = false
emit('success')
@@ -378,9 +391,9 @@
const str = [...pointList.value, pointList.value[0]].map(item => `${item.longitude} ${item.latitude}`).join(',')
let geom = `POLYGON((${str}))`
const res = await gdManageDeviceListApi({
- deviceIds: formData.value.recommendDeviceIds,
- devicePayload: dialogMode.value === 'add' ? formData.value.deviceLoadDemand : '',
- geom: dialogMode.value === 'add' ? geom : '',
+ deviceIds: dialogMode.value === 'add' ? '' : formData.value.recommendDeviceIds,
+ devicePayload: formData.value?.deviceLoadDemand,
+ geom: geom,
})
deviceList.value = res?.data?.data ?? []
} catch (error) {
@@ -389,10 +402,10 @@
}
// 设备需求变化
-function loadDemandChange() {
+async function loadDemandChange() {
formData.value.recommendDeviceIds = ''
selectedDevices.value = []
- getDeviceList()
+ await getDeviceList()
syncSelection()
}
@@ -428,18 +441,9 @@
}
}
-watch(
- () => dateRange.value,
- newVal => {
- const range = dateRangeFormat(dateRange.value)
- formData.value.executeStartTime = range[0]
- formData.value.executeEndTime = range[1]
- }
-)
-
// 加载时间线list
function loadList() {
- gdWorkOrderFlowListApi({ workOrderId: formData.value.id,type: '0' }).then(res => {
+ gdWorkOrderFlowListApi({ workOrderId: formData.value.id, type: '0' }).then(res => {
processList.value = res.data.data
})
}
@@ -508,7 +512,7 @@
})
}
-// 同步关联场景
+// 回显选中设备
function syncSelection() {
if (!deviceTableRef.value) return
deviceTableRef.value.clearSelection()
@@ -527,25 +531,27 @@
})
}
-function setMapDevice() {
- gdManageDeviceListApi().then(res => {
- renderingDevice(res?.data?.data || [])
- })
-}
-
-import droneIcon from '@/assets/images/orderView/orderManage/drone.png'
-
-function renderingDevice(list) {
- // 渲染红点
+// 渲染
+function renderingAllDevice(list) {
list.forEach(item => {
const position = Cesium.Cartesian3.fromDegrees(item.longitude || 115.0, item.latitude || 27.11)
viewer.entities.add({
position: position,
billboard: {
image: droneIcon,
- width: 40,
- height: 40,
+ width: 30,
+ height: 30,
verticalOrigin: Cesium.VerticalOrigin.CENTER,
+ },
+ label: {
+ text: item.nickname,
+ font: '12px/1.5 Microsoft YaHei',
+ style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+ outlineWidth: 2,
+ outlineColor: Cesium.Color.WHITE,
+ horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
+ verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+ pixelOffset: new Cesium.Cartesian2(0, -20),
},
})
})
@@ -554,8 +560,10 @@
// 打开弹框
async function open({ mode = 'add', row } = {}) {
dialogMode.value = mode
- formData.value = dialogMode.value === 'add' ? initForm() : row
initMap()
+ const allDeviceRes = await gdManageDeviceListApi()
+ formData.value = dialogMode.value === 'add' ? initForm() : row
+ renderingAllDevice(allDeviceRes?.data?.data || [])
if (dialogMode.value === 'add') {
addPolygon()
} else {
@@ -563,10 +571,11 @@
hasPatrolTaskList.value && gdPatrolTaskPage()
dialogMode.value === 'edit' ? editPolygon() : viewPolygon()
}
- // setMapDevice()
+
await nextTick()
+ await getDeviceList()
syncSelection()
- getDeviceList()
+ highlightSelectedDevices()
}
// 初始化地图实例
@@ -576,6 +585,34 @@
viewer = map?.viewer || null
}
+// 高亮选中的设备
+function highlightSelectedDevices() {
+ const selectedIds = (formData.value.recommendDeviceIds || '').split(',').filter(Boolean)
+ if (!viewer?.entities) return
+ viewer.entities.values.forEach(entity => {
+ if (entity.billboard?.image?._value === droneIcon && entity.label) {
+ const device = deviceList.value.find(d => d.nickname === entity.label.text._value)
+ if (device && selectedIds.includes(String(device.id))) {
+ entity.label.fillColor = Cesium.Color.YELLOW
+ } else {
+ entity.label.fillColor = Cesium.Color.WHITE
+ }
+ }
+ })
+}
+
+watch(() => formData.value.recommendDeviceIds, highlightSelectedDevices)
+
+watch(
+ () => dateRange.value,
+ newVal => {
+ const range = dateRangeFormat(dateRange.value)
+ formData.value.executeStartTime = range[0]
+ formData.value.executeEndTime = range[1]
+ }
+)
+
+// 地图加载完毕
function mapReady() {
dialogMode.value === 'add' && mapRef.value.flyBoundary()
}
@@ -587,16 +624,19 @@
.content {
display: flex;
gap: 0 20px;
+ height: 680px;
.leftBox {
width: 0;
flex: 1;
display: flex;
+ overflow: auto;
flex-direction: column;
.gd-cesium {
width: 100%;
- height: 423px;
+ min-height: 380px;
+ flex: 1;
}
}
@@ -610,7 +650,11 @@
}
.processBox {
+ padding: 24px 0;
width: 312px;
+ border: 1px solid #e4e4e4;
+ overflow: auto;
+
.item-content {
position: relative;
.flowName {
diff --git a/applications/task-work-order/src/views/orderView/orderManage/orderManage/RefuseOrderDialog.vue b/applications/task-work-order/src/views/orderView/orderManage/orderManage/RefuseOrderDialog.vue
index b6df90d..adfa2b9 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/orderManage/RefuseOrderDialog.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/orderManage/RefuseOrderDialog.vue
@@ -42,7 +42,7 @@
<template #footer>
<el-button color="#F2F3F5" @click="visible = false">{{ dialogReadonly ? '关闭' : '取消' }}</el-button>
<el-button
- class="save-btn"
+ class=""
color="#4C34FF"
v-if="!dialogReadonly"
:loading="submitting"
diff --git a/applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue b/applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue
index 496a025..7864d2f 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue
+++ b/applications/task-work-order/src/views/orderView/orderManage/orderManage/index.vue
@@ -112,9 +112,9 @@
<el-table-column prop="createTime" show-overflow-tooltip label="工单创建时间" />
<el-table-column label="操作" class-name="operation-btns">
<template v-slot="{ row }">
- <el-link @click="openFormChange(row)">查看</el-link>
- <!--<el-link @click="openForm('edit', row)">编辑</el-link>-->
- <el-link @click="handleDelete(row)" v-if="requester">删除</el-link>
+ <el-link type="primary" @click="openFormChange(row)">查看</el-link>
+ <!--<el-link type="primary" @click="openForm('edit', row)">编辑</el-link>-->
+ <el-link type="primary" @click="handleDelete(row)" v-if="requester">删除</el-link>
</template>
</el-table-column>
</el-table>
@@ -236,7 +236,7 @@
function openFormChange(row) {
dialogVisible.value = true
nextTick(() => {
- const mode = ['11','25'].includes(row.workOrderStatus) && requester.value ? 'edit' : 'view'
+ const mode = ['11'].includes(row.workOrderStatus) && requester.value ? 'edit' : 'view'
dialogRef.value?.open({ mode, row })
})
}
diff --git a/applications/task-work-order/src/views/orderView/orderManage/orderManage/orderManageApi.js b/applications/task-work-order/src/views/orderView/orderManage/orderManage/orderManageApi.js
index 7460c97..4518436 100644
--- a/applications/task-work-order/src/views/orderView/orderManage/orderManage/orderManageApi.js
+++ b/applications/task-work-order/src/views/orderView/orderManage/orderManage/orderManageApi.js
@@ -53,6 +53,6 @@
return request({
url: `/drone-gd/workOrder/gdWorkOrderFlow/list`,
method: 'get',
- params,
+ params:{ descs: 'create_time', ...params },
})
}
diff --git a/applications/task-work-order/src/views/orderView/organizational/agenciesManagement/FormDiaLog.vue b/applications/task-work-order/src/views/orderView/organizational/agenciesManagement/FormDiaLog.vue
new file mode 100644
index 0000000..d29556b
--- /dev/null
+++ b/applications/task-work-order/src/views/orderView/organizational/agenciesManagement/FormDiaLog.vue
@@ -0,0 +1,181 @@
+<template>
+ <el-dialog
+ class="gd-dialog"
+ v-model="visible"
+ :title="titleEnum[dialogMode]"
+ @closed="visible = false"
+ destroy-on-close
+ :close-on-click-modal="false"
+ >
+ <el-row class="detail-row-view" v-if="dialogReadonly">
+ <el-col :span="12">
+ <div class="label">机构名称</div>
+ <div class="val">{{ formData.deptName }}</div>
+ </el-col>
+ <el-col :span="12">
+ <div class="label">所属区划</div>
+ <div class="val">{{ formData.areaName }}</div>
+ </el-col>
+ <el-col :span="12">
+ <div class="label">机构状态</div>
+ <div class="val"> {{ getDictLabel(formData.status, dictObj.institutionStatus) }}</div>
+ </el-col>
+ <el-col :span="12">
+ <div class="label">机构描述</div>
+ <div class="val">{{ formData.remark }}</div>
+ </el-col>
+ </el-row>
+
+ <el-form
+ class="gd-dialog-form"
+ v-else
+ ref="formRef"
+ :model="formData"
+ :rules="rules"
+ :disabled="dialogReadonly"
+ label-width="140px"
+ >
+ <el-row>
+ <el-col :span="12">
+ <el-form-item label="机构名称" prop="deptName">
+ <el-input class="gd-input" v-model="formData.deptName" placeholder="请输入" clearable />
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="所属区划" prop="areaCode">
+ <el-select
+ class="gd-select"
+ popper-class="gd-select-popper"
+ v-model="formData.areaCode"
+ placeholder="请选择"
+ clearable
+ >
+ <el-option v-for="item in regionOptions" :key="item.value" :label="item.title" :value="item.value" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="机构状态" prop="status">
+ <el-select
+ class="gd-select"
+ popper-class="gd-select-popper"
+ v-model="formData.status"
+ placeholder="请选择"
+ clearable
+ >
+ <el-option v-for="item in dictObj.institutionStatus" :key="item.dictKey"
+ :label="item.dictValue"
+ :value="item.dictKey" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="机构描述" prop="remark">
+ <el-input
+ class="gd-input"
+ v-model="formData.remark"
+ placeholder="请输入"
+ clearable
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ <template #footer v-if="!dialogReadonly">
+ <el-button color="#F2F3F5" @click="visible = false">{{ dialogReadonly ? '关闭' : '取消' }}</el-button>
+ <el-button
+ class="save-btn"
+ color="#4C34FF"
+ :loading="submitting"
+ :disabled="submitting"
+ @click="handleSubmit"
+ >
+ 保存
+ </el-button>
+ </template>
+ </el-dialog>
+</template>
+
+<script setup>
+import { getDictLabel } from '@ztzf/utils'
+import { computed, ref, inject, nextTick } from 'vue'
+import { ElMessage } from 'element-plus'
+import { fieldRules } from '@ztzf/utils'
+import {
+ agenciesSubmitApi,
+ agenciesDetailApi,
+} from './agenciesApi'
+
+// 初始化表单数据
+const initForm = () => ({
+ deptName: '',
+ areaCode: '',
+ status: '',
+ remark: '',
+ id: null,
+})
+
+const dictObj = inject('dictObj')
+const regionOptions = inject('regionOptions')
+
+const emit = defineEmits(['success'])
+const formRef = ref(null) // 表单实例
+const formData = ref(initForm()) // 表单数据
+const visible = defineModel() // 弹框显隐
+const dialogMode = ref('add') // 弹框模式
+const submitting = ref(false) // 提交中
+const dialogReadonly = computed(() => dialogMode.value === 'view')
+const titleEnum = ref({ edit: '编辑', view: '查看', add: '新增' })
+
+const rules = {
+ deptName: fieldRules(true),
+ areaCode: fieldRules(true),
+ status: fieldRules(true),
+ remark: fieldRules(true),
+}
+
+// 提交新增/编辑
+async function handleSubmit() {
+ const isValid = await formRef.value?.validate().catch(() => false)
+ if (!isValid) return
+ submitting.value = true
+ try {
+ await agenciesSubmitApi(formData.value)
+ ElMessage.success(dialogMode.value === 'add' ? '新增成功' : '更新成功')
+ visible.value = false
+ emit('success')
+ } finally {
+ submitting.value = false
+ }
+}
+
+// 加载详情
+async function loadDetail() {
+ if (!formData.value.id) return
+ const res = await agenciesDetailApi({ id: formData.value.id })
+ const data = res?.data?.data ?? {}
+ // 将 status 转换为字符串类型,与字典中的 dictKey 类型保持一致
+ if (data.status !== undefined) {
+ data.status = String(data.status)
+ }
+ // 将 areaCode 转换为字符串类型,与 regionOptions 中的 value 类型保持一致
+ if (data.areaCode !== undefined) {
+ data.areaCode = String(data.areaCode)
+ }
+ formData.value = data
+}
+
+// 打开弹框
+async function open({ mode = 'add', row } = {}) {
+ dialogMode.value = mode
+ formData.value = dialogMode.value === 'add' ? initForm() : row
+ if (dialogMode.value !== 'add') {
+ await loadDetail()
+ }
+}
+
+defineExpose({ open })
+</script>
+
+<style scoped lang="scss">
+</style>
diff --git a/applications/task-work-order/src/views/orderView/organizational/agenciesManagement/agenciesApi.js b/applications/task-work-order/src/views/orderView/organizational/agenciesManagement/agenciesApi.js
new file mode 100644
index 0000000..2f4dd8c
--- /dev/null
+++ b/applications/task-work-order/src/views/orderView/organizational/agenciesManagement/agenciesApi.js
@@ -0,0 +1,66 @@
+import request from '@/axios'
+
+// 列表
+export const agenciesPageApi = params => {
+ return request({
+ url: `/blade-system/dept/page`,
+ method: 'get',
+ params: { ...params },
+ })
+}
+
+// 新增或编辑
+export const agenciesSubmitApi = data => {
+ return request({
+ url: `/blade-system/dept/submit`,
+ method: 'post',
+ data,
+ })
+}
+
+// 删除
+export const agenciesRemoveApi = params => {
+ return request({
+ url: `/blade-system/dept/remove`,
+ method: 'post',
+ params,
+ })
+}
+
+// 详情
+export const agenciesDetailApi = params => {
+ return request({
+ url: `/blade-system/dept/detail`,
+ method: 'get',
+ params,
+ })
+}
+
+// 导入机构
+export const agenciesImportApi = (data,params) => {
+ return request({
+ url: `/blade-system/dept/import-region`,
+ method: 'post',
+ data,
+ params
+ })
+}
+
+// 导出机构
+export const agenciesExportApi = params => {
+ return request({
+ url: `/blade-system/dept/export-region`,
+ method: 'get',
+ params,
+ responseType: 'blob',
+ })
+}
+
+// 懒加载列表
+export const regionLazyTreeApi = params => {
+ return request({
+ url: `/blade-system/region/lazy-tree`,
+ method: 'get',
+ params,
+ })
+}
diff --git a/applications/task-work-order/src/views/orderView/organizational/agenciesManagement/index.vue b/applications/task-work-order/src/views/orderView/organizational/agenciesManagement/index.vue
new file mode 100644
index 0000000..e863da8
--- /dev/null
+++ b/applications/task-work-order/src/views/orderView/organizational/agenciesManagement/index.vue
@@ -0,0 +1,336 @@
+<template>
+ <basic-container>
+ <el-form ref="queryParamsRef" :model="searchParams" class="gd-search-form">
+ <el-form-item label="机构名称" prop="deptName">
+ <el-input
+ class="gd-input gray"
+ v-model="searchParams.deptName"
+ placeholder="请输入"
+ clearable
+ @clear="handleSearch"
+ />
+ </el-form-item>
+
+ <el-form-item label="机构编码" prop="bindCode">
+ <el-input
+ class="gd-input gray"
+ v-model="searchParams.bindCode"
+ placeholder="请输入"
+ clearable
+ @clear="handleSearch"
+ />
+ </el-form-item>
+
+ <el-form-item label="所属区划" prop="areaCode">
+ <el-select
+ class="gd-select gray"
+ popper-class="gd-select-popper"
+ v-model="searchParams.areaCode"
+ placeholder="请选择"
+ clearable
+ @change="handleSearch"
+ >
+ <el-option v-for="item in regionOptions" :key="item.value" :label="item.title" :value="item.value" />
+ </el-select>
+ </el-form-item>
+
+ <el-form-item class="gd-search-actions">
+ <el-button :icon="RefreshRight" @click="resetForm"></el-button>
+ <el-button class="search-btn" :icon="Search" @click="handleSearch"></el-button>
+ </el-form-item>
+ </el-form>
+
+ <div class="gd-table-toolbar">
+ <el-button :icon="Plus" color="#4C34FF" type="primary" @click="openForm('add')">新增机构</el-button>
+ <el-button :icon="Upload" @click="handleImport">导入机构</el-button>
+ <el-button :icon="Download" @click="handleExport">导出机构</el-button>
+ </div>
+
+ <div class="gd-table-container" v-loading="loading">
+ <div class="gd-table-content gd-table-content-bg">
+ <el-table class="gd-table" :data="list">
+ <el-table-column label="序号" width="80">
+ <template v-slot="{ $index }">
+ {{ ((searchParams.current - 1) * searchParams.size + $index + 1).toString().padStart(2, '0') }}
+ </template>
+ </el-table-column>
+ <el-table-column prop="bindCode" show-overflow-tooltip label="机构编码" />
+ <el-table-column prop="deptName" show-overflow-tooltip label="机构名称" />
+ <el-table-column prop="areaName" show-overflow-tooltip label="所属区划" />
+ <el-table-column prop="remark" show-overflow-tooltip label="机构描述" />
+ <el-table-column prop="status" show-overflow-tooltip label="机构状态">
+ <template v-slot="{ row }">
+ {{ getDictLabel(row.status, dictObj.institutionStatus) }}
+ </template>
+ </el-table-column>
+ <el-table-column label="操作" class-name="operation-btns" width="310">
+ <template v-slot="{ row }">
+ <el-link type="primary" @click="openForm('view', row)">查看</el-link>
+ <el-link type="primary" @click="openForm('edit', row)">编辑</el-link>
+ <el-link type="primary" @click="handleDelete(row)">删除</el-link>
+ <el-link type="primary" @click="toggleStatus(row)">{{row.status === 1 ? '禁用' : '启用'}}</el-link>
+ </template>
+ </el-table-column>
+ </el-table>
+ </div>
+
+ <div class="gd-pagination-parent">
+ <el-pagination
+ popper-class="gd-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>
+
+ <FormDiaLog ref="dialogRef" @success="getList" v-if="dialogVisible" v-model="dialogVisible" />
+
+ <!-- 导入机构弹框 -->
+ <el-dialog
+ class="gd-dialog"
+ append-to-body
+ v-model="isShowImportView"
+ title="导入机构"
+ :width="pxToRem(600)"
+ :close-on-click-modal="false"
+ :destroy-on-close="true"
+ @close="handleImportClose"
+ >
+ <el-form class="gd-dialog-form" ref="importFormRef" :model="importParams" :rules="importRules" label-width="140px">
+
+ <el-form-item label="上传文件" prop="file">
+ {{ importFileName }}
+ <el-upload class="avatar-uploader" action="" :show-file-list="false" :before-upload="onImportFileBefore">
+ <el-button size="small" type="primary">点击上传</el-button>
+ </el-upload>
+ </el-form-item>
+ </el-form>
+ <template #footer>
+ <el-button color="#F2F3F5" @click="isShowImportView = false">取消</el-button>
+ <el-button
+ class=""
+ color="#4C34FF"
+ :loading="importSubmitting"
+ :disabled="importSubmitting"
+ @click="submitImport(importFormRef)"
+ >
+ 导入
+ </el-button>
+ </template>
+ </el-dialog>
+ </basic-container>
+</template>
+
+<script setup>
+import { Search, RefreshRight, Plus, Delete, Upload, Download } from '@element-plus/icons-vue'
+import { onMounted, ref, provide, nextTick } from 'vue'
+import { ElMessage, ElMessageBox, ElUpload } from 'element-plus'
+import FormDiaLog from './FormDiaLog.vue'
+import {
+ agenciesPageApi,
+ agenciesRemoveApi,
+ agenciesImportApi,
+ agenciesExportApi,
+ regionLazyTreeApi,
+ agenciesSubmitApi
+} from './agenciesApi'
+import { getDictionaryByCode } from '@/api/system/dictbiz'
+import { getDictLabel } from '@ztzf/utils'
+import { pxToRem } from '@/utils/rem'
+// 初始化查询参数
+const initSearchParams = () => ({
+ deptName: '', // 机构名称
+ bindCode: '', // 机构编码
+ areaCode: '', // 所属区划
+ current: 1, // 当前页
+ size: 10, // 每页大小
+})
+const searchParams = ref(initSearchParams()) // 查询参数
+const total = ref(0) // 总条数
+const loading = ref(true) // 列表加载中
+const list = ref([]) // 列表数据
+const queryParamsRef = ref(null) // 查询表单实例
+const dialogRef = ref(null) // 弹框实例
+const dialogVisible = ref(false)
+const regionOptions = ref([]) // 区域选项
+const dictObj = ref({}) // 字典对象
+
+// 导入机构相关
+const isShowImportView = ref(false)
+const importFileName = ref('')
+const importParams = ref({
+ isCovered: '0',
+ file: '',
+})
+const importFormRef = ref()
+const importSubmitting = ref(false)
+const importRules = ref({
+ file: [{ required: true, message: '请上传文件', trigger: ['change'] }],
+})
+
+provide('regionOptions', regionOptions)
+provide('dictObj', dictObj)
+
+// 获取字典列表
+function getDictList() {
+ getDictionaryByCode('institutionStatus').then(res => {
+ dictObj.value = res.data.data
+ })
+}
+
+// 获取区域列表
+function getRegionList() {
+ regionLazyTreeApi({parentCode: '360800000000'}).then(res => {
+ console.log('区域列表', res.data.data);
+
+ regionOptions.value = res.data.data || []
+ })
+}
+
+// 获取列表
+async function getList() {
+ loading.value = true
+ try {
+ const res = await agenciesPageApi(searchParams.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.current = 1
+ getList()
+}
+
+// 新增/编辑/查看 弹框
+function openForm(mode, row) {
+ dialogVisible.value = true
+ nextTick(() => {
+ dialogRef.value?.open({ mode, row })
+ })
+}
+
+// 删除
+async function handleDelete(row) {
+ await ElMessageBox.confirm('确认删除该条记录吗?', '提示', {
+ type: 'warning',
+ customClass: 'gd-confirm-custom',
+ confirmButtonClass: 'gd-confirm-button',
+ cancelButtonClass: 'gd-confirm-cancel-button',
+ })
+ await agenciesRemoveApi({ ids: row.id })
+ ElMessage.success('删除成功')
+ getList()
+}
+
+// 切换机构状态
+async function toggleStatus(row) {
+ // 计算目标状态:当前为1则切换为0,当前为0则切换为1
+ const targetStatus = row.status === 1 ? 0 : 1
+ const actionText = targetStatus === 0 ? '禁用' : '启用'
+
+ await ElMessageBox.confirm(`确认${actionText}该机构吗?`, '提示', {
+ type: 'warning',
+ customClass: 'gd-confirm-custom',
+ confirmButtonClass: 'gd-confirm-button',
+ cancelButtonClass: 'gd-confirm-cancel-button',
+ })
+
+ try {
+ await agenciesSubmitApi({ ...row, status: targetStatus })
+ ElMessage.success(`${actionText}成功`)
+ getList()
+ } catch (error) {
+ ElMessage.error(`${actionText}失败`)
+ }
+}
+
+// 导入机构
+function handleImport() {
+ isShowImportView.value = true
+}
+
+// 导入机构弹框关闭
+function handleImportClose() {
+ importFileName.value = ''
+ importParams.value = {
+ isCovered: '0',
+ file: '',
+ }
+}
+
+// 上传文件前处理
+function onImportFileBefore(file) {
+ // 执行文件上传
+ let data = new FormData()
+ data.append('file', file)
+
+ agenciesImportApi(data, { isCovered: importParams.value.isCovered }).then(res => {
+ if (res.data.code === 200) {
+ ElMessage.success('导入成功')
+ // 保存文件名
+ importFileName.value = file.name
+ importParams.value.file = file
+ isShowImportView.value = false
+ getList()
+ } else {
+ ElMessage.error(res.msg || '导入失败')
+ }
+ })
+
+ return false // 阻止组件的默认上传行为
+}
+
+// 提交导入
+async function submitImport(formValidate) {
+ if (!formValidate) return
+ await formValidate.validate(async (valid, fields) => {
+ if (valid) {
+ importSubmitting.value = true
+ try {
+ // 这里实际上传文件的逻辑已经在onImportFileBefore中处理了
+ // 这里可以添加额外的验证或逻辑
+ } finally {
+ importSubmitting.value = false
+ }
+ }
+ })
+}
+
+// 导出机构
+function handleExport() {
+ agenciesExportApi(searchParams.value).then(res => {
+ const blob = new Blob([res.data])
+ const url = URL.createObjectURL(blob)
+ const a = document.createElement('a')
+ a.href = url
+ a.download = `机构列表${new Date().getTime()}.xlsx`
+ document.body.appendChild(a)
+ a.click()
+ document.body.removeChild(a)
+ URL.revokeObjectURL(url)
+ })
+}
+
+onMounted(() => {
+ getDictList()
+ getRegionList()
+ getList()
+})
+</script>
+
+<style scoped lang="scss">
+</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/orderView/organizational/zoningManagement/index.vue b/applications/task-work-order/src/views/orderView/organizational/zoningManagement/index.vue
new file mode 100644
index 0000000..3459668
--- /dev/null
+++ b/applications/task-work-order/src/views/orderView/organizational/zoningManagement/index.vue
@@ -0,0 +1,20 @@
+<template>
+ <div>
+ 区划管理
+ </div>
+</template>
+
+<script setup >
+/**
+ * @description index
+ * @date 2026-01-26 (周一) 10:50:43
+ */
+defineOptions({
+ name: 'index'
+})
+
+
+</script>
+
+<style scoped lang="scss">
+</style>
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/orderView/organizationalMessage/agenciesManagement/agenciesApi.js b/applications/task-work-order/src/views/orderView/organizationalMessage/agenciesManagement/agenciesApi.js
new file mode 100644
index 0000000..2f4dd8c
--- /dev/null
+++ b/applications/task-work-order/src/views/orderView/organizationalMessage/agenciesManagement/agenciesApi.js
@@ -0,0 +1,66 @@
+import request from '@/axios'
+
+// 列表
+export const agenciesPageApi = params => {
+ return request({
+ url: `/blade-system/dept/page`,
+ method: 'get',
+ params: { ...params },
+ })
+}
+
+// 新增或编辑
+export const agenciesSubmitApi = data => {
+ return request({
+ url: `/blade-system/dept/submit`,
+ method: 'post',
+ data,
+ })
+}
+
+// 删除
+export const agenciesRemoveApi = params => {
+ return request({
+ url: `/blade-system/dept/remove`,
+ method: 'post',
+ params,
+ })
+}
+
+// 详情
+export const agenciesDetailApi = params => {
+ return request({
+ url: `/blade-system/dept/detail`,
+ method: 'get',
+ params,
+ })
+}
+
+// 导入机构
+export const agenciesImportApi = (data,params) => {
+ return request({
+ url: `/blade-system/dept/import-region`,
+ method: 'post',
+ data,
+ params
+ })
+}
+
+// 导出机构
+export const agenciesExportApi = params => {
+ return request({
+ url: `/blade-system/dept/export-region`,
+ method: 'get',
+ params,
+ responseType: 'blob',
+ })
+}
+
+// 懒加载列表
+export const regionLazyTreeApi = params => {
+ return request({
+ url: `/blade-system/region/lazy-tree`,
+ method: 'get',
+ params,
+ })
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d21e108..e24baf1 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -28,8 +28,8 @@
specifier: ^1.4.4
version: 1.6.3
'@smallwei/avue':
- specifier: ^3.6.2
- version: 3.8.0
+ specifier: 3.6.2
+ version: 3.6.2
'@turf/turf':
specifier: ^6.5.0
version: 6.5.0
@@ -46,7 +46,7 @@
specifier: ^4.1.1
version: 4.1.1
avue-plugin-ueditor:
- specifier: ^1.0.4
+ specifier: 1.0.4
version: 1.0.4
axios:
specifier: ^1.8.3
@@ -232,7 +232,7 @@
version: 1.6.3
'@smallwei/avue':
specifier: 'catalog:'
- version: 3.8.0(element-plus@2.9.11(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))
+ version: 3.6.2(element-plus@2.9.11(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))
'@turf/turf':
specifier: 'catalog:'
version: 6.5.0
@@ -443,7 +443,7 @@
version: 1.6.3
'@smallwei/avue':
specifier: 'catalog:'
- version: 3.8.0(element-plus@2.9.11(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))
+ version: 3.6.2(element-plus@2.9.11(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))
'@turf/turf':
specifier: 'catalog:'
version: 6.5.0
@@ -651,7 +651,7 @@
version: 1.6.3
'@smallwei/avue':
specifier: 'catalog:'
- version: 3.8.0(element-plus@2.9.11(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))
+ version: 3.6.2(element-plus@2.9.11(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))
'@turf/turf':
specifier: 'catalog:'
version: 6.5.0
@@ -3040,8 +3040,8 @@
'@sinonjs/fake-timers@8.1.0':
resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==}
- '@smallwei/avue@3.8.0':
- resolution: {integrity: sha512-htgZsATcTtBVfoHhU7i6fBNnHT222hKGVelGX7IBldNUVPdJHsdnC4gL+FMs6w83Z6GhIeXuWgleoYxllbfAnQ==}
+ '@smallwei/avue@3.6.2':
+ resolution: {integrity: sha512-Ifkt0o7KLsAMptfoNMG7qYS86OL2pEet761wWZyZGu8e48wuNNPOfqx5jnibGjx2oIoKtYUFh7tFdllOCth2EQ==}
peerDependencies:
element-plus: '>=2.2.0'
vue: '>=3.2.0'
@@ -12065,7 +12065,7 @@
dependencies:
'@sinonjs/commons': 1.8.6
- '@smallwei/avue@3.8.0(element-plus@2.9.11(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))':
+ '@smallwei/avue@3.6.2(element-plus@2.9.11(vue@3.5.27(typescript@5.9.3)))(vue@3.5.27(typescript@5.9.3))':
dependencies:
'@element-plus/icons-vue': 2.3.2(vue@3.5.27(typescript@5.9.3))
countup.js: 1.9.3
@@ -13590,30 +13590,30 @@
- '@vue/composition-api'
- vue
- '@wangeditor-next/basic-modules@1.5.47(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)':
+ '@wangeditor-next/basic-modules@1.5.47(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)':
dependencies:
- '@wangeditor-next/core': 1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)
- dom7: 4.0.6
+ '@wangeditor-next/core': 1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)
+ dom7: 3.0.0
is-url: 1.2.4
lodash.throttle: 4.1.1
- nanoid: 5.1.6
- slate: 0.82.1
+ nanoid: 3.3.11
+ slate: 0.72.8
snabbdom: 3.6.3
- '@wangeditor-next/code-highlight@1.3.43(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.82.1)(snabbdom@3.6.3)':
+ '@wangeditor-next/code-highlight@1.3.43(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.82.1)(snabbdom@3.6.3)':
dependencies:
- '@wangeditor-next/core': 1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)
+ '@wangeditor-next/core': 1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)
dom7: 4.0.6
prismjs: 1.30.0
slate: 0.82.1
snabbdom: 3.6.3
- '@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)':
+ '@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)':
dependencies:
'@types/event-emitter': 0.3.5
'@uppy/core': 2.3.4
'@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
- dom7: 4.0.6
+ dom7: 3.0.0
event-emitter: 0.3.5
html-void-elements: 3.0.0
i18next: 23.16.8
@@ -13624,9 +13624,9 @@
lodash.foreach: 4.5.0
lodash.throttle: 4.1.1
lodash.toarray: 4.4.0
- nanoid: 5.1.6
+ nanoid: 3.3.11
scroll-into-view-if-needed: 3.1.0
- slate: 0.82.1
+ slate: 0.72.8
slate-history: 0.109.0(slate@0.82.1)
snabbdom: 3.6.3
@@ -13634,13 +13634,13 @@
dependencies:
'@uppy/core': 2.3.4
'@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
- '@wangeditor-next/basic-modules': 1.5.47(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)
- '@wangeditor-next/code-highlight': 1.3.43(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.82.1)(snabbdom@3.6.3)
- '@wangeditor-next/core': 1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)
- '@wangeditor-next/list-module': 1.1.52(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.82.1)(snabbdom@3.6.3)
- '@wangeditor-next/table-module': 1.6.60(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.debounce@4.0.8)(lodash.throttle@4.1.1)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)
- '@wangeditor-next/upload-image-module': 1.1.50(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/basic-modules@1.5.47(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.foreach@4.5.0)(slate@0.82.1)(snabbdom@3.6.3)
- '@wangeditor-next/video-module': 1.3.51(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)
+ '@wangeditor-next/basic-modules': 1.5.47(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)
+ '@wangeditor-next/code-highlight': 1.3.43(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.82.1)(snabbdom@3.6.3)
+ '@wangeditor-next/core': 1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)
+ '@wangeditor-next/list-module': 1.1.52(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.82.1)(snabbdom@3.6.3)
+ '@wangeditor-next/table-module': 1.6.60(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.debounce@4.0.8)(lodash.throttle@4.1.1)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)
+ '@wangeditor-next/upload-image-module': 1.1.50(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/basic-modules@1.5.47(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.foreach@4.5.0)(slate@0.82.1)(snabbdom@3.6.3)
+ '@wangeditor-next/video-module': 1.3.51(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(dom7@4.0.6)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)
dom7: 4.0.6
is-hotkey: 0.2.0
lodash.camelcase: 4.3.0
@@ -13653,16 +13653,16 @@
slate: 0.82.1
snabbdom: 3.6.3
- '@wangeditor-next/list-module@1.1.52(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.82.1)(snabbdom@3.6.3)':
+ '@wangeditor-next/list-module@1.1.52(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(dom7@4.0.6)(slate@0.82.1)(snabbdom@3.6.3)':
dependencies:
- '@wangeditor-next/core': 1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)
+ '@wangeditor-next/core': 1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)
dom7: 4.0.6
slate: 0.82.1
snabbdom: 3.6.3
- '@wangeditor-next/table-module@1.6.60(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.debounce@4.0.8)(lodash.throttle@4.1.1)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)':
+ '@wangeditor-next/table-module@1.6.60(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.debounce@4.0.8)(lodash.throttle@4.1.1)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)':
dependencies:
- '@wangeditor-next/core': 1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)
+ '@wangeditor-next/core': 1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)
dom7: 4.0.6
lodash.debounce: 4.0.8
lodash.throttle: 4.1.1
@@ -13670,22 +13670,22 @@
slate: 0.82.1
snabbdom: 3.6.3
- '@wangeditor-next/upload-image-module@1.1.50(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/basic-modules@1.5.47(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.foreach@4.5.0)(slate@0.82.1)(snabbdom@3.6.3)':
+ '@wangeditor-next/upload-image-module@1.1.50(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/basic-modules@1.5.47(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.foreach@4.5.0)(slate@0.82.1)(snabbdom@3.6.3)':
dependencies:
'@uppy/core': 2.3.4
'@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
- '@wangeditor-next/basic-modules': 1.5.47(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(lodash.throttle@4.1.1)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)
- '@wangeditor-next/core': 1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)
+ '@wangeditor-next/basic-modules': 1.5.47(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)
+ '@wangeditor-next/core': 1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)
dom7: 4.0.6
lodash.foreach: 4.5.0
slate: 0.82.1
snabbdom: 3.6.3
- '@wangeditor-next/video-module@1.3.51(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3))(dom7@4.0.6)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)':
+ '@wangeditor-next/video-module@1.3.51(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(@wangeditor-next/core@1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3))(dom7@4.0.6)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)':
dependencies:
'@uppy/core': 2.3.4
'@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4)
- '@wangeditor-next/core': 1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@4.0.6)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@5.1.6)(slate@0.82.1)(snabbdom@3.6.3)
+ '@wangeditor-next/core': 1.7.45(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4))(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.11)(slate@0.72.8)(snabbdom@3.6.3)
dom7: 4.0.6
nanoid: 5.1.6
slate: 0.82.1
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 17f9d40..c0d477a 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -11,10 +11,10 @@
"@saber/nf-design-base-elp": "^1.3.0"
"@saber/nf-form-design-elp": "^1.4.1"
"@saber/nf-form-elp": "^1.4.4"
- "@smallwei/avue": "^3.6.2"
+ "@smallwei/avue": "3.6.2"
"@turf/turf": "^6.5.0"
"animate.css": "^4.1.1"
- "avue-plugin-ueditor": "^1.0.4"
+ "avue-plugin-ueditor": "1.0.4"
"axios": "^1.8.3"
"cesium": "1.126.0"
"codemirror": "^5.65.16"
diff --git a/uniapps/work-app/src/api/map.js b/uniapps/work-app/src/api/map.js
index 9e905bb..dbd1f17 100644
--- a/uniapps/work-app/src/api/map.js
+++ b/uniapps/work-app/src/api/map.js
@@ -7,3 +7,11 @@
data: { hidden_flag: 0, ...data },
})
}
+// 位置上报
+export const reportLocationApi = data => {
+ return request({
+ url: '/webservice/jaUserTrajectory/reportLocation',
+ method: 'post',
+ data,
+ })
+}
\ No newline at end of file
diff --git a/uniapps/work-app/src/pages/map/index.vue b/uniapps/work-app/src/pages/map/index.vue
index 2236da4..2ee54c8 100644
--- a/uniapps/work-app/src/pages/map/index.vue
+++ b/uniapps/work-app/src/pages/map/index.vue
@@ -1,13 +1,3 @@
-<!--
- * @Author : yuan
- * @Date : 2025-12-03 14:20:57
- * @LastEditors : yuan
- * @LastEditTime : 2025-12-20 16:49:02
- * @FilePath : \src\pages\map\index.vue
- * @Description :
- * Copyright 2025 OBKoro1, All Rights Reserved.
- * 2025-12-03 14:20:57
--->
<template>
<view class="page-wrap">
<WebViewPlus :src="`${viewUrl}`" @webMessage="onPostMessage" />
diff --git a/uniapps/work-app/src/pages/work/index.vue b/uniapps/work-app/src/pages/work/index.vue
index 7295f81..7cccdb0 100644
--- a/uniapps/work-app/src/pages/work/index.vue
+++ b/uniapps/work-app/src/pages/work/index.vue
@@ -2,7 +2,7 @@
<div class="eventTickets" :style="{ paddingTop: topMargin + 'px' }">
<div class="searchTop">
- <up-search placeholder="请输入关键字搜索" :animation="true" v-model="listParams.keyword" :show-action="false" @search="handleSearch"></up-search>
+ <up-search placeholder="请输入关键字搜索" :animation="true" v-model="listParams.keyword" :show-action="false" @search="handleSearch" @clear="handleClear"></up-search>
</div>
<div class="listBox">
<div class="tabs-container">
@@ -18,6 +18,11 @@
<div class="itemContent">{{formatDate(item.createTime) }}</div>
</div>
</div>
+ </div>
+
+ <!-- 暂无数据提示 -->
+ <div class="noData" v-if="!loading && dataList.length === 0">
+ <text>暂无数据</text>
</div>
<!-- 加载提示 -->
@@ -151,6 +156,15 @@
// 搜索功能
const handleSearch = () => {
+ listParams.value.current = 1
+ hasMore.value = true
+ dataList.value = []
+ getDataList()
+ getstatusCountData()
+}
+// 清除搜索
+const handleClear = () => {
+ listParams.value.keyword = ''
listParams.value.current = 1
hasMore.value = true
dataList.value = []
@@ -295,5 +309,15 @@
color: #999;
width: 100%;
}
+
+ .noData {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 300rpx;
+ font-size: 28rpx;
+ color: #999;
+ width: 100%;
+ }
}
</style>
diff --git a/uniapps/work-app/src/store/modules/location.js b/uniapps/work-app/src/store/modules/location.js
index ebf8e9d..b68a86b 100644
--- a/uniapps/work-app/src/store/modules/location.js
+++ b/uniapps/work-app/src/store/modules/location.js
@@ -1,5 +1,6 @@
import { defineStore } from 'pinia'
import locationUtil from '@/utils/location.js'
+import { reportLocationApi } from '@/api/map.js'
const useLocationStore = defineStore('location', {
state: () => ({
@@ -12,7 +13,9 @@
// 位置更新间隔(毫秒)
updateInterval: 5000,
// 位置监听器ID
- watcherId: null
+ watcherId: null,
+ // 上次位置上报时间
+ lastReportTime: 0
}),
getters: {
@@ -115,13 +118,32 @@
},
/**
- * 位置信息上报(可根据实际需求实现)
+ * 位置信息上报
* @param {Object} location 位置信息
*/
- reportLocation(location) {
- // 这里可以添加位置信息上报到服务器的逻辑
- // 例如:api.uploadLocation(location)
- // console.log('位置上报:', location);
+ async reportLocation(location) {
+
+ try {
+ const now = Date.now();
+ // 检查是否达到上报时间间隔(1分钟)
+ if (now - this.lastReportTime >= 60000) {
+ // 构造请求参数
+ const params = {
+ longitude: location.longitude,
+ latitude: location.latitude,
+ // reportTime: new Date().toISOString()
+ };
+
+ // 调用位置上报接口
+ const result = await reportLocationApi(params);
+ console.log('位置上报成功:', result);
+
+ // 更新上次上报时间
+ this.lastReportTime = now;
+ }
+ } catch (error) {
+ console.error('位置上报失败:', error);
+ }
},
/**
--
Gitblit v1.9.3