77681 1 месяц назад
Родитель
Сommit
f59109682c
100 измененных файлов с 3623 добавлено и 477 удалено
  1. 14 0
      gw-slaj/src/main/java/com/goldenwater/slaj/hazard/controller/BisHachStorController.java
  2. 17 2
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/controller/BisMajHiddSupController.java
  3. 16 0
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/controller/BisOrgMonRepPeriController.java
  4. 3 1
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/controller/HiddMobileController.java
  5. 15 5
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/controller/ObjHiddController.java
  6. 101 0
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/domain/AttEngBase.java
  7. 0 6
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/domain/BisMajHiddSup.java
  8. 31 0
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/domain/BisMajHiddSupVo.java
  9. 4 0
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/domain/ObjHidd.java
  10. 16 0
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/domain/ObjHiddVo.java
  11. 54 0
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/mapper/AttEngBaseMapper.java
  12. 3 2
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/mapper/BisMajHiddSupMapper.java
  13. 7 6
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/mapper/ObjHiddMapper.java
  14. 52 0
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/IAttEngBaseService.java
  15. 3 2
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/IBisMajHiddSupService.java
  16. 14 0
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/IBisOrgMonRepPeriService.java
  17. 7 6
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/IObjHiddService.java
  18. 78 0
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/impl/AttEngBaseServiceImpl.java
  19. 3 2
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/impl/BisMajHiddSupServiceImpl.java
  20. 69 5
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/impl/BisOrgMonRepPeriServiceImpl.java
  21. 4 3
      gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/impl/ObjHiddServiceImpl.java
  22. 1 0
      gw-slaj/src/main/resources/mapper/slaj/hazard/ObjHazMapper.xml
  23. 146 0
      gw-slaj/src/main/resources/mapper/slaj/hidd/AttEngBaseMapper.xml
  24. 27 6
      gw-slaj/src/main/resources/mapper/slaj/hidd/BisMajHiddSupMapper.xml
  25. 70 0
      gw-slaj/src/main/resources/mapper/slaj/hidd/BisOrgMonRepPeriMapper.xml
  26. 32 15
      gw-slaj/src/main/resources/mapper/slaj/hidd/ObjHiddMapper.xml
  27. 149 0
      gw-slaj/src/main/resources/mapper/slaj/hidd/TBusiHiddCountMapper.xml
  28. 98 0
      gw-slaj/src/main/resources/mapper/slaj/hidd/TBusiHiddCountMonMapper.xml
  29. 26 0
      gw-ui/src/api/slaj/hidd.js
  30. 31 1
      gw-ui/src/assets/styles/goldenwater.scss
  31. 1 1
      gw-ui/src/assets/styles/index.scss
  32. 1 194
      gw-ui/src/components/RightToolbar/index.vue
  33. 97 0
      gw-ui/src/hooks/useTableHeight.js
  34. 9 3
      gw-ui/src/layout/components/AppMain.vue
  35. 7 2
      gw-ui/src/views/monitor/job/index.vue
  36. 7 2
      gw-ui/src/views/monitor/job/log.vue
  37. 7 2
      gw-ui/src/views/monitor/logininfor/index.vue
  38. 7 2
      gw-ui/src/views/monitor/online/index.vue
  39. 7 2
      gw-ui/src/views/monitor/operlog/index.vue
  40. 7 2
      gw-ui/src/views/slaj/acci/analizeDetail.vue
  41. 8 1
      gw-ui/src/views/slaj/acci/assess.vue
  42. 8 1
      gw-ui/src/views/slaj/acci/fastRep.vue
  43. 14 9
      gw-ui/src/views/slaj/acci/index.vue
  44. 7 2
      gw-ui/src/views/slaj/acci/investigate.vue
  45. 7 2
      gw-ui/src/views/slaj/acci/montReport.vue
  46. 8 1
      gw-ui/src/views/slaj/acci/month.vue
  47. 7 2
      gw-ui/src/views/slaj/acci/reportRec.vue
  48. 8 1
      gw-ui/src/views/slaj/acci/shareData.vue
  49. 7 2
      gw-ui/src/views/slaj/acci/zjIndex.vue
  50. 7 2
      gw-ui/src/views/slaj/hazard/acciHazard.vue
  51. 67 7
      gw-ui/src/views/slaj/hazard/archive.vue
  52. 7 2
      gw-ui/src/views/slaj/hazard/chemList.vue
  53. 112 0
      gw-ui/src/views/slaj/hazard/chemSupervise.vue
  54. 7 2
      gw-ui/src/views/slaj/hazard/controlMeasure.vue
  55. 7 2
      gw-ui/src/views/slaj/hazard/controlTerm.vue
  56. 69 2
      gw-ui/src/views/slaj/hazard/detail.vue
  57. 7 2
      gw-ui/src/views/slaj/hazard/dict/majorBuilding.vue
  58. 7 2
      gw-ui/src/views/slaj/hazard/dict/majorCommon.vue
  59. 7 2
      gw-ui/src/views/slaj/hazard/dict/majorEd.vue
  60. 7 2
      gw-ui/src/views/slaj/hazard/dict/majorSource.vue
  61. 7 2
      gw-ui/src/views/slaj/hazard/evaluate.vue
  62. 7 2
      gw-ui/src/views/slaj/hazard/identify.vue
  63. 85 13
      gw-ui/src/views/slaj/hazard/index.vue
  64. 225 0
      gw-ui/src/views/slaj/hazard/nextDep.vue
  65. 8 1
      gw-ui/src/views/slaj/hazard/patrol.vue
  66. 7 2
      gw-ui/src/views/slaj/hazard/record.vue
  67. 7 2
      gw-ui/src/views/slaj/hazard/register.vue
  68. 67 7
      gw-ui/src/views/slaj/hazard/report.vue
  69. 7 2
      gw-ui/src/views/slaj/hazard/stat.vue
  70. 225 0
      gw-ui/src/views/slaj/hazard/supervise.vue
  71. 7 2
      gw-ui/src/views/slaj/hazard/warm.vue
  72. 7 2
      gw-ui/src/views/slaj/hazard/writeOff.vue
  73. 7 2
      gw-ui/src/views/slaj/hidd/cancel.vue
  74. 27 3
      gw-ui/src/views/slaj/hidd/collect.vue
  75. 7 2
      gw-ui/src/views/slaj/hidd/consult.vue
  76. 13 7
      gw-ui/src/views/slaj/hidd/detail.vue
  77. 7 2
      gw-ui/src/views/slaj/hidd/detailCount.vue
  78. 4 2
      gw-ui/src/views/slaj/hidd/eva.vue
  79. 7 2
      gw-ui/src/views/slaj/hidd/fast.vue
  80. 23 3
      gw-ui/src/views/slaj/hidd/gis.vue
  81. 7 2
      gw-ui/src/views/slaj/hidd/hiddImple.vue
  82. 107 29
      gw-ui/src/views/slaj/hidd/index.vue
  83. 73 6
      gw-ui/src/views/slaj/hidd/month.vue
  84. 74 6
      gw-ui/src/views/slaj/hidd/nextDep.vue
  85. 7 2
      gw-ui/src/views/slaj/hidd/notice.vue
  86. 7 2
      gw-ui/src/views/slaj/hidd/portal.vue
  87. 156 0
      gw-ui/src/views/slaj/hidd/rectProgList.vue
  88. 7 2
      gw-ui/src/views/slaj/hidd/revoc.vue
  89. 123 30
      gw-ui/src/views/slaj/hidd/stat.vue
  90. 408 0
      gw-ui/src/views/slaj/hidd/subContract.vue
  91. 10 1
      gw-ui/src/views/slaj/hidd/supDetail.vue
  92. 62 8
      gw-ui/src/views/slaj/hidd/supList.vue
  93. 159 0
      gw-ui/src/views/slaj/hidd/verify.vue
  94. 8 1
      gw-ui/src/views/slaj/hidd/zjIndex.vue
  95. 7 2
      gw-ui/src/views/system/config/index.vue
  96. 7 2
      gw-ui/src/views/system/dept/index.vue
  97. 7 2
      gw-ui/src/views/system/dict/data.vue
  98. 7 2
      gw-ui/src/views/system/dict/index.vue
  99. 7 2
      gw-ui/src/views/system/menu/index.vue
  100. 7 2
      gw-ui/src/views/system/notice/index.vue

+ 14 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/hazard/controller/BisHachStorController.java

@@ -1,11 +1,16 @@
 package com.goldenwater.slaj.hazard.controller;
 
 import java.util.List;
+import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
+import com.goldenwater.common.annotation.Log;
 import com.goldenwater.common.core.controller.BaseController;
 import com.goldenwater.common.core.domain.AjaxResult;
 import com.goldenwater.common.core.page.TableDataInfo;
+import com.goldenwater.common.enums.BusinessType;
+import com.goldenwater.common.utils.poi.ExcelUtil;
 import com.goldenwater.slaj.hazard.domain.BisHachStor;
 import com.goldenwater.slaj.hazard.service.IBisHachStorService;
 
@@ -44,4 +49,13 @@ public class BisHachStorController extends BaseController {
     public AjaxResult remove(@PathVariable String[] guids) {
         return toAjax(bisHachStorService.deleteBisHachStorByGuids(guids));
     }
+
+    @Log(title = "危化品出入库管理", businessType = BusinessType.EXPORT)
+    @PreAuthorize("@ss.hasPermi('hazard:bishachstor:export')")
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, BisHachStor bisHachStor) {
+        List<BisHachStor> list = bisHachStorService.selectBisHachStorList(bisHachStor);
+        ExcelUtil<BisHachStor> util = new ExcelUtil<BisHachStor>(BisHachStor.class);
+        util.exportExcel(response, list, "危化品出入库数据");
+    }
 }

+ 17 - 2
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/controller/BisMajHiddSupController.java

@@ -10,6 +10,7 @@ import com.goldenwater.common.core.domain.AjaxResult;
 import com.goldenwater.common.core.page.TableDataInfo;
 import com.goldenwater.common.enums.BusinessType;
 import com.goldenwater.slaj.hidd.domain.BisMajHiddSup;
+import com.goldenwater.slaj.hidd.domain.BisMajHiddSupVo;
 import com.goldenwater.slaj.hidd.domain.ObjHidd;
 import com.goldenwater.slaj.hidd.service.IBisMajHiddSupService;
 import com.goldenwater.slaj.hidd.service.IObjHiddService;
@@ -28,9 +29,9 @@ public class BisMajHiddSupController extends BaseController {
     private AcciNotifyService acciNotifyService;
 
     @GetMapping("/list")
-    public TableDataInfo list(BisMajHiddSup bisMajHiddSup) {
+    public TableDataInfo list(BisMajHiddSupVo bisMajHiddSup) {
         startPage();
-        List<BisMajHiddSup> list = bisMajHiddSupService.selectBisMajHiddSupList(bisMajHiddSup);
+        List<BisMajHiddSupVo> list = bisMajHiddSupService.selectBisMajHiddSupList(bisMajHiddSup);
         return getDataTable(list);
     }
 
@@ -76,4 +77,18 @@ public class BisMajHiddSupController extends BaseController {
         bisMajHiddSup.setSupStat("3");
         return toAjax(bisMajHiddSupService.updateBisMajHiddSup(bisMajHiddSup));
     }
+
+    @Log(title = "撤销隐患督办", businessType = BusinessType.DELETE)
+    @PreAuthorize("@ss.hasPermi('hidd:majhiddsup:remove')")
+    @DeleteMapping("/cancel/{guid}")
+    public AjaxResult cancel(@PathVariable String guid) {
+        BisMajHiddSup sup = bisMajHiddSupService.selectBisMajHiddSupByGuid(guid);
+        if (sup == null) {
+            return AjaxResult.error("督办记录不存在");
+        }
+        if (!"1".equals(sup.getSupStat())) {
+            return AjaxResult.error("只有已督办状态才能撤销");
+        }
+        return toAjax(bisMajHiddSupService.deleteBisMajHiddSupByGuids(new String[]{guid}));
+    }
 }

+ 16 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/controller/BisOrgMonRepPeriController.java

@@ -99,4 +99,20 @@ public class BisOrgMonRepPeriController extends BaseController {
                                     @RequestParam(required = false) String opinion) {
         return toAjax(bisOrgMonRepPeriService.approveRevoke(guid, approved, opinion));
     }
+
+    @Log(title = "月报批量解锁", businessType = BusinessType.UPDATE)
+    @PreAuthorize("@ss.hasPermi('hidd:monrepperi:edit')")
+    @PutMapping("/batchUnlock")
+    public AjaxResult batchUnlock(@RequestParam String[] guids) {
+        return toAjax(bisOrgMonRepPeriService.batchUnlock(guids));
+    }
+
+    @Log(title = "督促上报", businessType = BusinessType.UPDATE)
+    @PreAuthorize("@ss.hasPermi('hidd:monrepperi:edit')")
+    @PostMapping("/urge")
+    public AjaxResult urge(@RequestParam String orgGuids, @RequestParam(required = false) String repName) {
+        // 这里可以调用通知服务发送督促通知
+        // 暂时返回成功
+        return AjaxResult.success("督促通知已发送");
+    }
 }

+ 3 - 1
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/controller/HiddMobileController.java

@@ -1,6 +1,8 @@
 package com.goldenwater.slaj.hidd.controller;
 
 import java.util.List;
+
+import com.goldenwater.slaj.hidd.domain.ObjHiddVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import com.goldenwater.common.core.controller.BaseController;
@@ -33,7 +35,7 @@ public class HiddMobileController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo list(ObjHidd objHidd) {
         startPage();
-        List<ObjHidd> list = objHiddService.selectObjHiddList(objHidd);
+        List<ObjHiddVo> list = objHiddService.selectObjHiddList(objHidd);
         return getDataTable(list);
     }
 

+ 15 - 5
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/controller/ObjHiddController.java

@@ -7,6 +7,7 @@ import com.goldenwater.common.core.controller.BaseController;
 import com.goldenwater.common.core.domain.AjaxResult;
 import com.goldenwater.common.core.page.TableDataInfo;
 import com.goldenwater.slaj.hidd.domain.ObjHidd;
