risk_supervision.sql 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. -- ============================================================
  2. -- 监督抽检 / 平台客诉 模块 - 数据库升级脚本(幂等)
  3. -- 适用: MySQL 5.7+ / 8.0
  4. -- 表: 5 张(抽检单 / 案件主表 / 案件节点 / 客诉主表 / 客诉节点)
  5. -- 字典: 6 个(inspection_result / inspection_status / risk_level /
  6. -- complaint_source / case_status / complaint_status)
  7. -- 说明: 使用 INFORMATION_SCHEMA 兼容低版本 MySQL,所有 IF NOT EXISTS
  8. -- 风格的 DDL,支持重复执行不报错
  9. -- ============================================================
  10. SET NAMES utf8mb4;
  11. SET FOREIGN_KEY_CHECKS = 0;
  12. -- ============================================================
  13. -- 1. 字典(6 个)
  14. -- ============================================================
  15. -- 1.1 抽检结果
  16. INSERT INTO sys_dict_type (dict_name, dict_type, status, remark, create_by, create_time, update_by, update_time)
  17. SELECT '抽检结果', 'risk_supervision_inspection_result', '0', '门店抽检结果(合格/不合格)', 'admin', NOW(), 'admin', NOW()
  18. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'risk_supervision_inspection_result');
  19. INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, remark, create_by, create_time, update_by, update_time)
  20. SELECT 1, '抽检合格', '抽检合格', 'risk_supervision_inspection_result', '', 'success', 'Y', '0', '', 'admin', NOW(), 'admin', NOW()
  21. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'risk_supervision_inspection_result' AND dict_value = '抽检合格');
  22. INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, remark, create_by, create_time, update_by, update_time)
  23. SELECT 2, '抽检不合格', '抽检不合格', 'risk_supervision_inspection_result', '', 'danger', 'N', '0', '', 'admin', NOW(), 'admin', NOW()
  24. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'risk_supervision_inspection_result' AND dict_value = '抽检不合格');
  25. -- 1.2 抽检审核状态
  26. INSERT INTO sys_dict_type (dict_name, dict_type, status, remark, create_by, create_time, update_by, update_time)
  27. SELECT '抽检审核状态', 'risk_supervision_inspection_status', '0', '门店抽检单审核状态', 'admin', NOW(), 'admin', NOW()
  28. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'risk_supervision_inspection_status');
  29. INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, remark, create_by, create_time, update_by, update_time)
  30. SELECT 1, '待审核', '待审核', 'risk_supervision_inspection_status', '', 'warning', 'Y', '0', '', 'admin', NOW(), 'admin', NOW()
  31. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'risk_supervision_inspection_status' AND dict_value = '待审核');
  32. INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, remark, create_by, create_time, update_by, update_time)
  33. SELECT 2, '已审核', '已审核', 'risk_supervision_inspection_status', '', 'success', 'N', '0', '', 'admin', NOW(), 'admin', NOW()
  34. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'risk_supervision_inspection_status' AND dict_value = '已审核');
  35. -- 1.3 风险等级
  36. INSERT INTO sys_dict_type (dict_name, dict_type, status, remark, create_by, create_time, update_by, update_time)
  37. SELECT '风险等级', 'risk_supervision_risk_level', '0', '案件风险等级', 'admin', NOW(), 'admin', NOW()
  38. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'risk_supervision_risk_level');
  39. INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, remark, create_by, create_time, update_by, update_time)
  40. SELECT 1, '高风险', '高风险', 'risk_supervision_risk_level', '', 'danger', 'N', '0', '', 'admin', NOW(), 'admin', NOW()
  41. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'risk_supervision_risk_level' AND dict_value = '高风险');
  42. INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, remark, create_by, create_time, update_by, update_time)
  43. SELECT 2, '中风险', '中风险', 'risk_supervision_risk_level', '', 'warning', 'N', '0', '', 'admin', NOW(), 'admin', NOW()
  44. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'risk_supervision_risk_level' AND dict_value = '中风险');
  45. INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, remark, create_by, create_time, update_by, update_time)
  46. SELECT 3, '低风险', '低风险', 'risk_supervision_risk_level', '', 'info', 'N', '0', '', 'admin', NOW(), 'admin', NOW()
  47. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'risk_supervision_risk_level' AND dict_value = '低风险');
  48. -- 1.4 客诉来源
  49. INSERT INTO sys_dict_type (dict_name, dict_type, status, remark, create_by, create_time, update_by, update_time)
  50. SELECT '客诉来源', 'risk_supervision_complaint_source', '0', '平台客诉来源', 'admin', NOW(), 'admin', NOW()
  51. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'risk_supervision_complaint_source');
  52. INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, remark, create_by, create_time, update_by, update_time)
  53. SELECT 1, '消费者投诉', '消费者投诉', 'risk_supervision_complaint_source', '', 'primary', 'Y', '0', '', 'admin', NOW(), 'admin', NOW()
  54. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'risk_supervision_complaint_source' AND dict_value = '消费者投诉');
  55. INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, remark, create_by, create_time, update_by, update_time)
  56. SELECT 2, '媒体舆情', '媒体舆情', 'risk_supervision_complaint_source', '', 'warning', 'N', '0', '', 'admin', NOW(), 'admin', NOW()
  57. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'risk_supervision_complaint_source' AND dict_value = '媒体舆情');
  58. INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, remark, create_by, create_time, update_by, update_time)
  59. SELECT 3, '12315平台', '12315平台', 'risk_supervision_complaint_source', '', 'danger', 'N', '0', '', 'admin', NOW(), 'admin', NOW()
  60. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'risk_supervision_complaint_source' AND dict_value = '12315平台');
  61. INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, remark, create_by, create_time, update_by, update_time)
  62. SELECT 4, '其他来源', '其他来源', 'risk_supervision_complaint_source', '', 'info', 'N', '0', '', 'admin', NOW(), 'admin', NOW()
  63. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'risk_supervision_complaint_source' AND dict_value = '其他来源');
  64. -- 1.5 案件状态
  65. INSERT INTO sys_dict_type (dict_name, dict_type, status, remark, create_by, create_time, update_by, update_time)
  66. SELECT '案件状态', 'risk_supervision_case_status', '0', '不合格案件处理状态', 'admin', NOW(), 'admin', NOW()
  67. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'risk_supervision_case_status');
  68. INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, remark, create_by, create_time, update_by, update_time)
  69. SELECT 1, '处置中', '处置中', 'risk_supervision_case_status', '', 'warning', 'Y', '0', '', 'admin', NOW(), 'admin', NOW()
  70. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'risk_supervision_case_status' AND dict_value = '处置中');
  71. INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, remark, create_by, create_time, update_by, update_time)
  72. SELECT 2, '已闭环', '已闭环', 'risk_supervision_case_status', '', 'success', 'N', '0', '', 'admin', NOW(), 'admin', NOW()
  73. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'risk_supervision_case_status' AND dict_value = '已闭环');
  74. -- 1.6 客诉状态
  75. INSERT INTO sys_dict_type (dict_name, dict_type, status, remark, create_by, create_time, update_by, update_time)
  76. SELECT '客诉状态', 'risk_supervision_complaint_status', '0', '平台客诉处理状态', 'admin', NOW(), 'admin', NOW()
  77. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'risk_supervision_complaint_status');
  78. INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, remark, create_by, create_time, update_by, update_time)
  79. SELECT 1, '处置中', '处置中', 'risk_supervision_complaint_status', '', 'warning', 'Y', '0', '', 'admin', NOW(), 'admin', NOW()
  80. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'risk_supervision_complaint_status' AND dict_value = '处置中');
  81. INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, remark, create_by, create_time, update_by, update_time)
  82. SELECT 2, '已闭环', '已闭环', 'risk_supervision_complaint_status', '', 'success', 'N', '0', '', 'admin', NOW(), 'admin', NOW()
  83. WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'risk_supervision_complaint_status' AND dict_value = '已闭环');
  84. -- ============================================================
  85. -- 2. 业务表(5 张)
  86. -- ============================================================
  87. -- 2.1 门店抽检单
  88. CREATE TABLE IF NOT EXISTS `risk_supervision_inspection` (
  89. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  90. `inspection_code` VARCHAR(50) NOT NULL COMMENT '抽检单号 JC+yyyyMMdd+4位序号',
  91. `store_id` BIGINT DEFAULT NULL COMMENT '门店ID',
  92. `store_name` VARCHAR(200) DEFAULT NULL COMMENT '门店名称',
  93. `inspection_time` DATETIME DEFAULT NULL COMMENT '抽检时间',
  94. `product_name` VARCHAR(200) DEFAULT NULL COMMENT '抽检商品',
  95. `inspection_result` VARCHAR(20) DEFAULT NULL COMMENT '抽检结果(字典:抽检合格/抽检不合格)',
  96. `fail_reason` VARCHAR(1000) DEFAULT NULL COMMENT '不合格原因',
  97. `status` VARCHAR(20) DEFAULT '待审核' COMMENT '状态(字典:待审核/已审核)',
  98. `inspector_id` BIGINT DEFAULT NULL COMMENT '抽检人ID',
  99. `inspector_name` VARCHAR(50) DEFAULT NULL COMMENT '抽检人姓名',
  100. `remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
  101. `tenant_id` VARCHAR(20) DEFAULT '000000' COMMENT '租户ID',
  102. `create_dept` BIGINT DEFAULT NULL COMMENT '创建部门',
  103. `create_by` BIGINT DEFAULT NULL COMMENT '创建人',
  104. `create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
  105. `update_by` BIGINT DEFAULT NULL COMMENT '更新人',
  106. `update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
  107. `del_flag` CHAR(1) DEFAULT '0' COMMENT '删除标志(0正常 1删除)',
  108. PRIMARY KEY (`id`),
  109. UNIQUE KEY `uk_inspection_code` (`inspection_code`),
  110. KEY `idx_inspection_time` (`inspection_time`),
  111. KEY `idx_status_result` (`status`, `inspection_result`),
  112. KEY `idx_store_id` (`store_id`)
  113. ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='监督抽检 - 门店抽检单';
  114. -- 2.2 不合格案件主表
  115. CREATE TABLE IF NOT EXISTS `risk_supervision_case` (
  116. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  117. `case_code` VARCHAR(50) NOT NULL COMMENT '案件编号 AJ+yyyyMMdd+4位序号',
  118. `inspection_id` BIGINT DEFAULT NULL COMMENT '关联抽检单ID',
  119. `inspection_code` VARCHAR(50) DEFAULT NULL COMMENT '冗余抽检单号',
  120. `store_id` BIGINT DEFAULT NULL COMMENT '涉事门店ID',
  121. `store_name` VARCHAR(200) DEFAULT NULL COMMENT '涉事门店',
  122. `product_name` VARCHAR(200) DEFAULT NULL COMMENT '不合格产品',
  123. `current_node` INT DEFAULT 1 COMMENT '当前节点(1-5)',
  124. `node_name` VARCHAR(50) DEFAULT NULL COMMENT '当前节点名称(冗余)',
  125. `risk_level` VARCHAR(20) DEFAULT NULL COMMENT '风险等级(字典:高/中/低风险)',
  126. `risk_desc` VARCHAR(2000) DEFAULT NULL COMMENT '风险描述',
  127. `control_measures` VARCHAR(2000) DEFAULT NULL COMMENT '控制措施',
  128. `handler_id` BIGINT DEFAULT NULL COMMENT '处理人ID',
  129. `handler_name` VARCHAR(50) DEFAULT NULL COMMENT '处理人',
  130. `status` VARCHAR(20) DEFAULT '处置中' COMMENT '状态(字典:处置中/已闭环)',
  131. `remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
  132. `tenant_id` VARCHAR(20) DEFAULT '000000' COMMENT '租户ID',
  133. `create_dept` BIGINT DEFAULT NULL COMMENT '创建部门',
  134. `create_by` BIGINT DEFAULT NULL COMMENT '创建人',
  135. `create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
  136. `update_by` BIGINT DEFAULT NULL COMMENT '更新人',
  137. `update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
  138. PRIMARY KEY (`id`),
  139. UNIQUE KEY `uk_case_code` (`case_code`),
  140. KEY `idx_inspection_id` (`inspection_id`),
  141. KEY `idx_status_node` (`status`, `current_node`),
  142. KEY `idx_store_id` (`store_id`)
  143. ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='监督抽检 - 不合格案件主表';
  144. -- 2.3 案件节点处理记录
  145. CREATE TABLE IF NOT EXISTS `risk_supervision_case_node` (
  146. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  147. `case_id` BIGINT NOT NULL COMMENT '案件ID',
  148. `node_code` INT NOT NULL COMMENT '节点编号 1-5',
  149. `node_name` VARCHAR(50) DEFAULT NULL COMMENT '节点名称',
  150. `opinion` VARCHAR(2000) DEFAULT NULL COMMENT '当前节点处理意见',
  151. `attachment_url` VARCHAR(500) DEFAULT NULL COMMENT '凭证附件URL(MinIO)',
  152. `attachment_name` VARCHAR(200) DEFAULT NULL COMMENT '凭证附件原始文件名',
  153. `handler_id` BIGINT DEFAULT NULL COMMENT '处理人ID',
  154. `handler_name` VARCHAR(50) DEFAULT NULL COMMENT '处理人',
  155. `handle_time` DATETIME DEFAULT NULL COMMENT '处理时间',
  156. `tenant_id` VARCHAR(20) DEFAULT '000000' COMMENT '租户ID',
  157. `create_dept` BIGINT DEFAULT NULL COMMENT '创建部门',
  158. `create_by` BIGINT DEFAULT NULL COMMENT '创建人',
  159. `create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
  160. PRIMARY KEY (`id`),
  161. KEY `idx_case_id_node` (`case_id`, `node_code`)
  162. ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='监督抽检 - 案件节点处理记录';
  163. -- 2.4 平台客诉主表
  164. CREATE TABLE IF NOT EXISTS `risk_supervision_complaint` (
  165. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  166. `complaint_code` VARCHAR(50) NOT NULL COMMENT '客诉编号 TS+yyyyMMdd+4位序号',
  167. `source` VARCHAR(50) DEFAULT NULL COMMENT '客诉来源(字典)',
  168. `complainant_name` VARCHAR(50) DEFAULT NULL COMMENT '投诉人姓名',
  169. `complainant_phone` VARCHAR(20) DEFAULT NULL COMMENT '投诉人电话',
  170. `store_id` BIGINT DEFAULT NULL COMMENT '涉事门店ID',
  171. `store_name` VARCHAR(200) DEFAULT NULL COMMENT '涉事门店',
  172. `transfer_time` DATETIME DEFAULT NULL COMMENT '移交时间',
  173. `complaint_content` TEXT COMMENT '客诉内容',
  174. `attachment_url` VARCHAR(500) DEFAULT NULL COMMENT '附件URL(MinIO)',
  175. `attachment_name` VARCHAR(200) DEFAULT NULL COMMENT '附件原始文件名',
  176. `current_node` INT DEFAULT 1 COMMENT '当前节点(1-7)',
  177. `node_name` VARCHAR(50) DEFAULT NULL COMMENT '当前节点名称',
  178. `status` VARCHAR(20) DEFAULT '处置中' COMMENT '状态(字典:处置中/已闭环)',
  179. `remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
  180. `tenant_id` VARCHAR(20) DEFAULT '000000' COMMENT '租户ID',
  181. `create_dept` BIGINT DEFAULT NULL COMMENT '创建部门',
  182. `create_by` BIGINT DEFAULT NULL COMMENT '创建人',
  183. `create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
  184. `update_by` BIGINT DEFAULT NULL COMMENT '更新人',
  185. `update_time` DATETIME DEFAULT NULL COMMENT '更新时间',
  186. PRIMARY KEY (`id`),
  187. UNIQUE KEY `uk_complaint_code` (`complaint_code`),
  188. KEY `idx_status_node` (`status`, `current_node`),
  189. KEY `idx_transfer_time` (`transfer_time`),
  190. KEY `idx_store_id` (`store_id`)
  191. ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='监督抽检 - 平台客诉主表';
  192. -- 2.5 客诉节点处理记录
  193. CREATE TABLE IF NOT EXISTS `risk_supervision_complaint_node` (
  194. `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  195. `complaint_id` BIGINT NOT NULL COMMENT '客诉ID',
  196. `node_code` INT NOT NULL COMMENT '节点编号 1-7',
  197. `node_name` VARCHAR(50) DEFAULT NULL COMMENT '节点名称',
  198. `opinion` VARCHAR(2000) DEFAULT NULL COMMENT '当前环节处理意见',
  199. `attachment_url` VARCHAR(500) DEFAULT NULL COMMENT '凭证附件URL(MinIO)',
  200. `attachment_name` VARCHAR(200) DEFAULT NULL COMMENT '凭证附件原始文件名',
  201. `handler_id` BIGINT DEFAULT NULL COMMENT '处理人ID',
  202. `handler_name` VARCHAR(50) DEFAULT NULL COMMENT '处理人',
  203. `handle_time` DATETIME DEFAULT NULL COMMENT '处理时间',
  204. `tenant_id` VARCHAR(20) DEFAULT '000000' COMMENT '租户ID',
  205. `create_dept` BIGINT DEFAULT NULL COMMENT '创建部门',
  206. `create_by` BIGINT DEFAULT NULL COMMENT '创建人',
  207. `create_time` DATETIME DEFAULT NULL COMMENT '创建时间',
  208. PRIMARY KEY (`id`),
  209. KEY `idx_complaint_id_node` (`complaint_id`, `node_code`)
  210. ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='监督抽检 - 客诉节点处理记录';
  211. SET FOREIGN_KEY_CHECKS = 1;
  212. -- ============================================================
  213. -- 完成 - 监督抽检 / 平台客诉 模块升级
  214. -- ============================================================