Lin Qilong 3 днів тому
батько
коміт
d4b231abc1

+ 33 - 13
gw-slaj/src/main/resources/mapper/slaj/infoquery/InfoQueryMapper.xml

@@ -43,13 +43,19 @@
             e.eng_type AS "engType",
             e.impo_grad AS "impoGrad",
             e.eng_stat AS "engStat",
-            -- 主管单位:优先管辖单位(org_jurd),其次管理单位(org_rest)
-            coalesce(oj.wiun_name, orr.wiun_name, jd.org_name, rd.org_name) AS "supOrgName"
+            -- 主管单位:优先所属单位的主管单位(att_org_ext.admin_wiun_guid),
+            -- 其次老数据管辖/管理单位(org_jurd/org_rest),最后兜底所属单位
+            coalesce(adm.org_name, jd.org_name, rd.org_name, org.org_name) AS "supOrgName"
         FROM att_eng_base e
-        LEFT JOIN att_org_ext oj ON oj.org_guid = e.org_jurd
-        LEFT JOIN att_org_ext orr ON orr.org_guid = e.org_rest
+        LEFT JOIN (
+            SELECT DISTINCT ON (org_guid) org_guid, admin_wiun_guid
+            FROM att_org_ext
+            ORDER BY org_guid
+        ) x ON x.org_guid = e.org_guid
+        LEFT JOIN att_org_base adm ON adm.guid = x.admin_wiun_guid
         LEFT JOIN att_org_base jd ON jd.guid = e.org_jurd
         LEFT JOIN att_org_base rd ON rd.guid = e.org_rest
+        LEFT JOIN att_org_base org ON org.guid = e.org_guid
         <where>
             <if test="orgGuid != null and orgGuid != ''">AND e.org_guid = #{orgGuid}::text</if>
             <if test="engName != null and engName != ''">AND e.eng_name LIKE '%' || #{engName} || '%'</if>
@@ -73,13 +79,19 @@
             e.eng_type AS "engType",
             e.impo_grad AS "impoGrad",
             e.eng_stat AS "engStat",
-            -- 主管单位:优先管辖单位(org_jurd),其次管理单位(org_rest)
-            coalesce(oj.wiun_name, orr.wiun_name, jd.org_name, rd.org_name) AS "supOrgName"
+            -- 主管单位:优先所属单位的主管单位(att_org_ext.admin_wiun_guid),
+            -- 其次老数据管辖/管理单位(org_jurd/org_rest),最后兜底所属单位
+            coalesce(adm.org_name, jd.org_name, rd.org_name, org.org_name) AS "supOrgName"
         FROM att_eng_base e
-        LEFT JOIN att_org_ext oj ON oj.org_guid = e.org_jurd
-        LEFT JOIN att_org_ext orr ON orr.org_guid = e.org_rest
+        LEFT JOIN (
+            SELECT DISTINCT ON (org_guid) org_guid, admin_wiun_guid
+            FROM att_org_ext
+            ORDER BY org_guid
+        ) x ON x.org_guid = e.org_guid
+        LEFT JOIN att_org_base adm ON adm.guid = x.admin_wiun_guid
         LEFT JOIN att_org_base jd ON jd.guid = e.org_jurd
         LEFT JOIN att_org_base rd ON rd.guid = e.org_rest
+        LEFT JOIN att_org_base org ON org.guid = e.org_guid
         <where>
             <if test="orgGuid != null and orgGuid != ''">
                 AND e.org_guid IN (SELECT guid FROM subOrgs)
@@ -321,9 +333,8 @@
             h.if_control AS "ifControl",
             h.safe_prec AS "safePrec",
             h.emer_prec AS "emerPrec",
-            -- 一源一案:该危险源所属单位存在应急预案则视为已落实(无专用字段,按此口径推导)
-            CASE WHEN EXISTS (SELECT 1 FROM t_busi_conplan_basic cp WHERE cp.org_guid = h.org_guid)
-                 THEN 'Y' ELSE 'N' END AS "oneSourceOneCase",
+            -- 一源一案:所属单位存在应急预案时展示预案列表([{guid,planName}],前端可点击查看预案)
+            COALESCE(cp.plans::text, '[]') AS "oneSourceOneCase",
             h.haz_stat AS "hazStat",
             h.sup_org AS "supOrg",
             h.sup_pers AS "supPers",
@@ -331,7 +342,16 @@
             h.coll_time AS "collTime"
         FROM obj_haz h
         LEFT JOIN att_org_base o ON h.org_guid = o.guid
