From 6a15a201470e1f1ca7323b7cb8cee9a8a41c733f Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Tue, 03 Feb 2026 17:31:15 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 applications/drone-command/src/components/map-container/device-map-container.vue |    7 
 uniapps/work-wx/src/subPackages/deviceRegistration/add.vue                       |    6 
 uniapps/work-wx/src/subPackages/flightApplication/add.vue                        |   22 
 applications/drone-command/env/.env.development                                  |    4 
 uniapps/work-wx/src/subPackages/deviceRegistration/details.vue                   |   31 +
 applications/drone-command/src/api/dataCockpit/index.js                          |   20 +
 applications/mobile-web-view/src/appPages/work/workDetail/index.vue              | 1023 +++--------------------------------------------------
 7 files changed, 131 insertions(+), 982 deletions(-)

diff --git a/applications/drone-command/env/.env.development b/applications/drone-command/env/.env.development
index 67d4a44..b537c02 100644
--- a/applications/drone-command/env/.env.development
+++ b/applications/drone-command/env/.env.development
@@ -2,7 +2,7 @@
  # @Author       : yuan
  # @Date         : 2026-01-31 14:34:31
  # @LastEditors  : yuan
- # @LastEditTime : 2026-02-03 15:52:27
+ # @LastEditTime : 2026-02-03 17:22:33
  # @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.168
+VITE_APP_URL=http://192.168.1.33
 
 #新大屏地址
 VITE_APP_DASHBOARD_URL='https://wrj.shuixiongit.com/command-center-dashboard/'
diff --git a/applications/drone-command/src/api/dataCockpit/index.js b/applications/drone-command/src/api/dataCockpit/index.js
index 21805e2..6432650 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-02-02 09:45:21
+ * @LastEditTime : 2026-02-03 17:21:56
  * @FilePath     : \applications\drone-command\src\api\dataCockpit\index.js
  * @Description  : 
  * Copyright 2026 OBKoro1, All Rights Reserved. 
@@ -100,3 +100,21 @@
 		params
 	})
 }
+
+// 查list --- 区域
+export const newAreaDivideList = params => {
+	return request({
+		url: `/drone-fw/cockpit/dataCockpit/areaDivideList`,
+		method: 'get',
+		params,
+	})
+}
+
+// 查list
+export const newDefenseSceneManageList = params => {
+	return request({
+		url: `/drone-fw/cockpit/dataCockpit/defenseSceneManageList`,
+		method: 'get',
+		params,
+	})
+}
\ No newline at end of file
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 7819129..7d6383c 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
@@ -49,9 +49,8 @@
 import CommonCesiumMap from '@/components/map-container/common-cesium-map.vue'
 import { buildEllipsePositions } from '@/utils/cesium/shapeTools'
 import { AREA_TYPE_STYLE_MAP, BUFFER_LEVEL_STYLES, DEFAULT_AREA_STYLE } from '@ztzf/constants'
-import { fwAreaDivideListApi } from '@/views/areaManage/partition/partitionApi'
 
-import { fwDefenseSceneManageListApi } from '@/views/areaManage/sceneManage/sceneManageApi'
+import { newAreaDivideList, newDefenseSceneManageList } from '@/api/dataCockpit/index'
 
 import { newCockpitAggregationApi } from '@/api/dataCockpit'
 import layerControlIcon from '@/assets/images/dataCockpit/layerControl.png'
