20260822_add_merchant_service.sql 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. -- ============================================================
  2. -- 我的商户服务
  3. -- 日期: 2026-08-22
  4. -- 说明: 从旧 api 项目迁移直属商户、分润和聚合统计数据模型
  5. -- 本脚本可重复执行,不写入演示业务数据。
  6. -- ============================================================
  7. CREATE TABLE IF NOT EXISTS `sa_merchant` (
  8. `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '商户编号',
  9. `agent_id` BIGINT UNSIGNED NOT NULL COMMENT '直属代理(对应旧 admin_user_dependen.pid)',
  10. `profit_user_id` BIGINT UNSIGNED NULL COMMENT '分润人系统用户编号',
  11. `name` VARCHAR(100) NOT NULL COMMENT '商户名称',
  12. `store_phone` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '商户电话',
  13. `storefront_image` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '门头照',
  14. `industry` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '行业分类',
  15. `region` VARCHAR(150) NOT NULL DEFAULT '' COMMENT '城市区域',
  16. `address` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '详细地址',
  17. `description` TEXT NULL COMMENT '商户介绍',
  18. `products` TEXT NOT NULL COMMENT '运营产品 JSON',
  19. `profit_method` VARCHAR(30) NOT NULL DEFAULT '比例分成' COMMENT '分成方式',
  20. `profit_rate` DECIMAL(5,2) UNSIGNED NOT NULL DEFAULT 0.00 COMMENT '相对分润比例',
  21. `contact` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '联系人',
  22. `phone` VARCHAR(32) NOT NULL COMMENT '商户登录手机号',
  23. `password` VARCHAR(255) NOT NULL COMMENT '商户登录密码哈希',
  24. `permissions` TEXT NOT NULL COMMENT '商户权限 JSON',
  25. `distributed` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否铺货:0否,1是',
  26. `status` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态:1启用,2停用',
  27. `agent_type` VARCHAR(32) NOT NULL DEFAULT 'agent' COMMENT '直属代理类型',
  28. `total_amount` DECIMAL(14,2) NOT NULL DEFAULT 0.00 COMMENT '总交易额快照',
  29. `total_income` DECIMAL(14,2) NOT NULL DEFAULT 0.00 COMMENT '总收益快照',
  30. `withdrawable_amount` DECIMAL(14,2) NOT NULL DEFAULT 0.00 COMMENT '可提现金额快照',
  31. `order_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '订单量快照',
  32. `device_count` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '设备数快照',
  33. `yesterday_usage_rate` DECIMAL(7,2) NOT NULL DEFAULT 0.00 COMMENT '昨日使用率',
  34. `three_day_usage_rate` DECIMAL(7,2) NOT NULL DEFAULT 0.00 COMMENT '近三天使用率',
  35. `seven_day_usage_rate` DECIMAL(7,2) NOT NULL DEFAULT 0.00 COMMENT '近七天使用率',
  36. `yesterday_average_order` DECIMAL(14,2) NOT NULL DEFAULT 0.00 COMMENT '昨日客单价',
  37. `three_day_average_order` DECIMAL(14,2) NOT NULL DEFAULT 0.00 COMMENT '近三天客单价',
  38. `seven_day_average_order` DECIMAL(14,2) NOT NULL DEFAULT 0.00 COMMENT '近七天客单价',
  39. `created_by` BIGINT UNSIGNED NULL COMMENT '创建者',
  40. `updated_by` BIGINT UNSIGNED NULL COMMENT '更新者',
  41. `create_time` DATETIME NULL COMMENT '创建时间',
  42. `update_time` DATETIME NULL COMMENT '更新时间',
  43. `delete_time` DATETIME NULL COMMENT '软删除时间',
  44. PRIMARY KEY (`id`),
  45. UNIQUE KEY `uk_merchant_phone_active` (`phone`, `delete_time`),
  46. KEY `idx_merchant_agent_status` (`agent_id`, `status`, `delete_time`),
  47. KEY `idx_merchant_profit_user` (`profit_user_id`),
  48. KEY `idx_merchant_name` (`name`)
  49. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='商户信息';
  50. UPDATE `sa_system_menu`
  51. SET `remark` = CASE `code`
  52. WHEN 'MyMerchant' THEN '当前代理直属商户列表'
  53. WHEN 'SubordinateMerchant' THEN '下级代理直属商户列表'
  54. WHEN 'AddMerchant' THEN '创建直属商户'
  55. END,
  56. `update_time` = NOW()
  57. WHERE `code` IN ('MyMerchant', 'SubordinateMerchant', 'AddMerchant')
  58. AND `delete_time` IS NULL;
  59. -- 接口权限统一挂在商户管理目录下。
  60. INSERT INTO `sa_system_menu` (
  61. `parent_id`, `name`, `code`, `slug`, `type`, `path`, `component`, `method`, `icon`, `sort`,
  62. `link_url`, `is_iframe`, `is_keep_alive`, `is_hidden`, `is_fixed_tab`, `is_full_page`,
  63. `generate_id`, `generate_key`, `status`, `remark`, `created_by`, `updated_by`, `create_time`, `update_time`, `delete_time`
  64. )
  65. SELECT parent_menu.`id`, permission_data.`name`, permission_data.`code`, permission_data.`slug`, 3,
  66. NULL, NULL, permission_data.`method`, NULL, permission_data.`sort`, NULL, 2, 2, 2, 2, 2,
  67. 0, NULL, 1, permission_data.`remark`, 1, 1, NOW(), NOW(), NULL
  68. FROM `sa_system_menu` parent_menu
  69. INNER JOIN (
  70. SELECT '商户列表' AS `name`, 'MerchantIndex' AS `code`, 'core:merchant:index' AS `slug`, 'GET' AS `method`, 100 AS `sort`, '按登录代理隔离商户数据' AS `remark`
  71. UNION ALL SELECT '商户详情', 'MerchantRead', 'core:merchant:read', 'GET', 90, '读取有权访问的商户'
  72. UNION ALL SELECT '导出商户', 'MerchantExport', 'core:merchant:export', 'POST', 85, '按当前筛选条件导出有权访问的商户'
  73. UNION ALL SELECT '新增商户', 'MerchantSave', 'core:merchant:save', 'POST', 80, '创建直属商户'
  74. UNION ALL SELECT '编辑商户', 'MerchantUpdate', 'core:merchant:update', 'PUT', 70, '编辑有权访问的商户'
  75. UNION ALL SELECT '删除商户', 'MerchantDestroy', 'core:merchant:destroy', 'DELETE', 60, '软删除有权访问的商户'
  76. UNION ALL SELECT '重置商户密码', 'MerchantPassword', 'core:merchant:password', 'POST', 50, '重置商户登录密码'
  77. ) permission_data
  78. LEFT JOIN `sa_system_menu` existing_menu
  79. ON existing_menu.`slug` = permission_data.`slug`
  80. AND existing_menu.`delete_time` IS NULL
  81. WHERE parent_menu.`code` = 'Merchant'
  82. AND parent_menu.`delete_time` IS NULL
  83. AND existing_menu.`id` IS NULL;
  84. -- 已拥有相应页面的角色自动获得接口权限。
  85. INSERT INTO `sa_system_role_menu` (`role_id`, `menu_id`)
  86. SELECT DISTINCT source_role.`role_id`, permission_menu.`id`
  87. FROM `sa_system_role_menu` source_role
  88. INNER JOIN `sa_system_menu` source_menu
  89. ON source_menu.`id` = source_role.`menu_id`
  90. AND source_menu.`code` IN ('MyMerchant', 'SubordinateMerchant', 'AddMerchant')
  91. AND source_menu.`delete_time` IS NULL
  92. INNER JOIN `sa_system_menu` merchant_menu
  93. ON merchant_menu.`code` = 'Merchant'
  94. AND merchant_menu.`delete_time` IS NULL
  95. INNER JOIN `sa_system_menu` permission_menu
  96. ON permission_menu.`parent_id` = merchant_menu.`id`
  97. AND permission_menu.`type` = 3
  98. AND permission_menu.`delete_time` IS NULL
  99. AND (
  100. permission_menu.`slug` IN ('core:merchant:index', 'core:merchant:read')
  101. OR (source_menu.`code` = 'AddMerchant' AND permission_menu.`slug` = 'core:merchant:save')
  102. OR (source_menu.`code` IN ('MyMerchant', 'SubordinateMerchant') AND permission_menu.`slug` IN ('core:merchant:export', 'core:merchant:update', 'core:merchant:destroy', 'core:merchant:password'))
  103. )
  104. LEFT JOIN `sa_system_role_menu` existing_role
  105. ON existing_role.`role_id` = source_role.`role_id`
  106. AND existing_role.`menu_id` = permission_menu.`id`
  107. WHERE existing_role.`id` IS NULL;