From 8173d75efc2390971d4609fc9a4eba35e2cfdfc9 Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Mon, 02 Feb 2026 10:38:24 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 applications/task-work-order/src/views/orderView/orderDataManage/dataObjection/FormDiaLog.vue |    1 
 applications/task-work-order/src/views/orderView/appConfiguration/materials/接口文档.txt          |    0 
 applications/task-work-order/src/views/orderView/appConfiguration/inventory/index.vue         |   20 ++++
 applications/task-work-order/src/views/orderView/appConfiguration/inventory/接口文档.txt          |  105 +++++++++++++++++++++
 applications/drone-command/src/components/map-container/device-map-container.vue              |  100 ++++++++++++++++---
 applications/task-work-order/src/views/orderView/appConfiguration/materials/index.vue         |   20 ++++
 applications/drone-command/src/api/dataCockpit/index.js                                       |   11 ++
 7 files changed, 237 insertions(+), 20 deletions(-)

diff --git a/applications/drone-command/src/api/dataCockpit/index.js b/applications/drone-command/src/api/dataCockpit/index.js
index 68024bd..21805e2 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-26 19:02:07
+ * @LastEditTime : 2026-02-02 09:45:21
  * @FilePath     : \applications\drone-command\src\api\dataCockpit\index.js
  * @Description  : 
  * Copyright 2026 OBKoro1, All Rights Reserved. 
@@ -83,6 +83,15 @@
 	})
 }
 
