20260822_add_merchant_device_binding.sql 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. -- ============================================================
  2. -- 商户设备绑定
  3. -- 日期: 2026-08-22
  4. -- 来源: 旧项目 xs_market_goods / xs_market_zuo_rely /
  5. -- xs_market_zuo_rely_record 与 Store::bindZuo2Store
  6. -- 说明: 可重复执行,不写入演示业务数据。
  7. -- ============================================================
  8. CREATE TABLE IF NOT EXISTS `sa_device` (
  9. `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '设备编号',
  10. `legacy_id` BIGINT UNSIGNED NULL COMMENT '旧系统 xs_market_goods.id',
  11. `goods_name` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '设备名称',
  12. `goods_type` SMALLINT UNSIGNED NOT NULL COMMENT '旧系统设备类型',
  13. `goods_sn` VARCHAR(60) NOT NULL COMMENT '设备唯一 SN 码',
  14. `device_code` VARCHAR(60) NOT NULL DEFAULT '' COMMENT '机器码',
  15. `model` VARCHAR(60) NOT NULL DEFAULT '' COMMENT '设备型号',
  16. `status` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0未启用、1运营中、2报修',
  17. `belong_agent_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '设备归属代理',
  18. `manage_agent_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '设备当前管理代理',
  19. `is_locked` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否锁定',
  20. `is_active` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否激活',
  21. `active_time` DATETIME NULL COMMENT '激活时间',
  22. `device_status` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '0掉线、1正常、2维护、3异常',
  23. `created_by` BIGINT UNSIGNED NULL COMMENT '创建者',
  24. `updated_by` BIGINT UNSIGNED NULL COMMENT '更新者',
  25. `create_time` DATETIME NULL COMMENT '创建时间',
  26. `update_time` DATETIME NULL COMMENT '更新时间',
  27. `delete_time` DATETIME NULL COMMENT '软删除时间',
  28. PRIMARY KEY (`id`),
  29. UNIQUE KEY `uk_device_sn` (`goods_sn`),
  30. KEY `idx_device_manager_type` (`manage_agent_id`, `goods_type`, `delete_time`),
  31. KEY `idx_device_status` (`status`, `device_status`)
  32. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='设备台账';
  33. CREATE TABLE IF NOT EXISTS `sa_merchant_device_binding` (
  34. `device_id` BIGINT UNSIGNED NOT NULL COMMENT '设备编号',
  35. `device_sn` VARCHAR(60) NOT NULL COMMENT '设备 SN 快照',
  36. `depend_type` SMALLINT UNSIGNED NOT NULL COMMENT '旧系统 depend_type',
  37. `merchant_id` BIGINT UNSIGNED NOT NULL COMMENT '商户编号',
  38. `status` TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '绑定状态',
  39. `operator_id` BIGINT UNSIGNED NOT NULL COMMENT '铺货操作人',
  40. `bind_time` DATETIME NOT NULL COMMENT '绑定时间',
  41. `create_time` DATETIME NOT NULL COMMENT '创建时间',
  42. `update_time` DATETIME NOT NULL COMMENT '更新时间',
  43. PRIMARY KEY (`device_id`),
  44. UNIQUE KEY `uk_binding_device_sn` (`device_sn`),
  45. KEY `idx_binding_merchant` (`merchant_id`),
  46. KEY `idx_binding_operator` (`operator_id`)
  47. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='设备当前绑定商户关系';
  48. CREATE TABLE IF NOT EXISTS `sa_merchant_device_binding_record` (
  49. `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '流水编号',
  50. `device_id` BIGINT UNSIGNED NOT NULL COMMENT '设备编号',
  51. `device_sn` VARCHAR(60) NOT NULL COMMENT '设备 SN 快照',
  52. `depend_type` SMALLINT UNSIGNED NOT NULL COMMENT '旧系统 depend_type',
  53. `merchant_id` BIGINT UNSIGNED NOT NULL COMMENT '商户编号',
  54. `action_type` TINYINT UNSIGNED NOT NULL COMMENT '1绑定、2解绑',
  55. `operator_id` BIGINT UNSIGNED NOT NULL COMMENT '操作人',
  56. `action_time` DATETIME NOT NULL COMMENT '操作时间',
  57. `created_by` BIGINT UNSIGNED NULL COMMENT '创建者',
  58. `create_time` DATETIME NOT NULL COMMENT '创建时间',
  59. PRIMARY KEY (`id`),
  60. KEY `idx_binding_record_merchant_time` (`merchant_id`, `action_time`),
  61. KEY `idx_binding_record_device_time` (`device_id`, `action_time`),
  62. KEY `idx_binding_record_sn` (`device_sn`)
  63. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='设备绑定解绑流水';
  64. INSERT INTO `sa_system_menu` (
  65. `parent_id`, `name`, `code`, `slug`, `type`, `path`, `component`, `method`, `icon`, `sort`,
  66. `link_url`, `is_iframe`, `is_keep_alive`, `is_hidden`, `is_fixed_tab`, `is_full_page`,
  67. `generate_id`, `generate_key`, `status`, `remark`, `created_by`, `updated_by`, `create_time`, `update_time`, `delete_time`
  68. )
  69. SELECT parent_menu.`id`, permission_data.`name`, permission_data.`code`, permission_data.`slug`, 3,
  70. NULL, NULL, permission_data.`method`, NULL, permission_data.`sort`, NULL, 2, 2, 2, 2, 2,
  71. 0, NULL, 1, permission_data.`remark`, 1, 1, NOW(), NOW(), NULL
  72. FROM `sa_system_menu` parent_menu
  73. INNER JOIN (
  74. SELECT '商户绑定设备列表' AS `name`, 'MerchantDeviceIndex' AS `code`, 'core:merchant:device:index' AS `slug`, 'GET' AS `method`, 48 AS `sort`, '查看商户当前绑定设备' AS `remark`
  75. UNION ALL SELECT '商户绑定设备', 'MerchantDeviceBind', 'core:merchant:device:bind', 'POST', 47, '设备铺货到有权访问的商户'
  76. UNION ALL SELECT '商户解绑设备', 'MerchantDeviceUnbind', 'core:merchant:device:unbind', 'POST', 46, '解除设备和商户关系并保留流水'
  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')
  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.`slug` IN (
  98. 'core:merchant:device:index',
  99. 'core:merchant:device:bind',
  100. 'core:merchant:device:unbind'
  101. )
  102. AND permission_menu.`delete_time` IS NULL
  103. LEFT JOIN `sa_system_role_menu` existing_role
  104. ON existing_role.`role_id` = source_role.`role_id`
  105. AND existing_role.`menu_id` = permission_menu.`id`
  106. WHERE existing_role.`id` IS NULL;