| | |
| | | const titleEnum = ref({ edit: '编辑', view: '查看', add: '新增' }) |
| | | |
| | | const rules = { |
| | | deviceName: fieldRules(true, false, 50), |
| | | deviceType: fieldRules(true, true), |
| | | deviceAtt: fieldRules(true, true), |
| | | deviceModel: fieldRules(true, false, 50), |
| | | belongDept: fieldRules(true, true), |
| | | contactPhone: fieldRules(true, false, 50), |
| | | charger: fieldRules(true, true), |
| | | deviceName: fieldRules(true, 50), |
| | | deviceType: fieldRules(true), |
| | | deviceAtt: fieldRules(true), |
| | | deviceModel: fieldRules(true, 50), |
| | | belongDept: fieldRules(true), |
| | | contactPhone: fieldRules(true, 50), |
| | | charger: fieldRules(true), |
| | | } |
| | | |
| | | // 部门重置 |
| | |
| | | <div>区域位置: {{ formatLocation(formData) }}</div> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <div>区域面积: {{ formData.areaSize }}k㎡</div> |
| | | <div>区域面积: {{ formData.areaSize || '-' }}k㎡</div> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <div>区域类型: {{ getDictLabel(formData.areaType, dictObj.areaType) }}</div> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="区域面积" prop="areaSize">{{ formData.areaSize }}k㎡</el-form-item> |
| | | <el-form-item label="区域面积" prop="areaSize">{{ formData.areaSize || '-' }}k㎡</el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="区域类型" prop="areaType"> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="可飞行时段" prop="flyDateRange"> |
| | | <el-form-item label="可飞行时段" prop="flyDateStart"> |
| | | <el-date-picker |
| | | v-model="flyDateRange" |
| | | type="datetimerange" |
| | |
| | | </el-col> |
| | | <el-col :span="24"> |
| | | <el-form-item label="关联设备" prop="deviceIds"> |
| | | <el-select v-model="deviceIdList" multiple collapse-tags placeholder="请选择" clearable> |
| | | <el-option v-for="item in deviceOptions" :key="item.id" :label="item.deviceName" :value="item.id" /> |
| | | </el-select> |
| | | <el-table |
| | | ref="deviceTableRef" |
| | | :data="deviceOptions" |
| | | row-key="id" |
| | | @selection-change="handleDeviceSelectionChange" |
| | | > |
| | | <el-table-column type="selection" width="55" /> |
| | | <el-table-column prop="deviceName" label="设备名称" /> |
| | | </el-table> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | <script setup> |
| | | import { computed, inject, nextTick, onMounted, ref, watch } from 'vue' |
| | | import { ElMessage } from 'element-plus' |
| | | import { |
| | | fwAreaDivideDetailApi, |
| | | fwAreaDivideSubmitApi, |
| | | } from './partitionApi' |
| | | import { fwAreaDivideDetailApi, fwAreaDivideSubmitApi } from './partitionApi' |
| | | import { fieldRules, getDictLabel } from '@ztzf/utils' |
| | | import { PublicCesium } from '@/utils/cesium/publicCesium' |
| | | import { DrawPolygon } from '@/utils/cesium/DrawPolygon' |
| | |
| | | const readonly = computed(() => dialogMode.value === 'view') |
| | | const titleEnum = ref({ edit: '编辑', view: '查看', add: '新增' }) |
| | | const flyDateRange = ref([]) // 飞行时间 |
| | | const deviceIdList = ref([]) // 关联设备ID |
| | | const deviceTableRef = ref(null) |
| | | const selectedDeviceRows = ref([]) |
| | | const policeStationOptions = ref([]) // 关联派出所 |
| | | const deviceOptions = ref([]) // 关联设备 |
| | | const dictObj = inject('dictObj') |
| | |
| | | let pointList = [] |
| | | |
| | | const rules = { |
| | | areaName: fieldRules(true, false, 50), |
| | | areaType: fieldRules(true, true), |
| | | controlLevel: fieldRules(true, true), |
| | | areaName: fieldRules(true, 50), |
| | | longitude: fieldRules(true), |
| | | areaType: fieldRules(true), |
| | | responseMechanism: fieldRules(true, 200), |
| | | triggerCondition: fieldRules(true, 200), |
| | | controlLevel: fieldRules(true), |
| | | flyDateStart: fieldRules(true), |
| | | policeStationId: fieldRules(true), |
| | | deviceIds: fieldRules(true), |
| | | } |
| | | |
| | | // 关闭弹框 |
| | |
| | | if (!isValid) return |
| | | submitting.value = true |
| | | try { |
| | | const [start, end] = flyDateRange.value ?? [] |
| | | formData.value.flyDateStart = start || '' |
| | | formData.value.flyDateEnd = end || '' |
| | | formData.value.deviceIds = deviceIdList.value.length ? deviceIdList.value.join(',') : '' |
| | | let str = [...pointList, pointList[0]].map(item => `${item.longitude} ${item.latitude}`).join(',') |
| | | formData.value.geom = `POLYGON((${str}))` |
| | | await fwAreaDivideSubmitApi(formData.value) |
| | |
| | | } |
| | | } |
| | | |
| | | watch( |
| | | () => flyDateRange.value, |
| | | () => { |
| | | formData.value.flyDateStart = flyDateRange.value[0] || '' |
| | | formData.value.flyDateEnd = flyDateRange.value[1] || '' |
| | | } |
| | | ) |
| | | |
| | | // 加载详情 |
| | | async function loadDetail() { |
| | | if (!formData.value.id) return |
| | | const res = await fwAreaDivideDetailApi({ id: formData.value.id }) |
| | | formData.value = res?.data?.data ?? initForm() |
| | | flyDateRange.value = [formData.value.flyDateStart, formData.value.flyDateEnd].filter(Boolean) |
| | | deviceIdList.value = formData.value.deviceIds ? formData.value.deviceIds.split(',') : [] |
| | | } |
| | | |
| | | // 格式化区域位置 |
| | |
| | | |
| | | // 获取设备列表 |
| | | async function getDeviceList() { |
| | | if (deviceOptions.value.length) return |
| | | const res = await fwDeviceListApi({ isAreaSelect: 1 }) |
| | | deviceOptions.value = res?.data?.data ?? [] |
| | | } |
| | | |
| | | // 关联设备变更 |
| | | function handleDeviceSelectionChange(rows) { |
| | | selectedDeviceRows.value = rows |
| | | const ids = rows.map(item => item.id) |
| | | formData.value.deviceIds = ids.join(',') |
| | | } |
| | | |
| | | function getDeviceIdList() { |
| | | if (!formData.value.deviceIds) return [] |
| | | return formData.value.deviceIds.split(',').filter(Boolean) |
| | | } |
| | | |
| | | function syncDeviceSelection() { |
| | | if (!deviceTableRef.value) return |
| | | deviceTableRef.value.clearSelection() |
| | | console.log(getDeviceIdList()) |
| | | const ids = new Set(getDeviceIdList().map(String)) |
| | | const rows = [] |
| | | deviceOptions.value.forEach(row => { |
| | | if (ids.has(String(row.id))) { |
| | | deviceTableRef.value.toggleRowSelection(row, true) |
| | | rows.push(row) |
| | | } |
| | | }) |
| | | selectedDeviceRows.value = rows |
| | | } |
| | | |
| | | // 打开弹框 |
| | | async function open({ mode, row } = {}) { |
| | | dialogMode.value = mode || 'add' |
| | | formData.value = dialogMode.value === 'add' ? initForm() : row |
| | | selectedDeviceRows.value = [] |
| | | await nextTick() |
| | | initMap() |
| | | await getDeviceList() |
| | | if (dialogMode.value === 'add') { |
| | | addPolygon() |
| | | } else if (dialogMode.value === 'edit') { |
| | |
| | | await loadDetail() |
| | | viewPolygon() |
| | | } |
| | | await nextTick() |
| | | syncDeviceSelection() |
| | | } |
| | | |
| | | onMounted(() => { |
| | |
| | | const tempLocation = ref({ longitude: null, latitude: null }) |
| | | |
| | | const rules = { |
| | | address: fieldRules(true, false, 50), |
| | | stationName: fieldRules(true, false, 50), |
| | | contactPerson: fieldRules(true, false, 50), |
| | | contactPhone: fieldRules(true, false, 50), |
| | | address: fieldRules(true, 50), |
| | | stationName: fieldRules(true, 50), |
| | | contactPerson: fieldRules(true, 50), |
| | | contactPhone: fieldRules(true, 50), |
| | | } |
| | | |
| | | // 关闭弹框 |
| | |
| | | const dictObj = inject('dictObj') |
| | | |
| | | const rules = { |
| | | sceneName: fieldRules(true, false, 50), |
| | | sceneType: fieldRules(true, true), |
| | | defenseLeader: fieldRules(true, false, 50), |
| | | leaderPhone: fieldRules(true, false, 50), |
| | | deviceMode: fieldRules(true, true), |
| | | longitude: fieldRules(true, true), |
| | | areaDivideIds: fieldRules(true, true), |
| | | sceneName: fieldRules(true, 50), |
| | | sceneType: fieldRules(true), |
| | | defenseLeader: fieldRules(true, 50), |
| | | leaderPhone: fieldRules(true, 50), |
| | | deviceMode: fieldRules(true), |
| | | longitude: fieldRules(true), |
| | | areaDivideIds: fieldRules(true), |
| | | } |
| | | |
| | | // 关闭弹框 |
| | |
| | | formData.value.areaDivideIds = ids.join(',') |
| | | formData.value.areaCount = ids.length |
| | | formData.value.defenseArea = calcDefenseArea(rows) |
| | | formRef.value?.validateField('areaDivideIds') |
| | | } |
| | | |
| | | function calcDefenseArea(rows) { |
| | |
| | | function syncAreaSelection() { |
| | | if (!areaTableRef.value) return |
| | | areaTableRef.value.clearSelection() |
| | | const ids = new Set(getAreaIdList().map(String)) |
| | | const ids = new Set(getAreaIdList()) |
| | | const rows = [] |
| | | areaList.value.forEach(row => { |
| | | if (ids.has(String(row.id))) { |
| | | if (ids.has(row.id)) { |
| | | areaTableRef.value.toggleRowSelection(row, true) |
| | | rows.push(row) |
| | | } |
| | |
| | | }) |
| | | |
| | | const rules = { |
| | | scrapReason: fieldRules(true, false, 200), |
| | | disposeWay: fieldRules(true, false, 200), |
| | | scrapTime: fieldRules(true, true), |
| | | scrapReason: fieldRules(true, 200), |
| | | disposeWay: fieldRules(true, 200), |
| | | scrapTime: fieldRules(true), |
| | | } |
| | | |
| | | // 关闭弹框 |
| | |
| | | }) |
| | | |
| | | const rules = { |
| | | charger: fieldRules(true, true), // 负责人 |
| | | contactPhone: fieldRules(true, false, 50), // 联系电话 |
| | | outTarget: fieldRules(true, false, 50), |
| | | outTime: fieldRules(true, true), |
| | | purpose: fieldRules(true, false, 50), // 用途 |
| | | charger: fieldRules(true), // 负责人 |
| | | contactPhone: fieldRules(true, 50), // 联系电话 |
| | | outTarget: fieldRules(true, 50), |
| | | outTime: fieldRules(true), |
| | | purpose: fieldRules(true, 50), // 用途 |
| | | } |
| | | |
| | | const userList = ref([]) |
| | |
| | | }) |
| | | |
| | | const rules = { |
| | | deviceName: fieldRules(true, false, 50), |
| | | deviceType: fieldRules(true, true), |
| | | deviceAtt: fieldRules(true, true), |
| | | deviceModel: fieldRules(true, false, 50), |
| | | deviceSpecification: fieldRules(true, false, 50), |
| | | manufacturer: fieldRules(true, false, 50), |
| | | source: fieldRules(true, false, 50), |
| | | purpose: fieldRules(true, false, 50), |
| | | belongDept: fieldRules(true, true), |
| | | contactPhone: fieldRules(true, false, 50), |
| | | charger: fieldRules(true, true), |
| | | deviceName: fieldRules(true, 50), |
| | | deviceType: fieldRules(true), |
| | | deviceAtt: fieldRules(true), |
| | | deviceModel: fieldRules(true, 50), |
| | | deviceSpecification: fieldRules(true, 50), |
| | | manufacturer: fieldRules(true, 50), |
| | | source: fieldRules(true, 50), |
| | | purpose: fieldRules(true, 50), |
| | | belongDept: fieldRules(true), |
| | | contactPhone: fieldRules(true, 50), |
| | | charger: fieldRules(true), |
| | | } |
| | | |
| | | const userList = ref([]) |
| | |
| | | }) |
| | | |
| | | const rules = { |
| | | deviceId: fieldRules(true, true), |
| | | planCycleType: fieldRules(true, true), |
| | | deviceId: fieldRules(true), |
| | | planCycleType: fieldRules(true), |
| | | planCycleValue: [{ required: true, message: '请选择', trigger: ['blur', 'change'] }], |
| | | } |
| | | |
| | |
| | | }) |
| | | |
| | | const rules = { |
| | | maintainContent: fieldRules(true, false, 200), |
| | | replacePart: fieldRules(true, false, 200), |
| | | maintainTime: fieldRules(true, true), |
| | | maintainContent: fieldRules(true, 200), |
| | | replacePart: fieldRules(true, 200), |
| | | maintainTime: fieldRules(true), |
| | | } |
| | | |
| | | // 关闭弹框 |
| | |
| | | }) |
| | | |
| | | const rules = { |
| | | droneName: fieldRules(true, false, 50), |
| | | areaCode: fieldRules(true, false, 50), |
| | | droneType: fieldRules(true, false, 50), |
| | | alarmType: fieldRules(true, false, 50), |
| | | alarmTime: fieldRules(true, false, 50), |
| | | triggerReason: fieldRules(false, false, 200), |
| | | droneName: fieldRules(true, 50), |
| | | areaCode: fieldRules(true, 50), |
| | | droneType: fieldRules(true, 50), |
| | | alarmType: fieldRules(true, 50), |
| | | alarmTime: fieldRules(true, 50), |
| | | triggerReason: fieldRules(false, 200), |
| | | } |
| | | |
| | | // 关闭弹框 |
| | |
| | | export function fieldRules(required,isSelect = false, max = 50, ) { |
| | | export function fieldRules(required,max) { |
| | | // export function fieldRules({ required = true, isSelect = false, max = 50,type = 'string' }) { |
| | | const trigger = ['blur', 'change'] |
| | | const rules = [] |
| | | const isInput = typeof max === 'number' |
| | | if (required) { |
| | | rules.push({ required: true, message: isSelect ? '请选择' : '请输入', trigger, }) |
| | | rules.push({ required: true, message: isInput ? '请输入' : '请选择', trigger }) |
| | | } |
| | | if (!isSelect) { |
| | | if (isInput) { |
| | | rules.push({ max, message: `长度不超过${max}`, trigger }) |
| | | } |
| | | return rules |