20260902_add_user_complaint_feedback.sql 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. -- 用户管理:微信支付投诉与用户反馈。可重复执行。
  2. SET NAMES utf8mb4;
  3. CREATE TABLE IF NOT EXISTS `sa_user_feedback` (
  4. `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '反馈ID',
  5. `agent_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '归属管理代理ID',
  6. `user_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '租借用户ID',
  7. `identity` VARCHAR(32) NOT NULL DEFAULT '用户' COMMENT '提交人身份快照',
  8. `type` TINYINT UNSIGNED NOT NULL DEFAULT 3 COMMENT '类型:1订单问题 2系统问题 3其他问题',
  9. `order_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联订单ID',
  10. `merchant_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联商户ID',
  11. `merchant_name` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '商户名称快照',
  12. `device_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联设备ID',
  13. `device_sn` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '设备SN快照',
  14. `device_type` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '设备类型快照',
  15. `nickname` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '用户昵称快照',
  16. `contact_phone` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '联系电话',
  17. `content` TEXT NOT NULL COMMENT '反馈内容',
  18. `images` JSON NULL COMMENT '反馈截图URL数组',
  19. `status` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '状态:0未处理 1处理中 2已处理',
  20. `remark` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '后台处理备注',
  21. `handled_by` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '最后处理管理员ID',
  22. `handled_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '最后处理管理员名',
  23. `handled_at` DATETIME NULL COMMENT '处理完成时间',
  24. `created_by` BIGINT UNSIGNED NULL COMMENT '创建者',
  25. `updated_by` BIGINT UNSIGNED NULL COMMENT '更新者',
  26. `create_time` DATETIME NOT NULL COMMENT '反馈时间',
  27. `update_time` DATETIME NULL COMMENT '更新时间',
  28. `delete_time` DATETIME NULL COMMENT '删除时间',
  29. PRIMARY KEY (`id`),
  30. KEY `idx_feedback_agent_status_time` (`agent_id`, `status`, `create_time`),
  31. KEY `idx_feedback_user` (`user_id`, `create_time`),
  32. KEY `idx_feedback_order` (`order_id`),
  33. KEY `idx_feedback_device_sn` (`device_sn`),
  34. KEY `idx_feedback_phone` (`contact_phone`)
  35. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户反馈';
  36. CREATE TABLE IF NOT EXISTS `sa_user_feedback_reply` (
  37. `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '回复ID',
  38. `feedback_id` BIGINT UNSIGNED NOT NULL COMMENT '反馈ID',
  39. `author_type` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '作者类型:0管理员 1用户 2代理商',
  40. `author_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '作者ID',
  41. `author_name` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '作者名称快照',
  42. `content` TEXT NOT NULL COMMENT '回复内容',
  43. `images` JSON NULL COMMENT '回复图片URL数组',
  44. `created_by` BIGINT UNSIGNED NULL COMMENT '创建者',
  45. `updated_by` BIGINT UNSIGNED NULL COMMENT '更新者',
  46. `create_time` DATETIME NOT NULL COMMENT '回复时间',
  47. `update_time` DATETIME NULL COMMENT '更新时间',
  48. `delete_time` DATETIME NULL COMMENT '删除时间',
  49. PRIMARY KEY (`id`),
  50. KEY `idx_feedback_reply_feedback` (`feedback_id`, `id`),
  51. KEY `idx_feedback_reply_author` (`author_type`, `author_id`)
  52. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户反馈回复';
  53. -- 页面菜单本身承载列表接口权限。
  54. UPDATE `sa_system_menu`
  55. SET `slug` = 'core:user:complaint:index', `method` = 'GET',
  56. `remark` = '实时查询微信支付商户投诉', `update_time` = NOW()
  57. WHERE `code` = 'UserComplaints' AND `delete_time` IS NULL;
  58. UPDATE `sa_system_menu`
  59. SET `slug` = 'core:user:feedback:index', `method` = 'GET',
  60. `remark` = '查询、回复和处理用户反馈', `update_time` = NOW()
  61. WHERE `code` = 'UserFeedback' AND `delete_time` IS NULL;
  62. -- 投诉子权限。
  63. INSERT INTO `sa_system_menu` (`parent_id`,`name`,`code`,`slug`,`type`,`path`,`component`,`method`,`icon`,`sort`,`link_url`,`is_iframe`,`is_keep_alive`,`is_hidden`,`is_fixed_tab`,`is_full_page`,`generate_id`,`generate_key`,`status`,`remark`,`created_by`,`updated_by`,`create_time`,`update_time`,`delete_time`)
  64. SELECT p.id, perms.name, perms.code, perms.slug, 3, NULL, NULL, perms.method, NULL, perms.sort,
  65. NULL,2,2,2,2,2,0,NULL,1,perms.remark,1,1,NOW(),NOW(),NULL
  66. FROM `sa_system_menu` p
  67. CROSS JOIN (
  68. SELECT '投诉支付配置选项' name, 'UserComplaintConfigs' code, 'core:user:complaint:configs' slug, 'GET' method, 100 sort, '读取当前账号可用的微信支付配置' remark
  69. UNION ALL SELECT '用户投诉详情', 'UserComplaintRead', 'core:user:complaint:read', 'GET', 90, '查询微信支付投诉详情'
  70. UNION ALL SELECT '用户投诉协商记录', 'UserComplaintHistory', 'core:user:complaint:history', 'GET', 80, '查询微信支付投诉协商记录'
  71. UNION ALL SELECT '回复用户投诉', 'UserComplaintReply', 'core:user:complaint:reply', 'POST', 70, '通过微信支付商户投诉接口回复用户'
  72. UNION ALL SELECT '完结用户投诉', 'UserComplaintComplete', 'core:user:complaint:complete', 'POST', 60, '通过微信支付商户投诉接口完结投诉'
  73. ) perms
  74. WHERE p.code = 'UserComplaints' AND p.delete_time IS NULL
  75. AND NOT EXISTS (SELECT 1 FROM `sa_system_menu` m WHERE m.slug = perms.slug AND m.delete_time IS NULL);
  76. -- 反馈子权限。
  77. INSERT INTO `sa_system_menu` (`parent_id`,`name`,`code`,`slug`,`type`,`path`,`component`,`method`,`icon`,`sort`,`link_url`,`is_iframe`,`is_keep_alive`,`is_hidden`,`is_fixed_tab`,`is_full_page`,`generate_id`,`generate_key`,`status`,`remark`,`created_by`,`updated_by`,`create_time`,`update_time`,`delete_time`)
  78. SELECT p.id, perms.name, perms.code, perms.slug, 3, NULL, NULL, perms.method, NULL, perms.sort,
  79. NULL,2,2,2,2,2,0,NULL,1,perms.remark,1,1,NOW(),NOW(),NULL
  80. FROM `sa_system_menu` p
  81. CROSS JOIN (
  82. SELECT '用户反馈详情' name, 'UserFeedbackRead' code, 'core:user:feedback:read' slug, 'GET' method, 100 sort, '查询反馈和完整回复记录' remark
  83. UNION ALL SELECT '更新用户反馈状态', 'UserFeedbackUpdate', 'core:user:feedback:update', 'PUT', 90, '更新反馈处理状态和备注'
  84. UNION ALL SELECT '回复用户反馈', 'UserFeedbackReply', 'core:user:feedback:reply', 'POST', 80, '新增后台回复并进入处理流程'
  85. UNION ALL SELECT '导出用户反馈', 'UserFeedbackExport', 'core:user:feedback:export', 'POST', 70, '按当前筛选条件导出反馈'
  86. ) perms
  87. WHERE p.code = 'UserFeedback' AND p.delete_time IS NULL
  88. AND NOT EXISTS (SELECT 1 FROM `sa_system_menu` m WHERE m.slug = perms.slug AND m.delete_time IS NULL);
  89. -- 已有页面权限的角色自动继承对应操作权限。
  90. INSERT INTO `sa_system_role_menu` (`role_id`, `menu_id`)
  91. SELECT DISTINCT source_role.role_id, target.id
  92. FROM `sa_system_role_menu` source_role
  93. INNER JOIN `sa_system_menu` page ON page.id = source_role.menu_id
  94. AND page.code IN ('UserComplaints', 'UserFeedback') AND page.delete_time IS NULL
  95. INNER JOIN `sa_system_menu` target ON target.parent_id = page.id
  96. AND target.type = 3 AND target.delete_time IS NULL
  97. LEFT JOIN `sa_system_role_menu` existing ON existing.role_id = source_role.role_id AND existing.menu_id = target.id
  98. WHERE existing.id IS NULL;