浏览代码

优化应急事件管理

zengy 1 天之前
父节点
当前提交
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 迁移而来,identity 序列未同步推进
 --       (仍在 0 附近),INSERT 不带 id 时自动生成 0,撞已存在行。
--- 修复:把 identity 序列校准为表内最大 id(幂等,可重复执行)。
+-- 说明:新库/升级库请优先执行 dispatch_named_id_sequences.sql,统一切换到
+--       app_user.dis_event_grade_id_seq;本文件仅保留该固定序列的校准动作。
 -- 执行方式:KingbaseES 客户端执行第 1 段即可;第 2 段用于核验。
 -- =====================================================================
 
 -- 1) 校准序列:从 max(id) 之后继续发号
 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)
 );
 
 -- 2) 核验:nextval 应大于 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;
 
 -- 附:同批次从旧表迁移过的其他调度表可顺带自检(把表名换掉执行第 1 段):

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

@@ -3,34 +3,36 @@
 -- 预案模板库种子数据(供「新建预案」时选择模板,预填名称与章节正文)
 -- ---------------------------------------------------------------------
 -- 幂等:按 plan_name NOT EXISTS 判断,可重复执行。
+-- KingbaseES:整段在一个事务中执行;FROM dual 为 Kingbase 兼容写法。
 -- =====================================================================
 
+BEGIN;
+
 -- TP-001 通用应急预案模板
 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 调查评估',
-       '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
  WHERE NOT EXISTS (SELECT 1 FROM app_user.dis_plan_library WHERE plan_name = '通用应急预案模板' AND del_flag = '0');
 
 -- TP-004 燃气专项预案模板
 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 恢复供气',
-       '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
  WHERE NOT EXISTS (SELECT 1 FROM app_user.dis_plan_library WHERE plan_name = '燃气专项预案模板' AND del_flag = '0');
 
 -- TP-006 供水专项预案模板
 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 总结评估',
-       '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
  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
--- 预案版本快照补充附件字段
+-- 预案版本快照附件字段清理(历史脚本名保留以避免升级流程引用失效)
 -- ---------------------------------------------------------------------
--- 背景:版本是预案的快照日志,但快照里只有正文(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 与业务确认):
 --   · 事件等级:3 级 —— Ⅰ级(紧急) / Ⅱ级(较大) / Ⅲ级(一般)(原型口径)
---   · 事件类别:保留两级 —— event_type(管网类型) + event_category(故障类别)
+--   · 事件类别、事件等级分别使用 dis_event_category / dis_event_level
 --   · 事件状态:5 态 —— 0 待核实 / 1 已核实 / 2 处置中 / 3 已解除 / 4 不实事件
 --     存量「待受理」归 0、「已关闭」归 3
 --
@@ -19,9 +19,8 @@
 --   建表用 CREATE TABLE IF NOT EXISTS;加列用 ADD COLUMN IF NOT EXISTS;
 --   字典先 DELETE 同 dict_type 再 INSERT。
 --
--- ⚠️ 本脚本只做「新增」,不删除任何旧表/旧列/旧数据。
---    废弃旧表与旧列的 DROP 语句放在独立的 dispatch_refactor_drop.sql,
---    确认新结构运行正常后再单独执行。
+--    本版同时完成 dis_plan_library 的字段收敛:将类型/等级统一为字典编码,
+--    并删除已废弃的 event_region / topic / plan_summary 列。
 -- =====================================================================
 
 BEGIN;