+// 最新 --- 数据驾驶舱地图聚合
+export const newCockpitAggregationApi = (params) => {
+	return request({
+		url: '/drone-fw/cockpit/dataCockpit/statisticalDeviceOut',
+		method: 'get',
+		params
+	})
+}
+
 // 区域列表
 export const areaDivideListApi = (params) => {
 	return request({
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 650d950..7819129 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
@@ -53,7 +53,7 @@
 
 import { fwDefenseSceneManageListApi } from '@/views/areaManage/sceneManage/sceneManageApi'
 
-import { cockpitAggregationApi } from '@/api/dataCockpit'
+import { newCockpitAggregationApi } from '@/api/dataCockpit'
 import layerControlIcon from '@/assets/images/dataCockpit/layerControl.png'
 import equipmentIcon from '@/assets/images/dataCockpit/map/equipment.png'
 import offlineEquipmentIcon from '@/assets/images/dataCockpit/map/offline-equipment.png'
@@ -132,9 +132,9 @@
 let favoritePulseElapsed = 0
 const favoritePulseEntities = []
 const pulseBaseColor = Cesium.Color.fromCssColorString('#FF3B30')
-const PULSE_MIN_RADIUS_M = 60
-const PULSE_MAX_RADIUS_M = 180
-const PULSE_DURATION_S = 1.6
+const PULSE_MIN_RADIUS_M = 2
+const PULSE_MAX_RADIUS_M = 30
+const PULSE_DURATION_S = 1.4
 const detailVisible = ref(true)
 const clusterVisible = ref(false)
 const countyCenterMap = new Map()
@@ -217,31 +217,93 @@
 	return canvas
 }
 
+class PulseSphereMaterialProperty {
+	constructor(color, speed = 1.2, bands = 3.0, softness = 0.18) {
+		this._definitionChanged = new Cesium.Event()
+		this.color = color
+		this.speed = speed
+		this.bands = bands
+		this.softness = softness
+	}
+	get isConstant() {
+		return true
+	}
+	get definitionChanged() {
+		return this._definitionChanged
+	}
+	getType() {
+		return 'PulseSphereMaterial'
+	}
+	getValue(_time, result = {}) {
+		result.color = this.color
+		result.time = (performance.now() / 1000) * this.speed
+		result.bands = this.bands
+		result.softness = this.softness
+		return result
+	}
+	equals(other) {
+		return (
+			other instanceof PulseSphereMaterialProperty &&
+			Cesium.Color.equals(this.color, other.color) &&
+			this.speed === other.speed &&
+			this.bands === other.bands &&
+			this.softness === other.softness
+		)
+	}
+}
+
+let pulseSphereMaterial = null
+const getPulseSphereMaterial = () => {
+	if (pulseSphereMaterial) return pulseSphereMaterial
+	Cesium.Material._materialCache.addMaterial('PulseSphereMaterial', {
+		fabric: {
+			type: 'PulseSphereMaterial',
+			uniforms: {
+				color: pulseBaseColor.withAlpha(0.45),
+				time: 0,
+				bands: 3.0,
+				softness: 0.18,
+			},
+			source: `
+				czm_material czm_getMaterial(czm_materialInput materialInput)
+				{
+					czm_material material = czm_getDefaultMaterial(materialInput);
+					vec3 normalEC = normalize(materialInput.normalEC);
+					vec3 viewEC = normalize(-materialInput.positionToEyeEC);
+					float ndv = max(dot(normalEC, viewEC), 0.0);
+					float fresnel = pow(1.0 - ndv, 1.6);
+					float wave = sin((ndv * bands + time) * 6.2831853);
+					float ring = smoothstep(-softness, softness, wave);
+					float alpha = (ring * 0.6 + fresnel * 0.4) * color.a;
+					material.diffuse = color.rgb;
+					material.alpha = alpha;
+					return material;
+				}
+			`,
+		},
+		translucent: () => true,
+	})
+	pulseSphereMaterial = new PulseSphereMaterialProperty(pulseBaseColor.withAlpha(0.45), 1.1, 3.2, 0.22)
+	return pulseSphereMaterial
+}
+
 const createFavoritePulseEntity = (billboard) => {
 	if (!viewer || !billboard) return
-	const material = new Cesium.ImageMaterialProperty({
-		image: getPulseCanvas(),
-		transparent: true,
-	})
+	const material = getPulseSphereMaterial()
 	const pulse = {
 		material,
 		offset: Math.random() * PULSE_DURATION_S,
 		entity: null,
 	}
-	const getPulseHeight = () => {
-		const pos = getBillboardPosition(billboard)
-		if (!pos) return 0
-		const carto = Cesium.Cartographic.fromCartesian(pos)
-		return carto?.height ?? 0
+	const getPulseRadius3D = () => {
+		const radius = getPulseRadius(pulse)
+		return new Cesium.Cartesian3(radius, radius, radius)
 	}
 	pulse.entity = viewer.entities.add({
 		position: new Cesium.CallbackProperty(() => getBillboardPosition(billboard), false),
-		ellipse: {
-			semiMajorAxis: new Cesium.CallbackProperty(() => getPulseRadius(pulse), false),
-			semiMinorAxis: new Cesium.CallbackProperty(() => getPulseRadius(pulse), false),
+		ellipsoid: {
+			radii: new Cesium.CallbackProperty(() => getPulseRadius3D(), false),
 			material,
-			height: new Cesium.CallbackProperty(() => getPulseHeight(), false),
-			heightReference: Cesium.HeightReference.NONE,
 		},
 	})
 	favoritePulseEntities.push(pulse)
@@ -1233,7 +1295,7 @@
 
 const loadAggregation = async () => {
 	try {
-		const res = await cockpitAggregationApi({
+		const res = await newCockpitAggregationApi({
 			effectiveRangeKmIsNotNull: 1
 		})
 		renderAggregation(res?.data?.data ?? [])
diff --git a/applications/task-work-order/src/views/orderView/appConfiguration/inventory/index.vue b/applications/task-work-order/src/views/orderView/appConfiguration/inventory/index.vue
new file mode 100644
index 0000000..e30cfe6
--- /dev/null
+++ b/applications/task-work-order/src/views/orderView/appConfiguration/inventory/index.vue
@@ -0,0 +1,20 @@
+<template>
+ <div>
+    实施清单
+ </div>
+</template>
+
+<script setup >
+/**
+ * @description index
+ * @date 2026-02-02 (周一) 09:25:52
+ */
+defineOptions({
+ name: 'index'
+})
+
+
+</script>
+
+<style scoped >
+</style>
\ No newline at end of file
diff --git "a/applications/task-work-order/src/views/orderView/appConfiguration/inventory/\346\216\245\345\217\243\346\226\207\346\241\243.txt" "b/applications/task-work-order/src/views/orderView/appConfiguration/inventory/\346\216\245\345\217\243\346\226\207\346\241\243.txt"
new file mode 100644
index 0000000..e89ba3a
--- /dev/null
+++ "b/applications/task-work-order/src/views/orderView/appConfiguration/inventory/\346\216\245\345\217\243\346\226\207\346\241\243.txt"
@@ -0,0 +1,105 @@
+
+
+## 分页
+
+
+**接口地址**:`/implement/gdImplementList/page`
+
+
+**请求方式**:`GET`
+
+
+**请求数据类型**:`application/x-www-form-urlencoded`
+
+
+**响应数据类型**:`*/*`
+
+
+**接口描述**:<p>传入gdImplementList</p>
+
+
+
+**请求参数**:
+
+
+**请求参数**:
+
+
+| 参数名称 | 参数说明 | 请求类型    | 是否必须 | 数据类型 | schema |
+| -------- | -------- | ----- | -------- | -------- | ------ |
+|areaCode|所属区划编码|query|false|string||
+|current|当前页|query|false|integer(int32)||
+|matterCode|事项编码|query|false|string||
+|matterName|事项名称|query|false|string||
+|size|每页的数量|query|false|integer(int32)||
+
+
+**响应状态**:
+
+
+| 状态码 | 说明 | schema |
+| -------- | -------- | ----- | 
+|200|OK|R«IPage«GdImplementListVO»»|
+|401|Unauthorized||
+|403|Forbidden||
+|404|Not Found||
+
+
+**响应参数**:
+
+
+| 参数名称 | 参数说明 | 类型 | schema |
+| -------- | -------- | ----- |----- | 
+|code|状态码|integer(int32)|integer(int32)|
+|data|承载数据|IPage«GdImplementListVO»|IPage«GdImplementListVO»|
+|&emsp;&emsp;current||integer(int64)||
+|&emsp;&emsp;pages||integer(int64)||
+|&emsp;&emsp;records||array|GdImplementListVO|
+|&emsp;&emsp;&emsp;&emsp;areaCode|所属区划编码|string||
+|&emsp;&emsp;&emsp;&emsp;areaName|所属区划名称|string||
+|&emsp;&emsp;&emsp;&emsp;catalogCode|目录编码|string||
+|&emsp;&emsp;&emsp;&emsp;id|主键id|integer||
+|&emsp;&emsp;&emsp;&emsp;implementCode|实施编码|string||
+|&emsp;&emsp;&emsp;&emsp;implementName|实施清单名称|string||
+|&emsp;&emsp;&emsp;&emsp;matterCode|事项编码|string||
+|&emsp;&emsp;&emsp;&emsp;matterName|事项名称|string||
+|&emsp;&emsp;&emsp;&emsp;orgCode|所属机构编码|string||
+|&emsp;&emsp;&emsp;&emsp;orgName|所属机构名称|string||
+|&emsp;&emsp;&emsp;&emsp;processDefinitionId|流程定义主键|string||
+|&emsp;&emsp;&emsp;&emsp;processInstanceId|流程实例主键|string||
+|&emsp;&emsp;size||integer(int64)||
+|&emsp;&emsp;total||integer(int64)||
+|msg|返回消息|string||
+|success|是否成功|boolean||
+
+
+**响应示例**:
+```javascript
+{
+	"code": 0,
+	"data": {
+		"current": 0,
+		"pages": 0,
+		"records": [
+			{
+				"areaCode": "",
+				"areaName": "",
+				"catalogCode": "",
+				"id": 0,
+				"implementCode": "",
+				"implementName": "",
+				"matterCode": "",
+				"matterName": "",
+				"orgCode": "",
+				"orgName": "",
+				"processDefinitionId": "",
+				"processInstanceId": ""
+			}
+		],
+		"size": 0,
+		"total": 0
+	},
+	"msg": "",
+	"success": true
+}
+```
\ No newline at end of file
diff --git a/applications/task-work-order/src/views/orderView/appConfiguration/materials/index.vue b/applications/task-work-order/src/views/orderView/appConfiguration/materials/index.vue
new file mode 100644
index 0000000..b6161c6
--- /dev/null
+++ b/applications/task-work-order/src/views/orderView/appConfiguration/materials/index.vue
@@ -0,0 +1,20 @@
+<template>
+ <div>
+    材料配置
+ </div>
+</template>
+
+<script setup >
+/**
+ * @description index
+ * @date 2026-02-02 (周一) 09:26:21
+ */
+defineOptions({
+ name: 'index'
+})
+
+
+</script>
+
+<style scoped >
+</style>
\ No newline at end of file
diff --git "a/applications/task-work-order/src/views/orderView/appConfiguration/materials/\346\216\245\345\217\243\346\226\207\346\241\243.txt" "b/applications/task-work-order/src/views/orderView/appConfiguration/materials/\346\216\245\345\217\243\346\226\207\346\241\243.txt"
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ "b/applications/task-work-order/src/views/orderView/appConfiguration/materials/\346\216\245\345\217\243\346\226\207\346\241\243.txt"
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 c0724c1..0ef053d 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
@@ -8,6 +8,7 @@
 		:close-on-click-modal="false"
 	>
 		<div class="detail-container  detail-container1" v-if="dialogReadonly">
+			<div class="detail-title">异议详情</div>
 			<el-row class="detail-row-view">
 				<el-col :span="12">
 					<div class="label">标题</div>

--
Gitblit v1.9.3