Sfoglia il codice sorgente

feat(warning): 更新预警事项编码生成功能

- 添加区域选择功能,支持城南、城北、太常等区域
- 增加排水类型选择,支持雨水和污水分类
- 修改编码生成规则为区域+类型+[雨污分类]+日期+流水号
- 更新表单验证逻辑,确保必填字段完整性
- 集成新的API参数结构,支持多维度编码生成
- 优化界面显示,调整步骤导航和字段布局
林仔 2 giorni fa
parent
commit
a63e1469c6

+ 2 - 2
src/api/warning/list.js

@@ -46,11 +46,11 @@ export function getWarningItemByCode(itemCode) {
   })
 }
 
-export function generateWarningItemCode(warningType, warningLevel) {
+export function generateWarningItemCode(params) {
   return request({
     url: '/warning/item/code/generate',
     method: 'get',
-    params: { warningType, warningLevel }
+    params
   })
 }
 

+ 56 - 32
src/views/subSystem/warningList/codeGenerate/index.vue

@@ -4,7 +4,7 @@
       <div>
         <span>IDENTITY GENERATOR</span>
         <h1>事项编码生成</h1>
-        <p>选择预警类型与等级,系统按统一编码规则生成唯一的预警事项编码。</p>
+        <p>选择区域、预警类型及排水雨污分类,系统按统一编码规则生成唯一事项编码。</p>
       </div>
       <div class="code-orbit">
         <div class="orbit-line"></div>
@@ -16,16 +16,27 @@
       <el-card class="steps-card" shadow="never">
         <div class="step-heading">
           <span>编码配置</span>
-          <small>STEP {{ currentStep }}/2</small>
+          <small>STEP {{ currentStep }}/3</small>
         </div>
         <div class="step-track">
-          <div class="track-item active"><span>01</span><div><strong>选择类型</strong><small>确定预警所属领域</small></div></div>
+          <div class="track-item active"><span>01</span><div><strong>选择区域</strong><small>确定编码所属区域</small></div></div>
           <div class="track-line"></div>
-          <div class="track-item" :class="{ active: form.warningLevel }"><span>02</span><div><strong>选择等级</strong><small>确定预警响应级别</small></div></div>
+          <div class="track-item" :class="{ active: form.warningType }"><span>02</span><div><strong>选择类型</strong><small>确定预警所属领域</small></div></div>
           <div class="track-line"></div>
           <div class="track-item" :class="{ active: generatedCode }"><span>03</span><div><strong>生成编码</strong><small>得到唯一事项标识</small></div></div>
         </div>
 
+        <div class="field-block">
+          <label>区域</label>
+          <div class="type-grid region-grid">
+            <button v-for="item in warningRegions" :key="item.value" :class="{ selected: form.region === item.value }" @click="selectRegion(item.value)">
+              <span class="type-symbol"><el-icon><Location /></el-icon></span>
+              <span>{{ item.label }}({{ item.code.toLowerCase() }})</span>
+              <el-icon v-if="form.region === item.value" class="selected-icon"><Check /></el-icon>
+            </button>
+          </div>
+        </div>
+
         <div class="field-block">
           <label>预警类型</label>
           <div class="type-grid">
@@ -37,19 +48,13 @@
           </div>
         </div>
 
-        <div class="field-block">
-          <label>预警级别</label>
-          <div class="level-grid">
-            <button
-              v-for="item in warningLevels"
-              :key="item.value"
-              :class="{ selected: form.warningLevel === item.value }"
-              :style="{ '--level-color': item.color }"
-              @click="selectLevel(item.value)"
-            >
-              <span class="level-dot"></span>
-              <div><strong>{{ item.shortLabel }}预警</strong><small>{{ item.label.match(/(.*)/)?.[0] || '' }}</small></div>
-              <el-icon v-if="form.warningLevel === item.value"><Check /></el-icon>
+        <div v-if="isDrainage" class="field-block">
+          <label>排水类型</label>
+          <div class="type-grid drainage-grid">
+            <button v-for="item in drainageSubtypes" :key="item.value" :class="{ selected: form.drainageType === item.value }" @click="selectDrainageType(item.value)">
+              <span class="type-symbol"><el-icon><Connection /></el-icon></span>
+              <span>{{ item.label }}({{ item.code.toLowerCase() }})</span>
+              <el-icon v-if="form.drainageType === item.value" class="selected-icon"><Check /></el-icon>
             </button>
           </div>
         </div>
@@ -68,9 +73,9 @@
           <strong>{{ generatedCode }}</strong>
           <button class="copy-button" @click="copyCode"><el-icon><CopyDocument /></el-icon> 复制编码</button>
           <div class="code-parts">
-            <div><b>WI</b><span>事项标识</span></div>
+            <div><b>{{ regionPrefix }}</b><span>区域缩写</span></div>
             <div><b>{{ typePrefix }}</b><span>类型缩写</span></div>
-            <div><b>{{ form.warningLevel }}</b><span>预警等级</span></div>
+            <div v-if="isDrainage"><b>{{ drainagePrefix }}</b><span>雨污分类</span></div>
             <div><b>{{ datePart }}</b><span>生成日期</span></div>
             <div><b>{{ sequencePart }}</b><span>流水号</span></div>
           </div>
@@ -78,12 +83,12 @@
         <div v-else class="empty-result">
           <div class="empty-illustration"><el-icon><MagicStick /></el-icon></div>
           <strong>等待生成编码</strong>
-          <p>完成左侧类型和等级选择后<br />点击“生成事项编码”获取唯一标识</p>
+          <p>完成左侧区域和类型选择后<br />点击“生成事项编码”获取唯一标识</p>
         </div>
         <div class="rule-box">
           <div class="rule-title"><el-icon><InfoFilled /></el-icon> 编码规则</div>
-          <p><code>WI + 类型缩写 + 等级 + YYYYMMDD + 4位流水号</code></p>
-          <span>同一类型、等级和日期下流水号自动递增,确保编码唯一。</span>
+          <p><code>区域 + 类型 + [雨污分类] + YYYYMMDD + 4位流水号</code></p>
+          <span>排水事项必须选择雨水或污水;同一组合和日期下流水号自动递增。</span>
         </div>
       </el-card>
     </div>
@@ -93,18 +98,27 @@
 <script setup name="WarningCodeGenerate">
 import { computed, onMounted, reactive, ref } from 'vue'
 import { ElMessage } from 'element-plus'
-import { Check, Connection, CopyDocument, InfoFilled, Key, MagicStick, Warning } from '@element-plus/icons-vue'
+import { Check, Connection, CopyDocument, InfoFilled, Key, Location, MagicStick, Warning } from '@element-plus/icons-vue'
 import { getDicts } from '@/api/system/dict/data'
 import { generateWarningItemCode } from '@/api/warning/list'
-import { fallbackWarningTypes, normalizeWarningTypeDict, warningLevels } from '../shared'
+import {
+  drainageSubtypes,
+  fallbackWarningTypes,
+  normalizeWarningTypeDict,
+  warningRegions,
+  warningTypeCodes
+} from '../shared'
 
 const loading = ref(false)
 const generatedCode = ref('')
 const warningTypes = ref(fallbackWarningTypes)
-const form = reactive({ warningType: '', warningLevel: '' })
-const canGenerate = computed(() => !!form.warningType && !!form.warningLevel)
-const currentStep = computed(() => generatedCode.value ? 3 : form.warningLevel ? 2 : 1)
-const typePrefix = computed(() => (form.warningType || '').slice(0, 3).toUpperCase())
+const form = reactive({ region: '', warningType: '', drainageType: '' })
+const isDrainage = computed(() => warningTypeCodes[form.warningType] === 'PS' || form.warningType === '排水')
+const canGenerate = computed(() => !!form.region && !!form.warningType && (!isDrainage.value || !!form.drainageType))
+const currentStep = computed(() => generatedCode.value ? 3 : form.warningType ? 2 : 1)
+const regionPrefix = computed(() => warningRegions.find(item => item.value === form.region)?.code || '--')
+const typePrefix = computed(() => warningTypeCodes[form.warningType] || '--')
+const drainagePrefix = computed(() => drainageSubtypes.find(item => item.value === form.drainageType)?.code || '--')
 const datePart = computed(() => generatedCode.value ? generatedCode.value.slice(-12, -4) : 'YYYYMMDD')
 const sequencePart = computed(() => generatedCode.value ? generatedCode.value.slice(-4) : '0001')
 
@@ -118,22 +132,32 @@ async function loadTypes() {
 }
 function selectType(value) {
   form.warningType = value
+  if (!isDrainage.value) form.drainageType = ''
+  generatedCode.value = ''
+}
+function selectRegion(value) {
+  form.region = value
   generatedCode.value = ''
 }
-function selectLevel(value) {
-  form.warningLevel = value
+function selectDrainageType(value) {
+  form.drainageType = value
   generatedCode.value = ''
 }
 function reset() {
+  form.region = ''
   form.warningType = ''
-  form.warningLevel = ''
+  form.drainageType = ''
   generatedCode.value = ''
 }
 async function generate() {
   if (!canGenerate.value) return
   loading.value = true
   try {
-    const res = await generateWarningItemCode(form.warningType, form.warningLevel)
+    const res = await generateWarningItemCode({
+      region: form.region,
+      warningType: form.warningType,
+      drainageType: isDrainage.value ? form.drainageType : undefined
+    })
     generatedCode.value = res.data || ''
     if (generatedCode.value) ElMessage.success('事项编码生成成功')
   } finally {

+ 34 - 8
src/views/subSystem/warningList/itemManage/index.vue

@@ -152,14 +152,21 @@
             </el-col>
           </el-row>
           <el-row :gutter="16">
-            <el-col :span="12">
+            <el-col :span="8">
+              <el-form-item label="编码区域" prop="region">
+                <el-select v-model="form.region" placeholder="请选择区域" @change="handleCodeDependencyChange">
+                  <el-option v-for="item in warningRegions" :key="item.value" :label="`${item.label}(${item.code.toLowerCase()})`" :value="item.value" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
               <el-form-item label="预警类型" prop="warningType">
                 <el-select v-model="form.warningType" placeholder="请选择预警类型" @change="handleCodeDependencyChange">
                   <el-option v-for="item in warningTypes" :key="item.value" :label="item.label" :value="item.value" />
                 </el-select>
               </el-form-item>
             </el-col>
-            <el-col :span="12">
+            <el-col :span="8">
               <el-form-item label="预警级别" prop="warningLevel">
                 <el-select v-model="form.warningLevel" placeholder="请选择预警级别" @change="handleCodeDependencyChange">
                   <el-option v-for="item in warningLevels" :key="item.value" :label="item.label" :value="item.value" />
@@ -168,9 +175,16 @@
             </el-col>
           </el-row>
           <el-row :gutter="16">
+            <el-col v-if="isDrainage" :span="8">
+              <el-form-item label="排水类型" prop="drainageType">
+                <el-select v-model="form.drainageType" placeholder="请选择雨水/污水" @change="handleCodeDependencyChange">
+                  <el-option v-for="item in drainageSubtypes" :key="item.value" :label="`${item.label}(${item.code.toLowerCase()})`" :value="item.value" />
+                </el-select>
+              </el-form-item>
+            </el-col>
             <el-col :span="14">
               <el-form-item label="事项编码" prop="itemCode">
-                <el-input v-model="form.itemCode" placeholder="选择类型和等级后自动生成">
+                <el-input v-model="form.itemCode" placeholder="选择区域和类型后自动生成">
                   <template #append>
                     <el-button :icon="MagicStick" :loading="codeLoading" @click="generateCode">生成</el-button>
                   </template>
@@ -266,7 +280,7 @@
 </template>
 
 <script setup name="WarningItemManage">
-import { onMounted, reactive, ref } from 'vue'
+import { computed, onMounted, reactive, ref } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import { ArrowDown, Delete, Edit, MagicStick, Plus, Refresh, RefreshRight, Search, View } from '@element-plus/icons-vue'
 import { getDicts } from '@/api/system/dict/data'
@@ -280,6 +294,7 @@ import {
 } from '@/api/warning/list'
 import {
   cloneDefaultLinks,
+  drainageSubtypes,
   fallbackWarningTypes,
   industryOptions,
   itemStatuses,
@@ -288,7 +303,9 @@ import {
   optionLabel,
   parseLinkConfig,
   statusMeta,
-  warningLevels
+  warningLevels,
+  warningRegions,
+  warningTypeCodes
 } from '../shared'
 
 const loading = ref(false)
@@ -303,10 +320,12 @@ const warningTypes = ref(fallbackWarningTypes)
 const preview = reactive({})
 const query = reactive({ pageNum: 1, pageSize: 10, itemName: '', warningType: '', warningLevel: '', status: '' })
 const form = reactive(createEmptyForm())
+const isDrainage = computed(() => warningTypeCodes[form.warningType] === 'PS' || form.warningType === '排水')
 const rules = {
   itemName: [{ required: true, message: '请输入事项名称', trigger: 'blur' }],
   warningType: [{ required: true, message: '请选择预警类型', trigger: 'change' }],
   warningLevel: [{ required: true, message: '请选择预警级别', trigger: 'change' }],
+  region: [{ required: true, message: '请选择编码区域', trigger: 'change' }],
   itemCode: [{ required: true, message: '请生成或填写事项编码', trigger: 'blur' }],
   industry: [{ required: true, message: '请选择所属行业', trigger: 'change' }],
   duration: [{ required: true, message: '请设置预警时长', trigger: 'change' }]
@@ -317,8 +336,10 @@ function createEmptyForm() {
     itemId: '',
     itemCode: '',
     itemName: '',
+    region: '',
     warningType: '',
     warningLevel: '',
+    drainageType: '',
     warningSpecial: '',
     industry: '',
     duration: 24,
@@ -394,16 +415,21 @@ async function openPreview(row) {
   previewVisible.value = true
 }
 function handleCodeDependencyChange() {
+  if (!isDrainage.value) form.drainageType = ''
   if (!form.itemId) form.itemCode = ''
 }
 async function generateCode() {
-  if (!form.warningType || !form.warningLevel) {
-    ElMessage.warning('请先选择预警类型和预警级别')
+  if (!form.region || !form.warningType || (isDrainage.value && !form.drainageType)) {
+    ElMessage.warning(isDrainage.value ? '请先选择区域、预警类型和排水类型' : '请先选择区域和预警类型')
     return
   }
   codeLoading.value = true
   try {
-    const res = await generateWarningItemCode(form.warningType, form.warningLevel)
+    const res = await generateWarningItemCode({
+      region: form.region,
+      warningType: form.warningType,
+      drainageType: isDrainage.value ? form.drainageType : undefined
+    })
     form.itemCode = res.data
   } finally {
     codeLoading.value = false

+ 18 - 0
src/views/subSystem/warningList/shared.js

@@ -5,6 +5,24 @@ export const fallbackWarningTypes = [
   { label: '窨井预警', value: 'MANHOLE' }
 ]
 
+export const warningRegions = [
+  { label: '城南', value: 'CN', code: 'CN' },
+  { label: '城北', value: 'CB', code: 'CB' },
+  { label: '太常', value: 'TC', code: 'TC' }
+]
+
+export const drainageSubtypes = [
+  { label: '雨水', value: 'YS', code: 'YS' },
+  { label: '污水', value: 'WS', code: 'WS' }
+]
+
+export const warningTypeCodes = {
+  GAS_PIPE: 'RQ',
+  WATER_PIPE: 'GS',
+  SEWER_PIPE: 'PS',
+  MANHOLE: 'YJ'
+}
+
 export const warningLevels = [
   { label: '蓝色预警(IV级)', shortLabel: '蓝色', value: '1', color: '#3b82f6', tagType: 'primary' },
   { label: '黄色预警(III级)', shortLabel: '黄色', value: '2', color: '#eab308', tagType: 'warning' },