@@ -1142,7 +1141,7 @@
 const loadPartitions = async () => {
 	if (!viewer) return
 	try {
-		const res = await fwAreaDivideListApi({
+		const res = await newAreaDivideList({
 			isSetSceneManage: 1,
 			flyTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
 		})
@@ -1306,7 +1305,7 @@
 
 const loadCommandPosts = async () => {
 	try {
-		const res = await fwDefenseSceneManageListApi({
+		const res = await newDefenseSceneManageList({
 			time: dayjs().format('YYYY-MM-DD HH:mm:ss')
 		})
 		renderCommandPosts(res?.data?.data ?? [])
diff --git a/applications/mobile-web-view/src/appPages/work/workDetail/index.vue b/applications/mobile-web-view/src/appPages/work/workDetail/index.vue
index a3c2d32..90aada8 100644
--- a/applications/mobile-web-view/src/appPages/work/workDetail/index.vue
+++ b/applications/mobile-web-view/src/appPages/work/workDetail/index.vue
@@ -10,641 +10,82 @@
 				</van-swipe>
 
 				<van-image-preview v-model:show="previewShow" :images="getImageList" :initial-index="previewIndex" />
-				<div class="detailTitle">
-					<div class="titleText">
-						<div class="itemStatus">
-							<span v-if="currentDetail.status === 0" style="background-color: #ff7411"></span>
-							<span v-else-if="currentDetail.status === 2" style="background-color: #ff472f"></span>
-							<span v-else-if="currentDetail.status === 3" style="background-color: #ffc300"></span>
-							<span v-else-if="currentDetail.status === 4" style="background-color: #06d957"></span>
-							<div>{{ currentDetail.event_name }}</div>
-						</div>
-						<div class="timeNavigation">
-							<p>{{ formatDate(currentDetail.create_time) }}</p>
-							<img @click="jumpMap(currentDetail)" src="/src/appDataSource/appwork/navigation.svg"
-								alt="" />
-						</div>
-					</div>
-				</div>
 			</div>
 		</div>
-		<!-- 步骤条 -->
-		<div class="stepBox">
-			<div class="stepContainer">
-				<van-steps direction="vertical" :active="currentStep">
-					<van-step v-for="(step, index) in displayedSteps" :key="step.status">
-						<div class="horizontal-step">
-							<span class="step-title" :class="getStatusClass(index)">{{ step.title }}</span>
+	<!-- 工单内容 -->
+    <div class="worderContainer">
+      <div class="workOrderContent">
+        <div class="workOrderTitle">工单内容</div>
+        <div class="workOrderContainer">
+          <div class="orderRow">
+            <div class="rowTitle">工单编号</div>
+            <div>{{ workDetailData.eventNum }}</div>
+          </div>
+          <div class="orderRow">
+            <div class="rowTitle">工单处置人</div>
+            <div>{{ workDetailData.disposeUserName }}</div>
+          </div>
+          <div class="orderRow">
+            <div class="rowTitle">处置部门</div>
+            <div>{{ workDetailData.disposeDeptName }}</div>
+          </div>
+          <div class="orderRow">
+            <div class="rowTitle">拍摄时间</div>
+            <div>{{ workDetailData.shootTime }}</div>
+          </div>
+          <div class="orderRow">
+            <div class="rowTitle">分发人员</div>
+            <div>{{ workDetailData.distributeUserName }}</div>
+          </div>
+          <div class="orderRow">
+            <div class="rowTitle">分发部门</div>
+            <div>{{ workDetailData.distributeDeptName }}</div>
+          </div>
 
-							<div class="step-desc" v-if="stepResponse[index]">
-								<span>{{ stepResponse[index].name || '' }}</span>
-								<span>{{ stepResponse[index].create_time || '' }}</span>
-							</div>
-						</div>
-					</van-step>
-				</van-steps>
-			</div>
-		</div>
-		<!-- 工单内容 -->
-		<div class="worderContainer">
-			<div class="workOrderContent">
-				<div class="workOrderTitle">工单内容</div>
-				<div class="workOrderContainer">
-					<div class="orderRow">
-						<span class="required-mark" v-if="isEditable">*</span>
-						<div class="rowTitle">工单名称</div>
-						<div v-if="!isEditable">{{ currentDetail.event_name }}</div>
-						<van-field v-else v-model="currentDetail.event_name" name="event_name" required
-							input-align="right" placeholder="请输入" class="custom-field" />
-					</div>
-					<div class="orderRow">
-						<div class="rowTitle">工单编号</div>
-						<div>{{ currentDetail.event_num }}</div>
-					</div>
-					<div class="orderRow">
-						<div class="rowTitle">工单类型</div>
-						<div>{{ workOrderTypeName }}</div>
-					</div>
-					<div class="orderRow" v-if="currentDetail.work_type == '0'">
-						<div class="rowTitle">关联任务</div>
-						<div>{{ currentDetail.job_name }}</div>
-					</div>
-					<div class="orderRow">
-						<div class="rowTitle">工单创建人</div>
-						<div>{{ currentDetail.event_num?.slice(0, 2) === 'AI' ? '智飞agent' : currentDetail.create_user }}
-						</div>
-					</div>
-					<div class="orderRow">
-						<div class="rowTitle">事件地址</div>
-						<div class="addressBox" @click="jumpMap(currentDetail)">
-							<div class="rowAddress">{{ currentDetail.address }}</div>
-							<img class="pointing" src="/src/appDataSource/appwork/pointing.svg" alt="" />
-						</div>
-					</div>
-
-					<div class="orderRow">
-						<div class="guanlian">
-							<span class="required-mark" v-if="isEditable">*</span>
-							<div class="rowTitle">关联算法</div>
-						</div>
-						<div v-if="!isEditable">{{ currentDetail.ai_types }}</div>
-						<div v-else>
-							<span @click="openselect" class="selectTrigger">
-								{{ currentDetail.ai_types }}
-								<img class="downpointing" src="/src/appDataSource/appwork/downpointing.svg" alt="" />
-							</span>
-
-							<van-popup v-model:show="showPicker" destroy-on-close position="bottom"
-								:close-on-click-overlay="true">
-								<van-picker v-model="selectedValues" title="选择关联算法" :columns="columns"
-									@confirm="onConfirm" @cancel="onCancel" />
-							</van-popup>
-						</div>
-					</div>
-					<div class="orderRow">
-						<div class="rowTitle">发起部门</div>
-						<div>{{ currentDetail.dept_name }}</div>
-					</div>
-					<div class="orderRow">
-						<div class="rowTitle">发起任务时间</div>
-						<div>{{ currentDetail.create_time }}</div>
-					</div>
-					<div class="orderRow">
-						<div class="rowTitle">所属机巢</div>
-						<div>{{ currentDetail.device_names }}</div>
-					</div>
-					<div class="orderRow">
-						<span class="required-mark" v-if="isEditable">*</span>
-						<div class="rowTitle">工单内容</div>
-						<div v-if="!isEditable">{{ currentDetail.content }}</div>
-						<van-field v-else class="custom-field" input-align="right" v-model="currentDetail.content"
-							name="remark" required placeholder="请输入" />
-					</div>
-					<div class="rowCard" v-if="isEditableProcess">
-						<div class="guanlian">
-							<span class="required-mark">*</span>
-							<div class="rowTitle">
-								上传图片
-								<span>(只能上传jpg、jpeg、png照片,且不超过5M)</span>
-							</div>
-						</div>
-						<div>
-							<van-field name="uploader">
-								<template #input>
-									<van-uploader :disabled="!isCurrentUserAssigned" v-model="fileList"
-										:after-read="afterRead" :max-count="1" :max-size="5 * 1024 * 1024"
-										@oversize="onOversize" :before-read="beforeRead" @delete="handleDelete"
-										accept="image/jpeg,image/jpg,image/png" />
-								</template>
-							</van-field>
-						</div>
-					</div>
-					<div class="orderRow" v-if="isEditableProcess">
-						<span class="required-mark">*</span>
-						<div class="rowTitle">事件处理详情</div>
-						<van-field class="custom-field" input-align="right" v-model="currentDetail.processingDetail"
-							name="event_name" required placeholder="请输入" :disabled="!isCurrentUserAssigned" />
-					</div>
-					<div class="orderRow" v-if="isComplent">
-						<div class="rowTitle">事件处理详情</div>
-						<div>{{ currentDetail.processingDetail }}</div>
-					</div>
-				</div>
-			</div>
-		</div>
-		<!-- 操作按钮 -->
-		<div class="actionButton">
-			<div class="floatingBtn leftFloatingBtn" @click="leftClick">
-				<img src="/src/appDataSource/appwork/leftBtn1.svg" alt="" />
-			</div>
-			<div class="paginationInfo">
-				<span>{{ currentPage }} / {{ totalRecords }}</span>
-			</div>
-			<div class="btngroups" v-if="currentDetail.status === 2">
-				<van-button type="primary" color="#FF452C" round text="不通过" @click="rejectTicket"></van-button>
-				<van-button type="primary" color="#1D6FE9" round text="通过" @click="approveTicket"></van-button>
-			</div>
-			<div class="btngroups" v-else-if="currentDetail.status === 0">
-				<van-button type="primary" color="#FF452C" round text="不受理" @click="rejectTicket"></van-button>
-				<van-button type="primary" color="#1D6FE9" round text="受理" @click="approveAndDispatch"></van-button>
-			</div>
-			<div class="btngroups" v-else-if="currentDetail.status === 3">
-				<van-button type="primary" color="#FF452C" round text="取消" @click="cancellation"></van-button>
-				<van-button :disabled="!isCurrentUserAssigned" type="primary" color="#1D6FE9" round text="完成工单"
-					@click="completeTicket"></van-button>
-			</div>
-			<div class="btngroups back-btn" v-else>
-				<van-button type="primary" round color="#FF730F" text="返回" @click="cancellation"></van-button>
-			</div>
-			<div class="floatingBtn rightFloatingBtn" @click="rightClick">
-				<img src="/src/appDataSource/appwork/rightBtn1.svg" alt="" />
-			</div>
-		</div>
-
-		<!--派发工单对话框-->
-		<van-dialog v-model:show="isshowDispatch" title="派发工单" show-cancel-button @confirm="submitDispatch"
-			@cancel="dispatchCancel">
-			<van-field v-model="dispatchForm.departmentName" is-link readonly label="选择部门" placeholder="请选择部门"
-				@click="openPicker('department')" />
-			<van-field v-model="dispatchForm.handlerName" is-link readonly label="选择处理人" placeholder="请选择处理人"
-				@click="openPicker('processor')" :disabled="!dispatchForm.department" />
-		</van-dialog>
-
-		<teleport to="body">
-			<van-popup v-model:show="showGlobalPicker" position="bottom">
-				<!-- 部门选择器 -->
-				<van-picker v-if="currentPickerType === 'department'" v-model="selectedDepartment" title="选择部门"
-					:columns="departments" @confirm="onDepartmentConfirm" @cancel="onPickerCancel" />
-
-				<!-- 处理人选择器 -->
-				<van-picker v-if="currentPickerType === 'processor'" v-model="selectedProcessor" title="选择处理人"
-					:columns="availableDispatchHandlers" @confirm="onProcessorConfirm" @cancel="onPickerCancel" />
-			</van-popup>
-		</teleport>
+          <div class="orderRow">
+            <div class="rowTitle">分发时间</div>
+            <div>{{ workDetailData.distributeTime }}</div>
+          </div>
+          <div class="orderRow">
+            <div class="rowTitle">工单位置</div>
+            <div class="rowAddress" @click="jumpMap(workDetailData)">{{ workDetailData.eventLocation }}</div>
+          </div>
+        </div>
+      </div>
+    </div>
 	</div>
 </template>
 
 <script setup>
-import {ALL_WORK_ORDER_TYPE_OPTIONS} from '@ztzf/constants'
-
-import { getDeviceRegion } from '@/api/home/aggregation'
-import { usePermission } from '@/appPages/work/usePermission'
+import { showToast, showNotify, showImagePreview } from 'vant'
 import { getShowImg, getSmallImg } from '@/utils/util'
 import { useRoute } from 'vue-router'
-import { getStepInfo, getList, flowEvent, getTicketInfo } from '/src/api/work/index.js'
-import { showToast, showNotify, showImagePreview } from 'vant'
-import dayjs from 'dayjs'
-import _ from 'lodash'
-import { useStore } from 'vuex'
-const store = useStore()
-const userInfo = computed(() => store?.state?.user?.userInfo)
-const { permission, getButtonsApi } = usePermission()
-const showPicker = ref(false)
-const selectedValues = ref([])
-const columns = ref([])
-const allAlgorithms = ref([])
-const algorithms = ref([])
-const types = ref([]) //工单类型
-const eventNum = ref('')
-const currentStatus = ref(0)
-const stepResponse = ref([])
-const currentStep = ref(0)
+
 const route = useRoute()
-const currentDetail = ref({ status: 0 })
-const currentIndex = ref(null) //当前显示数据索引
-const departments = ref([]) //部门
-const departmentUsers = ref({})
-const fileList = ref([])
-// 机巢数据
-let machineData = ref([])
-// 处理人选择相关
-const processorColumns = ref([])
-// 可编辑状态
-const isEditable = computed(() => currentDetail.value.status === 0)
-const isEditableProcess = computed(() => currentDetail.value.status === 3)
-const isComplent = computed(() => currentDetail.value.status === 4)
-// 工单内容
+
 const workDetailData = ref({})
-// 分页相关
-const currentPage = ref(1)
-const pageSize = ref(1)
-const totalRecords = ref(0)
-const formatDate = dateString => {
-	return dayjs(dateString).format('MM/DD HH:mm')
-}
-const allStepConfigs = ref([
-	{ title: '待审核', status: 2 },
-	{ title: '待处理', status: 0 },
-	{ title: '处理中', status: 3 },
-	{ title: '已完成', status: 4 },
-])
-const hasProcessingBtnPermission = () => {
-	return permission.value && permission.value.tickets_processing_btn === true
-}
-// 完成工单
-const hasProcessedAndOverBtnPermission = () => {
-	return permission.value && permission.value.tickets_view_processedAndOver === true
-}
-// 通过不通过
-const hasReviewBtnPermission = () => {
-	return permission.value && permission.value.tickets_review_btn === true
-}
-// 是否有权限完成工单
-const isCurrentUserAssigned = computed(() => {
-	const handleUserId = currentDetail.value?.handle_user_id
-	const currentUserId = userInfo.value?.user_id
-	return !!handleUserId && !!currentUserId && String(handleUserId) === String(currentUserId)
+
+// 预览图片
+const previewShow = ref(false)
+const previewIndex = ref(0)
+const getImageList = computed(() => {
+	const imageArr = []
+	const detail = workDetailData.value
+	if (detail.eventImageUrl) {
+		const smallUrl = getSmallImg(detail.eventImageUrl)
+		imageArr.push(smallUrl)
+	}
+	return imageArr
 })
-const getStatusClass = index => {
-	if (index <= currentStep.value) {
-		const status = Number(stepResponse.value[index]?.status) || 0
-		const statusClasses = {
-			2: 'status-pending', // 待审核
-			0: 'status-waiting', // 待处理
-			3: 'status-processing', // 处理中
-			4: 'status-completed', // 已完成
-		}
-		return statusClasses[status] || ''
-	}
-
-	return 'status-default'
-}
-// 关联算法
-const getTicketInfoData = async () => {
-	const response = await getTicketInfo()
-	const { dept_data, event_type, ai_type, info } = response.data.data
-	allAlgorithms.value = info
-
-	types.value = Object.entries(event_type).map(([key, value]) => ({
-		label: value,
-		value: key,
-	}))
-	departments.value = dept_data.map(item => ({
-		text: item.dept_name,
-		value: item.id,
-	}))
-	departmentUsers.value = dept_data.reduce((acc, dept) => {
-		acc[dept.id] = dept.user_data || []
-		return acc
-	}, {})
-}
-// 处理人
-const availableDispatchHandlers = computed(() => {
-	if (!dispatchForm.value.department) return []
-	const users = departmentUsers.value[dispatchForm.value.department]
-	if (!users) return []
-	return users.map(user => ({
-		text: user.name,
-		value: user.id,
-	}))
-})
-
-// 关联算法选择
-const handleTypeChange = typeValue => {
-	const matchedCategory = allAlgorithms.value.find(category => category.dict_key === typeValue)
-	if (!matchedCategory || !matchedCategory.algorithms || matchedCategory.algorithms.length === 0) {
-		// 无匹配的算法时清空
-		algorithms.value = []
-		return
-	}
-	algorithms.value = matchedCategory.algorithms.map(algo => ({
-		label: algo.dict_value,
-		value: algo.dict_key,
-		dict_key: algo.dict_key,
-		dict_value: algo.dict_value,
-	}))
-	columns.value = algorithms.value.map(item => ({
-		text: item.label,
-		value: item.value,
-	}))
-}
-// 机巢数据
-const handleNodeClick = async data => {
-	const droneList = await getDeviceRegion({ areaCode: userInfo.value.detail.areaCode })
-	machineData.value = droneList?.data?.data
-}
-const tableData = ref([])
-
-const fetchWorkData = async (val) => {
-	const params = {
-		current: Number(currentPage.value) || 1,
-		size: pageSize.value,
-		source: 1,
-		// event_name: val.keyword || val.eventNum,
-		ai_types: val.aiType,
-		way_line_job_info_id: val.wLJobInfoId,
-		work_types: ALL_WORK_ORDER_TYPE_OPTIONS
-	}
-	if (val.status !== 'undefined') {
-		params.status = val.status
-	}
-
-	const res = await getList(params)
-	const response = res.data.data.records
-
-	totalRecords.value = res.data.data.total || 0
-  console.log(totalRecords.value,res.data.data.total,2222)
-
-	if (response && response.length > 0) {
-		const item = response[0]
-		const matchedMachine = machineData.value.find(m => m.device_sn === item.device_sn)
-		const deviceNickname = matchedMachine?.nickname || ''
-
-		currentDetail.value = {
-			...item,
-			processingDetail: item.processing_details,
-			update_photo_url: item.update_photo_url,
-			photos: [],
-			aiType: item.ai_type_key_list?.join(',') || '',
-			status: Number(item.status) || 0,
-			device_names: deviceNickname ? deviceNickname : ''
-		}
-		currentStatus.value = currentDetail.value.status
-		handleTypeChange(currentDetail.value.work_order_type_dict_key)
-
-		await getStepInfoData(currentDetail.value.event_num)
-	}
-}
-// 计算要显示的步骤
-const displayedSteps = computed(() => {
-	return allStepConfigs.value.filter(stepConfig => {
-		return stepResponse.value.some(stepData => Number(stepData?.status) === stepConfig.status)
+const openPreview = index => {
+	const detail = workDetailData.value
+	const showUrl = getShowImg(detail.eventImageUrl)	
+	showImagePreview({
+		images: [showUrl],
+		startPosition: 0,
 	})
-})
-// 计算工单类型显示名称
-const workOrderTypeName = computed(() => {
-	const type = types.value.find(item => item.value === currentDetail.value.work_order_type_dict_key)
-	return type ? type.label : currentDetail.value.work_order_type_dict_key
-})
-// 步骤条
-const calculateCurrentStep = status => {
-	const stepIndex = displayedSteps.value.findIndex(step => step.status === status)
-	return stepIndex !== -1 ? stepIndex : 0
-}
-const getStepInfoData = async val => {
-	const res = await getStepInfo(val)
-	stepResponse.value = res.data.data.map(item => ({
-		...item,
-		status: Number(item.status) || 0,
-	}))
-	currentStep.value = calculateCurrentStep(currentStatus.value)
-}
-// 通过
-const approveTicket = async () => {
-	const data = {
-		id: currentDetail.value.id,
-		status: currentDetail.value.status,
-		isPass: 0, // 0 表示通过
-		eventNum: currentDetail.value.event_num,
-	}
-	const file = currentDetail.value.file || null
-	const response = await flowEvent(data, file)
-	if (response.data.code === 0) {
-		showToast('工单已通过')
-	}
-
-	const transmitData = { data: { type: 'workback', fun: 'add' } }
-	wx.miniProgram.switchTab({ url: `/pages/work/index?addLog=111` })
-	wx.miniProgram.postMessage(transmitData)
-	uni.postMessage(transmitData)
-}
-// 不通过/不受理
-const rejectTicket = async () => {
-	const data = {
-		id: currentDetail.value.id,
-		status: currentDetail.value.status,
-		isPass: 1,
-	}
-	const response = await flowEvent(data)
-	if (response.data.code === 0) {
-		showToast('工单未通过')
-	}
-	const transmitData = { data: { type: 'workback', fun: 'add' } }
-	wx.miniProgram.switchTab({ url: `/pages/work/index?addLog=111` })
-	wx.miniProgram.postMessage(transmitData)
-	uni.postMessage(transmitData)
-}
-const isshowDispatch = ref(false)
-// 受理
-const approveAndDispatch = () => {
-	if (!currentDetail.value.event_name) {
-		showToast('请填写工单名称')
-		return
-	}
-	if (!currentDetail.value.ai_types) {
-		showToast('请选择关联算法')
-		return
-	}
-	if (!currentDetail.value.content) {
-		showToast('请填写工单内容')
-		return
-	}
-	isshowDispatch.value = true
-}
-const dispatchCancel = () => {
-	// 重置表单
-	dispatchForm.value = {
-		department: '',
-		departmentName: '',
-		handler: '',
-		handlerName: '',
-	}
-	isshowDispatch.value = false
-}
-const dispatchForm = ref({
-	department: '', // 存储部门ID (value)
-	departmentName: '', // 显示部门名称 (text)
-	handler: '', // 存储处理人ID (value)
-	handlerName: '', // 显示处理人名称 (text)
-})
-
-const selectedDepartment = ref([])
-const selectedProcessor = ref([])
-const showGlobalPicker = ref(false)
-const currentPickerType = ref('')
-
-const openPicker = type => {
-	currentPickerType.value = type
-	showGlobalPicker.value = true
-}
-// 部门选择确认
-const onDepartmentConfirm = value => {
-	dispatchForm.value.department = value.selectedValues[0]
-	dispatchForm.value.departmentName = value.selectedOptions[0].text
-	showGlobalPicker.value = false
-}
-// 处理人选择确认
-const onProcessorConfirm = value => {
-	if (!dispatchForm.value.department) {
-		showToast('请先选择部门')
-		return
-	}
-	dispatchForm.value.handler = value.selectedValues[0]
-	dispatchForm.value.handlerName = value.selectedOptions[0].text
-	showGlobalPicker.value = false
-}
-
-// 取消选择
-const onPickerCancel = () => {
-	showGlobalPicker.value = false
-}
-// 派发工单
-const submitDispatch = async () => {
-	if (!dispatchForm.value.department) {
-		showToast('请选择部门')
-		return
-	}
-
-	if (!dispatchForm.value.handler) {
-		showToast('请选择处理人')
-		return
-	}
-
-	try {
-		const data = {
-			id: currentDetail.value.id,
-			status: currentDetail.value.status,
-			isPass: 0,
-			eventName: currentDetail.value.event_name,
-			eventNum: currentDetail.value.event_num,
-			workOrderTypeDictKey: currentDetail.value.work_order_type_dict_key,
-			content: currentDetail.value.content,
-			createDept: dispatchForm.value.department,
-			updateUser: dispatchForm.value.handler,
-			aiType: currentDetail.value.aiType,
-		}
-		const file = currentDetail.value.file || null
-		const response = await flowEvent(data, file)
-		if (response.data.code === 0) {
-			showToast('工单派发成功')
-			const transmitData = { data: { type: 'workback', fun: 'add' } }
-			wx.miniProgram.switchTab({ url: `/pages/work/index?addLog=111` })
-			wx.miniProgram.postMessage(transmitData)
-			uni.postMessage(transmitData)
-			isshowDispatch.value = false
-		}
-	} catch (error) {
-		showToast('工单派发失败')
-	}
-}
-
-// 完成工单
-const completeTicket = async () => {
-	if (!currentDetail.value.processingDetail) {
-		showToast('请先填写事件处理详情')
-		return
-	}
-	if (!currentDetail.value.photos || currentDetail.value.photos.length === 0) {
-		showToast('请选择上传图片')
-		return
-	}
-	const data = {
-		id: currentDetail.value.id,
-		status: currentDetail.value.status,
-		processingDetails: currentDetail.value.processingDetail,
-		eventNum: currentDetail.value.event_num,
-	}
-	const file = currentDetail.value.photos?.[0] || null
-	const response = await flowEvent(data, file)
-	if (response.data.code === 0) {
-		showToast('工单已完成')
-	}
-	const transmitData = { data: { type: 'workback', fun: 'add' } }
-	wx.miniProgram.switchTab({ url: `/pages/work/index?addLog=111` })
-	wx.miniProgram.postMessage(transmitData)
-	uni.postMessage(transmitData)
-}
-// 取消
-const cancellation = () => {
-	const transmitData = { data: { type: 'workback', fun: 'add' } }
-	wx.miniProgram.switchTab({ url: `/pages/work/index?addLog=111` })
-	wx.miniProgram.postMessage(transmitData)
-	uni.postMessage(transmitData)
-}
-
-// 下拉选择
-const openselect = () => {
-	showPicker.value = true
-}
-// 选择器确认方法
-const onConfirm = val => {
-	currentDetail.value.ai_types = val.selectedOptions.map(option => option.text).join(',')
-	currentDetail.value.aiType = val.selectedValues.join(',')
-	showPicker.value = false
-}
-// 选择器取消方法
-const onCancel = () => {
-	showPicker.value = false
-}
-// 文件上传前的校验
-const beforeRead = file => {
-	const ext = file.name.split('.').pop().toLowerCase()
-	const allowedExts = ['jpg', 'jpeg', 'png']
-	if (!allowedExts.includes(ext)) {
-		showToast('请上传 jpg/jpeg/png 格式图片')
-		return false
-	}
-	return true
-}
-// 文件大小超过限制时的回调
-const onOversize = file => {
-	showToast('文件大小不能超过 5MB')
-}
-// 文件读取完成后的回调
-const afterRead = file => {
-	currentDetail.value.photos = [file.file]
-}
-// 处理图片删除
-const handleDelete = () => {
-	currentDetail.value.photos = []
-}
-// 更新当前显示的工单详情
-const updateCurrentDetail = () => {
-	currentDetail.value = tableData.value[currentIndex.value]
-	if (currentDetail.value.status !== undefined) {
-		currentDetail.value.status = Number(currentDetail.value.status) || 0
-	}
-	currentStatus.value = currentDetail.value.status
-	getStepInfoData(currentDetail.value.event_num)
-}
-// 上一页
-const leftClick = () => {
-	if (currentPage.value > 1) {
-		currentPage.value--
-		fetchWorkData(route.query)
-	} else {
-		showToast('已经是第一页')
-	}
-}
-
-// 下一页
-const rightClick = () => {
-	if (currentPage.value < totalRecords.value) {
-		currentPage.value++
-		fetchWorkData(route.query)
-	} else {
-		showToast('已经是最后一页')
-	}
+	previewIndex.value = index
+	previewShow.value = true
 }
 // 跳转地图
 const jumpMap = item => {
@@ -653,57 +94,15 @@
 	wx.miniProgram.postMessage(transmitData)
 	uni.postMessage(transmitData)
 }
-// 预览图片
-const previewShow = ref(false)
-const previewIndex = ref(0)
 
-const getImageList = computed(() => {
-	const imageArr = []
-	const detail = currentDetail.value
-
-	if (detail.photo_url) {
-		const smallUrl = getSmallImg(detail.photo_url)
-		imageArr.push(smallUrl)
-	}
-
-	if (detail.update_photo_url) {
-		const smallUrl = getSmallImg(detail.update_photo_url)
-		imageArr.push(smallUrl)
-	}
-
-	return imageArr
-})
-
-const openPreview = index => {
-	const detail = currentDetail.value
-	const showUrl = getShowImg(detail.photo_url || detail.update_photo_url)
-	showImagePreview({
-		images: [showUrl],
-		startPosition: 0,
-	})
-	previewIndex.value = index
-	previewShow.value = true
-}
 onMounted(async () => {
-	handleNodeClick()
-	eventNum.value = route.query.eventNum || ''
-	await getTicketInfoData()
-  currentPage.value = route.query.current
-	await fetchWorkData(route.query)
-	await getStepInfoData(eventNum.value)
-	currentIndex.value = tableData.value.findIndex(item => item.event_num === currentDetail.value.event_num)
-
+workDetailData.value = JSON.parse(route.query.workDetailData)
+console.log('route.query',workDetailData.value);
 })
 </script>
 <style lang="scss" scoped>
 .workDetailContainer {
-	position: relative;
-
-	.required-mark {
-		color: #ff4d4f; // 红色
-		margin-left: 4px;
-	}
-
+  padding-top: 44px;
 	.detailTop {
 		.image-container {
 			position: relative;
@@ -716,255 +115,6 @@
 				display: block;
 				object-fit: cover;
 			}
-
-			.detailTitle {
-				position: absolute;
-				left: 0;
-				top: 0;
-				width: 100%;
-				padding: 5px;
-				height: 30px;
-				background: rgba(7, 7, 7, 0.4);
-			}
-
-			.titleText {
-				display: flex;
-				width: 100%;
-				justify-content: space-between;
-				align-items: center;
-				font-family: Source Han Sans CN, Source Han Sans CN;
-				font-weight: 400;
-				font-size: 13px;
-				color: #ffffff;
-
-				.itemStatus {
-					display: flex;
-					align-items: center;
-					font-family: Source Han Sans CN, Source Han Sans CN;
-					font-weight: 400;
-					font-size: 13px;
-					color: #ffffff;
-
-					span {
-						display: inline-block;
-						width: 10px;
-						height: 10px;
-						border-radius: 50%;
-						margin-right: 7px;
-					}
-				}
-			}
-
-			.timeNavigation {
-				display: flex;
-				align-items: center;
-				font-family: Source Han Sans CN, Source Han Sans CN;
-				font-weight: 400;
-				font-size: 13px;
-				color: #ffffff;
-
-				img {
-					width: 20px;
-					height: 20px;
-					margin-left: 5px;
-				}
-			}
-		}
-	}
-
-	.stepBox {
-		padding: 0 12px;
-	}
-
-	.stepContainer {
-		margin-top: 10px;
-		display: flex;
-
-		border-radius: 5px;
-		padding: 10px;
-		background: #fff;
-
-		:deep() {
-			.van-step__circle-container {
-				font-size: 20px;
-			}
-
-			.van-step__circle {
-				width: 15px;
-				height: 15px;
-			}
-
-			.van-step--vertical {
-				padding: 20px 20px 20px 0;
-			}
-
-			.van-step__circle-container,
-			.van-step__line {
-				top: 50%;
-			}
-
-			.van-step--vertical:not(:last-child):after {
-				border-bottom-width: 0;
-			}
-		}
-
-		.horizontal-step {
-			display: flex;
-			align-items: center;
-			gap: 12px;
-
-			.step-title {
-				min-width: 60px;
-				background: #e8e8e8;
-				padding: 5px;
-				border-radius: 5px;
-				text-align: center;
-
-				&.status-pending {
-					background-color: #ffebeb; // 待审核
-					color: #ff1414;
-				}
-
-				&.status-waiting {
-					background-color: #fff1e6; // 待处理
-					color: #ff7411;
-				}
-
-				&.status-processing {
-					background-color: #fff6d8; // 处理中
-					color: #ffbb00;
-				}
-
-				&.status-completed {
-					background-color: #e5fcff; // 已完成
-					color: #0291a1;
-				}
-
-				&.status-default {
-					background-color: #e8e8e8; // 默认背景色
-					color: #191919;
-				}
-			}
-
-			.step-desc {
-				display: flex;
-				justify-content: space-between;
-				gap: 28px;
-				color: #222324;
-				font-size: 14px;
-			}
-
-			.step-desc span:first-child {
-				width: 60px;
-				white-space: nowrap;
-				overflow: hidden;
-				text-overflow: ellipsis;
-			}
-
-			span:last-child {
-				margin-left: auto;
-				white-space: nowrap;
-				overflow: hidden;
-				text-overflow: ellipsis;
-			}
-		}
-	}
-
-	:deep(.van-step__circle) {
-		width: 8px;
-		height: 8px;
-	}
-
-	/* 悬浮左右按钮样式 */
-	.floatingBtn {
-		position: fixed;
-		top: 50%;
-		width: 46px;
-		height: 46px;
-		z-index: 9;
-		transform: translateY(-50%);
-		background: rgba(17, 17, 17, 0.28);
-		backdrop-filter: blur(3px);
-		border-radius: 50%;
-		display: flex;
-		align-items: center;
-		justify-content: center;
-	}
-
-	.leftFloatingBtn {
-		left: 5px;
-		/* 左边距离 */
-	}
-
-	.rightFloatingBtn {
-		right: 5px;
-		/* 右边距离 */
-	}
-
-	.floatingBtn img {
-		width: 10px;
-		height: 18px;
-	}
-
-	.paginationInfo {
-		position: absolute;
-		left: 50%;
-		transform: translateX(-50%);
-		font-size: 14px;
-		color: #666;
-		background: rgba(255, 255, 255, 0.9);
-		padding: 4px 12px;
-		border-radius: 12px;
-	}
-
-	.actionButton {
-		display: flex;
-		justify-content: center;
-		align-items: center;
-		width: 100%;
-		height: 61px;
-		background: #ffffff;
-		border-radius: 6px 6px 6px 6px;
-		padding: 0 18px;
-
-		.btngroups {
-			display: flex;
-			justify-content: space-between;
-			align-items: center;
-
-			.van-button {
-				padding: 9px 20px;
-				height: 38px;
-				width: 156px;
-
-				&:last-child {
-					margin-left: 12px;
-				}
-			}
-		}
-
-		.back-btn :deep(.van-button) {
-			width: 100%;
-			width: 324px;
-			margin-left: 0px !important;
-		}
-
-		.leftBtn {
-			width: 27px;
-			height: 27px;
-			cursor: pointer;
-
-			img {
-				width: 27px;
-				height: 27px;
-			}
-		}
-
-		.disableds {
-			background: #999 !important;
-			cursor: not-allowed !important;
-			pointer-events: none;
-			opacity: 0.3 !important;
 		}
 	}
 
@@ -986,12 +136,10 @@
 			font-weight: bold;
 			font-size: 16px;
 			color: #222324;
-			// margin-bottom: 16px;
 		}
 
 		.workOrderContainer {
 			.orderRow {
-				// margin-bottom: 10px;
 				display: flex;
 				justify-content: space-between;
 				align-items: center;
@@ -1034,35 +182,16 @@
 			}
 
 			.rowAddress {
+			    font-family: Source Han Sans CN, Source Han Sans CN;
+                font-weight: 400;
 				font-size: 14px;
 				color: #1d6fe9;
-				white-space: nowrap;
-				/* 禁止换行 */
-				overflow: hidden;
-				text-overflow: ellipsis;
-				// max-width: 74%;
+				text-decoration: underline;
+				text-align: right;
 				padding-top: 1px;
 				padding-left: 5px;
 				padding-right: 2px;
 			}
-
-			.selectTrigger {
-				font-family: Source Han Sans CN, Source Han Sans CN;
-				font-weight: 400;
-				font-size: 14px;
-				color: #222324;
-			}
-
-			.pointing {
-				width: 8px;
-				height: 12px;
-			}
-
-			.downpointing {
-				width: 12px;
-				height: 7px;
-			}
-
 			:deep(.custom-field) {
 				padding: 0 !important;
 				padding-left: 10px !important;
@@ -1072,20 +201,8 @@
 				padding: 0 !important;
 			}
 
-			.titketName {
-				display: flex;
-				align-items: center;
-			}
 		}
 	}
 
-	.upload-link {
-		font-family: Source Han Sans CN, Source Han Sans CN;
-		font-weight: 400;
-		font-size: 12px;
-		color: #1d6fe9;
-		cursor: pointer;
-		text-decoration: underline;
-	}
 }
 </style>
diff --git a/uniapps/work-wx/src/subPackages/deviceRegistration/add.vue b/uniapps/work-wx/src/subPackages/deviceRegistration/add.vue
index 6541906..08034e4 100644
--- a/uniapps/work-wx/src/subPackages/deviceRegistration/add.vue
+++ b/uniapps/work-wx/src/subPackages/deviceRegistration/add.vue
@@ -258,7 +258,7 @@
             </view>
                 <u-radio-group
                 v-if="!loadingManufacturer"
-                    v-model="formParams.spacecraftId"
+                    v-model="formParams.manufacturer"
                     placement="column"
                     @change="radioChange"
                 >
@@ -426,7 +426,7 @@
     formParams.value.region = e[2] || '' // 用逗号分隔的区域码
     // 通过arrRegion的数组值为[36,3608,360824] 从areaData里面反查出名称
     const regionNames = findRegionNamesByCodes(e, areaData.value)
-    formParams.value.regionText = regionNames.join('-') || '' // 用连字符连接的区域名称
+    formParams.value.regionText = regionNames.join(',') || '' // 用连字符连接的区域名称
     isShowRegion.value = false
 }
 // 是否有保险
@@ -671,7 +671,7 @@
     // 检查响应
     if (response.statusCode === 200) {
         areaData.value = response.data
-        console.log('请求成功:', data)
+        // console.log('请求成功:', data)
         // 处理数据
     } else {
         console.error('请求失败:', response)
diff --git a/uniapps/work-wx/src/subPackages/deviceRegistration/details.vue b/uniapps/work-wx/src/subPackages/deviceRegistration/details.vue
index e10db1d..8bc3a92 100644
--- a/uniapps/work-wx/src/subPackages/deviceRegistration/details.vue
+++ b/uniapps/work-wx/src/subPackages/deviceRegistration/details.vue
@@ -313,12 +313,6 @@
         current: 1,
         size: 1000,
     }).then(res => {
-        // manufacturerList.value = res.data.data.records.map(item => ({
-        //     ...item,
-        //     label: item.unitName,
-        //     value: item.id,
-        // }))
-        console.log(formParams.value.manufacturer, res.data.data.records.find(item => item.id === formParams.value.manufacturer))
         formParams.value.manufacturerText = res.data.data.records.find(item => item.id === formParams.value.manufacturer)?.unitName || ''
     })
 }
@@ -329,7 +323,9 @@
         formParams.value.hasInsurance = res.data.data.hasInsurance === '1' ? '有' : '无'
         // formParams.value.manufacturer = manufacturerList.value.find(item => item.value === res.data.data.manufacturer)?.label || ''
         formParams.value.type = typeList.value.find(item => item.value === res.data.data.type)?.label || ''
-        formParams.value.region = res.data.data.region
+        // formParams.value.region = res.data.data.region
+        // 360824 截取留前两位 3608 截取留前四位
+        formParams.value.region = findRegionNamesByCodes([res.data.data.region.slice(0,2),res.data.data.region.slice(0,4),res.data.data.region], areaData.value)
         getManufacturerInfoApi()
     })
     
@@ -339,8 +335,25 @@
     // getManufacturerInfoApi()
     getProTypeApi()
     // 动态导入xzqhData,确保在使用前已初始化
-    const { xzqhData } = await import('@/static/xzqh/index')
-    areaData.value = xzqhData
+    // const { xzqhData } = await import('@/static/xzqh/index')
+    // areaData.value = xzqhData
+    const response = await uni.request({
+        url: 'https://wrj.shuixiongit.com/aiskyminio/cloud-bucket/ja-app-wx/xzqh/index.json',
+        method: 'GET',
+        timeout: 10000, // 10秒超时
+        dataType: 'json'
+    })
+
+    // 检查响应
+    if (response.statusCode === 200) {
+        
+        areaData.value = response.data
+        // console.log('请求成功:', data)
+        // 处理数据
+    } else {
+        console.error('请求失败:', response)
+        throw new Error(`请求失败: ${response.statusCode}`)
+    }
 })
 </script>
 <style scoped lang="scss">
diff --git a/uniapps/work-wx/src/subPackages/flightApplication/add.vue b/uniapps/work-wx/src/subPackages/flightApplication/add.vue
index 3c522c5..ec51e8f 100644
--- a/uniapps/work-wx/src/subPackages/flightApplication/add.vue
+++ b/uniapps/work-wx/src/subPackages/flightApplication/add.vue
@@ -370,20 +370,20 @@
         <view class="confirm-btn" @click="onPickerAircraftInfo">确定</view>
     </view>
     <view class="select-content">
-          <up-checkbox-group
+          <u-checkbox-group
             v-model="formParams.spacecraftId"
             placement="column"
             @change="checkboxChange"
         >
-            <up-checkbox
+            <u-checkbox
                 :customStyle="{marginBottom: '8px'}"
                 v-for="(item, index) in aircraftInfoList"
                 :key="item.id"
                 :label="item.label"
                 :name="item.value"
             >
-            </up-checkbox>
-        </up-checkbox-group>
+            </u-checkbox>
+        </u-checkbox-group>
     </view>
     </scroll-view>
   </u-popup>
@@ -408,20 +408,20 @@
         <view class="confirm-btn" @click="onPickerPilotInfo">确定</view>
     </view>
     <view class="select-content">
-          <up-checkbox-group
+          <u-checkbox-group
             v-model="formParams.pilotId"
             placement="column"
             @change="checkboxPilotChange"
         >
-            <up-checkbox
+            <u-checkbox
                 :customStyle="{marginBottom: '8px'}"
                 v-for="(item, index) in pilotInfoList"
                 :key="item.id"
                 :label="item.label"
                 :name="item.value"
             >
-            </up-checkbox>
-        </up-checkbox-group>
+            </u-checkbox>
+        </u-checkbox-group>
     </view>
     </scroll-view>
   </u-popup>
@@ -641,7 +641,7 @@
 //   isShowAircraftInfo.value = false
 // }
 function checkboxChange(val) {
-    formParams.value.spacecraftId = val.join(',')
+    formParams.value.spacecraftId = val
     formParams.value.spacecraftText = aircraftInfoList.value.filter(item => val.includes(item.value)).map(item => item.label).join(',')
 }
 const onPickerAircraftInfo = () => {
@@ -662,7 +662,7 @@
     })
 }
 function checkboxPilotChange(val) {
-    formParams.value.pilotId = val.join(',')
+    formParams.value.pilotId = val
     formParams.value.pilotText = pilotInfoList.value.filter(item => val.includes(item.value)).map(item => item.label).join(',')
 }
 const onPickerPilotInfo = (e) => {
@@ -771,6 +771,8 @@
 const submitForm = async () => {
   await formRef.value.validate()
   isSubmitDisabled.value = true
+  formParams.value.pilotId = formParams.value.pilotId.join(',')
+  formParams.value.spacecraftId = formParams.value.spacecraftId.join(',')
   flightPlanSaveApi(formParams.value).then(res => {
     if (res.data.code === 200) {
         isSubmitDisabled.value = true

--
Gitblit v1.9.3