Lin Qilong 13 часов назад
Родитель
Сommit
2a9c975b1d
23 измененных файлов с 240 добавлено и 88 удалено
  1. 2 0
      gw-slaj/src/main/java/com/goldenwater/slaj/eme/domain/BusiDrillRecord.java
  2. 3 3
      gw-slaj/src/main/java/com/goldenwater/slaj/eme/service/impl/BusiReviewInfoServiceImpl.java
  3. 2 0
      gw-slaj/src/main/java/com/goldenwater/slaj/eme/service/impl/BusiSuppliesReserveServiceImpl.java
  4. 2 0
      gw-slaj/src/main/java/com/goldenwater/slaj/eme/service/impl/BusiTeamInfoServiceImpl.java
  5. 11 0
      gw-slaj/src/main/java/com/goldenwater/slaj/infoquery/controller/InfoQueryController.java
  6. 8 0
      gw-slaj/src/main/java/com/goldenwater/slaj/infoquery/mapper/InfoQueryMapper.java
  7. 5 0
      gw-slaj/src/main/java/com/goldenwater/slaj/infoquery/service/IInfoQueryService.java
  8. 5 0
      gw-slaj/src/main/java/com/goldenwater/slaj/infoquery/service/impl/InfoQueryServiceImpl.java
  9. 9 0
      gw-slaj/src/main/resources/mapper/slaj/eme/BusiDrillRecordMapper.xml
  10. 1 0
      gw-slaj/src/main/resources/mapper/slaj/eme/RelDrillScMapper.xml
  11. 34 6
      gw-slaj/src/main/resources/mapper/slaj/infoquery/InfoQueryMapper.xml
  12. 9 0
      gw-ui/src/api/slaj/infoQuery.js
  13. 66 5
      gw-ui/src/components/DrillScDialog/index.vue
  14. 3 3
      gw-ui/src/components/PlanDetail/index.vue
  15. 18 3
      gw-ui/src/components/SubOrgSelect/index.vue
  16. 1 1
      gw-ui/src/store/modules/user.js
  17. 7 7
      gw-ui/src/views/slaj/eme/conplanbasic/index.vue
  18. 9 23
      gw-ui/src/views/slaj/eme/drillrecord/index.vue
  19. 7 7
      gw-ui/src/views/slaj/eme/planfiling/index.vue
  20. 1 1
      gw-ui/src/views/slaj/infoquery/drill/index.vue
  21. 5 5
      gw-ui/src/views/slaj/infoquery/plan/index.vue
  22. 31 23
      gw-ui/src/views/slaj/infoquery/supplies/index.vue
  23. 1 1
      gw-ui/src/views/slaj/infoquery/team/index.vue

+ 2 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/eme/domain/BusiDrillRecord.java

@@ -59,4 +59,6 @@ public class BusiDrillRecord {
     private String creperName;
     /** 填报单位名称(JOIN sys_dept) */
     private String orgName;
+    /** 抽查结果(JOIN rel_drill_sc) */
+    private String spotCheck;
 }

+ 3 - 3
gw-slaj/src/main/java/com/goldenwater/slaj/eme/service/impl/BusiReviewInfoServiceImpl.java

