zengy 1 день назад
Родитель
Сommit
b94a72fdfd
32 измененных файлов с 270 добавлено и 652 удалено
  1. 4 3
      pipe-network-service/sql/dispatch_fix_grade_identity.sql
  2. 14 12
      pipe-network-service/sql/dispatch_plan_library_seed.sql
  3. 4 11
      pipe-network-service/sql/dispatch_plan_version_attach.sql
  4. 110 72
      pipe-network-service/sql/dispatch_refactor.sql
  5. 2 2
      pipe-network-service/sql/dispatch_refactor_migrate.sql
  6. 15 55
      pipe-network-service/sql/migration_dispatch_user_id.sql
  7. 2 23
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/dispatch/DisEventController.java
  8. 3 17
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/dispatch/DisEventGradeController.java
  9. 0 9
      pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/dispatch/DisPlanLibraryController.java
  10. 0 34
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/domain/DisEvent.java
  11. 4 29
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/domain/DisEventGrade.java
  12. 0 6
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/domain/DisPlan.java
  13. 3 15
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/domain/DisPlanLibrary.java
  14. 0 6
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/domain/DisPlanVersion.java
  15. 4 4
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/DisDeptOptionVO.java
  16. 0 9
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/DisEventGradePageDTO.java
  17. 0 9
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/DisEventPageDTO.java
  18. 2 23
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/DisEventVO.java
  19. 3 5
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/DisUserOptionVO.java
  20. 0 9
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/EventReleaseDTO.java
  21. 0 10
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/EventSaveDTO.java
  22. 13 13
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/EventVerifyDTO.java
  23. 2 8
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/PlanMatchDTO.java
  24. 2 11
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/PlanMatchResultVO.java
  25. 0 6
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/PlanSaveDTO.java
  26. 0 3
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/PlanVersionVO.java
  27. 0 25
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/mapper/DisEventGradeMapper.java
  28. 1 9
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/service/DisPlanLibraryService.java
  29. 0 37
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/service/impl/DisEventGradeServiceImpl.java
  30. 75 128
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/service/impl/DisEventServiceImpl.java
  31. 6 30
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/service/impl/DisPlanLibraryServiceImpl.java
  32. 1 19
      pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/service/impl/DisPlanServiceImpl.java

+ 4 - 3
pipe-network-service/sql/dispatch_fix_grade_identity.sql

@@ -6,19 +6,20 @@
 --       键值 (id)=(0) 已经存在」,INSERT 语句本身未包含 id 列。
 --       键值 (id)=(0) 已经存在」,INSERT 语句本身未包含 id 列。
 -- 根因:分级标准数据由旧表带显式 id 迁移而来,identity 序列未同步推进
 -- 根因:分级标准数据由旧表带显式 id 迁移而来,identity 序列未同步推进
 --       (仍在 0 附近),INSERT 不带 id 时自动生成 0,撞已存在行。
 --       (仍在 0 附近),INSERT 不带 id 时自动生成 0,撞已存在行。
--- 修复:把 identity 序列校准为表内最大 id(幂等,可重复执行)。
+-- 说明:新库/升级库请优先执行 dispatch_named_id_sequences.sql,统一切换到
+--       app_user.dis_event_grade_id_seq;本文件仅保留该固定序列的校准动作。
 -- 执行方式:KingbaseES 客户端执行第 1 段即可;第 2 段用于核验。
 -- 执行方式:KingbaseES 客户端执行第 1 段即可;第 2 段用于核验。
 -- =====================================================================
 -- =====================================================================
 
 
 -- 1) 校准序列:从 max(id) 之后继续发号
 -- 1) 校准序列:从 max(id) 之后继续发号
 SELECT setval(
 SELECT setval(
-    pg_get_serial_sequence('app_user.dis_event_grade', 'id'),
+    'app_user.dis_event_grade_id_seq',
     GREATEST((SELECT COALESCE(max(id), 1) FROM app_user.dis_event_grade), 1)
     GREATEST((SELECT COALESCE(max(id), 1) FROM app_user.dis_event_grade), 1)
 );
 );
 
 
 -- 2) 核验:nextval 应大于 max_id
 -- 2) 核验:nextval 应大于 max_id
 SELECT COALESCE(max(id), 0)  AS max_id,
 SELECT COALESCE(max(id), 0)  AS max_id,
-       nextval(pg_get_serial_sequence('app_user.dis_event_grade', 'id')) AS next_id
+       nextval('app_user.dis_event_grade_id_seq') AS next_id
   FROM app_user.dis_event_grade;
   FROM app_user.dis_event_grade;
 
 
 -- 附:同批次从旧表迁移过的其他调度表可顺带自检(把表名换掉执行第 1 段):
 -- 附:同批次从旧表迁移过的其他调度表可顺带自检(把表名换掉执行第 1 段):

+ 14 - 12
pipe-network-service/sql/dispatch_plan_library_seed.sql

@@ -3,34 +3,36 @@
 -- 预案模板库种子数据(供「新建预案」时选择模板,预填名称与章节正文)
 -- 预案模板库种子数据(供「新建预案」时选择模板,预填名称与章节正文)
 -- ---------------------------------------------------------------------
 -- ---------------------------------------------------------------------
 -- 幂等:按 plan_name NOT EXISTS 判断,可重复执行。
 -- 幂等:按 plan_name NOT EXISTS 判断,可重复执行。
+-- KingbaseES:整段在一个事务中执行;FROM dual 为 Kingbase 兼容写法。
 -- =====================================================================
 -- =====================================================================
 
 
+BEGIN;
+
 -- TP-001 通用应急预案模板
 -- TP-001 通用应急预案模板
 INSERT INTO app_user.dis_plan_library
 INSERT INTO app_user.dis_plan_library
-    (plan_name, event_type, event_level, event_region, responsible_unit, topic, plan_summary, plan_content, create_by, create_time, del_flag)
-SELECT '通用应急预案模板', '综合', 'Ⅲ级', '', '', '综合专题',
-       '适用于各类一般突发事件的通用处置框架。章节:总则 / 组织体系 / 预防预警 / 应急响应。',
+    (plan_name, event_type, event_level, responsible_unit, plan_content, create_user_id, create_time, del_flag)
+SELECT '通用应急预案模板', '1', '3', '',
        E'第一章 总则\n1.1 编制目的\n1.2 编制依据\n1.3 适用范围\n1.4 工作原则\n\n第二章 组织体系\n2.1 应急指挥部\n2.2 成员单位职责\n2.3 现场处置组\n\n第三章 预防预警\n3.1 风险辨识\n3.2 预警发布\n\n第四章 应急响应\n4.1 响应分级\n4.2 处置流程\n4.3 信息报告\n\n第五章 后期处置\n5.1 善后处理\n5.2 调查评估',
        E'第一章 总则\n1.1 编制目的\n1.2 编制依据\n1.3 适用范围\n1.4 工作原则\n\n第二章 组织体系\n2.1 应急指挥部\n2.2 成员单位职责\n2.3 现场处置组\n\n第三章 预防预警\n3.1 风险辨识\n3.2 预警发布\n\n第四章 应急响应\n4.1 响应分级\n4.2 处置流程\n4.3 信息报告\n\n第五章 后期处置\n5.1 善后处理\n5.2 调查评估',
-       'admin', CURRENT_TIMESTAMP, '0'
+       (SELECT min(user_id) FROM app_user.sys_user WHERE user_name = 'admin' AND del_flag = '0'), CURRENT_TIMESTAMP, '0'
   FROM dual
   FROM dual
  WHERE NOT EXISTS (SELECT 1 FROM app_user.dis_plan_library WHERE plan_name = '通用应急预案模板' AND del_flag = '0');
  WHERE NOT EXISTS (SELECT 1 FROM app_user.dis_plan_library WHERE plan_name = '通用应急预案模板' AND del_flag = '0');
 
 
 -- TP-004 燃气专项预案模板
 -- TP-004 燃气专项预案模板
 INSERT INTO app_user.dis_plan_library
 INSERT INTO app_user.dis_plan_library
-    (plan_name, event_type, event_level, event_region, responsible_unit, topic, plan_summary, plan_content, create_by, create_time, del_flag)
-SELECT '燃气专项预案模板', '燃气', 'Ⅱ级', '', '燃气公司', '燃气专题',
-       '燃气泄漏/爆燃等突发事件的专项处置框架。章节:总则 / 危险源辨识 / 响应分级 / 处置程序。',
+    (plan_name, event_type, event_level, responsible_unit, plan_content, create_user_id, create_time, del_flag)
+SELECT '燃气专项预案模板', '2', '2', '燃气公司',
        E'第一章 总则\n1.1 编制目的\n1.2 适用范围\n\n第二章 危险源辨识\n2.1 燃气泄漏\n2.2 管道占压\n2.3 第三方施工破坏\n\n第三章 响应分级\n3.1 Ⅰ级(爆燃)\n3.2 Ⅱ级(大面积泄漏)\n3.3 Ⅲ级(一般泄漏)\n\n第四章 处置程序\n4.1 关阀断气\n4.2 警戒疏散\n4.3 抢修作业\n4.4 恢复供气',
        E'第一章 总则\n1.1 编制目的\n1.2 适用范围\n\n第二章 危险源辨识\n2.1 燃气泄漏\n2.2 管道占压\n2.3 第三方施工破坏\n\n第三章 响应分级\n3.1 Ⅰ级(爆燃)\n3.2 Ⅱ级(大面积泄漏)\n3.3 Ⅲ级(一般泄漏)\n\n第四章 处置程序\n4.1 关阀断气\n4.2 警戒疏散\n4.3 抢修作业\n4.4 恢复供气',
-       'admin', CURRENT_TIMESTAMP, '0'
+       (SELECT min(user_id) FROM app_user.sys_user WHERE user_name = 'admin' AND del_flag = '0'), CURRENT_TIMESTAMP, '0'
   FROM dual
   FROM dual
  WHERE NOT EXISTS (SELECT 1 FROM app_user.dis_plan_library WHERE plan_name = '燃气专项预案模板' AND del_flag = '0');
  WHERE NOT EXISTS (SELECT 1 FROM app_user.dis_plan_library WHERE plan_name = '燃气专项预案模板' AND del_flag = '0');
 
 
 -- TP-006 供水专项预案模板
 -- TP-006 供水专项预案模板
 INSERT INTO app_user.dis_plan_library
 INSERT INTO app_user.dis_plan_library
-    (plan_name, event_type, event_level, event_region, responsible_unit, topic, plan_summary, plan_content, create_by, create_time, del_flag)
-SELECT '供水专项预案模板', '供水', 'Ⅱ级', '', '供水公司', '供水专题',
-       '供水管网爆管/水质污染等突发事件的专项处置框架。章节:总则 / 组织机构 / 响应分级 / 处置程序 / 后期处置。',
+    (plan_name, event_type, event_level, responsible_unit, plan_content, create_user_id, create_time, del_flag)
+SELECT '供水专项预案模板', '2', '2', '供水公司',
        E'第一章 总则\n1.1 编制目的\n1.2 适用范围\n\n第二章 组织机构\n2.1 应急指挥部\n2.2 抢修队伍\n\n第三章 响应分级\n3.1 Ⅰ级(DN800 以上爆管)\n3.2 Ⅱ级(区域停水)\n3.3 Ⅲ级(一般漏损)\n\n第四章 处置程序\n4.1 关阀降压\n4.2 交通配合\n4.3 抢修换管\n4.4 恢复供水\n\n第五章 后期处置\n5.1 路面恢复\n5.2 水质复检\n5.3 总结评估',
        E'第一章 总则\n1.1 编制目的\n1.2 适用范围\n\n第二章 组织机构\n2.1 应急指挥部\n2.2 抢修队伍\n\n第三章 响应分级\n3.1 Ⅰ级(DN800 以上爆管)\n3.2 Ⅱ级(区域停水)\n3.3 Ⅲ级(一般漏损)\n\n第四章 处置程序\n4.1 关阀降压\n4.2 交通配合\n4.3 抢修换管\n4.4 恢复供水\n\n第五章 后期处置\n5.1 路面恢复\n5.2 水质复检\n5.3 总结评估',
-       'admin', CURRENT_TIMESTAMP, '0'
+       (SELECT min(user_id) FROM app_user.sys_user WHERE user_name = 'admin' AND del_flag = '0'), CURRENT_TIMESTAMP, '0'
   FROM dual
   FROM dual
  WHERE NOT EXISTS (SELECT 1 FROM app_user.dis_plan_library WHERE plan_name = '供水专项预案模板' AND del_flag = '0');
  WHERE NOT EXISTS (SELECT 1 FROM app_user.dis_plan_library WHERE plan_name = '供水专项预案模板' AND del_flag = '0');
+
+COMMIT;

+ 4 - 11
pipe-network-service/sql/dispatch_plan_version_attach.sql

@@ -1,16 +1,9 @@
 -- =====================================================================
 -- =====================================================================
 -- dispatch_plan_version_attach.sql
 -- dispatch_plan_version_attach.sql
--- 预案版本快照补充附件字段
+-- 预案版本快照附件字段清理(历史脚本名保留以避免升级流程引用失效)
 -- ---------------------------------------------------------------------
 -- ---------------------------------------------------------------------
--- 背景:版本是预案的快照日志,但快照里只有正文(content)没有附件,
--- 正文编辑入口此前也未开放,导致版本流程不完整。本次:
---   1. dis_plan_version 增加 attach_name / attach_path(随版本落快照);
---   2. 正文由前端编辑弹窗录入,随 savePlan 传入并进入版本快照。
--- 幂等:ADD COLUMN IF NOT EXISTS,可重复执行。
+-- 预案附件统一作为正文 HTML 中的富文本图片,不再单独保存附件名称/路径。
 -- =====================================================================
 -- =====================================================================
 
 
-ALTER TABLE app_user.dis_plan_version ADD COLUMN IF NOT EXISTS attach_name varchar(255);
-ALTER TABLE app_user.dis_plan_version ADD COLUMN IF NOT EXISTS attach_path  text;
-
-COMMENT ON COLUMN app_user.dis_plan_version.attach_name IS '附件名称快照';
-COMMENT ON COLUMN app_user.dis_plan_version.attach_path IS '附件URL快照(MinIO 直链)';
+ALTER TABLE app_user.dis_plan_version DROP COLUMN IF EXISTS attach_name;
+ALTER TABLE app_user.dis_plan_version DROP COLUMN IF EXISTS attach_path;

+ 110 - 72
pipe-network-service/sql/dispatch_refactor.sql

@@ -11,7 +11,7 @@
 --
 --
 -- 设计口径(2026-10-14 与业务确认):
 -- 设计口径(2026-10-14 与业务确认):
 --   · 事件等级:3 级 —— Ⅰ级(紧急) / Ⅱ级(较大) / Ⅲ级(一般)(原型口径)
 --   · 事件等级:3 级 —— Ⅰ级(紧急) / Ⅱ级(较大) / Ⅲ级(一般)(原型口径)
---   · 事件类别:保留两级 —— event_type(管网类型) + event_category(故障类别)
+--   · 事件类别、事件等级分别使用 dis_event_category / dis_event_level
 --   · 事件状态:5 态 —— 0 待核实 / 1 已核实 / 2 处置中 / 3 已解除 / 4 不实事件
 --   · 事件状态:5 态 —— 0 待核实 / 1 已核实 / 2 处置中 / 3 已解除 / 4 不实事件
 --     存量「待受理」归 0、「已关闭」归 3
 --     存量「待受理」归 0、「已关闭」归 3
 --
 --
@@ -19,9 +19,8 @@
 --   建表用 CREATE TABLE IF NOT EXISTS;加列用 ADD COLUMN IF NOT EXISTS;
 --   建表用 CREATE TABLE IF NOT EXISTS;加列用 ADD COLUMN IF NOT EXISTS;
 --   字典先 DELETE 同 dict_type 再 INSERT。
 --   字典先 DELETE 同 dict_type 再 INSERT。
 --
 --
--- ⚠️ 本脚本只做「新增」,不删除任何旧表/旧列/旧数据。
---    废弃旧表与旧列的 DROP 语句放在独立的 dispatch_refactor_drop.sql,
---    确认新结构运行正常后再单独执行。
+--    本版同时完成 dis_plan_library 的字段收敛:将类型/等级统一为字典编码,
+--    并删除已废弃的 event_region / topic / plan_summary 列。
 -- =====================================================================
 -- =====================================================================
 
 
 BEGIN;
 BEGIN;
@@ -45,13 +44,9 @@ CREATE TABLE IF NOT EXISTS app_user.dis_event (
     longitude        numeric(12,6),
     longitude        numeric(12,6),
     latitude         numeric(12,6),
     latitude         numeric(12,6),
     happen_time      timestamp,
     happen_time      timestamp,
-    report_time      timestamp,
-    reporter         varchar(64),
     reporter_phone   varchar(20),
     reporter_phone   varchar(20),
-    event_type       varchar(20),
     event_category   varchar(20),
     event_category   varchar(20),
     event_level      varchar(20),
     event_level      varchar(20),
-    event_region     varchar(20),
     status           int2 NOT NULL DEFAULT 0,
     status           int2 NOT NULL DEFAULT 0,
     verify_result    int2,
     verify_result    int2,
     verifier         varchar(64),
     verifier         varchar(64),
@@ -67,11 +62,9 @@ CREATE TABLE IF NOT EXISTS app_user.dis_event (
     last_visit_time  timestamp,
     last_visit_time  timestamp,
     next_visit_time  timestamp,
     next_visit_time  timestamp,
     need_upgrade     int2,
     need_upgrade     int2,
-    plan_id          int8,
-    loss_amount      numeric(14,2),
-    create_by        varchar(64),
+    create_user_id   int8,
     create_time      timestamp DEFAULT CURRENT_TIMESTAMP,
     create_time      timestamp DEFAULT CURRENT_TIMESTAMP,
-    update_by        varchar(64),
+    update_user_id   int8,
     update_time      timestamp DEFAULT CURRENT_TIMESTAMP,
     update_time      timestamp DEFAULT CURRENT_TIMESTAMP,
     del_flag         char(1) DEFAULT '0'
     del_flag         char(1) DEFAULT '0'
 );
 );