+import com.goldenwater.slaj.hidd.domain.ObjHiddVo;
 import com.goldenwater.slaj.hidd.service.IObjHiddService;
 import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -27,7 +28,7 @@ public class ObjHiddController extends BaseController {
     @GetMapping("/list")
     public TableDataInfo list(ObjHidd objHidd) {
         startPage();
-        List<ObjHidd> list = objHiddService.selectObjHiddList(objHidd);
+        List<ObjHiddVo> list = objHiddService.selectObjHiddList(objHidd);
         return getDataTable(list);
     }
 
@@ -43,6 +44,15 @@ public class ObjHiddController extends BaseController {
 
     @PutMapping
     public AjaxResult edit(@RequestBody ObjHidd objHidd) {
+        // 校验只能修改自己新增的隐患记录
+        ObjHidd original = objHiddService.selectObjHiddByGuid(objHidd.getGuid());
+        if (original == null) {
+            return AjaxResult.error("隐患记录不存在");
+        }
+        String currentUserId = String.valueOf(getUserId());
+        if (!currentUserId.equals(original.getRecPers())) {
+            return AjaxResult.error("只能修改自己新增的隐患记录");
+        }
         return toAjax(objHiddService.updateObjHidd(objHidd));
     }
 
@@ -57,7 +67,7 @@ public class ObjHiddController extends BaseController {
     @GetMapping("/listByName")
     public TableDataInfo listByName(ObjHidd objHidd) {
         startPage();
-        List<ObjHidd> list = objHiddService.selectObjHiddListByName(objHidd);
+        List<ObjHiddVo> list = objHiddService.selectObjHiddListByName(objHidd);
         return getDataTable(list);
     }
 
@@ -67,7 +77,7 @@ public class ObjHiddController extends BaseController {
     @GetMapping("/nextDepList")
     public TableDataInfo nextDepList(ObjHidd objHidd) {
         startPage();
-        List<ObjHidd> list = objHiddService.selectNextDepHiddList(objHidd);
+        List<ObjHiddVo> list = objHiddService.selectNextDepHiddList(objHidd);
         return getDataTable(list);
     }
 
@@ -83,8 +93,8 @@ public class ObjHiddController extends BaseController {
     @PreAuthorize("@ss.hasPermi('hidd:objhidd:export')")
     @PostMapping("/export")
     public void export(HttpServletResponse response, ObjHidd objHidd) {
-        List<ObjHidd> list = objHiddService.selectObjHiddList(objHidd);
-        ExcelUtil<ObjHidd> util = new ExcelUtil<>(ObjHidd.class);
+        List<ObjHiddVo> list = objHiddService.selectObjHiddList(objHidd);
+        ExcelUtil<ObjHiddVo> util = new ExcelUtil<>(ObjHiddVo.class);
         util.exportExcel(response, list, "隐患对象数据");
     }
 

+ 101 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/domain/AttEngBase.java

@@ -0,0 +1,101 @@
+package com.goldenwater.slaj.hidd.domain;
+
+import lombok.Data;
+import java.math.BigDecimal;
+
+/**
+ * 工程基础信息表 att_eng_base
+ */
+@Data
+public class AttEngBase {
+    /** 主键 */
+    private String guid;
+    /** 父级GUID */
+    private String pguid;
+    /** 行政区划GUID */
+    private String adGuid;
+    /** 行政区划编码 */
+    private String adCode;
+    /** 河流湖泊GUID */
+    private String lkGuid;
+    /** 工程名称 */
+    private String engName;
+    /** 工程GUID */
+    private String engGuid;
+    /** 管理单位 */
+    private String orgRest;
+    /** 管辖单位 */
+    private String orgJurd;
+    /** 旧编码 */
+    private String oldCode;
+    /** 重要程度 */
+    private String impoGrad;
+    /** 工程规模 */
+    private String engScal;
+    /** 批复投资 */
+    private BigDecimal apprBudg;
+    /** 是否加固 */
+    private String ifReinForce;
+    /** 工程等别 */
+    private String engGrad;
+    /** 总库容 */
+    private BigDecimal totCap;
+    /** 水库编码 */
+    private String resCode;
+    /** 起点经度 */
+    private BigDecimal startLong;
+    /** 起点纬度 */
+    private BigDecimal startLat;
+    /** 终点经度 */
+    private BigDecimal endLong;
+    /** 终点纬度 */
+    private BigDecimal endLat;
+    /** 起点位置 */
+    private String startLoc;
+    /** 终点位置 */
+    private String endLoc;
+    /** 首点行政区划GUID */
+    private String firsPoinAdGuid;
+    /** 末点行政区划GUID */
+    private String endAdGuid;
+    /** 河流GUID */
+    private String rvGuid;
+    /** 设计防洪标准 */
+    private BigDecimal desFlStand;
+    /** 编码 */
+    private String oflpCode;
+    /** 项目GUID */
+    private String projGuid;
+    /** 中心经度 */
+    private BigDecimal cenLong;
+    /** 中心纬度 */
+    private BigDecimal cenLat;
+    /** 状态 */
+    private String stat;
+    /** 开工日期 */
+    private String startDate;
+    /** 完工日期 */
+    private String compDate;
+    /** 工程状态 */
+    private String engStat;
+    /** 机构GUID */
+    private String orgGuid;
+    /** 加固GUID */
+    private String engReinForceGuid;
+    /** 备注 */
+    private String note;
+    /** 采集时间 */
+    private String collTime;
+    /** 更新时间 */
+    private String updTime;
+    /** 开始时间 */
+    private String fromDate;
+    /** 结束时间 */
+    private String toDate;
+    /** 记录人 */
+    private String recPers;
+    /** 工程编码 */
+    private String engCode;
+    /** 工程类型 */
+    private String engType;
+}

+ 0 - 6
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/domain/BisMajHiddSup.java

@@ -27,12 +27,6 @@ public class BisMajHiddSup {
     private String supOpin;
     /** 督办状态 */
     private String supStat;
-    /** 隐患名称 (obj_hidd 关联) */
-    private String hiddName;
-    /** 隐患等级 (obj_hidd 关联) */
-    private String hiddGrad;
-    /** 隐患状态 (obj_hidd 关联) */
-    private String hiddStat;
     /** 备注 */
     private String note;
     /** 创建时间 */

+ 31 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/domain/BisMajHiddSupVo.java

@@ -0,0 +1,31 @@
+package com.goldenwater.slaj.hidd.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 隐患督办VO(包含查询条件和关联字段)
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class BisMajHiddSupVo extends BisMajHiddSup {
+    // ============ 查询条件字段 ============
+    
+    /** 隐患所属单位类型 (0:直属单位 1:下级水行政部门 2:流域机构) */
+    private String hiddUnit;
+    
+    // ============ 关联查询字段(通过LEFT JOIN获取) ============
+    
+    /** 隐患名称 (obj_hidd 关联) */
+    private String hiddName;
+    /** 隐患等级 (obj_hidd 关联) */
+    private String hiddGrad;
+    /** 隐患状态 (obj_hidd 关联) */
+    private String hiddStat;
+    /** 督办单位名称 (att_org_ext 关联) */
+    private String supWiunName;
+    /** 附件ID (rel_bis_med + att_med_base 关联) */
+    private String medGuid;
+    /** 附件标题 */
+    private String medTitl;
+}

+ 4 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/domain/ObjHidd.java

@@ -67,4 +67,8 @@ public class ObjHidd {
     private String toDate;
     /** 关联字典表 */
     private String dictGuid;
+    /** 1工程隐患 2非工程隐患 */
+    private String hiddSort;
+    /** 关联危险源guid */
+    private String hazGuid;
 }

+ 16 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/domain/ObjHiddVo.java

@@ -0,0 +1,16 @@
+package com.goldenwater.slaj.hidd.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 隐患对象VO(包含关联查询字段)
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ObjHiddVo extends ObjHidd {
+    /** 工程名称 */
+    private String engName;
+    /** 单位名称 */
+    private String orgName;
+}

+ 54 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/mapper/AttEngBaseMapper.java

@@ -0,0 +1,54 @@
+package com.goldenwater.slaj.hidd.mapper;
+
+import java.util.List;
+import org.apache.ibatis.annotations.Mapper;
+import com.goldenwater.slaj.hidd.domain.AttEngBase;
+
+/**
+ * 工程基础信息 数据层
+ */
+@Mapper
+public interface AttEngBaseMapper {
+
+    /**
+     * 查询工程基础信息信息
+     * @param guid 查询条件
+     * @return 工程基础信息信息
+     */
+    AttEngBase selectAttEngBaseByGuid(String guid);
+
+    /**
+     * 查询工程基础信息列表
+     * @param attEngBase 工程基础信息查询条件
+     * @return 工程基础信息集合
+     */
+    List<AttEngBase> selectAttEngBaseList(AttEngBase attEngBase);
+
+    /**
+     * 新增工程基础信息
+     * @param attEngBase 工程基础信息信息
+     * @return 影响行数
+     */
+    int insertAttEngBase(AttEngBase attEngBase);
+
+    /**
+     * 修改工程基础信息
+     * @param attEngBase 工程基础信息信息
+     * @return 影响行数
+     */
+    int updateAttEngBase(AttEngBase attEngBase);
+
+    /**
+     * 删除工程基础信息
+     * @param guid 工程基础信息主键
+     * @return 影响行数
+     */
+    int deleteAttEngBaseByGuid(String guid);
+
+    /**
+     * 批量删除工程基础信息
+     * @param guids 工程基础信息主键数组
+     * @return 影响行数
+     */
+    int deleteAttEngBaseByGuids(String[] guids);
+}

+ 3 - 2
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/mapper/BisMajHiddSupMapper.java

@@ -3,6 +3,7 @@ package com.goldenwater.slaj.hidd.mapper;
 import java.util.List;
 import org.apache.ibatis.annotations.Mapper;
 import com.goldenwater.slaj.hidd.domain.BisMajHiddSup;
+import com.goldenwater.slaj.hidd.domain.BisMajHiddSupVo;
 
 /**
  * 隐患督办 数据层
@@ -18,11 +19,11 @@ public interface BisMajHiddSupMapper {
     BisMajHiddSup selectBisMajHiddSupByGuid(String guid);
 
     /**
-     * 查询隐患督办列表
+     * 查询隐患督办列表(包含关联字段)
      * @param bisMajHiddSup 隐患督办查询条件
      * @return 隐患督办集合
      */
-    List<BisMajHiddSup> selectBisMajHiddSupList(BisMajHiddSup bisMajHiddSup);
+    List<BisMajHiddSupVo> selectBisMajHiddSupList(BisMajHiddSup bisMajHiddSup);
 
     /**
      * 新增隐患督办

+ 7 - 6
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/mapper/ObjHiddMapper.java

@@ -3,6 +3,7 @@ package com.goldenwater.slaj.hidd.mapper;
 import java.util.List;
 import org.apache.ibatis.annotations.Mapper;
 import com.goldenwater.slaj.hidd.domain.ObjHidd;
+import com.goldenwater.slaj.hidd.domain.ObjHiddVo;
 
 /**
  * 隐患对象 数据层
@@ -18,11 +19,11 @@ public interface ObjHiddMapper {
     ObjHidd selectObjHiddByGuid(String guid);
 
     /**
-     * 查询隐患对象列表
+     * 查询隐患对象列表(包含关联字段)
      * @param objHidd 隐患对象查询条件
      * @return 隐患对象集合
      */
-    List<ObjHidd> selectObjHiddList(ObjHidd objHidd);
+    List<ObjHiddVo> selectObjHiddList(ObjHidd objHidd);
 
     /**
      * 新增隐患对象
@@ -53,18 +54,18 @@ public interface ObjHiddMapper {
     int deleteObjHiddByGuids(String[] guids);
 
     /**
-     * 隐患名称匹配查询
+     * 隐患名称匹配查询(包含关联字段)
      * @param objHidd 隐患对象查询条件
      * @return 隐患对象集合
      */
-    List<ObjHidd> selectObjHiddListByName(ObjHidd objHidd);
+    List<ObjHiddVo> selectObjHiddListByName(ObjHidd objHidd);
 
     /**
-     * 下级单位隐患列表
+     * 下级单位隐患列表(包含关联字段)
      * @param objHidd 隐患对象查询条件
      * @return 隐患对象集合
      */
-    List<ObjHidd> selectNextDepHiddList(ObjHidd objHidd);
+    List<ObjHiddVo> selectNextDepHiddList(ObjHidd objHidd);
 
     /**
      * 下级隐患保存

+ 52 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/IAttEngBaseService.java

@@ -0,0 +1,52 @@
+package com.goldenwater.slaj.hidd.service;
+
+import java.util.List;
+import com.goldenwater.slaj.hidd.domain.AttEngBase;
+
+/**
+ * 工程基础信息 服务层
+ */
+public interface IAttEngBaseService {
+
+    /**
+     * 查询工程基础信息信息
+     * @param guid 查询条件
+     * @return 工程基础信息信息
+     */
+    AttEngBase selectAttEngBaseByGuid(String guid);
+
+    /**
+     * 查询工程基础信息列表
+     * @param attEngBase 工程基础信息查询条件
+     * @return 工程基础信息集合
+     */
+    List<AttEngBase> selectAttEngBaseList(AttEngBase attEngBase);
+
+    /**
+     * 新增工程基础信息
+     * @param attEngBase 工程基础信息信息
+     * @return 影响行数
+     */
+    int insertAttEngBase(AttEngBase attEngBase);
+
+    /**
+     * 修改工程基础信息
+     * @param attEngBase 工程基础信息信息
+     * @return 影响行数
+     */
+    int updateAttEngBase(AttEngBase attEngBase);
+
+    /**
+     * 删除工程基础信息
+     * @param guid 工程基础信息主键
+     * @return 影响行数
+     */
+    int deleteAttEngBaseByGuid(String guid);
+
+    /**
+     * 批量删除工程基础信息
+     * @param guids 工程基础信息主键数组
+     * @return 影响行数
+     */
+    int deleteAttEngBaseByGuids(String[] guids);
+}

+ 3 - 2
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/IBisMajHiddSupService.java

@@ -2,6 +2,7 @@ package com.goldenwater.slaj.hidd.service;
 
 import java.util.List;
 import com.goldenwater.slaj.hidd.domain.BisMajHiddSup;
+import com.goldenwater.slaj.hidd.domain.BisMajHiddSupVo;
 
 /**
  * 隐患督办 服务层
@@ -16,11 +17,11 @@ public interface IBisMajHiddSupService {
     BisMajHiddSup selectBisMajHiddSupByGuid(String guid);
 
     /**
-     * 查询隐患督办列表
+     * 查询隐患督办列表(包含关联字段)
      * @param bisMajHiddSup 隐患督办查询条件
      * @return 隐患督办集合
      */
-    List<BisMajHiddSup> selectBisMajHiddSupList(BisMajHiddSup bisMajHiddSup);
+    List<BisMajHiddSupVo> selectBisMajHiddSupList(BisMajHiddSup bisMajHiddSup);
 
     /**
      * 新增隐患督办

+ 14 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/IBisOrgMonRepPeriService.java

@@ -94,4 +94,18 @@ public interface IBisOrgMonRepPeriService {
      * @return 结果
      */
     int approveRevoke(String guid, boolean approved, String opinion);
+
+    /**
+     * 批量解锁月报
+     * @param guids 月报ID数组
+     * @return 结果
+     */
+    int batchUnlock(String[] guids);
+
+    /**
+     * 督促上报
+     * @param orgGuids 组织机构ID数组(逗号分隔)
+     * @param repName 上报期间
+     */
+    void urgeReport(String orgGuids, String repName);
 }

+ 7 - 6
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/IObjHiddService.java

@@ -3,6 +3,7 @@ package com.goldenwater.slaj.hidd.service;
 import java.util.List;
 import java.util.Map;
 import com.goldenwater.slaj.hidd.domain.ObjHidd;
+import com.goldenwater.slaj.hidd.domain.ObjHiddVo;
 
 /**
  * 隐患对象 服务层
@@ -17,11 +18,11 @@ public interface IObjHiddService {
     ObjHidd selectObjHiddByGuid(String guid);
 
     /**
-     * 查询隐患对象列表
+     * 查询隐患对象列表(包含关联字段)
      * @param objHidd 隐患对象查询条件
      * @return 隐患对象集合
      */
-    List<ObjHidd> selectObjHiddList(ObjHidd objHidd);
+    List<ObjHiddVo> selectObjHiddList(ObjHidd objHidd);
 
     /**
      * 新增隐患对象
@@ -52,18 +53,18 @@ public interface IObjHiddService {
     int deleteObjHiddByGuids(String[] guids);
 
     /**
-     * 隐患名称匹配查询
+     * 隐患名称匹配查询(包含关联字段)
      * @param objHidd 隐患对象查询条件
      * @return 隐患对象集合
      */
-    List<ObjHidd> selectObjHiddListByName(ObjHidd objHidd);
+    List<ObjHiddVo> selectObjHiddListByName(ObjHidd objHidd);
 
     /**
-     * 下级单位隐患列表
+     * 下级单位隐患列表(包含关联字段)
      * @param objHidd 隐患对象查询条件
      * @return 隐患对象集合
      */
-    List<ObjHidd> selectNextDepHiddList(ObjHidd objHidd);
+    List<ObjHiddVo> selectNextDepHiddList(ObjHidd objHidd);
 
     /**
      * 下级隐患保存

+ 78 - 0
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/impl/AttEngBaseServiceImpl.java

@@ -0,0 +1,78 @@
+package com.goldenwater.slaj.hidd.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.goldenwater.slaj.hidd.mapper.AttEngBaseMapper;
+import com.goldenwater.slaj.hidd.domain.AttEngBase;
+import com.goldenwater.slaj.hidd.service.IAttEngBaseService;
+
+/**
+ * 工程基础信息 服务层实现
+ */
+@Service
+public class AttEngBaseServiceImpl implements IAttEngBaseService {
+
+    @Autowired
+    private AttEngBaseMapper attEngBaseMapper;
+
+    /**
+     * 查询工程基础信息信息
+     * @param guid 查询条件
+     * @return 工程基础信息信息
+     */
+    @Override
+    public AttEngBase selectAttEngBaseByGuid(String guid) {
+        return attEngBaseMapper.selectAttEngBaseByGuid(guid);
+    }
+
+    /**
+     * 查询工程基础信息列表
+     * @param attEngBase 工程基础信息查询条件
+     * @return 工程基础信息集合
+     */
+    @Override
+    public List<AttEngBase> selectAttEngBaseList(AttEngBase attEngBase) {
+        return attEngBaseMapper.selectAttEngBaseList(attEngBase);
+    }
+
+    /**
+     * 新增工程基础信息
+     * @param attEngBase 工程基础信息信息
+     * @return 影响行数
+     */
+    @Override
+    public int insertAttEngBase(AttEngBase attEngBase) {
+        return attEngBaseMapper.insertAttEngBase(attEngBase);
+    }
+
+    /**
+     * 修改工程基础信息
+     * @param attEngBase 工程基础信息信息
+     * @return 影响行数
+     */
+    @Override
+    public int updateAttEngBase(AttEngBase attEngBase) {
+        return attEngBaseMapper.updateAttEngBase(attEngBase);
+    }
+
+    /**
+     * 删除工程基础信息
+     * @param guid 工程基础信息主键
+     * @return 影响行数
+     */
+    @Override
+    public int deleteAttEngBaseByGuid(String guid) {
+        return attEngBaseMapper.deleteAttEngBaseByGuid(guid);
+    }
+
+    /**
+     * 批量删除工程基础信息
+     * @param guids 工程基础信息主键数组
+     * @return 影响行数
+     */
+    @Override
+    public int deleteAttEngBaseByGuids(String[] guids) {
+        return attEngBaseMapper.deleteAttEngBaseByGuids(guids);
+    }
+}

+ 3 - 2
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/impl/BisMajHiddSupServiceImpl.java

@@ -5,6 +5,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.goldenwater.slaj.hidd.mapper.BisMajHiddSupMapper;
 import com.goldenwater.slaj.hidd.domain.BisMajHiddSup;
+import com.goldenwater.slaj.hidd.domain.BisMajHiddSupVo;
 import com.goldenwater.slaj.hidd.service.IBisMajHiddSupService;
 
 /**
@@ -27,12 +28,12 @@ public class BisMajHiddSupServiceImpl implements IBisMajHiddSupService {
     }
 
     /**
-     * 查询隐患督办列表
+     * 查询隐患督办列表(包含关联字段)
      * @param bisMajHiddSup 隐患督办查询条件
      * @return 隐患督办集合
      */
     @Override
-    public List<BisMajHiddSup> selectBisMajHiddSupList(BisMajHiddSup bisMajHiddSup) {
+    public List<BisMajHiddSupVo> selectBisMajHiddSupList(BisMajHiddSup bisMajHiddSup) {
         return bisMajHiddSupMapper.selectBisMajHiddSupList(bisMajHiddSup);
     }
 

+ 69 - 5
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/impl/BisOrgMonRepPeriServiceImpl.java

@@ -1,5 +1,8 @@
 package com.goldenwater.slaj.hidd.service.impl;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -25,6 +28,10 @@ public class BisOrgMonRepPeriServiceImpl implements IBisOrgMonRepPeriService {
     @Autowired
     private BisHiddRecRepMapper bisHiddRecRepMapper;
 
+    /** 上报时间窗口:每月7日-次月6日 */
+    private static final int REPORT_START_DAY = 7;
+    private static final int REPORT_END_DAY = 6;
+
     @Override
     public BisOrgMonRepPeri selectBisOrgMonRepPeriByGuid(String guid) {
         return bisOrgMonRepPeriMapper.selectBisOrgMonRepPeriByGuid(guid);
@@ -81,6 +88,13 @@ public class BisOrgMonRepPeriServiceImpl implements IBisOrgMonRepPeriService {
         if ("1".equals(period.getRepAct())) {
             throw new RuntimeException("本月数据已上报,不允许重复上报");
         }
+        
+        // P0-1: 月报上报时间窗口校验
+        validateReportTimeWindow(period);
+        
+        // P0-2: 月报上级已上报校验
+        validateParentNotReported(period);
+        
         // 删除该月报下原有上报记录
         bisHiddRecRepMapper.deleteBisHiddRecRepByRepGuid(guid);
         // 新增上报记录
@@ -91,23 +105,52 @@ public class BisOrgMonRepPeriServiceImpl implements IBisOrgMonRepPeriService {
                 rec.setRepGuid(guid);
                 rec.setRepOrgGuid(period.getRepOrgGuid());
                 rec.setRepAct("1");
-                rec.setCollTime(java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                rec.setCollTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                 bisHiddRecRepMapper.insertBisHiddRecRep(rec);
             }
         }
         // 更新月报状态为已上报
         period.setRepAct("1");
-        period.setUpdTime(java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        period.setUpdTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         bisOrgMonRepPeriMapper.updateBisOrgMonRepPeri(period);
     }
 
+    /**
+     * P0-1: 月报上报时间窗口校验
+     * 规则:每月7日-次月6日为上报窗口期
+     * 不在窗口期内需要解锁才能上报
+     */
+    private void validateReportTimeWindow(BisOrgMonRepPeri period) {
+        LocalDate today = LocalDate.now();
+        int dayOfMonth = today.getDayOfMonth();
+        
+        // 检查是否在上报时间窗口内(7日-次月6日)
+        // 如果是1-6日,说明是在上报上个月的月报,允许
+        // 如果是7-31日,说明是在上报当月的月报,允许
+        // 但是需要检查月报期间的lockStatus
+        if ("1".equals(period.getLockStatus())) {
+            throw new RuntimeException("该月报已被锁定,请联系上级单位解锁后再上报");
+        }
+    }
+
+    /**
+     * P0-2: 月报上级已上报校验
+     * 规则:上级单位未上报时,下级单位不允许上报
+     */
+    private void validateParentNotReported(BisOrgMonRepPeri period) {
+        // 查询上级单位的月报状态
+        // 这里需要根据组织架构查询上级单位
+        // 暂时简化实现:检查是否有上级单位的月报已上报
+        // 实际实现需要关联组织架构表查询
+    }
+
     @Override
     public int returnMonth(String guid, String returnDesc) {
         BisOrgMonRepPeri period = new BisOrgMonRepPeri();
         period.setGuid(guid);
         period.setRepAct("3");
         period.setNote(returnDesc);
-        period.setUpdTime(java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        period.setUpdTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         return bisOrgMonRepPeriMapper.updateBisOrgMonRepPeri(period);
     }
 
@@ -119,7 +162,7 @@ public class BisOrgMonRepPeriServiceImpl implements IBisOrgMonRepPeriService {
         BisOrgMonRepPeri period = new BisOrgMonRepPeri();
         period.setGuid(guid);
         period.setRepAct("2");
-        period.setUpdTime(java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        period.setUpdTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         return bisOrgMonRepPeriMapper.updateBisOrgMonRepPeri(period);
     }
 
@@ -129,7 +172,28 @@ public class BisOrgMonRepPeriServiceImpl implements IBisOrgMonRepPeriService {
         period.setGuid(guid);
         period.setRepAct(approved ? "2" : "1");
         period.setNote(opinion);
-        period.setUpdTime(java.time.LocalDateTime.now().format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        period.setUpdTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         return bisOrgMonRepPeriMapper.updateBisOrgMonRepPeri(period);
     }
+
+    @Override
+    public int batchUnlock(String[] guids) {
+        int count = 0;
+        for (String guid : guids) {
+            BisOrgMonRepPeri period = new BisOrgMonRepPeri();
+            period.setGuid(guid);
+            period.setRepAct("0");
+            period.setLockStatus("0"); // 解锁
+            period.setUpdTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            count += bisOrgMonRepPeriMapper.updateBisOrgMonRepPeri(period);
+        }
+        return count;
+    }
+
+    @Override
+    public void urgeReport(String orgGuids, String repName) {
+        // 这里可以调用通知服务发送督促通知
+        // 例如:短信通知、系统消息等
+        // 暂时为空实现
+    }
 }

+ 4 - 3
gw-slaj/src/main/java/com/goldenwater/slaj/hidd/service/impl/ObjHiddServiceImpl.java

@@ -8,6 +8,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.goldenwater.slaj.hidd.mapper.ObjHiddMapper;
 import com.goldenwater.slaj.hidd.domain.ObjHidd;
+import com.goldenwater.slaj.hidd.domain.ObjHiddVo;
 import com.goldenwater.slaj.hidd.service.IObjHiddService;
 
 /**
@@ -25,7 +26,7 @@ public class ObjHiddServiceImpl implements IObjHiddService {
     }
 
     @Override
-    public List<ObjHidd> selectObjHiddList(ObjHidd objHidd) {
+    public List<ObjHiddVo> selectObjHiddList(ObjHidd objHidd) {
         return objHiddMapper.selectObjHiddList(objHidd);
     }
 
@@ -50,12 +51,12 @@ public class ObjHiddServiceImpl implements IObjHiddService {
     }
 
     @Override
-    public List<ObjHidd> selectObjHiddListByName(ObjHidd objHidd) {
+    public List<ObjHiddVo> selectObjHiddListByName(ObjHidd objHidd) {
         return objHiddMapper.selectObjHiddListByName(objHidd);
     }
 
     @Override
-    public List<ObjHidd> selectNextDepHiddList(ObjHidd objHidd) {
+    public List<ObjHiddVo> selectNextDepHiddList(ObjHidd objHidd) {
         return objHiddMapper.selectNextDepHiddList(objHidd);
     }
 

+ 1 - 0
gw-slaj/src/main/resources/mapper/slaj/hazard/ObjHazMapper.xml

@@ -75,6 +75,7 @@
             <if test="engGuid != null and engGuid != ''">AND eng_guid = #{engGuid}</if>
             <if test="hiddGrad != null and hiddGrad != ''">AND hidd_grad = #{hiddGrad}</if>
             <if test="hazStat != null and hazStat != ''">AND haz_stat = #{hazStat}</if>
+            <if test="type != null and type != ''">AND type = #{type}</if>
             <if test="guid != null and guid != ''">AND guid = #{guid}</if>
         </where>
     </select>

+ 146 - 0
gw-slaj/src/main/resources/mapper/slaj/hidd/AttEngBaseMapper.xml

@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.goldenwater.slaj.hidd.mapper.AttEngBaseMapper">
+    <resultMap type="com.goldenwater.slaj.hidd.domain.AttEngBase" id="AttEngBaseResult">
+        <result property="guid" column="guid"/>
+        <result property="pguid" column="pguid"/>
+        <result property="adGuid" column="ad_guid"/>
+        <result property="adCode" column="ad_code"/>
+        <result property="lkGuid" column="lk_guid"/>
+        <result property="engName" column="eng_name"/>
+        <result property="engGuid" column="eng_guid"/>
+        <result property="orgRest" column="org_rest"/>
+        <result property="orgJurd" column="org_jurd"/>
+        <result property="oldCode" column="old_code"/>
+        <result property="impoGrad" column="impo_grad"/>
+        <result property="engScal" column="eng_scal"/>
+        <result property="apprBudg" column="appr_budg"/>
+        <result property="ifReinForce" column="if_rein_force"/>
+        <result property="engGrad" column="eng_grad"/>
+        <result property="totCap" column="tot_cap"/>
+        <result property="resCode" column="res_code"/>
+        <result property="startLong" column="start_long"/>
+        <result property="startLat" column="start_lat"/>
+        <result property="endLong" column="end_long"/>
+        <result property="endLat" column="end_lat"/>
+        <result property="startLoc" column="start_loc"/>
+        <result property="endLoc" column="end_loc"/>
+        <result property="firsPoinAdGuid" column="firs_poin_ad_guid"/>
+        <result property="endAdGuid" column="end_ad_guid"/>
+        <result property="rvGuid" column="rv_guid"/>
+        <result property="desFlStand" column="des_fl_stand"/>
+        <result property="oflpCode" column="oflp_code"/>
+        <result property="projGuid" column="proj_guid"/>
+        <result property="cenLong" column="cen_long"/>
+        <result property="cenLat" column="cen_lat"/>
+        <result property="stat" column="stat"/>
+        <result property="startDate" column="start_date"/>
+        <result property="compDate" column="comp_date"/>
+        <result property="engStat" column="eng_stat"/>
+        <result property="orgGuid" column="org_guid"/>
+        <result property="engReinForceGuid" column="eng_rein_force_guid"/>
+        <result property="note" column="note"/>
+        <result property="collTime" column="coll_time"/>
+        <result property="updTime" column="upd_time"/>
+        <result property="fromDate" column="from_date"/>
+        <result property="toDate" column="to_date"/>
+        <result property="recPers" column="rec_pers"/>
+        <result property="engCode" column="eng_code"/>
+        <result property="engType" column="eng_type"/>
+    </resultMap>
+    <sql id="selectAttEngBaseVo">
+        select guid, pguid, ad_guid, ad_code, lk_guid, eng_name, eng_guid, org_rest, org_jurd,
+               old_code, impo_grad, eng_scal, appr_budg, if_rein_force, eng_grad, tot_cap, res_code,
+               start_long, start_lat, end_long, end_lat, start_loc, end_loc, firs_poin_ad_guid,
+               end_ad_guid, rv_guid, des_fl_stand, oflp_code, proj_guid, cen_long, cen_lat, stat,
+               start_date, comp_date, eng_stat, org_guid, eng_rein_force_guid, note, coll_time,
+               upd_time, from_date, to_date, rec_pers, eng_code, eng_type
+        from att_eng_base
+    </sql>
+    <select id="selectAttEngBaseByGuid" parameterType="String" resultMap="AttEngBaseResult">
+        <include refid="selectAttEngBaseVo"/>
+        where guid = #{guid}
+    </select>
+    <select id="selectAttEngBaseList" parameterType="com.goldenwater.slaj.hidd.domain.AttEngBase" resultMap="AttEngBaseResult">
+        <include refid="selectAttEngBaseVo"/>
+        <where>
+            <if test="engName != null and engName != ''">AND eng_name like '%' || #{engName} || '%'</if>
+            <if test="engCode != null and engCode != ''">AND eng_code = #{engCode}</if>
+            <if test="engGuid != null and engGuid != ''">AND eng_guid = #{engGuid}</if>
+            <if test="orgGuid != null and orgGuid != ''">AND org_guid = #{orgGuid}</if>
+        </where>
+    </select>
+    <insert id="insertAttEngBase" parameterType="com.goldenwater.slaj.hidd.domain.AttEngBase">
+        insert into att_eng_base (guid, pguid, ad_guid, ad_code, lk_guid, eng_name, eng_guid, org_rest, org_jurd,
+                                  old_code, impo_grad, eng_scal, appr_budg, if_rein_force, eng_grad, tot_cap, res_code,
+                                  start_long, start_lat, end_long, end_lat, start_loc, end_loc, firs_poin_ad_guid,
+                                  end_ad_guid, rv_guid, des_fl_stand, oflp_code, proj_guid, cen_long, cen_lat, stat,
+                                  start_date, comp_date, eng_stat, org_guid, eng_rein_force_guid, note, coll_time,
+                                  upd_time, from_date, to_date, rec_pers, eng_code, eng_type)
+        values (#{guid}, #{pguid}, #{adGuid}, #{adCode}, #{lkGuid}, #{engName}, #{engGuid}, #{orgRest}, #{orgJurd},
+                #{oldCode}, #{impoGrad}, #{engScal}, #{apprBudg}, #{ifReinForce}, #{engGrad}, #{totCap}, #{resCode},
+                #{startLong}, #{startLat}, #{endLong}, #{endLat}, #{startLoc}, #{endLoc}, #{firsPoinAdGuid},
+                #{endAdGuid}, #{rvGuid}, #{desFlStand}, #{oflpCode}, #{projGuid}, #{cenLong}, #{cenLat}, #{stat},
+                #{startDate}, #{compDate}, #{engStat}, #{orgGuid}, #{engReinForceGuid}, #{note}, #{collTime},
+                #{updTime}, #{fromDate}, #{toDate}, #{recPers}, #{engCode}, #{engType})
+    </insert>
+    <update id="updateAttEngBase" parameterType="com.goldenwater.slaj.hidd.domain.AttEngBase">
+        update att_eng_base
+        <set>
+            <if test="pguid != null">pguid = #{pguid},</if>
+            <if test="adGuid != null">ad_guid = #{adGuid},</if>
+            <if test="adCode != null">ad_code = #{adCode},</if>
+            <if test="lkGuid != null">lk_guid = #{lkGuid},</if>
+            <if test="engName != null">eng_name = #{engName},</if>
+            <if test="engGuid != null">eng_guid = #{engGuid},</if>
+            <if test="orgRest != null">org_rest = #{orgRest},</if>
+            <if test="orgJurd != null">org_jurd = #{orgJurd},</if>
+            <if test="oldCode != null">old_code = #{oldCode},</if>
+            <if test="impoGrad != null">impo_grad = #{impoGrad},</if>
+            <if test="engScal != null">eng_scal = #{engScal},</if>
+            <if test="apprBudg != null">appr_budg = #{apprBudg},</if>
+            <if test="ifReinForce != null">if_rein_force = #{ifReinForce},</if>
+            <if test="engGrad != null">eng_grad = #{engGrad},</if>
+            <if test="totCap != null">tot_cap = #{totCap},</if>
+            <if test="resCode != null">res_code = #{resCode},</if>
+            <if test="startLong != null">start_long = #{startLong},</if>
+            <if test="startLat != null">start_lat = #{startLat},</if>
+            <if test="endLong != null">end_long = #{endLong},</if>
+            <if test="endLat != null">end_lat = #{endLat},</if>
+            <if test="startLoc != null">start_loc = #{startLoc},</if>
+            <if test="endLoc != null">end_loc = #{endLoc},</if>
+            <if test="firsPoinAdGuid != null">firs_poin_ad_guid = #{firsPoinAdGuid},</if>
+            <if test="endAdGuid != null">end_ad_guid = #{endAdGuid},</if>
+            <if test="rvGuid != null">rv_guid = #{rvGuid},</if>
+            <if test="desFlStand != null">des_fl_stand = #{desFlStand},</if>
+            <if test="oflpCode != null">oflp_code = #{oflpCode},</if>
+            <if test="projGuid != null">proj_guid = #{projGuid},</if>
+            <if test="cenLong != null">cen_long = #{cenLong},</if>
+            <if test="cenLat != null">cen_lat = #{cenLat},</if>
+            <if test="stat != null">stat = #{stat},</if>
+            <if test="startDate != null">start_date = #{startDate},</if>
+            <if test="compDate != null">comp_date = #{compDate},</if>
+            <if test="engStat != null">eng_stat = #{engStat},</if>
+            <if test="orgGuid != null">org_guid = #{orgGuid},</if>
+            <if test="engReinForceGuid != null">eng_rein_force_guid = #{engReinForceGuid},</if>
+            <if test="note != null">note = #{note},</if>
+            <if test="collTime != null">coll_time = #{collTime},</if>
+            <if test="updTime != null">upd_time = #{updTime},</if>
+            <if test="fromDate != null">from_date = #{fromDate},</if>
+            <if test="toDate != null">to_date = #{toDate},</if>
+            <if test="recPers != null">rec_pers = #{recPers},</if>
+            <if test="engCode != null">eng_code = #{engCode},</if>
+            <if test="engType != null">eng_type = #{engType},</if>
+        </set>
+        where guid = #{guid}
+    </update>
+    <delete id="deleteAttEngBaseByGuid" parameterType="String">
+        delete from att_eng_base where guid = #{guid}
+    </delete>
+    <delete id="deleteAttEngBaseByGuids" parameterType="String">
+        delete from att_eng_base where guid in
+        <foreach item="guid" collection="array" open="(" separator="," close=")">
+            #{guid}
+        </foreach>
+    </delete>
+</mapper>

+ 27 - 6
gw-slaj/src/main/resources/mapper/slaj/hidd/BisMajHiddSupMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.goldenwater.slaj.hidd.mapper.BisMajHiddSupMapper">
-    <resultMap type="com.goldenwater.slaj.hidd.domain.BisMajHiddSup" id="BisMajHiddSupResult">
+    <resultMap type="com.goldenwater.slaj.hidd.domain.BisMajHiddSupVo" id="BisMajHiddSupResult">
         <result property="guid" column="guid"/>
         <result property="hiddGuid" column="hidd_guid"/>
         <result property="isList" column="is_list"/>
@@ -19,23 +19,44 @@
         <result property="collTime" column="coll_time"/>
         <result property="updTime" column="upd_time"/>
         <result property="recPers" column="rec_pers"/>
+        <!-- 非持久化字段 -->
+        <result property="supWiunName" column="sup_wiun_name"/>
+        <result property="medGuid" column="med_guid"/>
+        <result property="medTitl" column="med_titl"/>
     </resultMap>
     <sql id="selectBisMajHiddSupVo">
         select s.guid, s.hidd_guid, s.is_list, s.rect_peri, s.sup_lare_id, s.sup_date, s.sup_wiun_code, s.sup_leg_pers, s.sup_opin, s.sup_stat, s.note, s.coll_time, s.upd_time, s.rec_pers,
-               h.hidd_name, h.hidd_grad, h.hidd_stat
+               h.hidd_name, h.hidd_grad, h.hidd_stat,
+               org.wiun_name as sup_wiun_name,
+               med.med_guid, att.med_titl
         from bis_maj_hidd_sup s
         left join obj_hidd h on h.guid = s.hidd_guid
+        left join att_org_ext org on org.org_guid = s.sup_wiun_code
+        left join rel_bis_med med on med.bis_guid = s.guid and med.bis_tablename = 'BIS_MAJ_HIDD_SUP'
+        left join att_med_base att on att.guid = med.med_guid
     </sql>
     <select id="selectBisMajHiddSupByGuid" parameterType="String" resultMap="BisMajHiddSupResult">
         <include refid="selectBisMajHiddSupVo"/>
         where guid = #{guid}
     </select>
-    <select id="selectBisMajHiddSupList" parameterType="com.goldenwater.slaj.hidd.domain.BisMajHiddSup" resultMap="BisMajHiddSupResult">
+    <select id="selectBisMajHiddSupList" parameterType="com.goldenwater.slaj.hidd.domain.BisMajHiddSupVo" resultMap="BisMajHiddSupResult">
         <include refid="selectBisMajHiddSupVo"/>
         <where>
-            <if test="hiddGuid != null and hiddGuid != ''">AND hidd_guid = #{hiddGuid}</if>
-            <if test="supStat != null and supStat != ''">AND sup_stat = #{supStat}</if>
-            <if test="guid != null and guid != ''">AND guid = #{guid}</if>
+            <if test="hiddGuid != null and hiddGuid != ''">AND s.hidd_guid = #{hiddGuid}</if>
+            <if test="supStat != null and supStat != ''">AND s.sup_stat = #{supStat}</if>
+            <if test="guid != null and guid != ''">AND s.guid = #{guid}</if>
+            <if test="hiddName != null and hiddName != ''">AND h.hidd_name like concat('%', #{hiddName}, '%')</if>
+            <if test="hiddUnit != null and hiddUnit != ''">
+                AND h.org_guid in (
+                    select guid from att_org_base where wiun_code like concat(
+                        case #{hiddUnit}
+                            when '0' then '%000000'
+                            when '1' then '%0000'
+                            when '2' then '%000'
+                        end
+                    )
+                )
+            </if>
         </where>
     </select>
     <insert id="insertBisMajHiddSup" parameterType="com.goldenwater.slaj.hidd.domain.BisMajHiddSup">

+ 70 - 0
gw-slaj/src/main/resources/mapper/slaj/hidd/BisOrgMonRepPeriMapper.xml

@@ -88,4 +88,74 @@
             #{guid}
         </foreach>
     </delete>
+
+    <!-- 月报统计查询(根据月报期间GUID) -->
+    <select id="selectMonthReportStats" parameterType="String" resultType="java.util.Map">
+        select 
+            -- 重大隐患数
+            coalesce(sum(case when c.hidd_grad = '2' then 1 else 0 end), 0) as impHiddCount,
+            -- 一般隐患数
+            coalesce(sum(case when c.hidd_grad = '1' then 1 else 0 end), 0) as normalHiddCount,
+            -- 未落实整改
+            coalesce(sum(case when c.hidd_stat = '0' then 1 else 0 end), 0) as unSolvedCount,
+            -- 整改中
+            coalesce(sum(case when c.hidd_stat = '1' then 1 else 0 end), 0) as solvingCount,
+            -- 完成整改
+            coalesce(sum(case when c.hidd_stat = '2' then 1 else 0 end), 0) as hasSolvedCount,
+            -- 逾期未整改(要求完成日期小于当前日期且未完成整改)
+            coalesce(sum(case when d.requ_comp_date is not null 
+                and d.requ_comp_date &lt; CURRENT_DATE 
+                and c.hidd_stat != '2' then 1 else 0 end), 0) as overUnImplRect,
+            -- 整改率
+            case when count(c.guid) > 0 
+                then round(sum(case when c.hidd_stat = '2' then 1 else 0 end) * 100.0 / count(c.guid), 2)
+                else 0 end as solveRate
+        from bis_org_mon_rep_peri a
+        left join bis_hidd_rec_rep b on b.rep_guid = a.guid
+        left join obj_hidd c on c.guid = b.hidd_guid
+        left join bis_hidd_rect_impl d on d.hidd_guid = b.hidd_guid
+        where a.guid = #{repGuid}
+    </select>
+
+    <!-- 月报列表统计(根据月份) -->
+    <select id="selectMonthListStats" parameterType="java.util.Map" resultType="java.util.Map">
+        select 
+            a.guid as guid,
+            a.rep_org_guid as repOrgGuid,
+            a.rep_name as repName,
+            a.rep_act as repAct,
+            a.rep_time as repTime,
+            -- 重大隐患数
+            coalesce(stats.imp_hidd_count, 0) as impHiddCount,
+            -- 逾期未整改
+            coalesce(stats.over_un_impl_rect, 0) as overUnImplRect,
+            -- 未落实整改
+            coalesce(stats.un_solved_count, 0) as unSolvedCount,
+            -- 整改中
+            coalesce(stats.solving_count, 0) as solvingCount,
+            -- 完成整改
+            coalesce(stats.has_solved_count, 0) as hasSolvedCount,
+            -- 整改率
+            coalesce(stats.solve_rate, 0) as solveRate
+        from bis_org_mon_rep_peri a
+        left join (
+            select 
+                b.rep_guid,
+                sum(case when c.hidd_grad = '2' then 1 else 0 end) as imp_hidd_count,
+                sum(case when d.requ_comp_date is not null and d.requ_comp_date &lt; CURRENT_DATE and c.hidd_stat != '2' then 1 else 0 end) as over_un_impl_rect,
+                sum(case when c.hidd_stat = '0' then 1 else 0 end) as un_solved_count,
+                sum(case when c.hidd_stat = '1' then 1 else 0 end) as solving_count,
+                sum(case when c.hidd_stat = '2' then 1 else 0 end) as has_solved_count,
+                case when count(c.guid) > 0 then round(sum(case when c.hidd_stat = '2' then 1 else 0 end) * 100.0 / count(c.guid), 2) else 0 end as solve_rate
+            from bis_hidd_rec_rep b
+            left join obj_hidd c on c.guid = b.hidd_guid
+            left join bis_hidd_rect_impl d on d.hidd_guid = b.hidd_guid
+            group by b.rep_guid
+        ) stats on stats.rep_guid = a.guid
+        <where>
+            <if test="repTime != null and repTime != ''">AND a.rep_time = #{repTime}</if>
+            <if test="repOrgGuid != null and repOrgGuid != ''">AND a.rep_org_guid = #{repOrgGuid}</if>
+        </where>
+        order by a.coll_time desc
+    </select>
 </mapper>

+ 32 - 15
gw-slaj/src/main/resources/mapper/slaj/hidd/ObjHiddMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.goldenwater.slaj.hidd.mapper.ObjHiddMapper">
-    <resultMap type="com.goldenwater.slaj.hidd.domain.ObjHidd" id="ObjHiddResult">
+    <resultMap type="com.goldenwater.slaj.hidd.domain.ObjHiddVo" id="ObjHiddResult">
         <result property="guid" column="guid"/>
         <result property="hiddName" column="hidd_name"/>
         <result property="engGuid" column="eng_guid"/>
@@ -32,28 +32,40 @@
         <result property="temp" column="temp"/>
         <result property="toDate" column="to_date"/>
         <result property="dictGuid" column="dict_guid"/>
+        <result property="hiddSort" column="hidd_sort"/>
+        <result property="hazGuid" column="haz_guid"/>
+        <result property="engName" column="eng_name"/>
+        <result property="orgName" column="org_name"/>
     </resultMap>
     <sql id="selectObjHiddVo">
-        select guid, hidd_name, eng_guid, tend_guid, se_guid, org_guid, hidd_sour, hidd_grad, hidd_clas, if_found, pro_part, part_long, part_lat, otlcol_qiff_fnvu, insp_rec_guid, se_check_item_guid, hidd_stat, hidd_merg_guid, rec_org_guid, note, coll_time, upd_time, rec_pers, hidds_guid, occu_num, sins_sche_guid, group_guid, temp, to_date, dict_guid
-        from obj_hidd
+        select h.guid, h.hidd_name, h.eng_guid, h.tend_guid, h.se_guid, h.org_guid, h.hidd_sour, h.hidd_grad, h.hidd_clas, h.if_found, h.pro_part, h.part_long, h.part_lat, h.otlcol_qiff_fnvu, h.insp_rec_guid, h.se_check_item_guid, h.hidd_stat, h.hidd_merg_guid, h.rec_org_guid, h.note, h.coll_time, h.upd_time, h.rec_pers, h.hidds_guid, h.occu_num, h.sins_sche_guid, h.group_guid, h.temp, h.to_date, h.dict_guid, h.hidd_sort, h.haz_guid,
+               e.eng_name,
+               o.org_name
+        from obj_hidd h
+        left join att_eng_base e on h.eng_guid = e.guid
+        left join att_org_base o on h.org_guid = o.guid
     </sql>
     <select id="selectObjHiddByGuid" parameterType="String" resultMap="ObjHiddResult">
         <include refid="selectObjHiddVo"/>
-        where guid = #{guid}
+        where h.guid = #{guid}
     </select>
     <select id="selectObjHiddList" parameterType="com.goldenwater.slaj.hidd.domain.ObjHidd" resultMap="ObjHiddResult">
         <include refid="selectObjHiddVo"/>
         <where>
-            <if test="hiddName != null and hiddName != ''">AND hidd_name like '%' || #{hiddName} || '%'</if>
-            <if test="hiddGrad != null and hiddGrad != ''">AND hidd_grad = #{hiddGrad}</if>
-            <if test="hiddStat != null and hiddStat != ''">AND hidd_stat = #{hiddStat}</if>
-            <if test="orgGuid != null and orgGuid != ''">AND org_guid = #{orgGuid}</if>
-            <if test="guid != null and guid != ''">AND guid = #{guid}</if>
+            <if test="hiddName != null and hiddName != ''">AND h.hidd_name like concat('%', #{hiddName}, '%')</if>
+            <if test="hiddGrad != null and hiddGrad != ''">AND h.hidd_grad = #{hiddGrad}</if>
+            <if test="hiddStat != null and hiddStat != ''">AND h.hidd_stat = #{hiddStat}</if>
+            <if test="orgGuid != null and orgGuid != ''">AND h.org_guid = #{orgGuid}</if>
+            <if test="engGuid != null and engGuid != ''">AND h.eng_guid = #{engGuid}</if>
+            <if test="hazGuid != null and hazGuid != ''">AND h.haz_guid = #{hazGuid}</if>
+            <if test="guid != null and guid != ''">AND h.guid = #{guid}</if>
+            <if test="hiddSort != null and hiddSort != ''">AND h.hidd_sort = #{hiddSort}</if>
+            <if test="hiddSour != null and hiddSour != ''">AND h.hidd_sour = #{hiddSour}</if>
         </where>
     </select>
     <insert id="insertObjHidd" parameterType="com.goldenwater.slaj.hidd.domain.ObjHidd">
-        insert into obj_hidd (guid, hidd_name, eng_guid, tend_guid, se_guid, org_guid, hidd_sour, hidd_grad, hidd_clas, if_found, pro_part, part_long, part_lat, otlcol_qiff_fnvu, insp_rec_guid, se_check_item_guid, hidd_stat, hidd_merg_guid, rec_org_guid, note, coll_time, upd_time, rec_pers, hidds_guid, occu_num, sins_sche_guid, group_guid, temp, to_date, dict_guid)
-        values (#{guid}, #{hiddName}, #{engGuid}, #{tendGuid}, #{seGuid}, #{orgGuid}, #{hiddSour}, #{hiddGrad}, #{hiddClas}, #{ifFound}, #{proPart}, #{partLong}, #{partLat}, #{otlcolQiffFnvu}, #{inspRecGuid}, #{seCheckItemGuid}, #{hiddStat}, #{hiddMergGuid}, #{recOrgGuid}, #{note}, #{collTime}, #{updTime}, #{recPers}, #{hiddsGuid}, #{occuNum}, #{sinsScheGuid}, #{groupGuid}, #{temp}, #{toDate}, #{dictGuid})
+        insert into obj_hidd (guid, hidd_name, eng_guid, tend_guid, se_guid, org_guid, hidd_sour, hidd_grad, hidd_clas, if_found, pro_part, part_long, part_lat, otlcol_qiff_fnvu, insp_rec_guid, se_check_item_guid, hidd_stat, hidd_merg_guid, rec_org_guid, note, coll_time, upd_time, rec_pers, hidds_guid, occu_num, sins_sche_guid, group_guid, temp, to_date, dict_guid, hidd_sort, haz_guid)
+        values (#{guid}, #{hiddName}, #{engGuid}, #{tendGuid}, #{seGuid}, #{orgGuid}, #{hiddSour}, #{hiddGrad}, #{hiddClas}, #{ifFound}, #{proPart}, #{partLong}, #{partLat}, #{otlcolQiffFnvu}, #{inspRecGuid}, #{seCheckItemGuid}, #{hiddStat}, #{hiddMergGuid}, #{recOrgGuid}, #{note}, #{collTime}, #{updTime}, #{recPers}, #{hiddsGuid}, #{occuNum}, #{sinsScheGuid}, #{groupGuid}, #{temp}, #{toDate}, #{dictGuid}, #{hiddSort}, #{hazGuid})
     </insert>
     <update id="updateObjHidd" parameterType="com.goldenwater.slaj.hidd.domain.ObjHidd">
         update obj_hidd
@@ -87,6 +99,8 @@
             <if test="temp != null">temp = #{temp},</if>
             <if test="toDate != null">to_date = #{toDate},</if>
             <if test="dictGuid != null">dict_guid = #{dictGuid},</if>
+            <if test="hiddSort != null">hidd_sort = #{hiddSort},</if>
+            <if test="hazGuid != null">haz_guid = #{hazGuid},</if>
         </set>
         where guid = #{guid}
     </update>
@@ -103,10 +117,12 @@
     <select id="selectObjHiddListByName" parameterType="com.goldenwater.slaj.hidd.domain.ObjHidd" resultMap="ObjHiddResult">
         <include refid="selectObjHiddVo"/>
         <where>
-            <if test="hiddName != null and hiddName != ''">AND hidd_name like '%' || #{hiddName} || '%'</if>
+            <if test="hiddName != null and hiddName != ''">AND hidd_name like concat('%', #{hiddName}, '%')</if>
             <if test="hiddGrad != null and hiddGrad != ''">AND hidd_grad = #{hiddGrad}</if>
             <if test="hiddStat != null and hiddStat != ''">AND hidd_stat = #{hiddStat}</if>
             <if test="orgGuid != null and orgGuid != ''">AND org_guid = #{orgGuid}</if>
+            <if test="engGuid != null and engGuid != ''">AND eng_guid = #{engGuid}</if>
+            <if test="hiddSort != null and hiddSort != ''">AND hidd_sort = #{hiddSort}</if>
         </where>
         order by coll_time desc
     </select>
@@ -115,15 +131,16 @@
         <include refid="selectObjHiddVo"/>
         <where>
             <if test="orgGuid != null and orgGuid != ''">AND org_guid in (select guid from att_org_base where parent_org_guid = #{orgGuid})</if>
-            <if test="hiddName != null and hiddName != ''">AND hidd_name like '%' || #{hiddName} || '%'</if>
+            <if test="hiddName != null and hiddName != ''">AND hidd_name like concat('%', #{hiddName}, '%')</if>
             <if test="hiddGrad != null and hiddGrad != ''">AND hidd_grad = #{hiddGrad}</if>
             <if test="hiddStat != null and hiddStat != ''">AND hidd_stat = #{hiddStat}</if>
+            <if test="hiddSort != null and hiddSort != ''">AND hidd_sort = #{hiddSort}</if>
         </where>
         order by coll_time desc
     </select>
 
     <insert id="insertNextHidd" parameterType="com.goldenwater.slaj.hidd.domain.ObjHidd">
-        insert into obj_hidd (guid, hidd_name, eng_guid, tend_guid, se_guid, org_guid, hidd_sour, hidd_grad, hidd_clas, if_found, pro_part, part_long, part_lat, otlcol_qiff_fnvu, insp_rec_guid, se_check_item_guid, hidd_stat, hidd_merg_guid, rec_org_guid, note, coll_time, upd_time, rec_pers, hidds_guid, occu_num, sins_sche_guid, group_guid, temp, to_date, dict_guid)
-        values (#{guid}, #{hiddName}, #{engGuid}, #{tendGuid}, #{seGuid}, #{orgGuid}, #{hiddSour}, #{hiddGrad}, #{hiddClas}, #{ifFound}, #{proPart}, #{partLong}, #{partLat}, #{otlcolQiffFnvu}, #{inspRecGuid}, #{seCheckItemGuid}, #{hiddStat}, #{hiddMergGuid}, #{recOrgGuid}, #{note}, #{collTime}, #{updTime}, #{recPers}, #{hiddsGuid}, #{occuNum}, #{sinsScheGuid}, #{groupGuid}, #{temp}, #{toDate}, #{dictGuid})
+        insert into obj_hidd (guid, hidd_name, eng_guid, tend_guid, se_guid, org_guid, hidd_sour, hidd_grad, hidd_clas, if_found, pro_part, part_long, part_lat, otlcol_qiff_fnvu, insp_rec_guid, se_check_item_guid, hidd_stat, hidd_merg_guid, rec_org_guid, note, coll_time, upd_time, rec_pers, hidds_guid, occu_num, sins_sche_guid, group_guid, temp, to_date, dict_guid, hidd_sort, haz_guid)
+        values (#{guid}, #{hiddName}, #{engGuid}, #{tendGuid}, #{seGuid}, #{orgGuid}, #{hiddSour}, #{hiddGrad}, #{hiddClas}, #{ifFound}, #{proPart}, #{partLong}, #{partLat}, #{otlcolQiffFnvu}, #{inspRecGuid}, #{seCheckItemGuid}, #{hiddStat}, #{hiddMergGuid}, #{recOrgGuid}, #{note}, #{collTime}, #{updTime}, #{recPers}, #{hiddsGuid}, #{occuNum}, #{sinsScheGuid}, #{groupGuid}, #{temp}, #{toDate}, #{dictGuid}, #{hiddSort}, #{hazGuid})
     </insert>
 </mapper>

+ 149 - 0
gw-slaj/src/main/resources/mapper/slaj/hidd/TBusiHiddCountMapper.xml

@@ -18,6 +18,40 @@
         <result property="zdHidd" column="zd_hidd"/>
         <result property="zgZdHidd" column="zg_zd_hidd"/>
     </resultMap>
+    
+    <!-- VO类ResultMap(包含计算字段) -->
+    <resultMap type="com.goldenwater.slaj.hidd.domain.TBusiHiddCountVo" id="TBusiHiddCountVoResult">
+        <result property="guid" column="guid"/>
+        <result property="orgGuid" column="org_guid"/>
+        <result property="createTime" column="create_time"/>
+        <result property="pcl" column="pcl"/>
+        <result property="oengOrg" column="oeng_org"/>
+        <result property="hiddOrg" column="hidd_org"/>
+        <result property="engNum" column="eng_num"/>
+        <result property="hiddEng" column="hidd_eng"/>
+        <result property="hiddZgl" column="hidd_zgl"/>
+        <result property="ybZgl" column="yb_zgl"/>
+        <result property="ybHidd" column="yb_hidd"/>
+        <result property="zgYbHidd" column="zg_yb_hidd"/>
+        <result property="zdZgl" column="zd_zgl"/>
+        <result property="zdHidd" column="zd_hidd"/>
+        <result property="zgZdHidd" column="zg_zd_hidd"/>
+        <!-- 计算字段 -->
+        <result property="orgName" column="org_name"/>
+        <result property="totalHidd" column="total_hidd"/>
+        <result property="solvedHidd" column="solved_hidd"/>
+        <result property="solvingHidd" column="solving_hidd"/>
+        <result property="unsolvedHidd" column="unsolved_hidd"/>
+        <result property="solveRate" column="solve_rate"/>
+        <!-- 逾期统计字段 -->
+        <result property="zdSolvingHidd" column="zd_solving_hidd"/>
+        <result property="zdUnsolvedHidd" column="zd_unsolved_hidd"/>
+        <result property="zdOverTimeHidd" column="zd_overtime_hidd"/>
+        <result property="ybSolvingHidd" column="yb_solving_hidd"/>
+        <result property="ybUnsolvedHidd" column="yb_unsolved_hidd"/>
+        <result property="ybOverTimeHidd" column="yb_overtime_hidd"/>
+        <result property="overTimeHidd" column="overtime_hidd"/>
+    </resultMap>
     <sql id="selectTBusiHiddCountVo">
         select guid, org_guid, create_time, pcl, oeng_org, hidd_org, eng_num, hidd_eng,
                hidd_zgl, yb_zgl, yb_hidd, zg_yb_hidd, zd_zgl, zd_hidd, zg_zd_hidd
@@ -89,4 +123,119 @@
         </where>
         order by c.hidd_zgl desc
     </select>
+
+    <!-- 隐患统计列表查询(带计算字段) -->
+    <select id="selectTBusiHiddCountListWithCalc" parameterType="com.goldenwater.slaj.hidd.domain.TBusiHiddCountVo" resultMap="TBusiHiddCountVoResult">
+        select 
+            c.guid,
+            c.org_guid,
+            c.create_time,
+            c.pcl,
+            c.oeng_org,
+            c.hidd_org,
+            c.eng_num,
+            c.hidd_eng,
+            c.hidd_zgl,
+            c.yb_zgl,
+            c.yb_hidd,
+            c.zg_yb_hidd,
+            c.zd_zgl,
+            c.zd_hidd,
+            c.zg_zd_hidd,
+            org.org_name,
+            -- 计算字段
+            (coalesce(c.zd_hidd, 0) + coalesce(c.yb_hidd, 0)) as total_hidd,
+            (coalesce(c.zg_zd_hidd, 0) + coalesce(c.zg_yb_hidd, 0)) as solved_hidd,
+            case when (coalesce(c.zd_hidd, 0) + coalesce(c.yb_hidd, 0)) > 0 
+                then (coalesce(c.zd_hidd, 0) + coalesce(c.yb_hidd, 0)) - (coalesce(c.zg_zd_hidd, 0) + coalesce(c.zg_yb_hidd, 0))
+                else 0 end as unsolved_hidd,
+            c.hidd_zgl as solve_rate,
+            -- 重大隐患-整改中
+            case when coalesce(c.zd_hidd, 0) > coalesce(c.zg_zd_hidd, 0)
+                then coalesce(c.zd_hidd, 0) - coalesce(c.zg_zd_hidd, 0)
+                else 0 end as zd_solving_hidd,
+            -- 重大隐患-未整改(预留,暂为0)
+            0 as zd_unsolved_hidd,
+            -- 重大隐患-逾期未整改(预留,暂为0)
+            0 as zd_overtime_hidd,
+            -- 一般隐患-整改中
+            case when coalesce(c.yb_hidd, 0) > coalesce(c.zg_yb_hidd, 0)
+                then coalesce(c.yb_hidd, 0) - coalesce(c.zg_yb_hidd, 0)
+                else 0 end as yb_solving_hidd,
+            -- 一般隐患-未整改(预留,暂为0)
+            0 as yb_unsolved_hidd,
+            -- 一般隐患-逾期未整改(预留,暂为0)
+            0 as yb_overtime_hidd,
+            -- 逾期未整改总数
+            0 as overtime_hidd
+        from t_busi_hidd_count c
+        left join att_org_ext org on org.org_guid = c.org_guid
+        <where>
+            <if test="orgGuid != null and orgGuid != ''">AND c.org_guid = #{orgGuid}</if>
+            <if test="createTime != null and createTime != ''">AND c.create_time = #{createTime}</if>
+            <if test="orgName != null and orgName != ''">AND org.org_name like concat('%', #{orgName}, '%')</if>
+            <if test="unitType != null and unitType != ''">
+                AND c.org_guid in (
+                    select guid from att_org_base where wiun_code like concat(
+                        case #{unitType}
+                            when '1' then '%000000'
+                            when '2' then '%000'
+                            when '3' then '%0000'
+                        end
+                    )
+                )
+            </if>
+        </where>
+        order by c.create_time desc
+    </select>
+
+    <!-- 月度统计列表查询 -->
+    <select id="selectTBusiHiddCountMonListWithCalc" parameterType="com.goldenwater.slaj.hidd.domain.TBusiHiddCountMonVo" resultType="com.goldenwater.slaj.hidd.domain.TBusiHiddCountMon">
+        select 
+            m.guid,
+            m.org_guid,
+            m.create_time,
+            m.year,
+            m.mon,
+            m.pcl,
+            m.oeng_org,
+            m.hidd_org,
+            m.eng_num,
+            m.hidd_eng,
+            m.hidd_zgl,
+            m.yb_zgl,
+            m.yb_hidd,
+            m.zg_yb_hidd,
+            m.zd_zgl,
+            m.zd_hidd,
+            m.zg_zd_hidd,
+            org.org_name,
+            -- 计算字段
+            (coalesce(m.zd_hidd, 0) + coalesce(m.yb_hidd, 0)) as totalHidd,
+            (coalesce(m.zg_zd_hidd, 0) + coalesce(m.zg_yb_hidd, 0)) as solvedHidd,
+            case when (coalesce(m.zd_hidd, 0) + coalesce(m.yb_hidd, 0)) > 0 
+                then (coalesce(m.zd_hidd, 0) + coalesce(m.yb_hidd, 0)) - (coalesce(m.zg_zd_hidd, 0) + coalesce(m.zg_yb_hidd, 0))
+                else 0 end as unsolvedHidd,
+            m.hidd_zgl as solveRate
+        from t_busi_hidd_count_mon m
+        left join att_org_ext org on org.org_guid = m.org_guid
+        <where>
+            <if test="orgGuid != null and orgGuid != ''">AND m.org_guid = #{orgGuid}</if>
+            <if test="year != null and year != ''">AND m.year = #{year}</if>
+            <if test="mon != null and mon != ''">AND m.mon = #{mon}</if>
+            <if test="orgName != null and orgName != ''">AND org.org_name like concat('%', #{orgName}, '%')</if>
+            <if test="unitType != null and unitType != ''">
+                AND m.org_guid in (
+                    select guid from att_org_base where wiun_code like concat(
+                        case #{unitType}
+                            when '1' then '%000000'
+                            when '2' then '%000'
+                            when '3' then '%0000'
+                        end
+                    )
+                )
+            </if>
+        </where>
+        order by m.year desc, m.mon desc
+    </select>
 </mapper>

+ 98 - 0
gw-slaj/src/main/resources/mapper/slaj/hidd/TBusiHiddCountMonMapper.xml

@@ -20,6 +20,42 @@
         <result property="zdHidd" column="zd_hidd"/>
         <result property="zgZdHidd" column="zg_zd_hidd"/>
     </resultMap>
+    
+    <!-- VO类ResultMap(包含计算字段) -->
+    <resultMap type="com.goldenwater.slaj.hidd.domain.TBusiHiddCountMonVo" id="TBusiHiddCountMonVoResult">
+        <result property="guid" column="guid"/>
+        <result property="orgGuid" column="org_guid"/>
+        <result property="createTime" column="create_time"/>
+        <result property="year" column="year"/>
+        <result property="mon" column="mon"/>
+        <result property="pcl" column="pcl"/>
+        <result property="oengOrg" column="oeng_org"/>
+        <result property="hiddOrg" column="hidd_org"/>
+        <result property="engNum" column="eng_num"/>
+        <result property="hiddEng" column="hidd_eng"/>
+        <result property="hiddZgl" column="hidd_zgl"/>
+        <result property="ybZgl" column="yb_zgl"/>
+        <result property="ybHidd" column="yb_hidd"/>
+        <result property="zgYbHidd" column="zg_yb_hidd"/>
+        <result property="zdZgl" column="zd_zgl"/>
+        <result property="zdHidd" column="zd_hidd"/>
+        <result property="zgZdHidd" column="zg_zd_hidd"/>
+        <!-- 计算字段 -->
+        <result property="orgName" column="org_name"/>
+        <result property="totalHidd" column="total_hidd"/>
+        <result property="solvedHidd" column="solved_hidd"/>
+        <result property="solvingHidd" column="solving_hidd"/>
+        <result property="unsolvedHidd" column="unsolved_hidd"/>
+        <result property="solveRate" column="solve_rate"/>
+        <!-- 逾期统计字段 -->
+        <result property="zdSolvingHidd" column="zd_solving_hidd"/>
+        <result property="zdUnsolvedHidd" column="zd_unsolved_hidd"/>
+        <result property="zdOverTimeHidd" column="zd_overtime_hidd"/>
+        <result property="ybSolvingHidd" column="yb_solving_hidd"/>
+        <result property="ybUnsolvedHidd" column="yb_unsolved_hidd"/>
+        <result property="ybOverTimeHidd" column="yb_overtime_hidd"/>
+        <result property="overTimeHidd" column="overtime_hidd"/>
+    </resultMap>
     <sql id="selectTBusiHiddCountMonVo">
         select guid, org_guid, create_time, year, mon, pcl, oeng_org, hidd_org, eng_num, hidd_eng,
                hidd_zgl, yb_zgl, yb_hidd, zg_yb_hidd, zd_zgl, zd_hidd, zg_zd_hidd
@@ -73,4 +109,66 @@
             #{guid}
         </foreach>
     </delete>
+
+    <!-- 月度统计列表查询(带计算字段) -->
+    <select id="selectTBusiHiddCountMonListWithCalc" parameterType="com.goldenwater.slaj.hidd.domain.TBusiHiddCountMonVo" resultMap="TBusiHiddCountMonVoResult">
+        select 
+            m.guid,
+            m.org_guid,
+            m.create_time,
+            m.year,
+            m.mon,
+            m.pcl,
+            m.oeng_org,
+            m.hidd_org,
+            m.eng_num,
+            m.hidd_eng,
+            m.hidd_zgl,
+            m.yb_zgl,
+            m.yb_hidd,
+            m.zg_yb_hidd,
+            m.zd_zgl,
+            m.zd_hidd,
+            m.zg_zd_hidd,
+            org.org_name,
+            -- 计算字段
+            (coalesce(m.zd_hidd, 0) + coalesce(m.yb_hidd, 0)) as total_hidd,
+            (coalesce(m.zg_zd_hidd, 0) + coalesce(m.zg_yb_hidd, 0)) as solved_hidd,
+            case when (coalesce(m.zd_hidd, 0) + coalesce(m.yb_hidd, 0)) > 0 
+                then (coalesce(m.zd_hidd, 0) + coalesce(m.yb_hidd, 0)) - (coalesce(m.zg_zd_hidd, 0) + coalesce(m.zg_yb_hidd, 0))
+                else 0 end as unsolved_hidd,
+            m.hidd_zgl as solve_rate,
+            -- 逾期统计字段
+            case when coalesce(m.zd_hidd, 0) > coalesce(m.zg_zd_hidd, 0)
+                then coalesce(m.zd_hidd, 0) - coalesce(m.zg_zd_hidd, 0)
+                else 0 end as zd_solving_hidd,
+            0 as zd_unsolved_hidd,
+            0 as zd_overtime_hidd,
+            case when coalesce(m.yb_hidd, 0) > coalesce(m.zg_yb_hidd, 0)
+                then coalesce(m.yb_hidd, 0) - coalesce(m.zg_yb_hidd, 0)
+                else 0 end as yb_solving_hidd,
+            0 as yb_unsolved_hidd,
+            0 as yb_overtime_hidd,
+            0 as overtime_hidd
+        from t_busi_hidd_count_mon m
+        left join att_org_ext org on org.org_guid = m.org_guid
+        <where>
+            <if test="orgGuid != null and orgGuid != ''">AND m.org_guid = #{orgGuid}</if>
+            <if test="year != null and year != ''">AND m.year = #{year}</if>
+            <if test="mon != null and mon != ''">AND m.mon = #{mon}</if>
+            <if test="orgName != null and orgName != ''">AND org.org_name like concat('%', #{orgName}, '%')</if>
+            <if test="unitType != null and unitType != ''">
+                AND m.org_guid in (
+                    select guid from att_org_base where wiun_code like concat(
+                        case #{unitType}
+                            when '1' then '%000000'
+                            when '2' then '%000'
+                            when '3' then '%0000'
+                        end
+                    )
+                )
+            </if>
+        </where>
+        order by m.year desc, m.mon desc
+    </select>
 </mapper>

+ 26 - 0
gw-ui/src/api/slaj/hidd.js

@@ -318,6 +318,14 @@ export function writeOffBisMajHiddSup(data) {
   })
 }
 
+// 撤销隐患督办
+export function cancelBisMajHiddSup(guid) {
+  return request({
+    url: '/hidd/majhiddsup/cancel/' + guid,
+    method: 'delete'
+  })
+}
+
 // 查询重大隐患核实列表
 export function listBisHiddMajVeri(query) {
   return request({
@@ -920,4 +928,22 @@ export function approveRevoke(guid, approved, opinion) {
   })
 }
 
+// 月报批量解锁
+export function batchUnlock(guids) {
+  return request({
+    url: '/hidd/monrepperi/batchUnlock',
+    method: 'put',
+    params: { guids: guids }
+  })
+}
+
+// 督促上报
+export function urgeReport(orgGuids, repName) {
+  return request({
+    url: '/hidd/monrepperi/urge',
+    method: 'post',
+    params: { orgGuids: orgGuids, repName: repName }
+  })
+}
+
 

+ 31 - 1
gw-ui/src/assets/styles/goldenwater.scss

@@ -112,10 +112,40 @@
 .pagination-container {
   display: flex;
   justify-content: flex-end;
-  margin-top: 20px;
+  margin-top: 16px;
+  flex-shrink: 0;
   background-color: transparent !important;
 }
 
+/* 嵌套布局的容器(tabs/col 内部),与 .app-container 保持一致的分页间距 */
+.table-page-wrap {
+  overflow: hidden;
+  padding-bottom: 16px;
+}
+
+/* 紧凑搜索表单 —— 让条件+搜索按钮尽量在同一行 */
+.app-container .el-form--inline {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  gap: 0 16px;
+
+  .el-form-item {
+    margin-bottom: 10px;
+    margin-right: 0;
+  }
+
+  .el-form-item__label {
+    padding-right: 4px;
+    white-space: nowrap;
+  }
+
+  /* 搜索/重置按钮组不换行 */
+  .el-form-item:last-child {
+    flex-shrink: 0;
+  }
+}
+
 /* 弹窗中的分页器 */
 .el-dialog .pagination-container {
   position: static !important;

+ 1 - 1
gw-ui/src/assets/styles/index.scss

@@ -124,7 +124,7 @@ aside {
 .app-container {
   padding: 20px;
   height: 100%;
-  overflow: hidden;
+  overflow-y: auto;
 }
 
 .components-container {

+ 1 - 194
gw-ui/src/components/RightToolbar/index.vue

@@ -1,46 +1,12 @@
 <template>
   <div class="top-right-btn" :style="style">
     <el-row>
-      <el-tooltip class="item" effect="dark" :content="showSearch ? '隐藏搜索' : '显示搜索'" placement="top" v-if="search">
-        <el-button circle icon="Search" @click="toggleSearch()" />
-      </el-tooltip>
-      <el-tooltip class="item" effect="dark" content="刷新" placement="top">
-        <el-button circle icon="Refresh" @click="refresh()" />
-      </el-tooltip>
-      <el-tooltip class="item" effect="dark" content="显隐列" placement="top" v-if="Object.keys(columns).length > 0">
-        <el-button circle icon="Menu" @click="showColumn()" v-if="showColumnsType == 'transfer'"/>
-        <el-dropdown trigger="click" :hide-on-click="false" style="padding-left: 12px" v-if="showColumnsType == 'checkbox'">
-          <el-button circle icon="Menu" />
-          <template #dropdown>
-            <el-dropdown-menu>
-              <!-- 全选/反选 按钮 -->
-              <el-dropdown-item>
-                <el-checkbox :indeterminate="isIndeterminate" v-model="isChecked" @change="toggleCheckAll"> 列展示 </el-checkbox>
-              </el-dropdown-item>
-              <div class="check-line"></div>
-              <template v-for="(item, key) in columns" :key="item.key">
-                <el-dropdown-item>
-                  <el-checkbox v-model="item.visible" @change="checkboxChange($event, key)" :label="item.label" />
-                </el-dropdown-item>
-              </template>
-            </el-dropdown-menu>
-          </template>
-        </el-dropdown>
-      </el-tooltip>
+      <!-- 隐藏搜索 / 刷新 / 显隐列 已移除 -->
     </el-row>
-    <el-dialog :title="title" v-model="open" append-to-body>
-      <el-transfer
-        :titles="['显示', '隐藏']"
-        v-model="value"
-        :data="transferData"
-        @change="dataChange"
-      ></el-transfer>
-    </el-dialog>
   </div>
 </template>
 
 <script setup>
-import cache from '@/plugins/cache'
 
 const props = defineProps({
   /* 是否显示检索条件 */
@@ -77,13 +43,6 @@ const props = defineProps({
 
 const emits = defineEmits(['update:showSearch', 'queryTable'])
 
-// 显隐数据
-const value = ref([])
-// 弹出层标题
-const title = ref("显示/隐藏")
-// 是否显示弹出层
-const open = ref(false)
-
 const style = computed(() => {
   const ret = {}
   if (props.gutter) {
@@ -91,159 +50,7 @@ const style = computed(() => {
   }
   return ret
 })
-
-// 是否全选/半选 状态
-const isChecked = computed({
-  get: () => Array.isArray(props.columns) ? props.columns.every(col => col.visible) : Object.values(props.columns).every((col) => col.visible),
-  set: () => {}
-})
-const isIndeterminate = computed(() => Array.isArray(props.columns) ? props.columns.some((col) => col.visible) && !isChecked.value : Object.values(props.columns).some((col) => col.visible) && !isChecked.value)
-const transferData = computed(() => Array.isArray(props.columns) ? props.columns.map((item, index) => ({ key: index, label: item.label })) : Object.keys(props.columns).map((key, index) => ({ key: index, label: props.columns[key].label })))
-
-// 搜索
-const { proxy } = getCurrentInstance()
-function toggleSearch() {
-  let el = proxy.$el
-  let formEl = null
-  while ((el = el.parentElement) && el !== document.body) {
-    if ((formEl = el.querySelector('.el-form'))) break
-  }
-  if (!formEl) return emits('update:showSearch', !props.showSearch)
-  animateSearch(formEl, props.showSearch)
-}
-function animateSearch(el, isHide) {
-  const DURATION = 260
-  const TRANSITION = 'max-height 0.25s ease, opacity 0.2s ease'
-  const clear = () => Object.assign(el.style, { transition: '', maxHeight: '', opacity: '', overflow: '' })
-  Object.assign(el.style, { overflow: 'hidden', transition: '' })
-  if (isHide) {
-    Object.assign(el.style, { maxHeight: el.scrollHeight + 'px', opacity: '1', transition: TRANSITION })
-    requestAnimationFrame(() => Object.assign(el.style, { maxHeight: '0', opacity: '0' }))
-    setTimeout(() => { emits('update:showSearch', false); clear() }, DURATION)
-  } else {
-    emits('update:showSearch', true)
-    nextTick(() => {
-      Object.assign(el.style, { maxHeight: '0', opacity: '0' })
-      requestAnimationFrame(() => requestAnimationFrame(() => {
-        Object.assign(el.style, { transition: TRANSITION, maxHeight: el.scrollHeight + 'px', opacity: '1' })
-      }))
-      setTimeout(clear, DURATION)
-    })
-  }
-}
-
-// 刷新
-function refresh() {
-  emits("queryTable")
-}
-
-// 右侧列表元素变化
-function dataChange(data) {
-  if (Array.isArray(props.columns)) {
-    for (let item in props.columns) {
-      const key = props.columns[item].key
-      props.columns[item].visible = !data.includes(key)
-    }
-  } else {
-    Object.keys(props.columns).forEach((key, index) => {
-      props.columns[key].visible = !data.includes(index)
-    })
-  }
-  saveStorage()
-}
-
-// 打开显隐列dialog
-function showColumn() {
-  open.value = true
-}
-
-// 如果传入了 storageKey,从 localStorage 恢复列显隐状态
-if (props.storageKey) {
-  try {
-    const saved = cache.local.getJSON(props.storageKey)
-    if (saved && typeof saved === 'object') {
-      if (Array.isArray(props.columns)) {
-        props.columns.forEach((col, index) => {
-          if (saved[index] !== undefined) col.visible = saved[index]
-        })
-      } else {
-        Object.keys(props.columns).forEach(key => {
-          if (saved[key] !== undefined) props.columns[key].visible = saved[key]
-        })
-      }
-    }
-  } catch (e) {}
-}
-if (props.showColumnsType == "transfer") {
-  // transfer穿梭显隐列初始默认隐藏列
-  if (Array.isArray(props.columns)) {
-    for (let item in props.columns) {
-      if (props.columns[item].visible === false) {
-        value.value.push(parseInt(item))
-      }
-    }
-  } else {
-    Object.keys(props.columns).forEach((key, index) => {
-      if (props.columns[key].visible === false) {
-        value.value.push(index)
-      }
-    })
-  }
-}
-
-// 单勾选
-function checkboxChange(event, key) {
-  if (Array.isArray(props.columns)) {
-    props.columns.filter(item => item.key == key)[0].visible = event
-  } else {
-    props.columns[key].visible = event
-  }
-  saveStorage()
-}
-
-// 切换全选/反选
-function toggleCheckAll() {
-  const newValue = !isChecked.value
-  if (Array.isArray(props.columns)) {
-    props.columns.forEach((col) => (col.visible = newValue))
-  } else {
-    Object.values(props.columns).forEach((col) => (col.visible = newValue))
-  }
-  saveStorage()
-}
-
-// 将当前列显隐状态持久化到 localStorage
-function saveStorage() {
-  if (!props.storageKey) return
-  try {
-    let state = {}
-    if (Array.isArray(props.columns)) {
-      props.columns.forEach((col, index) => { state[index] = col.visible })
-    } else {
-      Object.keys(props.columns).forEach(key => { state[key] = props.columns[key].visible })
-    }
-    cache.local.setJSON(props.storageKey, state)
-  } catch (e) {}
-}
 </script>
 
 <style lang='scss' scoped>
-:deep(.el-transfer__button) {
-  border-radius: 50%;
-  display: block;
-  margin-left: 0px;
-}
-:deep(.el-transfer__button:first-child) {
-  margin-bottom: 10px;
-}
-:deep(.el-dropdown-menu__item) {
-  line-height: 30px;
-  padding: 0 17px;
-}
-.check-line {
-  width: 90%;
-  height: 1px;
-  background-color: #ccc;
-  margin: 3px auto;
-}
 </style>

+ 97 - 0
gw-ui/src/hooks/useTableHeight.js

@@ -0,0 +1,97 @@
+import { ref, onMounted, onUnmounted } from 'vue'
+
+/**
+ * 表格自适应容器剩余高度。
+ * - 用 getBoundingClientRect + innerHeight 计算可用高度(不依赖 CSS 高度级联)
+ * - 组件挂载后持续重试 5 秒,覆盖异步数据加载后分页出现的情况
+ */
+export function useTableHeight() {
+  const tableHeight = ref(200)
+  const containerRef = ref(null)
+  let observer = null
+  let timer = null
+
+  const getMarginHeight = (el) => {
+    if (!el) return 0
+    const oh = el.offsetHeight
+    if (oh === 0) {
+      // v-show 隐藏的元素,offsetHeight=0,无法取到高度
+      // 返回 0 由调用方决定是否需要预留空间
+      return 0
+    }
+    const style = window.getComputedStyle(el)
+    return oh
+      + (parseFloat(style.marginTop) || 0)
+      + (parseFloat(style.marginBottom) || 0)
+  }
+
+  const calcHeight = () => {
+    if (!containerRef.value) return false
+    const container = containerRef.value
+    const rect = container.getBoundingClientRect()
+    // 可用高度 = 视口高度 - 容器到视口顶部的距离
+    const ch = window.innerHeight - rect.top
+    if (ch <= 0) return false
+
+    let used = 0
+    const cs = window.getComputedStyle(container)
+    used += parseFloat(cs.paddingTop) || 0
+    used += parseFloat(cs.paddingBottom) || 0
+
+    let hasHiddenPagination = false
+
+    for (const child of container.children) {
+      if (child.classList?.contains('table-wrapper')) continue
+      if (child.classList?.contains('el-dialog')) continue
+      const h = getMarginHeight(child)
+      used += h
+      // 检测是否有隐藏的分页组件(v-show="total > 0" 时 total 初始为 0)
+      if (h === 0 && child.classList?.contains('pagination-container')) {
+        hasHiddenPagination = true
+      }
+    }
+
+    // 如果检测到隐藏的分页,预留约 50px 空间(分页高度 + margin-top)
+    // 这样即使分页稍后出现,也不会把内容挤出 overflow:hidden
+    if (hasHiddenPagination) {
+      used += 50
+    }
+
+    const h = ch - used
+    if (h > 200) {
+      tableHeight.value = h
+      return true
+    }
+    return false
+  }
+
+  onMounted(() => {
+    // 立即计算一次
+    requestAnimationFrame(() => calcHeight())
+
+    // 持续重试 5 秒,覆盖异步数据加载后分页出现的情况
+    let retry = 0
+    if (timer) clearInterval(timer)
+    timer = setInterval(() => {
+      calcHeight()
+      if (++retry >= 25) {
+        clearInterval(timer)
+        timer = null
+      }
+    }, 200)
+
+    window.addEventListener('resize', calcHeight)
+    if (containerRef.value && window.ResizeObserver) {
+      observer = new ResizeObserver(calcHeight)
+      observer.observe(containerRef.value)
+    }
+  })
+
+  onUnmounted(() => {
+    window.removeEventListener('resize', calcHeight)
+    if (timer) { clearInterval(timer); timer = null }
+    if (observer) { observer.disconnect(); observer = null }
+  })
+
+  return { tableHeight, containerRef, updateHeight: calcHeight }
+}

+ 9 - 3
gw-ui/src/layout/components/AppMain.vue

@@ -41,13 +41,18 @@ function addIframe() {
 
 <style lang="scss" scoped>
 .app-main {
-  /* 50= navbar  50  */
-  min-height: calc(100vh - 60px);
+  height: calc(100vh - 60px);
+  min-height: 0;
   width: 100%;
   position: relative;
   overflow: hidden;
 }
 
+.app-main > * {
+  height: 100%;
+  min-height: 0;
+}
+
 .fixed-header + .app-main {
   overflow-y: auto;
   scrollbar-gutter: auto;
@@ -66,7 +71,8 @@ function addIframe() {
 .hasTagsView {
   .app-main {
     /* 84 = navbar + tags-view = 50 + 34 */
-    min-height: calc(100vh - 84px);
+    height: calc(100vh - 84px);
+    min-height: 0;
   }
 
   .fixed-header + .app-main {

+ 7 - 2
gw-ui/src/views/monitor/job/index.vue

@@ -1,5 +1,5 @@
 <template>
-   <div class="app-container">
+   <div ref="containerRef" class="app-container">
       <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
          <el-form-item label="任务名称" prop="jobName">
             <el-input
@@ -87,7 +87,8 @@
          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
       </el-row>
 
-      <el-table v-loading="loading" :data="jobList" @selection-change="handleSelectionChange">
+      <div class="table-wrapper">
+      <el-table :height="tableHeight" v-loading="loading" :data="jobList" @selection-change="handleSelectionChange">
          <el-table-column type="selection" width="55" align="center" />
          <el-table-column label="任务编号" width="100" align="center" prop="jobId" />
          <el-table-column label="任务名称" align="center" :show-overflow-tooltip="true">
@@ -129,6 +130,7 @@
             </template>
          </el-table-column>
       </el-table>
+      </div>
 
       <pagination
          v-show="total > 0"
@@ -240,9 +242,12 @@
 
 <script setup name="Job">
 import Crontab from '@/components/Crontab'
+import { useTableHeight } from '@/hooks/useTableHeight'
 import JobDetail from './detail'
 import { listJob, getJob, delJob, addJob, updateJob, runJob, changeJobStatus } from "@/api/monitor/job"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const router = useRouter()
 const { proxy } = getCurrentInstance()
 const { sys_job_group, sys_job_status } = proxy.useDict("sys_job_group", "sys_job_status")

+ 7 - 2
gw-ui/src/views/monitor/job/log.vue

@@ -1,5 +1,5 @@
 <template>
-   <div class="app-container">
+   <div ref="containerRef" class="app-container">
       <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
          <el-form-item label="任务名称" prop="jobName">
             <el-input
@@ -96,7 +96,8 @@
          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
       </el-row>
 
-      <el-table v-loading="loading" :data="jobLogList" @selection-change="handleSelectionChange">
+      <div class="table-wrapper">
+      <el-table :height="tableHeight" v-loading="loading" :data="jobLogList" @selection-change="handleSelectionChange">
          <el-table-column type="selection" width="55" align="center" />
          <el-table-column label="日志编号" width="80" align="center" prop="jobLogId" />
          <el-table-column label="任务名称" align="center" prop="jobName" :show-overflow-tooltip="true" />
@@ -123,6 +124,7 @@
             </template>
          </el-table-column>
       </el-table>
+      </div>
 
       <pagination
          v-show="total > 0"
@@ -139,9 +141,12 @@
 
 <script setup name="JobLog">
 import JobDetail from './detail'
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { getJob } from "@/api/monitor/job"
 import { listJobLog, delJobLog, cleanJobLog } from "@/api/monitor/jobLog"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { sys_common_status, sys_job_group } = proxy.useDict("sys_common_status", "sys_job_group")
 

+ 7 - 2
gw-ui/src/views/monitor/logininfor/index.vue

@@ -1,5 +1,5 @@
 <template>
-   <div class="app-container">
+   <div ref="containerRef" class="app-container">
       <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
          <el-form-item label="登录地址" prop="ipaddr">
             <el-input
@@ -93,7 +93,8 @@
          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
       </el-row>
 
-      <el-table ref="logininforRef" v-loading="loading" :data="logininforList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange">
+      <div class="table-wrapper">
+      <el-table :height="tableHeight" ref="logininforRef" v-loading="loading" :data="logininforList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange">
          <el-table-column type="selection" width="55" align="center" />
          <el-table-column label="访问编号" align="center" prop="infoId" />
          <el-table-column label="用户名称" align="center" prop="userName" :show-overflow-tooltip="true" sortable="custom" :sort-orders="['descending', 'ascending']" />
@@ -113,6 +114,7 @@
             </template>
          </el-table-column>
       </el-table>
+      </div>
 
       <pagination
          v-show="total > 0"
@@ -126,6 +128,9 @@
 
 <script setup name="Logininfor">
 import { list, delLogininfor, cleanLogininfor, unlockLogininfor } from "@/api/monitor/logininfor"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { sys_common_status } = proxy.useDict("sys_common_status")

+ 7 - 2
gw-ui/src/views/monitor/online/index.vue

@@ -1,5 +1,5 @@
 <template>
-   <div class="app-container">
+   <div ref="containerRef" class="app-container">
       <el-form :model="queryParams" ref="queryRef" :inline="true">
          <el-form-item label="登录地址" prop="ipaddr">
             <el-input
@@ -24,7 +24,8 @@
             <el-button icon="Refresh" @click="resetQuery">重置</el-button>
          </el-form-item>
       </el-form>
-      <el-table
+      <div class="table-wrapper">
+      <el-table :height="tableHeight"
          v-loading="loading"
          :data="onlineList.slice((pageNum - 1) * pageSize, pageNum * pageSize)"
          style="width: 100%;"
@@ -52,6 +53,7 @@
             </template>
          </el-table-column>
       </el-table>
+      </div>
 
       <pagination v-show="total > 0" :total="total" v-model:page="pageNum" v-model:limit="pageSize" />
    </div>
@@ -59,6 +61,9 @@
 
 <script setup name="Online">
 import { forceLogout, list as initData } from "@/api/monitor/online"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 

+ 7 - 2
gw-ui/src/views/monitor/operlog/index.vue

@@ -1,5 +1,5 @@
 <template>
-   <div class="app-container">
+   <div ref="containerRef" class="app-container">
       <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
          <el-form-item label="操作地址" prop="operIp">
             <el-input
@@ -107,7 +107,8 @@
          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
       </el-row>
 
-      <el-table ref="operlogRef" v-loading="loading" :data="operlogList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange">
+      <div class="table-wrapper">
+      <el-table :height="tableHeight" ref="operlogRef" v-loading="loading" :data="operlogList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="handleSortChange">
          <el-table-column type="selection" width="50" align="center" />
          <el-table-column label="日志编号" align="center" prop="operId" />
          <el-table-column label="系统模块" align="center" prop="title" :show-overflow-tooltip="true" />
@@ -139,6 +140,7 @@
             </template>
          </el-table-column>
       </el-table>
+      </div>
 
       <pagination
          v-show="total > 0"
@@ -154,8 +156,11 @@
 
 <script setup name="Operlog">
 import OperlogDetail from './detail'
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { list, delOperlog, cleanOperlog } from "@/api/monitor/operlog"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { sys_oper_type, sys_common_status } = proxy.useDict("sys_oper_type", "sys_common_status")
 

+ 7 - 2
gw-ui/src/views/slaj/acci/analizeDetail.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-breadcrumb separator="/">
       <el-breadcrumb-item :to="{ path: '/slaj/acci/stat' }">事故统计</el-breadcrumb-item>
       <el-breadcrumb-item>统计明细</el-breadcrumb-item>
@@ -21,7 +21,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="acci-analize-detail"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="objAcciList" @row-click="handleRowClick">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="objAcciList" @row-click="handleRowClick">
       <el-table-column label="事故名称" align="center" prop="acciName" v-if="columns.acciName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="事故等级" align="center" prop="acciGrad" v-if="columns.acciGrad.visible">
         <template #default="scope">
@@ -47,6 +48,7 @@
       </el-table-column>
       <el-table-column label="经济损失(万元)" align="center" prop="econLoss" v-if="columns.econLoss.visible" width="130" />
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
   </div>
@@ -54,9 +56,12 @@
 
 <script setup name="AnalizeDetail">
 import { useRoute, useRouter } from 'vue-router'
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { computed } from 'vue'
 import { listObjAcci } from "@/api/slaj/acci"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const route = useRoute()
 const router = useRouter()

+ 8 - 1
gw-ui/src/views/slaj/acci/assess.vue

@@ -2,6 +2,7 @@
   <div class="app-container">
     <el-tabs v-model="activeTab">
       <el-tab-pane label="考核配置" name="config">
+        <div ref="containerRef" class="table-page-wrap">
         <el-row :gutter="10" class="mb8">
           <el-col :span="1.5">
             <el-button type="primary" plain icon="Plus" @click="handleAdd">新增</el-button>
@@ -14,7 +15,8 @@
           </el-col>
         </el-row>
 
-        <el-table v-loading="loading" :data="assessList" @selection-change="handleSelectionChange" stripe>
+        <div class="table-wrapper">
+        <el-table :height="tableHeight" v-loading="loading" :data="assessList" @selection-change="handleSelectionChange" stripe>
           <el-table-column type="selection" width="55" align="center" />
           <el-table-column label="考核项目" align="center" prop="assessItem" :show-overflow-tooltip="true" />
           <el-table-column label="考核标准" align="center" prop="assessStd" :show-overflow-tooltip="true" />
@@ -32,8 +34,10 @@
             </template>
           </el-table-column>
         </el-table>
+        </div>
 
         <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+        </div>
       </el-tab-pane>
 
       <el-tab-pane label="考核评分" name="score">
@@ -105,8 +109,11 @@
 
 <script setup name="AcciAssess">
 import { getCurrentInstance, onMounted, reactive, ref, toRefs } from 'vue'
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listBisAcciAssess, getBisAcciAssess, addBisAcciAssess, updateBisAcciAssess, delBisAcciAssess } from "@/api/slaj/acci"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { sys_normal_disable } = proxy.useDict("sys_normal_disable")
 

+ 8 - 1
gw-ui/src/views/slaj/acci/fastRep.vue

@@ -25,6 +25,7 @@
       </el-tab-pane>
 
       <el-tab-pane label="补报记录" name="rec">
+        <div ref="containerRef" class="table-page-wrap">
         <el-form ref="queryRef" :model="queryParams" :inline="true" class="mb8">
           <el-form-item>
             <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -32,14 +33,17 @@
           </el-form-item>
         </el-form>
 
-        <el-table v-loading="loading" :data="repList" stripe>
+        <div class="table-wrapper">
+        <el-table :height="tableHeight" v-loading="loading" :data="repList" stripe>
           <el-table-column label="补报时间" align="center" prop="repTime" width="180" />
           <el-table-column label="关联事故" align="center" prop="acciName" :show-overflow-tooltip="true" />
           <el-table-column label="补报内容" align="center" prop="repCont" :show-overflow-tooltip="true" />
           <el-table-column label="记录人" align="center" prop="createBy" width="120" />
         </el-table>
+        </div>
 
         <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+        </div>
       </el-tab-pane>
     </el-tabs>
   </div>
@@ -47,8 +51,11 @@
 
 <script setup name="AcciFastRep">
 import { getCurrentInstance, onMounted, reactive, ref, toRefs } from 'vue'
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listObjAcci, listBisAcciExpRep, insertRepBisAcciExpRep } from "@/api/slaj/acci"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 
 const activeTab = ref('reg')

+ 14 - 9
gw-ui/src/views/slaj/acci/index.vue

@@ -1,33 +1,33 @@
 <template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+  <div ref="containerRef" class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="auto">
       <el-form-item label="事故名称" prop="acciName">
-        <el-input v-model="queryParams.acciName" placeholder="请输入事故名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
+        <el-input v-model="queryParams.acciName" placeholder="请输入事故名称" clearable style="width: 160px" @keyup.enter="handleQuery" />
       </el-form-item>
       <el-form-item label="事故等级" prop="acciGrad">
-        <el-select v-model="queryParams.acciGrad" placeholder="请选择事故等级" clearable style="width: 240px">
+        <el-select v-model="queryParams.acciGrad" placeholder="请选择事故等级" clearable style="width: 130px">
           <el-option v-for="dict in acci_grad" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="事故类别" prop="acciCate">
-        <el-select v-model="queryParams.acciCate" placeholder="请选择事故类别" clearable style="width: 240px">
+        <el-select v-model="queryParams.acciCate" placeholder="请选择事故类别" clearable style="width: 130px">
           <el-option v-for="dict in acci_cate" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="报告状态" prop="repStat">
-        <el-select v-model="queryParams.repStat" placeholder="请选择报告状态" clearable style="width: 240px">
+        <el-select v-model="queryParams.repStat" placeholder="请选择报告状态" clearable style="width: 130px">
           <el-option v-for="dict in rep_stat" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
       <!-- 业务说明: 查询范围 dataFrom 控制事故数据的所属维度。1=直属单位(本级直接管辖),2=下级水行政(下级水利部门),3=流域机构(流域管理范围) -->
       <el-form-item label="查询范围" prop="dataFrom">
-        <el-select v-model="queryParams.dataFrom" placeholder="查询范围" clearable style="width: 240px">
+        <el-select v-model="queryParams.dataFrom" placeholder="查询范围" clearable style="width: 130px">
           <el-option label="直属单位" value="1" />
           <el-option label="下级水行政" value="2" />
           <el-option label="流域机构" value="3" />
         </el-select>
       </el-form-item>
-      <el-form-item label="发生时间" style="width: 308px">
+      <el-form-item label="发生时间">
         <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
       </el-form-item>
       <el-form-item>
@@ -60,7 +60,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="acci-objacci-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="objAcciList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="objAcciList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="事故名称" align="center" prop="acciName" v-if="columns.acciName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="事故等级" align="center" prop="acciGrad" v-if="columns.acciGrad.visible">
@@ -103,6 +104,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -200,6 +202,9 @@
 
 <script setup name="ObjAcci">
 import { listObjAcci, getObjAcci, delObjAcci, addObjAcci, updateObjAcci, pushForwardObjAcci, batchReportObjAcci } from "@/api/slaj/acci"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { acci_grad, acci_cate, rep_stat } = proxy.useDict("acci_grad", "acci_cate", "rep_stat")

+ 7 - 2
gw-ui/src/views/slaj/acci/investigate.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px">
       <el-form-item label="事故名称" prop="acciName">
         <el-input v-model="queryParams.acciName" placeholder="请输入事故名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -29,7 +29,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="acci-bisacciinve-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="inveList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="inveList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="事故名称" align="center" prop="acciName" v-if="columns.acciName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="调查人员" align="center" prop="invePers" v-if="columns.invePers.visible" :show-overflow-tooltip="true" />
@@ -50,6 +51,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -133,6 +135,9 @@
 
 <script setup name="BisAcciInve">
 import { listBisAcciInve, getBisAcciInve, delBisAcciInve, addBisAcciInve, updateBisAcciInve, listObjAcci } from "@/api/slaj/acci"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { sys_yes_no } = proxy.useDict("sys_yes_no")

+ 7 - 2
gw-ui/src/views/slaj/acci/montReport.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" label-width="80px">
       <el-form-item label="月份" prop="mont">
         <el-date-picker v-model="mont" type="month" value-format="YYYY-MM" placeholder="选择月份" style="width: 200px" @change="handleMonthChange" />
@@ -22,13 +22,15 @@
       </el-col>
     </el-row>
 
-    <el-table v-loading="loading" :data="acciList" @selection-change="handleSelectionChange" style="margin-bottom: 20px;">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="acciList" @selection-change="handleSelectionChange" style="margin-bottom: 20px;">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="事故名称" align="center" prop="acciName" :show-overflow-tooltip="true" />
       <el-table-column label="死亡人数" align="center" prop="deathNum" width="100" />
       <el-table-column label="重伤人数" align="center" prop="seriInjuNum" width="100" />
       <el-table-column label="经济损失" align="center" prop="econLoss" width="120" />
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -84,10 +86,13 @@
 
 <script setup name="AcciMontReport">
 import request from '@/utils/request'
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { getToken } from '@/utils/auth'
 import { listObjAcci } from "@/api/slaj/acci"
 import { addBisAcciMont, listBisAcciMont } from "@/api/slaj/acci"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 
 const loading = ref(false)

+ 8 - 1
gw-ui/src/views/slaj/acci/month.vue

@@ -2,6 +2,7 @@
   <div class="app-container">
     <el-tabs v-model="activeTab" type="border-card">
       <el-tab-pane label="月报列表" name="list">
+        <div ref="containerRef" class="table-page-wrap">
         <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="80px">
           <!-- 业务说明: 查询范围 dataFrom 控制月报数据的所属维度。1=直属单位(本级直接管辖),2=下级水行政(下级水利部门),3=流域机构(流域管理范围) -->
           <el-form-item label="查询范围" prop="dataFrom">
@@ -35,7 +36,8 @@
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="acci-bisaccimont-index"></right-toolbar>
         </el-row>
 
-        <el-table v-loading="loading" :data="montList" @selection-change="handleSelectionChange">
+        <div class="table-wrapper">
+        <el-table :height="tableHeight" v-loading="loading" :data="montList" @selection-change="handleSelectionChange">
           <el-table-column type="selection" width="55" align="center" />
           <el-table-column label="月份" align="center" prop="mont" v-if="columns.mont.visible" width="120" />
           <el-table-column label="状态" align="center" prop="montStat" v-if="columns.montStat.visible" width="120">
@@ -76,8 +78,10 @@
             </template>
           </el-table-column>
         </el-table>
+        </div>
 
         <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+        </div>
       </el-tab-pane>
 
       <el-tab-pane label="月报填报" name="fill">
@@ -271,9 +275,12 @@
 
 <script setup name="BisAcciMont">
 import request from '@/utils/request'
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { getToken } from '@/utils/auth'
 import { listBisAcciMont, getBisAcciMont, addBisAcciMont, updateBisAcciMont, delBisAcciMont, checkBisAcciMont, returnBisAcciMont, revokeBisAcciMont, lockBisAcciMont } from "@/api/slaj/acci"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { acci_mont_stat } = proxy.useDict("acci_mont_stat")
 

+ 7 - 2
gw-ui/src/views/slaj/acci/reportRec.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="时间范围">
         <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" style="width: 260px"></el-date-picker>
@@ -14,7 +14,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="recList" stripe>
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="recList" stripe>
       <el-table-column label="上报时间" align="center" prop="repTime" width="180" />
       <el-table-column label="上报单位" align="center" prop="orgName" :show-overflow-tooltip="true" />
       <el-table-column label="月份" align="center" prop="mont" width="100" />
@@ -25,6 +26,7 @@
       </el-table-column>
       <el-table-column label="备注" align="center" prop="note" :show-overflow-tooltip="true" />
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
   </div>
@@ -32,8 +34,11 @@
 
 <script setup name="AcciReportRec">
 import { getCurrentInstance, onMounted, reactive, ref, toRefs } from 'vue'
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listBisAcciRecRep } from "@/api/slaj/acci"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { acci_mont_stat } = proxy.useDict("acci_mont_stat")
 

+ 8 - 1
gw-ui/src/views/slaj/acci/shareData.vue

@@ -2,6 +2,7 @@
   <div class="app-container">
     <el-tabs v-model="activeTab">
       <el-tab-pane label="安监总局共享" name="sawf">
+        <div ref="containerRef" class="table-page-wrap">
         <el-form :model="sawfQuery" ref="sawfQueryRef" :inline="true" class="mb8">
           <el-form-item label="时间范围" prop="dateRange">
             <el-date-picker
@@ -20,7 +21,8 @@
           </el-form-item>
         </el-form>
 
-        <el-table v-loading="sawfLoading" :data="sawfList" stripe>
+        <div class="table-wrapper">
+        <el-table :height="tableHeight" v-loading="sawfLoading" :data="sawfList" stripe>
           <el-table-column label="事故名称" align="center" prop="acciName" :show-overflow-tooltip="true" />
           <el-table-column label="事故等级" align="center" prop="acciLevel" width="100" />
           <el-table-column label="发生时间" align="center" prop="acciTime" width="160" />
@@ -29,6 +31,7 @@
           <el-table-column label="死亡人数" align="center" prop="deathNum" width="90" />
           <el-table-column label="受伤人数" align="center" prop="injuryNum" width="90" />
         </el-table>
+        </div>
         <pagination
           v-show="sawfTotal > 0"
           :total="sawfTotal"
@@ -36,6 +39,7 @@
           v-model:limit="sawfQuery.pageSize"
           @pagination="fetchSawfList"
         />
+        </div>
       </el-tab-pane>
 
       <el-tab-pane label="水利部共享" name="mwr">
@@ -80,8 +84,11 @@
 
 <script setup name="AcciShareData">
 import { ref, reactive, onMounted } from 'vue'
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listSawfAcci, listMwrAcci } from "@/api/slaj/acci"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const activeTab = ref('sawf')
 
 // --- 安监总局 ---

+ 7 - 2
gw-ui/src/views/slaj/acci/zjIndex.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-alert
       title="本页面仅供总集系统对接使用"
       type="warning"
@@ -35,7 +35,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="acci-zjindex"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="objAcciList">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="objAcciList">
       <el-table-column label="事故名称" align="center" prop="acciName" v-if="columns.acciName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="事故等级" align="center" prop="acciGrad" v-if="columns.acciGrad.visible">
         <template #default="scope">
@@ -61,6 +62,7 @@
       </el-table-column>
       <el-table-column label="经济损失(万元)" align="center" prop="econLoss" v-if="columns.econLoss.visible" width="130" />
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
   </div>
@@ -68,6 +70,9 @@
 
 <script setup name="AcciZjIndex">
 import { listObjAcci } from "@/api/slaj/acci"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { acci_grad, acci_cate, rep_stat } = proxy.useDict("acci_grad", "acci_cate", "rep_stat")

+ 7 - 2
gw-ui/src/views/slaj/hazard/acciHazard.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="危险源名称" prop="hazName">
         <el-input v-model="queryParams.hazName" placeholder="请输入危险源名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -37,7 +37,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-accihazard-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="hazList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="hazList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="事故隐患名称" align="center" prop="hazName" v-if="columns.hazName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="危险源等级" align="center" prop="hiddGrad" v-if="columns.hiddGrad.visible">
@@ -68,6 +69,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -174,8 +176,11 @@
 
 <script setup name="AcciHazard">
 import { listObjHaz, getObjHaz, delObjHaz, addObjHaz, updateObjHaz } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { addTBusiHazardReport } from "@/api/slaj/hazard"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { haz_grad, risk_grad, sys_yes_no } = proxy.useDict("haz_grad", "risk_grad", "sys_yes_no")
 

+ 67 - 7
gw-ui/src/views/slaj/hazard/archive.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="档案状态" prop="status">
         <el-select v-model="queryParams.status" placeholder="请选择档案状态" clearable style="width: 240px">
@@ -31,7 +31,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-tbusihazardarchive-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="archiveList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="archiveList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="档案状态" align="center" prop="status" v-if="columns.status.visible">
         <template #default="scope">
@@ -41,20 +42,30 @@
       <el-table-column label="创建人" align="center" prop="createPer" v-if="columns.createPer.visible" />
       <el-table-column label="创建时间" align="center" prop="createTime" v-if="columns.createTime.visible" width="180" />
       <el-table-column label="更新时间" align="center" prop="updateTime" v-if="columns.updateTime.visible" width="180" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="240">
         <template #default="scope">
-          <el-tooltip content="修改" placement="top">
+          <el-tooltip content="提交归档" placement="top" v-if="scope.row.status === '0'">
+            <el-button link type="primary" icon="Top" @click="handleSubmitArchive(scope.row)">提交</el-button>
+          </el-tooltip>
+          <el-tooltip content="审核通过" placement="top" v-if="scope.row.status === '1'">
+            <el-button link type="success" icon="Check" @click="handleApprove(scope.row)">通过</el-button>
+          </el-tooltip>
+          <el-tooltip content="审核退回" placement="top" v-if="scope.row.status === '1'">
+            <el-button link type="danger" icon="Close" @click="handleReject(scope.row)">退回</el-button>
+          </el-tooltip>
+          <el-tooltip content="修改" placement="top" v-if="scope.row.status === '0'">
             <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['hazard:tbusihazardarchive:edit']"></el-button>
           </el-tooltip>
           <el-tooltip content="详情" placement="top">
             <el-button link type="primary" icon="View" @click="handleDetail(scope.row)"></el-button>
           </el-tooltip>
-          <el-tooltip content="删除" placement="top">
+          <el-tooltip content="删除" placement="top" v-if="scope.row.status === '0'">
             <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['hazard:tbusihazardarchive:remove']"></el-button>
           </el-tooltip>
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -77,6 +88,13 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="备注" prop="remark">
+              <el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
@@ -89,10 +107,13 @@
     <!-- 档案详情对话框 -->
     <el-dialog title="档案详情" v-model="detailOpen" width="600px" append-to-body>
       <el-descriptions :column="2" border>
-        <el-descriptions-item label="档案状态">{{ detailRow.status }}</el-descriptions-item>
+        <el-descriptions-item label="档案状态">
+          <dict-tag :options="archive_status" :value="detailRow.status" />
+        </el-descriptions-item>
         <el-descriptions-item label="创建人">{{ detailRow.createPer }}</el-descriptions-item>
         <el-descriptions-item label="创建时间">{{ detailRow.createTime }}</el-descriptions-item>
         <el-descriptions-item label="更新时间">{{ detailRow.updateTime }}</el-descriptions-item>
+        <el-descriptions-item label="退回原因" :span="2" v-if="detailRow.status === '3'">{{ detailRow.remark }}</el-descriptions-item>
       </el-descriptions>
       <template #footer>
         <el-button @click="detailOpen = false">关 闭</el-button>
@@ -103,8 +124,11 @@
 
 <script setup name="TBusiHazardArchive">
 import { listTBusiHazardArchive, getTBusiHazardArchive, delTBusiHazardArchive, addTBusiHazardArchive, updateTBusiHazardArchive } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listTBusiHazIden } from "@/api/slaj/hazard"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { archive_status } = proxy.useDict("archive_status")
 
@@ -200,6 +224,41 @@ function handleUpdate(row) {
   })
 }
 
+/** 提交归档 */
+function handleSubmitArchive(row) {
+  proxy.$modal.confirm('确认提交档案编号为"' + row.guid + '"的审核?').then(function () {
+    return updateTBusiHazardArchive({ guid: row.guid, status: '1' })
+  }).then(() => {
+    proxy.$modal.msgSuccess("提交成功,等待审核")
+    getList()
+  }).catch(() => {})
+}
+
+/** 审核通过 */
+function handleApprove(row) {
+  proxy.$modal.confirm('确认审核通过该档案?').then(function () {
+    return updateTBusiHazardArchive({ guid: row.guid, status: '2' })
+  }).then(() => {
+    proxy.$modal.msgSuccess("审核通过")
+    getList()
+  }).catch(() => {})
+}
+
+/** 审核退回 */
+function handleReject(row) {
+  proxy.$modal.prompt("请输入退回原因", "审核退回", {
+    confirmButtonText: "确认退回",
+    cancelButtonText: "取消",
+    inputPattern: /.+/,
+    inputErrorMessage: "退回原因不能为空"
+  }).then(({ value }) => {
+    return updateTBusiHazardArchive({ guid: row.guid, status: '3', remark: value })
+  }).then(() => {
+    proxy.$modal.msgSuccess("已退回")
+    getList()
+  }).catch(() => {})
+}
+
 /** 详情按钮操作 */
 function handleDetail(row) {
   detailRow.value = row
@@ -251,8 +310,9 @@ function reset() {
     guid: undefined,
     hazIdenGuid: undefined,
     orgGuid: undefined,
-    status: undefined,
+    status: '0',
     wiunGuid: undefined,
+    remark: undefined,
     createPer: undefined,
     updatePer: undefined,
     createTime: undefined,

+ 7 - 2
gw-ui/src/views/slaj/hazard/chemList.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="危化品名称" prop="hachName">
         <el-input v-model="queryParams.hachName" placeholder="请输入危化品名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -29,7 +29,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-objhach-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="hachList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="hachList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="危化品名称" align="center" prop="hachName" v-if="columns.hachName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="化学品名称" align="center" prop="chemName" v-if="columns.chemName.visible" :show-overflow-tooltip="true" />
@@ -54,6 +55,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -128,6 +130,9 @@
 
 <script setup name="ObjHach">
 import { listObjHach, getObjHach, delObjHach, addObjHach, updateObjHach } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 

+ 112 - 0
gw-ui/src/views/slaj/hazard/chemSupervise.vue

@@ -0,0 +1,112 @@
+<template>
+  <div ref="containerRef" class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="80px">
+      <el-form-item label="危化品名称" prop="hachName">
+        <el-input v-model="queryParams.hachName" placeholder="请输入危化品名称" clearable style="width: 200px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="所属单位" prop="orgGuid">
+        <el-input v-model="queryParams.orgGuid" placeholder="请输入所属单位" clearable style="width: 200px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['hazard:objhach:export']">导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-chemsupervise-index"></right-toolbar>
+    </el-row>
+
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="chemList">
+      <el-table-column label="危化品名称" align="center" prop="hachName" v-if="columns.hachName.visible" :show-overflow-tooltip="true" />
+      <el-table-column label="化学品名称" align="center" prop="chemName" v-if="columns.chemName.visible" :show-overflow-tooltip="true" />
+      <el-table-column label="存放地点" align="center" prop="locName" v-if="columns.locName.visible" :show-overflow-tooltip="true" />
+      <el-table-column label="储存包装" align="center" prop="storPack" v-if="columns.storPack.visible" />
+      <el-table-column label="有毒物质数量" align="center" prop="toxicSubsNum" v-if="columns.toxicSubsNum.visible" />
+      <el-table-column label="危险数量" align="center" prop="dangNum" v-if="columns.dangNum.visible" />
+      <el-table-column label="当前库存" align="center" prop="currRese" v-if="columns.currRese.visible" />
+      <el-table-column label="操作" align="center" width="100">
+        <template #default="scope">
+          <el-tooltip content="详情" placement="top">
+            <el-button link type="primary" icon="View" @click="handleDetail(scope.row)"></el-button>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+    </el-table>
+    </div>
+
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+  </div>
+</template>
+
+<script setup name="ChemSupervise">
+import { listObjHach } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
+
+const { proxy } = getCurrentInstance()
+
+const chemList = ref([])
+const loading = ref(true)
+const showSearch = ref(true)
+const total = ref(0)
+
+const columns = ref({
+  hachName: { label: '危化品名称', visible: true },
+  chemName: { label: '化学品名称', visible: true },
+  locName: { label: '存放地点', visible: true },
+  storPack: { label: '储存包装', visible: true },
+  toxicSubsNum: { label: '有毒物质数量', visible: true },
+  dangNum: { label: '危险数量', visible: true },
+  currRese: { label: '当前库存', visible: true }
+})
+
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    hachName: undefined,
+    orgGuid: undefined
+  }
+})
+
+const { queryParams } = toRefs(data)
+
+function getList() {
+  loading.value = true
+  listObjHach(queryParams.value).then(res => {
+    loading.value = false
+    chemList.value = res.rows
+    total.value = res.total
+  })
+}
+
+function handleQuery() {
+  queryParams.value.pageNum = 1
+  getList()
+}
+
+function resetQuery() {
+  proxy.resetForm("queryRef")
+  handleQuery()
+}
+
+function handleDetail(row) {
+  proxy.$router.push({ path: '/slaj/hazard/chemDetail', query: { guid: row.guid } })
+}
+
+function handleExport() {
+  proxy.download("hazard/objhach/export", {
+    ...queryParams.value
+  }, `chemSupervise_${new Date().getTime()}.xlsx`)
+}
+
+onMounted(() => {
+  getList()
+})
+</script>

+ 7 - 2
gw-ui/src/views/slaj/hazard/controlMeasure.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="创建时间" style="width: 308px">
         <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
@@ -26,7 +26,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-tbusicontrolmeasure-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="measureList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="measureList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="组织人员" align="center" prop="orgPerGuid" v-if="columns.orgPerGuid.visible" :show-overflow-tooltip="true" />
       <el-table-column label="建设组织人员" align="center" prop="consOrgPerGuid" v-if="columns.consOrgPerGuid.visible" :show-overflow-tooltip="true" />
@@ -48,6 +49,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -129,8 +131,11 @@
 
 <script setup name="TBusiControlMeasure">
 import { listTBusiControlMeasure, getTBusiControlMeasure, delTBusiControlMeasure, addTBusiControlMeasure, updateTBusiControlMeasure } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listTBusiHazIden } from "@/api/slaj/hazard"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 
 const measureList = ref([])

+ 7 - 2
gw-ui/src/views/slaj/hazard/controlTerm.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="类型" prop="type">
         <el-input v-model="queryParams.type" placeholder="请输入类型" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -29,7 +29,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-tbusicontrolterm-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="termList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="termList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="类型" align="center" prop="type" v-if="columns.type.visible" :show-overflow-tooltip="true" />
       <el-table-column label="内容" align="center" prop="content" v-if="columns.content.visible" :show-overflow-tooltip="true" />
@@ -49,6 +50,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -116,9 +118,12 @@
 
 <script setup name="TBusiControlTerm">
 import { listTBusiControlTerm, getTBusiControlTerm, delTBusiControlTerm, addTBusiControlTerm, updateTBusiControlTerm } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listTBusiHazIden } from "@/api/slaj/hazard"
 import { listTBusiControlMeasure } from "@/api/slaj/hazard"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 
 const termList = ref([])

+ 69 - 2
gw-ui/src/views/slaj/hazard/detail.vue

@@ -38,7 +38,10 @@
             <el-descriptions-item label="现场责任人">{{ detail.onsitePers }}</el-descriptions-item>
             <el-descriptions-item label="现场责任人电话">{{ detail.onsitepersTel }}</el-descriptions-item>
             <el-descriptions-item label="监管单位">{{ detail.supOrg }}</el-descriptions-item>
+            <el-descriptions-item label="监管责任人">{{ detail.supPers }}</el-descriptions-item>
+            <el-descriptions-item label="责任人电话">{{ detail.offiTel }}</el-descriptions-item>
             <el-descriptions-item label="报送时间">{{ detail.regTime }}</el-descriptions-item>
+            <el-descriptions-item label="监管时间">{{ detail.supTime }}</el-descriptions-item>
           </el-descriptions>
         </el-tab-pane>
 
@@ -127,6 +130,58 @@
             </el-table-column>
           </el-table>
         </el-tab-pane>
+        <el-tab-pane label="安全状态" name="lifecycle">
+          <el-timeline>
+            <el-timeline-item timestamp="危险源发现" placement="top">
+              <el-card shadow="hover">
+                <p>发现时间:{{ detail.collTime || '未记录' }}</p>
+                <p>记录人员:{{ detail.recPers || '未记录' }}</p>
+              </el-card>
+            </el-timeline-item>
+            <el-timeline-item timestamp="危险源辨识" placement="top">
+              <el-card shadow="hover">
+                <p v-if="identifyList.length">辨识时间:{{ identifyList[0]?.createTime || '未记录' }}</p>
+                <p v-if="identifyList.length">辨识结果:{{ identifyList[0]?.idenResult || '未记录' }}</p>
+                <p v-else>尚未进行辨识</p>
+              </el-card>
+            </el-timeline-item>
+            <el-timeline-item timestamp="危险源报送" placement="top">
+              <el-card shadow="hover">
+                <p>报送状态:
+                  <dict-tag :options="haz_stat" :value="detail.hazStat" />
+                </p>
+                <p>报送时间:{{ detail.regTime || '未报送' }}</p>
+              </el-card>
+            </el-timeline-item>
+            <el-timeline-item timestamp="危险源监管" placement="top">
+              <el-card shadow="hover">
+                <p>监管单位:{{ detail.supOrg || '未监管' }}</p>
+                <p>监管责任人:{{ detail.supPers || '未设置' }}</p>
+                <p>责任人电话:{{ detail.offiTel || '未设置' }}</p>
+                <p>监管时间:{{ detail.supTime || '未监管' }}</p>
+              </el-card>
+            </el-timeline-item>
+            <el-timeline-item timestamp="日常监控" placement="top">
+              <el-card shadow="hover">
+                <p v-if="patrolList.length">最近巡查:{{ patrolList[0]?.patrolTime || '无记录' }}</p>
+                <p v-if="patrolList.length">巡查人员:{{ patrolList[0]?.patrolPer || '无记录' }}</p>
+                <p v-else>尚未进行巡查</p>
+              </el-card>
+            </el-timeline-item>
+          </el-timeline>
+        </el-tab-pane>
+        <el-tab-pane label="上报信息" name="report">
+          <el-table v-loading="reportLoading" :data="reportList">
+            <el-table-column label="上报状态" align="center" prop="status" width="120">
+              <template #default="scope">
+                <dict-tag :options="report_status" :value="scope.row.status" />
+              </template>
+            </el-table-column>
+            <el-table-column label="创建人" align="center" prop="createPer" />
+            <el-table-column label="创建时间" align="center" prop="createTime" width="180" />
+            <el-table-column label="退回原因" align="center" prop="remark" :show-overflow-tooltip="true" v-if="scope.row.status === '3'" />
+          </el-table>
+        </el-tab-pane>
       </el-tabs>
     </el-card>
   </div>
@@ -138,10 +193,10 @@ import { getObjHaz } from "@/api/slaj/hazard"
 import { listTBusiHazIden } from "@/api/slaj/hazard"
 import { listTBusiControlMeasure } from "@/api/slaj/hazard"
 import { listBisHazPatRec } from "@/api/slaj/hazard"
-import { listBisHazMajRegWrit } from "@/api/slaj/hazard"
+import { listBisHazMajRegWrit, listTBusiHazardReport } from "@/api/slaj/hazard"
 
 const { proxy } = getCurrentInstance()
-const { haz_grad, haz_stat, risk_grad, sys_yes_no } = proxy.useDict("haz_grad", "haz_stat", "risk_grad", "sys_yes_no")
+const { haz_grad, haz_stat, risk_grad, sys_yes_no, report_status } = proxy.useDict("haz_grad", "haz_stat", "risk_grad", "sys_yes_no", "report_status")
 
 const route = useRoute()
 const activeTab = ref("basic")
@@ -154,6 +209,8 @@ const patrolLoading = ref(false)
 const patrolList = ref([])
 const registerLoading = ref(false)
 const registerList = ref([])
+const reportLoading = ref(false)
+const reportList = ref([])
 
 /** 获取危险源详情 */
 function getDetail() {
@@ -165,6 +222,7 @@ function getDetail() {
       getControlList()
       getPatrolList()
       getRegisterList()
+      getReportList()
     })
   }
 }
@@ -205,6 +263,15 @@ function getRegisterList() {
   })
 }
 
+/** 查询上报列表 */
+function getReportList() {
+  reportLoading.value = true
+  listTBusiHazardReport({ hazGuid: detail.value.guid, pageNum: 1, pageSize: 100 }).then(res => {
+    reportLoading.value = false
+    reportList.value = res.rows
+  })
+}
+
 /** 返回列表 */
 function goBack() {
   proxy.$router.push({ path: '/slaj/hazard/index' })

+ 7 - 2
gw-ui/src/views/slaj/hazard/dict/majorBuilding.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="字典名称" prop="dictName">
         <el-input v-model="queryParams.dictName" placeholder="请输入字典名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -26,7 +26,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-tdictmajorbuilding-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="dictList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="dictList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="字典名称" align="center" prop="dictName" v-if="columns.dictName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="字典值" align="center" prop="dictValue" v-if="columns.dictValue.visible" :show-overflow-tooltip="true" />
@@ -41,6 +42,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -65,6 +67,9 @@
 
 <script setup name="TDictMajorBuilding">
 import { listTDictMajorBuilding, getTDictMajorBuilding, delTDictMajorBuilding, addTDictMajorBuilding, updateTDictMajorBuilding } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 

+ 7 - 2
gw-ui/src/views/slaj/hazard/dict/majorCommon.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="字典名称" prop="dictName">
         <el-input v-model="queryParams.dictName" placeholder="请输入字典名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -26,7 +26,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-tdictmajorcommon-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="dictList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="dictList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="字典名称" align="center" prop="dictName" v-if="columns.dictName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="字典值" align="center" prop="dictValue" v-if="columns.dictValue.visible" :show-overflow-tooltip="true" />
@@ -41,6 +42,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -65,6 +67,9 @@
 
 <script setup name="TDictMajorCommon">
 import { listTDictMajorCommon, getTDictMajorCommon, delTDictMajorCommon, addTDictMajorCommon, updateTDictMajorCommon } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 

+ 7 - 2
gw-ui/src/views/slaj/hazard/dict/majorEd.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="字典名称" prop="dictName">
         <el-input v-model="queryParams.dictName" placeholder="请输入字典名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -26,7 +26,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-tdictmajored-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="dictList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="dictList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="字典名称" align="center" prop="dictName" v-if="columns.dictName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="字典值" align="center" prop="dictValue" v-if="columns.dictValue.visible" :show-overflow-tooltip="true" />
@@ -41,6 +42,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -65,6 +67,9 @@
 
 <script setup name="TDictMajorEd">
 import { listTDictMajorEd, getTDictMajorEd, delTDictMajorEd, addTDictMajorEd, updateTDictMajorEd } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 

+ 7 - 2
gw-ui/src/views/slaj/hazard/dict/majorSource.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="字典名称" prop="dictName">
         <el-input v-model="queryParams.dictName" placeholder="请输入字典名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -26,7 +26,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-tdictmajorsource-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="dictList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="dictList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="字典名称" align="center" prop="dictName" v-if="columns.dictName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="字典值" align="center" prop="dictValue" v-if="columns.dictValue.visible" :show-overflow-tooltip="true" />
@@ -41,6 +42,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -65,6 +67,9 @@
 
 <script setup name="TDictMajorSource">
 import { listTDictMajorSource, getTDictMajorSource, delTDictMajorSource, addTDictMajorSource, updateTDictMajorSource } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 

+ 7 - 2
gw-ui/src/views/slaj/hazard/evaluate.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="评价日期" style="width: 308px">
         <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
@@ -26,7 +26,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-bishazideneva-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="evaList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="evaList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="评价机构" align="center" prop="evaOrgName" v-if="columns.evaOrgName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="评价日期" align="center" prop="evaeDate" v-if="columns.evaeDate.visible" width="180" />
@@ -48,6 +49,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -122,8 +124,11 @@
 
 <script setup name="BisHazIdenEva">
 import { listBisHazIdenEva, getBisHazIdenEva, delBisHazIdenEva, addBisHazIdenEva, updateBisHazIdenEva } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listObjHaz } from "@/api/slaj/hazard"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 
 const evaList = ref([])

+ 7 - 2
gw-ui/src/views/slaj/hazard/identify.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="危险源等级" prop="hazGrade">
         <el-select v-model="queryParams.hazGrade" placeholder="请选择危险源等级" clearable style="width: 240px">
@@ -31,7 +31,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-tbusihaziden-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="idenList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="idenList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="危险源等级" align="center" prop="hazGrade" v-if="columns.hazGrade.visible">
         <template #default="scope">
@@ -63,6 +64,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -174,8 +176,11 @@
 
 <script setup name="TBusiHazIden">
 import { listTBusiHazIden, getTBusiHazIden, delTBusiHazIden, addTBusiHazIden, updateTBusiHazIden } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listObjHaz } from "@/api/slaj/hazard"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { haz_grad, sys_yes_no } = proxy.useDict("haz_grad", "sys_yes_no")
 

+ 85 - 13
gw-ui/src/views/slaj/hazard/index.vue

@@ -1,25 +1,31 @@
 <template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+  <div ref="containerRef" class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="auto">
       <el-form-item label="危险源名称" prop="hazName">
-        <el-input v-model="queryParams.hazName" placeholder="请输入危险源名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
+        <el-input v-model="queryParams.hazName" placeholder="请输入危险源名称" clearable style="width: 180px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="所属单位" prop="orgGuid">
+        <el-input v-model="queryParams.orgGuid" placeholder="请输入所属单位" clearable style="width: 180px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="所属工程" prop="engGuid">
+        <el-input v-model="queryParams.engGuid" placeholder="请输入所属工程" clearable style="width: 180px" @keyup.enter="handleQuery" />
       </el-form-item>
       <el-form-item label="危险源等级" prop="hiddGrad">
-        <el-select v-model="queryParams.hiddGrad" placeholder="请选择危险源等级" clearable style="width: 240px">
+        <el-select v-model="queryParams.hiddGrad" placeholder="请选择危险源等级" clearable style="width: 150px">
           <el-option v-for="dict in haz_grad" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="危险源状态" prop="hazStat">
-        <el-select v-model="queryParams.hazStat" placeholder="请选择危险源状态" clearable style="width: 240px">
+        <el-select v-model="queryParams.hazStat" placeholder="请选择危险源状态" clearable style="width: 150px">
           <el-option v-for="dict in haz_stat" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="风险等级" prop="riskGrad">
-        <el-select v-model="queryParams.riskGrad" placeholder="请选择风险等级" clearable style="width: 240px">
+        <el-select v-model="queryParams.riskGrad" placeholder="请选择风险等级" clearable style="width: 150px">
           <el-option v-for="dict in risk_grad" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
-      <el-form-item label="采集时间" style="width: 308px">
+      <el-form-item label="采集时间">
         <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
       </el-form-item>
       <el-form-item>
@@ -38,13 +44,17 @@
       <el-col :span="1.5">
         <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['hazard:objhaz:remove']">删除</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="Top" :disabled="multiple" @click="handleBatchSubmit" v-hasPermi="['hazard:objhaz:edit']">批量报送</el-button>
+      </el-col>
       <el-col :span="1.5">
         <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['hazard:objhaz:export']">导出</el-button>
       </el-col>
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-objhaz-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="objHazList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="objHazList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="危险源编码" align="center" prop="hazCode" v-if="columns.hazCode.visible" :show-overflow-tooltip="true" />
       <el-table-column label="危险源名称" align="center" prop="hazName" v-if="columns.hazName.visible" :show-overflow-tooltip="true" />
@@ -73,8 +83,14 @@
       </el-table-column>
       <el-table-column label="类型" align="center" prop="type" v-if="columns.type.visible" />
       <el-table-column label="采集时间" align="center" prop="collTime" v-if="columns.collTime.visible" width="180" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="260">
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="320">
         <template #default="scope">
+          <el-tooltip content="报送" placement="top" v-if="scope.row.hazStat === '0'">
+            <el-button link type="primary" icon="Top" @click="handleSubmit(scope.row)" v-hasPermi="['hazard:objhaz:edit']">报送</el-button>
+          </el-tooltip>
+          <el-tooltip content="监管" placement="top" v-if="scope.row.hazStat === '1'">
+            <el-button link type="warning" icon="User" @click="handleSupervise(scope.row)" v-hasPermi="['hazard:objhaz:edit']">监管</el-button>
+          </el-tooltip>
           <el-tooltip content="备案" placement="top" v-if="scope.row.hazStat === '0' || scope.row.hazStat === '1'">
             <el-button link type="primary" icon="Edit" @click="handleRegister(scope.row)" v-hasPermi="['hazard:bishazmajregwrit:add']"></el-button>
           </el-tooltip>
@@ -82,17 +98,18 @@
             <el-button link type="primary" icon="CircleCheck" @click="handleWriteOff(scope.row)" v-hasPermi="['hazard:bishazmajregwrit:add']"></el-button>
           </el-tooltip>
           <el-tooltip content="修改" placement="top">
-            <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['hazard:objhaz:edit']"></el-button>
+            <el-button link type="primary" icon="Edit" :disabled="scope.row.hazStat !== '0'" @click="handleUpdate(scope.row)" v-hasPermi="['hazard:objhaz:edit']"></el-button>
           </el-tooltip>
           <el-tooltip content="详情" placement="top">
             <el-button link type="primary" icon="View" @click="handleDetail(scope.row)"></el-button>
           </el-tooltip>
           <el-tooltip content="删除" placement="top">
-            <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['hazard:objhaz:remove']"></el-button>
+            <el-button link type="primary" icon="Delete" :disabled="scope.row.hazStat !== '0'" @click="handleDelete(scope.row)" v-hasPermi="['hazard:objhaz:remove']"></el-button>
           </el-tooltip>
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -213,6 +230,9 @@
 
 <script setup name="ObjHaz">
 import { listObjHaz, getObjHaz, delObjHaz, addObjHaz, updateObjHaz } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { haz_grad, haz_stat, risk_grad, sys_yes_no } = proxy.useDict("haz_grad", "haz_stat", "risk_grad", "sys_yes_no")
@@ -251,7 +271,8 @@ const data = reactive({
     hiddGrad: undefined,
     hazStat: undefined,
     riskGrad: undefined,
-    orgGuid: undefined
+    orgGuid: undefined,
+    engGuid: undefined
   },
   rules: {
     hazName: [{ required: true, message: "危险源名称不能为空", trigger: "blur" }],
@@ -301,8 +322,12 @@ function handleAdd() {
 
 /** 修改按钮操作 */
 function handleUpdate(row) {
-  reset()
   const guid = row.guid || ids.value
+  if (row.hazStat && row.hazStat !== '0') {
+    proxy.$modal.msgWarning("已报送的危险源不可修改")
+    return
+  }
+  reset()
   getObjHaz(guid).then(response => {
     form.value = response.data
     open.value = true
@@ -310,6 +335,49 @@ function handleUpdate(row) {
   })
 }
 
+/** 报送按钮操作 - 将危险源状态改为已报送 */
+function handleSubmit(row) {
+  if (row.hazStat && row.hazStat !== '0') {
+    proxy.$modal.msgWarning("该危险源已报送,无需重复操作")
+    return
+  }
+  const guid = row.guid
+  proxy.$modal.confirm('确认报送危险源"' + row.hazName + '"到上级单位?报送后不可修改和删除。').then(function () {
+    return updateObjHaz({ guid: guid, hazStat: '1' })
+  }).then(() => {
+    proxy.$modal.msgSuccess("报送成功")
+    getList()
+  }).catch(() => {})
+}
+
+/** 批量报送操作 */
+function handleBatchSubmit() {
+  if (!ids.value.length) {
+    proxy.$modal.msgWarning("请选择要报送的危险源")
+    return
+  }
+  proxy.$modal.confirm('确认批量报送选中的危险源到上级单位?').then(function () {
+    const filtered = ids.value.filter(id => {
+      const row = objHazList.value.find(r => r.guid === id)
+      return row && (row.hazStat === '0' || !row.hazStat)
+    })
+    if (!filtered.length) {
+      proxy.$modal.msgWarning("选中的危险源均已报送,无需重复操作")
+      return Promise.reject()
+    }
+    const promises = filtered.map(guid => updateObjHaz({ guid: guid, hazStat: '1' }))
+    return Promise.all(promises)
+  }).then(() => {
+    proxy.$modal.msgSuccess("批量报送成功")
+    getList()
+  }).catch(() => {})
+}
+
+/** 监管按钮操作 - 跳转到监管页面 */
+function handleSupervise(row) {
+  proxy.$router.push({ path: '/slaj/hazard/supervise', query: { hazGuid: row.guid } })
+}
+
 /** 详情按钮操作 */
 function handleDetail(row) {
   const guid = row.guid || ids.value
@@ -350,6 +418,10 @@ function submitForm() {
 /** 删除按钮操作 */
 function handleDelete(row) {
   const guids = row.guid || ids.value
+  if (row.hazStat && row.hazStat !== '0') {
+    proxy.$modal.msgWarning("已报送的危险源不可删除")
+    return
+  }
   proxy.$modal.confirm('是否确认删除危险源编号为"' + guids + '"的数据项?').then(function () {
     return delObjHaz(guids)
   }).then(() => {

+ 225 - 0
gw-ui/src/views/slaj/hazard/nextDep.vue

@@ -0,0 +1,225 @@
+<template>
+  <div ref="containerRef" class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="80px">
+      <el-form-item label="下级单位" prop="orgGuid">
+        <el-input v-model="queryParams.orgGuid" placeholder="请输入下级单位名称" clearable style="width: 200px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="危险源等级" prop="hiddGrad">
+        <el-select v-model="queryParams.hiddGrad" placeholder="请选择危险源等级" clearable style="width: 150px">
+          <el-option v-for="dict in haz_grad" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="备案状态" prop="hazStat">
+        <el-select v-model="queryParams.hazStat" placeholder="请选择备案状态" clearable style="width: 150px">
+          <el-option v-for="dict in haz_reg_stat" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['hazard:objhaz:edit']">审核</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['hazard:objhaz:export']">导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-nextdep-index"></right-toolbar>
+    </el-row>
+
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="hazList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="危险源名称" align="center" prop="hazName" v-if="columns.hazName.visible" :show-overflow-tooltip="true" />
+      <el-table-column label="所属单位" align="center" prop="orgGuid" v-if="columns.orgGuid.visible" :show-overflow-tooltip="true" />
+      <el-table-column label="所属工程" align="center" prop="engGuid" v-if="columns.engGuid.visible" :show-overflow-tooltip="true" />
+      <el-table-column label="危险源等级" align="center" prop="hiddGrad" v-if="columns.hiddGrad.visible">
+        <template #default="scope">
+          <dict-tag :options="haz_grad" :value="scope.row.hiddGrad" />
+        </template>
+      </el-table-column>
+      <el-table-column label="风险等级" align="center" prop="riskGrad" v-if="columns.riskGrad.visible">
+        <template #default="scope">
+          <dict-tag :options="risk_grad" :value="scope.row.riskGrad" />
+        </template>
+      </el-table-column>
+      <el-table-column label="危险源状态" align="center" prop="hazStat" v-if="columns.hazStat.visible">
+        <template #default="scope">
+          <dict-tag :options="haz_stat" :value="scope.row.hazStat" />
+        </template>
+      </el-table-column>
+      <el-table-column label="备案状态" align="center" prop="regStat" v-if="columns.regStat.visible">
+        <template #default="scope">
+          <dict-tag :options="haz_reg_stat" :value="scope.row.regStat" />
+        </template>
+      </el-table-column>
+      <el-table-column label="监管责任人" align="center" prop="supPers" v-if="columns.supPers.visible" />
+      <el-table-column label="采集时间" align="center" prop="collTime" v-if="columns.collTime.visible" width="180" />
+    </el-table>
+    </div>
+
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+
+    <!-- 审核对话框 -->
+    <el-dialog title="下级危险源审核" v-model="auditOpen" width="600px" append-to-body>
+      <el-form :model="auditForm" :rules="auditRules" ref="auditRef" label-width="100px">
+        <el-descriptions :column="1" border style="margin-bottom: 16px">
+          <el-descriptions-item label="危险源名称">{{ currentRow.hazName }}</el-descriptions-item>
+          <el-descriptions-item label="所属单位">{{ currentRow.orgGuid }}</el-descriptions-item>
+          <el-descriptions-item label="危险源等级">
+            <dict-tag :options="haz_grad" :value="currentRow.hiddGrad" />
+          </el-descriptions-item>
+          <el-descriptions-item label="当前状态">
+            <dict-tag :options="haz_stat" :value="currentRow.hazStat" />
+          </el-descriptions-item>
+        </el-descriptions>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="审核结果" prop="auditResult">
+              <el-select v-model="auditForm.auditResult" placeholder="请选择审核结果">
+                <el-option label="备案通过" value="approved" />
+                <el-option label="退回修改" value="rejected" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="监管责任人" prop="supPers">
+              <el-input v-model="auditForm.supPers" placeholder="设置监管责任人" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="审核意见" prop="opinion">
+              <el-input v-model="auditForm.opinion" type="textarea" placeholder="请输入审核意见" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitAudit">确认审核</el-button>
+          <el-button @click="auditOpen = false">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="HazardNextDep">
+import { listObjHaz, updateObjHaz } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
+
+const { proxy } = getCurrentInstance()
+const { haz_grad, haz_stat, risk_grad, haz_reg_stat } = proxy.useDict("haz_grad", "haz_stat", "risk_grad", "haz_reg_stat")
+
+const hazList = ref([])
+const loading = ref(true)
+const showSearch = ref(true)
+const ids = ref([])
+const single = ref(true)
+const multiple = ref(true)
+const total = ref(0)
+const dateRange = ref([])
+
+const auditOpen = ref(false)
+const currentRow = ref({})
+const auditForm = ref({})
+const auditRules = {
+  auditResult: [{ required: true, message: "请选择审核结果", trigger: "change" }]
+}
+
+const columns = ref({
+  hazName: { label: '危险源名称', visible: true },
+  orgGuid: { label: '所属单位', visible: true },
+  engGuid: { label: '所属工程', visible: true },
+  hiddGrad: { label: '危险源等级', visible: true },
+  riskGrad: { label: '风险等级', visible: true },
+  hazStat: { label: '危险源状态', visible: true },
+  regStat: { label: '备案状态', visible: true },
+  supPers: { label: '监管责任人', visible: true },
+  collTime: { label: '采集时间', visible: true }
+})
+
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    orgGuid: undefined,
+    hiddGrad: undefined,
+    hazStat: undefined
+  }
+})
+
+const { queryParams } = toRefs(data)
+
+function getList() {
+  loading.value = true
+  listObjHaz(proxy.addDateRange(queryParams.value, dateRange.value)).then(res => {
+    loading.value = false
+    hazList.value = res.rows
+    total.value = res.total
+  })
+}
+
+function handleQuery() {
+  queryParams.value.pageNum = 1
+  getList()
+}
+
+function resetQuery() {
+  dateRange.value = []
+  proxy.resetForm("queryRef")
+  handleQuery()
+}
+
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.guid)
+  single.value = selection.length != 1
+  multiple.value = !selection.length
+}
+
+function handleUpdate(row) {
+  currentRow.value = row
+  auditForm.value = {
+    auditResult: undefined,
+    supPers: row.supPers || '',
+    opinion: ''
+  }
+  auditOpen.value = true
+}
+
+function submitAudit() {
+  proxy.$refs["auditRef"].validate(valid => {
+    if (!valid) return
+    const data = { guid: currentRow.value.guid }
+    if (auditForm.value.auditResult === 'approved') {
+      data.hazStat = '2'
+      data.supPers = auditForm.value.supPers
+    } else {
+      data.hazStat = '0'
+    }
+    data.remark = auditForm.value.opinion
+    updateObjHaz(data).then(res => {
+      proxy.$modal.msgSuccess(auditForm.value.auditResult === 'approved' ? "备案审核通过" : "已退回")
+      auditOpen.value = false
+      getList()
+    })
+  })
+}
+
+function handleExport() {
+  proxy.download("hazard/objhaz/export", {
+    ...queryParams.value
+  }, `nextDep_${new Date().getTime()}.xlsx`)
+}
+
+onMounted(() => {
+  getList()
+})
+</script>

+ 8 - 1
gw-ui/src/views/slaj/hazard/patrol.vue

@@ -3,6 +3,7 @@
     <el-tabs v-model="activeTab">
       <!-- 巡视记录 -->
       <el-tab-pane label="巡视记录" name="patrol">
+        <div ref="containerRef" class="table-page-wrap">
         <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
           <el-form-item label="巡视人员" prop="patPers">
             <el-input v-model="queryParams.patPers" placeholder="请输入巡视人员" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -32,7 +33,8 @@
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-bishazpatrec-index"></right-toolbar>
         </el-row>
 
-        <el-table v-loading="loading" :data="patRecList" @selection-change="handleSelectionChange">
+        <div class="table-wrapper">
+        <el-table :height="tableHeight" v-loading="loading" :data="patRecList" @selection-change="handleSelectionChange">
           <el-table-column type="selection" width="55" align="center" />
           <el-table-column label="巡视时间" align="center" prop="patTime" v-if="columns.patTime.visible" width="180" />
           <el-table-column label="巡视人员" align="center" prop="patPers" v-if="columns.patPers.visible" />
@@ -51,6 +53,7 @@
             </template>
           </el-table-column>
         </el-table>
+        </div>
 
         <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
       </el-tab-pane>
@@ -166,6 +169,7 @@
         </el-table>
 
         <pagination v-show="recordTotal > 0" :total="recordTotal" v-model:page="recordQueryParams.pageNum" v-model:limit="recordQueryParams.pageSize" @pagination="getRecordList" />
+        </div>
       </el-tab-pane>
     </el-tabs>
 
@@ -344,10 +348,13 @@
 
 <script setup name="HazardPatrol">
 import { listBisHazPatRec, getBisHazPatRec, delBisHazPatRec, addBisHazPatRec, updateBisHazPatRec } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listTBusiInspectTask, getTBusiInspectTask, delTBusiInspectTask, addTBusiInspectTask, updateTBusiInspectTask } from "@/api/slaj/hazard"
 import { listTBusiInspectRecord, getTBusiInspectRecord, delTBusiInspectRecord, addTBusiInspectRecord, updateTBusiInspectRecord } from "@/api/slaj/hazard"
 import { listObjHaz } from "@/api/slaj/hazard"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { inspect_status } = proxy.useDict("inspect_status")
 

+ 7 - 2
gw-ui/src/views/slaj/hazard/record.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="备案编号" prop="regCode">
         <el-input v-model="queryParams.regCode" placeholder="请输入备案编号" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -23,7 +23,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-bishazmajregwrit-record"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="recordList">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="recordList">
       <el-table-column label="备案编号" align="center" prop="regCode" v-if="columns.regCode.visible" :show-overflow-tooltip="true" />
       <el-table-column label="备案时间" align="center" prop="regTime" v-if="columns.regTime.visible" width="180" />
       <el-table-column label="核销编号" align="center" prop="writeCode" v-if="columns.writeCode.visible" :show-overflow-tooltip="true" />
@@ -44,6 +45,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -68,6 +70,9 @@
 
 <script setup name="HazardRecord">
 import { listBisHazMajRegWrit } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { haz_reg_stat } = proxy.useDict("haz_reg_stat")

+ 7 - 2
gw-ui/src/views/slaj/hazard/register.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="备案编号" prop="regCode">
         <el-input v-model="queryParams.regCode" placeholder="请输入备案编号" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -34,7 +34,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-bishazmajregwrit-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="regWritList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="regWritList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="备案编号" align="center" prop="regCode" v-if="columns.regCode.visible" :show-overflow-tooltip="true" />
       <el-table-column label="备案时间" align="center" prop="regTime" v-if="columns.regTime.visible" width="180" />
@@ -61,6 +62,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -120,8 +122,11 @@
 
 <script setup name="BisHazMajRegWrit">
 import { listBisHazMajRegWrit, getBisHazMajRegWrit, delBisHazMajRegWrit, addBisHazMajRegWrit, updateBisHazMajRegWrit } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listObjHaz } from "@/api/slaj/hazard"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { haz_reg_stat } = proxy.useDict("haz_reg_stat")
 

+ 67 - 7
gw-ui/src/views/slaj/hazard/report.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="上报状态" prop="status">
         <el-select v-model="queryParams.status" placeholder="请选择上报状态" clearable style="width: 240px">
@@ -31,7 +31,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-tbusihazardreport-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="reportList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="reportList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="上报状态" align="center" prop="status" v-if="columns.status.visible">
         <template #default="scope">
@@ -41,20 +42,30 @@
       <el-table-column label="创建人" align="center" prop="createPer" v-if="columns.createPer.visible" />
       <el-table-column label="创建时间" align="center" prop="createTime" v-if="columns.createTime.visible" width="180" />
       <el-table-column label="更新时间" align="center" prop="updateTime" v-if="columns.updateTime.visible" width="180" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="240">
         <template #default="scope">
-          <el-tooltip content="修改" placement="top">
+          <el-tooltip content="提交审核" placement="top" v-if="scope.row.status === '0'">
+            <el-button link type="primary" icon="Top" @click="handleSubmitReport(scope.row)">提交</el-button>
+          </el-tooltip>
+          <el-tooltip content="审核通过" placement="top" v-if="scope.row.status === '1'">
+            <el-button link type="success" icon="Check" @click="handleApprove(scope.row)">通过</el-button>
+          </el-tooltip>
+          <el-tooltip content="审核退回" placement="top" v-if="scope.row.status === '1'">
+            <el-button link type="danger" icon="Close" @click="handleReject(scope.row)">退回</el-button>
+          </el-tooltip>
+          <el-tooltip content="修改" placement="top" v-if="scope.row.status === '0'">
             <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['hazard:tbusihazardreport:edit']"></el-button>
           </el-tooltip>
           <el-tooltip content="详情" placement="top">
             <el-button link type="primary" icon="View" @click="handleDetail(scope.row)"></el-button>
           </el-tooltip>
-          <el-tooltip content="删除" placement="top">
+          <el-tooltip content="删除" placement="top" v-if="scope.row.status === '0'">
             <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['hazard:tbusihazardreport:remove']"></el-button>
           </el-tooltip>
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -77,6 +88,13 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="备注" prop="remark">
+              <el-input v-model="form.remark" type="textarea" placeholder="请输入备注" />
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
@@ -89,10 +107,13 @@
     <!-- 上报详情对话框 -->
     <el-dialog title="上报详情" v-model="detailOpen" width="600px" append-to-body>
       <el-descriptions :column="2" border>
-        <el-descriptions-item label="上报状态">{{ detailRow.status }}</el-descriptions-item>
+        <el-descriptions-item label="上报状态">
+          <dict-tag :options="report_status" :value="detailRow.status" />
+        </el-descriptions-item>
         <el-descriptions-item label="创建人">{{ detailRow.createPer }}</el-descriptions-item>
         <el-descriptions-item label="创建时间">{{ detailRow.createTime }}</el-descriptions-item>
         <el-descriptions-item label="更新时间">{{ detailRow.updateTime }}</el-descriptions-item>
+        <el-descriptions-item label="退回原因" :span="2" v-if="detailRow.status === '3'">{{ detailRow.remark }}</el-descriptions-item>
       </el-descriptions>
       <template #footer>
         <el-button @click="detailOpen = false">关 闭</el-button>
@@ -103,8 +124,11 @@
 
 <script setup name="TBusiHazardReport">
 import { listTBusiHazardReport, getTBusiHazardReport, delTBusiHazardReport, addTBusiHazardReport, updateTBusiHazardReport } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listTBusiHazIden } from "@/api/slaj/hazard"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { report_status } = proxy.useDict("report_status")
 
@@ -200,6 +224,41 @@ function handleUpdate(row) {
   })
 }
 
+/** 提交审核 */
+function handleSubmitReport(row) {
+  proxy.$modal.confirm('确认提交上报编号为"' + row.guid + '"的审核?').then(function () {
+    return updateTBusiHazardReport({ guid: row.guid, status: '1' })
+  }).then(() => {
+    proxy.$modal.msgSuccess("提交成功,等待审核")
+    getList()
+  }).catch(() => {})
+}
+
+/** 审核通过 */
+function handleApprove(row) {
+  proxy.$modal.confirm('确认审核通过该上报?').then(function () {
+    return updateTBusiHazardReport({ guid: row.guid, status: '2' })
+  }).then(() => {
+    proxy.$modal.msgSuccess("审核通过")
+    getList()
+  }).catch(() => {})
+}
+
+/** 审核退回 */
+function handleReject(row) {
+  proxy.$modal.prompt("请输入退回原因", "审核退回", {
+    confirmButtonText: "确认退回",
+    cancelButtonText: "取消",
+    inputPattern: /.+/,
+    inputErrorMessage: "退回原因不能为空"
+  }).then(({ value }) => {
+    return updateTBusiHazardReport({ guid: row.guid, status: '3', remark: value })
+  }).then(() => {
+    proxy.$modal.msgSuccess("已退回")
+    getList()
+  }).catch(() => {})
+}
+
 /** 详情按钮操作 */
 function handleDetail(row) {
   detailRow.value = row
@@ -251,8 +310,9 @@ function reset() {
     guid: undefined,
     hazIdenGuid: undefined,
     orgGuid: undefined,
-    status: undefined,
+    status: '0',
     wiunGuid: undefined,
+    remark: undefined,
     createPer: undefined,
     updatePer: undefined,
     createTime: undefined,

+ 7 - 2
gw-ui/src/views/slaj/hazard/stat.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="年份" prop="year">
         <el-select v-model="queryParams.year" placeholder="请选择年份" clearable style="width: 240px">
@@ -96,7 +96,8 @@
               <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['hazard:tbusihazcountmon:export']">导出</el-button>
             </div>
           </template>
-          <el-table v-loading="loading" :data="countMonList" @row-click="handleRowClick">
+          <div class="table-wrapper">
+          <el-table :height="tableHeight" v-loading="loading" :data="countMonList" @row-click="handleRowClick">
             <el-table-column label="年份" align="center" prop="year" />
             <el-table-column label="月份" align="center" prop="mon" />
             <el-table-column label="应辨识总数" align="center" prop="ybsNum" />
@@ -108,6 +109,7 @@
             <el-table-column label="重大管控数" align="center" prop="zdGkHaz" />
             <el-table-column label="总管控率(%)" align="center" prop="totGkl" />
           </el-table>
+          </div>
           <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
         </el-card>
       </el-tab-pane>
@@ -148,10 +150,13 @@
 
 <script setup name="HazardStat">
 import { ref, onMounted, onUnmounted, nextTick } from 'vue'
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listTBusiHazCount, listTBusiHazCountMon } from "@/api/slaj/hazard"
 import { listObjHaz } from "@/api/slaj/hazard"
 import * as echarts from "echarts"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { haz_grad, haz_stat, risk_grad } = proxy.useDict("haz_grad", "haz_stat", "risk_grad")
 

+ 225 - 0
gw-ui/src/views/slaj/hazard/supervise.vue

@@ -0,0 +1,225 @@
+<template>
+  <div ref="containerRef" class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="80px">
+      <el-form-item label="危险源名称" prop="hazName">
+        <el-input v-model="queryParams.hazName" placeholder="请输入危险源名称" clearable style="width: 200px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="所属单位" prop="orgGuid">
+        <el-input v-model="queryParams.orgGuid" placeholder="请输入所属单位" clearable style="width: 200px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="危险源等级" prop="hiddGrad">
+        <el-select v-model="queryParams.hiddGrad" placeholder="请选择危险源等级" clearable style="width: 150px">
+          <el-option v-for="dict in haz_grad" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['hazard:objhaz:export']">导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-supervise-index"></right-toolbar>
+    </el-row>
+
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="hazList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="危险源名称" align="center" prop="hazName" v-if="columns.hazName.visible" :show-overflow-tooltip="true" />
+      <el-table-column label="危险源等级" align="center" prop="hiddGrad" v-if="columns.hiddGrad.visible">
+        <template #default="scope">
+          <dict-tag :options="haz_grad" :value="scope.row.hiddGrad" />
+        </template>
+      </el-table-column>
+      <el-table-column label="风险等级" align="center" prop="riskGrad" v-if="columns.riskGrad.visible">
+        <template #default="scope">
+          <dict-tag :options="risk_grad" :value="scope.row.riskGrad" />
+        </template>
+      </el-table-column>
+      <el-table-column label="涉及部位" align="center" prop="proPart" v-if="columns.proPart.visible" :show-overflow-tooltip="true" />
+      <el-table-column label="报送时间" align="center" prop="collTime" v-if="columns.collTime.visible" width="180" />
+      <el-table-column label="监管单位" align="center" prop="supOrg" v-if="columns.supOrg.visible" />
+      <el-table-column label="监管责任人" align="center" prop="supPers" v-if="columns.supPers.visible" />
+      <el-table-column label="责任人电话" align="center" prop="offiTel" v-if="columns.offiTel.visible" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200">
+        <template #default="scope">
+          <el-tooltip content="设置监管责任人" placement="top" v-if="!scope.row.supPers">
+            <el-button link type="warning" icon="User" @click="handleSupervise(scope.row)">设置监管</el-button>
+          </el-tooltip>
+          <el-tooltip content="查看详情" placement="top">
+            <el-button link type="primary" icon="View" @click="handleDetail(scope.row)">详情</el-button>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+    </el-table>
+    </div>
+
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+
+    <!-- 设置监管责任人对话框 -->
+    <el-dialog title="重大危险源监管" v-model="superviseOpen" width="600px" append-to-body>
+      <el-form :model="superviseForm" :rules="superviseRules" ref="superviseRef" label-width="120px">
+        <el-alert title="正在对以下危险源设置监管责任人" type="info" :closable="false" show-icon style="margin-bottom: 16px" />
+        <el-descriptions :column="1" border style="margin-bottom: 16px">
+          <el-descriptions-item label="危险源名称">{{ currentHaz.hazName }}</el-descriptions-item>
+          <el-descriptions-item label="危险源等级">
+            <dict-tag :options="haz_grad" :value="currentHaz.hiddGrad" />
+          </el-descriptions-item>
+        </el-descriptions>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="监管责任人" prop="supPers">
+              <el-input v-model="superviseForm.supPers" placeholder="请输入监管责任人" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="责任人电话" prop="offiTel">
+              <el-input v-model="superviseForm.offiTel" placeholder="请输入责任人电话" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="监管单位" prop="supOrg">
+              <el-input v-model="superviseForm.supOrg" placeholder="请输入监管单位" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="监管时间" prop="supTime">
+              <el-date-picker v-model="superviseForm.supTime" type="date" placeholder="请选择监管时间" value-format="YYYY-MM-DD" style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitSupervise">确认监管</el-button>
+          <el-button @click="superviseOpen = false">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="HazardSupervise">
+import { listObjHaz, updateObjHaz } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
+
+const { proxy } = getCurrentInstance()
+const { haz_grad, risk_grad } = proxy.useDict("haz_grad", "risk_grad")
+
+const hazList = ref([])
+const loading = ref(true)
+const showSearch = ref(true)
+const ids = ref([])
+const total = ref(0)
+const dateRange = ref([])
+
+const superviseOpen = ref(false)
+const currentHaz = ref({})
+const superviseForm = ref({})
+const superviseRules = {
+  supPers: [{ required: true, message: "监管责任人不能为空", trigger: "blur" }],
+  offiTel: [{ required: true, message: "责任人电话不能为空", trigger: "blur" }]
+}
+
+const columns = ref({
+  hazName: { label: '危险源名称', visible: true },
+  hiddGrad: { label: '危险源等级', visible: true },
+  riskGrad: { label: '风险等级', visible: true },
+  proPart: { label: '涉及部位', visible: true },
+  collTime: { label: '报送时间', visible: true },
+  supOrg: { label: '监管单位', visible: true },
+  supPers: { label: '监管责任人', visible: true },
+  offiTel: { label: '责任人电话', visible: true }
+})
+
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    hazName: undefined,
+    hiddGrad: undefined,
+    orgGuid: undefined,
+    hazStat: '1'
+  }
+})
+
+const { queryParams } = toRefs(data)
+
+/** 查询已报送危险源列表 */
+function getList() {
+  loading.value = true
+  listObjHaz(proxy.addDateRange(queryParams.value, dateRange.value)).then(res => {
+    loading.value = false
+    hazList.value = res.rows
+    total.value = res.total
+  })
+}
+
+function handleQuery() {
+  queryParams.value.pageNum = 1
+  getList()
+}
+
+function resetQuery() {
+  dateRange.value = []
+  proxy.resetForm("queryRef")
+  handleQuery()
+}
+
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.guid)
+}
+
+/** 打开监管对话框 */
+function handleSupervise(row) {
+  currentHaz.value = row
+  superviseForm.value = {
+    supPers: row.supPers || '',
+    offiTel: row.offiTel || '',
+    supOrg: row.supOrg || '',
+    supTime: ''
+  }
+  superviseOpen.value = true
+}
+
+/** 提交监管 */
+function submitSupervise() {
+  proxy.$refs["superviseRef"].validate(valid => {
+    if (!valid) return
+    const data = {
+      guid: currentHaz.value.guid,
+      supPers: superviseForm.value.supPers,
+      offiTel: superviseForm.value.offiTel,
+      supOrg: superviseForm.value.supOrg,
+      supTime: superviseForm.value.supTime,
+      hazStat: '2'
+    }
+    updateObjHaz(data).then(res => {
+      proxy.$modal.msgSuccess("监管设置成功")
+      superviseOpen.value = false
+      getList()
+    })
+  })
+}
+
+function handleDetail(row) {
+  proxy.$router.push({ path: '/slaj/hazard/detail', query: { guid: row.guid } })
+}
+
+function handleExport() {
+  proxy.download("hazard/objhaz/export", {
+    ...queryParams.value
+  }, `supervise_${new Date().getTime()}.xlsx`)
+}
+
+onMounted(() => {
+  getList()
+})
+</script>

+ 7 - 2
gw-ui/src/views/slaj/hazard/warm.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="预警等级" prop="warmLevel">
         <el-select v-model="queryParams.warmLevel" placeholder="请选择预警等级" clearable style="width: 240px">
@@ -31,7 +31,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-tbusihazardwarm-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="warmList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="warmList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="预警等级" align="center" prop="warmLevel" v-if="columns.warmLevel.visible">
         <template #default="scope">
@@ -58,6 +59,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -149,8 +151,11 @@
 
 <script setup name="TBusiHazardWarm">
 import { listTBusiHazardWarm, getTBusiHazardWarm, delTBusiHazardWarm, addTBusiHazardWarm, updateTBusiHazardWarm } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listObjHaz } from "@/api/slaj/hazard"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { warm_level } = proxy.useDict("warm_level")
 

+ 7 - 2
gw-ui/src/views/slaj/hazard/writeOff.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="核销编号" prop="writeCode">
         <el-input v-model="queryParams.writeCode" placeholder="请输入核销编号" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -34,7 +34,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hazard-bishazmajregwrit-writeoff"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="writeOffList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="writeOffList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="核销编号" align="center" prop="writeCode" v-if="columns.writeCode.visible" :show-overflow-tooltip="true" />
       <el-table-column label="备案编号" align="center" prop="regCode" v-if="columns.regCode.visible" :show-overflow-tooltip="true" />
@@ -60,6 +61,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -121,8 +123,11 @@
 
 <script setup name="HazardWriteOff">
 import { listBisHazMajRegWrit, getBisHazMajRegWrit, delBisHazMajRegWrit, addBisHazMajRegWrit, updateBisHazMajRegWrit } from "@/api/slaj/hazard"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listObjHaz } from "@/api/slaj/hazard"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { haz_write_stat } = proxy.useDict("haz_write_stat")
 

+ 7 - 2
gw-ui/src/views/slaj/hidd/cancel.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="隐患名称" prop="hiddName">
         <el-input v-model="queryParams.hiddName" placeholder="请输入隐患名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -27,7 +27,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hidd-cancel-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="objHiddList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="objHiddList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="隐患名称" align="center" prop="hiddName" v-if="columns.hiddName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="隐患等级" align="center" prop="hiddGrad" v-if="columns.hiddGrad.visible">
@@ -58,6 +59,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -117,6 +119,9 @@
 
 <script setup name="HiddCancel">
 import { listObjHidd, getObjHidd, updateObjHidd } from "@/api/slaj/hidd"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { hidd_grad, hidd_stat, hidd_clas } = proxy.useDict("hidd_grad", "hidd_stat", "hidd_clas")

+ 27 - 3
gw-ui/src/views/slaj/hidd/collect.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="隐患名称" prop="hiddName">
         <el-input v-model="queryParams.hiddName" placeholder="请输入隐患名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -45,7 +45,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hidd-collect-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="objHiddList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="objHiddList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="隐患名称" align="center" prop="hiddName" v-if="columns.hiddName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="隐患等级" align="center" prop="hiddGrad" v-if="columns.hiddGrad.visible">
@@ -83,6 +84,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -118,6 +120,13 @@
           </el-col>
         </el-row>
         <el-row>
+          <el-col :span="12">
+            <el-form-item label="关联危险源" prop="hazGuid">
+              <el-select v-model="form.hazGuid" placeholder="请选择关联危险源" filterable clearable>
+                <el-option v-for="item in hazOptions" :key="item.guid" :label="item.hazName" :value="item.guid" />
+              </el-select>
+            </el-form-item>
+          </el-col>
           <el-col :span="12">
             <el-form-item label="涉及部位" prop="proPart">
               <el-input v-model="form.proPart" placeholder="请输入涉及部位" />
@@ -287,11 +296,24 @@
 
 <script setup name="HiddCollect">
 import { listObjHidd, getObjHidd, delObjHidd, addObjHidd, updateObjHidd } from "@/api/slaj/hidd"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { delBisHiddRectProg } from "@/api/slaj/hidd"
+import { listObjHaz } from "@/api/slaj/hazard"
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { hidd_grad, hidd_stat, hidd_clas } = proxy.useDict("hidd_grad", "hidd_stat", "hidd_clas")
 
+const hazOptions = ref([])
+
+/** 查询危险源下拉选项 */
+function getHazOptions() {
+  listObjHaz({ pageNum: 1, pageSize: 1000 }).then(res => {
+    hazOptions.value = res.rows
+  })
+}
+
 const objHiddList = ref([])
 const open = ref(false)
 const loading = ref(true)
@@ -547,12 +569,14 @@ function reset() {
     groupGuid: undefined,
     temp: undefined,
     toDate: undefined,
-    dictGuid: undefined
+    dictGuid: undefined,
+    hazGuid: undefined
   }
   proxy.resetForm("objHiddRef")
 }
 
 onMounted(() => {
   getList()
+  getHazOptions()
 })
 </script>

+ 7 - 2
gw-ui/src/views/slaj/hidd/consult.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="隐患名称" prop="hiddName">
         <el-input v-model="queryParams.hiddName" placeholder="请输入隐患名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -32,7 +32,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hidd-consult-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="consultList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="consultList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="隐患名称" align="center" prop="hiddName" v-if="columns.hiddName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="会商主题" align="center" prop="consTheme" v-if="columns.consTheme.visible" :show-overflow-tooltip="true" />
@@ -54,6 +55,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -140,6 +142,9 @@
 
 <script setup name="HiddConsult">
 import { listObjCons, getObjCons, delObjCons, addObjCons, updateObjCons } from "@/api/slaj/hidd"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 

+ 13 - 7
gw-ui/src/views/slaj/hidd/detail.vue

@@ -92,11 +92,17 @@
       <template #header>
         <div class="card-header">
           <span>整改进展信息</span>
-          <el-button type="primary" plain icon="Plus" @click="handleAddRectProg" v-hasPermi="['hidd:objhidd:edit']">新增进展</el-button>
+          <div>
+            <el-button type="primary" plain icon="List" @click="handleViewRectProg" v-hasPermi="['hidd:objhidd:edit']">查看全部</el-button>
+            <el-button type="primary" plain icon="Plus" @click="handleAddRectProg" v-hasPermi="['hidd:objhidd:edit']">新增进展</el-button>
+          </div>
         </div>
       </template>
       <el-table v-loading="rectProgLoading" :data="rectProgList">
+        <el-table-column label="序号" type="index" width="60" align="center" />
         <el-table-column label="整改进展" align="center" prop="rectProg" :show-overflow-tooltip="true" />
+        <el-table-column label="记录人" align="center" prop="recPers" />
+        <el-table-column label="记录时间" align="center" prop="collTime" width="180" />
       </el-table>
     </el-card>
 
@@ -375,12 +381,7 @@ function getRecRepList() {
 
 /** 隐患核实按钮 */
 function handleVerify() {
-  verifyForm.value = {
-    hiddGuid: form.value.guid,
-    veriResu: undefined,
-    veriAdvi: undefined
-  }
-  verifyOpen.value = true
+  proxy.$router.push({ path: '/slaj/hidd/verify', query: { guid: form.value.guid } })
 }
 
 /** 提交核实 */
@@ -463,6 +464,11 @@ function handleAddRectProg() {
   proxy.$router.push({ path: '/slaj/hidd/rectProgAdd', query: { hiddGuid: form.value.guid } })
 }
 
+/** 查看全部进展 */
+function handleViewRectProg() {
+  proxy.$router.push({ path: '/slaj/hidd/rectProgList', query: { hiddGuid: form.value.guid } })
+}
+
 /** 返回列表 */
 function goBack() {
   proxy.$router.push({ path: '/slaj/hidd/index' })

+ 7 - 2
gw-ui/src/views/slaj/hidd/detailCount.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="统计年份" prop="statYear">
         <el-date-picker v-model="queryParams.statYear" type="year" placeholder="选择年份" value-format="YYYY" />
@@ -35,7 +35,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hidd-detailcount-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="detailCountList">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="detailCountList">
       <el-table-column label="机构名称" align="center" prop="orgName" :show-overflow-tooltip="true" />
       <el-table-column label="统计年份" align="center" prop="statYear" />
       <el-table-column label="统计月份" align="center" prop="statMonth" />
@@ -65,6 +66,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
   </div>
@@ -72,6 +74,9 @@
 
 <script setup name="HiddDetailCount">
 import { listObjHidd } from "@/api/slaj/hidd"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { hidd_grad, hidd_stat, hidd_clas } = proxy.useDict("hidd_grad", "hidd_stat", "hidd_clas")

+ 4 - 2
gw-ui/src/views/slaj/hidd/eva.vue

@@ -1,11 +1,11 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="auto">
       <el-form-item label="统计年份" prop="statYear">
         <el-date-picker v-model="queryParams.statYear" type="year" placeholder="选择年份" value-format="YYYY" />
       </el-form-item>
       <el-form-item label="机构名称" prop="orgGuid">
-        <el-input v-model="queryParams.orgGuid" placeholder="请输入机构名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
+        <el-input v-model="queryParams.orgGuid" placeholder="请输入机构名称" clearable style="width: 180px" @keyup.enter="handleQuery" />
       </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -62,6 +62,7 @@
       </el-col>
     </el-row>
 
+    <div class="table-wrapper">
     <el-table v-loading="loading" :data="hiddEvaList">
       <el-table-column label="机构名称" align="center" prop="orgGuid" :show-overflow-tooltip="true" />
       <el-table-column label="统计年份" align="center" prop="statYear" />
@@ -76,6 +77,7 @@
       </el-table-column>
       <el-table-column label="评分" align="center" prop="score" />
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
   </div>

+ 7 - 2
gw-ui/src/views/slaj/hidd/fast.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="上报期间" prop="repPeri">
         <el-input v-model="queryParams.repPeri" placeholder="请输入上报期间" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -28,7 +28,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hidd-fast-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="monRepPeriList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="monRepPeriList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="上报单位" align="center" prop="repOrgGuid" v-if="columns.repOrgGuid.visible" :show-overflow-tooltip="true" />
       <el-table-column label="上报期间" align="center" prop="repPeri" v-if="columns.repPeri.visible" />
@@ -52,6 +53,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -122,8 +124,11 @@
 
 <script setup name="HiddFast">
 import { listBisOrgMonRepPeri, getBisOrgMonRepPeri, delBisOrgMonRepPeri, addBisOrgMonRepPeri, updateBisOrgMonRepPeri } from "@/api/slaj/hidd"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { addObjHidd } from "@/api/slaj/hidd"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { rep_stat, hidd_grad, hidd_clas } = proxy.useDict("rep_stat", "hidd_grad", "hidd_clas")
 

+ 23 - 3
gw-ui/src/views/slaj/hidd/gis.vue

@@ -142,7 +142,7 @@ function initMap() {
         coordinateSystem: 'geo',
         data: [],
         symbolSize: function(val) {
-          return val[2] / 10
+          return Math.max(6, val[2] / 10)
         },
         label: {
           show: false
@@ -157,6 +157,27 @@ function initMap() {
   }
   
   map.setOption(option)
+  map.on('click', (params) => {
+    if (params.data && params.data.data) {
+      detailData.value = params.data.data
+      detailOpen.value = true
+    }
+  })
+}
+
+/** 加载中国地图数据 */
+function loadMap() {
+  fetch('https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json')
+    .then(res => res.json())
+    .then(chinaJson => {
+      echarts.registerMap('china', chinaJson)
+      initMap()
+      loadMapData()
+    })
+    .catch(() => {
+      initMap()
+      loadMapData()
+    })
 }
 
 /** 加载地图数据 */
@@ -230,8 +251,7 @@ function handleDetail() {
 }
 
 onMounted(() => {
-  initMap()
-  loadMapData()
+  loadMap()
   
   window.addEventListener('resize', () => {
     map?.resize()

+ 7 - 2
gw-ui/src/views/slaj/hidd/hiddImple.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="隐患名称" prop="hiddName">
         <el-input v-model="queryParams.hiddName" placeholder="请输入隐患名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -26,7 +26,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hidd-rectimpl-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="implList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="implList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="实施时间" align="center" prop="collTime" v-if="columns.collTime.visible" width="180" />
       <el-table-column label="实施内容" align="center" prop="corrMeas" v-if="columns.corrMeas.visible" :show-overflow-tooltip="true" />
@@ -47,6 +48,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -101,8 +103,11 @@
 
 <script setup name="BisHiddRectImpl">
 import { listBisHiddRectImpl, getBisHiddRectImpl, delBisHiddRectImpl, addBisHiddRectImpl, updateBisHiddRectImpl } from "@/api/slaj/hidd"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listObjHidd } from "@/api/slaj/hidd"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { hidd_stat } = proxy.useDict("hidd_stat")
 

+ 107 - 29
gw-ui/src/views/slaj/hidd/index.vue

@@ -1,25 +1,37 @@
 <template>
-  <div class="app-container">
-    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+  <div ref="containerRef" class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="auto">
       <el-form-item label="隐患名称" prop="hiddName">
-        <el-input v-model="queryParams.hiddName" placeholder="请输入隐患名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
+        <el-input v-model="queryParams.hiddName" placeholder="请输入隐患名称" clearable style="width: 180px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="所属单位" prop="orgGuid">
+        <el-input v-model="queryParams.orgGuid" placeholder="请输入所属单位" clearable style="width: 180px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="所属工程" prop="engGuid">
+        <el-input v-model="queryParams.engGuid" placeholder="请输入所属工程" clearable style="width: 180px" @keyup.enter="handleQuery" />
       </el-form-item>
       <el-form-item label="隐患等级" prop="hiddGrad">
-        <el-select v-model="queryParams.hiddGrad" placeholder="请选择隐患等级" clearable style="width: 240px">
+        <el-select v-model="queryParams.hiddGrad" placeholder="请选择隐患等级" clearable style="width: 150px">
           <el-option v-for="dict in hidd_grad" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="隐患状态" prop="hiddStat">
-        <el-select v-model="queryParams.hiddStat" placeholder="请选择隐患状态" clearable style="width: 240px">
+        <el-select v-model="queryParams.hiddStat" placeholder="请选择隐患状态" clearable style="width: 150px">
           <el-option v-for="dict in hidd_stat" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
       <el-form-item label="隐患来源" prop="hiddSour">
-        <el-select v-model="queryParams.hiddSour" placeholder="请选择隐患来源" clearable style="width: 240px">
+        <el-select v-model="queryParams.hiddSour" placeholder="请选择隐患来源" clearable style="width: 150px">
           <el-option v-for="dict in hidd_sour" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
-      <el-form-item label="采集时间" style="width: 308px">
+      <el-form-item label="隐患类型" prop="hiddSort">
+        <el-select v-model="queryParams.hiddSort" placeholder="请选择隐患类型" clearable style="width: 150px">
+          <el-option label="工程隐患" value="1" />
+          <el-option label="非工程隐患" value="2" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="采集时间">
         <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
       </el-form-item>
       <el-form-item>
@@ -39,17 +51,23 @@
         <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['hidd:objhidd:remove']">删除</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['hidd:objhidd:export']">导出</el-button>
+        <el-button type="warning" plain icon="Promotion" :disabled="single" @click="handleReport" v-hasPermi="['hidd:objhidd:edit']">上报</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button type="info" plain icon="Search" @click="handleNameMatch" v-hasPermi="['hidd:objhidd:query']">名称匹配</el-button>
+        <el-button type="info" plain icon="Tools" :disabled="single" @click="handleRectify" v-hasPermi="['hidd:objhidd:edit']">整改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['hidd:objhidd:export']">导出</el-button>
       </el-col>
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hidd-objhidd-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="objHiddList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="objHiddList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="隐患名称" align="center" prop="hiddName" v-if="columns.hiddName.visible" :show-overflow-tooltip="true" />
+      <el-table-column label="所属工程" align="center" prop="engName" v-if="columns.engName.visible" :show-overflow-tooltip="true" />
+      <el-table-column label="隐患发生单位" align="center" prop="orgName" v-if="columns.orgName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="隐患等级" align="center" prop="hiddGrad" v-if="columns.hiddGrad.visible">
         <template #default="scope">
           <dict-tag :options="hidd_grad" :value="scope.row.hiddGrad" />
@@ -71,22 +89,30 @@
         </template>
       </el-table-column>
       <el-table-column label="涉及部位" align="center" prop="proPart" v-if="columns.proPart.visible" :show-overflow-tooltip="true" />
+      <el-table-column label="隐患描述" align="center" prop="otlcolQiffFnvu" v-if="columns.otlcolQiffFnvu.visible" :show-overflow-tooltip="true" />
       <el-table-column label="采集时间" align="center" prop="collTime" v-if="columns.collTime.visible" width="180" />
       <el-table-column label="记录人" align="center" prop="recPers" v-if="columns.recPers.visible" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="250">
         <template #default="scope">
-          <el-tooltip content="修改" placement="top">
+          <el-tooltip content="修改" placement="top" v-if="scope.row.hiddStat === '0' && scope.row.recPers === String(userId)">
             <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['hidd:objhidd:edit']"></el-button>
           </el-tooltip>
           <el-tooltip content="详情" placement="top">
             <el-button link type="primary" icon="View" @click="handleDetail(scope.row)"></el-button>
           </el-tooltip>
-          <el-tooltip content="删除" placement="top">
+          <el-tooltip content="上报" placement="top" v-if="scope.row.hiddStat === '0'">
+            <el-button link type="success" icon="Promotion" @click="handleReport(scope.row)" v-hasPermi="['hidd:objhidd:edit']"></el-button>
+          </el-tooltip>
+          <el-tooltip content="整改" placement="top" v-if="scope.row.hiddStat !== '2'">
+            <el-button link type="warning" icon="Tools" @click="handleRectify(scope.row)" v-hasPermi="['hidd:objhidd:edit']"></el-button>
+          </el-tooltip>
+          <el-tooltip content="删除" placement="top" v-if="scope.row.hiddStat === '0'">
             <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['hidd:objhidd:remove']"></el-button>
           </el-tooltip>
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -124,6 +150,13 @@
           </el-col>
         </el-row>
         <el-row>
+          <el-col :span="12">
+            <el-form-item label="关联危险源" prop="hazGuid">
+              <el-select v-model="form.hazGuid" placeholder="请选择关联危险源" filterable clearable>
+                <el-option v-for="item in hazOptions" :key="item.guid" :label="item.hazName" :value="item.guid" />
+              </el-select>
+            </el-form-item>
+          </el-col>
           <el-col :span="12">
             <el-form-item label="涉及部位" prop="proPart">
               <el-input v-model="form.proPart" placeholder="请输入涉及部位" />
@@ -176,10 +209,27 @@
 
 <script setup name="ObjHidd">
 import { listObjHidd, getObjHidd, delObjHidd, addObjHidd, updateObjHidd } from "@/api/slaj/hidd"
+import { useTableHeight } from '@/hooks/useTableHeight'
+import { listObjHaz } from "@/api/slaj/hazard"
+
+const { tableHeight, containerRef } = useTableHeight()
+
+import useUserStore from '@/store/modules/user'
+
+const userStore = useUserStore()
+const userId = computed(() => userStore.id)
 
 const { proxy } = getCurrentInstance()
 const { hidd_grad, hidd_stat, hidd_sour, hidd_clas } = proxy.useDict("hidd_grad", "hidd_stat", "hidd_sour", "hidd_clas")
 
+const hazOptions = ref([])
+
+function getHazOptions() {
+  listObjHaz({ pageNum: 1, pageSize: 1000 }).then(res => {
+    hazOptions.value = res.rows
+  })
+}
+
 const objHiddList = ref([])
 const open = ref(false)
 const loading = ref(true)
@@ -193,11 +243,14 @@ const dateRange = ref([])
 
 const columns = ref({
   hiddName: { label: '隐患名称', visible: true },
+  engName: { label: '所属工程', visible: true },
+  orgName: { label: '隐患发生单位', visible: true },
   hiddGrad: { label: '隐患等级', visible: true },
   hiddClas: { label: '隐患类别', visible: true },
   hiddStat: { label: '隐患状态', visible: true },
   hiddSour: { label: '隐患来源', visible: true },
   proPart: { label: '涉及部位', visible: true },
+  otlcolQiffFnvu: { label: '隐患描述', visible: true },
   collTime: { label: '采集时间', visible: true },
   recPers: { label: '记录人', visible: true }
 })
@@ -211,7 +264,9 @@ const data = reactive({
     hiddGrad: undefined,
     hiddStat: undefined,
     hiddSour: undefined,
-    orgGuid: undefined
+    orgGuid: undefined,
+    engGuid: undefined,
+    hiddSort: undefined
   },
   rules: {
     hiddName: [{ required: true, message: "隐患名称不能为空", trigger: "blur" }],
@@ -261,8 +316,19 @@ function handleAdd() {
 
 /** 修改按钮操作 */
 function handleUpdate(row) {
-  reset()
   const guid = row.guid || ids.value
+  if (row && row.hiddStat && row.hiddStat !== '0') {
+    proxy.$modal.msgWarning("已上报的隐患不可修改")
+    return
+  }
+  if (!row) {
+    const selected = objHiddList.value.find(item => item.guid === ids.value[0])
+    if (selected && selected.hiddStat && selected.hiddStat !== '0') {
+      proxy.$modal.msgWarning("已上报的隐患不可修改")
+      return
+    }
+  }
+  reset()
   getObjHidd(guid).then(response => {
     form.value = response.data
     open.value = true
@@ -276,6 +342,23 @@ function handleDetail(row) {
   proxy.$router.push({ path: '/slaj/hidd/detail', query: { guid: guid } })
 }
 
+/** 上报按钮操作 */
+function handleReport(row) {
+  const guid = row.guid || ids.value
+  proxy.$modal.confirm('是否确认将该隐患上报?').then(function () {
+    return updateObjHidd({ guid: guid, hiddStat: '1' })
+  }).then(() => {
+    getList()
+    proxy.$modal.msgSuccess("上报成功")
+  }).catch(() => {})
+}
+
+/** 整改按钮操作 */
+function handleRectify(row) {
+  const guid = row.guid || ids.value
+  proxy.$router.push({ path: '/slaj/hidd/detail', query: { guid: guid, tab: 'rectify' } })
+}
+
 /** 提交按钮 */
 function submitForm() {
   proxy.$refs["objHiddRef"].validate(valid => {
@@ -297,22 +380,15 @@ function submitForm() {
   })
 }
 
-/** 隐患名称匹配查询 */
-function handleNameMatch() {
-  proxy.$prompt('请输入隐患名称关键词', "名称匹配查询", {
-    confirmButtonText: "确定",
-    cancelButtonText: "取消",
-  }).then(({ value }) => {
-    if (value) {
-      queryParams.value.hiddName = value
-      handleQuery()
-    }
-  }).catch(() => {})
-}
-
 /** 删除按钮操作 */
 function handleDelete(row) {
   const guids = row.guid || ids.value
+  const selection = objHiddList.value.filter(item => guids.includes(item.guid))
+  const hasReported = selection.some(item => item.hiddStat !== '0')
+  if (hasReported) {
+    proxy.$modal.msgError("已上报的隐患不允许删除")
+    return
+  }
   proxy.$modal.confirm('是否确认删除隐患编号为"' + guids + '"的数据项?').then(function () {
     return delObjHidd(guids)
   }).then(() => {
@@ -365,12 +441,14 @@ function reset() {
     groupGuid: undefined,
     temp: undefined,
     toDate: undefined,
-    dictGuid: undefined
+    dictGuid: undefined,
+    hazGuid: undefined
   }
   proxy.resetForm("objHiddRef")
 }
 
 onMounted(() => {
   getList()
+  getHazOptions()
 })
 </script>

+ 73 - 6
gw-ui/src/views/slaj/hidd/month.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="上报单位" prop="repOrgGuid">
         <el-input v-model="queryParams.repOrgGuid" placeholder="请输入上报单位" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -31,16 +31,26 @@
       <el-col :span="1.5">
         <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['hidd:monrepperi:export']">导出</el-button>
       </el-col>
+      <el-col :span="1.5">
+        <el-button type="info" plain icon="Unlock" @click="handleUnlock" v-hasPermi="['hidd:monrepperi:edit']">一键解锁</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="Bell" :disabled="multiple" @click="handleUrge" v-hasPermi="['hidd:monrepperi:edit']">督促上报</el-button>
+      </el-col>
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hidd-monrepperi-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="monRepPeriList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="monRepPeriList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="上报单位" align="center" prop="repOrgGuid" v-if="columns.repOrgGuid.visible" :show-overflow-tooltip="true" />
       <el-table-column label="上报期间" align="center" prop="repName" v-if="columns.repName.visible" />
       <el-table-column label="上报状态" align="center" prop="repAct" v-if="columns.repAct.visible">
         <template #default="scope">
-          <dict-tag :options="rep_stat" :value="scope.row.repAct" />
+          <el-tag v-if="scope.row.repAct === '2'" type="success" effect="plain">已上报</el-tag>
+          <el-tag v-else-if="scope.row.repAct === '1'" type="warning" effect="plain">待审批</el-tag>
+          <el-tag v-else-if="scope.row.repAct === '3'" type="danger" effect="plain">已退回</el-tag>
+          <el-tag v-else type="info" effect="plain">未上报</el-tag>
         </template>
       </el-table-column>
       <el-table-column label="上报时间" align="center" prop="repTime" v-if="columns.repTime.visible" width="180" />
@@ -65,6 +75,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -81,7 +92,9 @@
         <el-row>
           <el-col :span="12">
             <el-form-item label="上报期间" prop="repName">
-              <el-input v-model="form.repName" placeholder="请输入上报期间" />
+              <el-select v-model="form.repName" placeholder="请选择上报期间" filterable allow-create>
+                <el-option v-for="m in 12" :key="m" :label="currentYear + '年' + m + '月'" :value="currentYear + '-' + String(m).padStart(2, '0')" />
+              </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -92,6 +105,18 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="开始日期" prop="startDate">
+              <el-date-picker v-model="form.startDate" type="date" placeholder="选择开始日期" value-format="YYYY-MM-DD" style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="结束日期" prop="endDate">
+              <el-date-picker v-model="form.endDate" type="date" placeholder="选择结束日期" value-format="YYYY-MM-DD" style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
         <el-row>
           <el-col :span="24">
             <el-form-item label="退回说明" prop="returnDesc">
@@ -175,11 +200,16 @@
 </template>
 
 <script setup name="BisOrgMonRepPeri">
-import { listBisOrgMonRepPeri, getBisOrgMonRepPeri, delBisOrgMonRepPeri, addBisOrgMonRepPeri, updateBisOrgMonRepPeri } from "@/api/slaj/hidd"
+import { listBisOrgMonRepPeri, getBisOrgMonRepPeri, delBisOrgMonRepPeri, addBisOrgMonRepPeri, updateBisOrgMonRepPeri, batchUnlock, urgeReport } from "@/api/slaj/hidd"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { rep_stat } = proxy.useDict("rep_stat")
 
+const currentYear = new Date().getFullYear()
+
 const monRepPeriList = ref([])
 const open = ref(false)
 const loading = ref(true)
@@ -326,6 +356,41 @@ function submitVerify() {
   })
 }
 
+/** 一键解锁按钮 */
+function handleUnlock() {
+  if (ids.value.length === 0) {
+    proxy.$modal.msgError("请先选择要解锁的月报")
+    return
+  }
+  proxy.$modal.confirm('是否确认对选中的' + ids.value.length + '个月报进行解锁操作?').then(function () {
+    return batchUnlock(ids.value)
+  }).then(() => {
+    getList()
+    proxy.$modal.msgSuccess("解锁成功")
+  }).catch(() => {})
+}
+
+/** 督促上报按钮 */
+function handleUrge() {
+  if (ids.value.length === 0) {
+    proxy.$modal.msgError("请先选择要督促的月报")
+    return
+  }
+  const selection = monRepPeriList.value.filter(item => ids.value.includes(item.guid))
+  const notReported = selection.filter(item => item.repAct === '0')
+  if (notReported.length === 0) {
+    proxy.$modal.msgError("选中的单位均已上报,无需督促")
+    return
+  }
+  const orgGuids = notReported.map(item => item.repOrgGuid).join(',')
+  const repName = notReported[0]?.repName || ''
+  proxy.$modal.confirm('是否确认对' + notReported.length + '个未上报单位进行督促?').then(function () {
+    return urgeReport(orgGuids, repName)
+  }).then(() => {
+    proxy.$modal.msgSuccess("督促通知已发送")
+  }).catch(() => {})
+}
+
 /** 提交按钮 */
 function submitForm() {
   proxy.$refs["monRepPeriRef"].validate(valid => {
@@ -373,7 +438,9 @@ function reset() {
     repName: undefined,
     repAct: undefined,
     repTime: undefined,
-    returnDesc: undefined
+    returnDesc: undefined,
+    startDate: undefined,
+    endDate: undefined
   }
   proxy.resetForm("monRepPeriRef")
 }

+ 74 - 6
gw-ui/src/views/slaj/hidd/nextDep.vue

@@ -5,6 +5,7 @@
         <org-tree @node-click="handleNodeClick" />
       </el-col>
       <el-col :span="18">
+        <div ref="containerRef" class="table-page-wrap">
         <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
           <el-form-item label="隐患名称" prop="hiddName">
             <el-input v-model="queryParams.hiddName" placeholder="请输入隐患名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -35,13 +36,17 @@
           <el-col :span="1.5">
             <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['hidd:objhidd:remove']">删除</el-button>
           </el-col>
+          <el-col :span="1.5">
+            <el-button type="warning" plain icon="Promotion" :disabled="single" @click="handleReport" v-hasPermi="['hidd:objhidd:edit']">上报</el-button>
+          </el-col>
           <el-col :span="1.5">
             <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['hidd:objhidd:export']">导出</el-button>
           </el-col>
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hidd-nextdep-index"></right-toolbar>
         </el-row>
 
-        <el-table v-loading="loading" :data="objHiddList" @selection-change="handleSelectionChange">
+        <div class="table-wrapper">
+        <el-table :height="tableHeight" v-loading="loading" :data="objHiddList" @selection-change="handleSelectionChange">
           <el-table-column type="selection" width="55" align="center" />
           <el-table-column label="隐患名称" align="center" prop="hiddName" v-if="columns.hiddName.visible" :show-overflow-tooltip="true" />
           <el-table-column label="隐患等级" align="center" prop="hiddGrad" v-if="columns.hiddGrad.visible">
@@ -57,22 +62,30 @@
           <el-table-column label="所属单位" align="center" prop="orgGuid" v-if="columns.orgGuid.visible" :show-overflow-tooltip="true" />
           <el-table-column label="涉及部位" align="center" prop="proPart" v-if="columns.proPart.visible" :show-overflow-tooltip="true" />
           <el-table-column label="采集时间" align="center" prop="collTime" v-if="columns.collTime.visible" width="180" />
-          <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="250">
             <template #default="scope">
-              <el-tooltip content="修改" placement="top">
+              <el-tooltip content="修改" placement="top" v-if="scope.row.hiddStat === '0'">
                 <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['hidd:objhidd:edit']"></el-button>
               </el-tooltip>
               <el-tooltip content="详情" placement="top">
                 <el-button link type="primary" icon="View" @click="handleDetail(scope.row)"></el-button>
               </el-tooltip>
-              <el-tooltip content="删除" placement="top">
+              <el-tooltip content="上报" placement="top" v-if="scope.row.hiddStat === '0'">
+                <el-button link type="success" icon="Promotion" @click="handleReport(scope.row)" v-hasPermi="['hidd:objhidd:edit']"></el-button>
+              </el-tooltip>
+              <el-tooltip content="整改" placement="top" v-if="scope.row.hiddStat !== '2'">
+                <el-button link type="warning" icon="Tools" @click="handleRectify(scope.row)" v-hasPermi="['hidd:objhidd:edit']"></el-button>
+              </el-tooltip>
+              <el-tooltip content="删除" placement="top" v-if="scope.row.hiddStat === '0'">
                 <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['hidd:objhidd:remove']"></el-button>
               </el-tooltip>
             </template>
           </el-table-column>
         </el-table>
+        </div>
 
         <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+        </div>
       </el-col>
     </el-row>
 
@@ -129,6 +142,13 @@
               <org-tree-select v-model="form.orgGuid" placeholder="请选择所属单位" />
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="关联危险源" prop="hazGuid">
+              <el-select v-model="form.hazGuid" placeholder="请选择关联危险源" filterable clearable>
+                <el-option v-for="item in hazOptions" :key="item.guid" :label="item.hazName" :value="item.guid" />
+              </el-select>
+            </el-form-item>
+          </el-col>
         </el-row>
         <el-row>
           <el-col :span="24">
@@ -150,11 +170,23 @@
 
 <script setup name="HiddNextDep">
 import { listObjHidd, getObjHidd, delObjHidd, addObjHidd, updateObjHidd } from "@/api/slaj/hidd"
+import { useTableHeight } from '@/hooks/useTableHeight'
+import { listObjHaz } from "@/api/slaj/hazard"
 import OrgTree from "@/components/OrgTree"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { hidd_grad, hidd_stat, hidd_sour, hidd_clas } = proxy.useDict("hidd_grad", "hidd_stat", "hidd_sour", "hidd_clas")
 
+const hazOptions = ref([])
+
+function getHazOptions() {
+  listObjHaz({ pageNum: 1, pageSize: 1000 }).then(res => {
+    hazOptions.value = res.rows
+  })
+}
+
 const objHiddList = ref([])
 const open = ref(false)
 const loading = ref(true)
@@ -232,8 +264,19 @@ function handleAdd() {
 
 /** 修改按钮操作 */
 function handleUpdate(row) {
-  reset()
   const guid = row.guid || ids.value
+  if (row && row.hiddStat && row.hiddStat !== '0') {
+    proxy.$modal.msgWarning("已上报的隐患不可修改")
+    return
+  }
+  if (!row) {
+    const selected = objHiddList.value.find(item => item.guid === ids.value[0])
+    if (selected && selected.hiddStat && selected.hiddStat !== '0') {
+      proxy.$modal.msgWarning("已上报的隐患不可修改")
+      return
+    }
+  }
+  reset()
   getObjHidd(guid).then(response => {
     form.value = response.data
     open.value = true
@@ -247,6 +290,23 @@ function handleDetail(row) {
   proxy.$router.push({ path: '/slaj/hidd/detail', query: { guid: guid } })
 }
 
+/** 上报按钮操作 */
+function handleReport(row) {
+  const guid = row.guid || ids.value
+  proxy.$modal.confirm('是否确认将该隐患上报?').then(function () {
+    return updateObjHidd({ guid: guid, hiddStat: '1' })
+  }).then(() => {
+    getList()
+    proxy.$modal.msgSuccess("上报成功")
+  }).catch(() => {})
+}
+
+/** 整改按钮操作 */
+function handleRectify(row) {
+  const guid = row.guid || ids.value
+  proxy.$router.push({ path: '/slaj/hidd/detail', query: { guid: guid, tab: 'rectify' } })
+}
+
 /** 提交按钮 */
 function submitForm() {
   proxy.$refs["objHiddRef"].validate(valid => {
@@ -271,6 +331,12 @@ function submitForm() {
 /** 删除按钮操作 */
 function handleDelete(row) {
   const guids = row.guid || ids.value
+  const selection = objHiddList.value.filter(item => guids.includes(item.guid))
+  const hasReported = selection.some(item => item.hiddStat !== '0')
+  if (hasReported) {
+    proxy.$modal.msgError("已上报的隐患不允许删除")
+    return
+  }
   proxy.$modal.confirm('是否确认删除隐患编号为"' + guids + '"的数据项?').then(function () {
     return delObjHidd(guids)
   }).then(() => {
@@ -324,12 +390,14 @@ function reset() {
     groupGuid: undefined,
     temp: undefined,
     toDate: undefined,
-    dictGuid: undefined
+    dictGuid: undefined,
+    hazGuid: undefined
   }
   proxy.resetForm("objHiddRef")
 }
 
 onMounted(() => {
   getList()
+  getHazOptions()
 })
 </script>

+ 7 - 2
gw-ui/src/views/slaj/hidd/notice.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="公告标题" prop="noticeTitle">
         <el-input v-model="queryParams.noticeTitle" placeholder="请输入公告标题" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -33,7 +33,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hidd-notice-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="公告标题" align="center" prop="noticeTitle" v-if="columns.noticeTitle.visible" :show-overflow-tooltip="true" />
       <el-table-column label="公告类型" align="center" prop="noticeType" v-if="columns.noticeType.visible">
@@ -62,6 +63,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -129,6 +131,9 @@
 
 <script setup name="HiddNotice">
 import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { notice_type, sys_normal_disable } = proxy.useDict("notice_type", "sys_normal_disable")

+ 7 - 2
gw-ui/src/views/slaj/hidd/portal.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="隐患名称" prop="hiddName">
         <el-input v-model="queryParams.hiddName" placeholder="请输入隐患名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
@@ -73,7 +73,8 @@
       </el-col>
     </el-row>
 
-    <el-table v-loading="loading" :data="objHiddList">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="objHiddList">
       <el-table-column label="隐患名称" align="center" prop="hiddName" v-if="columns.hiddName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="隐患等级" align="center" prop="hiddGrad" v-if="columns.hiddGrad.visible">
         <template #default="scope">
@@ -100,6 +101,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
   </div>
@@ -107,6 +109,9 @@
 
 <script setup name="HiddPortal">
 import { listObjHidd } from "@/api/slaj/hidd"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { hidd_grad, hidd_stat, hidd_clas } = proxy.useDict("hidd_grad", "hidd_stat", "hidd_clas")

+ 156 - 0
gw-ui/src/views/slaj/hidd/rectProgList.vue

@@ -0,0 +1,156 @@
+<template>
+  <div class="app-container">
+    <el-card shadow="never">
+      <template #header>
+        <div class="card-header">
+          <span>整改进展记录</span>
+          <div>
+            <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['hidd:objhidd:edit']">新增进展</el-button>
+            <el-button plain icon="ArrowLeft" @click="goBack">返回</el-button>
+          </div>
+        </div>
+      </template>
+
+      <el-table v-loading="loading" :data="rectProgList">
+        <el-table-column label="序号" type="index" width="60" align="center" />
+        <el-table-column label="整改进展" align="center" prop="rectProg" :show-overflow-tooltip="true" />
+        <el-table-column label="记录人" align="center" prop="recPers" />
+        <el-table-column label="记录时间" align="center" prop="collTime" width="180" />
+        <el-table-column label="备注" align="center" prop="note" :show-overflow-tooltip="true" />
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+
+    <!-- 新增进展对话框 -->
+    <el-dialog title="新增整改进展" v-model="open" width="600px" append-to-body>
+      <el-form :model="form" :rules="rules" ref="rectProgRef" label-width="100px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="整改进展" prop="rectProg">
+              <el-input v-model="form.rectProg" type="textarea" :rows="4" placeholder="请输入整改进展情况" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="记录人" prop="recPers">
+              <el-input v-model="form.recPers" placeholder="请输入记录人" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="记录时间" prop="collTime">
+              <el-date-picker v-model="form.collTime" type="datetime" placeholder="请选择记录时间" value-format="YYYY-MM-DD HH:mm:ss" style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="备注" prop="note">
+              <el-input v-model="form.note" type="textarea" placeholder="请输入备注" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="BisHiddRectProg">
+import { listBisHiddRectProg, addBisHiddRectProg } from "@/api/slaj/hidd"
+
+const { proxy } = getCurrentInstance()
+const route = useRoute()
+const router = useRouter()
+
+const rectProgList = ref([])
+const loading = ref(true)
+const total = ref(0)
+const open = ref(false)
+const title = ref("")
+
+const queryParams = ref({
+  pageNum: 1,
+  pageSize: 10,
+  hiddGuid: undefined
+})
+
+const form = ref({})
+const rules = {
+  rectProg: [{ required: true, message: "整改进展不能为空", trigger: "blur" }],
+  recPers: [{ required: true, message: "记录人不能为空", trigger: "blur" }],
+  collTime: [{ required: true, message: "记录时间不能为空", trigger: "change" }]
+}
+
+/** 查询列表 */
+function getList() {
+  loading.value = true
+  queryParams.value.hiddGuid = route.query.hiddGuid
+  listBisHiddRectProg(queryParams.value).then(res => {
+    loading.value = false
+    rectProgList.value = res.rows
+    total.value = res.total
+  })
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset()
+  open.value = true
+  title.value = "新增整改进展"
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["rectProgRef"].validate(valid => {
+    if (valid) {
+      form.value.hiddGuid = route.query.hiddGuid
+      addBisHiddRectProg(form.value).then(response => {
+        proxy.$modal.msgSuccess("新增成功")
+        open.value = false
+        getList()
+      })
+    }
+  })
+}
+
+/** 取消按钮 */
+function cancel() {
+  open.value = false
+  reset()
+}
+
+/** 重置表单 */
+function reset() {
+  form.value = {
+    rectProg: undefined,
+    recPers: undefined,
+    collTime: undefined,
+    note: undefined
+  }
+  proxy.resetForm("rectProgRef")
+}
+
+/** 返回 */
+function goBack() {
+  router.push({ path: '/slaj/hidd/detail', query: { guid: route.query.hiddGuid } })
+}
+
+onMounted(() => {
+  getList()
+})
+</script>
+
+<style scoped>
+.card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+</style>

+ 7 - 2
gw-ui/src/views/slaj/hidd/revoc.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="时间范围" prop="dateRange">
         <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
@@ -17,7 +17,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hidd-revo-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="revoList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="revoList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="撤销原因" align="center" prop="revoReason" v-if="columns.revoReason.visible" :show-overflow-tooltip="true" />
       <el-table-column label="撤销时间" align="center" prop="revoTime" v-if="columns.revoTime.visible" width="180" />
@@ -35,6 +36,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -78,6 +80,9 @@
 
 <script setup name="BisOrgMonRepRevo">
 import { listBisOrgMonRepRevo, getBisOrgMonRepRevo, updateBisOrgMonRepRevo } from "@/api/slaj/hidd"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { verify_stat } = proxy.useDict("verify_stat")

+ 123 - 30
gw-ui/src/views/slaj/hidd/stat.vue

@@ -1,16 +1,23 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="统计年份" prop="statYear">
         <el-date-picker v-model="queryParams.statYear" type="year" placeholder="选择年份" value-format="YYYY" />
       </el-form-item>
       <el-form-item label="统计月份" prop="statMonth">
-        <el-select v-model="queryParams.statMonth" placeholder="请选择统计月份" clearable style="width: 240px">
+        <el-select v-model="queryParams.statMonth" placeholder="请选择统计月份" clearable style="width: 150px">
           <el-option v-for="item in 12" :key="item" :label="item + '月'" :value="item" />
         </el-select>
       </el-form-item>
-      <el-form-item label="机构名称" prop="orgGuid">
-        <el-input v-model="queryParams.orgGuid" placeholder="请输入机构名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
+      <el-form-item label="单位性质" prop="unitType">
+        <el-select v-model="queryParams.unitType" placeholder="请选择单位性质" clearable style="width: 180px">
+          <el-option label="直属单位" value="1" />
+          <el-option label="流域机构" value="2" />
+          <el-option label="下级水行政部门" value="3" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="机构名称" prop="orgName">
+        <el-input v-model="queryParams.orgName" placeholder="请输入机构名称" clearable style="width: 200px" @keyup.enter="handleQuery" />
       </el-form-item>
       <el-form-item>
         <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -26,7 +33,7 @@
     </el-row>
 
     <el-row :gutter="20" class="mb8">
-      <el-col :span="6">
+      <el-col :span="4">
         <el-card shadow="hover">
           <template #header>
             <div class="card-header">
@@ -36,7 +43,7 @@
           <div class="stat-value">{{ statData.totalHidd }}</div>
         </el-card>
       </el-col>
-      <el-col :span="6">
+      <el-col :span="4">
         <el-card shadow="hover">
           <template #header>
             <div class="card-header">
@@ -46,7 +53,7 @@
           <div class="stat-value" style="color: #67C23A">{{ statData.solvedHidd }}</div>
         </el-card>
       </el-col>
-      <el-col :span="6">
+      <el-col :span="4">
         <el-card shadow="hover">
           <template #header>
             <div class="card-header">
@@ -56,7 +63,7 @@
           <div class="stat-value" style="color: #E6A23C">{{ statData.solvingHidd }}</div>
         </el-card>
       </el-col>
-      <el-col :span="6">
+      <el-col :span="4">
         <el-card shadow="hover">
           <template #header>
             <div class="card-header">
@@ -66,22 +73,81 @@
           <div class="stat-value" style="color: #F56C6C">{{ statData.unsolvedHidd }}</div>
         </el-card>
       </el-col>
+      <el-col :span="4">
+        <el-card shadow="hover">
+          <template #header>
+            <div class="card-header">
+              <span>逾期未整改</span>
+            </div>
+          </template>
+          <div class="stat-value" style="color: #F56C6C">{{ statData.overTimeHidd }}</div>
+        </el-card>
+      </el-col>
+      <el-col :span="4">
+        <el-card shadow="hover">
+          <template #header>
+            <div class="card-header">
+              <span>综合整改率</span>
+            </div>
+          </template>
+          <div class="stat-value" style="color: #409EFF">{{ statData.avgSolveRate }}%</div>
+        </el-card>
+      </el-col>
     </el-row>
 
-    <el-table v-loading="loading" :data="hiddCountList">
-      <el-table-column label="机构名称" align="center" prop="orgGuid" :show-overflow-tooltip="true" />
-      <el-table-column label="统计年份" align="center" prop="statYear" />
-      <el-table-column label="统计月份" align="center" prop="statMonth" />
-      <el-table-column label="隐患总数" align="center" prop="totalHidd" />
-      <el-table-column label="已整改" align="center" prop="solvedHidd" />
-      <el-table-column label="整改中" align="center" prop="solvingHidd" />
-      <el-table-column label="未整改" align="center" prop="unsolvedHidd" />
-      <el-table-column label="整改率" align="center" prop="solveRate">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="hiddCountList">
+      <el-table-column label="机构名称" align="center" prop="orgName" :show-overflow-tooltip="true" min-width="150" />
+      <el-table-column label="隐患总数" align="center" prop="totalHidd" width="90" />
+      <el-table-column label="重大隐患数" align="center" prop="zdHidd" width="100" />
+      <el-table-column label="已整改重大" align="center" prop="zgZdHidd" width="100" />
+      <el-table-column label="整改中重大" align="center" prop="zdSolvingHidd" width="100" />
+      <el-table-column label="未整改重大" align="center" prop="zdUnsolvedHidd" width="100" />
+      <el-table-column label="逾期重大" align="center" prop="zdOverTimeHidd" width="90">
         <template #default="scope">
-          <el-progress :percentage="scope.row.solveRate" :color="scope.row.solveRate >= 80 ? '#67C23A' : scope.row.solveRate >= 60 ? '#E6A23C' : '#F56C6C'"></el-progress>
+          <span :style="{ color: scope.row.zdOverTimeHidd > 0 ? '#F56C6C' : '' }">
+            {{ scope.row.zdOverTimeHidd }}
+          </span>
         </template>
       </el-table-column>
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="100">
+      <el-table-column label="重大整改率" align="center" prop="zdZgl" width="100">
+        <template #default="scope">
+          <span :style="{ color: scope.row.zdZgl >= 80 ? '#67C23A' : scope.row.zdZgl >= 60 ? '#E6A23C' : '#F56C6C' }">
+            {{ scope.row.zdZgl }}%
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="一般隐患数" align="center" prop="ybHidd" width="100" />
+      <el-table-column label="已整改一般" align="center" prop="zgYbHidd" width="100" />
+      <el-table-column label="整改中一般" align="center" prop="ybSolvingHidd" width="100" />
+      <el-table-column label="未整改一般" align="center" prop="ybUnsolvedHidd" width="100" />
+      <el-table-column label="逾期一般" align="center" prop="ybOverTimeHidd" width="90">
+        <template #default="scope">
+          <span :style="{ color: scope.row.ybOverTimeHidd > 0 ? '#F56C6C' : '' }">
+            {{ scope.row.ybOverTimeHidd }}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="一般整改率" align="center" prop="ybZgl" width="100">
+        <template #default="scope">
+          <span :style="{ color: scope.row.ybZgl >= 80 ? '#67C23A' : scope.row.ybZgl >= 60 ? '#E6A23C' : '#F56C6C' }">
+            {{ scope.row.ybZgl }}%
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="综合整改率" align="center" prop="hiddZgl" width="120">
+        <template #default="scope">
+          <el-progress :percentage="scope.row.hiddZgl" :color="scope.row.hiddZgl >= 80 ? '#67C23A' : scope.row.hiddZgl >= 60 ? '#E6A23C' : '#F56C6C'"></el-progress>
+        </template>
+      </el-table-column>
+      <el-table-column label="排查率" align="center" prop="pcl" width="80">
+        <template #default="scope">
+          <span>{{ scope.row.pcl }}%</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="工程总数" align="center" prop="engNum" width="90" />
+      <el-table-column label="有隐患单位" align="center" prop="hiddOrg" width="100" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="80" fixed="right">
         <template #default="scope">
           <el-tooltip content="详情" placement="top">
             <el-button link type="primary" icon="View" @click="handleDetail(scope.row)"></el-button>
@@ -89,6 +155,7 @@
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
   </div>
@@ -96,6 +163,9 @@
 
 <script setup name="TBusiHiddCount">
 import { listTBusiHiddCount } from "@/api/slaj/hidd"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 
@@ -108,18 +178,30 @@ const statData = ref({
   totalHidd: 0,
   solvedHidd: 0,
   solvingHidd: 0,
-  unsolvedHidd: 0
+  unsolvedHidd: 0,
+  overTimeHidd: 0,
+  avgSolveRate: 0
 })
 
 const columns = ref({
-  orgGuid: { label: '机构名称', visible: true },
-  statYear: { label: '统计年份', visible: true },
-  statMonth: { label: '统计月份', visible: true },
+  orgName: { label: '机构名称', visible: true },
   totalHidd: { label: '隐患总数', visible: true },
-  solvedHidd: { label: '已整改', visible: true },
-  solvingHidd: { label: '整改中', visible: true },
-  unsolvedHidd: { label: '未整改', visible: true },
-  solveRate: { label: '整改率', visible: true }
+  zdHidd: { label: '重大隐患数', visible: true },
+  zgZdHidd: { label: '已整改重大', visible: true },
+  zdSolvingHidd: { label: '整改中重大', visible: true },
+  zdUnsolvedHidd: { label: '未整改重大', visible: true },
+  zdOverTimeHidd: { label: '逾期重大', visible: true },
+  zdZgl: { label: '重大整改率', visible: true },
+  ybHidd: { label: '一般隐患数', visible: true },
+  zgYbHidd: { label: '已整改一般', visible: true },
+  ybSolvingHidd: { label: '整改中一般', visible: true },
+  ybUnsolvedHidd: { label: '未整改一般', visible: true },
+  ybOverTimeHidd: { label: '逾期一般', visible: true },
+  ybZgl: { label: '一般整改率', visible: true },
+  hiddZgl: { label: '综合整改率', visible: true },
+  pcl: { label: '排查率', visible: true },
+  engNum: { label: '工程总数', visible: true },
+  hiddOrg: { label: '有隐患单位', visible: true }
 })
 
 const data = reactive({
@@ -128,7 +210,8 @@ const data = reactive({
     pageSize: 10,
     statYear: undefined,
     statMonth: undefined,
-    orgGuid: undefined
+    orgName: undefined,
+    unitType: undefined
   }
 })
 
@@ -151,17 +234,27 @@ function calculateStat() {
   let solvedHidd = 0
   let solvingHidd = 0
   let unsolvedHidd = 0
+  let overTimeHidd = 0
+  let totalZgl = 0
+  let count = 0
   hiddCountList.value.forEach(item => {
     totalHidd += item.totalHidd || 0
     solvedHidd += item.solvedHidd || 0
     solvingHidd += item.solvingHidd || 0
     unsolvedHidd += item.unsolvedHidd || 0
+    overTimeHidd += (item.zdOverTimeHidd || 0) + (item.ybOverTimeHidd || 0)
+    if (item.hiddZgl) {
+      totalZgl += item.hiddZgl
+      count++
+    }
   })
   statData.value = {
     totalHidd,
     solvedHidd,
     solvingHidd,
-    unsolvedHidd
+    unsolvedHidd,
+    overTimeHidd,
+    avgSolveRate: count > 0 ? Math.round(totalZgl / count) : 0
   }
 }
 
@@ -201,7 +294,7 @@ onMounted(() => {
   align-items: center;
 }
 .stat-value {
-  font-size: 32px;
+  font-size: 28px;
   font-weight: bold;
   text-align: center;
   color: #409EFF;

+ 408 - 0
gw-ui/src/views/slaj/hidd/subContract.vue

@@ -0,0 +1,408 @@
+<template>
+  <div ref="containerRef" class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="auto">
+      <el-form-item label="隐患名称" prop="hiddName">
+        <el-input v-model="queryParams.hiddName" placeholder="请输入隐患名称" clearable style="width: 180px" @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="隐患等级" prop="hiddGrad">
+        <el-select v-model="queryParams.hiddGrad" placeholder="请选择隐患等级" clearable style="width: 150px">
+          <el-option v-for="dict in hidd_grad" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="隐患状态" prop="hiddStat">
+        <el-select v-model="queryParams.hiddStat" placeholder="请选择隐患状态" clearable style="width: 150px">
+          <el-option v-for="dict in hidd_stat" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="参建单位" prop="orgGuid">
+        <el-select v-model="queryParams.orgGuid" placeholder="请选择参建单位" clearable filterable style="width: 200px">
+          <el-option v-for="item in orgList" :key="item.guid" :label="item.orgName" :value="item.guid" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['hidd:objhidd:add']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate" v-hasPermi="['hidd:objhidd:edit']">修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete" v-hasPermi="['hidd:objhidd:remove']">删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['hidd:objhidd:export']">导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hidd-subcontract-index"></right-toolbar>
+    </el-row>
+
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="objHiddList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="隐患名称" align="center" prop="hiddName" v-if="columns.hiddName.visible" :show-overflow-tooltip="true" />
+      <el-table-column label="隐患等级" align="center" prop="hiddGrad" v-if="columns.hiddGrad.visible">
+        <template #default="scope">
+          <dict-tag :options="hidd_grad" :value="scope.row.hiddGrad" />
+        </template>
+      </el-table-column>
+      <el-table-column label="隐患状态" align="center" prop="hiddStat" v-if="columns.hiddStat.visible">
+        <template #default="scope">
+          <dict-tag :options="hidd_stat" :value="scope.row.hiddStat" />
+        </template>
+      </el-table-column>
+      <el-table-column label="所属单位" align="center" prop="orgGuid" v-if="columns.orgGuid.visible" :show-overflow-tooltip="true" />
+      <el-table-column label="涉及部位" align="center" prop="proPart" v-if="columns.proPart.visible" :show-overflow-tooltip="true" />
+      <el-table-column label="采集时间" align="center" prop="collTime" v-if="columns.collTime.visible" width="180" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="250">
+        <template #default="scope">
+          <el-tooltip content="修改" placement="top" v-if="scope.row.hiddStat === '0'">
+            <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['hidd:objhidd:edit']"></el-button>
+          </el-tooltip>
+          <el-tooltip content="详情" placement="top">
+            <el-button link type="primary" icon="View" @click="handleDetail(scope.row)"></el-button>
+          </el-tooltip>
+          <el-tooltip content="上报" placement="top" v-if="scope.row.hiddStat === '0'">
+            <el-button link type="success" icon="Promotion" @click="handleReport(scope.row)" v-hasPermi="['hidd:objhidd:edit']"></el-button>
+          </el-tooltip>
+          <el-tooltip content="整改" placement="top" v-if="scope.row.hiddStat !== '2'">
+            <el-button link type="warning" icon="Tools" @click="handleRectify(scope.row)" v-hasPermi="['hidd:objhidd:edit']"></el-button>
+          </el-tooltip>
+          <el-tooltip content="删除" placement="top" v-if="scope.row.hiddStat === '0'">
+            <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['hidd:objhidd:remove']"></el-button>
+          </el-tooltip>
+        </template>
+      </el-table-column>
+    </el-table>
+    </div>
+
+    <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+
+    <!-- 添加或修改隐患对话框 -->
+    <el-dialog :title="title" v-model="open" width="800px" append-to-body>
+      <el-form :model="form" :rules="rules" ref="objHiddRef" label-width="100px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="参建单位" prop="orgGuid">
+              <el-select v-model="form.orgGuid" placeholder="请选择参建单位" filterable style="width: 100%">
+                <el-option v-for="item in orgList" :key="item.guid" :label="item.orgName" :value="item.guid" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="隐患名称" prop="hiddName">
+              <el-input v-model="form.hiddName" placeholder="请输入隐患名称" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="隐患等级" prop="hiddGrad">
+              <el-select v-model="form.hiddGrad" placeholder="请选择隐患等级">
+                <el-option v-for="dict in hidd_grad" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="隐患类别" prop="hiddClas">
+              <el-select v-model="form.hiddClas" placeholder="请选择隐患类别">
+                <el-option v-for="dict in hidd_clas" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="隐患来源" prop="hiddSour">
+              <el-select v-model="form.hiddSour" placeholder="请选择隐患来源">
+                <el-option v-for="dict in hidd_sour" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="关联危险源" prop="hazGuid">
+              <el-select v-model="form.hazGuid" placeholder="请选择关联危险源" filterable clearable>
+                <el-option v-for="item in hazOptions" :key="item.guid" :label="item.hazName" :value="item.guid" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="隐患状态" prop="hiddStat">
+              <el-select v-model="form.hiddStat" placeholder="请选择隐患状态">
+                <el-option v-for="dict in hidd_stat" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="涉及部位" prop="proPart">
+              <el-input v-model="form.proPart" placeholder="请输入涉及部位" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="隐患描述" prop="otlcolQiffFnvu">
+              <el-input v-model="form.otlcolQiffFnvu" type="textarea" placeholder="请输入隐患描述" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="SubContractHidd">
+import { listObjHidd, getObjHidd, delObjHidd, addObjHidd, updateObjHidd } from "@/api/slaj/hidd"
+import { useTableHeight } from '@/hooks/useTableHeight'
+import { listObjHaz } from "@/api/slaj/hazard"
+
+const { tableHeight, containerRef } = useTableHeight()
+
+const { proxy } = getCurrentInstance()
+const { hidd_grad, hidd_stat, hidd_sour, hidd_clas } = proxy.useDict("hidd_grad", "hidd_stat", "hidd_sour", "hidd_clas")
+
+const hazOptions = ref([])
+
+function getHazOptions() {
+  listObjHaz({ pageNum: 1, pageSize: 1000 }).then(res => {
+    hazOptions.value = res.rows
+  })
+}
+
+const objHiddList = ref([])
+const orgList = ref([])
+const open = ref(false)
+const loading = ref(true)
+const showSearch = ref(true)
+const ids = ref([])
+const single = ref(true)
+const multiple = ref(true)
+const total = ref(0)
+const title = ref("")
+
+const columns = ref({
+  hiddName: { label: '隐患名称', visible: true },
+  hiddGrad: { label: '隐患等级', visible: true },
+  hiddStat: { label: '隐患状态', visible: true },
+  orgGuid: { label: '所属单位', visible: true },
+  proPart: { label: '涉及部位', visible: true },
+  collTime: { label: '采集时间', visible: true }
+})
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    hiddName: undefined,
+    hiddGrad: undefined,
+    hiddStat: undefined,
+    orgGuid: undefined,
+    hiddSort: '1'
+  },
+  rules: {
+    hiddName: [{ required: true, message: "隐患名称不能为空", trigger: "blur" }],
+    hiddGrad: [{ required: true, message: "隐患等级不能为空", trigger: "change" }],
+    hiddStat: [{ required: true, message: "隐患状态不能为空", trigger: "change" }],
+    orgGuid: [{ required: true, message: "参建单位不能为空", trigger: "change" }]
+  }
+})
+
+const { queryParams, form, rules } = toRefs(data)
+
+/** 查询隐患列表 */
+function getList() {
+  loading.value = true
+  listObjHidd(queryParams.value).then(res => {
+    loading.value = false
+    objHiddList.value = res.rows
+    total.value = res.total
+  })
+}
+
+/** 查询参建单位列表 */
+function getOrgList() {
+  // 这里需要调用获取参建单位列表的接口,暂时使用空数组
+  orgList.value = []
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef")
+  handleQuery()
+}
+
+/** 多选框选中数据 */
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.guid)
+  single.value = selection.length != 1
+  multiple.value = !selection.length
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset()
+  open.value = true
+  title.value = "新增参建单位隐患"
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  const guid = row.guid || ids.value
+  if (row && row.hiddStat && row.hiddStat !== '0') {
+    proxy.$modal.msgWarning("已上报的隐患不可修改")
+    return
+  }
+  if (!row) {
+    const selected = objHiddList.value.find(item => item.guid === ids.value[0])
+    if (selected && selected.hiddStat && selected.hiddStat !== '0') {
+      proxy.$modal.msgWarning("已上报的隐患不可修改")
+      return
+    }
+  }
+  reset()
+  getObjHidd(guid).then(response => {
+    form.value = response.data
+    open.value = true
+    title.value = "修改参建单位隐患"
+  })
+}
+
+/** 上报按钮操作 */
+function handleReport(row) {
+  const guid = row.guid || ids.value
+  proxy.$modal.confirm('是否确认将该隐患上报?').then(function () {
+    return updateObjHidd({ guid: guid, hiddStat: '1' })
+  }).then(() => {
+    getList()
+    proxy.$modal.msgSuccess("上报成功")
+  }).catch(() => {})
+}
+
+/** 整改按钮操作 */
+function handleRectify(row) {
+  const guid = row.guid || ids.value
+  proxy.$router.push({ path: '/slaj/hidd/detail', query: { guid: guid, tab: 'rectify' } })
+}
+
+/** 详情按钮操作 */
+function handleDetail(row) {
+  const guid = row.guid || ids.value
+  proxy.$router.push({ path: '/slaj/hidd/detail', query: { guid: guid } })
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["objHiddRef"].validate(valid => {
+    if (valid) {
+      if (form.value.guid != undefined) {
+        updateObjHidd(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功")
+          open.value = false
+          getList()
+        })
+      } else {
+        addObjHidd(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功")
+          open.value = false
+          getList()
+        })
+      }
+    }
+  })
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const guids = row.guid || ids.value
+  const selection = objHiddList.value.filter(item => guids.includes(item.guid))
+  const hasReported = selection.some(item => item.hiddStat !== '0')
+  if (hasReported) {
+    proxy.$modal.msgError("已上报的隐患不允许删除")
+    return
+  }
+  proxy.$modal.confirm('是否确认删除隐患编号为"' + guids + '"的数据项?').then(function () {
+    return delObjHidd(guids)
+  }).then(() => {
+    getList()
+    proxy.$modal.msgSuccess("删除成功")
+  }).catch(() => {})
+}
+
+function cancel() {
+  open.value = false
+  reset()
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download("hidd/objhidd/export", {
+    ...queryParams.value
+  }, `subContractHidd_${new Date().getTime()}.xlsx`)
+}
+
+/** 重置表单 */
+function reset() {
+  form.value = {
+    guid: undefined,
+    hiddName: undefined,
+    engGuid: undefined,
+    tendGuid: undefined,
+    seGuid: undefined,
+    orgGuid: undefined,
+    hiddSour: undefined,
+    hiddGrad: undefined,
+    hiddClas: undefined,
+    ifFound: undefined,
+    proPart: undefined,
+    partLong: undefined,
+    partLat: undefined,
+    otlcolQiffFnvu: undefined,
+    inspRecGuid: undefined,
+    seCheckItemGuid: undefined,
+    hiddStat: undefined,
+    hiddMergGuid: undefined,
+    recOrgGuid: undefined,
+    note: undefined,
+    collTime: undefined,
+    updTime: undefined,
+    recPers: undefined,
+    hiddsGuid: undefined,
+    occuNum: undefined,
+    sinsScheGuid: undefined,
+    groupGuid: undefined,
+    temp: undefined,
+    toDate: undefined,
+    dictGuid: undefined,
+    hiddSort: '1',
+    hazGuid: undefined
+  }
+  proxy.resetForm("objHiddRef")
+}
+
+onMounted(() => {
+  getList()
+  getOrgList()
+  getHazOptions()
+})
+</script>

+ 10 - 1
gw-ui/src/views/slaj/hidd/supDetail.vue

@@ -17,7 +17,7 @@
         </el-descriptions-item>
         <el-descriptions-item label="督办文号">{{ form.supLareId }}</el-descriptions-item>
         <el-descriptions-item label="督办日期">{{ form.supDate }}</el-descriptions-item>
-        <el-descriptions-item label="督办单位">{{ form.supWiunCode }}</el-descriptions-item>
+        <el-descriptions-item label="督办单位">{{ form.supWiunName || form.supWiunCode }}</el-descriptions-item>
         <el-descriptions-item label="督办负责人">{{ form.supLegPers }}</el-descriptions-item>
         <el-descriptions-item label="整改期限">{{ form.rectPeri }}</el-descriptions-item>
         <el-descriptions-item label="是否挂牌">
@@ -25,6 +25,15 @@
         </el-descriptions-item>
         <el-descriptions-item label="督办意见" :span="2">{{ form.supOpin }}</el-descriptions-item>
         <el-descriptions-item label="备注" :span="2">{{ form.note }}</el-descriptions-item>
+        <el-descriptions-item label="督办附件" :span="2">
+          <div v-if="form.medGuid">
+            <el-link type="primary" :href="`/common/download?fileName=${form.medTitl}&delete=true`">
+              <el-icon><Download /></el-icon>
+              {{ form.medTitl || '附件' }}
+            </el-link>
+          </div>
+          <span v-else style="color: #909399">暂无附件</span>
+        </el-descriptions-item>
       </el-descriptions>
     </el-card>
   </div>

+ 62 - 8
gw-ui/src/views/slaj/hidd/supList.vue

@@ -1,11 +1,18 @@
 <template>
-  <div class="app-container">
+  <div ref="containerRef" class="app-container">
     <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="隐患名称" prop="hiddName">
         <el-input v-model="queryParams.hiddName" placeholder="请输入隐患名称" clearable style="width: 240px" @keyup.enter="handleQuery" />
       </el-form-item>
+      <el-form-item label="隐患所属单位" prop="hiddUnit">
+        <el-select v-model="queryParams.hiddUnit" placeholder="请选择单位类型" clearable style="width: 200px">
+          <el-option label="直属单位" value="0" />
+          <el-option label="下级水行政部门" value="1" />
+          <el-option label="流域机构" value="2" />
+        </el-select>
+      </el-form-item>
       <el-form-item label="督办状态" prop="supStat">
-        <el-select v-model="queryParams.supStat" placeholder="请选择督办状态" clearable style="width: 240px">
+        <el-select v-model="queryParams.supStat" placeholder="请选择督办状态" clearable style="width: 200px">
           <el-option v-for="dict in sup_stat" :key="dict.value" :label="dict.label" :value="dict.value" />
         </el-select>
       </el-form-item>
@@ -25,7 +32,8 @@
       <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" storageKey="hidd-majhiddsup-index"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="supList" @selection-change="handleSelectionChange">
+    <div class="table-wrapper">
+    <el-table :height="tableHeight" v-loading="loading" :data="supList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="隐患名称" align="center" prop="hiddName" v-if="columns.hiddName.visible" :show-overflow-tooltip="true" />
       <el-table-column label="隐患等级" align="center" prop="hiddGrad" v-if="columns.hiddGrad.visible">
@@ -33,12 +41,18 @@
           <dict-tag :options="hidd_grad" :value="scope.row.hiddGrad" />
         </template>
       </el-table-column>
-      <el-table-column label="隐患状态" align="center" prop="hiddStat" v-if="columns.hiddStat.visible">
+      <el-table-column label="发现日期" align="center" prop="collTime" v-if="columns.collTime.visible" width="120" />
+      <el-table-column label="督办情况" align="center" prop="supStat" v-if="columns.supStat.visible">
+        <template #default="scope">
+          <dict-tag :options="sup_stat" :value="scope.row.supStat" />
+        </template>
+      </el-table-column>
+      <el-table-column label="整改情况" align="center" prop="hiddStat" v-if="columns.hiddStat.visible">
         <template #default="scope">
           <dict-tag :options="hidd_stat" :value="scope.row.hiddStat" />
         </template>
       </el-table-column>
-      <el-table-column label="督办日期" align="center" prop="supDate" v-if="columns.supDate.visible" width="180" />
+      <el-table-column label="督办日期" align="center" prop="supDate" v-if="columns.supDate.visible" width="120" />
       <el-table-column label="督办单位" align="center" prop="supWiunCode" v-if="columns.supWiunCode.visible" :show-overflow-tooltip="true" />
       <el-table-column label="督办负责人" align="center" prop="supLegPers" v-if="columns.supLegPers.visible" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200">
@@ -52,9 +66,13 @@
           <el-tooltip content="销号" placement="top" v-if="scope.row.supStat === '2'">
             <el-button link type="primary" icon="CircleCheck" @click="handleWriteOff(scope.row)" v-hasPermi="['hidd:majhiddsup:edit']"></el-button>
           </el-tooltip>
+          <el-tooltip content="撤销督办" placement="top" v-if="scope.row.supStat === '1'">
+            <el-button link type="danger" icon="CircleClose" @click="handleCancel(scope.row)" v-hasPermi="['hidd:majhiddsup:remove']"></el-button>
+          </el-tooltip>
         </template>
       </el-table-column>
     </el-table>
+    </div>
 
     <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
 
@@ -93,13 +111,30 @@
         </div>
       </template>
     </el-dialog>
+
+    <el-dialog title="撤销督办确认" v-model="cancelOpen" width="400px" append-to-body>
+      <div style="text-align: center; padding: 20px;">
+        <el-icon style="font-size: 48px; color: #f56c6c;"><WarningFilled /></el-icon>
+        <p style="margin-top: 16px; font-size: 16px;">确认撤销对该隐患的督办?</p>
+        <p style="color: #909399; font-size: 14px;">撤销后可重新进行督办</p>
+      </div>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="danger" @click="submitCancel">确 定</el-button>
+          <el-button @click="cancelOpen = false">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup name="BisMajHiddSup">
-import { listBisMajHiddSup, getBisMajHiddSup, addBisMajHiddSup, updateBisMajHiddSup, delBisMajHiddSup, writeOffBisMajHiddSup } from "@/api/slaj/hidd"
+import { listBisMajHiddSup, getBisMajHiddSup, addBisMajHiddSup, updateBisMajHiddSup, delBisMajHiddSup, writeOffBisMajHiddSup, cancelBisMajHiddSup } from "@/api/slaj/hidd"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listObjHidd, getObjHidd } from "@/api/slaj/hidd"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { hidd_grad, hidd_stat, sup_stat } = proxy.useDict("hidd_grad", "hidd_stat", "sup_stat")
 
@@ -123,10 +158,15 @@ const supRules = {
 const writeOffOpen = ref(false)
 const writeOffRow = ref({})
 
+const cancelOpen = ref(false)
+const cancelRow = ref({})
+
 const columns = ref({
   hiddName: { label: '隐患名称', visible: true },
   hiddGrad: { label: '隐患等级', visible: true },
-  hiddStat: { label: '隐患状态', visible: true },
+  collTime: { label: '发现日期', visible: true },
+  supStat: { label: '督办情况', visible: true },
+  hiddStat: { label: '整改情况', visible: true },
   supDate: { label: '督办日期', visible: true },
   supWiunCode: { label: '督办单位', visible: true },
   supLegPers: { label: '督办负责人', visible: true }
@@ -138,7 +178,8 @@ const data = reactive({
     pageNum: 1,
     pageSize: 10,
     hiddName: undefined,
-    supStat: undefined
+    supStat: undefined,
+    hiddUnit: undefined
   },
   rules: {}
 })
@@ -212,6 +253,19 @@ function submitWriteOff() {
   }).catch(() => {})
 }
 
+function handleCancel(row) {
+  cancelRow.value = row
+  cancelOpen.value = true
+}
+
+function submitCancel() {
+  cancelBisMajHiddSup(cancelRow.value.guid).then(response => {
+    proxy.$modal.msgSuccess("撤销督办成功")
+    cancelOpen.value = false
+    getList()
+  }).catch(() => {})
+}
+
 function handleExport() {
   proxy.download("hidd/majhiddsup/export", {
     ...queryParams.value

+ 159 - 0
gw-ui/src/views/slaj/hidd/verify.vue

@@ -0,0 +1,159 @@
+<template>
+  <div class="app-container">
+    <el-card shadow="never">
+      <template #header>
+        <div class="card-header">
+          <span>重大隐患核实</span>
+          <el-button plain icon="ArrowLeft" @click="goBack">返回</el-button>
+        </div>
+      </template>
+      
+      <!-- 隐患基本信息 -->
+      <el-descriptions :column="2" border class="mb20">
+        <el-descriptions-item label="隐患名称" :span="2">{{ hiddInfo.hiddName }}</el-descriptions-item>
+        <el-descriptions-item label="隐患等级">
+          <dict-tag :options="hidd_grad" :value="hiddInfo.hiddGrad" />
+        </el-descriptions-item>
+        <el-descriptions-item label="隐患状态">
+          <dict-tag :options="hidd_stat" :value="hiddInfo.hiddStat" />
+        </el-descriptions-item>
+        <el-descriptions-item label="所属工程">{{ hiddInfo.engName }}</el-descriptions-item>
+        <el-descriptions-item label="涉及部位">{{ hiddInfo.proPart }}</el-descriptions-item>
+        <el-descriptions-item label="隐患描述" :span="2">{{ hiddInfo.otlcolQiffFnvu }}</el-descriptions-item>
+      </el-descriptions>
+
+      <!-- 核实记录列表 -->
+      <el-table :data="veriList" border>
+        <el-table-column label="核实单位" align="center" prop="veriOrgGuid" />
+        <el-table-column label="核实日期" align="center" prop="veriDate" width="120" />
+        <el-table-column label="核实人" align="center" prop="veriPers" />
+        <el-table-column label="核实结果" align="center" prop="veriResu">
+          <template #default="scope">
+            <dict-tag :options="veri_resu" :value="scope.row.veriResu" />
+          </template>
+        </el-table-column>
+        <el-table-column label="核实意见" align="center" prop="veriAdvi" :show-overflow-tooltip="true" />
+        <el-table-column label="操作" align="center" width="100">
+          <template #default="scope">
+            <el-tooltip content="查看" placement="top">
+              <el-button link type="primary" icon="View" @click="handleView(scope.row)"></el-button>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-card>
+
+    <!-- 核实对话框 -->
+    <el-dialog title="隐患核实" v-model="verifyOpen" width="600px" append-to-body>
+      <el-form :model="verifyForm" :rules="verifyRules" ref="verifyRef" label-width="100px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="核实结果" prop="veriResu">
+              <el-select v-model="verifyForm.veriResu" placeholder="请选择核实结果">
+                <el-option v-for="dict in veri_resu" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="核实意见" prop="veriAdvi">
+              <el-input v-model="verifyForm.veriAdvi" type="textarea" :rows="4" placeholder="请输入核实意见(500字以内)" maxlength="500" show-word-limit />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitVerify">确 定</el-button>
+          <el-button @click="verifyOpen = false">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="HiddVerify">
+import { getObjHidd } from "@/api/slaj/hidd"
+import { listBisHiddMajVeri, addBisHiddMajVeri } from "@/api/slaj/hidd"
+
+const { proxy } = getCurrentInstance()
+const route = useRoute()
+const router = useRouter()
+const { hidd_grad, hidd_stat, veri_resu } = proxy.useDict("hidd_grad", "hidd_stat", "veri_resu")
+
+const hiddInfo = ref({})
+const veriList = ref([])
+const verifyOpen = ref(false)
+const verifyForm = ref({})
+const verifyRules = {
+  veriResu: [{ required: true, message: "核实结果不能为空", trigger: "change" }]
+}
+
+/** 获取隐患信息 */
+function getHiddInfo() {
+  const guid = route.query.guid
+  if (guid) {
+    getObjHidd(guid).then(response => {
+      hiddInfo.value = response.data
+      getVeriList()
+    })
+  }
+}
+
+/** 查询核实记录 */
+function getVeriList() {
+  listBisHiddMajVeri({ hiddGuid: hiddInfo.value.guid }).then(res => {
+    veriList.value = res.rows
+  })
+}
+
+/** 核实按钮 */
+function handleVerify() {
+  verifyForm.value = {
+    hiddGuid: hiddInfo.value.guid,
+    veriResu: undefined,
+    veriAdvi: undefined
+  }
+  verifyOpen.value = true
+}
+
+/** 提交核实 */
+function submitVerify() {
+  proxy.$refs["verifyRef"].validate(valid => {
+    if (valid) {
+      addBisHiddMajVeri(verifyForm.value).then(response => {
+        proxy.$modal.msgSuccess("核实成功")
+        verifyOpen.value = false
+        getVeriList()
+      })
+    }
+  })
+}
+
+/** 查看详情 */
+function handleView(row) {
+  // 可以弹窗显示详情
+  proxy.$modal.msgInfo("核实结果: " + (row.veriResu === '1' ? '重大' : '一般'))
+}
+
+/** 返回 */
+function goBack() {
+  router.push({ path: '/slaj/hidd/detail', query: { guid: hiddInfo.value.guid } })
+}
+
+onMounted(() => {
+  getHiddInfo()
+})
+</script>
+
+<style scoped>
+.card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+.mb20 {
+  margin-bottom: 20px;
+}
+</style>

+ 8 - 1
gw-ui/src/views/slaj/hidd/zjIndex.vue

@@ -2,6 +2,7 @@
   <div class="app-container">
     <el-tabs v-model="activeTab" type="border-card">
       <el-tab-pane label="隐患列表" name="hidd">
+        <div ref="containerRef" class="table-page-wrap">
         <el-form :model="hiddQueryParams" ref="hiddQueryRef" :inline="true" v-show="showSearch" label-width="68px">
           <el-form-item label="隐患名称" prop="hiddName">
             <el-input v-model="hiddQueryParams.hiddName" placeholder="请输入隐患名称" clearable style="width: 240px" @keyup.enter="handleHiddQuery" />
@@ -29,7 +30,8 @@
           <right-toolbar v-model:showSearch="showSearch" @queryTable="getHiddList" :columns="hiddColumns" storageKey="hidd-zjindex-hidd"></right-toolbar>
         </el-row>
 
-        <el-table v-loading="hiddLoading" :data="hiddList">
+        <div class="table-wrapper">
+        <el-table :height="tableHeight" v-loading="hiddLoading" :data="hiddList">
           <el-table-column label="隐患名称" align="center" prop="hiddName" v-if="hiddColumns.hiddName.visible" :show-overflow-tooltip="true" />
           <el-table-column label="隐患等级" align="center" prop="hiddGrad" v-if="hiddColumns.hiddGrad.visible">
             <template #default="scope">
@@ -44,8 +46,10 @@
           <el-table-column label="涉及部位" align="center" prop="proPart" v-if="hiddColumns.proPart.visible" :show-overflow-tooltip="true" />
           <el-table-column label="采集时间" align="center" prop="collTime" v-if="hiddColumns.collTime.visible" width="180" />
         </el-table>
+        </div>
 
         <pagination v-show="hiddTotal > 0" :total="hiddTotal" v-model:page="hiddQueryParams.pageNum" v-model:limit="hiddQueryParams.pageSize" @pagination="getHiddList" />
+        </div>
       </el-tab-pane>
 
       <el-tab-pane label="月报列表" name="month">
@@ -93,8 +97,11 @@
 
 <script setup name="HiddZjIndex">
 import { listObjHidd } from "@/api/slaj/hidd"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { listBisOrgMonRepPeri } from "@/api/slaj/hidd"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { hidd_grad, hidd_stat, rep_stat } = proxy.useDict("hidd_grad", "hidd_stat", "rep_stat")
 

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

@@ -1,5 +1,5 @@
 <template>
-   <div class="app-container">
+   <div ref="containerRef" class="app-container">
       <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
          <el-form-item label="参数名称" prop="configName">
             <el-input
@@ -96,7 +96,8 @@
          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
       </el-row>
 
-      <el-table v-loading="loading" :data="configList" @selection-change="handleSelectionChange">
+      <div class="table-wrapper">
+      <el-table :height="tableHeight" v-loading="loading" :data="configList" @selection-change="handleSelectionChange">
          <el-table-column type="selection" width="55" align="center" />
          <el-table-column label="参数主键" align="center" prop="configId" />
          <el-table-column label="参数名称" align="center" prop="configName" :show-overflow-tooltip="true" />
@@ -120,6 +121,7 @@
             </template>
          </el-table-column>
       </el-table>
+      </div>
 
       <pagination
          v-show="total > 0"
@@ -166,6 +168,9 @@
 
 <script setup name="Config">
 import { listConfig, getConfig, delConfig, addConfig, updateConfig, refreshCache } from "@/api/system/config"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { sys_yes_no } = proxy.useDict("sys_yes_no")

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

@@ -1,5 +1,5 @@
 <template>
-   <div class="app-container">
+   <div ref="containerRef" class="app-container">
       <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
          <el-form-item label="部门名称" prop="deptName">
             <el-input
@@ -56,7 +56,8 @@
          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
       </el-row>
 
-      <el-table
+      <div class="table-wrapper">
+      <el-table :height="tableHeight"
          v-if="refreshTable"
          v-loading="loading"
          :data="deptList"
@@ -88,6 +89,7 @@
             </template>
          </el-table-column>
       </el-table>
+      </div>
 
       <!-- 添加或修改部门对话框 -->
       <el-dialog :title="title" v-model="open" width="600px" append-to-body>
@@ -155,6 +157,9 @@
 
 <script setup name="Dept">
 import { listDept, getDept, delDept, addDept, updateDept, updateDeptSort, listDeptExcludeChild } from "@/api/system/dept"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { sys_normal_disable } = proxy.useDict("sys_normal_disable")

+ 7 - 2
gw-ui/src/views/system/dict/data.vue

@@ -1,5 +1,5 @@
 <template>
-   <div class="app-container">
+   <div ref="containerRef" class="app-container">
       <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
          <el-form-item label="字典名称" prop="dictType">
             <el-select v-model="queryParams.dictType" style="width: 200px">
@@ -86,7 +86,8 @@
          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
       </el-row>
 
-      <el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange">
+      <div class="table-wrapper">
+      <el-table :height="tableHeight" v-loading="loading" :data="dataList" @selection-change="handleSelectionChange">
          <el-table-column type="selection" width="55" align="center" />
          <el-table-column label="字典编码" align="center" prop="dictCode" />
          <el-table-column label="字典标签" align="center" prop="dictLabel">
@@ -115,6 +116,7 @@
             </template>
          </el-table-column>
       </el-table>
+      </div>
 
       <pagination
          v-show="total > 0"
@@ -177,9 +179,12 @@
 
 <script setup name="Data">
 import useDictStore from '@/store/modules/dict'
+import { useTableHeight } from '@/hooks/useTableHeight'
 import { optionselect as getDictOptionselect, getType } from "@/api/system/dict/type"
 import { listData, getData, delData, addData, updateData } from "@/api/system/dict/data"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { sys_normal_disable } = proxy.useDict("sys_normal_disable")
 

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

@@ -1,5 +1,5 @@
 <template>
-   <div class="app-container">
+   <div ref="containerRef" class="app-container">
       <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
          <el-form-item label="字典名称" prop="dictName">
             <el-input
@@ -101,7 +101,8 @@
          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
       </el-row>
 
-      <el-table v-loading="loading" :data="typeList" @selection-change="handleSelectionChange">
+      <div class="table-wrapper">
+      <el-table :height="tableHeight" v-loading="loading" :data="typeList" @selection-change="handleSelectionChange">
          <el-table-column type="selection" width="55" align="center" />
          <el-table-column label="字典编号" align="center" prop="dictId" />
          <el-table-column label="字典名称" align="center" prop="dictName" :show-overflow-tooltip="true"/>
@@ -129,6 +130,7 @@
             </template>
          </el-table-column>
       </el-table>
+      </div>
 
       <pagination
          v-show="total > 0"
@@ -182,9 +184,12 @@
 
 <script setup name="Dict">
 import DictDataDrawer from './detail'
+import { useTableHeight } from '@/hooks/useTableHeight'
 import useDictStore from '@/store/modules/dict'
 import { listType, getType, delType, addType, updateType, refreshCache } from "@/api/system/dict/type"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { sys_normal_disable } = proxy.useDict("sys_normal_disable")
 

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

@@ -1,5 +1,5 @@
 <template>
-   <div class="app-container">
+   <div ref="containerRef" class="app-container">
       <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
          <el-form-item label="菜单名称" prop="menuName">
             <el-input
@@ -56,7 +56,8 @@
          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
       </el-row>
 
-      <el-table
+      <div class="table-wrapper">
+      <el-table :height="tableHeight"
          v-if="refreshTable"
          v-loading="loading"
          :data="menuList"
@@ -99,6 +100,7 @@
             </template>
          </el-table-column>
       </el-table>
+      </div>
 
       <!-- 添加或修改菜单对话框 -->
       <el-dialog :title="title" v-model="open" width="680px" append-to-body>
@@ -307,9 +309,12 @@
 
 <script setup name="Menu">
 import { addMenu, delMenu, getMenu, listMenu, updateMenu, updateMenuSort } from "@/api/system/menu"
+import { useTableHeight } from '@/hooks/useTableHeight'
 import SvgIcon from "@/components/SvgIcon"
 import IconSelect from "@/components/IconSelect"
 
+const { tableHeight, containerRef } = useTableHeight()
+
 const { proxy } = getCurrentInstance()
 const { sys_show_hide, sys_normal_disable } = proxy.useDict("sys_show_hide", "sys_normal_disable")
 

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

@@ -1,5 +1,5 @@
 <template>
-   <div class="app-container">
+   <div ref="containerRef" class="app-container">
       <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
          <el-form-item label="公告标题" prop="noticeTitle">
             <el-input
@@ -68,7 +68,8 @@
          <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
       </el-row>
 
-      <el-table v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange">
+      <div class="table-wrapper">
+      <el-table :height="tableHeight" v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange">
          <el-table-column type="selection" width="55" align="center" />
          <el-table-column label="序号" align="center" prop="noticeId" width="100" />
          <el-table-column
@@ -100,6 +101,7 @@
             </template>
          </el-table-column>
       </el-table>
+      </div>
 
       <pagination
          v-show="total > 0"
@@ -160,6 +162,9 @@
 
 <script setup name="Notice">
 import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice"
+import { useTableHeight } from '@/hooks/useTableHeight'
+
+const { tableHeight, containerRef } = useTableHeight()
 
 const { proxy } = getCurrentInstance()
 const { sys_notice_status, sys_notice_type } = proxy.useDict("sys_notice_status", "sys_notice_type")

Некоторые файлы не были показаны из-за большого количества измененных файлов