@@ -45,13 +44,9 @@ CREATE TABLE IF NOT EXISTS app_user.dis_event (
     longitude        numeric(12,6),
     latitude         numeric(12,6),
     happen_time      timestamp,
-    report_time      timestamp,
-    reporter         varchar(64),
     reporter_phone   varchar(20),
-    event_type       varchar(20),
     event_category   varchar(20),
     event_level      varchar(20),
-    event_region     varchar(20),
     status           int2 NOT NULL DEFAULT 0,
     verify_result    int2,
     verifier         varchar(64),
@@ -67,11 +62,9 @@ CREATE TABLE IF NOT EXISTS app_user.dis_event (
     last_visit_time  timestamp,
     next_visit_time  timestamp,
     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,
-    update_by        varchar(64),
+    update_user_id   int8,
     update_time      timestamp DEFAULT CURRENT_TIMESTAMP,
     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 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 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 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_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 verify_result   int2;
 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 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 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 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 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.latitude        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.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_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.verify_result   IS '核实结论:0-真实 1-不实;仅 status in (1,4) 时有值';
 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.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.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=删除)';
 
+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 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_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 事件日志表
@@ -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 预案主表
 -- ---------------------------------------------------------------------
+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 (
-    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_name      varchar(200) NOT NULL,
     plan_type      varchar(20),
@@ -243,10 +239,7 @@ CREATE TABLE IF NOT EXISTS app_user.dis_plan (
     compile_unit   varchar(128),
     publish_unit   varchar(128),
     publish_date   varchar(20),
-    attach_name    varchar(255),
-    attach_path    varchar(1000),
     is_template    int2 NOT NULL DEFAULT 0,
-    status         int2 NOT NULL DEFAULT 0,
     version        varchar(20),
     content        text,
     approve_result varchar(20),
@@ -259,14 +252,16 @@ CREATE TABLE IF NOT EXISTS app_user.dis_plan (
     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_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 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_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 status         int2 DEFAULT 0;
 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 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 COLUMN app_user.dis_plan.plan_no        IS '预案编号(业务序号:YA+yyyyMMdd+4位随机)';
 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.publish_unit   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.status         IS 'PlanStatusEnum:0-草稿 1-待审核 2-已通过 3-已驳回';
 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 预案版本快照表
 -- ---------------------------------------------------------------------
+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 (
-    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_no     varchar(32),
     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 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 COLUMN app_user.dis_plan_version.plan_id     IS '关联 dis_plan.id';
 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 预案操作日志表
 --     替代旧 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 (
-    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_no        varchar(32),
     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);
 
+-- ---------------------------------------------------------------------
+-- 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 (
-    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_type     varchar(20),
     event_level    varchar(20),
-    sub_category   varchar(50),
-    scenario       varchar(200),
     criteria       text,
     response       varchar(500),
-    status         int2 NOT NULL DEFAULT 0,
     remark         varchar(500),
-    create_by      varchar(64),
     create_time    timestamp DEFAULT CURRENT_TIMESTAMP,
-    update_by      varchar(64),
     update_time    timestamp DEFAULT CURRENT_TIMESTAMP,
     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_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 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 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 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 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 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 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_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.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.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
@@ -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
- 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_transfer_dept','dis_report_target',
                      '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)
 SELECT v.dict_name, v.dict_type, '0', 'admin', CURRENT_TIMESTAMP, v.remark
   FROM (VALUES
         ('应急事件来源',     'dis_event_source',         '应急事件来源:1巡查上报 2呼叫中心 3视频监控 4上级下达'),
         ('应急事件来源渠道', 'dis_event_channel',        '应急事件来源渠道'),
-        ('应急管网类型',     'dis_event_type',           '应急事件管网类型:1供水管网 2燃气管网 3排水管网 9其他'),
         ('应急事件类别',     'dis_event_category',       '应急事件类别:故障类别'),
         ('应急事件等级',     'dis_event_level',          '应急事件等级:1Ⅰ级紧急 2Ⅱ级较大 3Ⅲ级一般'),
-        ('应急事件区域',     'dis_event_region',         '应急事件发生区域'),
         ('工作催办方式',     'dis_event_urge_method',    '工作催办方式:1电话 2短信 3系统消息'),
         ('工作催办结果',     'dis_event_urge_result',    '工作催办结果:0未反馈 1已反馈'),
         ('处置态势评估',     'dis_event_trend',          '处置跟踪的态势评估:1趋于平稳 2仍在发展 3明显恶化'),
@@ -480,10 +526,6 @@ VALUES
 (4, '交警监控共享平台', '4', '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, '事件类别:管道泄漏'),
 (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, '事件等级:Ⅱ级较大'),
 (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, '催办方式:电话'),
 (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 位补零序列)
         INSERT INTO app_user.dis_plan
             (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,详见文件头「方言红线」
         SELECT concat('YA', to_char(CURRENT_TIMESTAMP, 'YYYYMMDD'),
                       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.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 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;

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

@@ -11,7 +11,7 @@
 --
 -- 本脚本做什么:
 --   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_version     editor_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 为准,查不到再退回名称快照。
+--   · 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**,
 --     故回填按 user_name 匹配;其余业务人员列存的是**昵称 sys_user.nick_name**,按 nick_name 匹配。
 --   · 不变更任何现存列的类型与取值,纯新增,不破坏既有功能。
@@ -49,17 +52,15 @@ BEGIN;
 -- =====================================================================
 
 -- 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 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 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.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 预案主表
 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_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';
 
 -- 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_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
    SET verifier_id = m.user_id
   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 m.cnt = 1;
 
--- 2.3 dis_event —— 责任处置人(昵称)
+-- 2.2 dis_event —— 责任处置人(昵称)
 UPDATE app_user.dis_event e
    SET handler_id = m.user_id
   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 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 —— 创建人 / 修改人(登录名)
 UPDATE app_user.dis_plan p
    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 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
    SET create_user_id = m.user_id
   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')
 --     ORDER BY table_name, column_name;
 -- 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.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_version.editor', count(editor),     count(editor_id)     FROM app_user.dis_plan_version;
 -- 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.dispatch.domain.DisEvent;
 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.service.DisEventLogService;
 import com.zksy.dispatch.service.DisEventService;
@@ -28,16 +15,8 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 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.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.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.dispatch.domain.DisEventGrade;
 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 io.swagger.annotations.Api;
 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.RestController;
 
-import java.util.Arrays;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * 应急事件分级分类标准接口
  *
  * <p>类别与等级取字典 {@code dis_event_category} / {@code dis_event_level}
- * 的编码值,不再使用中文常量;状态见 {@code GradeStatusEnum}。</p>
+ * 的编码值,不再使用中文常量。</p>
  */
 @Slf4j
 @RestController
@@ -67,18 +63,8 @@ public class DisEventGradeController {
         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")
-    @ApiOperation("新增分级标准(自动生成标准编号,默认启用)")
+    @ApiOperation("新增分级标准")
     @Log(title = "新增分级标准", businessType = BusinessType.INSERT)
     @PreAuthorize("@ss.hasPermi('dispatch:grade:add')")
     public AjaxResult save(@RequestBody DisEventGrade entity) {
@@ -86,7 +72,7 @@ public class DisEventGradeController {
     }
 
     @PutMapping("/updateById")
-    @ApiOperation("修改分级标准(标准编号不可改)")
+    @ApiOperation("修改分级标准")
     @Log(title = "修改分级标准", businessType = BusinessType.UPDATE)
     @PreAuthorize("@ss.hasPermi('dispatch:grade:edit')")
     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();
         if (entity.getId() == null) {
-            entity.setCreateBy(currentUser());
             try {
                 entity.setCreateUserId(com.zksy.common.utils.SecurityUtils.getUserId());
             } catch (Exception ignored) {
@@ -75,14 +74,6 @@ public class DisPlanLibraryController {
         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")
     @ApiOperation("查询最近匹配记录")
     @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")
     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("上报人联系电话")
     private String reporterPhone;
 
-    @ApiModelProperty("管网类型:字典 dis_event_type")
-    private String eventType;
-
     @ApiModelProperty("事件类别:字典 dis_event_category")
     private String eventCategory;
 
     @ApiModelProperty("事件等级:字典 dis_event_level")
     private String eventLevel;
 
-    @ApiModelProperty("发生区域:字典 dis_event_region")
-    private String eventRegion;
-
     @ApiModelProperty("事件状态:EventStatusEnum —— 0待核实 1已核实 2处置中 3已解除 4不实事件")
     private Integer status;
 
@@ -129,12 +113,6 @@ public class DisEvent {
     @ApiModelProperty("解除说明 / 处置结果补充")
     private String releaseNote;
 
-    @ApiModelProperty("处置前附件URL(图片/视频,多个英文逗号分隔;解除原因为「事件已处置完成」时上传)")
-    private String beforeUrl;
-
-    @ApiModelProperty("处置后附件URL(图片/视频,多个英文逗号分隔;解除原因为「事件已处置完成」时上传)")
-    private String afterUrl;
-
     @ApiModelProperty("最近回访时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime lastVisitTime;
@@ -146,15 +124,6 @@ public class DisEvent {
     @ApiModelProperty("是否需要升级:字典 dis_yes_no")
     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")
     private Long createUserId;
 
@@ -162,9 +131,6 @@ public class DisEvent {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime createTime;
 
-    @ApiModelProperty("更新人")
-    private String updateBy;
-
     @ApiModelProperty("最后修改人用户ID(sys_user.user_id);updateBy 存登录名,本字段存ID")
     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)
  * 改造要点:
  * <ul>
- * <li>补业务编号 gradeNo(GJ+yyyyMMdd+3位随机),主键仍为 int8 自增</li>
+ * <li>主键由 dis_event_grade_id_seq 生成</li>
  * <li>原 category / level 改名 event_category / 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>
  * </ul>
  * @author zengy
@@ -36,50 +35,29 @@ public class DisEventGrade {
     @ApiModelProperty("主键ID")
     private Long id;
 
-    @ApiModelProperty("标准编号(业务序号:GJ+yyyyMMdd+3位随机,保存前生成,普通更新不可修改)")
-    private String gradeNo;
-
     @ApiModelProperty("事件类别:字典 dis_event_category")
     private String eventCategory;
 
-    @ApiModelProperty("管网类型:字典 dis_event_type")
-    private String eventType;
-
     @ApiModelProperty("事件等级:字典 dis_event_level")
     private String eventLevel;
 
-    @ApiModelProperty("类别细分")
-    private String subCategory;
-
-    @ApiModelProperty("适用场景")
-    private String scenario;
-
     @ApiModelProperty("分级分类判断标准")
     private String criteria;
 
     @ApiModelProperty("响应要求")
     private String response;
 
-    @ApiModelProperty("启用状态:GradeStatusEnum —— 0启用 1停用")
-    private Integer status;
-
     @ApiModelProperty("备注")
     private String remark;
 
-    @ApiModelProperty("创建人")
-    private String createBy;
-
-    @ApiModelProperty("创建人用户ID(sys_user.user_id);createBy 存登录名,本字段存ID")
+    @ApiModelProperty("创建人用户ID(sys_user.user_id)")
     private Long createUserId;
 
     @ApiModelProperty("创建时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime createTime;
 
-    @ApiModelProperty("更新人")
-    private String updateBy;
-
-    @ApiModelProperty("最后修改人用户ID(sys_user.user_id);updateBy 存登录名,本字段存ID")
+    @ApiModelProperty("最后修改人用户ID(sys_user.user_id)")
     private Long updateUserId;
 
     @ApiModelProperty("更新时间")
@@ -90,7 +68,4 @@ public class DisEventGrade {
     @ApiModelProperty("删除标志(0=正常 2=删除)")
     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("发布日期")
     private String publishDate;
 
-    @ApiModelProperty("附件名称")
-    private String attachName;
-
-    @ApiModelProperty("附件路径")
-    private String attachPath;
-
     @ApiModelProperty("是否预案模板:0-否 1-是")
     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("预案名称")
     private String planName;
 
-    @ApiModelProperty("事件类型(排水/供水/燃气)")
+    @ApiModelProperty("预案类型(字典 dis_plan_type)")
     private String eventType;
 
-    @ApiModelProperty("事件级别")
+    @ApiModelProperty("预案等级(字典 dis_plan_level)")
     private String eventLevel;
 
-    @ApiModelProperty("发生区域(城南/城北/太常)")
-    private String eventRegion;
-
     @ApiModelProperty("责任单位(供水局/燃气公司/排水公司)")
     private String responsibleUnit;
 
-    @ApiModelProperty("所属专题(排水专题/供水专题/燃气专题)")
-    private String topic;
-
-    @ApiModelProperty("预案概要")
-    private String planSummary;
-
     @ApiModelProperty("预案内容")
     private String planContent;
 
-    @ApiModelProperty("创建人")
-    private String createBy;
-
-    @ApiModelProperty("创建人用户ID(sys_user.user_id);createBy 存登录名,本字段存ID")
+    @ApiModelProperty("创建人用户ID(sys_user.user_id)")
     private Long createUserId;
 
     @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)")
     private String content;
 
-    @ApiModelProperty("附件名称快照")
-    private String attachName;
-
-    @ApiModelProperty("附件URL快照(MinIO 直链)")
-    private String attachPath;
-
     @ApiModelProperty("变更说明;修订已通过预案时必填")
     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;
 
 /**
- * 责任单位下拉项(系统部门)
- * 初判核实时「责任单位」不再手填,改为选择系统部门(sys_dept);前端用
- * deptId 树形展示并用它过滤责任处置人候选(该部门所属人员),提交时把
+ * 部门下拉项(系统部门)
+ * 初判核实时「处置单位」选择系统部门(sys_dept);前端用 deptId 树形展示并
+ * 过滤处置人候选(所选部门及其所有下级部门),提交时把
  * deptName 写入 dis_event.department(该列存部门中文名,工作催办、
  * 多条件筛选均按名称口径,保持不变)。
  * @author zengy
  */
 @Data
-@ApiModel(value = "责任单位下拉项", description = "应急事件责任单位可选系统部门")
+@ApiModel(value = "部门下拉项", description = "应急事件处置单位可选系统部门")
 public class DisDeptOptionVO implements Serializable {
 
     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;
 
-    @ApiModelProperty(value = "标准编号(模糊)")
-    private String gradeNo;
-
     @ApiModelProperty(value = "事件类别:字典 dis_event_category")
     private String eventCategory;
 
-    @ApiModelProperty(value = "管网类型:字典 dis_event_type")
-    private String eventType;
-
     @ApiModelProperty(value = "事件等级:字典 dis_event_level")
     private String eventLevel;
 
-    @ApiModelProperty(value = "启用状态:GradeStatusEnum —— 0启用 1停用")
-    private Integer status;
-
     @ApiModelProperty(value = "创建开始日期(yyyy-MM-dd,含当天)")
     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 = "事件描述(模糊)")
     private String description;
 
-    @ApiModelProperty(value = "管网类型:字典 dis_event_type")
-    private String eventType;
-
     @ApiModelProperty(value = "事件类别:字典 dis_event_category")
     private String eventCategory;
 
@@ -36,9 +33,6 @@ public class DisEventPageDTO implements Serializable {
     @ApiModelProperty(value = "事件来源:字典 dis_event_source")
     private String eventSource;
 
-    @ApiModelProperty(value = "发生区域:字典 dis_event_region")
-    private String eventRegion;
-
     @ApiModelProperty(value = "发生地点(模糊)")
     private String location;
 
@@ -60,9 +54,6 @@ public class DisEventPageDTO implements Serializable {
     @ApiModelProperty(value = "接报结束日期 yyyy-MM-dd")
     private String endDate;
 
-    @ApiModelProperty(value = "直接经济损失区间:0-1万 1-10万 10-100万 100万以上")
-    private String lossRange;
-
     @ApiModelProperty(value = "排序方向:true=接报时间升序(先报先办的队列页),不传或 false=倒序(记录回看页)")
     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")
     private LocalDateTime happenTime;
 
-    @ApiModelProperty(value = "接报时间")
+    @ApiModelProperty(value = "接报时间(兼容字段,取 create_time)")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime reportTime;
 
-    @ApiModelProperty(value = "接报人(按 reporterId 反查 sys_user 昵称,查不到退回快照)")
+    @ApiModelProperty(value = "接报人(按 create_user_id 反查 sys_user 昵称)")
     private String reporter;
 
-    @ApiModelProperty(value = "接报人用户ID")
-    private Long reporterId;
-
     @ApiModelProperty(value = "上报人联系电话")
     private String reporterPhone;
 
-    @ApiModelProperty(value = "管网类型:字典 dis_event_type")
-    private String eventType;
-
     @ApiModelProperty(value = "事件类别:字典 dis_event_category")
     private String eventCategory;
 
     @ApiModelProperty(value = "事件等级:字典 dis_event_level")
     private String eventLevel;
 
-    @ApiModelProperty(value = "发生区域:字典 dis_event_region")
-    private String eventRegion;
-
     @ApiModelProperty(value = "事件状态:EventStatusEnum")
     private Integer status;
 
@@ -126,12 +117,6 @@ public class DisEventVO implements Serializable {
     @ApiModelProperty(value = "解除说明")
     private String releaseNote;
 
-    @ApiModelProperty(value = "处置前附件URL(图片/视频,多个英文逗号分隔)")
-    private String beforeUrl;
-
-    @ApiModelProperty(value = "处置后附件URL(图片/视频,多个英文逗号分隔)")
-    private String afterUrl;
-
     @ApiModelProperty(value = "最近回访时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime lastVisitTime;
@@ -143,15 +128,9 @@ public class DisEventVO implements Serializable {
     @ApiModelProperty(value = "是否需要升级:字典 dis_yes_no")
     private Integer needUpgrade;
 
-    @ApiModelProperty(value = "应用预案ID")
-    private Long planId;
-
     @ApiModelProperty(value = "应用预案名称")
     private String planName;
 
-    @ApiModelProperty(value = "直接经济损失(万元)")
-    private BigDecimal lossAmount;
-
     @ApiModelProperty(value = "创建时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     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;
 
 /**
- * 责任处置人下拉项(系统用户)
- * 初判核实时「责任处置人」不再手填,改为选择系统用户;选中后前端用
- * phonenumber 自动带出「联系电话」,用 nickName 写入
- * dis_event.handler(工作催办即按该字段找催办对象,故必须是可读姓名)。
+ * 应急事件操作的用户下拉项(系统用户)。
+ * 用于初判核实选择处置人、核验人;处置人 nickName 写入 dis_event.handler。
  * @author zengy
  */
 @Data
-@ApiModel(value = "责任处置人下拉项", description = "应急事件责任处置人可选系统用户")
+@ApiModel(value = "应急事件用户下拉项", description = "应急事件处置人和核验人可选系统用户")
 public class DisUserOptionVO implements Serializable {
 
     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 java.io.Serializable;
-import java.math.BigDecimal;
 
 /**
  * 事件解除入参
@@ -26,12 +25,4 @@ public class EventReleaseDTO implements Serializable {
     @ApiModelProperty(value = "解除说明 / 处置结果补充")
     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")
     private String channel;
 
-    @ApiModelProperty(value = "管网类型:字典 dis_event_type(1供水管网 2燃气管网 3排水管网 9其他)")
-    private String eventType;
-
     @ApiModelProperty(value = "发生地点", required = true)
     private String location;
 
@@ -49,13 +46,6 @@ public class EventSaveDTO implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     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 = "上报人联系电话")
     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
 @ApiModel(value = "初判核实入参", description = "初判核实入参")
@@ -23,33 +23,33 @@ public class EventVerifyDTO implements Serializable {
     @ApiModelProperty(value = "核实结论:0-真实 1-不实", required = true)
     private Integer verifyResult;
 
-    @ApiModelProperty(value = "管网类型:字典 dis_event_type")
-    private String eventType;
-
     @ApiModelProperty(value = "事件类别:字典 dis_event_category")
     private String eventCategory;
 
     @ApiModelProperty(value = "事件等级:字典 dis_event_level")
     private String eventLevel;
 
-    @ApiModelProperty(value = "发生区域:字典 dis_event_region")
-    private String eventRegion;
-
-    @ApiModelProperty(value = "责任处置人")
+    @ApiModelProperty(value = "处置人")
     private String handler;
 
-    @ApiModelProperty(value = "责任处置人用户ID(sys_user.user_id);前端从系统用户下拉选中后回传")
+    @ApiModelProperty(value = "处置人用户ID(sys_user.user_id);须属于处置单位或其下级部门")
     private Long handlerId;
 
-    @ApiModelProperty(value = "责任处置人电话")
+    @ApiModelProperty(value = "兼容旧客户端;当前核实流程不再使用")
     private String handlerPhone;
 
-    @ApiModelProperty(value = "责任单位")
+    @ApiModelProperty(value = "处置单位名称")
     private String department;
 
+    @ApiModelProperty(value = "处置单位部门ID")
+    private Long deptId;
+
     @ApiModelProperty(value = "核验人;为空时取当前登录用户")
     private String verifier;
 
-    @ApiModelProperty(value = "核实意见;判定为不实时填核销原因")
+    @ApiModelProperty(value = "核验人用户ID;为空时取当前登录用户")
+    private Long verifierId;
+
+    @ApiModelProperty(value = "核实意见;不真实结论可不填写")
     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 {
     private static final long serialVersionUID = 1L;
 
-    @ApiModelProperty(value = "事件类型(排水/供水/燃气)")
+    @ApiModelProperty(value = "预案类型(字典 dis_plan_type)")
     private String eventType;
 
-    @ApiModelProperty(value = "事件级别")
+    @ApiModelProperty(value = "预案等级(字典 dis_plan_level)")
     private String eventLevel;
 
-    @ApiModelProperty(value = "发生区域(城南/城北/太常)")
-    private String eventRegion;
-
     @ApiModelProperty(value = "责任单位(供水局/燃气公司/排水公司)")
     private String responsibleUnit;
 
-    @ApiModelProperty(value = "专题名称(专题匹配时传入)")
-    private String topic;
-
     @ApiModelProperty(value = "预案ID(应用预案时传入)")
     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 = "预案名称")
     private String planName;
 
-    @ApiModelProperty(value = "事件类型")
+    @ApiModelProperty(value = "预案类型(字典 dis_plan_type)")
     private String eventType;
 
-    @ApiModelProperty(value = "事件级别")
+    @ApiModelProperty(value = "预案等级(字典 dis_plan_level)")
     private String eventLevel;
 
-    @ApiModelProperty(value = "发生区域")
-    private String eventRegion;
-
     @ApiModelProperty(value = "责任单位")
     private String responsibleUnit;
 
-    @ApiModelProperty(value = "所属专题")
-    private String topic;
-
-    @ApiModelProperty(value = "预案概要")
-    private String planSummary;
-
     @ApiModelProperty(value = "预案内容")
     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")
     private String publishDate;
 
-    @ApiModelProperty(value = "附件名称")
-    private String attachName;
-
-    @ApiModelProperty(value = "附件路径")
-    private String attachPath;
-
     @ApiModelProperty(value = "是否设为预案模板:0-否 1-是")
     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 = "版本正文快照")
     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 org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Options;
-import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
 @Mapper
 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();
 
     /**
-     * 按事件条件加权匹配预案(类型40/级别25/区域20/单位15)
+     * 按预案条件加权匹配预案(类型40/级别25/单位35)
      * @param dto 匹配条件
      * @param operUser 操作人
      * @return 按匹配度降序的结果,并记录匹配历史
      */
     List<PlanMatchResultVO> match(PlanMatchDTO dto, String operUser);
 
-    /**
-     * 按专题匹配预案
-     * @param topic 专题名称
-     * @param operUser 操作人
-     * @return 该专题下的预案列表(匹配度90),并记录匹配历史
-     */
-    List<PlanMatchResultVO> matchByTopic(String topic, String operUser);
-
     /**
      * 查询最近匹配/应用记录
      * @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.dispatch.domain.DisEventGrade;
 import com.zksy.dispatch.dto.DisEventGradePageDTO;
-import com.zksy.dispatch.enums.GradeStatusEnum;
 import com.zksy.dispatch.mapper.DisEventGradeMapper;
 import com.zksy.dispatch.service.DisEventGradeService;
-import com.zksy.dispatch.support.DispatchNumberSupport;
 import com.zksy.dispatch.support.DispatchUserSupport;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -33,11 +31,8 @@ public class DisEventGradeServiceImpl extends ServiceImpl<DisEventGradeMapper, D
     public Page<DisEventGrade> findByPage(DisEventGradePageDTO dto) {
         Page<DisEventGrade> page = new Page<>(dto.getPageNum(), dto.getPageSize());
         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.getEventType()), DisEventGrade::getEventType, dto.getEventType());
         wrapper.eq(StringUtils.isNotBlank(dto.getEventLevel()), DisEventGrade::getEventLevel, dto.getEventLevel());
-        wrapper.eq(dto.getStatus() != null, DisEventGrade::getStatus, dto.getStatus());
         // 创建时间区间过滤(含边界:结束日期取次日零点前),格式非法时忽略该条件不阻断查询
         try {
             if (StringUtils.isNotBlank(dto.getStartDate())) {
@@ -51,7 +46,6 @@ public class DisEventGradeServiceImpl extends ServiceImpl<DisEventGradeMapper, D
         }
         wrapper.orderByDesc(DisEventGrade::getCreateTime).orderByDesc(DisEventGrade::getId);
         Page<DisEventGrade> result = page(page, wrapper);
-        result.getRecords().forEach(this::fillStatusName);
         return result;
     }
 
@@ -59,10 +53,8 @@ public class DisEventGradeServiceImpl extends ServiceImpl<DisEventGradeMapper, D
     public List<DisEventGrade> listByCategory(String eventCategory) {
         LambdaQueryWrapper<DisEventGrade> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(StringUtils.isNotBlank(eventCategory), DisEventGrade::getEventCategory, eventCategory);
-        wrapper.eq(DisEventGrade::getStatus, GradeStatusEnum.ENABLED.getCode());
         wrapper.orderByAsc(DisEventGrade::getEventLevel).orderByAsc(DisEventGrade::getId);
         List<DisEventGrade> list = list(wrapper);
-        list.forEach(this::fillStatusName);
         return list;
     }
 
@@ -75,28 +67,13 @@ public class DisEventGradeServiceImpl extends ServiceImpl<DisEventGradeMapper, D
         if (StringUtils.isBlank(entity.getEventLevel())) {
             throw new ServiceException("请选择事件等级");
         }
-        if (!Integer.valueOf(1).equals(baseMapper.lockGradeNumberGeneration())) {
-            throw new IllegalStateException("未取得分级标准编号生成事务锁");
-        }
         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.setCreateTime(now);
-        entity.setUpdateBy(DispatchUserSupport.currentLoginName());
         entity.setUpdateUserId(DispatchUserSupport.currentUserId());
         entity.setUpdateTime(now);
         entity.setDelFlag("0");
         save(entity);
-        fillStatusName(entity);
         return entity;
     }
 
@@ -110,29 +87,15 @@ public class DisEventGradeServiceImpl extends ServiceImpl<DisEventGradeMapper, D
         if (db == null) {
             throw new ServiceException("分级标准不存在:" + entity.getId());
         }
-        if (entity.getStatus() != null && !GradeStatusEnum.isValid(entity.getStatus())) {
-            throw new ServiceException("启用状态取值不合法:" + entity.getStatus());
-        }
         // 标准编号与创建信息不允许通过更新接口篡改
         db.setEventCategory(entity.getEventCategory());
-        db.setEventType(entity.getEventType());
         db.setEventLevel(entity.getEventLevel());
-        db.setSubCategory(entity.getSubCategory());
-        db.setScenario(entity.getScenario());
         db.setCriteria(entity.getCriteria());
         db.setResponse(entity.getResponse());
-        db.setStatus(entity.getStatus());
         db.setRemark(entity.getRemark());
-        db.setUpdateBy(DispatchUserSupport.currentLoginName());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateTime(LocalDateTime.now());
         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 按接报时间升序(核实/转接报送/跟踪解除等「先报先办」队列页),
         // 默认倒序(接报管理等记录回看页);接报时间为空的排在最后
         if (Boolean.TRUE.equals(dto.getOrderAsc())) {
-            wrapper.orderByAsc(DisEvent::getReportTime).orderByAsc(DisEvent::getId);
+            wrapper.orderByAsc(DisEvent::getCreateTime).orderByAsc(DisEvent::getId);
         } else {
-            wrapper.orderByDesc(DisEvent::getReportTime).orderByDesc(DisEvent::getId);
+            wrapper.orderByDesc(DisEvent::getCreateTime).orderByDesc(DisEvent::getId);
         }
         page(page, wrapper);
 
@@ -215,9 +215,9 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         List<DisEvent> all = list();
         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.setYesterdayCount(yesterdayCount);
         vo.setTodayDelta(todayCount - yesterdayCount);
@@ -243,19 +243,6 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         vo.setPlanPublished(planVersionMapper.selectCount(new LambdaQueryWrapper<DisPlanVersion>()
                 .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(等级为空的归未定级)
         Map<String, Long> levelCount = all.stream()
                 .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()
                 .filter(e -> Objects.equals(e.getStatus(), EventStatusEnum.VERIFIED.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)
                 .collect(Collectors.toList());
         Map<Long, String> userNames = loadUserNames(disposingList);
@@ -315,14 +302,6 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         List<DisEvent> events = list(buildWrapper(dto));
         EventStatsVO vo = new EventStatsVO();
         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()
                 .filter(e -> e.getEventLevel() != null && MAJOR_LEVEL_CODES.contains(e.getEventLevel()))
                 .count();
@@ -336,15 +315,14 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         LambdaQueryWrapper<DisEvent> wrapper = new LambdaQueryWrapper<>();
         wrapper.like(StringUtils.isNotBlank(dto.getEventNo()), DisEvent::getEventNo, dto.getEventNo());
         wrapper.like(StringUtils.isNotBlank(dto.getHandler()), DisEvent::getHandler, dto.getHandler());
+        // 工作催办只面向已核实、处置中事件;即使调用方传入其他状态,也不能绕过范围限制。
+        wrapper.in(DisEvent::getStatus, EventStatusEnum.VERIFIED.getCode(), EventStatusEnum.DISPOSING.getCode());
         if (dto.getStatus() != null) {
             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<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();
             row.setEventId(event.getId());
             row.setEventNo(event.getEventNo());
-            row.setEventType(event.getEventType());
             row.setSummary(event.getDescription());
             row.setStatus(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.setHandlerId(event.getHandlerId());
             row.setHandlerPhone(event.getHandlerPhone());
@@ -401,29 +378,19 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
             throw new IllegalStateException("未取得事件编号生成事务锁");
         }
         LocalDateTime now = LocalDateTime.now();
-        String operator = DispatchUserSupport.currentLoginName();
-
         DisEvent event = new DisEvent();
         event.setEventSource(dto.getEventSource());
         event.setChannel(dto.getChannel());
-        event.setEventType(dto.getEventType());
         event.setLocation(dto.getLocation());
         event.setLongitude(dto.getLongitude());
         event.setLatitude(dto.getLatitude());
         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.setDescription(dto.getDescription());
         event.setStatus(EventStatusEnum.PENDING_VERIFY.getCode());
         event.setEventNo(DispatchNumberSupport.nextEventNo(baseMapper::existsEventNo));
-        event.setCreateBy(operator);
         event.setCreateUserId(DispatchUserSupport.currentUserId());
         event.setCreateTime(now);
-        event.setUpdateBy(operator);
         event.setUpdateUserId(DispatchUserSupport.currentUserId());
         event.setUpdateTime(now);
         event.setDelFlag("0");
@@ -446,17 +413,16 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
             throw new ServiceException("当前状态【" + EventStatusEnum.getDescByCode(db.getStatus()) + "】不可编辑");
         }
         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.setLongitude(dto.getLongitude());
         db.setLatitude(dto.getLatitude());
         db.setHappenTime(dto.getHappenTime());
-        db.setReportTime(dto.getReportTime());
-        // 接报人在接报登记时已按「当前录入人员」确定,编辑环节不允许改动,故此处不写 reporter
+        // 接报人由 create_user_id 确定,编辑时保留原创建人。
         db.setReporterPhone(dto.getReporterPhone());
         db.setDescription(dto.getDescription());
-        db.setUpdateBy(DispatchUserSupport.currentLoginName());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateTime(LocalDateTime.now());
         updateById(db);
@@ -490,11 +456,7 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         }
         Integer statusFrom = db.getStatus();
         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());
         } else {
             if (StringUtils.isBlank(dto.getEventCategory())) {
@@ -507,41 +469,70 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
 
         LocalDateTime now = LocalDateTime.now();
         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.setVerifyOpinion(dto.getVerifyOpinion());
         if (falseEvent) {
             db.setStatus(EventStatusEnum.FALSE_EVENT.getCode());
         } else {
-            // 管网类型在「接报登记」录入;核实弹窗不提供该输入,故仅当传入非空时才覆盖,
-            // 避免核实环节把接报时已登记的值清空。
-            if (StringUtils.isNotBlank(dto.getEventType())) {
-                db.setEventType(dto.getEventType());
-            }
             db.setEventCategory(dto.getEventCategory());
             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();
             if (handlerId == null && StringUtils.isNotBlank(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.setUpdateBy(DispatchUserSupport.currentLoginName());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateTime(now);
         updateById(db);
@@ -549,7 +540,7 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         EventLogOperTypeEnum operType = falseEvent
                 ? EventLogOperTypeEnum.VERIFY_FALSE : EventLogOperTypeEnum.VERIFY;
         DisEventLog log = buildLog(db, operType, statusFrom, db.getStatus());
-        log.setOperDesc(dto.getVerifyOpinion());
+        log.setOperDesc(StringUtils.defaultIfBlank(dto.getVerifyOpinion(), falseEvent ? "核实结论:不真实" : null));
         eventLogService.append(log);
     }
 
@@ -602,7 +593,6 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         LocalDateTime now = LocalDateTime.now();
         db.setStatus(EventStatusEnum.DISPOSING.getCode());
         db.setDisposeTime(now);
-        db.setUpdateBy(DispatchUserSupport.currentLoginName());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateTime(now);
         updateById(db);
@@ -628,7 +618,6 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         if (dto.getNeedUpgrade() != null) {
             db.setNeedUpgrade(dto.getNeedUpgrade());
         }
-        db.setUpdateBy(DispatchUserSupport.currentLoginName());
         db.setUpdateUserId(DispatchUserSupport.currentUserId());
         db.setUpdateTime(now);
         updateById(db);
@@ -658,14 +647,6 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         db.setReleaseTime(now);
         db.setReleaseReason(dto.getReleaseReason());
         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.setUpdateTime(now);
         updateById(db);
@@ -727,11 +708,9 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
         LambdaQueryWrapper<DisEvent> wrapper = new LambdaQueryWrapper<>();
         wrapper.like(StringUtils.isNotBlank(dto.getEventNo()), DisEvent::getEventNo, dto.getEventNo());
         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.getEventLevel()), DisEvent::getEventLevel, dto.getEventLevel());
         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.getDepartment()), DisEvent::getDepartment, dto.getDepartment());
         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())) {
             try {
-                wrapper.ge(DisEvent::getReportTime, LocalDate.parse(dto.getStartDate()).atStartOfDay());
+                wrapper.ge(DisEvent::getCreateTime, LocalDate.parse(dto.getStartDate()).atStartOfDay());
             } catch (Exception e) {
                 log.warn("接报开始日期格式错误: {}", dto.getStartDate());
             }
         }
         if (StringUtils.isNotBlank(dto.getEndDate())) {
             try {
-                wrapper.lt(DisEvent::getReportTime,
+                wrapper.lt(DisEvent::getCreateTime,
                         LocalDate.parse(dto.getEndDate()).plusDays(1).atStartOfDay());
             } catch (Exception e) {
                 log.warn("接报结束日期格式错误: {}", dto.getEndDate());
             }
         }
-        applyLossRange(wrapper, dto.getLossRange());
         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,补齐状态名称、可编辑标记与已过时长。
      * 接报人 / 核验人 / 责任处置人:库里以「用户ID + 名称快照」双存,
@@ -796,15 +745,13 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
     private DisEventVO toVO(DisEvent event, Map<Long, String> userNames) {
         DisEventVO vo = new DisEventVO();
         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.setHandler(resolveUserName(userNames, event.getHandlerId(), event.getHandler()));
         vo.setStatusName(EventStatusEnum.getDescByCode(event.getStatus()));
         vo.setEditable(EventStatusEnum.canEdit(event.getStatus()));
-        vo.setElapsed(formatElapsed(event.getReportTime()));
+        vo.setElapsed(formatElapsed(event.getCreateTime()));
         return vo;
     }
 
@@ -815,7 +762,7 @@ public class DisEventServiceImpl extends ServiceImpl<DisEventMapper, DisEvent>
     private Map<Long, String> loadUserNames(List<DisEvent> events) {
         List<Long> ids = new ArrayList<>();
         for (DisEvent event : events) {
-            addUserId(ids, event.getReporterId());
+            addUserId(ids, event.getCreateUserId());
             addUserId(ids, event.getVerifierId());
             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>
         implements DisPlanLibraryService {
 
-    /** 加权评分:事件类型40 / 事件级别25 / 发生区域20 / 责任单位15 */
+    /** 加权评分:预案类型40 / 预案等级25 / 责任单位35 */
     private static final int SCORE_TYPE = 40;
     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;
 
@@ -60,9 +57,6 @@ public class DisPlanLibraryServiceImpl extends ServiceImpl<DisPlanLibraryMapper,
             if (StringUtils.isNotEmpty(dto.getEventLevel()) && dto.getEventLevel().equals(plan.getEventLevel())) {
                 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())) {
                 score += SCORE_UNIT;
             }
@@ -75,26 +69,13 @@ public class DisPlanLibraryServiceImpl extends ServiceImpl<DisPlanLibraryMapper,
         if (!results.isEmpty()) {
             PlanMatchResultVO top = results.get(0);
             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);
         }
         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
     public List<DisPlanMatchRecord> getHistory(int limit) {
         LambdaQueryWrapper<DisPlanMatchRecord> wrapper = new LambdaQueryWrapper<>();
@@ -119,15 +100,14 @@ public class DisPlanLibraryServiceImpl extends ServiceImpl<DisPlanLibraryMapper,
                 update.setCreateUserId(DispatchUserSupport.currentUserId());
                 update.setCreateTime(LocalDateTime.now());
                 matchRecordMapper.updateById(update);
-                log.info("预案匹配记录已更新: 条件={}/{}/{}/{}",
-                        dto.getEventType(), dto.getEventRegion(), dto.getEventLevel(), dto.getResponsibleUnit());
+                log.info("预案匹配记录已更新: 条件={}/{}/{}",
+                        dto.getEventType(), dto.getEventLevel(), dto.getResponsibleUnit());
                 return;
             }
 
             DisPlanMatchRecord record = new DisPlanMatchRecord();
             record.setEventType(dto.getEventType());
             record.setEventLevel(dto.getEventLevel());
-            record.setEventRegion(dto.getEventRegion());
             record.setResponsibleUnit(dto.getResponsibleUnit());
             record.setMatchType(matchType);
             record.setPlanId(planId);
@@ -152,7 +132,6 @@ public class DisPlanLibraryServiceImpl extends ServiceImpl<DisPlanLibraryMapper,
         wrapper.eq(DisPlanMatchRecord::getMatchType, "manual");
         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.getEventRegion()), DisPlanMatchRecord::getEventRegion, dto.getEventRegion());
         wrapper.eq(StringUtils.isNotEmpty(dto.getResponsibleUnit()), DisPlanMatchRecord::getResponsibleUnit, dto.getResponsibleUnit());
         wrapper.last("LIMIT 1");
         return matchRecordMapper.selectOne(wrapper);
@@ -183,10 +162,7 @@ public class DisPlanLibraryServiceImpl extends ServiceImpl<DisPlanLibraryMapper,
         vo.setPlanName(plan.getPlanName());
         vo.setEventType(plan.getEventType());
         vo.setEventLevel(plan.getEventLevel());
-        vo.setEventRegion(plan.getEventRegion());
         vo.setResponsibleUnit(plan.getResponsibleUnit());
-        vo.setTopic(plan.getTopic());
-        vo.setPlanSummary(plan.getPlanSummary());
         vo.setPlanContent(plan.getPlanContent());
         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.DisPlanService;
 import com.zksy.dispatch.service.DisPlanVersionService;
-import com.zksy.dispatch.support.DispatchAttachUrlSupport;
 import com.zksy.dispatch.support.DispatchNumberSupport;
 import com.zksy.dispatch.support.DispatchUserSupport;
 import lombok.extern.slf4j.Slf4j;
@@ -66,10 +65,6 @@ public class DisPlanServiceImpl extends ServiceImpl<DisPlanMapper, DisPlan>
     @Autowired
     private DisPlanVersionService versionService;
 
-    /** 附件地址支撑:库内相对路径 ↔ 展示完整 URL(MinIO 配置拼接) */
-    @Autowired
-    private DispatchAttachUrlSupport attachUrlSupport;
-
     @Autowired
     private DisPlanLogService planLogService;
 
@@ -120,11 +115,7 @@ public class DisPlanServiceImpl extends ServiceImpl<DisPlanMapper, DisPlan>
         for (DisPlanVersion version : versionService.list(vw)) {
             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;
     }
 
@@ -134,7 +125,6 @@ public class DisPlanServiceImpl extends ServiceImpl<DisPlanMapper, DisPlan>
         if (plan == null) {
             throw new ServiceException("预案不存在:" + id);
         }
-        plan.setAttachPath(attachUrlSupport.toAccessibleUrl(plan.getAttachPath()));
         fillTransient(plan, versionService.getPendingVersion(id) != null);
         return plan;
     }
@@ -228,8 +218,6 @@ public class DisPlanServiceImpl extends ServiceImpl<DisPlanMapper, DisPlan>
             candidate.setPlanNo(db.getPlanNo());
             candidate.setVersion(nextVersion);
             candidate.setContent(dto.getContent());
-            candidate.setAttachName(dto.getAttachName());
-            candidate.setAttachPath(attachUrlSupport.toRelative(dto.getAttachPath()));
             candidate.setChangeNote(dto.getChangeNote());
             candidate.setEditor(DispatchUserSupport.currentUserName());
             candidate.setEditorId(DispatchUserSupport.currentUserId());
@@ -330,8 +318,6 @@ public class DisPlanServiceImpl extends ServiceImpl<DisPlanMapper, DisPlan>
             version.setPlanNo(db.getPlanNo());
             version.setVersion(targetVersion);
             version.setContent(db.getContent());
-            version.setAttachName(db.getAttachName());
-            version.setAttachPath(attachUrlSupport.toRelative(db.getAttachPath()));
             version.setChangeNote("通过审核并发布");
             version.setEditor(DispatchUserSupport.currentUserName());
             version.setEditorId(DispatchUserSupport.currentUserId());
@@ -401,8 +387,6 @@ public class DisPlanServiceImpl extends ServiceImpl<DisPlanMapper, DisPlan>
         plan.setCompileUnit(dto.getCompileUnit());
         plan.setPublishUnit(dto.getPublishUnit());
         plan.setPublishDate(dto.getPublishDate());
-        plan.setAttachName(dto.getAttachName());
-        plan.setAttachPath(attachUrlSupport.toRelative(dto.getAttachPath()));
         plan.setContent(dto.getContent());
         if (dto.getIsTemplate() != null) {
             plan.setIsTemplate(dto.getIsTemplate());
@@ -457,8 +441,6 @@ public class DisPlanServiceImpl extends ServiceImpl<DisPlanMapper, DisPlan>
     private PlanVersionVO toVersionVO(DisPlanVersion version, Map<Long, String> editorNames) {
         PlanVersionVO vo = new PlanVersionVO();
         BeanUtils.copyProperties(version, vo);
-        // 版本附件快照:库内相对路径 → 拼 MinIO 配置地址
-        vo.setAttachPath(attachUrlSupport.toAccessibleUrl(version.getAttachPath()));
         vo.setVerStatusName(PlanVersionStatusEnum.getDescByCode(version.getVerStatus()));
         String editor = version.getEditorId() == null ? null : editorNames.get(version.getEditorId());
         if (StringUtils.isNotBlank(editor)) {