@@ -84,13 +77,9 @@ ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS location        varchar(
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS longitude       numeric(12,6);
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS longitude       numeric(12,6);
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS latitude        numeric(12,6);
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS latitude        numeric(12,6);
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS happen_time     timestamp;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS happen_time     timestamp;
-ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS report_time     timestamp;
-ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS reporter        varchar(64);
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS reporter_phone  varchar(20);
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS reporter_phone  varchar(20);
-ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS event_type      varchar(20);
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS event_category  varchar(20);
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS event_category  varchar(20);
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS event_level     varchar(20);
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS event_level     varchar(20);
-ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS event_region    varchar(20);
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS status          int2 DEFAULT 0;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS status          int2 DEFAULT 0;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS verify_result   int2;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS verify_result   int2;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS verifier        varchar(64);
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS verifier        varchar(64);
@@ -106,11 +95,9 @@ ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS release_note    varchar(
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS last_visit_time timestamp;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS last_visit_time timestamp;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS next_visit_time timestamp;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS next_visit_time timestamp;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS need_upgrade    int2;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS need_upgrade    int2;
-ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS plan_id         int8;
-ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS loss_amount     numeric(14,2);
-ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS create_by       varchar(64);
+ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS create_user_id  int8;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS create_time     timestamp DEFAULT CURRENT_TIMESTAMP;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS create_time     timestamp DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS update_by       varchar(64);
+ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS update_user_id  int8;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS update_time     timestamp DEFAULT CURRENT_TIMESTAMP;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS update_time     timestamp DEFAULT CURRENT_TIMESTAMP;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS del_flag        char(1) DEFAULT '0';
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS del_flag        char(1) DEFAULT '0';
 
 
@@ -124,13 +111,9 @@ COMMENT ON COLUMN app_user.dis_event.location        IS '发生地点';
 COMMENT ON COLUMN app_user.dis_event.longitude       IS '经度(发生地点地理编码得到)';
 COMMENT ON COLUMN app_user.dis_event.longitude       IS '经度(发生地点地理编码得到)';
 COMMENT ON COLUMN app_user.dis_event.latitude        IS '纬度(发生地点地理编码得到)';
 COMMENT ON COLUMN app_user.dis_event.latitude        IS '纬度(发生地点地理编码得到)';
 COMMENT ON COLUMN app_user.dis_event.happen_time     IS '发生时间';
 COMMENT ON COLUMN app_user.dis_event.happen_time     IS '发生时间';
-COMMENT ON COLUMN app_user.dis_event.report_time     IS '接报时间';
-COMMENT ON COLUMN app_user.dis_event.reporter        IS '接报人';
 COMMENT ON COLUMN app_user.dis_event.reporter_phone  IS '上报人联系电话';
 COMMENT ON COLUMN app_user.dis_event.reporter_phone  IS '上报人联系电话';
-COMMENT ON COLUMN app_user.dis_event.event_type      IS '管网类型:字典 dis_event_type(供水/燃气/排水/其他)';
 COMMENT ON COLUMN app_user.dis_event.event_category  IS '事件类别:字典 dis_event_category(管道泄漏/路面积水/设施损坏/管道堵塞)';
 COMMENT ON COLUMN app_user.dis_event.event_category  IS '事件类别:字典 dis_event_category(管道泄漏/路面积水/设施损坏/管道堵塞)';
 COMMENT ON COLUMN app_user.dis_event.event_level     IS '事件等级:字典 dis_event_level(1-Ⅰ级紧急 2-Ⅱ级较大 3-Ⅲ级一般)';
 COMMENT ON COLUMN app_user.dis_event.event_level     IS '事件等级:字典 dis_event_level(1-Ⅰ级紧急 2-Ⅱ级较大 3-Ⅲ级一般)';
-COMMENT ON COLUMN app_user.dis_event.event_region    IS '发生区域:字典 dis_event_region';
 COMMENT ON COLUMN app_user.dis_event.status          IS '事件状态:EventStatusEnum —— 0-待核实 1-已核实 2-处置中 3-已解除 4-不实事件;终态为 3、4';
 COMMENT ON COLUMN app_user.dis_event.status          IS '事件状态:EventStatusEnum —— 0-待核实 1-已核实 2-处置中 3-已解除 4-不实事件;终态为 3、4';
 COMMENT ON COLUMN app_user.dis_event.verify_result   IS '核实结论:0-真实 1-不实;仅 status in (1,4) 时有值';
 COMMENT ON COLUMN app_user.dis_event.verify_result   IS '核实结论:0-真实 1-不实;仅 status in (1,4) 时有值';
 COMMENT ON COLUMN app_user.dis_event.verifier        IS '核验人';
 COMMENT ON COLUMN app_user.dis_event.verifier        IS '核验人';
@@ -146,16 +129,26 @@ COMMENT ON COLUMN app_user.dis_event.release_note    IS '解除说明 / 处置
 COMMENT ON COLUMN app_user.dis_event.last_visit_time IS '最近回访时间(取最近一次处置跟踪的跟踪时间)';
 COMMENT ON COLUMN app_user.dis_event.last_visit_time IS '最近回访时间(取最近一次处置跟踪的跟踪时间)';
 COMMENT ON COLUMN app_user.dis_event.next_visit_time IS '下次回访时间(取最近一次处置跟踪填写的值)';
 COMMENT ON COLUMN app_user.dis_event.next_visit_time IS '下次回访时间(取最近一次处置跟踪填写的值)';
 COMMENT ON COLUMN app_user.dis_event.need_upgrade    IS '是否需要升级:字典 dis_yes_no(0-否 1-是),取最近一次处置跟踪填写的值';
 COMMENT ON COLUMN app_user.dis_event.need_upgrade    IS '是否需要升级:字典 dis_yes_no(0-否 1-是),取最近一次处置跟踪填写的值';
-COMMENT ON COLUMN app_user.dis_event.plan_id         IS '应用预案ID(dis_plan.id)';
-COMMENT ON COLUMN app_user.dis_event.loss_amount     IS '直接经济损失(万元)';
 COMMENT ON COLUMN app_user.dis_event.del_flag        IS '删除标志(0=正常 2=删除)';
 COMMENT ON COLUMN app_user.dis_event.del_flag        IS '删除标志(0=正常 2=删除)';
 
 
+ALTER TABLE app_user.dis_event
+    DROP COLUMN IF EXISTS reporter,
+    DROP COLUMN IF EXISTS reporter_id,
+    DROP COLUMN IF EXISTS report_time,
+    DROP COLUMN IF EXISTS create_by,
+    DROP COLUMN IF EXISTS update_by,
+    DROP COLUMN IF EXISTS loss_amount,
+    DROP COLUMN IF EXISTS plan_id,
+    DROP COLUMN IF EXISTS event_type,
+    DROP COLUMN IF EXISTS event_region,
+    DROP COLUMN IF EXISTS before_url,
+    DROP COLUMN IF EXISTS after_url;
+
 CREATE UNIQUE INDEX IF NOT EXISTS uk_dis_event_no       ON app_user.dis_event(event_no);
 CREATE UNIQUE INDEX IF NOT EXISTS uk_dis_event_no       ON app_user.dis_event(event_no);
 CREATE INDEX IF NOT EXISTS idx_dis_event_status         ON app_user.dis_event(status);
 CREATE INDEX IF NOT EXISTS idx_dis_event_status         ON app_user.dis_event(status);
-CREATE INDEX IF NOT EXISTS idx_dis_event_report_time    ON app_user.dis_event(report_time DESC);
+CREATE INDEX IF NOT EXISTS idx_dis_event_create_time    ON app_user.dis_event(create_time DESC);
 CREATE INDEX IF NOT EXISTS idx_dis_event_source         ON app_user.dis_event(event_source);
 CREATE INDEX IF NOT EXISTS idx_dis_event_source         ON app_user.dis_event(event_source);
 CREATE INDEX IF NOT EXISTS idx_dis_event_level          ON app_user.dis_event(event_level);
 CREATE INDEX IF NOT EXISTS idx_dis_event_level          ON app_user.dis_event(event_level);
-CREATE INDEX IF NOT EXISTS idx_dis_event_type           ON app_user.dis_event(event_type);
 
 
 -- ---------------------------------------------------------------------
 -- ---------------------------------------------------------------------
 -- 1.2 dis_event_log 事件日志表
 -- 1.2 dis_event_log 事件日志表
@@ -234,8 +227,11 @@ CREATE INDEX IF NOT EXISTS idx_dis_event_log_no    ON app_user.dis_event_log(eve
 -- ---------------------------------------------------------------------
 -- ---------------------------------------------------------------------
 -- 2.1 dis_plan 预案主表
 -- 2.1 dis_plan 预案主表
 -- ---------------------------------------------------------------------
 -- ---------------------------------------------------------------------
+CREATE SEQUENCE IF NOT EXISTS app_user.dis_plan_id_seq
+    START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
+
 CREATE TABLE IF NOT EXISTS app_user.dis_plan (
 CREATE TABLE IF NOT EXISTS app_user.dis_plan (
-    id             int8 GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
+    id             int8 NOT NULL DEFAULT nextval('app_user.dis_plan_id_seq'::regclass) PRIMARY KEY,
     plan_no        varchar(32),
     plan_no        varchar(32),
     plan_name      varchar(200) NOT NULL,
     plan_name      varchar(200) NOT NULL,
     plan_type      varchar(20),
     plan_type      varchar(20),
@@ -243,10 +239,7 @@ CREATE TABLE IF NOT EXISTS app_user.dis_plan (
     compile_unit   varchar(128),
     compile_unit   varchar(128),
     publish_unit   varchar(128),
     publish_unit   varchar(128),
     publish_date   varchar(20),
     publish_date   varchar(20),
-    attach_name    varchar(255),
-    attach_path    varchar(1000),
     is_template    int2 NOT NULL DEFAULT 0,
     is_template    int2 NOT NULL DEFAULT 0,
-    status         int2 NOT NULL DEFAULT 0,
     version        varchar(20),
     version        varchar(20),
     content        text,
     content        text,
     approve_result varchar(20),
     approve_result varchar(20),
@@ -259,14 +252,16 @@ CREATE TABLE IF NOT EXISTS app_user.dis_plan (
     del_flag       char(1) DEFAULT '0'
     del_flag       char(1) DEFAULT '0'
 );
 );
 
 
+-- 不在此处执行 OWNED BY:存量 Kingbase 表的 id 可能仍是 Identity,
+-- Identity 列不能直接重新绑定序列。存量库请执行对应的序列迁移脚本
+--(例如 dispatch_plan_version_id_sequence.sql)后再绑定所有权。
+
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS plan_no        varchar(32);
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS plan_no        varchar(32);
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS plan_type      varchar(20);
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS plan_type      varchar(20);
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS plan_level     varchar(20);
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS plan_level     varchar(20);
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS compile_unit   varchar(128);
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS compile_unit   varchar(128);
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS publish_unit   varchar(128);
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS publish_unit   varchar(128);
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS publish_date   varchar(20);
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS publish_date   varchar(20);
-ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS attach_name    varchar(255);
-ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS attach_path    varchar(1000);
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS is_template    int2 DEFAULT 0;
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS is_template    int2 DEFAULT 0;
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS status         int2 DEFAULT 0;
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS status         int2 DEFAULT 0;
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS version        varchar(20);
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS version        varchar(20);
@@ -280,6 +275,11 @@ ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS update_by      varchar(64
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS update_time    timestamp DEFAULT CURRENT_TIMESTAMP;
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS update_time    timestamp DEFAULT CURRENT_TIMESTAMP;
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS del_flag       char(1) DEFAULT '0';
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS del_flag       char(1) DEFAULT '0';
 
 
+-- 正文富文本承载图片附件,移除历史独立附件字段。
+ALTER TABLE app_user.dis_plan
+    DROP COLUMN IF EXISTS attach_name,
+    DROP COLUMN IF EXISTS attach_path;
+
 COMMENT ON TABLE  app_user.dis_plan IS '应急预案主表:预案编辑与预案审批共用同一套数据,状态流转 草稿→待审核→已通过/已驳回';
 COMMENT ON TABLE  app_user.dis_plan IS '应急预案主表:预案编辑与预案审批共用同一套数据,状态流转 草稿→待审核→已通过/已驳回';
 COMMENT ON COLUMN app_user.dis_plan.plan_no        IS '预案编号(业务序号:YA+yyyyMMdd+4位随机)';
 COMMENT ON COLUMN app_user.dis_plan.plan_no        IS '预案编号(业务序号:YA+yyyyMMdd+4位随机)';
 COMMENT ON COLUMN app_user.dis_plan.plan_name      IS '预案名称';
 COMMENT ON COLUMN app_user.dis_plan.plan_name      IS '预案名称';
@@ -288,8 +288,6 @@ COMMENT ON COLUMN app_user.dis_plan.plan_level     IS '预案等级:字典 dis
 COMMENT ON COLUMN app_user.dis_plan.compile_unit   IS '编制单位';
 COMMENT ON COLUMN app_user.dis_plan.compile_unit   IS '编制单位';
 COMMENT ON COLUMN app_user.dis_plan.publish_unit   IS '发布单位';
 COMMENT ON COLUMN app_user.dis_plan.publish_unit   IS '发布单位';
 COMMENT ON COLUMN app_user.dis_plan.publish_date   IS '发布日期';
 COMMENT ON COLUMN app_user.dis_plan.publish_date   IS '发布日期';
-COMMENT ON COLUMN app_user.dis_plan.attach_name    IS '附件名称';
-COMMENT ON COLUMN app_user.dis_plan.attach_path    IS '附件路径';
 COMMENT ON COLUMN app_user.dis_plan.is_template    IS '是否预案模板:0-否 1-是(新建预案时可套用模板的章节结构)';
 COMMENT ON COLUMN app_user.dis_plan.is_template    IS '是否预案模板:0-否 1-是(新建预案时可套用模板的章节结构)';
 COMMENT ON COLUMN app_user.dis_plan.status         IS 'PlanStatusEnum:0-草稿 1-待审核 2-已通过 3-已驳回';
 COMMENT ON COLUMN app_user.dis_plan.status         IS 'PlanStatusEnum:0-草稿 1-待审核 2-已通过 3-已驳回';
 COMMENT ON COLUMN app_user.dis_plan.version        IS '当前生效版本号;尚未审批通过时为空';
 COMMENT ON COLUMN app_user.dis_plan.version        IS '当前生效版本号;尚未审批通过时为空';
@@ -305,8 +303,11 @@ CREATE INDEX IF NOT EXISTS idx_dis_plan_template     ON app_user.dis_plan(is_tem
 -- ---------------------------------------------------------------------
 -- ---------------------------------------------------------------------
 -- 2.2 dis_plan_version 预案版本快照表
 -- 2.2 dis_plan_version 预案版本快照表
 -- ---------------------------------------------------------------------
 -- ---------------------------------------------------------------------
+CREATE SEQUENCE IF NOT EXISTS app_user.dis_plan_version_id_seq
+    START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
+
 CREATE TABLE IF NOT EXISTS app_user.dis_plan_version (
 CREATE TABLE IF NOT EXISTS app_user.dis_plan_version (
-    id          int8 GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
+    id          int8 NOT NULL DEFAULT nextval('app_user.dis_plan_version_id_seq'::regclass) PRIMARY KEY,
     plan_id     int8 NOT NULL,
     plan_id     int8 NOT NULL,
     plan_no     varchar(32),
     plan_no     varchar(32),
     version     varchar(20) NOT NULL,
     version     varchar(20) NOT NULL,
@@ -324,6 +325,10 @@ ALTER TABLE app_user.dis_plan_version ADD COLUMN IF NOT EXISTS editor      varch
 ALTER TABLE app_user.dis_plan_version ADD COLUMN IF NOT EXISTS edit_time   timestamp;
 ALTER TABLE app_user.dis_plan_version ADD COLUMN IF NOT EXISTS edit_time   timestamp;
 ALTER TABLE app_user.dis_plan_version ADD COLUMN IF NOT EXISTS ver_status  int2 DEFAULT 0;
 ALTER TABLE app_user.dis_plan_version ADD COLUMN IF NOT EXISTS ver_status  int2 DEFAULT 0;
 
 
+ALTER TABLE app_user.dis_plan_version
+    DROP COLUMN IF EXISTS attach_name,
+    DROP COLUMN IF EXISTS attach_path;
+
 COMMENT ON TABLE  app_user.dis_plan_version IS '应急预案版本快照:审核通过后的正文落地为版本;修订已通过预案先生成「审核中」候选版本,旧版本仍生效';
 COMMENT ON TABLE  app_user.dis_plan_version IS '应急预案版本快照:审核通过后的正文落地为版本;修订已通过预案先生成「审核中」候选版本,旧版本仍生效';
 COMMENT ON COLUMN app_user.dis_plan_version.plan_id     IS '关联 dis_plan.id';
 COMMENT ON COLUMN app_user.dis_plan_version.plan_id     IS '关联 dis_plan.id';
 COMMENT ON COLUMN app_user.dis_plan_version.version     IS '版本号,如 v3.1';
 COMMENT ON COLUMN app_user.dis_plan_version.version     IS '版本号,如 v3.1';
@@ -340,8 +345,11 @@ CREATE UNIQUE INDEX IF NOT EXISTS uk_dis_plan_version ON app_user.dis_plan_versi
 -- 2.3 dis_plan_log 预案操作日志表
 -- 2.3 dis_plan_log 预案操作日志表
 --     替代旧 dis_plan_approval + dis_plan_approval_step(原型审批为单环节)
 --     替代旧 dis_plan_approval + dis_plan_approval_step(原型审批为单环节)
 -- ---------------------------------------------------------------------
 -- ---------------------------------------------------------------------
+CREATE SEQUENCE IF NOT EXISTS app_user.dis_plan_log_id_seq
+    START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
+
 CREATE TABLE IF NOT EXISTS app_user.dis_plan_log (
 CREATE TABLE IF NOT EXISTS app_user.dis_plan_log (
-    id             int8 GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
+    id             int8 NOT NULL DEFAULT nextval('app_user.dis_plan_log_id_seq'::regclass) PRIMARY KEY,
     plan_id        int8 NOT NULL,
     plan_id        int8 NOT NULL,
     plan_no        varchar(32),
     plan_no        varchar(32),
     oper_type      int2 NOT NULL CHECK (oper_type BETWEEN 0 AND 4),
     oper_type      int2 NOT NULL CHECK (oper_type BETWEEN 0 AND 4),
@@ -372,57 +380,94 @@ COMMENT ON COLUMN app_user.dis_plan_log.status_to   IS '变更后预案状态';
 
 
 CREATE INDEX IF NOT EXISTS idx_dis_plan_log_plan ON app_user.dis_plan_log(plan_id, oper_time, id);
 CREATE INDEX IF NOT EXISTS idx_dis_plan_log_plan ON app_user.dis_plan_log(plan_id, oper_time, id);
 
 
+-- ---------------------------------------------------------------------
+-- 2.4 dis_plan_library 数字预案库字段收敛
+--     event_type / event_level 与 dis_plan 使用同一套字典编码;
+--     event_region、topic、plan_summary 已不再参与模板匹配,直接移除。
+--     创建人统一使用 create_user_id,移除 create_by 登录名快照。
+-- ---------------------------------------------------------------------
+ALTER TABLE app_user.dis_plan_library
+    ALTER COLUMN event_type TYPE varchar(20),
+    ALTER COLUMN event_level TYPE varchar(20);
+
+-- 将历史上保存的中文标签转换为 dis_plan_type / dis_plan_level 的字典值。
+UPDATE app_user.dis_plan_library
+   SET event_type = CASE trim(event_type)
+       WHEN '综合' THEN '1'
+       WHEN '专项' THEN '2'
+       WHEN '现场处置' THEN '3'
+       WHEN '供水' THEN '2'
+       WHEN '燃气' THEN '2'
+       WHEN '排水' THEN '2'
+       ELSE event_type END,
+       event_level = CASE trim(event_level)
+       WHEN 'Ⅰ级' THEN '1'
+       WHEN 'I级' THEN '1'
+       WHEN '1级' THEN '1'
+       WHEN 'Ⅱ级' THEN '2'
+       WHEN 'II级' THEN '2'
+       WHEN '2级' THEN '2'
+       WHEN 'Ⅲ级' THEN '3'
+       WHEN 'III级' THEN '3'
+       WHEN '3级' THEN '3'
+       ELSE event_level END;
+
+ALTER TABLE app_user.dis_plan_library
+    DROP COLUMN IF EXISTS event_region,
+    DROP COLUMN IF EXISTS topic,
+    DROP COLUMN IF EXISTS plan_summary,
+    DROP COLUMN IF EXISTS create_by;
+
+COMMENT ON COLUMN app_user.dis_plan_library.event_type
+    IS '预案类型:字典 dis_plan_type,与 dis_plan.plan_type 使用同一编码';
+COMMENT ON COLUMN app_user.dis_plan_library.event_level
+    IS '预案等级:字典 dis_plan_level,与 dis_plan.plan_level 使用同一编码';
+CREATE INDEX IF NOT EXISTS idx_dis_plan_library_type_level
+    ON app_user.dis_plan_library(event_type, event_level);
+
 -- =====================================================================
 -- =====================================================================
 -- 三、事件分级(保留原表,字段字典化 + 补业务编号)
 -- 三、事件分级(保留原表,字段字典化 + 补业务编号)
 -- =====================================================================
 -- =====================================================================
+CREATE SEQUENCE IF NOT EXISTS app_user.dis_event_grade_id_seq
+    START WITH 1 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
+
 CREATE TABLE IF NOT EXISTS app_user.dis_event_grade (
 CREATE TABLE IF NOT EXISTS app_user.dis_event_grade (
-    id             int8 GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
-    grade_no       varchar(32),
+    id             int8 NOT NULL DEFAULT nextval('app_user.dis_event_grade_id_seq'::regclass) PRIMARY KEY,
     event_category varchar(20),
     event_category varchar(20),
-    event_type     varchar(20),
     event_level    varchar(20),
     event_level    varchar(20),
-    sub_category   varchar(50),
-    scenario       varchar(200),
     criteria       text,
     criteria       text,
     response       varchar(500),
     response       varchar(500),
-    status         int2 NOT NULL DEFAULT 0,
     remark         varchar(500),
     remark         varchar(500),
-    create_by      varchar(64),
     create_time    timestamp DEFAULT CURRENT_TIMESTAMP,
     create_time    timestamp DEFAULT CURRENT_TIMESTAMP,
-    update_by      varchar(64),
     update_time    timestamp DEFAULT CURRENT_TIMESTAMP,
     update_time    timestamp DEFAULT CURRENT_TIMESTAMP,
     del_flag       char(1) DEFAULT '0'
     del_flag       char(1) DEFAULT '0'
 );
 );
 
 
-ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS grade_no       varchar(32);
+
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS event_category varchar(20);
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS event_category varchar(20);
-ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS event_type     varchar(20);
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS event_level    varchar(20);
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS event_level    varchar(20);
-ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS sub_category   varchar(50);
-ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS scenario       varchar(200);
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS criteria       text;
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS criteria       text;
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS response       varchar(500);
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS response       varchar(500);
-ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS status         int2 DEFAULT 0;
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS remark         varchar(500);
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS remark         varchar(500);
-ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS create_by      varchar(64);
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS create_time    timestamp DEFAULT CURRENT_TIMESTAMP;
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS create_time    timestamp DEFAULT CURRENT_TIMESTAMP;
-ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS update_by      varchar(64);
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS update_time    timestamp DEFAULT CURRENT_TIMESTAMP;
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS update_time    timestamp DEFAULT CURRENT_TIMESTAMP;
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS del_flag       char(1) DEFAULT '0';
 ALTER TABLE app_user.dis_event_grade ADD COLUMN IF NOT EXISTS del_flag       char(1) DEFAULT '0';
 
 
+-- 分级标准不再单独保存管网类型,清理存量库中的历史遗留列。
+ALTER TABLE app_user.dis_event_grade DROP COLUMN IF EXISTS event_type;
+ALTER TABLE app_user.dis_event_grade DROP COLUMN IF EXISTS status;
+ALTER TABLE app_user.dis_event_grade DROP COLUMN IF EXISTS create_by;
+ALTER TABLE app_user.dis_event_grade DROP COLUMN IF EXISTS update_by;
+
 COMMENT ON TABLE  app_user.dis_event_grade IS '应急事件分级分类标准,同时作为初判核实的辅助核实依据';
 COMMENT ON TABLE  app_user.dis_event_grade IS '应急事件分级分类标准,同时作为初判核实的辅助核实依据';
-COMMENT ON COLUMN app_user.dis_event_grade.grade_no       IS '标准编号(业务序号:GJ+yyyyMMdd+3位随机)';
 COMMENT ON COLUMN app_user.dis_event_grade.event_category IS '事件类别:字典 dis_event_category';
 COMMENT ON COLUMN app_user.dis_event_grade.event_category IS '事件类别:字典 dis_event_category';
-COMMENT ON COLUMN app_user.dis_event_grade.event_type     IS '管网类型:字典 dis_event_type';
 COMMENT ON COLUMN app_user.dis_event_grade.event_level    IS '事件等级:字典 dis_event_level';
 COMMENT ON COLUMN app_user.dis_event_grade.event_level    IS '事件等级:字典 dis_event_level';
-COMMENT ON COLUMN app_user.dis_event_grade.sub_category   IS '类别细分';
-COMMENT ON COLUMN app_user.dis_event_grade.scenario       IS '适用场景';
+ALTER TABLE app_user.dis_event_grade DROP COLUMN IF EXISTS sub_category;
+ALTER TABLE app_user.dis_event_grade DROP COLUMN IF EXISTS scenario;
 COMMENT ON COLUMN app_user.dis_event_grade.criteria       IS '分级分类判断标准';
 COMMENT ON COLUMN app_user.dis_event_grade.criteria       IS '分级分类判断标准';
 COMMENT ON COLUMN app_user.dis_event_grade.response       IS '响应要求,如:30 分钟内启动预案';
 COMMENT ON COLUMN app_user.dis_event_grade.response       IS '响应要求,如:30 分钟内启动预案';
-COMMENT ON COLUMN app_user.dis_event_grade.status         IS '标准生效状态:0-启用 1-停用';
 
 
-CREATE UNIQUE INDEX IF NOT EXISTS uk_dis_event_grade_no ON app_user.dis_event_grade(grade_no);
-CREATE INDEX IF NOT EXISTS idx_dis_event_grade_query    ON app_user.dis_event_grade(event_category, event_level, status);
+CREATE INDEX IF NOT EXISTS idx_dis_event_grade_query    ON app_user.dis_event_grade(event_category, event_level);
 
 
 -- =====================================================================
 -- =====================================================================
 -- 四、存量数据迁移 —— 见独立文件 dispatch_refactor_migrate.sql
 -- 四、存量数据迁移 —— 见独立文件 dispatch_refactor_migrate.sql
@@ -437,21 +482,22 @@ CREATE INDEX IF NOT EXISTS idx_dis_event_grade_query    ON app_user.dis_event_gr
 -- =====================================================================
 -- =====================================================================
 
 
 DELETE FROM app_user.sys_dict_data
 DELETE FROM app_user.sys_dict_data
- WHERE dict_type IN ('dis_event_source','dis_event_channel','dis_event_type','dis_event_category',
-                     'dis_event_level','dis_event_region','dis_event_urge_method','dis_event_urge_result',
+ WHERE dict_type IN ('dis_event_source','dis_event_channel','dis_event_category',
+                     'dis_event_level','dis_event_urge_method','dis_event_urge_result',
                      'dis_event_trend','dis_event_false_reason','dis_event_release_reason',
                      'dis_event_trend','dis_event_false_reason','dis_event_release_reason',
                      'dis_transfer_dept','dis_report_target',
                      'dis_transfer_dept','dis_report_target',
                      'dis_plan_type','dis_plan_level','dis_yes_no');
                      'dis_plan_type','dis_plan_level','dis_yes_no');
 
 
+DELETE FROM app_user.sys_dict_type
+ WHERE dict_type IN ('dis_event_type', 'dis_event_region');
+
 INSERT INTO app_user.sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark)
 INSERT INTO app_user.sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark)
 SELECT v.dict_name, v.dict_type, '0', 'admin', CURRENT_TIMESTAMP, v.remark
 SELECT v.dict_name, v.dict_type, '0', 'admin', CURRENT_TIMESTAMP, v.remark
   FROM (VALUES
   FROM (VALUES
         ('应急事件来源',     'dis_event_source',         '应急事件来源:1巡查上报 2呼叫中心 3视频监控 4上级下达'),
         ('应急事件来源',     'dis_event_source',         '应急事件来源:1巡查上报 2呼叫中心 3视频监控 4上级下达'),
         ('应急事件来源渠道', 'dis_event_channel',        '应急事件来源渠道'),
         ('应急事件来源渠道', 'dis_event_channel',        '应急事件来源渠道'),
-        ('应急管网类型',     'dis_event_type',           '应急事件管网类型:1供水管网 2燃气管网 3排水管网 9其他'),
         ('应急事件类别',     'dis_event_category',       '应急事件类别:故障类别'),
         ('应急事件类别',     'dis_event_category',       '应急事件类别:故障类别'),
         ('应急事件等级',     'dis_event_level',          '应急事件等级:1Ⅰ级紧急 2Ⅱ级较大 3Ⅲ级一般'),
         ('应急事件等级',     'dis_event_level',          '应急事件等级:1Ⅰ级紧急 2Ⅱ级较大 3Ⅲ级一般'),
-        ('应急事件区域',     'dis_event_region',         '应急事件发生区域'),
         ('工作催办方式',     'dis_event_urge_method',    '工作催办方式:1电话 2短信 3系统消息'),
         ('工作催办方式',     'dis_event_urge_method',    '工作催办方式:1电话 2短信 3系统消息'),
         ('工作催办结果',     'dis_event_urge_result',    '工作催办结果:0未反馈 1已反馈'),
         ('工作催办结果',     'dis_event_urge_result',    '工作催办结果:0未反馈 1已反馈'),
         ('处置态势评估',     'dis_event_trend',          '处置跟踪的态势评估:1趋于平稳 2仍在发展 3明显恶化'),
         ('处置态势评估',     'dis_event_trend',          '处置跟踪的态势评估:1趋于平稳 2仍在发展 3明显恶化'),
@@ -480,10 +526,6 @@ VALUES
 (4, '交警监控共享平台', '4', 'dis_event_channel', '', '',        'N', '0', 'admin', CURRENT_TIMESTAMP, '来源渠道:交警监控共享平台'),
 (4, '交警监控共享平台', '4', 'dis_event_channel', '', '',        'N', '0', 'admin', CURRENT_TIMESTAMP, '来源渠道:交警监控共享平台'),
 (5, '其他',             '9', 'dis_event_channel', '', '',        'N', '0', 'admin', CURRENT_TIMESTAMP, '来源渠道:其他'),
 (5, '其他',             '9', 'dis_event_channel', '', '',        'N', '0', 'admin', CURRENT_TIMESTAMP, '来源渠道:其他'),
 -- 管网类型
 -- 管网类型
-(1, '供水管网',         '1', 'dis_event_type',    '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, '应急管网类型:供水管网'),
-(2, '燃气管网',         '2', 'dis_event_type',    '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, '应急管网类型:燃气管网'),
-(3, '排水管网',         '3', 'dis_event_type',    '', 'info',    'N', '0', 'admin', CURRENT_TIMESTAMP, '应急管网类型:排水管网'),
-(4, '其他',             '9', 'dis_event_type',    '', '',        'N', '0', 'admin', CURRENT_TIMESTAMP, '应急管网类型:其他'),
 -- 事件类别
 -- 事件类别
 (1, '管道泄漏',         '1', 'dis_event_category', '', 'danger',  'N', '0', 'admin', CURRENT_TIMESTAMP, '事件类别:管道泄漏'),
 (1, '管道泄漏',         '1', 'dis_event_category', '', 'danger',  'N', '0', 'admin', CURRENT_TIMESTAMP, '事件类别:管道泄漏'),
 (2, '路面积水',         '2', 'dis_event_category', '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, '事件类别:路面积水'),
 (2, '路面积水',         '2', 'dis_event_category', '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, '事件类别:路面积水'),
@@ -494,10 +536,6 @@ VALUES
 (2, 'Ⅱ级(较大)',     '2', 'dis_event_level',   '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, '事件等级:Ⅱ级较大'),
 (2, 'Ⅱ级(较大)',     '2', 'dis_event_level',   '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, '事件等级:Ⅱ级较大'),
 (3, 'Ⅲ级(一般)',     '3', 'dis_event_level',   '', 'info',    'Y', '0', 'admin', CURRENT_TIMESTAMP, '事件等级:Ⅲ级一般'),
 (3, 'Ⅲ级(一般)',     '3', 'dis_event_level',   '', 'info',    'Y', '0', 'admin', CURRENT_TIMESTAMP, '事件等级:Ⅲ级一般'),
 -- 发生区域(按实际片区维护,以下为占位默认值)
 -- 发生区域(按实际片区维护,以下为占位默认值)
-(1, '城东片区',         '1', 'dis_event_region',  '', '',        'N', '0', 'admin', CURRENT_TIMESTAMP, '发生区域:城东片区(按实际维护)'),
-(2, '城南片区',         '2', 'dis_event_region',  '', '',        'Y', '0', 'admin', CURRENT_TIMESTAMP, '发生区域:城南片区(按实际维护)'),
-(3, '城北片区',         '3', 'dis_event_region',  '', '',        'N', '0', 'admin', CURRENT_TIMESTAMP, '发生区域:城北片区(按实际维护)'),
-(4, '太常片区',         '4', 'dis_event_region',  '', '',        'N', '0', 'admin', CURRENT_TIMESTAMP, '发生区域:太常片区(按实际维护)'),
 -- 催办方式
 -- 催办方式
 (1, '电话',             '1', 'dis_event_urge_method', '', '',    'Y', '0', 'admin', CURRENT_TIMESTAMP, '催办方式:电话'),
 (1, '电话',             '1', 'dis_event_urge_method', '', '',    'Y', '0', 'admin', CURRENT_TIMESTAMP, '催办方式:电话'),
 (2, '短信',             '2', 'dis_event_urge_method', '', '',    'N', '0', 'admin', CURRENT_TIMESTAMP, '催办方式:短信'),
 (2, '短信',             '2', 'dis_event_urge_method', '', '',    'N', '0', 'admin', CURRENT_TIMESTAMP, '催办方式:短信'),

+ 2 - 2
pipe-network-service/sql/dispatch_refactor_migrate.sql

@@ -303,12 +303,12 @@ BEGIN
         -- 3.1 主表搬迁;plan_no 用业务序号格式回填(YA + yyyyMMdd + 4 位补零序列)
         -- 3.1 主表搬迁;plan_no 用业务序号格式回填(YA + yyyyMMdd + 4 位补零序列)
         INSERT INTO app_user.dis_plan
         INSERT INTO app_user.dis_plan
             (plan_no, plan_name, plan_type, plan_level, compile_unit, publish_unit, publish_date,
             (plan_no, plan_name, plan_type, plan_level, compile_unit, publish_unit, publish_date,
-             attach_name, attach_path, is_template, status, version, content, create_by, create_time)
+             is_template, status, version, content, create_by, create_time)
         -- 拼接必须用 concat():本实例 `||` 是 boolean OR,详见文件头「方言红线」
         -- 拼接必须用 concat():本实例 `||` 是 boolean OR,详见文件头「方言红线」
         SELECT concat('YA', to_char(CURRENT_TIMESTAMP, 'YYYYMMDD'),
         SELECT concat('YA', to_char(CURRENT_TIMESTAMP, 'YYYYMMDD'),
                       lpad(CAST(t.rn AS varchar), 4, '0')),
                       lpad(CAST(t.rn AS varchar), 4, '0')),
                t.plan_name, t.plan_type, t.plan_level, t.compile_unit, t.publish_unit, t.publish_date,
                t.plan_name, t.plan_type, t.plan_level, t.compile_unit, t.publish_unit, t.publish_date,
-               t.attach_name, t.attach_path, 0, 0, t.version, t.plan_content, t.create_by, t.create_time
+               0, 0, t.version, t.plan_content, t.create_by, t.create_time
           FROM (SELECT p.*, row_number() OVER (ORDER BY p.id) AS rn
           FROM (SELECT p.*, row_number() OVER (ORDER BY p.id) AS rn
                   FROM app_user.dis_event_plan p
                   FROM app_user.dis_event_plan p
                  WHERE NOT EXISTS (SELECT 1 FROM app_user.dis_plan d WHERE d.plan_name = p.plan_name)) t;
                  WHERE NOT EXISTS (SELECT 1 FROM app_user.dis_plan d WHERE d.plan_name = p.plan_name)) t;

+ 15 - 55
pipe-network-service/sql/migration_dispatch_user_id.sql

@@ -11,7 +11,7 @@
 --
 --
 -- 本脚本做什么:
 -- 本脚本做什么:
 --   1) 补 *_id 列(int8,与 sys_user.user_id 同类型):
 --   1) 补 *_id 列(int8,与 sys_user.user_id 同类型):
---        dis_event            reporter_id / verifier_id / handler_id / create_user_id / update_user_id
+--        dis_event            verifier_id / handler_id / create_user_id / update_user_id
 --        dis_plan             create_user_id / update_user_id
 --        dis_plan             create_user_id / update_user_id
 --        dis_plan_version     editor_id
 --        dis_plan_version     editor_id
 --        dis_event_grade      create_user_id / update_user_id
 --        dis_event_grade      create_user_id / update_user_id
@@ -22,9 +22,12 @@
 --      命中多条或查不到的一律留空,避免张冠李戴。
 --      命中多条或查不到的一律留空,避免张冠李戴。
 --
 --
 -- 口径说明(重要):
 -- 口径说明(重要):
---   · 名称列(reporter / verifier / handler / editor / assessor / create_by / update_by)
+--   · 名称列(verifier / handler / editor / assessor / create_by / update_by)
 --     **保留不删**,作为快照冗余:① 兼容存量数据;② 用户离职被删后仍能展示文字。
 --     **保留不删**,作为快照冗余:① 兼容存量数据;② 用户离职被删后仍能展示文字。
 --     展示口径:以 *_id 反查 sys_user.nick_name 为准,查不到再退回名称快照。
 --     展示口径:以 *_id 反查 sys_user.nick_name 为准,查不到再退回名称快照。
+--   · dis_event 接报人统一由 create_user_id 关联,不再保留 reporter / reporter_id;
+--     该表 create_by / update_by 亦已移除,审计只使用 create_user_id / update_user_id。
+--   · dis_plan_library 已移除 create_by,创建人只使用 create_user_id,不再按旧名称回填。
 --   · create_by / update_by 是 RuoYi 通用字段,存的是**登录名 sys_user.user_name**,
 --   · create_by / update_by 是 RuoYi 通用字段,存的是**登录名 sys_user.user_name**,
 --     故回填按 user_name 匹配;其余业务人员列存的是**昵称 sys_user.nick_name**,按 nick_name 匹配。
 --     故回填按 user_name 匹配;其余业务人员列存的是**昵称 sys_user.nick_name**,按 nick_name 匹配。
 --   · 不变更任何现存列的类型与取值,纯新增,不破坏既有功能。
 --   · 不变更任何现存列的类型与取值,纯新增,不破坏既有功能。
@@ -49,17 +52,15 @@ BEGIN;
 -- =====================================================================
 -- =====================================================================
 
 
 -- 1.1 dis_event 事件主表
 -- 1.1 dis_event 事件主表
-ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS reporter_id     int8;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS verifier_id     int8;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS verifier_id     int8;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS handler_id      int8;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS handler_id      int8;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS create_user_id  int8;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS create_user_id  int8;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS update_user_id  int8;
 ALTER TABLE app_user.dis_event ADD COLUMN IF NOT EXISTS update_user_id  int8;
 
 
-COMMENT ON COLUMN app_user.dis_event.reporter_id    IS '接报人用户ID(sys_user.user_id);接报登记时固定取当前录入人员,与 reporter 快照同时写入';
 COMMENT ON COLUMN app_user.dis_event.verifier_id    IS '核验人用户ID(sys_user.user_id);初判核实时的当前登录用户';
 COMMENT ON COLUMN app_user.dis_event.verifier_id    IS '核验人用户ID(sys_user.user_id);初判核实时的当前登录用户';
 COMMENT ON COLUMN app_user.dis_event.handler_id     IS '责任处置人用户ID(sys_user.user_id);与 handler 快照、handler_phone 同时写入';
 COMMENT ON COLUMN app_user.dis_event.handler_id     IS '责任处置人用户ID(sys_user.user_id);与 handler 快照、handler_phone 同时写入';
-COMMENT ON COLUMN app_user.dis_event.create_user_id IS '创建人用户ID(sys_user.user_id);create_by 存登录名,本列存ID';
-COMMENT ON COLUMN app_user.dis_event.update_user_id IS '最后修改人用户ID(sys_user.user_id);update_by 存登录名,本列存ID';
+COMMENT ON COLUMN app_user.dis_event.create_user_id IS '创建人用户ID(sys_user.user_id)';
+COMMENT ON COLUMN app_user.dis_event.update_user_id IS '最后修改人用户ID(sys_user.user_id)';
 
 
 -- 1.2 dis_plan 预案主表
 -- 1.2 dis_plan 预案主表
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS create_user_id int8;
 ALTER TABLE app_user.dis_plan ADD COLUMN IF NOT EXISTS create_user_id int8;
@@ -93,11 +94,10 @@ COMMENT ON COLUMN app_user.dis_event_assess.update_user_id IS '最后修改人
 ALTER TABLE app_user.dis_plan_library      ADD COLUMN IF NOT EXISTS create_user_id int8;
 ALTER TABLE app_user.dis_plan_library      ADD COLUMN IF NOT EXISTS create_user_id int8;
 ALTER TABLE app_user.dis_plan_match_record ADD COLUMN IF NOT EXISTS create_user_id int8;
 ALTER TABLE app_user.dis_plan_match_record ADD COLUMN IF NOT EXISTS create_user_id int8;
 
 
-COMMENT ON COLUMN app_user.dis_plan_library.create_user_id      IS '创建人用户ID(sys_user.user_id);create_by 存登录名,本列存ID';
+COMMENT ON COLUMN app_user.dis_plan_library.create_user_id      IS '创建人用户ID(sys_user.user_id)';
 COMMENT ON COLUMN app_user.dis_plan_match_record.create_user_id IS '创建人用户ID(sys_user.user_id);create_by 存登录名,本列存ID';
 COMMENT ON COLUMN app_user.dis_plan_match_record.create_user_id IS '创建人用户ID(sys_user.user_id);create_by 存登录名,本列存ID';
 
 
 -- 1.7 索引:列表可能按「我的接报 / 我核实的」筛选
 -- 1.7 索引:列表可能按「我的接报 / 我核实的」筛选
-CREATE INDEX IF NOT EXISTS idx_dis_event_reporter_id ON app_user.dis_event(reporter_id);
 CREATE INDEX IF NOT EXISTS idx_dis_event_verifier_id ON app_user.dis_event(verifier_id);
 CREATE INDEX IF NOT EXISTS idx_dis_event_verifier_id ON app_user.dis_event(verifier_id);
 CREATE INDEX IF NOT EXISTS idx_dis_event_handler_id  ON app_user.dis_event(handler_id);
 CREATE INDEX IF NOT EXISTS idx_dis_event_handler_id  ON app_user.dis_event(handler_id);
 
 
@@ -107,17 +107,7 @@ CREATE INDEX IF NOT EXISTS idx_dis_event_handler_id  ON app_user.dis_event(handl
 --     只回填「唯一命中」的名称;同名(如两个「张伟」)或查不到的一律留空。
 --     只回填「唯一命中」的名称;同名(如两个「张伟」)或查不到的一律留空。
 -- =====================================================================
 -- =====================================================================
 
 
--- 2.1 dis_event —— 接报人(昵称)
-UPDATE app_user.dis_event e
-   SET reporter_id = m.user_id
-  FROM (SELECT nick_name, min(user_id) AS user_id, count(*) AS cnt
-          FROM app_user.sys_user WHERE del_flag = '0' GROUP BY nick_name) m
- WHERE e.reporter_id IS NULL
-   AND e.reporter IS NOT NULL
-   AND e.reporter = m.nick_name
-   AND m.cnt = 1;
-
--- 2.2 dis_event —— 核验人(昵称)
+-- 2.1 dis_event —— 核验人(昵称)
 UPDATE app_user.dis_event e
 UPDATE app_user.dis_event e
    SET verifier_id = m.user_id
    SET verifier_id = m.user_id
   FROM (SELECT nick_name, min(user_id) AS user_id, count(*) AS cnt
   FROM (SELECT nick_name, min(user_id) AS user_id, count(*) AS cnt
@@ -127,7 +117,7 @@ UPDATE app_user.dis_event e
    AND e.verifier = m.nick_name
    AND e.verifier = m.nick_name
    AND m.cnt = 1;
    AND m.cnt = 1;
 
 
--- 2.3 dis_event —— 责任处置人(昵称)
+-- 2.2 dis_event —— 责任处置人(昵称)
 UPDATE app_user.dis_event e
 UPDATE app_user.dis_event e
    SET handler_id = m.user_id
    SET handler_id = m.user_id
   FROM (SELECT nick_name, min(user_id) AS user_id, count(*) AS cnt
   FROM (SELECT nick_name, min(user_id) AS user_id, count(*) AS cnt
@@ -137,25 +127,6 @@ UPDATE app_user.dis_event e
    AND e.handler = m.nick_name
    AND e.handler = m.nick_name
    AND m.cnt = 1;
    AND m.cnt = 1;
 
 
--- 2.4 dis_event —— 创建人 / 修改人(登录名)
-UPDATE app_user.dis_event e
-   SET create_user_id = m.user_id
-  FROM (SELECT user_name, min(user_id) AS user_id, count(*) AS cnt
-          FROM app_user.sys_user WHERE del_flag = '0' GROUP BY user_name) m
- WHERE e.create_user_id IS NULL
-   AND e.create_by IS NOT NULL
-   AND e.create_by = m.user_name
-   AND m.cnt = 1;
-
-UPDATE app_user.dis_event e
-   SET update_user_id = m.user_id
-  FROM (SELECT user_name, min(user_id) AS user_id, count(*) AS cnt
-          FROM app_user.sys_user WHERE del_flag = '0' GROUP BY user_name) m
- WHERE e.update_user_id IS NULL
-   AND e.update_by IS NOT NULL
-   AND e.update_by = m.user_name
-   AND m.cnt = 1;
-
 -- 2.5 dis_plan —— 创建人 / 修改人(登录名)
 -- 2.5 dis_plan —— 创建人 / 修改人(登录名)
 UPDATE app_user.dis_plan p
 UPDATE app_user.dis_plan p
    SET create_user_id = m.user_id
    SET create_user_id = m.user_id
@@ -233,16 +204,7 @@ UPDATE app_user.dis_event_assess a
    AND a.update_by = m.user_name
    AND a.update_by = m.user_name
    AND m.cnt = 1;
    AND m.cnt = 1;
 
 
--- 2.10 dis_plan_library / dis_plan_match_record —— 创建人(登录名)
-UPDATE app_user.dis_plan_library l
-   SET create_user_id = m.user_id
-  FROM (SELECT user_name, min(user_id) AS user_id, count(*) AS cnt
-          FROM app_user.sys_user WHERE del_flag = '0' GROUP BY user_name) m
- WHERE l.create_user_id IS NULL
-   AND l.create_by IS NOT NULL
-   AND l.create_by = m.user_name
-   AND m.cnt = 1;
-
+-- 2.10 dis_plan_match_record —— 创建人(登录名);预案库不再保留 create_by。
 UPDATE app_user.dis_plan_match_record r
 UPDATE app_user.dis_plan_match_record r
    SET create_user_id = m.user_id
    SET create_user_id = m.user_id
   FROM (SELECT user_name, min(user_id) AS user_id, count(*) AS cnt
   FROM (SELECT user_name, min(user_id) AS user_id, count(*) AS cnt
@@ -264,13 +226,11 @@ COMMIT;
 --                          'dis_event_assess','dis_plan_library','dis_plan_match_record')
 --                          'dis_event_assess','dis_plan_library','dis_plan_match_record')
 --     ORDER BY table_name, column_name;
 --     ORDER BY table_name, column_name;
 -- 2) 回填覆盖率(total = 有名称的行数,filled = 已回填用户ID的行数)
 -- 2) 回填覆盖率(total = 有名称的行数,filled = 已回填用户ID的行数)
---    SELECT 'dis_event.reporter' AS col, count(reporter) AS total, count(reporter_id) AS filled FROM app_user.dis_event
---     UNION ALL SELECT 'dis_event.verifier',      count(verifier),   count(verifier_id)   FROM app_user.dis_event
+--    SELECT 'dis_event.verifier' AS col, count(verifier) AS total, count(verifier_id) AS filled FROM app_user.dis_event
 --     UNION ALL SELECT 'dis_event.handler',       count(handler),    count(handler_id)    FROM app_user.dis_event
 --     UNION ALL SELECT 'dis_event.handler',       count(handler),    count(handler_id)    FROM app_user.dis_event
---     UNION ALL SELECT 'dis_event.create_by',     count(create_by),  count(create_user_id) FROM app_user.dis_event
 --     UNION ALL SELECT 'dis_plan.create_by',      count(create_by),  count(create_user_id) FROM app_user.dis_plan
 --     UNION ALL SELECT 'dis_plan.create_by',      count(create_by),  count(create_user_id) FROM app_user.dis_plan
 --     UNION ALL SELECT 'dis_plan_version.editor', count(editor),     count(editor_id)     FROM app_user.dis_plan_version;
 --     UNION ALL SELECT 'dis_plan_version.editor', count(editor),     count(editor_id)     FROM app_user.dis_plan_version;
 -- 3) 名称与ID是否对得上(应返回 0 行)
 -- 3) 名称与ID是否对得上(应返回 0 行)
---    SELECT id, reporter, reporter_id FROM app_user.dis_event e
---     WHERE reporter_id IS NOT NULL
---       AND NOT EXISTS (SELECT 1 FROM app_user.sys_user u WHERE u.user_id = e.reporter_id AND u.nick_name = e.reporter);
+--    SELECT id, verifier, verifier_id FROM app_user.dis_event e
+--     WHERE verifier_id IS NOT NULL
+--       AND NOT EXISTS (SELECT 1 FROM app_user.sys_user u WHERE u.user_id = e.verifier_id AND u.nick_name = e.verifier);

+ 2 - 23
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/dispatch/DisEventController.java

@@ -7,20 +7,7 @@ import com.zksy.common.core.domain.AjaxResult;
 import com.zksy.common.enums.BusinessType;
 import com.zksy.common.enums.BusinessType;
 import com.zksy.dispatch.domain.DisEvent;
 import com.zksy.dispatch.domain.DisEvent;
 import com.zksy.dispatch.domain.DisEventLog;
 import com.zksy.dispatch.domain.DisEventLog;
-import com.zksy.dispatch.dto.DisDeptOptionVO;
-import com.zksy.dispatch.dto.DisEventPageDTO;
-import com.zksy.dispatch.dto.DisEventVO;
-import com.zksy.dispatch.dto.EnumOptionVO;
-import com.zksy.dispatch.dto.EventLogPageDTO;
-import com.zksy.dispatch.dto.EventReleaseDTO;
-import com.zksy.dispatch.dto.EventSaveDTO;
-import com.zksy.dispatch.dto.EventStatsVO;
-import com.zksy.dispatch.dto.EventTransferDTO;
-import com.zksy.dispatch.dto.EventTrackDTO;
-import com.zksy.dispatch.dto.EventUrgeDTO;
-import com.zksy.dispatch.dto.EventUrgePageDTO;
-import com.zksy.dispatch.dto.EventUrgeRowVO;
-import com.zksy.dispatch.dto.EventVerifyDTO;
+import com.zksy.dispatch.dto.*;
 import com.zksy.dispatch.enums.EventStatusEnum;
 import com.zksy.dispatch.enums.EventStatusEnum;
 import com.zksy.dispatch.service.DisEventLogService;
 import com.zksy.dispatch.service.DisEventLogService;
 import com.zksy.dispatch.service.DisEventService;
 import com.zksy.dispatch.service.DisEventService;
@@ -28,16 +15,8 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.List;
 import java.util.List;

+ 3 - 17
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/dispatch/DisEventGradeController.java

@@ -7,8 +7,6 @@ import com.zksy.common.core.domain.AjaxResult;
 import com.zksy.common.enums.BusinessType;
 import com.zksy.common.enums.BusinessType;
 import com.zksy.dispatch.domain.DisEventGrade;
 import com.zksy.dispatch.domain.DisEventGrade;
 import com.zksy.dispatch.dto.DisEventGradePageDTO;
 import com.zksy.dispatch.dto.DisEventGradePageDTO;
-import com.zksy.dispatch.dto.EnumOptionVO;
-import com.zksy.dispatch.enums.GradeStatusEnum;
 import com.zksy.dispatch.service.DisEventGradeService;
 import com.zksy.dispatch.service.DisEventGradeService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
@@ -25,15 +23,13 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.List;
-import java.util.stream.Collectors;
 
 
 /**
 /**
  * 应急事件分级分类标准接口
  * 应急事件分级分类标准接口
  *
  *
  * <p>类别与等级取字典 {@code dis_event_category} / {@code dis_event_level}
  * <p>类别与等级取字典 {@code dis_event_category} / {@code dis_event_level}
- * 的编码值,不再使用中文常量;状态见 {@code GradeStatusEnum}。</p>
+ * 的编码值,不再使用中文常量。</p>
  */
  */
 @Slf4j
 @Slf4j
 @RestController
 @RestController
@@ -67,18 +63,8 @@ public class DisEventGradeController {
         return AjaxResult.success(service.listByCategory(eventCategory));
         return AjaxResult.success(service.listByCategory(eventCategory));
     }
     }
 
 
-    @GetMapping("/statusOptions")
-    @ApiOperation("启用状态下拉项(GradeStatusEnum,供前端筛选使用)")
-    @PreAuthorize("@ss.hasPermi('dispatch:grade:list')")
-    public AjaxResult statusOptions() {
-        List<EnumOptionVO> options = Arrays.stream(GradeStatusEnum.values())
-                .map(item -> new EnumOptionVO(item.getCode(), item.getDesc()))
-                .collect(Collectors.toList());
-        return AjaxResult.success(options);
-    }
-
     @PostMapping("/save")
     @PostMapping("/save")
-    @ApiOperation("新增分级标准(自动生成标准编号,默认启用)")
+    @ApiOperation("新增分级标准")
     @Log(title = "新增分级标准", businessType = BusinessType.INSERT)
     @Log(title = "新增分级标准", businessType = BusinessType.INSERT)
     @PreAuthorize("@ss.hasPermi('dispatch:grade:add')")
     @PreAuthorize("@ss.hasPermi('dispatch:grade:add')")
     public AjaxResult save(@RequestBody DisEventGrade entity) {
     public AjaxResult save(@RequestBody DisEventGrade entity) {
@@ -86,7 +72,7 @@ public class DisEventGradeController {
     }
     }
 
 
     @PutMapping("/updateById")
     @PutMapping("/updateById")
-    @ApiOperation("修改分级标准(标准编号不可改)")
+    @ApiOperation("修改分级标准")
     @Log(title = "修改分级标准", businessType = BusinessType.UPDATE)
     @Log(title = "修改分级标准", businessType = BusinessType.UPDATE)
     @PreAuthorize("@ss.hasPermi('dispatch:grade:edit')")
     @PreAuthorize("@ss.hasPermi('dispatch:grade:edit')")
     public AjaxResult updateById(@RequestBody DisEventGrade entity) {
     public AjaxResult updateById(@RequestBody DisEventGrade entity) {

+ 0 - 9
pipe-network-service/zksy-admin/src/main/java/com/zksy/web/controller/dispatch/DisPlanLibraryController.java

@@ -44,7 +44,6 @@ public class DisPlanLibraryController {
         }
         }
         java.time.LocalDateTime now = java.time.LocalDateTime.now();
         java.time.LocalDateTime now = java.time.LocalDateTime.now();
         if (entity.getId() == null) {
         if (entity.getId() == null) {
-            entity.setCreateBy(currentUser());
             try {
             try {
                 entity.setCreateUserId(com.zksy.common.utils.SecurityUtils.getUserId());
                 entity.setCreateUserId(com.zksy.common.utils.SecurityUtils.getUserId());
             } catch (Exception ignored) {
             } catch (Exception ignored) {
@@ -75,14 +74,6 @@ public class DisPlanLibraryController {
         return AjaxResult.success(results);
         return AjaxResult.success(results);
     }
     }
 
 
-    @PostMapping("/matchByTopic")
-    @ApiOperation("按专题匹配预案")
-    @Log(title = "专题匹配应急预案", businessType = BusinessType.OTHER)
-    public AjaxResult matchByTopic(@RequestBody PlanMatchDTO dto) {
-        List<PlanMatchResultVO> results = service.matchByTopic(dto.getTopic(), currentUser());
-        return AjaxResult.success(results);
-    }
-
     @GetMapping("/history")
     @GetMapping("/history")
     @ApiOperation("查询最近匹配记录")
     @ApiOperation("查询最近匹配记录")
     @Anonymous
     @Anonymous

+ 0 - 34
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/domain/DisEvent.java

@@ -59,31 +59,15 @@ public class DisEvent {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime happenTime;
     private LocalDateTime happenTime;
 
 
-    @ApiModelProperty("接报时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private LocalDateTime reportTime;
-
-    @ApiModelProperty("接报人")
-    private String reporter;
-
-    @ApiModelProperty("接报人用户ID(sys_user.user_id);接报登记时取当前录入人员")
-    private Long reporterId;
-
     @ApiModelProperty("上报人联系电话")
     @ApiModelProperty("上报人联系电话")
     private String reporterPhone;
     private String reporterPhone;
 
 
-    @ApiModelProperty("管网类型:字典 dis_event_type")
-    private String eventType;
-
     @ApiModelProperty("事件类别:字典 dis_event_category")
     @ApiModelProperty("事件类别:字典 dis_event_category")
     private String eventCategory;
     private String eventCategory;
 
 
     @ApiModelProperty("事件等级:字典 dis_event_level")
     @ApiModelProperty("事件等级:字典 dis_event_level")
     private String eventLevel;
     private String eventLevel;
 
 
-    @ApiModelProperty("发生区域:字典 dis_event_region")
-    private String eventRegion;
-
     @ApiModelProperty("事件状态:EventStatusEnum —— 0待核实 1已核实 2处置中 3已解除 4不实事件")
     @ApiModelProperty("事件状态:EventStatusEnum —— 0待核实 1已核实 2处置中 3已解除 4不实事件")
     private Integer status;
     private Integer status;
 
 
@@ -129,12 +113,6 @@ public class DisEvent {
     @ApiModelProperty("解除说明 / 处置结果补充")
     @ApiModelProperty("解除说明 / 处置结果补充")
     private String releaseNote;
     private String releaseNote;
 
 
-    @ApiModelProperty("处置前附件URL(图片/视频,多个英文逗号分隔;解除原因为「事件已处置完成」时上传)")
-    private String beforeUrl;
-
-    @ApiModelProperty("处置后附件URL(图片/视频,多个英文逗号分隔;解除原因为「事件已处置完成」时上传)")
-    private String afterUrl;
-
     @ApiModelProperty("最近回访时间")
     @ApiModelProperty("最近回访时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime lastVisitTime;
     private LocalDateTime lastVisitTime;
@@ -146,15 +124,6 @@ public class DisEvent {
     @ApiModelProperty("是否需要升级:字典 dis_yes_no")
     @ApiModelProperty("是否需要升级:字典 dis_yes_no")
     private Integer needUpgrade;
     private Integer needUpgrade;
 
 
-    @ApiModelProperty("应用预案ID(dis_plan.id)")
-    private Long planId;
-
-    @ApiModelProperty("直接经济损失(万元)")
-    private BigDecimal lossAmount;
-
-    @ApiModelProperty("创建人")
-    private String createBy;
-
     @ApiModelProperty("创建人用户ID(sys_user.user_id);createBy 存登录名,本字段存ID")
     @ApiModelProperty("创建人用户ID(sys_user.user_id);createBy 存登录名,本字段存ID")
     private Long createUserId;
     private Long createUserId;
 
 
@@ -162,9 +131,6 @@ public class DisEvent {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime createTime;
     private LocalDateTime createTime;
 
 
-    @ApiModelProperty("更新人")
-    private String updateBy;
-
     @ApiModelProperty("最后修改人用户ID(sys_user.user_id);updateBy 存登录名,本字段存ID")
     @ApiModelProperty("最后修改人用户ID(sys_user.user_id);updateBy 存登录名,本字段存ID")
     private Long updateUserId;
     private Long updateUserId;
 
 

+ 4 - 29
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/domain/DisEventGrade.java

@@ -17,11 +17,10 @@ import java.time.LocalDateTime;
  * 应急事件分级分类标准(dis_event_grade)
  * 应急事件分级分类标准(dis_event_grade)
  * 改造要点:
  * 改造要点:
  * <ul>
  * <ul>
- * <li>补业务编号 gradeNo(GJ+yyyyMMdd+3位随机),主键仍为 int8 自增</li>
+ * <li>主键由 dis_event_grade_id_seq 生成</li>
  * <li>原 category / level 改名 event_category / event_level,
  * <li>原 category / level 改名 event_category / event_level,
  * 复用字典 dis_event_category / dis_event_level,顺带消掉
  * 复用字典 dis_event_category / dis_event_level,顺带消掉
- * level 保留字要写 "level" 转义的坑</li>
- * <li>status 由中文 varchar 改为 int2:见 com.zksy.dispatch.enums.GradeStatusEnum</li>
+ * level 保留字要写 "level" 转义的坑;分级标准不再单独保存管网类型</li>
  * <li>补 response 响应要求列(原型「应急预案分级」有此列)</li>
  * <li>补 response 响应要求列(原型「应急预案分级」有此列)</li>
  * </ul>
  * </ul>
  * @author zengy
  * @author zengy
@@ -36,50 +35,29 @@ public class DisEventGrade {
     @ApiModelProperty("主键ID")
     @ApiModelProperty("主键ID")
     private Long id;
     private Long id;
 
 
-    @ApiModelProperty("标准编号(业务序号:GJ+yyyyMMdd+3位随机,保存前生成,普通更新不可修改)")
-    private String gradeNo;
-
     @ApiModelProperty("事件类别:字典 dis_event_category")
     @ApiModelProperty("事件类别:字典 dis_event_category")
     private String eventCategory;
     private String eventCategory;
 
 
-    @ApiModelProperty("管网类型:字典 dis_event_type")
-    private String eventType;
-
     @ApiModelProperty("事件等级:字典 dis_event_level")
     @ApiModelProperty("事件等级:字典 dis_event_level")
     private String eventLevel;
     private String eventLevel;
 
 
-    @ApiModelProperty("类别细分")
-    private String subCategory;
-
-    @ApiModelProperty("适用场景")
-    private String scenario;
-
     @ApiModelProperty("分级分类判断标准")
     @ApiModelProperty("分级分类判断标准")
     private String criteria;
     private String criteria;
 
 
     @ApiModelProperty("响应要求")
     @ApiModelProperty("响应要求")
     private String response;
     private String response;
 
 
-    @ApiModelProperty("启用状态:GradeStatusEnum —— 0启用 1停用")
-    private Integer status;
-
     @ApiModelProperty("备注")
     @ApiModelProperty("备注")
     private String remark;
     private String remark;
 
 
-    @ApiModelProperty("创建人")
-    private String createBy;
-
-    @ApiModelProperty("创建人用户ID(sys_user.user_id);createBy 存登录名,本字段存ID")
+    @ApiModelProperty("创建人用户ID(sys_user.user_id)")
     private Long createUserId;
     private Long createUserId;
 
 
     @ApiModelProperty("创建时间")
     @ApiModelProperty("创建时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime createTime;
     private LocalDateTime createTime;
 
 
-    @ApiModelProperty("更新人")
-    private String updateBy;
-
-    @ApiModelProperty("最后修改人用户ID(sys_user.user_id);updateBy 存登录名,本字段存ID")
+    @ApiModelProperty("最后修改人用户ID(sys_user.user_id)")
     private Long updateUserId;
     private Long updateUserId;
 
 
     @ApiModelProperty("更新时间")
     @ApiModelProperty("更新时间")
@@ -90,7 +68,4 @@ public class DisEventGrade {
     @ApiModelProperty("删除标志(0=正常 2=删除)")
     @ApiModelProperty("删除标志(0=正常 2=删除)")
     private String delFlag;
     private String delFlag;
 
 
-    @TableField(exist = false)
-    @ApiModelProperty("启用状态名称(由 status 推导)")
-    private String statusName;
 }
 }

+ 0 - 6
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/domain/DisPlan.java

@@ -53,12 +53,6 @@ public class DisPlan {
     @ApiModelProperty("发布日期")
     @ApiModelProperty("发布日期")
     private String publishDate;
     private String publishDate;
 
 
-    @ApiModelProperty("附件名称")
-    private String attachName;
-
-    @ApiModelProperty("附件路径")
-    private String attachPath;
-
     @ApiModelProperty("是否预案模板:0-否 1-是")
     @ApiModelProperty("是否预案模板:0-否 1-是")
     private Integer isTemplate;
     private Integer isTemplate;
 
 

+ 3 - 15
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/domain/DisPlanLibrary.java

@@ -28,31 +28,19 @@ public class DisPlanLibrary {
     @ApiModelProperty("预案名称")
     @ApiModelProperty("预案名称")
     private String planName;
     private String planName;
 
 
-    @ApiModelProperty("事件类型(排水/供水/燃气)")
+    @ApiModelProperty("预案类型(字典 dis_plan_type)")
     private String eventType;
     private String eventType;
 
 
-    @ApiModelProperty("事件级别")
+    @ApiModelProperty("预案等级(字典 dis_plan_level)")
     private String eventLevel;
     private String eventLevel;
 
 
-    @ApiModelProperty("发生区域(城南/城北/太常)")
-    private String eventRegion;
-
     @ApiModelProperty("责任单位(供水局/燃气公司/排水公司)")
     @ApiModelProperty("责任单位(供水局/燃气公司/排水公司)")
     private String responsibleUnit;
     private String responsibleUnit;
 
 
-    @ApiModelProperty("所属专题(排水专题/供水专题/燃气专题)")
-    private String topic;
-
-    @ApiModelProperty("预案概要")
-    private String planSummary;
-
     @ApiModelProperty("预案内容")
     @ApiModelProperty("预案内容")
     private String planContent;
     private String planContent;
 
 
-    @ApiModelProperty("创建人")
-    private String createBy;
-
-    @ApiModelProperty("创建人用户ID(sys_user.user_id);createBy 存登录名,本字段存ID")
+    @ApiModelProperty("创建人用户ID(sys_user.user_id)")
     private Long createUserId;
     private Long createUserId;
 
 
     @ApiModelProperty("创建时间")
     @ApiModelProperty("创建时间")

+ 0 - 6
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/domain/DisPlanVersion.java

@@ -44,12 +44,6 @@ public class DisPlanVersion {
     @ApiModelProperty("该版本正文快照(富文本 HTML)")
     @ApiModelProperty("该版本正文快照(富文本 HTML)")
     private String content;
     private String content;
 
 
-    @ApiModelProperty("附件名称快照")
-    private String attachName;
-
-    @ApiModelProperty("附件URL快照(MinIO 直链)")
-    private String attachPath;
-
     @ApiModelProperty("变更说明;修订已通过预案时必填")
     @ApiModelProperty("变更说明;修订已通过预案时必填")
     private String changeNote;
     private String changeNote;
 
 

+ 4 - 4
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/DisDeptOptionVO.java

@@ -7,15 +7,15 @@ import lombok.Data;
 import java.io.Serializable;
 import java.io.Serializable;
 
 
 /**
 /**
- * 责任单位下拉项(系统部门)
- * 初判核实时「责任单位」不再手填,改为选择系统部门(sys_dept);前端用
- * deptId 树形展示并用它过滤责任处置人候选(该部门所属人员),提交时把
+ * 部门下拉项(系统部门)
+ * 初判核实时「处置单位」选择系统部门(sys_dept);前端用 deptId 树形展示并
+ * 过滤处置人候选(所选部门及其所有下级部门),提交时把
  * deptName 写入 dis_event.department(该列存部门中文名,工作催办、
  * deptName 写入 dis_event.department(该列存部门中文名,工作催办、
  * 多条件筛选均按名称口径,保持不变)。
  * 多条件筛选均按名称口径,保持不变)。
  * @author zengy
  * @author zengy
  */
  */
 @Data
 @Data
-@ApiModel(value = "责任单位下拉项", description = "应急事件责任单位可选系统部门")
+@ApiModel(value = "部门下拉项", description = "应急事件处置单位可选系统部门")
 public class DisDeptOptionVO implements Serializable {
 public class DisDeptOptionVO implements Serializable {
 
 
     private static final long serialVersionUID = 1L;
     private static final long serialVersionUID = 1L;

+ 0 - 9
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/DisEventGradePageDTO.java

@@ -15,21 +15,12 @@ public class DisEventGradePageDTO implements Serializable {
 
 
     private static final long serialVersionUID = 1L;
     private static final long serialVersionUID = 1L;
 
 
-    @ApiModelProperty(value = "标准编号(模糊)")
-    private String gradeNo;
-
     @ApiModelProperty(value = "事件类别:字典 dis_event_category")
     @ApiModelProperty(value = "事件类别:字典 dis_event_category")
     private String eventCategory;
     private String eventCategory;
 
 
-    @ApiModelProperty(value = "管网类型:字典 dis_event_type")
-    private String eventType;
-
     @ApiModelProperty(value = "事件等级:字典 dis_event_level")
     @ApiModelProperty(value = "事件等级:字典 dis_event_level")
     private String eventLevel;
     private String eventLevel;
 
 
-    @ApiModelProperty(value = "启用状态:GradeStatusEnum —— 0启用 1停用")
-    private Integer status;
-
     @ApiModelProperty(value = "创建开始日期(yyyy-MM-dd,含当天)")
     @ApiModelProperty(value = "创建开始日期(yyyy-MM-dd,含当天)")
     private String startDate;
     private String startDate;
 
 

+ 0 - 9
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/DisEventPageDTO.java

@@ -24,9 +24,6 @@ public class DisEventPageDTO implements Serializable {
     @ApiModelProperty(value = "事件描述(模糊)")
     @ApiModelProperty(value = "事件描述(模糊)")
     private String description;
     private String description;
 
 
-    @ApiModelProperty(value = "管网类型:字典 dis_event_type")
-    private String eventType;
-
     @ApiModelProperty(value = "事件类别:字典 dis_event_category")
     @ApiModelProperty(value = "事件类别:字典 dis_event_category")
     private String eventCategory;
     private String eventCategory;
 
 
@@ -36,9 +33,6 @@ public class DisEventPageDTO implements Serializable {
     @ApiModelProperty(value = "事件来源:字典 dis_event_source")
     @ApiModelProperty(value = "事件来源:字典 dis_event_source")
     private String eventSource;
     private String eventSource;
 
 
-    @ApiModelProperty(value = "发生区域:字典 dis_event_region")
-    private String eventRegion;
-
     @ApiModelProperty(value = "发生地点(模糊)")
     @ApiModelProperty(value = "发生地点(模糊)")
     private String location;
     private String location;
 
 
@@ -60,9 +54,6 @@ public class DisEventPageDTO implements Serializable {
     @ApiModelProperty(value = "接报结束日期 yyyy-MM-dd")
     @ApiModelProperty(value = "接报结束日期 yyyy-MM-dd")
     private String endDate;
     private String endDate;
 
 
-    @ApiModelProperty(value = "直接经济损失区间:0-1万 1-10万 10-100万 100万以上")
-    private String lossRange;
-
     @ApiModelProperty(value = "排序方向:true=接报时间升序(先报先办的队列页),不传或 false=倒序(记录回看页)")
     @ApiModelProperty(value = "排序方向:true=接报时间升序(先报先办的队列页),不传或 false=倒序(记录回看页)")
     private Boolean orderAsc;
     private Boolean orderAsc;
 
 

+ 2 - 23
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/DisEventVO.java

@@ -50,31 +50,22 @@ public class DisEventVO implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime happenTime;
     private LocalDateTime happenTime;
 
 
-    @ApiModelProperty(value = "接报时间")
+    @ApiModelProperty(value = "接报时间(兼容字段,取 create_time)")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime reportTime;
     private LocalDateTime reportTime;
 
 
-    @ApiModelProperty(value = "接报人(按 reporterId 反查 sys_user 昵称,查不到退回快照)")
+    @ApiModelProperty(value = "接报人(按 create_user_id 反查 sys_user 昵称)")
     private String reporter;
     private String reporter;
 
 
-    @ApiModelProperty(value = "接报人用户ID")
-    private Long reporterId;
-
     @ApiModelProperty(value = "上报人联系电话")
     @ApiModelProperty(value = "上报人联系电话")
     private String reporterPhone;
     private String reporterPhone;
 
 
-    @ApiModelProperty(value = "管网类型:字典 dis_event_type")
-    private String eventType;
-
     @ApiModelProperty(value = "事件类别:字典 dis_event_category")
     @ApiModelProperty(value = "事件类别:字典 dis_event_category")
     private String eventCategory;
     private String eventCategory;
 
 
     @ApiModelProperty(value = "事件等级:字典 dis_event_level")
     @ApiModelProperty(value = "事件等级:字典 dis_event_level")
     private String eventLevel;
     private String eventLevel;
 
 
-    @ApiModelProperty(value = "发生区域:字典 dis_event_region")
-    private String eventRegion;
-
     @ApiModelProperty(value = "事件状态:EventStatusEnum")
     @ApiModelProperty(value = "事件状态:EventStatusEnum")
     private Integer status;
     private Integer status;
 
 
@@ -126,12 +117,6 @@ public class DisEventVO implements Serializable {
     @ApiModelProperty(value = "解除说明")
     @ApiModelProperty(value = "解除说明")
     private String releaseNote;
     private String releaseNote;
 
 
-    @ApiModelProperty(value = "处置前附件URL(图片/视频,多个英文逗号分隔)")
-    private String beforeUrl;
-
-    @ApiModelProperty(value = "处置后附件URL(图片/视频,多个英文逗号分隔)")
-    private String afterUrl;
-
     @ApiModelProperty(value = "最近回访时间")
     @ApiModelProperty(value = "最近回访时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime lastVisitTime;
     private LocalDateTime lastVisitTime;
@@ -143,15 +128,9 @@ public class DisEventVO implements Serializable {
     @ApiModelProperty(value = "是否需要升级:字典 dis_yes_no")
     @ApiModelProperty(value = "是否需要升级:字典 dis_yes_no")
     private Integer needUpgrade;
     private Integer needUpgrade;
 
 
-    @ApiModelProperty(value = "应用预案ID")
-    private Long planId;
-
     @ApiModelProperty(value = "应用预案名称")
     @ApiModelProperty(value = "应用预案名称")
     private String planName;
     private String planName;
 
 
-    @ApiModelProperty(value = "直接经济损失(万元)")
-    private BigDecimal lossAmount;
-
     @ApiModelProperty(value = "创建时间")
     @ApiModelProperty(value = "创建时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime createTime;
     private LocalDateTime createTime;

+ 3 - 5
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/DisUserOptionVO.java

@@ -7,14 +7,12 @@ import lombok.Data;
 import java.io.Serializable;
 import java.io.Serializable;
 
 
 /**
 /**
- * 责任处置人下拉项(系统用户)
- * 初判核实时「责任处置人」不再手填,改为选择系统用户;选中后前端用
- * phonenumber 自动带出「联系电话」,用 nickName 写入
- * dis_event.handler(工作催办即按该字段找催办对象,故必须是可读姓名)。
+ * 应急事件操作的用户下拉项(系统用户)。
+ * 用于初判核实选择处置人、核验人;处置人 nickName 写入 dis_event.handler。
  * @author zengy
  * @author zengy
  */
  */
 @Data
 @Data
-@ApiModel(value = "责任处置人下拉项", description = "应急事件责任处置人可选系统用户")
+@ApiModel(value = "应急事件用户下拉项", description = "应急事件处置人和核验人可选系统用户")
 public class DisUserOptionVO implements Serializable {
 public class DisUserOptionVO implements Serializable {
 
 
     private static final long serialVersionUID = 1L;
     private static final long serialVersionUID = 1L;

+ 0 - 9
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/EventReleaseDTO.java

@@ -5,7 +5,6 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 
 
 import java.io.Serializable;
 import java.io.Serializable;
-import java.math.BigDecimal;
 
 
 /**
 /**
  * 事件解除入参
  * 事件解除入参
@@ -26,12 +25,4 @@ public class EventReleaseDTO implements Serializable {
     @ApiModelProperty(value = "解除说明 / 处置结果补充")
     @ApiModelProperty(value = "解除说明 / 处置结果补充")
     private String releaseNote;
     private String releaseNote;
 
 
-    @ApiModelProperty(value = "直接经济损失(万元);为空时保持原值")
-    private BigDecimal lossAmount;
-
-    @ApiModelProperty(value = "处置前附件URL(图片/视频,多个英文逗号分隔;解除原因为「事件已处置完成」时上传)")
-    private String beforeUrl;
-
-    @ApiModelProperty(value = "处置后附件URL(图片/视频,多个英文逗号分隔;解除原因为「事件已处置完成」时上传)")
-    private String afterUrl;
 }
 }

+ 0 - 10
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/EventSaveDTO.java

@@ -30,9 +30,6 @@ public class EventSaveDTO implements Serializable {
     @ApiModelProperty(value = "来源渠道:字典 dis_event_channel")
     @ApiModelProperty(value = "来源渠道:字典 dis_event_channel")
     private String channel;
     private String channel;
 
 
-    @ApiModelProperty(value = "管网类型:字典 dis_event_type(1供水管网 2燃气管网 3排水管网 9其他)")
-    private String eventType;
-
     @ApiModelProperty(value = "发生地点", required = true)
     @ApiModelProperty(value = "发生地点", required = true)
     private String location;
     private String location;
 
 
@@ -49,13 +46,6 @@ public class EventSaveDTO implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime happenTime;
     private LocalDateTime happenTime;
 
 
-    @ApiModelProperty(value = "接报时间;为空时取当前时间")
-    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private LocalDateTime reportTime;
-
-    @ApiModelProperty(value = "接报人;新增时忽略传入值,后端固定取当前登录用户;编辑时也不可改")
-    private String reporter;
-
     @ApiModelProperty(value = "上报人联系电话")
     @ApiModelProperty(value = "上报人联系电话")
     private String reporterPhone;
     private String reporterPhone;
 
 

+ 13 - 13
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/EventVerifyDTO.java

@@ -8,8 +8,8 @@ import java.io.Serializable;
 
 
 /**
 /**
  * 初判核实入参
  * 初判核实入参
- * 真实性判定为「真实」时补齐管网类型 / 事件类别 / 事件等级 / 责任处置人;
- * 判定为「不实」时只需填写核销原因,事件直接结束。
+ * 真实性判定为「真实」时填写类别、等级、处置单位及可选处置人;
+ * 判定为「不真实」时隐藏业务处置字段,可附带核实意见,事件直接结束。
  */
  */
 @Data
 @Data
 @ApiModel(value = "初判核实入参", description = "初判核实入参")
 @ApiModel(value = "初判核实入参", description = "初判核实入参")
@@ -23,33 +23,33 @@ public class EventVerifyDTO implements Serializable {
     @ApiModelProperty(value = "核实结论:0-真实 1-不实", required = true)
     @ApiModelProperty(value = "核实结论:0-真实 1-不实", required = true)
     private Integer verifyResult;
     private Integer verifyResult;
 
 
-    @ApiModelProperty(value = "管网类型:字典 dis_event_type")
-    private String eventType;
-
     @ApiModelProperty(value = "事件类别:字典 dis_event_category")
     @ApiModelProperty(value = "事件类别:字典 dis_event_category")
     private String eventCategory;
     private String eventCategory;
 
 
     @ApiModelProperty(value = "事件等级:字典 dis_event_level")
     @ApiModelProperty(value = "事件等级:字典 dis_event_level")
     private String eventLevel;
     private String eventLevel;
 
 
-    @ApiModelProperty(value = "发生区域:字典 dis_event_region")
-    private String eventRegion;
-
-    @ApiModelProperty(value = "责任处置人")
+    @ApiModelProperty(value = "处置人")
     private String handler;
     private String handler;
 
 
-    @ApiModelProperty(value = "责任处置人用户ID(sys_user.user_id);前端从系统用户下拉选中后回传")
+    @ApiModelProperty(value = "处置人用户ID(sys_user.user_id);须属于处置单位或其下级部门")
     private Long handlerId;
     private Long handlerId;
 
 
-    @ApiModelProperty(value = "责任处置人电话")
+    @ApiModelProperty(value = "兼容旧客户端;当前核实流程不再使用")
     private String handlerPhone;
     private String handlerPhone;
 
 
-    @ApiModelProperty(value = "责任单位")
+    @ApiModelProperty(value = "处置单位名称")
     private String department;
     private String department;
 
 
+    @ApiModelProperty(value = "处置单位部门ID")
+    private Long deptId;
+
     @ApiModelProperty(value = "核验人;为空时取当前登录用户")
     @ApiModelProperty(value = "核验人;为空时取当前登录用户")
     private String verifier;
     private String verifier;
 
 
-    @ApiModelProperty(value = "核实意见;判定为不实时填核销原因")
+    @ApiModelProperty(value = "核验人用户ID;为空时取当前登录用户")
+    private Long verifierId;
+
+    @ApiModelProperty(value = "核实意见;不真实结论可不填写")
     private String verifyOpinion;
     private String verifyOpinion;
 }
 }

+ 2 - 8
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/PlanMatchDTO.java

@@ -11,21 +11,15 @@ import java.io.Serializable;
 public class PlanMatchDTO implements Serializable {
 public class PlanMatchDTO implements Serializable {
     private static final long serialVersionUID = 1L;
     private static final long serialVersionUID = 1L;
 
 
-    @ApiModelProperty(value = "事件类型(排水/供水/燃气)")
+    @ApiModelProperty(value = "预案类型(字典 dis_plan_type)")
     private String eventType;
     private String eventType;
 
 
-    @ApiModelProperty(value = "事件级别")
+    @ApiModelProperty(value = "预案等级(字典 dis_plan_level)")
     private String eventLevel;
     private String eventLevel;
 
 
-    @ApiModelProperty(value = "发生区域(城南/城北/太常)")
-    private String eventRegion;
-
     @ApiModelProperty(value = "责任单位(供水局/燃气公司/排水公司)")
     @ApiModelProperty(value = "责任单位(供水局/燃气公司/排水公司)")
     private String responsibleUnit;
     private String responsibleUnit;
 
 
-    @ApiModelProperty(value = "专题名称(专题匹配时传入)")
-    private String topic;
-
     @ApiModelProperty(value = "预案ID(应用预案时传入)")
     @ApiModelProperty(value = "预案ID(应用预案时传入)")
     private Long planId;
     private Long planId;
 
 

+ 2 - 11
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/PlanMatchResultVO.java

@@ -20,24 +20,15 @@ public class PlanMatchResultVO implements Serializable {
     @ApiModelProperty(value = "预案名称")
     @ApiModelProperty(value = "预案名称")
     private String planName;
     private String planName;
 
 
-    @ApiModelProperty(value = "事件类型")
+    @ApiModelProperty(value = "预案类型(字典 dis_plan_type)")
     private String eventType;
     private String eventType;
 
 
-    @ApiModelProperty(value = "事件级别")
+    @ApiModelProperty(value = "预案等级(字典 dis_plan_level)")
     private String eventLevel;
     private String eventLevel;
 
 
-    @ApiModelProperty(value = "发生区域")
-    private String eventRegion;
-
     @ApiModelProperty(value = "责任单位")
     @ApiModelProperty(value = "责任单位")
     private String responsibleUnit;
     private String responsibleUnit;
 
 
-    @ApiModelProperty(value = "所属专题")
-    private String topic;
-
-    @ApiModelProperty(value = "预案概要")
-    private String planSummary;
-
     @ApiModelProperty(value = "预案内容")
     @ApiModelProperty(value = "预案内容")
     private String planContent;
     private String planContent;
 
 

+ 0 - 6
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/PlanSaveDTO.java

@@ -39,12 +39,6 @@ public class PlanSaveDTO implements Serializable {
     @ApiModelProperty(value = "发布日期 yyyy-MM-dd")
     @ApiModelProperty(value = "发布日期 yyyy-MM-dd")
     private String publishDate;
     private String publishDate;
 
 
-    @ApiModelProperty(value = "附件名称")
-    private String attachName;
-
-    @ApiModelProperty(value = "附件路径")
-    private String attachPath;
-
     @ApiModelProperty(value = "是否设为预案模板:0-否 1-是")
     @ApiModelProperty(value = "是否设为预案模板:0-否 1-是")
     private Integer isTemplate;
     private Integer isTemplate;
 
 

+ 0 - 3
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/dto/PlanVersionVO.java

@@ -51,7 +51,4 @@ public class PlanVersionVO implements Serializable {
     @ApiModelProperty(value = "版本正文快照")
     @ApiModelProperty(value = "版本正文快照")
     private String content;
     private String content;
 
 
-    private String attachName;
-
-    private String attachPath;
 }
 }

+ 0 - 25
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/mapper/DisEventGradeMapper.java

@@ -4,34 +4,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.zksy.dispatch.domain.DisEventGrade;
 import com.zksy.dispatch.domain.DisEventGrade;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Options;
 import org.apache.ibatis.annotations.Options;
-import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 import org.apache.ibatis.annotations.Select;
 
 
 @Mapper
 @Mapper
 public interface DisEventGradeMapper extends BaseMapper<DisEventGrade> {
 public interface DisEventGradeMapper extends BaseMapper<DisEventGrade> {
 
 
-    /**
-     * 分级标准编号生成事务锁(与 alarm_data 取号方式一致)。
-     */
-    @Select("SELECT 1 FROM pg_advisory_xact_lock(hashtext('dispatch-grade-number-generation'))")
-    @Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE, timeout = 5)
-    Integer lockGradeNumberGeneration();
-
-    /**
-     * 分级标准编号是否已存在(取号查重用)
-     */
-    @Select("SELECT EXISTS(SELECT 1 FROM app_user.dis_event_grade WHERE grade_no=#{gradeNo})")
-    @Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
-    boolean existsGradeNo(@Param("gradeNo") String gradeNo);
-
-    /**
-     * 当前最大主键 id(显式发号用:id = max(id) + 1)
-     * 背景:本表数据由 MySQL 迁移时带显式 id 插入,identity 序列未对齐
-     * (自动发号会发出 0 撞主键);且 KES 的 pg_get_serial_sequence 对 identity
-     * 列兼容性差(查不到/类型转换失败)。因此改为在取号锁内显式发号:
-     * GENERATED BY DEFAULT 模式允许显式 id,不依赖序列元数据,必定可执行。
-     */
-    @Select("SELECT COALESCE(MAX(id), 0) FROM app_user.dis_event_grade")
-    @Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
-    Long selectMaxId();
 }
 }

+ 1 - 9
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/service/DisPlanLibraryService.java

@@ -16,21 +16,13 @@ public interface DisPlanLibraryService extends IService<DisPlanLibrary> {
     List<DisPlanLibrary> listAll();
     List<DisPlanLibrary> listAll();
 
 
     /**
     /**
-     * 按事件条件加权匹配预案(类型40/级别25/区域20/单位15)
+     * 按预案条件加权匹配预案(类型40/级别25/单位35)
      * @param dto 匹配条件
      * @param dto 匹配条件
      * @param operUser 操作人
      * @param operUser 操作人
      * @return 按匹配度降序的结果,并记录匹配历史
      * @return 按匹配度降序的结果,并记录匹配历史
      */
      */
     List<PlanMatchResultVO> match(PlanMatchDTO dto, String operUser);
     List<PlanMatchResultVO> match(PlanMatchDTO dto, String operUser);
 
 
-    /**
-     * 按专题匹配预案
-     * @param topic 专题名称
-     * @param operUser 操作人
-     * @return 该专题下的预案列表(匹配度90),并记录匹配历史
-     */
-    List<PlanMatchResultVO> matchByTopic(String topic, String operUser);
-
     /**
     /**
      * 查询最近匹配/应用记录
      * 查询最近匹配/应用记录
      * @param limit 记录条数
      * @param limit 记录条数

+ 0 - 37
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/service/impl/DisEventGradeServiceImpl.java

@@ -6,10 +6,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zksy.common.exception.ServiceException;
 import com.zksy.common.exception.ServiceException;
 import com.zksy.dispatch.domain.DisEventGrade;
 import com.zksy.dispatch.domain.DisEventGrade;
 import com.zksy.dispatch.dto.DisEventGradePageDTO;
 import com.zksy.dispatch.dto.DisEventGradePageDTO;
-import com.zksy.dispatch.enums.GradeStatusEnum;
 import com.zksy.dispatch.mapper.DisEventGradeMapper;
 import com.zksy.dispatch.mapper.DisEventGradeMapper;
 import com.zksy.dispatch.service.DisEventGradeService;
 import com.zksy.dispatch.service.DisEventGradeService;
-import com.zksy.dispatch.support.DispatchNumberSupport;
 import com.zksy.dispatch.support.DispatchUserSupport;
 import com.zksy.dispatch.support.DispatchUserSupport;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -33,11 +31,8 @@ public class DisEventGradeServiceImpl extends ServiceImpl<DisEventGradeMapper, D
     public Page<DisEventGrade> findByPage(DisEventGradePageDTO dto) {
     public Page<DisEventGrade> findByPage(DisEventGradePageDTO dto) {
         Page<DisEventGrade> page = new Page<>(dto.getPageNum(), dto.getPageSize());
         Page<DisEventGrade> page = new Page<>(dto.getPageNum(), dto.getPageSize());
         LambdaQueryWrapper<DisEventGrade> wrapper = new LambdaQueryWrapper<>();
         LambdaQueryWrapper<DisEventGrade> wrapper = new LambdaQueryWrapper<>();
-        wrapper.like(StringUtils.isNotBlank(dto.getGradeNo()), DisEventGrade::getGradeNo, dto.getGradeNo());
         wrapper.eq(StringUtils.isNotBlank(dto.getEventCategory()), DisEventGrade::getEventCategory, dto.getEventCategory());
         wrapper.eq(StringUtils.isNotBlank(dto.getEventCategory()), DisEventGrade::getEventCategory, dto.getEventCategory());
-        wrapper.eq(StringUtils.isNotBlank(dto.getEventType()), DisEventGrade::getEventType, dto.getEventType());
         wrapper.eq(StringUtils.isNotBlank(dto.getEventLevel()), DisEventGrade::getEventLevel, dto.getEventLevel());
         wrapper.eq(StringUtils.isNotBlank(dto.getEventLevel()), DisEventGrade::getEventLevel, dto.getEventLevel());
-        wrapper.eq(dto.getStatus() != null, DisEventGrade::getStatus, dto.getStatus());
         // 创建时间区间过滤(含边界:结束日期取次日零点前),格式非法时忽略该条件不阻断查询
         // 创建时间区间过滤(含边界:结束日期取次日零点前),格式非法时忽略该条件不阻断查询
         try {
         try {
             if (StringUtils.isNotBlank(dto.getStartDate())) {
             if (StringUtils.isNotBlank(dto.getStartDate())) {
@@ -51,7 +46,6 @@ public class DisEventGradeServiceImpl extends ServiceImpl<DisEventGradeMapper, D
         }
         }
         wrapper.orderByDesc(DisEventGrade::getCreateTime).orderByDesc(DisEventGrade::getId);
         wrapper.orderByDesc(DisEventGrade::getCreateTime).orderByDesc(DisEventGrade::getId);
         Page<DisEventGrade> result = page(page, wrapper);
         Page<DisEventGrade> result = page(page, wrapper);
-        result.getRecords().forEach(this::fillStatusName);
         return result;
         return result;
     }
     }
 
 
@@ -59,10 +53,8 @@ public class DisEventGradeServiceImpl extends ServiceImpl<DisEventGradeMapper, D
     public List<DisEventGrade> listByCategory(String eventCategory) {
     public List<DisEventGrade> listByCategory(String eventCategory) {
         LambdaQueryWrapper<DisEventGrade> wrapper = new LambdaQueryWrapper<>();
         LambdaQueryWrapper<DisEventGrade> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(StringUtils.isNotBlank(eventCategory), DisEventGrade::getEventCategory, eventCategory);
         wrapper.eq(StringUtils.isNotBlank(eventCategory), DisEventGrade::getEventCategory, eventCategory);
-        wrapper.eq(DisEventGrade::getStatus, GradeStatusEnum.ENABLED.getCode());
         wrapper.orderByAsc(DisEventGrade::getEventLevel).orderByAsc(DisEventGrade::getId);
         wrapper.orderByAsc(DisEventGrade::getEventLevel).orderByAsc(DisEventGrade::getId);
         List<DisEventGrade> list = list(wrapper);
         List<DisEventGrade> list = list(wrapper);
-        list.forEach(this::fillStatusName);
         return list;
         return list;
     }
     }
 
 
@@ -75,28 +67,13 @@ public class DisEventGradeServiceImpl extends ServiceImpl<DisEventGradeMapper, D
         if (StringUtils.isBlank(entity.getEventLevel())) {
         if (StringUtils.isBlank(entity.getEventLevel())) {
             throw new ServiceException("请选择事件等级");
             throw new ServiceException("请选择事件等级");
         }
         }
-        if (!Integer.valueOf(1).equals(baseMapper.lockGradeNumberGeneration())) {
-            throw new IllegalStateException("未取得分级标准编号生成事务锁");
-        }
         LocalDateTime now = LocalDateTime.now();
         LocalDateTime now = LocalDateTime.now();
-        // 本表数据由 MySQL 迁移时带显式 id 插入,identity 序列未对齐(自动发号发 0 撞主键);
-        // 且 KES 的序列元数据查询兼容性差(pg_get_serial_sequence 查不到、|| 是逻辑或不能拼串)。
-        // 因此在取号锁内显式发号:id = max(id) + 1,不依赖序列,必定可执行。
-        Long maxId = baseMapper.selectMaxId();
-        entity.setId((maxId == null ? 0L : maxId) + 1);
-        entity.setGradeNo(DispatchNumberSupport.nextGradeNo(baseMapper::existsGradeNo));
-        if (entity.getStatus() == null || !GradeStatusEnum.isValid(entity.getStatus())) {
-            entity.setStatus(GradeStatusEnum.ENABLED.getCode());
-        }
-        entity.setCreateBy(DispatchUserSupport.currentLoginName());
         entity.setCreateUserId(DispatchUserSupport.currentUserId());
         entity.setCreateUserId(DispatchUserSupport.currentUserId());
         entity.setCreateTime(now);
         entity.setCreateTime(now);
-        entity.setUpdateBy(DispatchUserSupport.currentLoginName());
         entity.setUpdateUserId(DispatchUserSupport.currentUserId());
         entity.setUpdateUserId(DispatchUserSupport.currentUserId());
         entity.setUpdateTime(now);
         entity.setUpdateTime(now);
         entity.setDelFlag("0");
         entity.setDelFlag("0");
         save(entity);
         save(entity);
-        fillStatusName(entity);
         return entity;
         return entity;
     }
     }
 
 
@@ -110,29 +87,15 @@ public class DisEventGradeServiceImpl extends ServiceImpl<DisEventGradeMapper, D
         if (db == null) {
         if (db == null) {
             throw new ServiceException("分级标准不存在:" + entity.getId());
             throw new ServiceException("分级标准不存在:" + entity.getId());
         }
         }
-        if (entity.getStatus() != null && !GradeStatusEnum.isValid(entity.getStatus())) {
-            throw new ServiceException("启用状态取值不合法:" + entity.getStatus());
-        }
         // 标准编号与创建信息不允许通过更新接口篡改
         // 标准编号与创建信息不允许通过更新接口篡改
         db.setEventCategory(entity.getEventCategory());
         db.setEventCategory(entity.getEventCategory());
-        db.setEventType(entity.getEventType());
         db.setEventLevel(entity.getEventLevel());
         db.setEventLevel(entity.getEventLevel());
-        db.setSubCategory(entity.getSubCategory());
-        db.setScenario(entity.getScenario());
         db.setCriteria(entity.getCriteria());
         db.setCriteria(entity.getCriteria());
         db.setResponse(entity.getResponse());
         db.setResponse(entity.getResponse());
-        db.setStatus(entity.getStatus());
         db.setRemark(entity.getRemark());
         db.setRemark(entity.getRemark());
-        db.setUpdateBy(DispatchUserSupport.currentLoginName());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateTime(LocalDateTime.now());
         db.setUpdateTime(LocalDateTime.now());
         updateById(db);
         updateById(db);
     }
     }
 
 
-    /**
-     * 补齐启用状态中文名称,避免前端硬编码中文
-     */
-    private void fillStatusName(DisEventGrade item) {
-        item.setStatusName(GradeStatusEnum.getDescByCode(item.getStatus()));
-    }
 }
 }

+ 75 - 128
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/service/impl/DisEventServiceImpl.java

@@ -101,9 +101,9 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         // 排序规则:orderAsc=true 按接报时间升序(核实/转接报送/跟踪解除等「先报先办」队列页),
         // 排序规则:orderAsc=true 按接报时间升序(核实/转接报送/跟踪解除等「先报先办」队列页),
         // 默认倒序(接报管理等记录回看页);接报时间为空的排在最后
         // 默认倒序(接报管理等记录回看页);接报时间为空的排在最后
         if (Boolean.TRUE.equals(dto.getOrderAsc())) {
         if (Boolean.TRUE.equals(dto.getOrderAsc())) {
-            wrapper.orderByAsc(DisEvent::getReportTime).orderByAsc(DisEvent::getId);
+            wrapper.orderByAsc(DisEvent::getCreateTime).orderByAsc(DisEvent::getId);
         } else {
         } else {
-            wrapper.orderByDesc(DisEvent::getReportTime).orderByDesc(DisEvent::getId);
+            wrapper.orderByDesc(DisEvent::getCreateTime).orderByDesc(DisEvent::getId);
         }
         }
         page(page, wrapper);
         page(page, wrapper);
 
 
@@ -215,9 +215,9 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         List<DisEvent> all = list();
         List<DisEvent> all = list();
         DisHomeVO vo = new DisHomeVO();
         DisHomeVO vo = new DisHomeVO();
 
 
-        long todayCount = all.stream().filter(e -> e.getReportTime() != null && !e.getReportTime().isBefore(todayStart)).count();
-        long yesterdayCount = all.stream().filter(e -> e.getReportTime() != null
-                && !e.getReportTime().isBefore(yesterdayStart) && e.getReportTime().isBefore(todayStart)).count();
+        long todayCount = all.stream().filter(e -> e.getCreateTime() != null && !e.getCreateTime().isBefore(todayStart)).count();
+        long yesterdayCount = all.stream().filter(e -> e.getCreateTime() != null
+                && !e.getCreateTime().isBefore(yesterdayStart) && e.getCreateTime().isBefore(todayStart)).count();
         vo.setTodayCount(todayCount);
         vo.setTodayCount(todayCount);
         vo.setYesterdayCount(yesterdayCount);
         vo.setYesterdayCount(yesterdayCount);
         vo.setTodayDelta(todayCount - yesterdayCount);
         vo.setTodayDelta(todayCount - yesterdayCount);
@@ -243,19 +243,6 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         vo.setPlanPublished(planVersionMapper.selectCount(new LambdaQueryWrapper<DisPlanVersion>()
         vo.setPlanPublished(planVersionMapper.selectCount(new LambdaQueryWrapper<DisPlanVersion>()
                 .eq(DisPlanVersion::getVerStatus, PlanVersionStatusEnum.EFFECTIVE.getCode())));
                 .eq(DisPlanVersion::getVerStatus, PlanVersionStatusEnum.EFFECTIVE.getCode())));
 
 
-        // 近 7 日管网类型分布(type 为字典编码,前端翻译)
-        Map<String, Long> typeCount = all.stream()
-                .filter(e -> e.getReportTime() != null && !e.getReportTime().isBefore(weekStart)
-                        && StringUtils.isNotBlank(e.getEventType()))
-                .collect(Collectors.groupingBy(DisEvent::getEventType, Collectors.counting()));
-        List<Map<String, Object>> typeStats = new ArrayList<>();
-        for (String type : Arrays.asList("1", "2", "3", "9")) {
-            if (typeCount.containsKey(type)) {
-                typeStats.add(kv("type", type, "count", typeCount.get(type)));
-            }
-        }
-        vo.setTypeStats(typeStats);
-
         // 等级占比:已解除单列一段,未办结按 event_level(等级为空的归未定级)
         // 等级占比:已解除单列一段,未办结按 event_level(等级为空的归未定级)
         Map<String, Long> levelCount = all.stream()
         Map<String, Long> levelCount = all.stream()
                 .filter(e -> !Objects.equals(e.getStatus(), EventStatusEnum.RELEASED.getCode())
                 .filter(e -> !Objects.equals(e.getStatus(), EventStatusEnum.RELEASED.getCode())
@@ -272,7 +259,7 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         List<DisEvent> disposingList = all.stream()
         List<DisEvent> disposingList = all.stream()
                 .filter(e -> Objects.equals(e.getStatus(), EventStatusEnum.VERIFIED.getCode())
                 .filter(e -> Objects.equals(e.getStatus(), EventStatusEnum.VERIFIED.getCode())
                         || Objects.equals(e.getStatus(), EventStatusEnum.DISPOSING.getCode()))
                         || Objects.equals(e.getStatus(), EventStatusEnum.DISPOSING.getCode()))
-                .sorted(Comparator.comparing(DisEvent::getReportTime, Comparator.nullsLast(Comparator.naturalOrder())).reversed())
+                .sorted(Comparator.comparing(DisEvent::getCreateTime, Comparator.nullsLast(Comparator.naturalOrder())).reversed())
                 .limit(10)
                 .limit(10)
                 .collect(Collectors.toList());
                 .collect(Collectors.toList());
         Map<Long, String> userNames = loadUserNames(disposingList);
         Map<Long, String> userNames = loadUserNames(disposingList);
@@ -315,14 +302,6 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         List<DisEvent> events = list(buildWrapper(dto));
         List<DisEvent> events = list(buildWrapper(dto));
         EventStatsVO vo = new EventStatsVO();
         EventStatsVO vo = new EventStatsVO();
         vo.setTotalEvents((long) events.size());
         vo.setTotalEvents((long) events.size());
-        BigDecimal totalLoss = events.stream()
-                .map(DisEvent::getLossAmount)
-                .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-        vo.setTotalLoss(totalLoss);
-        long lossCount = events.stream().filter(e -> e.getLossAmount() != null).count();
-        vo.setAvgLoss(lossCount == 0 ? BigDecimal.ZERO
-                : totalLoss.divide(BigDecimal.valueOf(lossCount), 2, RoundingMode.HALF_UP));
         long majorEvents = events.stream()
         long majorEvents = events.stream()
                 .filter(e -> e.getEventLevel() != null && MAJOR_LEVEL_CODES.contains(e.getEventLevel()))
                 .filter(e -> e.getEventLevel() != null && MAJOR_LEVEL_CODES.contains(e.getEventLevel()))
                 .count();
                 .count();
@@ -336,15 +315,14 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         LambdaQueryWrapper<DisEvent> wrapper = new LambdaQueryWrapper<>();
         LambdaQueryWrapper<DisEvent> wrapper = new LambdaQueryWrapper<>();
         wrapper.like(StringUtils.isNotBlank(dto.getEventNo()), DisEvent::getEventNo, dto.getEventNo());
         wrapper.like(StringUtils.isNotBlank(dto.getEventNo()), DisEvent::getEventNo, dto.getEventNo());
         wrapper.like(StringUtils.isNotBlank(dto.getHandler()), DisEvent::getHandler, dto.getHandler());
         wrapper.like(StringUtils.isNotBlank(dto.getHandler()), DisEvent::getHandler, dto.getHandler());
+        // 工作催办只面向已核实、处置中事件;即使调用方传入其他状态,也不能绕过范围限制。
+        wrapper.in(DisEvent::getStatus, EventStatusEnum.VERIFIED.getCode(), EventStatusEnum.DISPOSING.getCode());
         if (dto.getStatus() != null) {
         if (dto.getStatus() != null) {
             wrapper.eq(DisEvent::getStatus, dto.getStatus());
             wrapper.eq(DisEvent::getStatus, dto.getStatus());
-        } else {
-            // 工作催办面向未办结事件;已解除 / 不实的无需再督促
-            wrapper.in(DisEvent::getStatus, EventStatusEnum.activeCodes());
         }
         }
-        wrapper.ge(StringUtils.isNotBlank(dto.getStartTime()), DisEvent::getReportTime, dto.getStartTime());
-        wrapper.le(StringUtils.isNotBlank(dto.getEndTime()), DisEvent::getReportTime, dto.getEndTime());
-        wrapper.orderByAsc(DisEvent::getReportTime).orderByAsc(DisEvent::getId);
+        wrapper.ge(StringUtils.isNotBlank(dto.getStartTime()), DisEvent::getCreateTime, dto.getStartTime());
+        wrapper.le(StringUtils.isNotBlank(dto.getEndTime()), DisEvent::getCreateTime, dto.getEndTime());
+        wrapper.orderByAsc(DisEvent::getCreateTime).orderByAsc(DisEvent::getId);
         page(page, wrapper);
         page(page, wrapper);
 
 
         Page<EventUrgeRowVO> voPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
         Page<EventUrgeRowVO> voPage = new Page<>(page.getCurrent(), page.getSize(), page.getTotal());
@@ -364,12 +342,11 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
             EventUrgeRowVO row = new EventUrgeRowVO();
             EventUrgeRowVO row = new EventUrgeRowVO();
             row.setEventId(event.getId());
             row.setEventId(event.getId());
             row.setEventNo(event.getEventNo());
             row.setEventNo(event.getEventNo());
-            row.setEventType(event.getEventType());
             row.setSummary(event.getDescription());
             row.setSummary(event.getDescription());
             row.setStatus(event.getStatus());
             row.setStatus(event.getStatus());
             row.setStatusName(EventStatusEnum.getDescByCode(event.getStatus()));
             row.setStatusName(EventStatusEnum.getDescByCode(event.getStatus()));
-            row.setReportTime(event.getReportTime());
-            row.setElapsed(formatElapsed(event.getReportTime()));
+            row.setReportTime(event.getCreateTime());
+            row.setElapsed(formatElapsed(event.getCreateTime()));
             row.setHandler(resolveUserName(userNames, event.getHandlerId(), event.getHandler()));
             row.setHandler(resolveUserName(userNames, event.getHandlerId(), event.getHandler()));
             row.setHandlerId(event.getHandlerId());
             row.setHandlerId(event.getHandlerId());
             row.setHandlerPhone(event.getHandlerPhone());
             row.setHandlerPhone(event.getHandlerPhone());
@@ -401,29 +378,19 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
             throw new IllegalStateException("未取得事件编号生成事务锁");
             throw new IllegalStateException("未取得事件编号生成事务锁");
         }
         }
         LocalDateTime now = LocalDateTime.now();
         LocalDateTime now = LocalDateTime.now();
-        String operator = DispatchUserSupport.currentLoginName();
-
         DisEvent event = new DisEvent();
         DisEvent event = new DisEvent();
         event.setEventSource(dto.getEventSource());
         event.setEventSource(dto.getEventSource());
         event.setChannel(dto.getChannel());
         event.setChannel(dto.getChannel());
-        event.setEventType(dto.getEventType());
         event.setLocation(dto.getLocation());
         event.setLocation(dto.getLocation());
         event.setLongitude(dto.getLongitude());
         event.setLongitude(dto.getLongitude());
         event.setLatitude(dto.getLatitude());
         event.setLatitude(dto.getLatitude());
         event.setHappenTime(dto.getHappenTime());
         event.setHappenTime(dto.getHappenTime());
-        event.setReportTime(dto.getReportTime() == null ? now : dto.getReportTime());
-        // 接报人固定为「当前录入人员」,不接受前端传值;前端表单只读展示当前登录用户。
-        // 名称快照与用户ID一并落库:展示时按ID反查最新昵称,避免用户改名后历史数据失联。
-        event.setReporter(DispatchUserSupport.currentUserName());
-        event.setReporterId(DispatchUserSupport.currentUserId());
         event.setReporterPhone(dto.getReporterPhone());
         event.setReporterPhone(dto.getReporterPhone());
         event.setDescription(dto.getDescription());
         event.setDescription(dto.getDescription());
         event.setStatus(EventStatusEnum.PENDING_VERIFY.getCode());
         event.setStatus(EventStatusEnum.PENDING_VERIFY.getCode());
         event.setEventNo(DispatchNumberSupport.nextEventNo(baseMapper::existsEventNo));
         event.setEventNo(DispatchNumberSupport.nextEventNo(baseMapper::existsEventNo));
-        event.setCreateBy(operator);
         event.setCreateUserId(DispatchUserSupport.currentUserId());
         event.setCreateUserId(DispatchUserSupport.currentUserId());
         event.setCreateTime(now);
         event.setCreateTime(now);
-        event.setUpdateBy(operator);
         event.setUpdateUserId(DispatchUserSupport.currentUserId());
         event.setUpdateUserId(DispatchUserSupport.currentUserId());
         event.setUpdateTime(now);
         event.setUpdateTime(now);
         event.setDelFlag("0");
         event.setDelFlag("0");
@@ -446,17 +413,16 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
             throw new ServiceException("当前状态【" + EventStatusEnum.getDescByCode(db.getStatus()) + "】不可编辑");
             throw new ServiceException("当前状态【" + EventStatusEnum.getDescByCode(db.getStatus()) + "】不可编辑");
         }
         }
         db.setEventSource(dto.getEventSource());
         db.setEventSource(dto.getEventSource());
-        db.setChannel(dto.getChannel());
-        db.setEventType(dto.getEventType());
+        if (StringUtils.isNotBlank(dto.getChannel())) {
+            db.setChannel(dto.getChannel());
+        }
         db.setLocation(dto.getLocation());
         db.setLocation(dto.getLocation());
         db.setLongitude(dto.getLongitude());
         db.setLongitude(dto.getLongitude());
         db.setLatitude(dto.getLatitude());
         db.setLatitude(dto.getLatitude());
         db.setHappenTime(dto.getHappenTime());
         db.setHappenTime(dto.getHappenTime());
-        db.setReportTime(dto.getReportTime());
-        // 接报人在接报登记时已按「当前录入人员」确定,编辑环节不允许改动,故此处不写 reporter
+        // 接报人由 create_user_id 确定,编辑时保留原创建人。
         db.setReporterPhone(dto.getReporterPhone());
         db.setReporterPhone(dto.getReporterPhone());
         db.setDescription(dto.getDescription());
         db.setDescription(dto.getDescription());
-        db.setUpdateBy(DispatchUserSupport.currentLoginName());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateTime(LocalDateTime.now());
         db.setUpdateTime(LocalDateTime.now());
         updateById(db);
         updateById(db);
@@ -490,11 +456,7 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         }
         }
         Integer statusFrom = db.getStatus();
         Integer statusFrom = db.getStatus();
         boolean falseEvent = dto.getVerifyResult() == VERIFY_FALSE;
         boolean falseEvent = dto.getVerifyResult() == VERIFY_FALSE;
-        if (falseEvent) {
-            if (StringUtils.isBlank(dto.getVerifyOpinion())) {
-                throw new ServiceException("判定为不实事件时必须填写核销原因");
-            }
-        } else if (!Objects.equals(dto.getVerifyResult(), VERIFY_REAL)) {
+        if (!falseEvent && !Objects.equals(dto.getVerifyResult(), VERIFY_REAL)) {
             throw new ServiceException("核实结论取值不合法:" + dto.getVerifyResult());
             throw new ServiceException("核实结论取值不合法:" + dto.getVerifyResult());
         } else {
         } else {
             if (StringUtils.isBlank(dto.getEventCategory())) {
             if (StringUtils.isBlank(dto.getEventCategory())) {
@@ -507,41 +469,70 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
 
 
         LocalDateTime now = LocalDateTime.now();
         LocalDateTime now = LocalDateTime.now();
         db.setVerifyResult(dto.getVerifyResult());
         db.setVerifyResult(dto.getVerifyResult());
-        db.setVerifier(StringUtils.defaultIfBlank(dto.getVerifier(), DispatchUserSupport.currentUserName()));
-        db.setVerifierId(DispatchUserSupport.currentUserId());
+        Long verifierId = dto.getVerifierId() == null ? DispatchUserSupport.currentUserId() : dto.getVerifierId();
+        String verifierName = DispatchUserSupport.currentUserName();
+        if (dto.getVerifierId() != null) {
+            DisUserOptionVO verifier = userMapper.selectUserOptions().stream()
+                    .filter(user -> dto.getVerifierId().equals(user.getUserId()))
+                    .findFirst().orElseThrow(() -> new ServiceException("核验人必须从有效系统用户中选择"));
+            verifierName = verifier.getNickName();
+        }
+        db.setVerifier(verifierName);
+        db.setVerifierId(verifierId);
         db.setVerifyTime(now);
         db.setVerifyTime(now);
         db.setVerifyOpinion(dto.getVerifyOpinion());
         db.setVerifyOpinion(dto.getVerifyOpinion());
         if (falseEvent) {
         if (falseEvent) {
             db.setStatus(EventStatusEnum.FALSE_EVENT.getCode());
             db.setStatus(EventStatusEnum.FALSE_EVENT.getCode());
         } else {
         } else {
-            // 管网类型在「接报登记」录入;核实弹窗不提供该输入,故仅当传入非空时才覆盖,
-            // 避免核实环节把接报时已登记的值清空。
-            if (StringUtils.isNotBlank(dto.getEventType())) {
-                db.setEventType(dto.getEventType());
-            }
             db.setEventCategory(dto.getEventCategory());
             db.setEventCategory(dto.getEventCategory());
             db.setEventLevel(dto.getEventLevel());
             db.setEventLevel(dto.getEventLevel());
-            db.setEventRegion(dto.getEventRegion());
-            // 责任处置人必须关联系统用户账号:handlerId 是后续催办通知/SSE 推送的投递目标
+            Long deptId = dto.getDeptId();
+            if (deptId == null || StringUtils.isBlank(dto.getDepartment())) {
+                throw new ServiceException("请选择处置单位");
+            }
+            List<DisDeptOptionVO> departments = userMapper.selectDeptOptions();
+            DisDeptOptionVO selectedDept = departments.stream()
+                    .filter(dept -> deptId.equals(dept.getDeptId()))
+                    .findFirst().orElseThrow(() -> new ServiceException("处置单位无效"));
+            db.setDepartment(selectedDept.getDeptName());
+
+            // 处置人可选;如指定,必须属于所选单位或其下级部门。
             Long handlerId = dto.getHandlerId();
             Long handlerId = dto.getHandlerId();
             if (handlerId == null && StringUtils.isNotBlank(dto.getHandler())) {
             if (handlerId == null && StringUtils.isNotBlank(dto.getHandler())) {
                 handlerId = userMapper.selectUserIdByName(dto.getHandler());
                 handlerId = userMapper.selectUserIdByName(dto.getHandler());
             }
             }
-            if (handlerId == null) {
-                throw new ServiceException("责任处置人必须从系统用户中选择");
+            if (handlerId != null) {
+                Long selectedHandlerId = handlerId;
+                DisUserOptionVO handler = userMapper.selectUserOptions().stream()
+                        .filter(user -> selectedHandlerId.equals(user.getUserId()))
+                        .findFirst().orElseThrow(() -> new ServiceException("处置人必须从有效系统用户中选择"));
+                Long handlerDeptId = handler.getDeptId();
+                boolean inScope = false;
+                for (int depth = 0; handlerDeptId != null && !Objects.equals(handlerDeptId, 0L)
+                        && depth <= departments.size(); depth++) {
+                    if (deptId.equals(handlerDeptId)) {
+                        inScope = true;
+                        break;
+                    }
+                    Long currentDeptId = handlerDeptId;
+                    DisDeptOptionVO currentDept = departments.stream()
+                            .filter(dept -> currentDeptId.equals(dept.getDeptId()))
+                            .findFirst().orElse(null);
+                    handlerDeptId = currentDept == null ? null : currentDept.getParentId();
+                }
+                if (!inScope) {
+                    throw new ServiceException("处置人须属于所选处置单位或其下级部门");
+                }
+                db.setHandler(handler.getNickName());
+                db.setHandlerId(selectedHandlerId);
+                db.setHandlerPhone(null);
+            } else {
+                db.setHandler(null);
+                db.setHandlerId(null);
+                db.setHandlerPhone(null);
             }
             }
-            String handlerName = dto.getHandler();
-            if (StringUtils.isBlank(handlerName)) {
-                List<DisUserOptionVO> hit = userMapper.selectUserNamesByIds(Collections.singletonList(handlerId));
-                handlerName = hit.isEmpty() ? null : hit.get(0).getNickName();
-            }
-            db.setHandler(handlerName);
-            db.setHandlerId(handlerId);
-            db.setHandlerPhone(dto.getHandlerPhone());
-            db.setDepartment(dto.getDepartment());
             db.setStatus(EventStatusEnum.VERIFIED.getCode());
             db.setStatus(EventStatusEnum.VERIFIED.getCode());
         }
         }
-        db.setUpdateBy(DispatchUserSupport.currentLoginName());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateTime(now);
         db.setUpdateTime(now);
         updateById(db);
         updateById(db);
@@ -549,7 +540,7 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         EventLogOperTypeEnum operType = falseEvent
         EventLogOperTypeEnum operType = falseEvent
                 ? EventLogOperTypeEnum.VERIFY_FALSE : EventLogOperTypeEnum.VERIFY;
                 ? EventLogOperTypeEnum.VERIFY_FALSE : EventLogOperTypeEnum.VERIFY;
         DisEventLog log = buildLog(db, operType, statusFrom, db.getStatus());
         DisEventLog log = buildLog(db, operType, statusFrom, db.getStatus());
-        log.setOperDesc(dto.getVerifyOpinion());
+        log.setOperDesc(StringUtils.defaultIfBlank(dto.getVerifyOpinion(), falseEvent ? "核实结论:不真实" : null));
         eventLogService.append(log);
         eventLogService.append(log);
     }
     }
 
 
@@ -602,7 +593,6 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         LocalDateTime now = LocalDateTime.now();
         LocalDateTime now = LocalDateTime.now();
         db.setStatus(EventStatusEnum.DISPOSING.getCode());
         db.setStatus(EventStatusEnum.DISPOSING.getCode());
         db.setDisposeTime(now);
         db.setDisposeTime(now);
-        db.setUpdateBy(DispatchUserSupport.currentLoginName());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateTime(now);
         db.setUpdateTime(now);
         updateById(db);
         updateById(db);
@@ -628,7 +618,6 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         if (dto.getNeedUpgrade() != null) {
         if (dto.getNeedUpgrade() != null) {
             db.setNeedUpgrade(dto.getNeedUpgrade());
             db.setNeedUpgrade(dto.getNeedUpgrade());
         }
         }
-        db.setUpdateBy(DispatchUserSupport.currentLoginName());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateTime(now);
         db.setUpdateTime(now);
         updateById(db);
         updateById(db);
@@ -658,14 +647,6 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         db.setReleaseTime(now);
         db.setReleaseTime(now);
         db.setReleaseReason(dto.getReleaseReason());
         db.setReleaseReason(dto.getReleaseReason());
         db.setReleaseNote(dto.getReleaseNote());
         db.setReleaseNote(dto.getReleaseNote());
-        // 直接经济损失在解除环节录入,是事后评估与多维统计(损失合计/平均/区间)的唯一来源
-        if (dto.getLossAmount() != null) {
-            db.setLossAmount(dto.getLossAmount());
-        }
-        // 处置前/后佐证附件(解除原因为「事件已处置完成」时上传,多文件逗号分隔);库内存相对路径
-        db.setBeforeUrl(attachUrlSupport.toRelative(dto.getBeforeUrl()));
-        db.setAfterUrl(attachUrlSupport.toRelative(dto.getAfterUrl()));
-        db.setUpdateBy(DispatchUserSupport.currentLoginName());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateTime(now);
         db.setUpdateTime(now);
         updateById(db);
         updateById(db);
@@ -727,11 +708,9 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         LambdaQueryWrapper<DisEvent> wrapper = new LambdaQueryWrapper<>();
         LambdaQueryWrapper<DisEvent> wrapper = new LambdaQueryWrapper<>();
         wrapper.like(StringUtils.isNotBlank(dto.getEventNo()), DisEvent::getEventNo, dto.getEventNo());
         wrapper.like(StringUtils.isNotBlank(dto.getEventNo()), DisEvent::getEventNo, dto.getEventNo());
         wrapper.like(StringUtils.isNotBlank(dto.getDescription()), DisEvent::getDescription, dto.getDescription());
         wrapper.like(StringUtils.isNotBlank(dto.getDescription()), DisEvent::getDescription, dto.getDescription());
-        wrapper.eq(StringUtils.isNotBlank(dto.getEventType()), DisEvent::getEventType, dto.getEventType());
         wrapper.eq(StringUtils.isNotBlank(dto.getEventCategory()), DisEvent::getEventCategory, dto.getEventCategory());
         wrapper.eq(StringUtils.isNotBlank(dto.getEventCategory()), DisEvent::getEventCategory, dto.getEventCategory());
         wrapper.eq(StringUtils.isNotBlank(dto.getEventLevel()), DisEvent::getEventLevel, dto.getEventLevel());
         wrapper.eq(StringUtils.isNotBlank(dto.getEventLevel()), DisEvent::getEventLevel, dto.getEventLevel());
         wrapper.eq(StringUtils.isNotBlank(dto.getEventSource()), DisEvent::getEventSource, dto.getEventSource());
         wrapper.eq(StringUtils.isNotBlank(dto.getEventSource()), DisEvent::getEventSource, dto.getEventSource());
-        wrapper.eq(StringUtils.isNotBlank(dto.getEventRegion()), DisEvent::getEventRegion, dto.getEventRegion());
         wrapper.like(StringUtils.isNotBlank(dto.getLocation()), DisEvent::getLocation, dto.getLocation());
         wrapper.like(StringUtils.isNotBlank(dto.getLocation()), DisEvent::getLocation, dto.getLocation());
         wrapper.like(StringUtils.isNotBlank(dto.getDepartment()), DisEvent::getDepartment, dto.getDepartment());
         wrapper.like(StringUtils.isNotBlank(dto.getDepartment()), DisEvent::getDepartment, dto.getDepartment());
         wrapper.like(StringUtils.isNotBlank(dto.getHandler()), DisEvent::getHandler, dto.getHandler());
         wrapper.like(StringUtils.isNotBlank(dto.getHandler()), DisEvent::getHandler, dto.getHandler());
@@ -742,52 +721,22 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         }
         }
         if (StringUtils.isNotBlank(dto.getStartDate())) {
         if (StringUtils.isNotBlank(dto.getStartDate())) {
             try {
             try {
-                wrapper.ge(DisEvent::getReportTime, LocalDate.parse(dto.getStartDate()).atStartOfDay());
+                wrapper.ge(DisEvent::getCreateTime, LocalDate.parse(dto.getStartDate()).atStartOfDay());
             } catch (Exception e) {
             } catch (Exception e) {
                 log.warn("接报开始日期格式错误: {}", dto.getStartDate());
                 log.warn("接报开始日期格式错误: {}", dto.getStartDate());
             }
             }
         }
         }
         if (StringUtils.isNotBlank(dto.getEndDate())) {
         if (StringUtils.isNotBlank(dto.getEndDate())) {
             try {
             try {
-                wrapper.lt(DisEvent::getReportTime,
+                wrapper.lt(DisEvent::getCreateTime,
                         LocalDate.parse(dto.getEndDate()).plusDays(1).atStartOfDay());
                         LocalDate.parse(dto.getEndDate()).plusDays(1).atStartOfDay());
             } catch (Exception e) {
             } catch (Exception e) {
                 log.warn("接报结束日期格式错误: {}", dto.getEndDate());
                 log.warn("接报结束日期格式错误: {}", dto.getEndDate());
             }
             }
         }
         }
-        applyLossRange(wrapper, dto.getLossRange());
         return wrapper;
         return wrapper;
     }
     }
 
 
-    /**
-     * 直接经济损失区间条件(单位:万元)
-     */
-    private void applyLossRange(LambdaQueryWrapper<DisEvent> wrapper, String lossRange) {
-        if (StringUtils.isBlank(lossRange)) {
-            return;
-        }
-        switch (lossRange) {
-            case "0-1万":
-                wrapper.ge(DisEvent::getLossAmount, BigDecimal.ZERO)
-                        .lt(DisEvent::getLossAmount, BigDecimal.ONE);
-                break;
-            case "1-10万":
-                wrapper.ge(DisEvent::getLossAmount, BigDecimal.ONE)
-                        .lt(DisEvent::getLossAmount, BigDecimal.TEN);
-                break;
-            case "10-100万":
-                wrapper.ge(DisEvent::getLossAmount, BigDecimal.TEN)
-                        .lt(DisEvent::getLossAmount, BigDecimal.valueOf(100));
-                break;
-            case "100万以上":
-                wrapper.ge(DisEvent::getLossAmount, BigDecimal.valueOf(100));
-                break;
-            default:
-                log.warn("未知的损失区间取值: {}", lossRange);
-                break;
-        }
-    }
-
     /**
     /**
      * 实体转展示 VO,补齐状态名称、可编辑标记与已过时长。
      * 实体转展示 VO,补齐状态名称、可编辑标记与已过时长。
      * 接报人 / 核验人 / 责任处置人:库里以「用户ID + 名称快照」双存,
      * 接报人 / 核验人 / 责任处置人:库里以「用户ID + 名称快照」双存,
@@ -796,15 +745,13 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
     private DisEventVO toVO(DisEvent event, Map<Long, String> userNames) {
     private DisEventVO toVO(DisEvent event, Map<Long, String> userNames) {
         DisEventVO vo = new DisEventVO();
         DisEventVO vo = new DisEventVO();
         BeanUtils.copyProperties(event, vo);
         BeanUtils.copyProperties(event, vo);
-        // 佐证附件:库内相对路径 → 拼上 MinIO 配置地址返回前端展示/下载
-        vo.setBeforeUrl(attachUrlSupport.toAccessibleUrl(event.getBeforeUrl()));
-        vo.setAfterUrl(attachUrlSupport.toAccessibleUrl(event.getAfterUrl()));
-        vo.setReporter(resolveUserName(userNames, event.getReporterId(), event.getReporter()));
+        vo.setReportTime(event.getCreateTime());
+        vo.setReporter(resolveUserName(userNames, event.getCreateUserId(), null));
         vo.setVerifier(resolveUserName(userNames, event.getVerifierId(), event.getVerifier()));
         vo.setVerifier(resolveUserName(userNames, event.getVerifierId(), event.getVerifier()));
         vo.setHandler(resolveUserName(userNames, event.getHandlerId(), event.getHandler()));
         vo.setHandler(resolveUserName(userNames, event.getHandlerId(), event.getHandler()));
         vo.setStatusName(EventStatusEnum.getDescByCode(event.getStatus()));
         vo.setStatusName(EventStatusEnum.getDescByCode(event.getStatus()));
         vo.setEditable(EventStatusEnum.canEdit(event.getStatus()));
         vo.setEditable(EventStatusEnum.canEdit(event.getStatus()));
-        vo.setElapsed(formatElapsed(event.getReportTime()));
+        vo.setElapsed(formatElapsed(event.getCreateTime()));
         return vo;
         return vo;
     }
     }
 
 
@@ -815,7 +762,7 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
     private Map<Long, String> loadUserNames(List<DisEvent> events) {
     private Map<Long, String> loadUserNames(List<DisEvent> events) {
         List<Long> ids = new ArrayList<>();
         List<Long> ids = new ArrayList<>();
         for (DisEvent event : events) {
         for (DisEvent event : events) {
-            addUserId(ids, event.getReporterId());
+            addUserId(ids, event.getCreateUserId());
             addUserId(ids, event.getVerifierId());
             addUserId(ids, event.getVerifierId());
             addUserId(ids, event.getHandlerId());
             addUserId(ids, event.getHandlerId());
         }
         }

+ 6 - 30
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/service/impl/DisPlanLibraryServiceImpl.java

@@ -28,13 +28,10 @@ import java.util.stream.Collectors;
 public class DisPlanLibraryServiceImpl extends ServiceImpl<DisPlanLibraryMapper, DisPlanLibrary>
 public class DisPlanLibraryServiceImpl extends ServiceImpl<DisPlanLibraryMapper, DisPlanLibrary>
         implements DisPlanLibraryService {
         implements DisPlanLibraryService {
 
 
-    /** 加权评分:事件类型40 / 事件级别25 / 发生区域20 / 责任单位15 */
+    /** 加权评分:预案类型40 / 预案等级25 / 责任单位35 */
     private static final int SCORE_TYPE = 40;
     private static final int SCORE_TYPE = 40;
     private static final int SCORE_LEVEL = 25;
     private static final int SCORE_LEVEL = 25;
-    private static final int SCORE_REGION = 20;
-    private static final int SCORE_UNIT = 15;
-    /** 专题匹配基础匹配度 */
-    private static final int TOPIC_BASE_SCORE = 90;
+    private static final int SCORE_UNIT = 35;
     /** 最近匹配记录保留上限(超出删除最旧) */
     /** 最近匹配记录保留上限(超出删除最旧) */
     private static final int MAX_HISTORY = 20;
     private static final int MAX_HISTORY = 20;
 
 
@@ -60,9 +57,6 @@ public class DisPlanLibraryServiceImpl extends ServiceImpl<DisPlanLibraryMapper,
             if (StringUtils.isNotEmpty(dto.getEventLevel()) && dto.getEventLevel().equals(plan.getEventLevel())) {
             if (StringUtils.isNotEmpty(dto.getEventLevel()) && dto.getEventLevel().equals(plan.getEventLevel())) {
                 score += SCORE_LEVEL;
                 score += SCORE_LEVEL;
             }
             }
-            if (StringUtils.isNotEmpty(dto.getEventRegion()) && dto.getEventRegion().equals(plan.getEventRegion())) {
-                score += SCORE_REGION;
-            }
             if (StringUtils.isNotEmpty(dto.getResponsibleUnit()) && dto.getResponsibleUnit().equals(plan.getResponsibleUnit())) {
             if (StringUtils.isNotEmpty(dto.getResponsibleUnit()) && dto.getResponsibleUnit().equals(plan.getResponsibleUnit())) {
                 score += SCORE_UNIT;
                 score += SCORE_UNIT;
             }
             }
@@ -75,26 +69,13 @@ public class DisPlanLibraryServiceImpl extends ServiceImpl<DisPlanLibraryMapper,
         if (!results.isEmpty()) {
         if (!results.isEmpty()) {
             PlanMatchResultVO top = results.get(0);
             PlanMatchResultVO top = results.get(0);
             String desc = "手动匹配 " + StringUtils.defaultString(dto.getEventType(), "-")
             String desc = "手动匹配 " + StringUtils.defaultString(dto.getEventType(), "-")
-                    + "/" + StringUtils.defaultString(dto.getEventRegion(), "-")
-                    + "/" + StringUtils.defaultString(dto.getEventLevel(), "-");
+                    + "/" + StringUtils.defaultString(dto.getEventLevel(), "-")
+                    + "/" + StringUtils.defaultString(dto.getResponsibleUnit(), "-");
             saveRecord(dto, "manual", top.getId(), top.getPlanName(), top.getMatchScore(), desc, operUser);
             saveRecord(dto, "manual", top.getId(), top.getPlanName(), top.getMatchScore(), desc, operUser);
         }
         }
         return results;
         return results;
     }
     }
 
 
-    @Override
-    public List<PlanMatchResultVO> matchByTopic(String topic, String operUser) {
-        LambdaQueryWrapper<DisPlanLibrary> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(StringUtils.isNotEmpty(topic), DisPlanLibrary::getTopic, topic);
-        List<PlanMatchResultVO> results = this.list(wrapper).stream().map(plan -> {
-            PlanMatchResultVO vo = toVO(plan);
-            vo.setMatchScore(TOPIC_BASE_SCORE);
-            return vo;
-        }).collect(Collectors.toList());
-
-        return results;
-    }
-
     @Override
     @Override
     public List<DisPlanMatchRecord> getHistory(int limit) {
     public List<DisPlanMatchRecord> getHistory(int limit) {
         LambdaQueryWrapper<DisPlanMatchRecord> wrapper = new LambdaQueryWrapper<>();
         LambdaQueryWrapper<DisPlanMatchRecord> wrapper = new LambdaQueryWrapper<>();
@@ -119,15 +100,14 @@ public class DisPlanLibraryServiceImpl extends ServiceImpl<DisPlanLibraryMapper,
                 update.setCreateUserId(DispatchUserSupport.currentUserId());
                 update.setCreateUserId(DispatchUserSupport.currentUserId());
                 update.setCreateTime(LocalDateTime.now());
                 update.setCreateTime(LocalDateTime.now());
                 matchRecordMapper.updateById(update);
                 matchRecordMapper.updateById(update);
-                log.info("预案匹配记录已更新: 条件={}/{}/{}/{}",
-                        dto.getEventType(), dto.getEventRegion(), dto.getEventLevel(), dto.getResponsibleUnit());
+                log.info("预案匹配记录已更新: 条件={}/{}/{}",
+                        dto.getEventType(), dto.getEventLevel(), dto.getResponsibleUnit());
                 return;
                 return;
             }
             }
 
 
             DisPlanMatchRecord record = new DisPlanMatchRecord();
             DisPlanMatchRecord record = new DisPlanMatchRecord();
             record.setEventType(dto.getEventType());
             record.setEventType(dto.getEventType());
             record.setEventLevel(dto.getEventLevel());
             record.setEventLevel(dto.getEventLevel());
-            record.setEventRegion(dto.getEventRegion());
             record.setResponsibleUnit(dto.getResponsibleUnit());
             record.setResponsibleUnit(dto.getResponsibleUnit());
             record.setMatchType(matchType);
             record.setMatchType(matchType);
             record.setPlanId(planId);
             record.setPlanId(planId);
@@ -152,7 +132,6 @@ public class DisPlanLibraryServiceImpl extends ServiceImpl<DisPlanLibraryMapper,
         wrapper.eq(DisPlanMatchRecord::getMatchType, "manual");
         wrapper.eq(DisPlanMatchRecord::getMatchType, "manual");
         wrapper.eq(StringUtils.isNotEmpty(dto.getEventType()), DisPlanMatchRecord::getEventType, dto.getEventType());
         wrapper.eq(StringUtils.isNotEmpty(dto.getEventType()), DisPlanMatchRecord::getEventType, dto.getEventType());
         wrapper.eq(StringUtils.isNotEmpty(dto.getEventLevel()), DisPlanMatchRecord::getEventLevel, dto.getEventLevel());
         wrapper.eq(StringUtils.isNotEmpty(dto.getEventLevel()), DisPlanMatchRecord::getEventLevel, dto.getEventLevel());
-        wrapper.eq(StringUtils.isNotEmpty(dto.getEventRegion()), DisPlanMatchRecord::getEventRegion, dto.getEventRegion());
         wrapper.eq(StringUtils.isNotEmpty(dto.getResponsibleUnit()), DisPlanMatchRecord::getResponsibleUnit, dto.getResponsibleUnit());
         wrapper.eq(StringUtils.isNotEmpty(dto.getResponsibleUnit()), DisPlanMatchRecord::getResponsibleUnit, dto.getResponsibleUnit());
         wrapper.last("LIMIT 1");
         wrapper.last("LIMIT 1");
         return matchRecordMapper.selectOne(wrapper);
         return matchRecordMapper.selectOne(wrapper);
@@ -183,10 +162,7 @@ public class DisPlanLibraryServiceImpl extends ServiceImpl<DisPlanLibraryMapper,
         vo.setPlanName(plan.getPlanName());
         vo.setPlanName(plan.getPlanName());
         vo.setEventType(plan.getEventType());
         vo.setEventType(plan.getEventType());
         vo.setEventLevel(plan.getEventLevel());
         vo.setEventLevel(plan.getEventLevel());
-        vo.setEventRegion(plan.getEventRegion());
         vo.setResponsibleUnit(plan.getResponsibleUnit());
         vo.setResponsibleUnit(plan.getResponsibleUnit());
-        vo.setTopic(plan.getTopic());
-        vo.setPlanSummary(plan.getPlanSummary());
         vo.setPlanContent(plan.getPlanContent());
         vo.setPlanContent(plan.getPlanContent());
         return vo;
         return vo;
     }
     }

+ 1 - 19
pipe-network-service/zksy-system/src/main/java/com/zksy/dispatch/service/impl/DisPlanServiceImpl.java

@@ -21,7 +21,6 @@ import com.zksy.dispatch.mapper.DispatchUserMapper;
 import com.zksy.dispatch.service.DisPlanLogService;
 import com.zksy.dispatch.service.DisPlanLogService;
 import com.zksy.dispatch.service.DisPlanService;
 import com.zksy.dispatch.service.DisPlanService;
 import com.zksy.dispatch.service.DisPlanVersionService;
 import com.zksy.dispatch.service.DisPlanVersionService;
-import com.zksy.dispatch.support.DispatchAttachUrlSupport;
 import com.zksy.dispatch.support.DispatchNumberSupport;
 import com.zksy.dispatch.support.DispatchNumberSupport;
 import com.zksy.dispatch.support.DispatchUserSupport;
 import com.zksy.dispatch.support.DispatchUserSupport;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
@@ -66,10 +65,6 @@ public class DisPlanServiceImpl extends ServiceImpl<DisPlanMapper, DisPlan>
     @Autowired
     @Autowired
     private DisPlanVersionService versionService;
     private DisPlanVersionService versionService;
 
 
-    /** 附件地址支撑:库内相对路径 ↔ 展示完整 URL(MinIO 配置拼接) */
-    @Autowired
-    private DispatchAttachUrlSupport attachUrlSupport;
-
     @Autowired
     @Autowired
     private DisPlanLogService planLogService;
     private DisPlanLogService planLogService;
 
 
@@ -120,11 +115,7 @@ public class DisPlanServiceImpl extends ServiceImpl<DisPlanMapper, DisPlan>
         for (DisPlanVersion version : versionService.list(vw)) {
         for (DisPlanVersion version : versionService.list(vw)) {
             candidatePlanIds.add(version.getPlanId());
             candidatePlanIds.add(version.getPlanId());
         }
         }
-        records.forEach(plan -> {
-            // 附件:库内相对路径 → 拼 MinIO 配置地址返回前端展示/下载
-            plan.setAttachPath(attachUrlSupport.toAccessibleUrl(plan.getAttachPath()));
-            fillTransient(plan, candidatePlanIds.contains(plan.getId()));
-        });
+        records.forEach(plan -> fillTransient(plan, candidatePlanIds.contains(plan.getId())));
         return page;
         return page;
     }
     }
 
 
@@ -134,7 +125,6 @@ public class DisPlanServiceImpl extends ServiceImpl<DisPlanMapper, DisPlan>
         if (plan == null) {
         if (plan == null) {
             throw new ServiceException("预案不存在:" + id);
             throw new ServiceException("预案不存在:" + id);
         }
         }
-        plan.setAttachPath(attachUrlSupport.toAccessibleUrl(plan.getAttachPath()));
         fillTransient(plan, versionService.getPendingVersion(id) != null);
         fillTransient(plan, versionService.getPendingVersion(id) != null);
         return plan;
         return plan;
     }
     }
@@ -228,8 +218,6 @@ public class DisPlanServiceImpl extends ServiceImpl<DisPlanMapper, DisPlan>
             candidate.setPlanNo(db.getPlanNo());
             candidate.setPlanNo(db.getPlanNo());
             candidate.setVersion(nextVersion);
             candidate.setVersion(nextVersion);
             candidate.setContent(dto.getContent());
             candidate.setContent(dto.getContent());
-            candidate.setAttachName(dto.getAttachName());
-            candidate.setAttachPath(attachUrlSupport.toRelative(dto.getAttachPath()));
             candidate.setChangeNote(dto.getChangeNote());
             candidate.setChangeNote(dto.getChangeNote());
             candidate.setEditor(DispatchUserSupport.currentUserName());
             candidate.setEditor(DispatchUserSupport.currentUserName());
             candidate.setEditorId(DispatchUserSupport.currentUserId());
             candidate.setEditorId(DispatchUserSupport.currentUserId());
@@ -330,8 +318,6 @@ public class DisPlanServiceImpl extends ServiceImpl<DisPlanMapper, DisPlan>
             version.setPlanNo(db.getPlanNo());
             version.setPlanNo(db.getPlanNo());
             version.setVersion(targetVersion);
             version.setVersion(targetVersion);
             version.setContent(db.getContent());
             version.setContent(db.getContent());
-            version.setAttachName(db.getAttachName());
-            version.setAttachPath(attachUrlSupport.toRelative(db.getAttachPath()));
             version.setChangeNote("通过审核并发布");
             version.setChangeNote("通过审核并发布");
             version.setEditor(DispatchUserSupport.currentUserName());
             version.setEditor(DispatchUserSupport.currentUserName());
             version.setEditorId(DispatchUserSupport.currentUserId());
             version.setEditorId(DispatchUserSupport.currentUserId());
@@ -401,8 +387,6 @@ public class DisPlanServiceImpl extends ServiceImpl<DisPlanMapper, DisPlan>
         plan.setCompileUnit(dto.getCompileUnit());
         plan.setCompileUnit(dto.getCompileUnit());
         plan.setPublishUnit(dto.getPublishUnit());
         plan.setPublishUnit(dto.getPublishUnit());
         plan.setPublishDate(dto.getPublishDate());
         plan.setPublishDate(dto.getPublishDate());
-        plan.setAttachName(dto.getAttachName());
-        plan.setAttachPath(attachUrlSupport.toRelative(dto.getAttachPath()));
         plan.setContent(dto.getContent());
         plan.setContent(dto.getContent());
         if (dto.getIsTemplate() != null) {
         if (dto.getIsTemplate() != null) {
             plan.setIsTemplate(dto.getIsTemplate());
             plan.setIsTemplate(dto.getIsTemplate());
@@ -457,8 +441,6 @@ public class DisPlanServiceImpl extends ServiceImpl<DisPlanMapper, DisPlan>
     private PlanVersionVO toVersionVO(DisPlanVersion version, Map<Long, String> editorNames) {
     private PlanVersionVO toVersionVO(DisPlanVersion version, Map<Long, String> editorNames) {
         PlanVersionVO vo = new PlanVersionVO();
         PlanVersionVO vo = new PlanVersionVO();
         BeanUtils.copyProperties(version, vo);
         BeanUtils.copyProperties(version, vo);
-        // 版本附件快照:库内相对路径 → 拼 MinIO 配置地址
-        vo.setAttachPath(attachUrlSupport.toAccessibleUrl(version.getAttachPath()));
         vo.setVerStatusName(PlanVersionStatusEnum.getDescByCode(version.getVerStatus()));
         vo.setVerStatusName(PlanVersionStatusEnum.getDescByCode(version.getVerStatus()));
         String editor = version.getEditorId() == null ? null : editorNames.get(version.getEditorId());
         String editor = version.getEditorId() == null ? null : editorNames.get(version.getEditorId());
         if (StringUtils.isNotBlank(editor)) {
         if (StringUtils.isNotBlank(editor)) {