@@ -68,13 +68,13 @@ public class BusiReviewInfoServiceImpl implements IBusiReviewInfoService {
         if (review == null) {
             throw new ServiceException("备案记录不存在");
         }
-        if ("3".equals(review.getKeepStatus())) {
+        if ("1".equals(review.getKeepStatus())) {
             throw new ServiceException("该预案已备案,不能重复操作");
         }
-        if (!"2".equals(review.getKeepStatus())) {
+        if (!"0".equals(review.getKeepStatus())) {
             throw new ServiceException("该预案未提交备案申请,不能接受备案");
         }
-        return busiReviewInfoMapper.updatePlanFilingStatus(riGuid, "3",
+        return busiReviewInfoMapper.updatePlanFilingStatus(riGuid, "1",
                 DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD_HH_MM_SS),
                 SecurityUtils.getDeptId(),
                 SecurityUtils.getLoginUser().getUser().getRealName(),

+ 2 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/eme/service/impl/BusiSuppliesReserveServiceImpl.java

@@ -27,6 +27,8 @@ public class BusiSuppliesReserveServiceImpl implements IBusiSuppliesReserveServi
 
     @Override
     public List<BusiSuppliesReserve> selectBusiSuppliesReserveList(BusiSuppliesReserve busiSuppliesReserve) {
+        // 数据范围:仅查询当前登录机构的应急物资数据
+        busiSuppliesReserve.setOrgGuid(SecurityUtils.getDeptId());
         return busiSuppliesReserveMapper.selectBusiSuppliesReserveList(busiSuppliesReserve);
     }
 

+ 2 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/eme/service/impl/BusiTeamInfoServiceImpl.java

@@ -27,6 +27,8 @@ public class BusiTeamInfoServiceImpl implements IBusiTeamInfoService {
 
     @Override
     public List<BusiTeamInfo> selectBusiTeamInfoList(BusiTeamInfo busiTeamInfo) {
+        // 数据范围:仅查询当前登录机构的应急队伍数据
+        busiTeamInfo.setOrgGuid(SecurityUtils.getDeptId());
         return busiTeamInfoMapper.selectBusiTeamInfoList(busiTeamInfo);
     }
 

+ 11 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/infoquery/controller/InfoQueryController.java

@@ -193,6 +193,17 @@ public class InfoQueryController extends BaseController {
         return getDataTable(infoQueryService.selectSuppliesQueryList(params));
     }
 
+    /**
+     * 应急物资及装备明细列表(点击汇总行查看该单位具体物资,数据范围:当前单位及下级单位)
+     */
+    @GetMapping("/supplies/detail")
+    public TableDataInfo suppliesDetail(@RequestParam String orgGuid) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("orgGuid", orgGuid);
+        params.put("scopeOrgGuid", getDeptId());
+        return getDataTable(infoQueryService.selectSuppliesDetailList(params));
+    }
+
     /**
      * 预案统计分析列表(数据范围:本单位和下级单位)
      */

+ 8 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/infoquery/mapper/InfoQueryMapper.java

@@ -69,6 +69,14 @@ public interface InfoQueryMapper {
      */
     List<Map<String, Object>> selectSuppliesQueryList(Map<String, Object> params);
 
+    /**
+     * 应急物资及装备明细列表(按单位查看具体物资记录,数据范围:当前单位及下级单位)
+     *
+     * @param params orgGuid(目标单位)、scopeOrgGuid(范围根单位)
+     * @return 应急物资明细信息集合
+     */
+    List<Map<String, Object>> selectSuppliesDetailList(Map<String, Object> params);
+
     /**
      * 预案统计分析列表(数据范围:当前单位及下级单位)
      * 预案填报/演练统计 = t_busi_plan_count

+ 5 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/infoquery/service/IInfoQueryService.java

@@ -47,6 +47,11 @@ public interface IInfoQueryService {
      */
     List<Map<String, Object>> selectSuppliesQueryList(Map<String, Object> params);
 
+    /**
+     * 应急物资及装备明细列表
+     */
+    List<Map<String, Object>> selectSuppliesDetailList(Map<String, Object> params);
+
     /**
      * 预案统计分析列表
      */

+ 5 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/infoquery/service/impl/InfoQueryServiceImpl.java

@@ -58,6 +58,11 @@ public class InfoQueryServiceImpl implements IInfoQueryService {
         return infoQueryMapper.selectSuppliesQueryList(params);
     }
 
+    @Override
+    public List<Map<String, Object>> selectSuppliesDetailList(Map<String, Object> params) {
+        return infoQueryMapper.selectSuppliesDetailList(params);
+    }
+
     @Override
     public List<Map<String, Object>> selectPlanStatList(Map<String, Object> params) {
         return infoQueryMapper.selectPlanStatList(params);

+ 9 - 0
gw-slaj/src/main/resources/mapper/slaj/eme/BusiDrillRecordMapper.xml

@@ -6,10 +6,12 @@
                r.partake_org, r.org_guid, r.creper_guid, r.create_time,
                r.updper_guid, r.update_time, r.drill_name, r.pdr_guid, r.rdb, r.cor_status,
                b.plan_name,
+               sc.spot_check,
                u.real_name as creper_name,
                d.dept_name as org_name
         from t_busi_drill_record r
         left join t_busi_conplan_basic b on b.guid = r.basic_id
+        left join rel_drill_sc sc on sc.dr_guid = r.dr_guid
         left join sys_user u on u.user_id = r.creper_guid
         left join sys_dept d on d.dept_id = r.org_guid
     </sql>
@@ -25,6 +27,13 @@
             <if test="drillType != null and drillType != ''">AND r.drill_type = #{drillType}</if>
             <if test="corStatus != null and corStatus != ''">AND r.cor_status = #{corStatus}</if>
             <if test="orgGuid != null and orgGuid != ''">AND r.org_guid = #{orgGuid}</if>
+            <if test="spotCheck != null and spotCheck != ''">
+                <choose>
+                    <!-- 未抽查 -->
+                    <when test="spotCheck == '0'.toString()">AND sc.dr_guid IS NULL</when>
+                    <otherwise>AND sc.spot_check = #{spotCheck}</otherwise>
+                </choose>
+            </if>
         </where>
     </select>
     <insert id="insertBusiDrillRecord" parameterType="com.goldenwater.slaj.eme.domain.BusiDrillRecord">

+ 1 - 0
gw-slaj/src/main/resources/mapper/slaj/eme/RelDrillScMapper.xml

@@ -42,6 +42,7 @@
                 )
             </if>
             <if test="orgGuid != null and orgGuid != ''">AND r.org_guid = #{orgGuid}</if>
+            <if test="drillName != null and drillName != ''">AND r.drill_name like '%' || #{drillName} || '%'</if>
             <if test="spotCheck != null and spotCheck != ''">
                 <choose>
                     <!-- 未抽查 -->

+ 34 - 6
gw-slaj/src/main/resources/mapper/slaj/infoquery/InfoQueryMapper.xml

@@ -220,7 +220,8 @@
     </select>
 
     <!--
-      应急物资及装备查询:物资 = t_busi_supplies_reserve,数据范围 = 本单位和下级单位(subOrgs)。
+      应急物资及装备查询(按单位汇总):物资 = t_busi_supplies_reserve,数据范围 = 本单位和下级单位(subOrgs)。
+      列表按填报机构分组,返回物资种类总数与数量总数。
     -->
     <select id="selectSuppliesQueryList" parameterType="java.util.Map" resultType="java.util.LinkedHashMap">
         WITH RECURSIVE subOrgs AS (
@@ -231,22 +232,49 @@
             SELECT b.guid FROM att_org_base b
             INNER JOIN subOrgs s ON b.pguid = s.guid
         )
+        SELECT
+            s.org_guid AS "orgGuid",
+            d.dept_name AS "orgName",
+            COUNT(DISTINCT s.material_type) AS "materialTypeTotal",
+            COALESCE(SUM(s.material_num), 0) AS "materialNumTotal"
+        FROM t_busi_supplies_reserve s
+        LEFT JOIN sys_dept d ON d.dept_id = s.org_guid
+        <where>
+            <if test="orgGuid != null and orgGuid != ''">
+                AND s.org_guid IN (SELECT guid FROM subOrgs)
+            </if>
+        </where>
+        GROUP BY s.org_guid, d.dept_name
+        ORDER BY d.dept_name
+    </select>
+
+    <!--
+      应急物资及装备明细:点击汇总行的“详情”查看该单位具体物资记录,
+      数据范围同样限定在本单位和下级单位(scopeOrgGuid)。
+    -->
+    <select id="selectSuppliesDetailList" parameterType="java.util.Map" resultType="java.util.LinkedHashMap">
+        WITH RECURSIVE subOrgs AS (
+            SELECT guid FROM att_org_base WHERE guid = #{scopeOrgGuid}
+            UNION ALL
+            SELECT e.org_guid FROM att_org_ext e WHERE e.admin_wiun_guid = #{scopeOrgGuid}
+            UNION ALL
+            SELECT b.guid FROM att_org_base b
+            INNER JOIN subOrgs s ON b.pguid = s.guid
+        )
         SELECT
             s.guid AS "guid",
             s.material_type AS "materialType",
             s.material_name AS "materialName",
             s.material_num AS "materialNum",
+            s.specs AS "specs",
             s.company AS "company",
             s.provide_time AS "provideTime",
             s.desposit_site AS "despositSite",
             d.dept_name AS "orgName"
         FROM t_busi_supplies_reserve s
         LEFT JOIN sys_dept d ON d.dept_id = s.org_guid
-        <where>
-            <if test="orgGuid != null and orgGuid != ''">
-                AND s.org_guid IN (SELECT guid FROM subOrgs)
-            </if>
-        </where>
+        WHERE s.org_guid = #{orgGuid}
+          AND s.org_guid IN (SELECT guid FROM subOrgs)
         ORDER BY s.create_time DESC
     </select>
 

+ 9 - 0
gw-ui/src/api/slaj/infoQuery.js

@@ -141,6 +141,15 @@ export function listSuppliesQuery(query) {
   })
 }
 
+// 应急物资及装备明细列表(查看某单位具体物资)
+export function listSuppliesDetail(query) {
+  return request({
+    url: '/infoquery/supplies/detail',
+    method: 'get',
+    params: query
+  })
+}
+
 // ========== 统计分析 ==========
 
 // 预案统计分析列表(数据范围:本单位和下级单位)

+ 66 - 5
gw-ui/src/components/DrillScDialog/index.vue

@@ -1,13 +1,32 @@
 <template>
-  <el-dialog :title="'应急演练记录抽查'" v-model="dialogVisible" width="900px" append-to-body
+  <el-dialog :title="dialogTitle" v-model="dialogVisible" width="900px" append-to-body
     :close-on-click-modal="false">
     <div v-loading="scLoading">
+      <!-- 新增抽查:先选择演练实施记录(仅未抽查记录) -->
+      <el-form v-if="!props.row.drGuid" :model="scForm" label-width="110px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="选择演练记录" prop="drGuid">
+              <el-select v-model="scForm.drGuid" filterable remote :remote-method="searchDrillRecords"
+                :loading="drillLoading" placeholder="请输入演练名称搜索(仅未抽查记录)" style="width: 100%"
+                @change="handleDrillSelected">
+                <el-option v-for="item in drillOptions" :key="item.drGuid"
+                  :label="`${item.orgName || ''} - ${item.drillName || ''}`" :value="item.drGuid">
+                  <span>{{ item.orgName || '--' }} - {{ item.drillName || '--' }}</span>
+                  <span style="float: right; color: #8492a6; font-size: 12px;">{{ item.drillTime }}</span>
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+
       <!-- 块一:演练实施记录信息 -->
       <el-divider content-position="left">
         <el-icon><OfficeBuilding /></el-icon>
         <span style="margin-left:6px;font-weight:600;">演练实施记录信息</span>
       </el-divider>
-      <DrillDetail :key="'sc-' + scDrGuid + '-' + scSeq" :dr-guid="scDrGuid" inline />
+      <DrillDetail v-if="scDrGuid" :key="'sc-' + scDrGuid + '-' + scSeq" :dr-guid="scDrGuid" inline />
 
       <!-- 块二:预案演练抽查 -->
       <el-divider content-position="left">
@@ -56,7 +75,7 @@
 
 <script setup>
 import { computed, getCurrentInstance, reactive, ref, toRefs, watch } from 'vue'
-import { getDrillSc, saveDrillSc } from "@/api/slaj/eme"
+import { getDrillSc, saveDrillSc, listDrillSc } from "@/api/slaj/eme"
 import { parseTime } from '@/utils/goldenwater'
 import useUserStore from '@/store/modules/user'
 import DrillDetail from '@/components/DrillDetail/index.vue'
@@ -77,10 +96,15 @@ const dialogVisible = computed({
   get: () => props.modelValue,
   set: (val) => emit('update:modelValue', val)
 })
+const dialogTitle = computed(() =>
+  (props.row && props.row.drGuid) ? '应急演练记录抽查' : '新增预案演练抽查'
+)
 
 const scLoading = ref(false)
 const scDrGuid = ref('')
 const scSeq = ref(0)
+const drillOptions = ref([])
+const drillLoading = ref(false)
 const scData = reactive({
   scForm: {
     drGuid: undefined,
@@ -106,8 +130,6 @@ const scResultOptions = computed(() =>
 
 function openLoad() {
   const row = props.row || {}
-  if (!row.drGuid) return
-  scDrGuid.value = row.drGuid
   scSeq.value++
   scForm.value = {
     drGuid: row.drGuid,
@@ -117,6 +139,13 @@ function openLoad() {
     spotCheck: undefined,
     scExplain: undefined
   }
+  // 新增抽查:先加载未抽查的演练记录供选择
+  if (!row.drGuid) {
+    scDrGuid.value = ''
+    loadDrillOptions('')
+    return
+  }
+  scDrGuid.value = row.drGuid
   // 已抽查过的记录回显
   scLoading.value = true
   getDrillSc(row.drGuid).then(r => {
@@ -131,11 +160,43 @@ function openLoad() {
   })
 }
 
+/** 加载未抽查的演练实施记录(新增抽查选择器) */
+function loadDrillOptions(query) {
+  drillLoading.value = true
+  listDrillSc({
+    pageNum: 1,
+    pageSize: 20,
+    spotCheck: '0',
+    drillName: query || undefined
+  }).then(res => {
+    drillOptions.value = res.rows || []
+  }).finally(() => {
+    drillLoading.value = false
+  })
+}
+
+function searchDrillRecords(query) {
+  loadDrillOptions(query)
+}
+
+function handleDrillSelected(val) {
+  if (!val) {
+    scDrGuid.value = ''
+    return
+  }
+  scDrGuid.value = val
+  scSeq.value++
+}
+
 watch(() => props.modelValue, (val) => {
   if (val) openLoad()
 })
 
 function submitScForm() {
+  if (!scForm.value.drGuid) {
+    proxy.$modal.msgWarning('请先选择演练记录')
+    return
+  }
   proxy.$refs["scFormRef"].validate(valid => {
     if (!valid) return
     saveDrillSc(scForm.value).then(() => {

+ 3 - 3
gw-ui/src/components/PlanDetail/index.vue

@@ -71,7 +71,7 @@
       </el-divider>
       <el-descriptions :column="2" border size="small" class="plan-detail-descriptions">
         <el-descriptions-item label="备案状态">
-          <dict-tag :options="eme_filing_status" :value="detailReview.keepStatus" />
+          <dict-tag :options="DPC_REG_STAT" :value="detailReview.keepStatus" />
         </el-descriptions-item>
         <el-descriptions-item label="备案时间">{{ detailReview.keepTime }}</el-descriptions-item>
         <el-descriptions-item label="备案受理单位">{{ detailReview.keepOrgName }}</el-descriptions-item>
@@ -134,8 +134,8 @@ const props = defineProps({
 const emit = defineEmits(['update:modelValue'])
 
 const { proxy } = getCurrentInstance()
-const { eme_plan_type, eme_plan_status, eme_revi_resu, eme_filing_status, eme_public_status, eme_eval_status } =
-  proxy.useDict("eme_plan_type", "eme_plan_status", "eme_revi_resu", "eme_filing_status", "eme_public_status", "eme_eval_status")
+const { eme_plan_type, eme_plan_status, eme_revi_resu, DPC_REG_STAT, eme_public_status, eme_eval_status } =
+  proxy.useDict("eme_plan_type", "eme_plan_status", "eme_revi_resu", "DPC_REG_STAT", "eme_public_status", "eme_eval_status")
 
 /** 预案基础信息表名(RelBisMed.bisTablename) */
 const BSC_TABLE = 't_busi_conplan_basic'

+ 18 - 3
gw-ui/src/components/SubOrgSelect/index.vue

@@ -26,7 +26,7 @@
 
 <script setup>
 import { ref, computed } from 'vue'
-import { listDeptChildren } from '@/api/system/dept'
+import { getDept, listDeptChildren } from '@/api/system/dept'
 
 const props = defineProps({
   /** v-model: 单选为 String,多选为 Array */
@@ -44,7 +44,9 @@ const props = defineProps({
   /** 是否禁用 */
   disabled: { type: Boolean, default: false },
   /** 根部门ID,默认 '' 加载全部顶级部门 */
-  rootDeptId: { type: String, default: '' }
+  rootDeptId: { type: String, default: '' },
+  /** 是否把根部门本身也作为可选节点(含当前单位 + 下级单位) */
+  includeRoot: { type: Boolean, default: false }
 })
 
 const emit = defineEmits(['update:modelValue'])
@@ -83,7 +85,20 @@ function toNode(row) {
 async function loadNode(node, resolve) {
   try {
     if (node.level === 0) {
-      // 根节点:加载顶级部门
+      // includeRoot:顶层只放根部门本身(当前单位),子级展开时懒加载
+      if (props.includeRoot && props.rootDeptId) {
+        try {
+          const rootRes = await getDept(props.rootDeptId)
+          const root = rootRes.data
+          if (root && root.deptId) {
+            resolve([toNode(root)])
+            return
+          }
+        } catch {
+          // 无部门查询权限时降级为仅展示下级机构
+        }
+      }
+      // 默认:加载顶级部门(或根部门的下级)
       const res = await listDeptChildren(rootParams())
       const rows = extractRows(res)
       resolve(rows.map(toNode))

+ 1 - 1
gw-ui/src/store/modules/user.js

@@ -58,7 +58,7 @@ const useUserStore = defineStore(
             this.realName = user.realName
             this.avatar = avatar
             this.orgGuid = user.deptId || ''
-            this.orgName = user.deptName || ''
+            this.orgName = (user.dept && user.dept.deptName) || ''
             /* 初始密码提示
             if(res.isDefaultModifyPwd) {
               ElMessageBox.confirm('您的密码还是初始密码,请修改密码!',  '安全提示', {  confirmButtonText: '确定',  cancelButtonText: '取消',  type: 'warning' }).then(() => {

+ 7 - 7
gw-ui/src/views/slaj/eme/conplanbasic/index.vue

@@ -105,7 +105,7 @@
         </el-form-item>
         <el-form-item label="备案状态" prop="keepStatus">
           <el-select v-model="reviewParams.keepStatus" placeholder="请选择" clearable style="width: 150px">
-            <el-option v-for="dict in eme_filing_status" :key="dict.value" :label="dict.label" :value="dict.value"/>
+            <el-option v-for="dict in DPC_REG_STAT" :key="dict.value" :label="dict.label" :value="dict.value"/>
           </el-select>
         </el-form-item>
         <el-form-item>
@@ -149,7 +149,7 @@
                            :show-overflow-tooltip="true"/>
           <el-table-column label="备案状态" align="center" prop="keepStatus" v-if="reviewColumns.keepStatus.visible">
             <template #default="scope">
-              <dict-tag :options="eme_filing_status" :value="scope.row.keepStatus"/>
+              <dict-tag :options="DPC_REG_STAT" :value="scope.row.keepStatus"/>
             </template>
           </el-table-column>
           <el-table-column label="操作" align="center" width="200">
@@ -769,7 +769,7 @@
             <el-col :span="12">
               <el-form-item label="备案状态" prop="keepStatus">
                 <el-select v-model="reviewForm.keepStatus" placeholder="请选择">
-                  <el-option v-for="dict in eme_filing_status" :key="dict.value" :label="dict.label"
+                  <el-option v-for="dict in DPC_REG_STAT" :key="dict.value" :label="dict.label"
                              :value="dict.value"/>
                 </el-select>
               </el-form-item>
@@ -831,7 +831,7 @@
             <el-col :span="12">
               <el-form-item label="备案状态" prop="keepStatus">
                 <el-select v-model="reviewForm.keepStatus" placeholder="请选择">
-                  <el-option v-for="dict in eme_filing_status" :key="dict.value" :label="dict.label"
+                  <el-option v-for="dict in DPC_REG_STAT" :key="dict.value" :label="dict.label"
                              :value="dict.value"/>
                 </el-select>
               </el-form-item>
@@ -950,7 +950,7 @@
           </el-divider>
           <el-descriptions :column="2" border size="small" class="revise-descriptions">
             <el-descriptions-item label="备案状态">
-              <dict-tag :options="eme_filing_status" :value="discPlanReview.keepStatus"/>
+              <dict-tag :options="DPC_REG_STAT" :value="discPlanReview.keepStatus"/>
             </el-descriptions-item>
             <el-descriptions-item label="备案时间">{{ discPlanReview.keepTime }}</el-descriptions-item>
             <el-descriptions-item label="备案受理单位">{{ discPlanReview.keepOrgName }}</el-descriptions-item>
@@ -1140,9 +1140,9 @@ const {
   eme_plan_status,
   eme_revi_resu,
   eme_public_status,
-  eme_filing_status,
+  DPC_REG_STAT,
   eme_eval_status
-} = proxy.useDict("eme_plan_type", "eme_plan_status", "eme_revi_resu", "eme_public_status", "eme_filing_status", "eme_eval_status")
+} = proxy.useDict("eme_plan_type", "eme_plan_status", "eme_revi_resu", "eme_public_status", "DPC_REG_STAT", "eme_eval_status")
 const userStore = useUserStore()
 
 const activeTab = ref("basic")

+ 9 - 23
gw-ui/src/views/slaj/eme/drillrecord/index.vue

@@ -70,9 +70,9 @@
           <el-input v-model="drillParams.drillName" placeholder="请输入" clearable style="width: 180px"
             @keyup.enter="getDrillList" />
         </el-form-item>
-        <el-form-item label="抽查结果" prop="corStatus">
-          <el-select v-model="drillParams.corStatus" placeholder="请选择" clearable style="width: 150px">
-            <el-option v-for="dict in eme_drill_cor_status" :key="dict.value" :label="dict.label" :value="dict.value" />
+        <el-form-item label="抽查结果" prop="spotCheck">
+          <el-select v-model="drillParams.spotCheck" placeholder="请选择" clearable style="width: 150px">
+            <el-option v-for="dict in eme_drill_sc_status" :key="dict.value" :label="dict.label" :value="dict.value" />
           </el-select>
         </el-form-item>
         <el-form-item>
@@ -112,14 +112,13 @@
           <el-table-column label="演练时间" align="center" prop="drillTime" width="170" />
           <el-table-column label="参加单位" align="center" prop="partakeOrg" :show-overflow-tooltip="true" />
           <el-table-column label="参加总人数" align="center" prop="partakeNum" width="100" />
-          <el-table-column label="抽查结果" align="center" prop="corStatus">
+          <el-table-column label="抽查结果" align="center" prop="spotCheck">
             <template #default="scope">
-              <dict-tag :options="eme_drill_cor_status" :value="scope.row.corStatus" />
+              <dict-tag :options="eme_drill_sc_status" :value="scope.row.spotCheck || '0'" />
             </template>
           </el-table-column>
-          <el-table-column label="操作" align="center" width="160">
+          <el-table-column label="操作" align="center" width="160" fixed="right">
             <template #default="scope">
-              <el-button link type="success" @click="handleDrillSc(scope.row)">抽查</el-button>
               <el-tooltip content="修改">
                 <el-button link type="primary" icon="Edit" @click="handleDrillUpdate(scope.row)"
                   v-hasPermi="['eme:drillrecord:edit']" />
@@ -516,9 +515,6 @@
     <!-- 应急演练实施信息详情(公共组件) -->
     <DrillDetail v-model="drillDetailOpen" :dr-guid="drillDetailId" />
 
-    <!-- 应急演练记录抽查填报(公共组件) -->
-    <DrillScDialog v-model="scOpen" :row="scRow" @saved="getDrillList" />
-
     <!-- 预案详情查看(公共组件) -->
     <PlanDetail v-model="planDetailOpen" :basic-id="planDetailId" />
   </div>
@@ -547,13 +543,12 @@ import { useTableHeight } from '@/hooks/useTableHeight'
 import useUserStore from '@/store/modules/user'
 import PlanDetail from '@/components/PlanDetail/index.vue'
 import DrillDetail from '@/components/DrillDetail/index.vue'
-import DrillScDialog from '@/components/DrillScDialog/index.vue'
 
 const { tableHeight, containerRef } = useTableHeight()
 const { proxy } = getCurrentInstance()
 const userStore = useUserStore()
-const { eme_train_type, eme_drill_type, eme_drill_cor_status, eme_rdb_status, eme_plan_type } =
-  proxy.useDict("eme_train_type", "eme_drill_type", "eme_drill_cor_status", "eme_rdb_status", "eme_plan_type")
+const { eme_train_type, eme_drill_type, eme_drill_sc_status, eme_rdb_status, eme_plan_type } =
+  proxy.useDict("eme_train_type", "eme_drill_type", "eme_drill_sc_status", "eme_rdb_status", "eme_plan_type")
 const { eme_drill_eva_result } = proxy.useDict("eme_drill_eva_result")
 
 /** 培训记录多媒体关联表名(RelBisMed.bisTablename) */
@@ -762,7 +757,7 @@ const drillIds = ref([])
 const drillMultiple = ref(true)
 const drillData = reactive({
   drillForm: {},
-  drillParams: { pageNum: 1, pageSize: 10, drillName: undefined, corStatus: undefined },
+  drillParams: { pageNum: 1, pageSize: 10, drillName: undefined, spotCheck: undefined },
   drillRules: {
     basicId: [{ required: true, message: "演练的应急预案不能为空", trigger: "change" }],
     drillName: [{ required: true, message: "预案演练名称不能为空", trigger: "blur" }],
@@ -878,15 +873,6 @@ function handleDrillDelete(row) {
   })
 }
 
-// ========== Step 2.2: 应急演练记录抽查 ==========
-const scOpen = ref(false)
-const scRow = ref({})
-
-function handleDrillSc(row) {
-  scRow.value = row
-  scOpen.value = true
-}
-
 // ========== Step 3: 演练评估总结(连表) ==========
 const summaryList = ref([])
 const summaryLoading = ref(false)

+ 7 - 7
gw-ui/src/views/slaj/eme/planfiling/index.vue

@@ -24,7 +24,7 @@
           </el-form-item>
           <el-form-item label="备案状态" prop="keepStatus">
             <el-select v-model="queryParams.keepStatus" placeholder="请选择" clearable style="width: 150px">
-              <el-option v-for="dict in eme_filing_status" :key="dict.value" :label="dict.label" :value="dict.value" />
+              <el-option v-for="dict in DPC_REG_STAT" :key="dict.value" :label="dict.label" :value="dict.value" />
             </el-select>
           </el-form-item>
           <el-form-item>
@@ -59,7 +59,7 @@
         </el-table-column>
         <el-table-column label="备案状态" align="center" prop="keepStatus" v-if="columns.keepStatus.visible">
           <template #default="scope">
-            <dict-tag :options="eme_filing_status" :value="scope.row.keepStatus" />
+            <dict-tag :options="DPC_REG_STAT" :value="scope.row.keepStatus" />
           </template>
         </el-table-column>
         <el-table-column label="评估周期" align="center" prop="evaCycle" v-if="columns.evaCycle.visible" width="120">
@@ -69,13 +69,13 @@
         </el-table-column>
         <el-table-column label="操作" align="center" width="170" fixed="right">
           <template #default="scope">
-            <template v-if="scope.row.keepStatus !== '3'">
+            <template v-if="scope.row.keepStatus !== '1'">
               <el-button link type="success" @click="handleAccept(scope.row)"
                 v-hasPermi="['eme:planfiling:edit']">接受备案</el-button>
               <el-button link type="danger" @click="handleReject(scope.row)"
                 v-hasPermi="['eme:planfiling:edit']">退回预案</el-button>
             </template>
-            <span v-else-if="scope.row.keepStatus === '3'" style="color:#909399;">已备案</span>
+            <span v-else-if="scope.row.keepStatus === '1'" style="color:#909399;">已备案</span>
           </template>
         </el-table-column>
       </el-table>
@@ -150,7 +150,7 @@
         </el-divider>
         <el-descriptions :column="2" border size="small" class="revise-descriptions">
           <el-descriptions-item label="备案状态">
-            <dict-tag :options="eme_filing_status" :value="detailReview.keepStatus" />
+            <dict-tag :options="DPC_REG_STAT" :value="detailReview.keepStatus" />
           </el-descriptions-item>
           <el-descriptions-item label="备案时间">{{ detailReview.keepTime }}</el-descriptions-item>
           <el-descriptions-item label="备案受理单位">{{ detailReview.keepOrgName }}</el-descriptions-item>
@@ -213,9 +213,9 @@ const {
   eme_plan_status,
   eme_revi_resu,
   eme_public_status,
-  eme_filing_status,
+  DPC_REG_STAT,
   eme_eval_status
-} = proxy.useDict("eme_plan_type", "eme_plan_status", "eme_revi_resu", "eme_public_status", "eme_filing_status", "eme_eval_status")
+} = proxy.useDict("eme_plan_type", "eme_plan_status", "eme_revi_resu", "eme_public_status", "DPC_REG_STAT", "eme_eval_status")
 const userStore = useUserStore()
 
 const BSC_TABLE = 't_busi_conplan_basic'

+ 1 - 1
gw-ui/src/views/slaj/infoquery/drill/index.vue

@@ -16,7 +16,7 @@
       <div class="search-bar" v-show="showSearch">
         <el-form :model="queryParams" ref="queryRef" :inline="true">
           <sub-org-select v-model="queryParams.orgGuid" label="组织机构" prop="orgGuid"
-            :root-dept-id="userStore.orgGuid" placeholder="请选择组织机构" />
+            :root-dept-id="userStore.orgGuid" include-root placeholder="请选择组织机构" />
           <el-form-item>
             <el-button type="primary" @click="handleQuery"><el-icon><Search /></el-icon> 搜索</el-button>
             <el-button @click="resetQuery"><el-icon><Refresh /></el-icon> 重置</el-button>

+ 5 - 5
gw-ui/src/views/slaj/infoquery/plan/index.vue

@@ -16,7 +16,7 @@
       <div class="search-bar" v-show="showSearch">
         <el-form :model="queryParams" ref="queryRef" :inline="true">
           <sub-org-select v-model="queryParams.orgGuid" label="组织机构" prop="orgGuid"
-            :root-dept-id="userStore.orgGuid" placeholder="请选择组织机构" />
+            :root-dept-id="userStore.orgGuid" include-root placeholder="请选择组织机构" />
           <el-form-item label="应急预案名称" prop="planName">
             <el-input v-model="queryParams.planName" placeholder="请输入" clearable style="width: 180px"
               @keyup.enter="handleQuery" />
@@ -28,7 +28,7 @@
           </el-form-item>
           <el-form-item label="备案状态" prop="keepStatus">
             <el-select v-model="queryParams.keepStatus" placeholder="请选择" clearable style="width: 130px">
-              <el-option v-for="dict in eme_filing_status" :key="dict.value" :label="dict.label" :value="dict.value" />
+              <el-option v-for="dict in DPC_REG_STAT" :key="dict.value" :label="dict.label" :value="dict.value" />
             </el-select>
           </el-form-item>
           <el-form-item label="评估状态" prop="evaStatus">
@@ -60,7 +60,7 @@
         </el-table-column>
         <el-table-column label="备案状态" align="center" prop="keepStatus" width="100">
           <template #default="scope">
-            <dict-tag :options="eme_filing_status" :value="scope.row.keepStatus" />
+            <dict-tag :options="DPC_REG_STAT" :value="scope.row.keepStatus" />
           </template>
         </el-table-column>
         <el-table-column label="公开状态" align="center" prop="publicStatus" width="100">
@@ -94,9 +94,9 @@ import useUserStore from '@/store/modules/user'
 const { proxy } = getCurrentInstance()
 const userStore = useUserStore()
 const {
-  eme_plan_type, eme_revi_resu, eme_filing_status, eme_public_status, eme_eval_status
+  eme_plan_type, eme_revi_resu, DPC_REG_STAT, eme_public_status, eme_eval_status
 } = proxy.useDict(
-  "eme_plan_type", "eme_revi_resu", "eme_filing_status", "eme_public_status", "eme_eval_status"
+  "eme_plan_type", "eme_revi_resu", "DPC_REG_STAT", "eme_public_status", "eme_eval_status"
 )
 
 const loading = ref(false)

+ 31 - 23
gw-ui/src/views/slaj/infoquery/supplies/index.vue

@@ -16,7 +16,7 @@
       <div class="search-bar" v-show="showSearch">
         <el-form :model="queryParams" ref="queryRef" :inline="true">
           <sub-org-select v-model="queryParams.orgGuid" label="组织机构" prop="orgGuid"
-            :root-dept-id="userStore.orgGuid" placeholder="请选择组织机构" />
+            :root-dept-id="userStore.orgGuid" include-root placeholder="请选择组织机构" />
           <el-form-item>
             <el-button type="primary" @click="handleQuery"><el-icon><Search /></el-icon> 搜索</el-button>
             <el-button @click="resetQuery"><el-icon><Refresh /></el-icon> 重置</el-button>
@@ -27,12 +27,8 @@
       <el-table v-loading="loading" :data="dataList" style="width: 100%">
         <el-table-column type="index" label="序号" width="60" align="center" />
         <el-table-column label="所属单位" align="center" prop="orgName" min-width="160" :show-overflow-tooltip="true" />
-        <el-table-column label="物资和装备种类" align="center" prop="materialType" min-width="140">
-          <template #default="scope">
-            <dict-tag :options="emergency_supplies_type" :value="scope.row.materialType" />
-          </template>
-        </el-table-column>
-        <el-table-column label="物资和装备数量" align="center" prop="materialNum" width="120" />
+        <el-table-column label="物资和装备种类" align="center" prop="materialTypeTotal" min-width="160" />
+        <el-table-column label="物资和装备数量" align="center" prop="materialNumTotal" width="160" />
         <el-table-column label="操作" align="center" width="90" fixed="right">
           <template #default="scope">
             <el-button link type="primary" @click="handleDetail(scope.row)">详情</el-button>
@@ -47,19 +43,23 @@
       </div>
     </el-card>
 
-    <!-- 应急物资装备详情 -->
-    <el-dialog :title="'应急物资装备详情'" v-model="detailOpen" width="720px" append-to-body>
-      <el-descriptions :column="2" border size="small">
-        <el-descriptions-item label="所属单位">{{ currentRow.orgName || '—' }}</el-descriptions-item>
-        <el-descriptions-item label="物资和装备分类">
-          <dict-tag :options="emergency_supplies_type" :value="currentRow.materialType" />
-        </el-descriptions-item>
-        <el-descriptions-item label="物资和装备名称">{{ currentRow.materialName || '—' }}</el-descriptions-item>
-        <el-descriptions-item label="物资和装备数量">{{ currentRow.materialNum ?? '—' }}</el-descriptions-item>
-        <el-descriptions-item label="规格单位">{{ currentRow.company || '—' }}</el-descriptions-item>
-        <el-descriptions-item label="配置时间">{{ currentRow.provideTime || '—' }}</el-descriptions-item>
-        <el-descriptions-item label="存放位置" :span="2">{{ currentRow.despositSite || '—' }}</el-descriptions-item>
-      </el-descriptions>
+    <!-- 应急物资装备详情(某单位具体物资明细) -->
+    <el-dialog :title="detailTitle" v-model="detailOpen" width="860px" append-to-body>
+      <el-table v-loading="detailLoading" :data="detailList" height="420" max-height="480">
+        <el-table-column type="index" label="序号" width="55" align="center" />
+        <el-table-column label="物资和装备分类" align="center" min-width="110">
+          <template #default="scope">
+            <dict-tag :options="emergency_supplies_type" :value="scope.row.materialType" />
+          </template>
+        </el-table-column>
+        <el-table-column label="物资和装备名称" align="center" prop="materialName" min-width="140"
+          :show-overflow-tooltip="true" />
+        <el-table-column label="数量" align="center" prop="materialNum" width="80" />
+        <el-table-column label="规格" align="center" prop="specs" width="110" :show-overflow-tooltip="true" />
+        <el-table-column label="配备时间" align="center" prop="provideTime" width="120" />
+        <el-table-column label="存放位置" align="center" prop="despositSite" min-width="140"
+          :show-overflow-tooltip="true" />
+      </el-table>
       <template #footer>
         <el-button @click="detailOpen = false">关 闭</el-button>
       </template>
@@ -69,7 +69,7 @@
 
 <script setup name="InfoQuerySupplies">
 import { getCurrentInstance, onMounted, reactive, ref } from 'vue'
-import { listSuppliesQuery } from "@/api/slaj/infoQuery"
+import { listSuppliesDetail, listSuppliesQuery } from "@/api/slaj/infoQuery"
 import { List, Search, Refresh } from '@element-plus/icons-vue'
 import SubOrgSelect from '@/components/SubOrgSelect/index.vue'
 import useUserStore from '@/store/modules/user'
@@ -91,7 +91,9 @@ const queryParams = reactive({
 
 // ===== 详情 =====
 const detailOpen = ref(false)
-const currentRow = ref({})
+const detailLoading = ref(false)
+const detailList = ref([])
+const detailTitle = ref('应急物资装备详情')
 
 function getList() {
   loading.value = true
@@ -116,8 +118,14 @@ function resetQuery() {
 }
 
 function handleDetail(row) {
-  currentRow.value = row
   detailOpen.value = true
+  detailTitle.value = `应急物资装备详情(${row.orgName || '—'})`
+  detailLoading.value = true
+  listSuppliesDetail({ orgGuid: row.orgGuid }).then(res => {
+    detailList.value = res.rows || []
+  }).finally(() => {
+    detailLoading.value = false
+  })
 }
 
 onMounted(() => {

+ 1 - 1
gw-ui/src/views/slaj/infoquery/team/index.vue

@@ -16,7 +16,7 @@
       <div class="search-bar" v-show="showSearch">
         <el-form :model="queryParams" ref="queryRef" :inline="true">
           <sub-org-select v-model="queryParams.orgGuid" label="组织机构" prop="orgGuid"
-            :root-dept-id="userStore.orgGuid" placeholder="请选择组织机构" />
+            :root-dept-id="userStore.orgGuid" include-root placeholder="请选择组织机构" />
           <el-form-item>
             <el-button type="primary" @click="handleQuery"><el-icon><Search /></el-icon> 搜索</el-button>
             <el-button @click="resetQuery"><el-icon><Refresh /></el-icon> 重置</el-button>