From 9def0507e5e1d10c02e02fa9024c9701a258b0f1 Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Thu, 17 Jul 2025 17:17:50 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
src/views/tickets/ticket.vue | 125 +++++++++++++++++++++++++++++++----------
1 files changed, 93 insertions(+), 32 deletions(-)
diff --git a/src/views/tickets/ticket.vue b/src/views/tickets/ticket.vue
index 84138c0..0e388df 100644
--- a/src/views/tickets/ticket.vue
+++ b/src/views/tickets/ticket.vue
@@ -33,8 +33,8 @@
<!-- 表格部分 -->
<avue-crud class="ztzf-public-general-avue-crud" ref="avueCrud" v-model="tableData" :option="option"
:data="tableData" v-model:page="page" @size-change="sizeChange" @current-change="handleCurrentChange"
- :table-loading="loading" @selection-change="handleSelectionChange" :permission="permissionList"
- v-if="activeTab === tab.name">
+ @refresh-change="refreshChange" :table-loading="loading" @selection-change="handleSelectionChange"
+ :permission="permissionList" v-if="activeTab === tab.name">
<template #menu-left>
<el-button v-if="(activeTab === 'all' || activeTab === 'myTickets') && permissionList.addBtn"
type="primary" icon="el-icon-plus" @click="handleAdd">新建工单</el-button>
@@ -54,8 +54,11 @@
<el-button type="text" icon="el-icon-view" @click="handleViewDetail(row)">详情</el-button>
</template>
- <el-button v-if="row.status === 4 && row.isReview !== 1" type="text" icon="el-icon-check"
- @click="reCheck(row)">复核</el-button>
+ <template v-if="permission.tickets_repeat_review">
+ <el-button v-if="row.status === 4 && row.isReview !== 1" type="text" icon="el-icon-check"
+ @click="reCheck(row)">复核</el-button>
+ </template>
+
</template>
<template #status="{ row }">
<span :style="getStatusTagType(row.status) ? 'color:' + getStatusTagType(row.status) : ''">
@@ -122,10 +125,10 @@
</el-form-item>
</el-col>
<el-col :span="12">
- <el-form-item label="选择位置" prop="location" required>
+ <el-form-item label="选择位置" prop="location">
<div class="location-wrapper">
- <avue-input-map v-model="form.location" :params="mapParams" @change="handleLocationChange"
- type="button">
+ <avue-input-map v-model="form.location" :clearable="false" :params="mapParams"
+ @change="handleLocationChange" type="button">
<el-button type="primary" plain class="map-button">
<i class="el-icon-map-location"></i> 地图选点
</el-button>
@@ -146,11 +149,22 @@
</el-col>
<el-col :span="12">
<el-form-item label="附件图片" prop="photos" required class="upload-wrapper">
- <el-upload ref="upload" :action="'#'" :auto-upload="false" list-type="picture-card"
- :on-change="handleFileChange" :on-remove="handleUploadRemove" :before-upload="beforeUpload"
- :file-list="form.photos" :limit="1" accept="image/*" class="create-upload">
+ <el-upload v-if="createoredit === 1" ref="upload" :action="'#'" :auto-upload="false"
+ list-type="picture-card" :on-change="handleFileChange" :on-remove="handleUploadRemove"
+ :before-upload="beforeUpload" :file-list="form.photos" :limit="1" accept="image/*"
+ class="create-upload">
<template v-if="form.photos.length < 1">
<!-- <i class="el-icon-plus">+</i> -->
+ <div class="el-icon-plus">
+ <span>+</span>
+ </div>
+ </template>
+ </el-upload>
+ <el-upload v-else ref="upload" :action="'#'" :auto-upload="false" list-type="picture-card"
+ :on-change="handleFileChange" :on-remove="handleUploadRemove" :before-upload="beforeUpload"
+ :file-list="popupShowImage(form.photos)" :limit="1" accept="image/*" class="create-upload">
+ <template v-if="form.photos.length < 1">
+
<div class="el-icon-plus">
<span>+</span>
</div>
@@ -507,9 +521,11 @@
</template>
<script>
+import { getSmallImg, getShowImg } from '@/utils/util'
import { ElMessageBox, ElLoading } from 'element-plus'
import { calculateDefaultRange } from '@/utils/util'
import { gcj02ToWgs84, wgs84ToGcj02 } from '@/utils/coordinateTransformation'
+import _ from 'lodash'
import {
getList,
createTicket,
@@ -522,7 +538,6 @@
} from '@/api/tickets/ticket'
import { export_json_to_excel } from '@/utils/exportExcel'
import geoJson from '@/assets/geoJson.json'
-
import { mapGetters } from 'vuex'
import { getAdcodeObj } from '@/utils/disposeData'
function regExp (label, name) {
@@ -542,6 +557,7 @@
dispatchLoading: false,
completeLoading: false,
finalizeLoading: false,
+ createoredit: '',
activeTab: 'all',
// tabs 只保留静态结构,不做权限判断
tabs: [
@@ -663,14 +679,17 @@
algorithm: [{ required: true, message: '请选择关联算法', trigger: 'change' }],
location: [
{
+ required: true,
validator: (rule, value, callback) => {
if (!value || value.length < 2) {
+ callback(new Error('请选择位置信息'))
+ } else if (!value[0] || !value[1]) {
callback(new Error('请选择位置信息'))
} else {
callback()
}
},
- trigger: 'blur',
+ trigger: 'change'
},
],
photos: [
@@ -725,6 +744,8 @@
}
},
created () {
+ this.inputMapShowDefaultCenter = null
+
this.loadAMapScripts()
this.fetchDropdownData()
console.log('permission.tickets_processing_btn', this.permission.tickets_processing_btn)
@@ -733,6 +754,11 @@
mounted () {
const href = this.$route.href
+ if (this.$route?.query?.status !== undefined && this.$route?.query?.status !== null) {
+ this.filters.status = this.$route?.query?.status + ''
+ this.$router.replace({})
+ }
+
let curQueryParams = {}
if (href.indexOf('?') != -1 && href.split('?').length > 0) {
@@ -894,7 +920,7 @@
{ label: '关联任务', value: this.currentDetail.job_name || '/' },
{ label: '任务发起人', value: this.currentDetail.creator },
{ label: '当前状态', value: this.mapStatus(this.currentDetail.status) },
- { label: '事件地址', value: this.currentDetail.address }, // 包含经纬度信息
+ { label: '事件地址', value: this.currentDetail.address || this.currentDetail.latAndLon }, // 包含经纬度信息
{ label: '关联算法', value: this.currentDetail.aiType },
{ label: '发起单位', value: this.currentDetail.department },
{ label: '发起任务时间', value: this.currentDetail.startTime },
@@ -971,6 +997,16 @@
return '/'
}
},
+
+ popupShowImage () {
+ return (list) => {
+
+ return list.map(item => ({
+ ...item,
+ url: getShowImg(item.url)
+ }))
+ }
+ }
},
methods: {
@@ -1011,19 +1047,21 @@
// 直接从返回对象中获取正确的路径
const center = adcodeObj?.payload?.objects?.collection?.geometries?.[0]?.properties?.center
+
if (Array.isArray(center) && center.length === 2) {
- this.mapParams.center = center
+ this.inputMapShowDefaultCenter = center
} else {
// 如果找不到中心点,尝试使用 bbox 的中心点
const bbox = adcodeObj?.payload?.bbox
if (Array.isArray(bbox) && bbox.length === 4) {
const centerX = (bbox[0] + bbox[2]) / 2
const centerY = (bbox[1] + bbox[3]) / 2
- this.mapParams.center = [centerX, centerY]
+ this.inputMapShowDefaultCenter = [centerX, centerY]
} else {
- this.mapParams.center = [115.861365, 28.621311]
+ this.inputMapShowDefaultCenter = [115.861365, 28.621311]
}
}
+ this.mapParams.center = [...this.inputMapShowDefaultCenter]
this.mapLoaded = true
} catch (error) {
@@ -1315,6 +1353,13 @@
handlerValue = undefined
}
+ // 验证位置信息
+ if (!this.form.location || this.form.location.length < 2 || !this.form.location[0] || !this.form.location[1]) {
+ this.$message.warning('请在地图上选择位置')
+ return
+ }
+
+
let [lng, lat] = this.disposeLocation(true, this.form)
const submitData = {
@@ -1335,7 +1380,7 @@
// 草稿时也至少需要工单名称
if (!submitData.eventName) {
- this.$message.warning('请至少输入工单名称')
+ this.$message.warning('请输入工单名称')
return
}
@@ -1477,6 +1522,8 @@
},
async handleCurrentChange (val) {
+
+
// 先更新页码
this.page.currentPage = val
// 等待 DOM 更新后再请求数据
@@ -1485,6 +1532,7 @@
},
async sizeChange (val) {
+
this.page.pageSize = val
this.page.currentPage = 1 // 重置到第一页
await this.$nextTick()
@@ -1492,8 +1540,9 @@
},
handleAdd () {
+ this.createoredit = 1
this.dialogVisible = true
- this.mapParams.center = null
+ this.mapParams.center = [...this.inputMapShowDefaultCenter]
this.form.location = []
},
@@ -1523,6 +1572,7 @@
},
async handleViewDetail (row) {
+
// 找到当前行在tableData中的索引
this.currentIndex = this.tableData.findIndex(item => item.id === row.id)
// 先设置workType,直接从row读取
@@ -1586,8 +1636,13 @@
this.stepInfos = []
}
}
+ console.log(detailData, 'detailDatadetailDatadetailData')
+ this.currentDetail = {
+ ...detailData,
+ address: null,
+ latAndLon: _.round(detailData.location[0], 6) + ',' + _.round(detailData.location[1], 6)
+ }
- this.currentDetail = detailData
console.log('this.currentDetail', this.currentDetail)
this.detailVisible = true
this.$nextTick(() => {
@@ -2002,6 +2057,7 @@
// 添加编辑方法
handleEdit (row) {
+ this.createoredit = 2
console.log('编辑原始数据:', row)
// 尝试从row.dept_id或通过部门名称查找对应的部门ID
@@ -2077,6 +2133,7 @@
address: row.address || '',
content: row.content,
photos: [],
+
}
let curLocation = []
@@ -2093,7 +2150,7 @@
if (Array.isArray(this.form.location) && this.form.location.length >= 2) {
this.mapParams.center = [Number(this.form.location[0]), Number(this.form.location[1])]
} else {
- this.mapParams.center = null // 没有经纬度时用默认
+ this.mapParams.center = [...this.inputMapShowDefaultCenter]
}
// 如果有图片,添加到表单中
if (row.photo_url) {
@@ -2150,6 +2207,7 @@
// 添加选择变化处理方法
handleSelectionChange (selection) {
+
this.selections = selection
console.log('已选择的行:', selection)
},
@@ -2400,20 +2458,23 @@
* @param goWgs84 是否由国测转换到84,默认false----由84转换到国测
*/
disposeLocation (goWgs84 = false, data) {
- let lng, lat
- if (goWgs84) {
- lng = data.location?.[0] ? String(data.location[0]) : undefined
- lat = data.location?.[1] ? String(data.location[1]) : undefined
+ let lng = '', lat = ''
- if (lng && lat) {
- [lng, lat] = gcj02ToWgs84(Number(lng), Number(lat))
- }
- } else {
- lng = Number(data.location[0])
- lat = Number(data.location[1])
+ if (Array.isArray(data.location) && data.location.length > 0) {
+ if (goWgs84) {
+ lng = data.location?.[0] ? String(data.location[0]) : undefined
+ lat = data.location?.[1] ? String(data.location[1]) : undefined
- if (lng && lat) {
- [lng, lat] = wgs84ToGcj02(Number(lng), Number(lat))
+ if (lng && lat) {
+ [lng, lat] = gcj02ToWgs84(Number(lng), Number(lat))
+ }
+ } else {
+ lng = Number(data.location[0])
+ lat = Number(data.location[1])
+
+ if (lng && lat) {
+ [lng, lat] = wgs84ToGcj02(Number(lng), Number(lat))
+ }
}
}
--
Gitblit v1.9.3