-        LEFT JOIN att_eng_base e ON h.eng_guid = e.guid
+        LEFT JOIN obj_eng e ON h.eng_guid = e.guid
+        -- 一源一案用:按单位聚合应急预案(含 guid/名称;HighGo 不支持 SELECT 列表中的相关子查询)
+        LEFT JOIN (
+            SELECT org_guid,
+                   jsonb_agg(jsonb_build_object('guid', guid, 'planName', plan_name)
+                             ORDER BY create_time DESC) AS plans
+            FROM t_busi_conplan_basic
+            WHERE org_guid IS NOT NULL AND org_guid != ''
+            GROUP BY org_guid
+        ) cp ON cp.org_guid = h.org_guid
         <where>
             <if test="orgGuid != null and orgGuid != ''">AND h.org_guid = #{orgGuid}::text</if>
             <if test="engGuid != null and engGuid != ''">AND h.eng_guid = #{engGuid}::text</if>
@@ -358,7 +378,7 @@
             h.coll_time AS "collTime"
         FROM obj_hidd h
         LEFT JOIN att_org_base o ON h.org_guid = o.guid
-        LEFT JOIN att_eng_base e ON h.eng_guid = e.guid
+        LEFT JOIN obj_eng e ON h.eng_guid = e.guid
         LEFT JOIN bis_hidd_inve bi ON h.insp_rec_guid = bi.guid
         LEFT JOIN (
             SELECT DISTINCT ON (hidd_guid) hidd_guid, gover_resp_wiun_guid, gover_resp_wiun, rect_leg_pers

+ 3 - 3
gw-ui/src/views/slaj/eng/attengcws/index.vue

@@ -42,12 +42,12 @@
 
       <el-table v-loading="loading" :data="dataList" height="calc(100% - 100px)" @selection-change="handleSelect">
         <el-table-column type="selection" width="55" align="center" />
-        <el-table-column label="工程名称" prop="engName" align="center" :show-overflow-tooltip="true"
+        <el-table-column label="工程名称" :min-width="220" prop="engName" header-align="center" align="left" :show-overflow-tooltip="true"
           v-if="columns.engName.visible" />
-        <el-table-column label="工程代码" align="center" v-if="columns.cwsCode.visible">
+        <el-table-column label="工程代码" :min-width="140" align="center" v-if="columns.cwsCode.visible">
           <template #default="scope">{{ scope.row.engCode || scope.row.cwsCode }}</template>
         </el-table-column>
-        <el-table-column label="工程位置" prop="cwsLoc" align="center" v-if="columns.cwsLoc.visible"  :show-overflow-tooltip="true"/>
+        <el-table-column label="工程位置" :min-width="240" prop="cwsLoc" header-align="center" align="left" v-if="columns.cwsLoc.visible"  :show-overflow-tooltip="true"/>
         <el-table-column label="工程类型" align="center" v-if="columns.engType.visible">
           <template #default="scope">
             <dict-tag :options="slaj_cws_eng_type" :value="scope.row.engType" />

+ 2 - 2
gw-ui/src/views/slaj/eng/attengdike/index.vue

@@ -56,9 +56,9 @@
       </div>
       <el-table v-loading="loading" :data="dataList" height="calc(100% - 100px)" @selection-change="handleSelect">
         <el-table-column type="selection" width="55" align="center"/>
-        <el-table-column label="工程名称" prop="engName" align="center" :show-overflow-tooltip="true"
+        <el-table-column label="工程名称" :min-width="220" prop="engName" align="left" header-align="center" :show-overflow-tooltip="true"
                          v-if="columns.engName.visible"/>
-        <el-table-column label="堤防代码" align="center" v-if="columns.dikeCode.visible">
+        <el-table-column label="堤防代码" :min-width="150" align="center" v-if="columns.dikeCode.visible">
           <template #default="scope">{{ scope.row.engCode || scope.row.dikeCode }}</template>
         </el-table-column>
         <el-table-column label="堤防级别" align="center" v-if="columns.dikeGrad.visible">

+ 3 - 3
gw-ui/src/views/slaj/eng/attenghyst/index.vue

@@ -54,12 +54,12 @@
 
       <el-table v-loading="loading" :data="dataList" height="calc(100% - 100px)" @selection-change="handleSelect">
         <el-table-column type="selection" width="55" align="center"/>
-        <el-table-column label="工程名称" prop="engName" align="center" :show-overflow-tooltip="true"
+        <el-table-column label="工程名称" :min-width="220" prop="engName" header-align="center" align="left" :show-overflow-tooltip="true"
                          v-if="columns.engName.visible"/>
-        <el-table-column label="电站代码" align="center" v-if="columns.hystCode.visible">
+        <el-table-column label="电站代码" :min-width="150" align="center" v-if="columns.hystCode.visible">
           <template #default="scope">{{ scope.row.engCode || scope.row.hystCode }}</template>
         </el-table-column>
-        <el-table-column label="电站位置" prop="hystSite" align="center" v-if="columns.hystSite.visible"/>
+        <el-table-column label="电站位置" :min-width="150" prop="hystSite" header-align="center" align="left" v-if="columns.hystSite.visible"/>
         <el-table-column label="电站类型" align="center" v-if="columns.hystType.visible">
           <template #default="scope">
             <dict-tag

+ 3 - 3
gw-ui/src/views/slaj/eng/attengirr/index.vue

@@ -32,12 +32,12 @@
 
       <el-table v-loading="loading" :data="dataList" @selection-change="handleSelect" height="calc(100% - 100px)">
       <el-table-column type="selection" width="55" align="center"/>
-      <el-table-column label="工程名称" prop="engName" align="center" :show-overflow-tooltip="true"
+      <el-table-column label="工程名称" :min-width="220" prop="engName" header-align="center" align="left" :show-overflow-tooltip="true"
         v-if="columns.engName.visible"/>
-      <el-table-column label="灌区代码" align="center" v-if="columns.irrCode.visible">
+      <el-table-column label="灌区代码" :min-width="150" align="center" v-if="columns.irrCode.visible">
           <template #default="scope">{{ scope.row.engCode || scope.row.irrCode }}</template>
         </el-table-column>
-      <el-table-column label="灌区位置" prop="irrLoc" align="center" v-if="columns.irrLoc.visible"/>
+      <el-table-column label="灌区位置" :min-width="240" prop="irrLoc" header-align="center" align="left" v-if="columns.irrLoc.visible"/>
       <el-table-column label="工程规模" align="center" v-if="columns.engScal.visible">
         <template #default="scope">
           <dict-tag :options="slaj_eng_scal_irr" :value="scope.row.engScal"/>

+ 3 - 3
gw-ui/src/views/slaj/eng/attengothe/index.vue

@@ -54,11 +54,11 @@
 
       <el-table v-loading="loading" :data="dataList" @selection-change="handleSelect" height="calc(100% - 100px)">
         <el-table-column type="selection" width="55" align="center"/>
-        <el-table-column label="工程名称" prop="engName" align="center"/>
-        <el-table-column label="工程代码" align="center">
+        <el-table-column label="工程名称"  :min-width="220" prop="engName" header-align="center" align="left"/>
+        <el-table-column label="工程代码" :min-width="150" align="center">
           <template #default="scope">{{ scope.row.engCode || scope.row.objCode }}</template>
         </el-table-column>
-        <el-table-column label="工程位置" prop="engLoc" align="center" :show-overflow-tooltip="true"/>
+        <el-table-column label="工程位置" :min-width="220" prop="engLoc" header-align="center" align="left" :show-overflow-tooltip="true"/>
         <el-table-column label="自定义1" prop="custom1" align="center"/>
         <el-table-column label="自定义2" prop="custom2" align="center"/>
         <el-table-column label="自定义3" prop="custom3" align="center"/>

+ 3 - 3
gw-ui/src/views/slaj/eng/attengpust/index.vue

@@ -56,12 +56,12 @@
 
       <el-table v-loading="loading" :data="dataList" height="calc(100% - 100px)" @selection-change="handleSelect">
         <el-table-column type="selection" width="55" align="center"/>
-        <el-table-column label="工程名称" prop="engName" align="center" :show-overflow-tooltip="true"
+        <el-table-column label="工程名称" :min-width="220" prop="engName" header-align="center" align="left" :show-overflow-tooltip="true"
                          v-if="columns.engName.visible"/>
-        <el-table-column label="泵站代码" align="center" v-if="columns.pustCode.visible">
+        <el-table-column label="泵站代码" :min-width="150" align="center" v-if="columns.pustCode.visible">
           <template #default="scope">{{ scope.row.engCode || scope.row.pustCode }}</template>
         </el-table-column>
-        <el-table-column label="泵站位置" prop="pustLoc" align="center" v-if="columns.pustLoc.visible"/>
+        <el-table-column label="泵站位置" :min-width="240" prop="pustLoc" header-align="center" align="left" v-if="columns.pustLoc.visible"/>
         <el-table-column label="泵站类型" align="center" v-if="columns.pustType.visible">
           <template #default="scope">
             <dict-tag

+ 3 - 3
gw-ui/src/views/slaj/eng/attengres/index.vue

@@ -42,12 +42,12 @@
 
       <el-table v-loading="loading" :data="dataList" height="calc(100% - 100px)" @selection-change="handleSelect">
         <el-table-column type="selection" width="55" align="center" />
-        <el-table-column label="工程名称" width="150" prop="engName" align="center" :show-overflow-tooltip="true"
+        <el-table-column label="工程名称" width="220" prop="engName" header-align="center" align="left" :show-overflow-tooltip="true"
           v-if="columns.engName.visible" />
-        <el-table-column label="水库代码" align="center" v-if="columns.resCode.visible">
+        <el-table-column label="水库代码" width="150" align="center" v-if="columns.resCode.visible">
           <template #default="scope">{{ scope.row.engCode || scope.row.resCode }}</template>
         </el-table-column>
-        <el-table-column label="水库位置" prop="resLoc" align="center" v-if="columns.resLoc.visible" />
+        <el-table-column label="水库位置" width="240" prop="resLoc" align="left" header-align="center" v-if="columns.resLoc.visible" />
         <el-table-column label="中心经度(°)" prop="cenLong" align="center" v-if="columns.cenLong.visible" />
         <el-table-column label="中心纬度(°)" prop="cenLat" align="center" v-if="columns.cenLat.visible" />
         <el-table-column label="工程等级" align="center" v-if="columns.engGrad.visible">

+ 3 - 3
gw-ui/src/views/slaj/eng/attengsd/index.vue

@@ -56,12 +56,12 @@
 
       <el-table v-loading="loading" :data="dataList" @selection-change="handleSelect" height="calc(100% - 100px)">
         <el-table-column type="selection" width="55" align="center"/>
-        <el-table-column label="工程名称" prop="engName" align="center" :show-overflow-tooltip="true"
+        <el-table-column label="工程名称" :min-width="220" prop="engName" header-align="center" align="left" :show-overflow-tooltip="true"
                          v-if="columns.engName.visible"/>
-        <el-table-column label="淤地坝代码" align="center" v-if="columns.sdCode.visible">
+        <el-table-column label="淤地坝代码" :min-width="150" align="center" v-if="columns.sdCode.visible">
           <template #default="scope">{{ scope.row.engCode || scope.row.sdCode }}</template>
         </el-table-column>
-        <el-table-column label="淤地坝位置" prop="sdLoc" align="center" v-if="columns.sdLoc.visible"/>
+        <el-table-column label="淤地坝位置" :min-width="240" prop="sdLoc" header-align="center" align="left" v-if="columns.sdLoc.visible"/>
         <el-table-column label="控制面积(km2)" prop="conArea" align="center" v-if="columns.conArea.visible"/>
         <el-table-column label="总库容(104m3)" prop="totCap" align="center" v-if="columns.totCap.visible"/>
         <el-table-column label="淤积库容(104m3)" width="130" prop="warpCap" align="center"

+ 2 - 10
gw-ui/src/views/slaj/eng/attengwadi/index.vue

@@ -54,19 +54,11 @@
 
       <el-table v-loading="loading" :data="dataList" @selection-change="handleSelect" height="calc(100% - 100px)">
         <el-table-column type="selection" width="55" align="center"/>
-        <el-table-column label="工程名称" prop="engName" align="center" :show-overflow-tooltip="true"
+        <el-table-column label="工程名称" :min-width="220" prop="engName" header-align="center" align="left" :show-overflow-tooltip="true"
                          v-if="columns.engName.visible"/>
-        <el-table-column label="引调水代码" align="center" width="120" v-if="columns.wadiCode.visible">
+        <el-table-column label="引调水代码" :min-width="150" align="center" width="120" v-if="columns.wadiCode.visible">
           <template #default="scope">{{ scope.row.engCode || scope.row.wadiCode }}</template>
         </el-table-column>
-        <el-table-column label="起点位置" prop="startLoc" align="center" v-if="columns.startLoc.visible"/>
-        <el-table-column label="终点位置" prop="endLoc" align="center" v-if="columns.endLoc.visible"/>
-        <el-table-column label="起点经度(°)" width="110" prop="startLong" align="center"
-                         v-if="columns.startLong.visible"/>
-        <el-table-column label="起点纬度(°)" width="110" prop="startLat" align="center"
-                         v-if="columns.startLat.visible"/>
-        <el-table-column label="终点经度(°)" width="110" prop="endLong" align="center" v-if="columns.endLong.visible"/>
-        <el-table-column label="终点纬度(°)" width="110" prop="endLat" align="center" v-if="columns.endLat.visible"/>
         <el-table-column label="工程等级" align="center" v-if="columns.engGrad.visible">
           <template #default="scope">
             <dict-tag :options="slaj_eng_grad_wadi" :value="scope.row.engGrad"/>

+ 3 - 3
gw-ui/src/views/slaj/eng/attengwaga/index.vue

@@ -54,12 +54,12 @@
 
       <el-table v-loading="loading" :data="dataList" @selection-change="handleSelect" height="calc(100% - 100px)">
         <el-table-column type="selection" width="55" align="center"/>
-        <el-table-column label="工程名称" prop="engName" align="center" :show-overflow-tooltip="true"
+        <el-table-column label="工程名称" :min-width="220" prop="engName" header-align="center" align="left" :show-overflow-tooltip="true"
                          v-if="columns.engName.visible"/>
-        <el-table-column label="水闸代码" align="center" v-if="columns.wagaCode.visible">
+        <el-table-column label="水闸代码" :min-width="150" align="center" v-if="columns.wagaCode.visible">
           <template #default="scope">{{ scope.row.engCode || scope.row.wagaCode }}</template>
         </el-table-column>
-        <el-table-column label="水闸位置" prop="wagaLoc" align="center" v-if="columns.wagaLoc.visible"/>
+        <el-table-column label="水闸位置" :min-width="240" prop="wagaLoc" header-align="center" align="left" v-if="columns.wagaLoc.visible"/>
         <el-table-column label="水闸类型" align="center" v-if="columns.wagaType.visible">
           <template #default="scope">
             <dict-tag

+ 50 - 7
gw-ui/src/views/slaj/infoquery/eng/index.vue

@@ -41,7 +41,7 @@
         </el-form>
       </div>
 
-      <el-table v-loading="loading" :data="dataList" style="width: 100%">
+      <el-table v-loading="loading" :data="dataList" style="width: 100%" height="calc(100% - 190px)">
         <el-table-column type="index" label="序号" width="60" align="center" />
         <el-table-column label="工程名称" align="center" prop="engName" min-width="180" :show-overflow-tooltip="true" />
         <el-table-column label="工程类型" align="center" prop="engType" width="110">
@@ -49,8 +49,16 @@
             <dict-tag :options="slaj_eng_type" :value="scope.row.engType" />
           </template>
         </el-table-column>
-        <el-table-column label="重要性" align="center" prop="impoGrad" width="110" />
-        <el-table-column label="工程状态" align="center" prop="engStat" width="110" />
+        <el-table-column label="重要性" align="center" prop="impoGrad" width="110">
+          <template #default="scope">
+            <dict-tag :options="DPC_IMPO_GRAD" :value="scope.row.impoGrad" />
+          </template>
+        </el-table-column>
+        <el-table-column label="工程状态" align="center" prop="engStat" width="110">
+          <template #default="scope">
+            <dict-tag :options="DPC_ENG_STAT" :value="scope.row.engStat" />
+          </template>
+        </el-table-column>
         <el-table-column label="主管单位" align="center" prop="supOrgName" min-width="180" :show-overflow-tooltip="true" />
         <el-table-column label="操作" align="center" width="90" fixed="right">
           <template #default="scope">
@@ -97,8 +105,16 @@
             </el-table-column>
             <el-table-column label="安全措施" align="center" prop="safePrec" min-width="140" :show-overflow-tooltip="true" />
             <el-table-column label="应急措施" align="center" prop="emerPrec" min-width="140" :show-overflow-tooltip="true" />
-            <el-table-column label="一源一案" align="center" prop="oneSourceOneCase" width="100">
-              <template #default="scope"><dict-tag :options="sys_yes_no" :value="scope.row.oneSourceOneCase" /></template>
+            <el-table-column label="一源一案" align="center" prop="oneSourceOneCase" min-width="160">
+              <template #default="scope">
+                <template v-if="getPlanList(scope.row).length">
+                  <el-link v-for="p in getPlanList(scope.row)" :key="p.guid" type="primary" underline
+                    style="margin-right: 8px" @click="openPlanDetail(p.guid)">
+                    {{ p.planName }}
+                  </el-link>
+                </template>
+                <span v-else style="color: #909399;">无</span>
+              </template>
             </el-table-column>
             <el-table-column label="监管状态" align="center" prop="hazStat" width="100">
               <template #default="scope"><dict-tag :options="haz_stat" :value="scope.row.hazStat" /></template>
@@ -170,6 +186,8 @@
           </div>
         </el-tab-pane>
       </el-tabs>
+      <!-- 预案详情(点击一源一案中的预案名称弹出) -->
+      <PlanDetail v-model="planDetailOpen" :basic-id="planDetailBasicId" />
       <template #footer>
         <el-button @click="detailOpen = false">关 闭</el-button>
       </template>
@@ -185,16 +203,19 @@ import {
 import SubOrgSelect from "@/components/SubOrgSelect/index.vue"
 import useUserStore from "@/store/modules/user"
 import { OfficeBuilding, Search, Refresh } from '@element-plus/icons-vue'
+import PlanDetail from '@/components/PlanDetail/index.vue'
 
 const { proxy } = getCurrentInstance()
 const userStore = useUserStore()
 
 const {
   haz_grad, risk_grad, sys_yes_no, haz_stat,
-  hidd_grad, hidd_clas, hidd_stat, acci_grad, acci_cate, rep_stat
+  hidd_grad, hidd_clas, hidd_stat, acci_grad, acci_cate, rep_stat,
+  DPC_IMPO_GRAD, DPC_ENG_STAT
 } = proxy.useDict(
   'haz_grad', 'risk_grad', 'sys_yes_no', 'haz_stat',
-  'hidd_grad', 'hidd_clas', 'hidd_stat', 'acci_grad', 'acci_cate', 'rep_stat'
+  'hidd_grad', 'hidd_clas', 'hidd_stat', 'acci_grad', 'acci_cate', 'rep_stat',
+  'DPC_IMPO_GRAD', 'DPC_ENG_STAT'
 )
 
 // 工程类型(与工程管理页保持一致,无字典,硬编码)
@@ -233,6 +254,28 @@ const hazQuery = reactive({ pageNum: 1, pageSize: 10 })
 const hiddQuery = reactive({ pageNum: 1, pageSize: 10 })
 const acciQuery = reactive({ pageNum: 1, pageSize: 10 })
 
+// ===== 预案详情 =====
+const planDetailOpen = ref(false)
+const planDetailBasicId = ref('')
+
+/** 解析后端返回的预案列表 JSON([{guid, planName}]) */
+function getPlanList(row) {
+  const val = row.oneSourceOneCase
+  if (!val || val === '[]') return []
+  try {
+    const arr = JSON.parse(val)
+    return Array.isArray(arr) ? arr : []
+  } catch (e) {
+    return []
+  }
+}
+
+function openPlanDetail(basicId) {
+  if (!basicId) return
+  planDetailBasicId.value = basicId
+  planDetailOpen.value = true
+}
+
 function getList() {
   loading.value = true
   listEngStat(queryParams).then(res => {

+ 49 - 6
gw-ui/src/views/slaj/infoquery/org/index.vue

@@ -75,8 +75,16 @@
                 <dict-tag :options="slaj_eng_type" :value="scope.row.engType" />
               </template>
             </el-table-column>
-            <el-table-column label="重要性" align="center" prop="impoGrad" width="100" />
-            <el-table-column label="工程状态" align="center" prop="engStat" width="100" />
+            <el-table-column label="重要性" align="center" prop="impoGrad" width="100">
+              <template #default="scope">
+                <dict-tag :options="DPC_IMPO_GRAD" :value="scope.row.impoGrad" />
+              </template>
+            </el-table-column>
+            <el-table-column label="工程状态" align="center" prop="engStat" width="100">
+              <template #default="scope">
+                <dict-tag :options="DPC_ENG_STAT" :value="scope.row.engStat" />
+              </template>
+            </el-table-column>
             <el-table-column label="主管单位" align="center" prop="supOrgName" min-width="160" :show-overflow-tooltip="true" />
           </el-table>
           <div class="pagination">
@@ -106,8 +114,16 @@
             </el-table-column>
             <el-table-column label="安全措施" align="center" prop="safePrec" min-width="140" :show-overflow-tooltip="true" />
             <el-table-column label="应急措施" align="center" prop="emerPrec" min-width="140" :show-overflow-tooltip="true" />
-            <el-table-column label="一源一案" align="center" prop="oneSourceOneCase" width="100">
-              <template #default="scope"><dict-tag :options="sys_yes_no" :value="scope.row.oneSourceOneCase" /></template>
+            <el-table-column label="一源一案" align="center" prop="oneSourceOneCase" min-width="160">
+              <template #default="scope">
+                <template v-if="getPlanList(scope.row).length">
+                  <el-link v-for="p in getPlanList(scope.row)" :key="p.guid" type="primary" underline
+                    style="margin-right: 8px" @click="openPlanDetail(p.guid)">
+                    {{ p.planName }}
+                  </el-link>
+                </template>
+                <span v-else style="color: #909399;">无</span>
+              </template>
             </el-table-column>
             <el-table-column label="监管状态" align="center" prop="hazStat" width="100">
               <template #default="scope"><dict-tag :options="haz_stat" :value="scope.row.hazStat" /></template>
@@ -179,6 +195,8 @@
           </div>
         </el-tab-pane>
       </el-tabs>
+      <!-- 预案详情(点击一源一案中的预案名称弹出) -->
+      <PlanDetail v-model="planDetailOpen" :basic-id="planDetailBasicId" />
       <template #footer>
         <el-button @click="detailOpen = false">关 闭</el-button>
       </template>
@@ -195,16 +213,19 @@ import SubOrgSelect from "@/components/SubOrgSelect/index.vue"
 import useUserStore from "@/store/modules/user"
 import { OfficeBuilding, Search, Refresh, Download } from '@element-plus/icons-vue'
 import { saveAs } from 'file-saver'
+import PlanDetail from '@/components/PlanDetail/index.vue'
 
 const { proxy } = getCurrentInstance()
 const userStore = useUserStore()
 
 const {
   slaj_wiun_prop, haz_grad, risk_grad, sys_yes_no, haz_stat,
-  hidd_grad, hidd_clas, hidd_stat, acci_grad, acci_cate, rep_stat
+  hidd_grad, hidd_clas, hidd_stat, acci_grad, acci_cate, rep_stat,
+  DPC_IMPO_GRAD, DPC_ENG_STAT
 } = proxy.useDict(
   'slaj_wiun_prop', 'haz_grad', 'risk_grad', 'sys_yes_no', 'haz_stat',
-  'hidd_grad', 'hidd_clas', 'hidd_stat', 'acci_grad', 'acci_cate', 'rep_stat'
+  'hidd_grad', 'hidd_clas', 'hidd_stat', 'acci_grad', 'acci_cate', 'rep_stat',
+  'DPC_IMPO_GRAD', 'DPC_ENG_STAT'
 )
 
 // 工程类型(与工程管理页保持一致,无字典,硬编码)
@@ -242,6 +263,28 @@ const hazQuery = reactive({ pageNum: 1, pageSize: 10 })
 const hiddQuery = reactive({ pageNum: 1, pageSize: 10 })
 const acciQuery = reactive({ pageNum: 1, pageSize: 10 })
 
+// ===== 预案详情 =====
+const planDetailOpen = ref(false)
+const planDetailBasicId = ref('')
+
+/** 解析后端返回的预案列表 JSON([{guid, planName}]) */
+function getPlanList(row) {
+  const val = row.oneSourceOneCase
+  if (!val || val === '[]') return []
+  try {
+    const arr = JSON.parse(val)
+    return Array.isArray(arr) ? arr : []
+  } catch (e) {
+    return []
+  }
+}
+
+function openPlanDetail(basicId) {
+  if (!basicId) return
+  planDetailBasicId.value = basicId
+  planDetailOpen.value = true
+}
+
 function getEngList() {
   engLoading.value = true
   listOrgEngDetail({ ...engQuery, orgGuid: currentOrg.value.orgGuid }).then(res => {

+ 3 - 3
gw-ui/src/views/system/orgInfo/index.vue

@@ -304,7 +304,7 @@
             <el-col :span="12">
               <el-form-item label="监理资质等级" prop="supQualGrad">
                 <el-select v-model="form.supQualGrad" :disabled="!editing" style="width:100%">
-                  <el-option v-for="d in slaj_sup_qual_grad" :key="d.value" :label="d.label" :value="d.value"/>
+                  <el-option v-for="d in DPC_SUP_QUAL_GRAD" :key="d.value" :label="d.label" :value="d.value"/>
                 </el-select>
               </el-form-item>
             </el-col>
@@ -483,12 +483,12 @@ const userStore = useUserStore()
 const {
   slaj_org_level, slaj_org_status, slaj_area_type,
   slaj_org_clien_type, slaj_wiun_prop, slaj_if_wate_ente,
-  slaj_is_leg_enti, slaj_if_mini_dire, slaj_contr_qual_grad, slaj_sup_qual_grad,
+  slaj_is_leg_enti, slaj_if_mini_dire, slaj_contr_qual_grad, DPC_SUP_QUAL_GRAD,
   slaj_stan_grad, slaj_fund_sour
 } = proxy.useDict(
     'slaj_org_level', 'slaj_org_status', 'slaj_area_type',
     'slaj_org_clien_type', 'slaj_wiun_prop', 'slaj_if_wate_ente',
-    'slaj_is_leg_enti', 'slaj_if_mini_dire', 'slaj_contr_qual_grad', 'slaj_sup_qual_grad',
+    'slaj_is_leg_enti', 'slaj_if_mini_dire', 'slaj_contr_qual_grad', 'DPC_SUP_QUAL_GRAD',
     'slaj_stan_grad', 'slaj_fund_sour')
 
 const formRef = ref(null)

+ 2 - 2
gw-ui/src/views/system/orgext/index.vue

@@ -244,7 +244,7 @@
                <el-col :span="12">
                   <el-form-item label="监理资质等级" prop="supQualGrad">
                      <el-select v-model="form.supQualGrad" placeholder="请选择" style="width:100%">
-                        <el-option v-for="dict in slaj_sup_qual_grad" :key="dict.value" :label="dict.label" :value="dict.value" />
+                        <el-option v-for="dict in DPC_SUP_QUAL_GRAD" :key="dict.value" :label="dict.label" :value="dict.value" />
                      </el-select>
                   </el-form-item>
                </el-col>
@@ -465,7 +465,7 @@ import { UNIT_TYPE_OPTIONS } from '@/utils/orgUnitType'
 const { tableHeight, containerRef } = useTableHeight()
 const { proxy } = getCurrentInstance()
 
-const { slaj_org_clien_type, slaj_org_level, slaj_wiun_prop, slaj_if_wate_ente, slaj_is_leg_enti, slaj_if_mini_dire, slaj_contr_qual_grad, slaj_sup_qual_grad, slaj_stan_grad, slaj_fund_sour } = proxy.useDict("slaj_org_clien_type", "slaj_org_level", "slaj_wiun_prop", "slaj_if_wate_ente", "slaj_is_leg_enti", "slaj_if_mini_dire", "slaj_contr_qual_grad", "slaj_sup_qual_grad", "slaj_stan_grad", "slaj_fund_sour")
+const { slaj_org_clien_type, slaj_org_level, slaj_wiun_prop, slaj_if_wate_ente, slaj_is_leg_enti, slaj_if_mini_dire, slaj_contr_qual_grad, DPC_SUP_QUAL_GRAD, slaj_stan_grad, slaj_fund_sour } = proxy.useDict("slaj_org_clien_type", "slaj_org_level", "slaj_wiun_prop", "slaj_if_wate_ente", "slaj_is_leg_enti", "slaj_if_mini_dire", "slaj_contr_qual_grad", "DPC_SUP_QUAL_GRAD", "slaj_stan_grad", "slaj_fund_sour")
 
 const attOrgExtList = ref([])
 const open = ref(false)

+ 3 - 3
gw-ui/src/views/system/orguwatbase/index.vue

@@ -288,7 +288,7 @@
                <el-col :span="12">
                   <el-form-item label="监理资质等级" prop="supQualGrad">
                      <el-select v-model="extForm.supQualGrad" placeholder="请选择监理资质等级" clearable style="width:100%">
-                        <el-option v-for="dict in slaj_sup_qual_grad" :key="dict.value" :label="dict.label" :value="dict.value" />
+                        <el-option v-for="dict in DPC_SUP_QUAL_GRAD" :key="dict.value" :label="dict.label" :value="dict.value" />
                      </el-select>
                   </el-form-item>
                </el-col>
@@ -376,14 +376,14 @@ const {
   slaj_is_leg_enti,
   slaj_if_mini_dire,
   slaj_contr_qual_grad,
-  slaj_sup_qual_grad,
+  DPC_SUP_QUAL_GRAD,
   slaj_stan_grad,
   slaj_fund_sour
 } = proxy.useDict(
   "slaj_org_level", "slaj_org_status", "slaj_area_type",
   "slaj_org_clien_type", "slaj_uwat_org_type", "slaj_wiun_prop",
   "slaj_if_wate_ente", "slaj_is_leg_enti", "slaj_if_mini_dire",
-  "slaj_contr_qual_grad", "slaj_sup_qual_grad", "slaj_stan_grad", "slaj_fund_sour"
+  "slaj_contr_qual_grad", "DPC_SUP_QUAL_GRAD", "slaj_stan_grad", "slaj_fund_sour"
 )
 
 const attOrgUwatBaseList = ref([])