智慧水务管理系统 - 精河县供水工程综合管理平台

V1__production.sql 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. -- =============================================
  2. -- 智慧水务管理系统 - 供水生产 + 巡检 + 报警 DDL
  3. -- 版本: V1
  4. -- =============================================
  5. -- ==================== 报警规则 ====================
  6. CREATE TABLE IF NOT EXISTS alert_rule (
  7. id BIGSERIAL PRIMARY KEY,
  8. rule_name VARCHAR(100) NOT NULL,
  9. device_type VARCHAR(30),
  10. metric_key VARCHAR(50) NOT NULL,
  11. alert_level VARCHAR(10) NOT NULL, -- info/warning/critical/emergency
  12. condition_expr VARCHAR(200) NOT NULL, -- "> 0.5" 或 "ABS_DELTA > 10"
  13. threshold_value DECIMAL(12,4),
  14. debounce_sec INT DEFAULT 300, -- 去重窗口(秒)
  15. notify_scheme_id BIGINT REFERENCES sys_notify_scheme(id),
  16. enabled SMALLINT DEFAULT 1,
  17. created_at TIMESTAMP DEFAULT NOW(),
  18. updated_at TIMESTAMP DEFAULT NOW()
  19. );
  20. COMMENT ON TABLE alert_rule IS '报警规则表';
  21. COMMENT ON COLUMN alert_rule.alert_level IS '报警等级: info/warning/critical/emergency';
  22. CREATE TABLE IF NOT EXISTS alert_event (
  23. id BIGSERIAL PRIMARY KEY,
  24. rule_id BIGINT REFERENCES alert_rule(id),
  25. device_id BIGINT,
  26. device_sn VARCHAR(100) NOT NULL,
  27. device_name VARCHAR(200),
  28. area VARCHAR(50),
  29. metric_key VARCHAR(50) NOT NULL,
  30. metric_value DECIMAL(12,4),
  31. threshold_value VARCHAR(50),
  32. alert_level VARCHAR(10) NOT NULL,
  33. title VARCHAR(200),
  34. message TEXT,
  35. confirmed_by BIGINT,
  36. confirmed_at TIMESTAMP,
  37. dispatched SMALLINT DEFAULT 0, -- 是否已派单
  38. resolved_by BIGINT,
  39. resolved_at TIMESTAMP,
  40. created_at TIMESTAMP DEFAULT NOW()
  41. );
  42. COMMENT ON TABLE alert_event IS '报警事件表';
  43. CREATE INDEX IF NOT EXISTS idx_alert_event_time ON alert_event(created_at DESC);
  44. CREATE INDEX IF NOT EXISTS idx_alert_event_device ON alert_event(device_sn, created_at DESC);
  45. -- ==================== 调度指令 ====================
  46. CREATE TABLE IF NOT EXISTS dispatch_command (
  47. id BIGSERIAL PRIMARY KEY,
  48. command_no VARCHAR(30) UNIQUE NOT NULL,
  49. command_type VARCHAR(30) NOT NULL, -- routine/emergency
  50. command_title VARCHAR(200) NOT NULL,
  51. command_content TEXT NOT NULL,
  52. source VARCHAR(50), -- 来源: 平台/SCADA/上级
  53. issuer_id BIGINT,
  54. issuer_name VARCHAR(50),
  55. target_type VARCHAR(30), -- station/device_area/person
  56. target_ids JSONB, -- 目标站点/设备ID数组
  57. priority VARCHAR(10) DEFAULT 'normal', -- low/normal/high/urgent
  58. status VARCHAR(20) DEFAULT 'draft', -- draft/issued/received/executing/completed/rejected
  59. issued_at TIMESTAMP,
  60. received_at TIMESTAMP,
  61. completed_at TIMESTAMP,
  62. result_remark TEXT,
  63. created_at TIMESTAMP DEFAULT NOW(),
  64. updated_at TIMESTAMP DEFAULT NOW()
  65. );
  66. COMMENT ON TABLE dispatch_command IS '调度指令表';
  67. CREATE TABLE IF NOT EXISTS dispatch_log (
  68. id BIGSERIAL PRIMARY KEY,
  69. command_id BIGINT REFERENCES dispatch_command(id),
  70. action VARCHAR(20) NOT NULL, -- issue/receive/execute/complete/reject
  71. operator_id BIGINT,
  72. operator_name VARCHAR(50),
  73. remark TEXT,
  74. created_at TIMESTAMP DEFAULT NOW()
  75. );
  76. COMMENT ON TABLE dispatch_log IS '调度指令操作日志';
  77. -- ==================== 值班管理 ====================
  78. CREATE TABLE IF NOT EXISTS duty_schedule (
  79. id BIGSERIAL PRIMARY KEY,
  80. schedule_name VARCHAR(100),
  81. dept_id BIGINT REFERENCES sys_dept(id),
  82. station_id BIGINT,
  83. shift_type VARCHAR(20), -- day/night/full
  84. start_time TIME NOT NULL,
  85. end_time TIME NOT NULL,
  86. status SMALLINT DEFAULT 1,
  87. created_at TIMESTAMP DEFAULT NOW()
  88. );
  89. COMMENT ON TABLE duty_schedule IS '值班班次表';
  90. CREATE TABLE IF NOT EXISTS duty_record (
  91. id BIGSERIAL PRIMARY KEY,
  92. schedule_id BIGINT REFERENCES duty_schedule(id),
  93. duty_date DATE NOT NULL,
  94. user_id BIGINT REFERENCES sys_user(id),
  95. shift_type VARCHAR(20),
  96. on_duty_at TIMESTAMP,
  97. off_duty_at TIMESTAMP,
  98. status VARCHAR(20) DEFAULT 'pending', -- pending/on_duty/off_duty
  99. handover_remark TEXT,
  100. created_at TIMESTAMP DEFAULT NOW()
  101. );
  102. COMMENT ON TABLE duty_record IS '值班记录表';
  103. -- ==================== 巡检管理 ====================
  104. CREATE TABLE IF NOT EXISTS patrol_route (
  105. id BIGSERIAL PRIMARY KEY,
  106. route_name VARCHAR(100) NOT NULL,
  107. area VARCHAR(50) NOT NULL,
  108. route_points JSONB, -- [{seq, lng, lat, name, device_ids}]
  109. estim_duration INT, -- 预计时长(分钟)
  110. status SMALLINT DEFAULT 1,
  111. created_at TIMESTAMP DEFAULT NOW(),
  112. updated_at TIMESTAMP DEFAULT NOW()
  113. );
  114. COMMENT ON TABLE patrol_route IS '巡检路线表';
  115. CREATE TABLE IF NOT EXISTS patrol_task (
  116. id BIGSERIAL PRIMARY KEY,
  117. route_id BIGINT REFERENCES patrol_route(id),
  118. assignee_id BIGINT REFERENCES sys_user(id),
  119. task_name VARCHAR(200),
  120. task_date DATE NOT NULL,
  121. plan_start TIMESTAMP,
  122. plan_end TIMESTAMP,
  123. actual_start TIMESTAMP,
  124. actual_end TIMESTAMP,
  125. status VARCHAR(20) DEFAULT 'pending', -- pending/in_progress/completed/expired/cancelled
  126. distance DECIMAL(8,2), -- 实际巡检距离(km)
  127. score INT, -- 评分
  128. created_at TIMESTAMP DEFAULT NOW(),
  129. updated_at TIMESTAMP DEFAULT NOW()
  130. );
  131. COMMENT ON TABLE patrol_task IS '巡检任务表';
  132. CREATE INDEX IF NOT EXISTS idx_patrol_task_date ON patrol_task(task_date);
  133. CREATE TABLE IF NOT EXISTS patrol_record (
  134. id BIGSERIAL PRIMARY KEY,
  135. task_id BIGINT REFERENCES patrol_task(id),
  136. point_seq INT,
  137. device_id BIGINT,
  138. device_name VARCHAR(200),
  139. check_items JSONB, -- [{item, result, value, photo_urls, remark}]
  140. gps_lng DOUBLE PRECISION,
  141. gps_lat DOUBLE PRECISION,
  142. geom GEOMETRY(Point, 4326),
  143. record_time TIMESTAMP,
  144. created_at TIMESTAMP DEFAULT NOW()
  145. );
  146. COMMENT ON TABLE patrol_record IS '巡检记录表';
  147. CREATE INDEX IF NOT EXISTS idx_patrol_record_geom ON patrol_record USING GIST(geom);
  148. -- ==================== 水质检测 ====================
  149. CREATE TABLE IF NOT EXISTS water_quality_record (
  150. id BIGSERIAL PRIMARY KEY,
  151. test_type VARCHAR(20) NOT NULL, -- manual/auto
  152. test_point VARCHAR(100) NOT NULL, -- 检测点位名称
  153. point_type VARCHAR(20), -- source_water/plant_out/pipe_network/terminal
  154. area VARCHAR(50),
  155. station_id BIGINT,
  156. lng DOUBLE PRECISION,
  157. lat DOUBLE PRECISION,
  158. test_date DATE NOT NULL,
  159. test_time TIME,
  160. tester VARCHAR(50),
  161. turbidity DECIMAL(8,2), -- 浊度(NTU)
  162. ph DECIMAL(5,2),
  163. residual_chlorine DECIMAL(8,2), -- 余氯(mg/L)
  164. total_chlorine DECIMAL(8,2),
  165. cod DECIMAL(8,2), -- 化学需氧量(mg/L)
  166. ammonia DECIMAL(8,2), -- 氨氮(mg/L)
  167. total_bacteria INT, -- 总大肠菌群(CFU/100mL)
  168. extra_data JSONB, -- 扩展指标
  169. is_qualified SMALLINT,
  170. created_at TIMESTAMP DEFAULT NOW()
  171. );
  172. COMMENT ON TABLE water_quality_record IS '水质检测记录表';
  173. CREATE INDEX IF NOT EXISTS idx_wq_record_date ON water_quality_record(test_date);
  174. CREATE INDEX IF NOT EXISTS idx_wq_record_area ON water_quality_record(area);
  175. -- =============================================
  176. -- 智慧水务管理系统 - 巡检问题上报 + 工单管理 DDL
  177. -- 版本: V1
  178. -- =============================================
  179. -- 巡检问题上报表
  180. CREATE TABLE IF NOT EXISTS patrol_problem (
  181. id BIGSERIAL PRIMARY KEY,
  182. problem_no VARCHAR(30) UNIQUE NOT NULL, -- 问题编号:WQ-2026-001
  183. task_id BIGINT REFERENCES patrol_task(id),
  184. point_seq INT,
  185. device_id BIGINT,
  186. device_name VARCHAR(200),
  187. problem_type VARCHAR(50) NOT NULL, -- 设备故障/水质异常/安全隐患/环境卫生/其他
  188. problem_level VARCHAR(20) DEFAULT 'normal', -- low/normal/high/critical
  189. problem_title VARCHAR(200) NOT NULL,
  190. problem_description TEXT,
  191. location VARCHAR(300),
  192. lng DOUBLE PRECISION,
  193. lat DOUBLE PRECISION,
  194. photo_urls JSONB, -- 现场照片URL数组
  195. reporter_id BIGINT REFERENCES sys_user(id),
  196. reporter_name VARCHAR(50),
  197. report_time TIMESTAMP DEFAULT NOW(),
  198. status VARCHAR(20) DEFAULT 'reported', -- reported/processing/completed/closed
  199. work_order_id BIGINT, -- 关联工单ID
  200. created_at TIMESTAMP DEFAULT NOW(),
  201. updated_at TIMESTAMP DEFAULT NOW()
  202. );
  203. COMMENT ON TABLE patrol_problem IS '巡检问题上报表';
  204. CREATE INDEX IF NOT EXISTS idx_problem_task ON patrol_problem(task_id);
  205. CREATE INDEX IF NOT EXISTS idx_problem_status ON patrol_problem(status);
  206. CREATE INDEX IF NOT EXISTS idx_problem_device ON patrol_problem(device_id);
  207. CREATE INDEX IF NOT EXISTS idx_problem_type ON patrol_problem(problem_type);
  208. -- 工单表
  209. CREATE TABLE IF NOT EXISTS work_order (
  210. id BIGSERIAL PRIMARY KEY,
  211. order_no VARCHAR(30) UNIQUE NOT NULL, -- 工单编号:WO-2026-001
  212. problem_id BIGINT REFERENCES patrol_problem(id),
  213. order_type VARCHAR(50) NOT NULL, -- 设备维修/水质处理/安全隐患处理/清洁/其他
  214. priority VARCHAR(20) DEFAULT 'normal', -- low/normal/high/critical
  215. title VARCHAR(200) NOT NULL,
  216. description TEXT,
  217. location VARCHAR(300),
  218. contact_person VARCHAR(50),
  219. contact_phone VARCHAR(20),
  220. reporter_id BIGINT REFERENCES sys_user(id),
  221. reporter_name VARCHAR(50),
  222. assignee_id BIGINT REFERENCES sys_user(id),
  223. assignee_name VARCHAR(50),
  224. status VARCHAR(20) DEFAULT 'pending', -- pending/assigned/processing/completed/cancelled
  225. process_status VARCHAR(20) DEFAULT 'created', -- created/accepted/in_progress/completed
  226. estimated_duration INT, -- 预计工时(分钟)
  227. actual_start_time TIMESTAMP,
  228. actual_end_time TIMESTAMP,
  229. completion_time TIMESTAMP,
  230. photos_before JSONB, -- 处理前照片
  231. photos_after JSONB, -- 处理后照片
  232. solution_description TEXT, -- 处理方案描述
  233. solution_result TEXT, -- 处理结果
  234. customer_feedback TEXT, -- 客户反馈
  235. created_at TIMESTAMP DEFAULT NOW(),
  236. updated_at TIMESTAMP DEFAULT NOW()
  237. );
  238. COMMENT ON TABLE work_order IS '工单表';
  239. CREATE INDEX IF NOT EXISTS idx_order_problem ON work_order(problem_id);
  240. CREATE INDEX IF NOT EXISTS idx_order_status ON work_order(status, process_status);
  241. CREATE INDEX IF NOT EXISTS idx_order_assignee ON work_order(assignee_id);
  242. -- 工单处理记录表
  243. CREATE TABLE IF NOT EXISTS work_order_process (
  244. id BIGSERIAL PRIMARY KEY,
  245. work_order_id BIGINT REFERENCES work_order(id),
  246. process_step VARCHAR(50) NOT NULL, -- created/accepted/in_progress/completed
  247. processor_id BIGINT REFERENCES sys_user(id),
  248. processor_name VARCHAR(50),
  249. action VARCHAR(50) NOT NULL, -- create/assign/start/complete/cancel
  250. comment TEXT,
  251. photos JSONB, -- 处理过程照片
  252. created_at TIMESTAMP DEFAULT NOW()
  253. );
  254. COMMENT ON TABLE work_order_process IS '工单处理记录表';
  255. CREATE INDEX IF NOT EXISTS idx_process_order ON work_order_process(work_order_id);
  256. CREATE INDEX IF NOT EXISTS idx_process_step ON work_order_process(process_step);
  257. -- 工单附件表
  258. CREATE TABLE IF NOT EXISTS work_order_attachment (
  259. id BIGSERIAL PRIMARY KEY,
  260. work_order_id BIGINT REFERENCES work_order(id),
  261. file_name VARCHAR(200) NOT NULL,
  262. file_path VARCHAR(500) NOT NULL,
  263. file_type VARCHAR(50), -- image/pdf/doc/other
  264. file_size BIGINT,
  265. uploaded_by BIGINT REFERENCES sys_user(id),
  266. uploaded_at TIMESTAMP DEFAULT NOW()
  267. );
  268. COMMENT ON TABLE work_order_attachment IS '工单附件表';
  269. CREATE INDEX IF NOT EXISTS idx_attachment_order ON work_order_attachment(work_order_id);
  270. -- 巡检问题与工单关联触发记录
  271. CREATE TABLE IF NOT EXISTS patrol_work_order_trigger (
  272. id BIGSERIAL PRIMARY KEY,
  273. patrol_problem_id BIGINT REFERENCES patrol_problem(id),
  274. work_order_id BIGINT REFERENCES work_order(id),
  275. trigger_type VARCHAR(20) NOT NULL, -- auto/manual
  276. trigger_condition JSONB, -- 触发条件
  277. created_at TIMESTAMP DEFAULT NOW()
  278. );
  279. COMMENT ON TABLE patrol_work_order_trigger IS '巡检问题与工单关联触发记录';
  280. CREATE INDEX IF NOT EXISTS idx_trigger_problem ON patrol_work_order_trigger(patrol_problem_id);
  281. CREATE INDEX IF NOT EXISTS idx_trigger_order ON patrol_work_order_trigger(work_order_id);