20260826_add_agent_device_assignment.sql 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. -- 代理设备分配流水、去分配页面及接口权限,可重复执行。
  2. -- 旧表 device_manager_record 映射到 sa_device_manager_record。
  3. CREATE TABLE IF NOT EXISTS `sa_device_manager_record` (
  4. `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '流水编号',
  5. `device_id` BIGINT UNSIGNED NOT NULL COMMENT '设备编号',
  6. `device_sn` VARCHAR(60) NOT NULL COMMENT '设备 SN 快照',
  7. `goods_type` SMALLINT UNSIGNED NOT NULL COMMENT '设备类型',
  8. `last_agent_id` BIGINT UNSIGNED NOT NULL COMMENT '上一管理代理',
  9. `now_agent_id` BIGINT UNSIGNED NOT NULL COMMENT '当前管理代理',
  10. `action_type` TINYINT UNSIGNED NOT NULL COMMENT '1分配、2回收',
  11. `reason` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '操作原因',
  12. `operator_id` BIGINT UNSIGNED NOT NULL COMMENT '操作人',
  13. `action_time` DATETIME NOT NULL COMMENT '操作时间',
  14. `created_by` BIGINT UNSIGNED NULL COMMENT '创建者',
  15. `create_time` DATETIME NOT NULL COMMENT '创建时间',
  16. PRIMARY KEY (`id`),
  17. KEY `idx_manager_record_device_time` (`device_id`, `action_time`),
  18. KEY `idx_manager_record_agents_time` (`last_agent_id`, `now_agent_id`, `action_time`),
  19. KEY `idx_manager_record_sn` (`device_sn`)
  20. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='设备管理权分配回收流水';
  21. UPDATE `sa_system_menu`
  22. SET `slug` = 'core:agent:index', `method` = 'GET', `update_time` = NOW()
  23. WHERE `code` = 'MyAgent' AND `delete_time` IS NULL;
  24. INSERT INTO `sa_system_menu` (
  25. `parent_id`, `name`, `code`, `slug`, `type`, `path`, `component`, `method`, `icon`, `sort`,
  26. `link_url`, `is_iframe`, `is_keep_alive`, `is_hidden`, `is_fixed_tab`, `is_full_page`,
  27. `generate_id`, `generate_key`, `status`, `remark`, `created_by`, `updated_by`, `create_time`, `update_time`, `delete_time`
  28. )
  29. SELECT device_menu.`id`, '去分配', 'AssignDevice', NULL, 2,
  30. 'assign', '/device/assign', NULL, 'ri:share-forward-line', 74,
  31. NULL, 2, 2, 1, 2, 2, 0, NULL, 1,
  32. '选择下级代理并分配设备管理权', 1, 1, NOW(), NOW(), NULL
  33. FROM `sa_system_menu` device_menu
  34. WHERE device_menu.`code` = 'Device' AND device_menu.`delete_time` IS NULL
  35. AND NOT EXISTS (SELECT 1 FROM `sa_system_menu` WHERE `code` = 'AssignDevice' AND `delete_time` IS NULL);
  36. INSERT INTO `sa_system_menu` (
  37. `parent_id`, `name`, `code`, `slug`, `type`, `path`, `component`, `method`, `icon`, `sort`,
  38. `link_url`, `is_iframe`, `is_keep_alive`, `is_hidden`, `is_fixed_tab`, `is_full_page`,
  39. `generate_id`, `generate_key`, `status`, `remark`, `created_by`, `updated_by`, `create_time`, `update_time`, `delete_time`
  40. )
  41. SELECT agent_menu.`id`, permission_data.`name`, permission_data.`code`, permission_data.`slug`, 3,
  42. NULL, NULL, permission_data.`method`, NULL, permission_data.`sort`,
  43. NULL, 2, 2, 2, 2, 2, 0, NULL, 1, permission_data.`remark`, 1, 1, NOW(), NOW(), NULL
  44. FROM `sa_system_menu` agent_menu
  45. INNER JOIN (
  46. SELECT '导出代理' AS `name`, 'AgentExport' AS `code`, 'core:agent:export' AS `slug`, 'POST' AS `method`, 95 AS `sort`, '导出有权查看的代理' AS `remark`
  47. UNION ALL SELECT '可分配设备', 'AgentDeviceCandidates', 'core:agent:device:candidates', 'GET', 94, '查询当前代理未铺货库存设备'
  48. UNION ALL SELECT '分配设备', 'AgentDeviceAssign', 'core:agent:device:assign', 'POST', 93, '将设备管理权分配给下级代理'
  49. UNION ALL SELECT '回收设备', 'AgentDeviceRecover', 'core:agent:device:recover', 'POST', 92, '从下级代理回收未铺货设备'
  50. UNION ALL SELECT '设备分配记录', 'AgentDeviceRecords', 'core:agent:device:records', 'GET', 91, '查看与下级代理之间的分配回收流水'
  51. ) permission_data
  52. LEFT JOIN `sa_system_menu` existing_menu
  53. ON existing_menu.`slug` = permission_data.`slug` AND existing_menu.`delete_time` IS NULL
  54. WHERE agent_menu.`code` = 'Agent' AND agent_menu.`delete_time` IS NULL
  55. AND existing_menu.`id` IS NULL;
  56. -- 已有代理页或设备页权限的角色获得去分配页面和相关接口权限。
  57. INSERT INTO `sa_system_role_menu` (`role_id`, `menu_id`)
  58. SELECT DISTINCT source_role.`role_id`, target_menu.`id`
  59. FROM `sa_system_role_menu` source_role
  60. INNER JOIN `sa_system_menu` source_menu
  61. ON source_menu.`id` = source_role.`menu_id`
  62. AND source_menu.`code` IN ('MyAgent', 'MyDevice', 'SubordinateDevice')
  63. AND source_menu.`delete_time` IS NULL
  64. INNER JOIN `sa_system_menu` target_menu
  65. ON (
  66. target_menu.`code` = 'AssignDevice'
  67. OR target_menu.`slug` IN (
  68. 'core:agent:index', 'core:agent:export', 'core:agent:device:candidates',
  69. 'core:agent:device:assign', 'core:agent:device:recover', 'core:agent:device:records'
  70. )
  71. )
  72. AND target_menu.`delete_time` IS NULL
  73. LEFT JOIN `sa_system_role_menu` existing_role
  74. ON existing_role.`role_id` = source_role.`role_id`
  75. AND existing_role.`menu_id` = target_menu.`id`
  76. WHERE existing_role.`id` IS NULL;