chore: 导入门锁迭代开发工程基线
包含 RuoYi-Vue 后端(ruoyi-iot 门禁模块)、RuoYi-Vue2 前端、设计文档与升级脚本。 忽略构建产物(target/node_modules/dist)、IDE 配置、运行日志与数据库转储。
This commit is contained in:
commit
271e4ca77c
868 files changed
+114987
No files matched your search
@@ -0,0 +1,457 @@
|
||||
-- =========================================================================
|
||||
-- 现场基础数据导入:分组 / 网关 / 门锁 / 房间 / 门锁-网关归属(106 基地)
|
||||
--
|
||||
-- 数据来源:doc/锁-房间号对应表配置数据.xlsx
|
||||
-- 62 间房 · 62 把锁 · 8 个网关 · 8 个分组(2 楼东/中/西、3 楼东/中/西、4 楼东/中)
|
||||
--
|
||||
-- 前置条件:已执行 lock.sql(lock_group/lock_gateway/lock_device)、
|
||||
-- upgrade_d17_device_gateway.sql(lock_device_gateway)、
|
||||
-- upgrade_d19_stay.sql(lock_room)。
|
||||
--
|
||||
-- 字段口径:
|
||||
-- 1) 「锁ID」为 8 位门锁SN,写入 lock_device.device_sn;下发 locklist 时由代码补
|
||||
-- CCEE 前缀成 12 位(并非库内存储值);
|
||||
-- 2) 「分组」FFFA26102911…18 即 lock_group.group_code,与网关一一对应,同时也是
|
||||
-- locklist 的组号(params[1]);网关按组号归入该分组;
|
||||
-- 3) room_code = 分组编号-房号(如 FFFA26102911-3201),与对外接口约定一致;
|
||||
-- 4) 「开门方向」(左开/右开)在表结构中没有对应字段,写入 lock_room.remark;
|
||||
-- 5) 门锁密码、网关密码、固件版本、dev_type、人脸算法版本 Excel 未提供,保持为空
|
||||
-- (下发时 devPsw 空值按 "0" 处理);人脸授权前需在门锁页补 face_algo_version;
|
||||
-- 6) 归属关系初始 bind_status=0(待下发);若现场网关已按下表配好、不需再发
|
||||
-- locklist,见脚本末尾的可选更新。
|
||||
--
|
||||
-- 幂等性:
|
||||
-- - 分组/网关/门锁:按自然键判断,不存在则插入,已存在则对齐名称与归属字段;
|
||||
-- - 归属关系:按 (device_id, gateway_id) 判断,已存在则不改(保留 bind_status 等运行态);
|
||||
-- - 房间:按 room_code 判断,已存在则不动(保留房态与当前入住);
|
||||
-- 若该门锁已被其它房间绑定(如 D19 按 room_no 回填过),同样跳过,避免 device_id 唯一键冲突;
|
||||
-- 全程不删除任何数据,可重复执行。
|
||||
--
|
||||
-- 实现说明:
|
||||
-- 1) 源数据以字面量派生表内联在各语句中,不使用临时表(临时表会继承连接默认排序规则
|
||||
-- utf8mb4_0900_ai_ci,与业务表 utf8mb4_general_ci 比较时报 1267);
|
||||
-- 2) 派生列与业务列比较处显式 collate utf8mb4_general_ci,避免连接默认排序规则
|
||||
-- (MySQL 8 为 utf8mb4_0900_ai_ci)与业务表排序规则不一致再次触发 1267;
|
||||
-- 3) 每条语句可独立执行,重复执行结果不变。
|
||||
-- =========================================================================
|
||||
|
||||
set names utf8mb4;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 1、分组(8):group_code 即 locklist 组号
|
||||
-- =========================================================================
|
||||
insert into lock_group (group_code, group_name, order_num, status, del_flag, create_by, create_time, remark)
|
||||
select v.group_code, v.group_name, v.order_num, '0', '0', 'admin', now(), '现场配置导入'
|
||||
from (
|
||||
select 'FFFA26102911' as group_code, '2楼东侧' as group_name, 1 as order_num
|
||||
union all select 'FFFA26102912', '2楼中间', 2
|
||||
union all select 'FFFA26102913', '2楼西侧', 3
|
||||
union all select 'FFFA26102914', '3楼东侧', 4
|
||||
union all select 'FFFA26102915', '3楼中间', 5
|
||||
union all select 'FFFA26102916', '3楼西侧', 6
|
||||
union all select 'FFFA26102917', '4楼东侧', 7
|
||||
union all select 'FFFA26102918', '4楼中间', 8
|
||||
) v
|
||||
where not exists (select 1 from lock_group g where g.group_code = v.group_code collate utf8mb4_general_ci);
|
||||
|
||||
update lock_group g
|
||||
join (
|
||||
select 'FFFA26102911' as group_code, '2楼东侧' as group_name, 1 as order_num
|
||||
union all select 'FFFA26102912', '2楼中间', 2
|
||||
union all select 'FFFA26102913', '2楼西侧', 3
|
||||
union all select 'FFFA26102914', '3楼东侧', 4
|
||||
union all select 'FFFA26102915', '3楼中间', 5
|
||||
union all select 'FFFA26102916', '3楼西侧', 6
|
||||
union all select 'FFFA26102917', '4楼东侧', 7
|
||||
union all select 'FFFA26102918', '4楼中间', 8
|
||||
) v on v.group_code collate utf8mb4_general_ci = g.group_code
|
||||
set g.group_name = v.group_name,
|
||||
g.order_num = v.order_num,
|
||||
g.update_time = now();
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 2、网关(8):一个网关一个分组,网关SN即 MQTT 主题第 2 段
|
||||
-- =========================================================================
|
||||
insert into lock_gateway (gateway_sn, gateway_name, group_id, gateway_ip, status, del_flag, create_by, create_time, remark)
|
||||
select v.gateway_sn, v.gateway_name, g.group_id, v.gateway_ip, '0', '0', 'admin', now(), '现场配置导入'
|
||||
from (
|
||||
select 'C846CEC8EB0B' as gateway_sn, '2楼东侧网关' as gateway_name, '192.168.1.181' as gateway_ip, 'FFFA26102911' as group_code
|
||||
union all select '7EC81CB0381A', '2楼中间网关', '192.168.1.182', 'FFFA26102912'
|
||||
union all select '33C574C47232', '2楼西侧网关', '192.168.1.183', 'FFFA26102913'
|
||||
union all select '6F5B285A4C82', '3楼东侧网关', '192.168.1.184', 'FFFA26102914'
|
||||
union all select '740655ADA09A', '3楼中间网关', '192.168.1.185', 'FFFA26102915'
|
||||
union all select '971ED01FA2FA', '3楼西侧网关', '192.168.1.186', 'FFFA26102916'
|
||||
union all select '3003368D0573', '4楼东侧网关', '192.168.1.187', 'FFFA26102917'
|
||||
union all select 'B46995C2AAC1', '4楼中间网关', '192.168.1.188', 'FFFA26102918'
|
||||
) v
|
||||
join lock_group g on v.group_code collate utf8mb4_general_ci = g.group_code
|
||||
where not exists (select 1 from lock_gateway w where w.gateway_sn = v.gateway_sn collate utf8mb4_general_ci);
|
||||
|
||||
update lock_gateway w
|
||||
join (
|
||||
select 'C846CEC8EB0B' as gateway_sn, '2楼东侧网关' as gateway_name, '192.168.1.181' as gateway_ip, 'FFFA26102911' as group_code
|
||||
union all select '7EC81CB0381A', '2楼中间网关', '192.168.1.182', 'FFFA26102912'
|
||||
union all select '33C574C47232', '2楼西侧网关', '192.168.1.183', 'FFFA26102913'
|
||||
union all select '6F5B285A4C82', '3楼东侧网关', '192.168.1.184', 'FFFA26102914'
|
||||
union all select '740655ADA09A', '3楼中间网关', '192.168.1.185', 'FFFA26102915'
|
||||
union all select '971ED01FA2FA', '3楼西侧网关', '192.168.1.186', 'FFFA26102916'
|
||||
union all select '3003368D0573', '4楼东侧网关', '192.168.1.187', 'FFFA26102917'
|
||||
union all select 'B46995C2AAC1', '4楼中间网关', '192.168.1.188', 'FFFA26102918'
|
||||
) v on v.gateway_sn collate utf8mb4_general_ci = w.gateway_sn
|
||||
join lock_group g on v.group_code collate utf8mb4_general_ci = g.group_code
|
||||
set w.gateway_name = v.gateway_name,
|
||||
w.gateway_ip = v.gateway_ip,
|
||||
w.group_id = g.group_id,
|
||||
w.update_time = now();
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 3、门锁(62):device_sn 为 8 位锁SN;gateway_id/group_id 为主控网关缓存
|
||||
-- (事实源是第 4 段的 lock_device_gateway)
|
||||
-- =========================================================================
|
||||
insert into lock_device (device_sn, device_name, gateway_id, group_id, room_no, bind_time, status, del_flag, create_by, create_time)
|
||||
select v.lock_sn, v.room_no, w.gateway_id, w.group_id, v.room_no, now(), '0', '0', 'admin', now()
|
||||
from (
|
||||
select '80745D95' as lock_sn, '3201' as room_no, 2 as floor, '左开' as door_dir, 'C846CEC8EB0B' as gateway_sn, 'FFFA26102911' as group_code
|
||||
union all select '80745D6F', '3202', 2, '右开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745DA3', '3203', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D78', '3204', 2, '右开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D89', '3205', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D93', '3206', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D75', '3207', 2, '右开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D9A', '3208', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D99', '3209', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D73', '3210', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D9F', '3211', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D92', '3212', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D7A', '3213', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D8E', '3214', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745DA7', '3215', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D86', '3216', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D72', '3217', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745DA8', '3218', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D90', '3219', 2, '左开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D77', '3220', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D76', '3221', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D96', '3222', 2, '左开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D7B', '3223', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745DA4', '3224', 2, '左开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D7E', '3225', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D9C', '3301', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D71', '3302', 3, '右开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745DA2', '3303', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D82', '3304', 3, '右开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745DAA', '3305', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D8D', '3306', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D7F', '3307', 3, '右开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D97', '3308', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D8A', '3309', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D6E', '3310', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D9B', '3311', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D94', '3312', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D84', '3313', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D9D', '3314', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D6A', '3315', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D7D', '3316', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D70', '3317', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745DA5', '3318', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D8C', '3319', 3, '左开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D74', '3320', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D6D', '3321', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D8B', '3322', 3, '左开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D6C', '3323', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D98', '3324', 3, '左开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D88', '3325', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745DAB', '3401', 4, '左开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745D87', '3402', 4, '右开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745D8F', '3403', 4, '右开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745DA1', '3404', 4, '左开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745DA9', '3405', 4, '左开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745D91', '3406', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D6B', '3407', 4, '右开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745DA6', '3408', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D81', '3409', 4, '右开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D9E', '3410', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D83', '3411', 4, '右开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745DA0', '3412', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
) v
|
||||
join lock_gateway w on v.gateway_sn collate utf8mb4_general_ci = w.gateway_sn
|
||||
where not exists (select 1 from lock_device d where d.device_sn = v.lock_sn collate utf8mb4_general_ci);
|
||||
|
||||
update lock_device d
|
||||
join (
|
||||
select '80745D95' as lock_sn, '3201' as room_no, 2 as floor, '左开' as door_dir, 'C846CEC8EB0B' as gateway_sn, 'FFFA26102911' as group_code
|
||||
union all select '80745D6F', '3202', 2, '右开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745DA3', '3203', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D78', '3204', 2, '右开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D89', '3205', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D93', '3206', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D75', '3207', 2, '右开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D9A', '3208', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D99', '3209', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D73', '3210', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D9F', '3211', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D92', '3212', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D7A', '3213', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D8E', '3214', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745DA7', '3215', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D86', '3216', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D72', '3217', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745DA8', '3218', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D90', '3219', 2, '左开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D77', '3220', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D76', '3221', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D96', '3222', 2, '左开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D7B', '3223', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745DA4', '3224', 2, '左开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D7E', '3225', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D9C', '3301', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D71', '3302', 3, '右开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745DA2', '3303', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D82', '3304', 3, '右开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745DAA', '3305', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D8D', '3306', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D7F', '3307', 3, '右开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D97', '3308', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D8A', '3309', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D6E', '3310', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D9B', '3311', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D94', '3312', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D84', '3313', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D9D', '3314', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D6A', '3315', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D7D', '3316', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D70', '3317', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745DA5', '3318', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D8C', '3319', 3, '左开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D74', '3320', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D6D', '3321', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D8B', '3322', 3, '左开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D6C', '3323', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D98', '3324', 3, '左开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D88', '3325', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745DAB', '3401', 4, '左开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745D87', '3402', 4, '右开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745D8F', '3403', 4, '右开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745DA1', '3404', 4, '左开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745DA9', '3405', 4, '左开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745D91', '3406', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D6B', '3407', 4, '右开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745DA6', '3408', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D81', '3409', 4, '右开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D9E', '3410', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D83', '3411', 4, '右开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745DA0', '3412', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
) v on v.lock_sn collate utf8mb4_general_ci = d.device_sn
|
||||
join lock_gateway w on v.gateway_sn collate utf8mb4_general_ci = w.gateway_sn
|
||||
set d.device_name = v.room_no,
|
||||
d.room_no = v.room_no,
|
||||
d.gateway_id = w.gateway_id,
|
||||
d.group_id = w.group_id,
|
||||
d.update_time = now();
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 4、门锁-网关归属(62):bind_status=0 待下发,在线状态未知
|
||||
-- 已存在的关系不覆盖,保留平台运行中回写的 bind_status / 信号 / 在线状态
|
||||
-- =========================================================================
|
||||
insert into lock_device_gateway (device_id, gateway_id, online_status, bind_status, bind_time, status, del_flag, create_by, create_time, remark)
|
||||
select d.device_id, w.gateway_id, '2', '0', now(), '0', '0', 'admin', now(), '现场配置导入'
|
||||
from (
|
||||
select '80745D95' as lock_sn, '3201' as room_no, 2 as floor, '左开' as door_dir, 'C846CEC8EB0B' as gateway_sn, 'FFFA26102911' as group_code
|
||||
union all select '80745D6F', '3202', 2, '右开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745DA3', '3203', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D78', '3204', 2, '右开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D89', '3205', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D93', '3206', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D75', '3207', 2, '右开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D9A', '3208', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D99', '3209', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D73', '3210', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D9F', '3211', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D92', '3212', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D7A', '3213', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D8E', '3214', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745DA7', '3215', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D86', '3216', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D72', '3217', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745DA8', '3218', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D90', '3219', 2, '左开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D77', '3220', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D76', '3221', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D96', '3222', 2, '左开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D7B', '3223', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745DA4', '3224', 2, '左开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D7E', '3225', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D9C', '3301', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D71', '3302', 3, '右开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745DA2', '3303', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D82', '3304', 3, '右开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745DAA', '3305', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D8D', '3306', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D7F', '3307', 3, '右开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D97', '3308', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D8A', '3309', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D6E', '3310', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D9B', '3311', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D94', '3312', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D84', '3313', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D9D', '3314', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D6A', '3315', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D7D', '3316', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D70', '3317', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745DA5', '3318', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D8C', '3319', 3, '左开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D74', '3320', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D6D', '3321', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D8B', '3322', 3, '左开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D6C', '3323', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D98', '3324', 3, '左开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D88', '3325', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745DAB', '3401', 4, '左开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745D87', '3402', 4, '右开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745D8F', '3403', 4, '右开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745DA1', '3404', 4, '左开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745DA9', '3405', 4, '左开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745D91', '3406', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D6B', '3407', 4, '右开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745DA6', '3408', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D81', '3409', 4, '右开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D9E', '3410', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D83', '3411', 4, '右开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745DA0', '3412', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
) v
|
||||
join lock_device d on v.lock_sn collate utf8mb4_general_ci = d.device_sn
|
||||
join lock_gateway w on v.gateway_sn collate utf8mb4_general_ci = w.gateway_sn
|
||||
where not exists (select 1 from lock_device_gateway r
|
||||
where r.device_id = d.device_id and r.gateway_id = w.gateway_id);
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 5、房间(62):room_code = 分组编号-房号,一房一锁,初始空闲
|
||||
-- 已存在的 room_code 不动(保留房态与在住信息);开门方向写 remark
|
||||
-- =========================================================================
|
||||
insert into lock_room (room_code, room_no, room_name, group_id, floor, device_id, room_status, del_flag, create_by, create_time, remark)
|
||||
select concat(v.group_code, '-', v.room_no), v.room_no, v.room_no, g.group_id, v.floor, d.device_id, '0', '0', 'admin', now(), v.door_dir
|
||||
from (
|
||||
select '80745D95' as lock_sn, '3201' as room_no, 2 as floor, '左开' as door_dir, 'C846CEC8EB0B' as gateway_sn, 'FFFA26102911' as group_code
|
||||
union all select '80745D6F', '3202', 2, '右开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745DA3', '3203', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D78', '3204', 2, '右开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D89', '3205', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D93', '3206', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D75', '3207', 2, '右开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D9A', '3208', 2, '左开', 'C846CEC8EB0B', 'FFFA26102911'
|
||||
union all select '80745D99', '3209', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D73', '3210', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D9F', '3211', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D92', '3212', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D7A', '3213', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D8E', '3214', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745DA7', '3215', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D86', '3216', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D72', '3217', 2, '右开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745DA8', '3218', 2, '左开', '7EC81CB0381A', 'FFFA26102912'
|
||||
union all select '80745D90', '3219', 2, '左开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D77', '3220', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D76', '3221', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D96', '3222', 2, '左开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D7B', '3223', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745DA4', '3224', 2, '左开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D7E', '3225', 2, '右开', '33C574C47232', 'FFFA26102913'
|
||||
union all select '80745D9C', '3301', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D71', '3302', 3, '右开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745DA2', '3303', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D82', '3304', 3, '右开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745DAA', '3305', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D8D', '3306', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D7F', '3307', 3, '右开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D97', '3308', 3, '左开', '6F5B285A4C82', 'FFFA26102914'
|
||||
union all select '80745D8A', '3309', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D6E', '3310', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D9B', '3311', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D94', '3312', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D84', '3313', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D9D', '3314', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D6A', '3315', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D7D', '3316', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D70', '3317', 3, '右开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745DA5', '3318', 3, '左开', '740655ADA09A', 'FFFA26102915'
|
||||
union all select '80745D8C', '3319', 3, '左开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D74', '3320', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D6D', '3321', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D8B', '3322', 3, '左开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D6C', '3323', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D98', '3324', 3, '左开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745D88', '3325', 3, '右开', '971ED01FA2FA', 'FFFA26102916'
|
||||
union all select '80745DAB', '3401', 4, '左开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745D87', '3402', 4, '右开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745D8F', '3403', 4, '右开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745DA1', '3404', 4, '左开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745DA9', '3405', 4, '左开', '3003368D0573', 'FFFA26102917'
|
||||
union all select '80745D91', '3406', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D6B', '3407', 4, '右开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745DA6', '3408', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D81', '3409', 4, '右开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D9E', '3410', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745D83', '3411', 4, '右开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
union all select '80745DA0', '3412', 4, '左开', 'B46995C2AAC1', 'FFFA26102918'
|
||||
) v
|
||||
join lock_group g on v.group_code collate utf8mb4_general_ci = g.group_code
|
||||
join lock_device d on v.lock_sn collate utf8mb4_general_ci = d.device_sn
|
||||
where not exists (select 1 from lock_room r
|
||||
where r.room_code = concat(v.group_code, '-', v.room_no) collate utf8mb4_general_ci)
|
||||
and not exists (select 1 from lock_room r2 where r2.device_id = d.device_id);
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 6、网关下挂门锁数(冗余统计)
|
||||
-- =========================================================================
|
||||
update lock_gateway w
|
||||
set w.device_count = (select count(1) from lock_device_gateway r where r.gateway_id = w.gateway_id)
|
||||
where w.gateway_sn in ('C846CEC8EB0B',
|
||||
'7EC81CB0381A',
|
||||
'33C574C47232',
|
||||
'6F5B285A4C82',
|
||||
'740655ADA09A',
|
||||
'971ED01FA2FA',
|
||||
'3003368D0573',
|
||||
'B46995C2AAC1');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 7、执行后核对(按需执行)
|
||||
-- =========================================================================
|
||||
-- 7.1 分组/网关/下挂数:应 8 行,每行门锁数 5–10
|
||||
-- select g.group_code, g.group_name, w.gateway_sn, w.gateway_ip, w.device_count
|
||||
-- from lock_group g
|
||||
-- left join lock_gateway w on w.group_id = g.group_id
|
||||
-- where g.group_code like 'FFFA2610291%'
|
||||
-- order by g.group_code;
|
||||
|
||||
-- 7.2 房间与门锁一一对应:应 62 行
|
||||
-- select r.room_code, r.room_no, r.floor, r.remark, d.device_sn
|
||||
-- from lock_room r
|
||||
-- left join lock_device d on d.device_id = r.device_id
|
||||
-- where r.room_code like 'FFFA2610291%-%'
|
||||
-- order by r.room_code;
|
||||
|
||||
-- 7.3 归属关系待下发数量:初始 total = pending = 各网关门锁数
|
||||
-- select w.gateway_sn, count(1) total, sum(r.bind_status = '0') pending
|
||||
-- from lock_device_gateway r
|
||||
-- join lock_gateway w on w.gateway_id = r.gateway_id
|
||||
-- where w.gateway_sn in ('C846CEC8EB0B', '7EC81CB0381A', '33C574C47232', '6F5B285A4C82', '740655ADA09A', '971ED01FA2FA', '3003368D0573', 'B46995C2AAC1')
|
||||
-- group by w.gateway_sn;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 8、可选:现场网关已按本表配置完毕、不需要平台再下发 locklist 时,
|
||||
-- 把本批关系直接标记为已下发(避免页面显示「待下发」)
|
||||
-- =========================================================================
|
||||
-- update lock_device_gateway r
|
||||
-- join lock_gateway w on w.gateway_id = r.gateway_id
|
||||
-- set r.bind_status = '1', r.bind_time = now(), r.last_sync_time = now()
|
||||
-- where r.bind_status = '0'
|
||||
-- and w.gateway_sn in ('C846CEC8EB0B', '7EC81CB0381A', '33C574C47232', '6F5B285A4C82', '740655ADA09A', '971ED01FA2FA', '3003368D0573', 'B46995C2AAC1');
|
||||
@@ -0,0 +1,852 @@
|
||||
-- =========================================================================
|
||||
-- 公寓人脸门禁系统(智能门锁)业务表 —— KingbaseES 初始化脚本
|
||||
--
|
||||
-- 库名:iotlocks 模式:iotlocks
|
||||
-- 前置:先执行同目录 ry.sql(若依基础表)
|
||||
-- 版本:v1.0
|
||||
--
|
||||
-- 规范(与 ry.sql 完全一致):
|
||||
-- 1) 所有对象显式限定 iotlocks.<对象名>,不依赖 search_path,避免命中
|
||||
-- KingbaseES 系统模式 sys_catalog 中的同名内置对象。
|
||||
-- 2) 主键统一 bigserial;关联列统一 bigint(不建物理外键,由业务层保证)。
|
||||
-- 3) 状态/标志位统一 char(1) 或 char(2),与若依 del_flag/status 风格一致;
|
||||
-- 时间统一 timestamp(不带时区),默认值用 CURRENT_TIMESTAMP。
|
||||
-- 4) 表与列注释统一使用 comment on;索引统一 idx_ / uk_ 前缀。
|
||||
-- 5) 脚本可重复执行:建表前 drop table if exists,种子数据先 delete 再 insert。
|
||||
-- 6) 显式指定主键的种子数据,末尾统一 setval 复位序列(沿用 ry.sql 写法)。
|
||||
--
|
||||
-- 表清单:
|
||||
-- 1. lock_group 公寓分组表
|
||||
-- 2. lock_gateway 门锁网关表
|
||||
-- 3. lock_device 智能门锁表
|
||||
-- 4. lock_face 人脸数据表
|
||||
-- 5. lock_auth 授权数据表
|
||||
-- 6. lock_access_log 门禁通行日志表
|
||||
-- 7. lock_command 下行命令记录表
|
||||
-- 8. lock_mqtt_log MQTT 报文留痕表
|
||||
-- 9. lock_service_config 服务参数配置表
|
||||
-- =========================================================================
|
||||
|
||||
set search_path to iotlocks, public, pg_catalog, sys_catalog;
|
||||
create schema if not exists iotlocks;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 1、公寓分组表
|
||||
-- 业务含义:一个公寓对应一个分组;分组是 MQTT 分组级主题
|
||||
-- (ydlink/{groupCode}/thing/...)的载体,也是批量授权/远程开锁的粒度。
|
||||
-- =========================================================================
|
||||
drop table if exists iotlocks.lock_group;
|
||||
create table iotlocks.lock_group (
|
||||
group_id bigserial not null,
|
||||
group_code varchar(32) not null,
|
||||
group_name varchar(64) not null,
|
||||
dept_id bigint default null,
|
||||
manager varchar(64) default null,
|
||||
phone varchar(20) default null,
|
||||
address varchar(255) default null,
|
||||
config_id bigint default null,
|
||||
status char(1) default '0',
|
||||
order_num int default 0,
|
||||
del_flag char(1) default '0',
|
||||
create_by varchar(64) default '',
|
||||
create_time timestamp,
|
||||
update_by varchar(64) default '',
|
||||
update_time timestamp,
|
||||
remark varchar(500) default null,
|
||||
primary key (group_id)
|
||||
);
|
||||
|
||||
comment on table iotlocks.lock_group is '公寓分组表';
|
||||
comment on column iotlocks.lock_group.group_id is '分组ID';
|
||||
comment on column iotlocks.lock_group.group_code is '分组编号(MQTT主题第2段,全局唯一,一经占用不再复用)';
|
||||
comment on column iotlocks.lock_group.group_name is '公寓/分组名称';
|
||||
comment on column iotlocks.lock_group.dept_id is '所属部门ID(用于数据权限)';
|
||||
comment on column iotlocks.lock_group.manager is '负责人';
|
||||
comment on column iotlocks.lock_group.phone is '联系电话';
|
||||
comment on column iotlocks.lock_group.address is '公寓地址';
|
||||
comment on column iotlocks.lock_group.config_id is '关联MQTT服务器配置ID(lock_service_config.config_id,空表示用全局默认)';
|
||||
comment on column iotlocks.lock_group.status is '状态(0正常 1停用)';
|
||||
comment on column iotlocks.lock_group.order_num is '显示顺序';
|
||||
comment on column iotlocks.lock_group.del_flag is '删除标志(0代表存在 2代表删除)';
|
||||
comment on column iotlocks.lock_group.create_by is '创建者';
|
||||
comment on column iotlocks.lock_group.create_time is '创建时间';
|
||||
comment on column iotlocks.lock_group.update_by is '更新者';
|
||||
comment on column iotlocks.lock_group.update_time is '更新时间';
|
||||
comment on column iotlocks.lock_group.remark is '备注';
|
||||
|
||||
create unique index uk_lock_group_code on iotlocks.lock_group (group_code);
|
||||
create index idx_lock_group_dept on iotlocks.lock_group (dept_id);
|
||||
create index idx_lock_group_status on iotlocks.lock_group (status);
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 2、门锁网关表
|
||||
-- 业务含义:门锁网关是 LoRa 汇聚节点,下挂多台门锁;一个网关属于一个分组。
|
||||
-- 网关是 MQTT 网关级主题(ydlink/{gatewaySn}/thing/...)的载体。
|
||||
-- =========================================================================
|
||||
drop table if exists iotlocks.lock_gateway;
|
||||
create table iotlocks.lock_gateway (
|
||||
gateway_id bigserial not null,
|
||||
gateway_sn varchar(32) not null,
|
||||
gateway_name varchar(64) default null,
|
||||
group_id bigint default null,
|
||||
gateway_ip varchar(64) default null,
|
||||
subnet_mask varchar(64) default null,
|
||||
default_gateway varchar(64) default null,
|
||||
gateway_password varchar(128) default null,
|
||||
config_id bigint default null,
|
||||
lora_config varchar(1024) default null,
|
||||
mqtt_config varchar(1024) default null,
|
||||
config_version int default 0,
|
||||
sync_status char(1) default '0',
|
||||
online_status char(1) default '1',
|
||||
last_online_time timestamp,
|
||||
last_sync_time timestamp,
|
||||
device_count int default 0,
|
||||
firmware_ver varchar(32) default null,
|
||||
status char(1) default '0',
|
||||
del_flag char(1) default '0',
|
||||
create_by varchar(64) default '',
|
||||
create_time timestamp,
|
||||
update_by varchar(64) default '',
|
||||
update_time timestamp,
|
||||
remark varchar(500) default null,
|
||||
primary key (gateway_id)
|
||||
);
|
||||
|
||||
comment on table iotlocks.lock_gateway is '门锁网关表';
|
||||
comment on column iotlocks.lock_gateway.gateway_id is '网关ID';
|
||||
comment on column iotlocks.lock_gateway.gateway_sn is '网关SN(MQTT主题第2段,全局唯一)';
|
||||
comment on column iotlocks.lock_gateway.gateway_name is '网关名称';
|
||||
comment on column iotlocks.lock_gateway.group_id is '所属分组ID(lock_group.group_id)';
|
||||
comment on column iotlocks.lock_gateway.gateway_ip is '网关IP';
|
||||
comment on column iotlocks.lock_gateway.subnet_mask is '子网掩码';
|
||||
comment on column iotlocks.lock_gateway.default_gateway is '默认网关';
|
||||
comment on column iotlocks.lock_gateway.gateway_password is '网关密码(密文存储,AES加密)';
|
||||
comment on column iotlocks.lock_gateway.config_id is '关联MQTT服务器配置ID';
|
||||
comment on column iotlocks.lock_gateway.lora_config is 'LORA参数配置(JSON)';
|
||||
comment on column iotlocks.lock_gateway.mqtt_config is '网关侧MQTT参数(JSON)';
|
||||
comment on column iotlocks.lock_gateway.config_version is '配置版本号(每次下发+1,用于比对网关侧是否已同步)';
|
||||
comment on column iotlocks.lock_gateway.sync_status is '配置同步状态(0未同步 1已同步 2同步失败)';
|
||||
comment on column iotlocks.lock_gateway.online_status is '在线状态(0在线 1离线)';
|
||||
comment on column iotlocks.lock_gateway.last_online_time is '最后在线时间';
|
||||
comment on column iotlocks.lock_gateway.last_sync_time is '最后配置同步时间';
|
||||
comment on column iotlocks.lock_gateway.device_count is '下挂门锁数量(冗余统计)';
|
||||
comment on column iotlocks.lock_gateway.firmware_ver is '网关固件版本';
|
||||
comment on column iotlocks.lock_gateway.status is '状态(0正常 1停用)';
|
||||
comment on column iotlocks.lock_gateway.del_flag is '删除标志(0代表存在 2代表删除)';
|
||||
comment on column iotlocks.lock_gateway.create_by is '创建者';
|
||||
comment on column iotlocks.lock_gateway.create_time is '创建时间';
|
||||
comment on column iotlocks.lock_gateway.update_by is '更新者';
|
||||
comment on column iotlocks.lock_gateway.update_time is '更新时间';
|
||||
comment on column iotlocks.lock_gateway.remark is '备注';
|
||||
|
||||
create unique index uk_lock_gateway_sn on iotlocks.lock_gateway (gateway_sn);
|
||||
create index idx_lock_gateway_group on iotlocks.lock_gateway (group_id);
|
||||
create index idx_lock_gateway_online on iotlocks.lock_gateway (online_status);
|
||||
create index idx_lock_gateway_sync on iotlocks.lock_gateway (sync_status);
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 3、智能门锁表
|
||||
-- 业务含义:门锁终端,通过 LoRa 挂在一个网关下;gateway_id 为空表示未绑定网关。
|
||||
-- 协议字段映射:device_sn -> devId,device_password -> devPsw,
|
||||
-- dev_type -> devType,dev_ver -> devVer。
|
||||
-- =========================================================================
|
||||
drop table if exists iotlocks.lock_device;
|
||||
create table iotlocks.lock_device (
|
||||
device_id bigserial not null,
|
||||
device_sn varchar(32) not null,
|
||||
device_name varchar(64) default null,
|
||||
gateway_id bigint default null,
|
||||
group_id bigint default null,
|
||||
device_password varchar(128) default null,
|
||||
dev_type varchar(8) default null,
|
||||
dev_ver varchar(16) default null,
|
||||
face_algo_version varchar(32) default null,
|
||||
room_no varchar(64) default null,
|
||||
bind_time timestamp,
|
||||
last_sync_time timestamp,
|
||||
signal_strength varchar(8) default null,
|
||||
battery_level int default null,
|
||||
last_status_time timestamp,
|
||||
online_status char(1) default '1',
|
||||
last_online_time timestamp,
|
||||
status char(1) default '0',
|
||||
del_flag char(1) default '0',
|
||||
create_by varchar(64) default '',
|
||||
create_time timestamp,
|
||||
update_by varchar(64) default '',
|
||||
update_time timestamp,
|
||||
remark varchar(500) default null,
|
||||
primary key (device_id)
|
||||
);
|
||||
|
||||
comment on table iotlocks.lock_device is '智能门锁表';
|
||||
comment on column iotlocks.lock_device.device_id is '门锁ID';
|
||||
comment on column iotlocks.lock_device.device_sn is '门锁SN(对应协议devId,全局唯一)';
|
||||
comment on column iotlocks.lock_device.device_name is '门锁名称';
|
||||
comment on column iotlocks.lock_device.gateway_id is '所属网关ID(lock_gateway.gateway_id,为空表示未绑定)';
|
||||
comment on column iotlocks.lock_device.group_id is '冗余分组ID(便于按分组批量下发,与网关分组保持一致)';
|
||||
comment on column iotlocks.lock_device.device_password is '门锁密码(密文存储,对应协议devPsw)';
|
||||
comment on column iotlocks.lock_device.dev_type is '设备类型(对应协议devType)';
|
||||
comment on column iotlocks.lock_device.dev_ver is '设备固件版本(对应协议devVer)';
|
||||
comment on column iotlocks.lock_device.face_algo_version is '人脸算法版本(特征提取服务的 algorithm_version 入参,由每把门锁各自维护,如 2.14.5_2.7.1_M3)';
|
||||
comment on column iotlocks.lock_device.room_no is '分配房间号';
|
||||
comment on column iotlocks.lock_device.bind_time is '绑定网关时间';
|
||||
comment on column iotlocks.lock_device.last_sync_time is '最后时间同步时间';
|
||||
comment on column iotlocks.lock_device.signal_strength is '信号强度RSSI(dBm,op=lockrssi 上报,如 -42)';
|
||||
comment on column iotlocks.lock_device.battery_level is '剩余电量(百分比,op=lockrssi 上报)';
|
||||
comment on column iotlocks.lock_device.last_status_time is '最后状态上报时间(信号/电量上报时间)';
|
||||
comment on column iotlocks.lock_device.online_status is '在线状态(0在线 1离线 2未知)';
|
||||
comment on column iotlocks.lock_device.last_online_time is '最后在线时间';
|
||||
comment on column iotlocks.lock_device.status is '状态(0正常 1停用)';
|
||||
comment on column iotlocks.lock_device.del_flag is '删除标志(0代表存在 2代表删除)';
|
||||
comment on column iotlocks.lock_device.create_by is '创建者';
|
||||
comment on column iotlocks.lock_device.create_time is '创建时间';
|
||||
comment on column iotlocks.lock_device.update_by is '更新者';
|
||||
comment on column iotlocks.lock_device.update_time is '更新时间';
|
||||
comment on column iotlocks.lock_device.remark is '备注';
|
||||
|
||||
create unique index uk_lock_device_sn on iotlocks.lock_device (device_sn);
|
||||
create index idx_lock_device_gateway on iotlocks.lock_device (gateway_id);
|
||||
|
||||
-- 已有环境增量升级(信号/电量):以下 add column 带 if not exists,重复执行不会报错
|
||||
alter table iotlocks.lock_device add column if not exists signal_strength varchar(8) default null;
|
||||
alter table iotlocks.lock_device add column if not exists battery_level int default null;
|
||||
alter table iotlocks.lock_device add column if not exists last_status_time timestamp;
|
||||
|
||||
comment on column iotlocks.lock_device.signal_strength is '信号强度RSSI(dBm,op=lockrssi 上报,如 -42)';
|
||||
comment on column iotlocks.lock_device.battery_level is '剩余电量(百分比,op=lockrssi 上报)';
|
||||
comment on column iotlocks.lock_device.last_status_time is '最后状态上报时间(信号/电量上报时间)';
|
||||
create index idx_lock_device_group on iotlocks.lock_device (group_id);
|
||||
create index idx_lock_device_room on iotlocks.lock_device (room_no);
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 4、人脸数据表
|
||||
-- 业务含义:以 person_no(人员/人脸编号,协议中的 AA000009 形态)为主键标识的人脸库。
|
||||
-- 图片与特征分离存储:图片走对象存储/文件服务,特征以 base64 落 text 列。
|
||||
-- =========================================================================
|
||||
drop table if exists iotlocks.lock_face;
|
||||
create table iotlocks.lock_face (
|
||||
face_id bigserial not null,
|
||||
person_no varchar(32) not null,
|
||||
person_name varchar(64) default null,
|
||||
person_type char(1) default '0',
|
||||
phone varchar(20) default null,
|
||||
photo_url varchar(512) default null,
|
||||
photo_md5 varchar(32) default null,
|
||||
feature_data text,
|
||||
feature_md5 varchar(32) default null,
|
||||
feature_algo_version varchar(32) default null,
|
||||
feature_size int default 0,
|
||||
extract_status char(1) default '0',
|
||||
extract_time timestamp,
|
||||
extract_msg varchar(512) default null,
|
||||
status char(1) default '0',
|
||||
del_flag char(1) default '0',
|
||||
create_by varchar(64) default '',
|
||||
create_time timestamp,
|
||||
update_by varchar(64) default '',
|
||||
update_time timestamp,
|
||||
remark varchar(500) default null,
|
||||
primary key (face_id)
|
||||
);
|
||||
|
||||
comment on table iotlocks.lock_face is '人脸数据表';
|
||||
comment on column iotlocks.lock_face.face_id is '人脸数据ID';
|
||||
comment on column iotlocks.lock_face.person_no is '人脸编号/人员编号(业务唯一,协议授权帧中的人员标识)';
|
||||
comment on column iotlocks.lock_face.person_name is '姓名';
|
||||
comment on column iotlocks.lock_face.person_type is '人员类型(0住户 1员工 2访客 3其他)';
|
||||
comment on column iotlocks.lock_face.phone is '联系电话';
|
||||
comment on column iotlocks.lock_face.photo_url is '人脸图片URL';
|
||||
comment on column iotlocks.lock_face.photo_md5 is '图片指纹(用于变更检测与去重)';
|
||||
comment on column iotlocks.lock_face.feature_data is '人脸特征值(base64编码)';
|
||||
comment on column iotlocks.lock_face.feature_md5 is '特征指纹(变更检测与幂等下发用)';
|
||||
comment on column iotlocks.lock_face.feature_algo_version is '特征算法版本(提取时实际使用的 algorithm_version)';
|
||||
comment on column iotlocks.lock_face.feature_size is '特征字节数';
|
||||
comment on column iotlocks.lock_face.extract_status is '特征提取状态(0未提取 1成功 2失败)';
|
||||
comment on column iotlocks.lock_face.extract_time is '特征提取时间';
|
||||
comment on column iotlocks.lock_face.extract_msg is '特征提取失败原因';
|
||||
comment on column iotlocks.lock_face.status is '状态(0正常 1停用)';
|
||||
comment on column iotlocks.lock_face.del_flag is '删除标志(0代表存在 2代表删除)';
|
||||
comment on column iotlocks.lock_face.create_by is '创建者';
|
||||
comment on column iotlocks.lock_face.create_time is '创建时间';
|
||||
comment on column iotlocks.lock_face.update_by is '更新者';
|
||||
comment on column iotlocks.lock_face.update_time is '更新时间';
|
||||
comment on column iotlocks.lock_face.remark is '备注';
|
||||
|
||||
create unique index uk_lock_face_person_no on iotlocks.lock_face (person_no);
|
||||
create index idx_lock_face_name on iotlocks.lock_face (person_name);
|
||||
create index idx_lock_face_extract on iotlocks.lock_face (extract_status);
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 5、授权数据表
|
||||
-- 业务含义:把某个人员(person_no)在某个门锁(device_id)上的某类凭证
|
||||
-- (人脸/密码/指纹/IC卡)授权关系落库,并跟踪下发到设备的同步状态。
|
||||
-- 协议对应:ydlink/{groupCode}/thing/data/batch 的 params 数组(add/delete)。
|
||||
-- =========================================================================
|
||||
drop table if exists iotlocks.lock_auth;
|
||||
create table iotlocks.lock_auth (
|
||||
auth_id bigserial not null,
|
||||
auth_no varchar(64) not null,
|
||||
person_no varchar(32) not null,
|
||||
person_name varchar(64) default null,
|
||||
device_id bigint not null,
|
||||
device_sn varchar(32) default null,
|
||||
gateway_id bigint default null,
|
||||
group_id bigint default null,
|
||||
auth_type char(2) not null,
|
||||
auth_value text,
|
||||
auth_value_md5 varchar(32) default null,
|
||||
begin_time timestamp,
|
||||
end_time timestamp,
|
||||
auth_time timestamp,
|
||||
sync_status char(1) default '0',
|
||||
sync_time timestamp,
|
||||
sync_msg varchar(512) default null,
|
||||
retry_count int default 0,
|
||||
status char(1) default '0',
|
||||
del_flag char(1) default '0',
|
||||
create_by varchar(64) default '',
|
||||
create_time timestamp,
|
||||
update_by varchar(64) default '',
|
||||
update_time timestamp,
|
||||
remark varchar(500) default null,
|
||||
primary key (auth_id)
|
||||
);
|
||||
|
||||
comment on table iotlocks.lock_auth is '授权数据表';
|
||||
comment on column iotlocks.lock_auth.auth_id is '授权ID';
|
||||
comment on column iotlocks.lock_auth.auth_no is '授权编号(业务唯一,建议规则 AUTH+日期+序号)';
|
||||
comment on column iotlocks.lock_auth.person_no is '人员编号(lock_face.person_no)';
|
||||
comment on column iotlocks.lock_auth.person_name is '冗余人员姓名';
|
||||
comment on column iotlocks.lock_auth.device_id is '授权锁ID(lock_device.device_id)';
|
||||
comment on column iotlocks.lock_auth.device_sn is '冗余门锁SN(下发组包直接用)';
|
||||
comment on column iotlocks.lock_auth.gateway_id is '冗余网关ID';
|
||||
comment on column iotlocks.lock_auth.group_id is '冗余分组ID(决定下发主题)';
|
||||
comment on column iotlocks.lock_auth.auth_type is '授权类型(01人脸 02密码 03指纹 04IC卡)';
|
||||
comment on column iotlocks.lock_auth.auth_value is '授权内容(人脸特征base64/密码密文/指纹特征/IC卡号)';
|
||||
comment on column iotlocks.lock_auth.auth_value_md5 is '授权内容指纹(变更检测与重复下发判断)';
|
||||
comment on column iotlocks.lock_auth.begin_time is '生效开始时间';
|
||||
comment on column iotlocks.lock_auth.end_time is '生效结束时间(空表示永久有效)';
|
||||
comment on column iotlocks.lock_auth.auth_time is '授权操作时间';
|
||||
comment on column iotlocks.lock_auth.sync_status is '下发同步状态(0待下发 1已下发 2下发成功 3下发失败 4已清除)';
|
||||
comment on column iotlocks.lock_auth.sync_time is '最后下发/响应时间';
|
||||
comment on column iotlocks.lock_auth.sync_msg is '下发结果说明';
|
||||
comment on column iotlocks.lock_auth.retry_count is '下发重试次数';
|
||||
comment on column iotlocks.lock_auth.status is '状态(0正常 1停用)';
|
||||
comment on column iotlocks.lock_auth.del_flag is '删除标志(0代表存在 2代表删除)';
|
||||
comment on column iotlocks.lock_auth.create_by is '创建者';
|
||||
comment on column iotlocks.lock_auth.create_time is '创建时间';
|
||||
comment on column iotlocks.lock_auth.update_by is '更新者';
|
||||
comment on column iotlocks.lock_auth.update_time is '更新时间';
|
||||
comment on column iotlocks.lock_auth.remark is '备注';
|
||||
|
||||
create unique index uk_lock_auth_no on iotlocks.lock_auth (auth_no);
|
||||
create unique index uk_lock_auth_person_lock on iotlocks.lock_auth (person_no, device_id, auth_type);
|
||||
create index idx_lock_auth_person on iotlocks.lock_auth (person_no);
|
||||
create index idx_lock_auth_device on iotlocks.lock_auth (device_id);
|
||||
create index idx_lock_auth_group on iotlocks.lock_auth (group_id);
|
||||
create index idx_lock_auth_sync on iotlocks.lock_auth (sync_status);
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 6、门禁通行日志表
|
||||
-- 业务含义:设备通过 ydlink/{groupCode}/thing/event/trigger(op=lockrecord)
|
||||
-- 上报的开门记录。本表为高频只追加表,故不设 del_flag / update_*。
|
||||
--
|
||||
-- 【性能提示】单公寓千级住户、日均万级记录时,建议按 open_time 做月度
|
||||
-- 范围分区(KingbaseES 支持声明式分区),或按 recv_time 定期归档。
|
||||
-- =========================================================================
|
||||
drop table if exists iotlocks.lock_access_log;
|
||||
create table iotlocks.lock_access_log (
|
||||
log_id bigserial not null,
|
||||
device_id bigint default null,
|
||||
device_sn varchar(32) not null,
|
||||
gateway_id bigint default null,
|
||||
gateway_sn varchar(32) default null,
|
||||
group_id bigint default null,
|
||||
person_no varchar(32) default null,
|
||||
person_name varchar(64) default null,
|
||||
card_no varchar(32) default null,
|
||||
-- 以下三项均为设备原样上报的编码:open_type 实测为 "7",open_dir 实测为 "14"/"16",
|
||||
-- 长度不固定,故统一用 varchar(8),不能用 char(n)
|
||||
open_type varchar(8) default null,
|
||||
open_result varchar(8) default null,
|
||||
open_dir varchar(8) default null,
|
||||
open_time timestamp,
|
||||
recv_time timestamp,
|
||||
seq varchar(32) default null,
|
||||
raw_params text,
|
||||
create_time timestamp,
|
||||
remark varchar(500) default null,
|
||||
primary key (log_id)
|
||||
);
|
||||
|
||||
comment on table iotlocks.lock_access_log is '门禁通行日志表';
|
||||
comment on column iotlocks.lock_access_log.log_id is '日志ID';
|
||||
comment on column iotlocks.lock_access_log.device_id is '门锁ID(解析device_sn得到,未登记时为空)';
|
||||
comment on column iotlocks.lock_access_log.device_sn is '门锁SN';
|
||||
comment on column iotlocks.lock_access_log.gateway_id is '上报网关ID';
|
||||
comment on column iotlocks.lock_access_log.gateway_sn is '上报网关SN';
|
||||
comment on column iotlocks.lock_access_log.group_id is '所属分组ID';
|
||||
comment on column iotlocks.lock_access_log.person_no is '人员编号';
|
||||
comment on column iotlocks.lock_access_log.person_name is '冗余人员姓名';
|
||||
comment on column iotlocks.lock_access_log.card_no is '卡号/凭证号';
|
||||
comment on column iotlocks.lock_access_log.open_type is '开门方式(字典 lock_open_type)';
|
||||
comment on column iotlocks.lock_access_log.open_result is '开门结果(0失败 1成功)';
|
||||
comment on column iotlocks.lock_access_log.open_dir is '开门方向(0进门 1出门 空未知)';
|
||||
comment on column iotlocks.lock_access_log.open_time is '开门时间(设备上报时间)';
|
||||
comment on column iotlocks.lock_access_log.recv_time is '服务端接收时间';
|
||||
comment on column iotlocks.lock_access_log.seq is '报文序号(用于幂等去重)';
|
||||
comment on column iotlocks.lock_access_log.raw_params is '原始params数组(JSON,便于协议字段二次解析)';
|
||||
comment on column iotlocks.lock_access_log.create_time is '创建时间';
|
||||
comment on column iotlocks.lock_access_log.remark is '备注';
|
||||
|
||||
create index idx_lock_access_log_device on iotlocks.lock_access_log (device_sn);
|
||||
create index idx_lock_access_log_person on iotlocks.lock_access_log (person_no);
|
||||
create index idx_lock_access_log_time on iotlocks.lock_access_log (open_time);
|
||||
create index idx_lock_access_log_seq on iotlocks.lock_access_log (device_sn, seq);
|
||||
create index idx_lock_access_log_group on iotlocks.lock_access_log (group_id);
|
||||
|
||||
-- 已有环境增量升级:开门记录上报值长度不固定(open_type="7"、open_dir="14"/"16"),原 char(n) 装不下
|
||||
alter table iotlocks.lock_access_log alter column open_type type varchar(8);
|
||||
alter table iotlocks.lock_access_log alter column open_result type varchar(8);
|
||||
alter table iotlocks.lock_access_log alter column open_dir type varchar(8);
|
||||
|
||||
-- 已有环境增量升级:补充设备实测开门方式编码(lockrecord params[2]:7 人脸开门、2 密码开锁)
|
||||
delete from iotlocks.sys_dict_data where dict_type = 'lock_open_type' and dict_value in ('7', '2');
|
||||
insert into iotlocks.sys_dict_data
|
||||
(dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark)
|
||||
values
|
||||
(117, 7, '人脸', '7', 'lock_open_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, '设备实测编码,待完整协议对齐后统一'),
|
||||
(118, 8, '密码开锁', '2', 'lock_open_type', '', 'success', 'N', '0', 'admin', CURRENT_TIMESTAMP, '密码开锁时人员编号位为开锁密码');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 7、下行命令记录表
|
||||
-- 业务含义:所有平台→设备的指令统一下发留痕,支撑响应匹配、失败重试、
|
||||
-- 离线补发与操作审计。覆盖:绑定/解绑门锁、同步时间、远程开关锁、重启网关、
|
||||
-- 修改网络/LORA/MQTT参数、保存配置、授权下发、清除授权、清除门锁。
|
||||
-- =========================================================================
|
||||
drop table if exists iotlocks.lock_command;
|
||||
create table iotlocks.lock_command (
|
||||
command_id bigserial not null,
|
||||
command_no varchar(64) not null,
|
||||
command_type char(4) not null,
|
||||
target_type char(1) not null,
|
||||
target_id bigint default null,
|
||||
target_code varchar(32) default null,
|
||||
biz_id bigint default null,
|
||||
topic varchar(255) default null,
|
||||
payload text,
|
||||
req_time timestamp,
|
||||
resp_topic varchar(255) default null,
|
||||
resp_payload text,
|
||||
resp_time timestamp,
|
||||
command_status char(1) default '0',
|
||||
retry_count int default 0,
|
||||
max_retry int default 3,
|
||||
next_retry_time timestamp,
|
||||
gateway_ack char(1) default '0',
|
||||
device_ack char(1) default '0',
|
||||
device_result char(1) default null,
|
||||
error_msg varchar(512) default null,
|
||||
create_by varchar(64) default '',
|
||||
create_time timestamp,
|
||||
update_by varchar(64) default '',
|
||||
update_time timestamp,
|
||||
remark varchar(500) default null,
|
||||
primary key (command_id)
|
||||
);
|
||||
|
||||
comment on table iotlocks.lock_command is '下行命令记录表';
|
||||
comment on column iotlocks.lock_command.command_id is '命令ID';
|
||||
comment on column iotlocks.lock_command.command_no is '命令编号(对应协议seq,全局唯一)';
|
||||
comment on column iotlocks.lock_command.command_type is '命令类型(字典 lock_command_type)';
|
||||
comment on column iotlocks.lock_command.target_type is '目标类型(1网关 2门锁 3分组)';
|
||||
comment on column iotlocks.lock_command.target_id is '目标对象ID';
|
||||
comment on column iotlocks.lock_command.target_code is '目标编号(网关SN/门锁SN/分组编号,用于主题拼装)';
|
||||
comment on column iotlocks.lock_command.biz_id is '关联业务ID(如授权下发时指向 lock_auth.auth_id)';
|
||||
comment on column iotlocks.lock_command.topic is '下发主题';
|
||||
comment on column iotlocks.lock_command.payload is '下发报文内容';
|
||||
comment on column iotlocks.lock_command.req_time is '下发时间';
|
||||
comment on column iotlocks.lock_command.resp_topic is '响应主题';
|
||||
comment on column iotlocks.lock_command.resp_payload is '响应报文内容';
|
||||
comment on column iotlocks.lock_command.resp_time is '响应时间';
|
||||
comment on column iotlocks.lock_command.command_status is '命令状态(0待发送 1已发送 2成功 3失败 4超时 5已取消)';
|
||||
comment on column iotlocks.lock_command.retry_count is '已重试次数';
|
||||
comment on column iotlocks.lock_command.max_retry is '最大重试次数';
|
||||
comment on column iotlocks.lock_command.next_retry_time is '下次重试时间(补偿任务扫描用)';
|
||||
comment on column iotlocks.lock_command.gateway_ack is '是否已收到网关回执(0否 1是)';
|
||||
comment on column iotlocks.lock_command.device_ack is '是否已收到门锁回执(0否 1是)';
|
||||
comment on column iotlocks.lock_command.device_result is '门锁回执结果(0失败 1成功),双回执齐备才判定命令成功';
|
||||
comment on column iotlocks.lock_command.error_msg is '失败原因';
|
||||
comment on column iotlocks.lock_command.create_by is '创建者';
|
||||
comment on column iotlocks.lock_command.create_time is '创建时间';
|
||||
comment on column iotlocks.lock_command.update_by is '更新者';
|
||||
comment on column iotlocks.lock_command.update_time is '更新时间';
|
||||
comment on column iotlocks.lock_command.remark is '备注';
|
||||
|
||||
create unique index uk_lock_command_no on iotlocks.lock_command (command_no);
|
||||
create index idx_lock_command_status on iotlocks.lock_command (command_status);
|
||||
create index idx_lock_command_target on iotlocks.lock_command (target_code);
|
||||
create index idx_lock_command_time on iotlocks.lock_command (req_time);
|
||||
create index idx_lock_command_retry on iotlocks.lock_command (command_status, next_retry_time);
|
||||
|
||||
-- 已有环境增量升级(双回执):以下 add column 带 if not exists,重复执行不会报错
|
||||
alter table iotlocks.lock_command add column if not exists gateway_ack char(1) default '0';
|
||||
alter table iotlocks.lock_command add column if not exists device_ack char(1) default '0';
|
||||
alter table iotlocks.lock_command add column if not exists device_result char(1) default null;
|
||||
|
||||
comment on column iotlocks.lock_command.gateway_ack is '是否已收到网关回执(0否 1是)';
|
||||
comment on column iotlocks.lock_command.device_ack is '是否已收到门锁回执(0否 1是)';
|
||||
comment on column iotlocks.lock_command.device_result is '门锁回执结果(0失败 1成功),双回执齐备才判定命令成功';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 8、MQTT 报文留痕表
|
||||
-- 业务含义:上下行原始报文的落库留痕,用于协议联调、问题回溯与审计。
|
||||
-- 可通过配置开关(仅记录收发/记录全部)控制写入量。
|
||||
-- =========================================================================
|
||||
drop table if exists iotlocks.lock_mqtt_log;
|
||||
create table iotlocks.lock_mqtt_log (
|
||||
log_id bigserial not null,
|
||||
direction char(1) not null,
|
||||
topic varchar(255) not null,
|
||||
group_code varchar(32) default null,
|
||||
gateway_sn varchar(32) default null,
|
||||
device_sn varchar(32) default null,
|
||||
op varchar(32) default null,
|
||||
mode varchar(8) default null,
|
||||
ac varchar(8) default null,
|
||||
seq varchar(32) default null,
|
||||
qos smallint default 1,
|
||||
retained char(1) default '0',
|
||||
payload text,
|
||||
chksum varchar(32) default null,
|
||||
verify_status char(1) default '0',
|
||||
handle_status char(1) default '0',
|
||||
handle_msg varchar(512) default null,
|
||||
cost_time int default 0,
|
||||
recv_time timestamp,
|
||||
create_time timestamp,
|
||||
primary key (log_id)
|
||||
);
|
||||
|
||||
comment on table iotlocks.lock_mqtt_log is 'MQTT报文留痕表';
|
||||
comment on column iotlocks.lock_mqtt_log.log_id is '日志ID';
|
||||
comment on column iotlocks.lock_mqtt_log.direction is '方向(1上行设备→平台 2下行平台→设备)';
|
||||
comment on column iotlocks.lock_mqtt_log.topic is 'MQTT主题';
|
||||
comment on column iotlocks.lock_mqtt_log.group_code is '解析出的分组编号';
|
||||
comment on column iotlocks.lock_mqtt_log.gateway_sn is '解析出的网关SN';
|
||||
comment on column iotlocks.lock_mqtt_log.device_sn is '解析出的设备SN(协议devId)';
|
||||
comment on column iotlocks.lock_mqtt_log.op is '操作类型(协议op)';
|
||||
comment on column iotlocks.lock_mqtt_log.mode is '方向标识(s2d服务端→设备 d2s设备→服务端)';
|
||||
comment on column iotlocks.lock_mqtt_log.ac is '动作类型(协议ac)';
|
||||
comment on column iotlocks.lock_mqtt_log.seq is '报文序号(协议seq)';
|
||||
comment on column iotlocks.lock_mqtt_log.qos is '服务质量';
|
||||
comment on column iotlocks.lock_mqtt_log.retained is '是否保留消息(0否 1是)';
|
||||
comment on column iotlocks.lock_mqtt_log.payload is '报文原文';
|
||||
comment on column iotlocks.lock_mqtt_log.chksum is '报文校验和';
|
||||
comment on column iotlocks.lock_mqtt_log.verify_status is '校验结果(0未校验 1通过 2失败)';
|
||||
comment on column iotlocks.lock_mqtt_log.handle_status is '处理状态(0待处理 1成功 2失败 3已忽略)';
|
||||
comment on column iotlocks.lock_mqtt_log.handle_msg is '处理结果说明';
|
||||
comment on column iotlocks.lock_mqtt_log.cost_time is '处理耗时(毫秒)';
|
||||
comment on column iotlocks.lock_mqtt_log.recv_time is '接收/发送时间';
|
||||
comment on column iotlocks.lock_mqtt_log.create_time is '创建时间';
|
||||
|
||||
create index idx_lock_mqtt_log_topic on iotlocks.lock_mqtt_log (topic);
|
||||
create index idx_lock_mqtt_log_device on iotlocks.lock_mqtt_log (device_sn);
|
||||
create index idx_lock_mqtt_log_time on iotlocks.lock_mqtt_log (recv_time);
|
||||
create index idx_lock_mqtt_log_handle on iotlocks.lock_mqtt_log (handle_status);
|
||||
create index idx_lock_mqtt_log_seq on iotlocks.lock_mqtt_log (seq);
|
||||
create index idx_lock_mqtt_log_direct on iotlocks.lock_mqtt_log (direction);
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 9、服务参数配置表
|
||||
-- 业务含义:承载“系统参数”中的 MQTT 服务器配置、人脸特征提取服务配置
|
||||
-- 以及其它平台参数。采用 结构化分类字段 + JSON 值 的折中方案:
|
||||
-- 新增配置项无需改表,前端按 config_type 渲染不同表单。
|
||||
--
|
||||
-- config_value JSON 约定:
|
||||
-- config_type=01(MQTT服务器)
|
||||
-- {"brokerUrl":"tcp://127.0.0.1:1883","clientId":"","username":"","password":"",
|
||||
-- "defaultQos":1,"cleanSession":true,"keepAlive":60,"connectionTimeout":30}
|
||||
-- config_type=02(人脸特征服务)
|
||||
-- 协议:POST multipart/form-data,表单字段名 file,值为图片文件
|
||||
-- 返回:{"functionSuccess":true,"resultSuccess":true,"resultData":"特征base64","msg":"处理成功..."}
|
||||
-- {"endpoint":"http://192.168.1.202:8802/bdws_api/Third/Api/Easen/getFaceFeatureData","timeout":10000}
|
||||
-- 未配置时使用代码内置默认地址(同上)
|
||||
-- config_type=03(平台参数)
|
||||
-- {"accessLogKeepDays":180,"mqttLogLevel":"error","commandTimeout":10,"maxRetry":3}
|
||||
-- =========================================================================
|
||||
drop table if exists iotlocks.lock_service_config;
|
||||
create table iotlocks.lock_service_config (
|
||||
config_id bigserial not null,
|
||||
config_name varchar(100) not null,
|
||||
config_type char(2) not null,
|
||||
config_value text,
|
||||
group_id bigint default null,
|
||||
is_default char(1) default '1',
|
||||
enabled char(1) default '0',
|
||||
status char(1) default '0',
|
||||
del_flag char(1) default '0',
|
||||
create_by varchar(64) default '',
|
||||
create_time timestamp,
|
||||
update_by varchar(64) default '',
|
||||
update_time timestamp,
|
||||
remark varchar(500) default null,
|
||||
primary key (config_id)
|
||||
);
|
||||
|
||||
comment on table iotlocks.lock_service_config is '服务参数配置表';
|
||||
comment on column iotlocks.lock_service_config.config_id is '配置ID';
|
||||
comment on column iotlocks.lock_service_config.config_name is '配置名称';
|
||||
comment on column iotlocks.lock_service_config.config_type is '配置类型(01MQTT服务器 02人脸特征服务 03平台参数,字典 lock_config_type)';
|
||||
comment on column iotlocks.lock_service_config.config_value is '配置内容(JSON)';
|
||||
comment on column iotlocks.lock_service_config.group_id is '归属分组ID(为空表示全局默认)';
|
||||
comment on column iotlocks.lock_service_config.is_default is '是否默认(0是 1否)';
|
||||
comment on column iotlocks.lock_service_config.enabled is '是否启用(0启用 1停用)';
|
||||
comment on column iotlocks.lock_service_config.status is '状态(0正常 1停用)';
|
||||
comment on column iotlocks.lock_service_config.del_flag is '删除标志(0代表存在 2代表删除)';
|
||||
comment on column iotlocks.lock_service_config.create_by is '创建者';
|
||||
comment on column iotlocks.lock_service_config.create_time is '创建时间';
|
||||
comment on column iotlocks.lock_service_config.update_by is '更新者';
|
||||
comment on column iotlocks.lock_service_config.update_time is '更新时间';
|
||||
comment on column iotlocks.lock_service_config.remark is '备注';
|
||||
|
||||
create unique index uk_lock_service_config_name on iotlocks.lock_service_config (config_name, config_type);
|
||||
create index idx_lock_service_config_type on iotlocks.lock_service_config (config_type);
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 10、字典数据初始化
|
||||
-- 先按 dict_type 清理,保证脚本可重复执行。
|
||||
-- =========================================================================
|
||||
delete from iotlocks.sys_dict_data where dict_type in
|
||||
('lock_online_status','lock_open_type','lock_open_result','lock_auth_type',
|
||||
'lock_command_type','lock_command_status','lock_sync_status','lock_handle_status',
|
||||
'lock_config_type','lock_extract_status','lock_person_type','lock_target_type');
|
||||
delete from iotlocks.sys_dict_type where dict_type in
|
||||
('lock_online_status','lock_open_type','lock_open_result','lock_auth_type',
|
||||
'lock_command_type','lock_command_status','lock_sync_status','lock_handle_status',
|
||||
'lock_config_type','lock_extract_status','lock_person_type','lock_target_type');
|
||||
|
||||
insert into iotlocks.sys_dict_type (dict_id, dict_name, dict_type, status, create_by, create_time, remark) values
|
||||
(100, '门禁设备在线状态', 'lock_online_status', '0', 'admin', CURRENT_TIMESTAMP, '网关/门锁在线状态列表'),
|
||||
(101, '门禁开门方式', 'lock_open_type', '0', 'admin', CURRENT_TIMESTAMP, '需与设备协议锁定值对齐'),
|
||||
(102, '门禁开门结果', 'lock_open_result', '0', 'admin', CURRENT_TIMESTAMP, '开门结果列表'),
|
||||
(103, '门禁授权类型', 'lock_auth_type', '0', 'admin', CURRENT_TIMESTAMP, '人脸/密码/指纹/IC卡'),
|
||||
(104, '门禁命令类型', 'lock_command_type', '0', 'admin', CURRENT_TIMESTAMP, '下行命令类型列表'),
|
||||
(105, '门禁命令状态', 'lock_command_status','0', 'admin', CURRENT_TIMESTAMP, '命令下发状态列表'),
|
||||
(106, '门禁授权同步状态', 'lock_sync_status', '0', 'admin', CURRENT_TIMESTAMP, '授权下发同步状态列表'),
|
||||
(107, '门禁报文处理状态', 'lock_handle_status', '0', 'admin', CURRENT_TIMESTAMP, 'MQTT报文处理状态列表'),
|
||||
(108, '门禁服务配置类型', 'lock_config_type', '0', 'admin', CURRENT_TIMESTAMP, '服务参数配置类型列表'),
|
||||
(109, '人脸特征提取状态', 'lock_extract_status','0', 'admin', CURRENT_TIMESTAMP, '人脸特征提取状态列表'),
|
||||
(110, '门禁人员类型', 'lock_person_type', '0', 'admin', CURRENT_TIMESTAMP, '人员类型列表'),
|
||||
(111, '门禁命令目标类型', 'lock_target_type', '0', 'admin', CURRENT_TIMESTAMP, '命令下发目标类型列表');
|
||||
|
||||
insert into iotlocks.sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) values
|
||||
-- 在线状态
|
||||
(100, 1, '在线', '0', 'lock_online_status', '', 'success', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(101, 2, '离线', '1', 'lock_online_status', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(102, 3, '未知', '2', 'lock_online_status', '', 'info', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 开门方式(【待确认】以下为拟定编码,须与设备协议 lockrecord 帧字段逐值核对后修订)
|
||||
(110, 1, '人脸', '01', 'lock_open_type', '', 'primary', 'Y', '0', 'admin', CURRENT_TIMESTAMP, '待与设备协议对齐'),
|
||||
(111, 2, '密码', '02', 'lock_open_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, '待与设备协议对齐'),
|
||||
(112, 3, '指纹', '03', 'lock_open_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, '待与设备协议对齐'),
|
||||
(113, 4, 'IC卡', '04', 'lock_open_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, '待与设备协议对齐'),
|
||||
(114, 5, '远程开锁','05','lock_open_type', '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, '平台下发开锁'),
|
||||
(115, 6, '机械钥匙','06','lock_open_type', '', 'info', 'N', '0', 'admin', CURRENT_TIMESTAMP, '待与设备协议对齐'),
|
||||
(116, 9, '其他', '99', 'lock_open_type', '', 'info', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 设备实际上报的开门方式编码(lockrecord params[2]:7 人脸开门、2 密码开锁)
|
||||
(117, 7, '人脸', '7', 'lock_open_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, '设备实测编码,待完整协议对齐后统一'),
|
||||
(118, 8, '密码开锁', '2', 'lock_open_type', '', 'success', 'N', '0', 'admin', CURRENT_TIMESTAMP, '设备实测编码,密码开锁时人员编号位为开锁密码'),
|
||||
-- 开门结果
|
||||
(120, 1, '失败', '0', 'lock_open_result', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(121, 2, '成功', '1', 'lock_open_result', '', 'success', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 授权类型
|
||||
(130, 1, '人脸', '01', 'lock_auth_type', '', 'primary', 'Y', '0', 'admin', CURRENT_TIMESTAMP, 'op=facefeature'),
|
||||
(131, 2, '密码', '02', 'lock_auth_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'op=password'),
|
||||
(132, 3, '指纹', '03', 'lock_auth_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(133, 4, 'IC卡', '04', 'lock_auth_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'op=iccard'),
|
||||
-- 命令类型
|
||||
(140, 1, '绑定门锁', '0001', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(141, 2, '解绑门锁', '0002', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(142, 3, '同步门锁时间', '0003', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(143, 4, '远程开锁', '0004', 'lock_command_type', '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{grpId}/thing/action/execute'),
|
||||
(144, 5, '远程关锁', '0005', 'lock_command_type', '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{grpId}/thing/action/execute'),
|
||||
(145, 6, '重启网关', '0006', 'lock_command_type', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(146, 7, '修改网络参数', '0007', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(147, 8, '修改LORA参数', '0008', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(148, 9, '修改MQTT参数', '0009', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(149, 10, '保存配置', '0010', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(150, 11, '授权下发', '0011', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{grpId}/thing/data/batch'),
|
||||
(151, 12, '清除授权', '0012', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{grpId}/thing/data/batch'),
|
||||
(152, 13, '清除门锁', '0013', 'lock_command_type', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
-- 命令状态
|
||||
(160, 1, '待发送', '0', 'lock_command_status', '', 'info', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(161, 2, '已发送', '1', 'lock_command_status', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(162, 3, '成功', '2', 'lock_command_status', '', 'success', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(163, 4, '失败', '3', 'lock_command_status', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(164, 5, '超时', '4', 'lock_command_status', '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(165, 6, '已取消', '5', 'lock_command_status', '', 'info', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 授权同步状态
|
||||
(170, 1, '待下发', '0', 'lock_sync_status', '', 'info', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(171, 2, '已下发', '1', 'lock_sync_status', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(172, 3, '下发成功', '2', 'lock_sync_status', '', 'success', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(173, 4, '下发失败', '3', 'lock_sync_status', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(174, 5, '已清除', '4', 'lock_sync_status', '', 'info', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 报文处理状态
|
||||
(180, 1, '待处理', '0', 'lock_handle_status', '', 'info', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(181, 2, '成功', '1', 'lock_handle_status', '', 'success', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(182, 3, '失败', '2', 'lock_handle_status', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(183, 4, '已忽略', '3', 'lock_handle_status', '', 'info', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 服务配置类型
|
||||
(190, 1, 'MQTT服务器', '01', 'lock_config_type', '', 'primary', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(191, 2, '人脸特征服务', '02', 'lock_config_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(192, 3, '平台参数', '03', 'lock_config_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 特征提取状态
|
||||
(200, 1, '未提取', '0', 'lock_extract_status', '', 'info', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(201, 2, '成功', '1', 'lock_extract_status', '', 'success', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(202, 3, '失败', '2', 'lock_extract_status', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 人员类型
|
||||
(210, 1, '住户', '0', 'lock_person_type', '', 'primary', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(211, 2, '员工', '1', 'lock_person_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(212, 3, '访客', '2', 'lock_person_type', '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(213, 4, '其他', '3', 'lock_person_type', '', 'info', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 命令目标类型
|
||||
(220, 1, '网关', '1', 'lock_target_type', '', 'primary', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(221, 2, '门锁', '2', 'lock_target_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(222, 3, '分组', '3', 'lock_target_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, '');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 11、菜单初始化
|
||||
-- 使用 2000+ 号段(ry.sql 的菜单 setval 下限为 1999,不冲突)。
|
||||
-- 若依 admin 角色(role_key='admin')默认拥有全部菜单,无需写 sys_role_menu。
|
||||
-- =========================================================================
|
||||
delete from iotlocks.sys_menu where perms like 'lock:%';
|
||||
delete from iotlocks.sys_menu where menu_name = '门禁管理' and parent_id = 0;
|
||||
|
||||
-- 一级目录
|
||||
insert into iotlocks.sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2000, '门禁管理', 0, 4, 'iot', null, '', '', 1, 0, 'M', '0', '0', '', 'lock', 'admin', CURRENT_TIMESTAMP, '公寓人脸门禁系统目录');
|
||||
|
||||
-- 二级菜单:页面
|
||||
insert into iotlocks.sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2010, '公寓分组', 2000, 1, 'group', 'iot/group/index', '', '', 1, 0, 'C', '0', '0', 'lock:group:list', 'tree', 'admin', CURRENT_TIMESTAMP, '公寓分组菜单'),
|
||||
(2020, '门锁网关', 2000, 2, 'gateway', 'iot/gateway/index', '', '', 1, 0, 'C', '0', '0', 'lock:gateway:list', 'server', 'admin', CURRENT_TIMESTAMP, '门锁网关菜单'),
|
||||
(2030, '智能门锁', 2000, 3, 'device', 'iot/device/index', '', '', 1, 0, 'C', '0', '0', 'lock:device:list', 'lock', 'admin', CURRENT_TIMESTAMP, '智能门锁菜单'),
|
||||
(2040, '人脸数据', 2000, 4, 'face', 'iot/face/index', '', '', 1, 0, 'C', '0', '0', 'lock:face:list', 'peoples', 'admin', CURRENT_TIMESTAMP, '人脸数据菜单'),
|
||||
(2050, '授权管理', 2000, 5, 'auth', 'iot/auth/index', '', '', 1, 0, 'C', '0', '0', 'lock:auth:list', 'lock', 'admin', CURRENT_TIMESTAMP, '授权管理菜单'),
|
||||
(2060, '通行记录', 2000, 6, 'accesslog', 'iot/accesslog/index','', '', 1, 0, 'C', '0', '0', 'lock:accesslog:list','list', 'admin', CURRENT_TIMESTAMP, '通行记录菜单'),
|
||||
(2070, '命令记录', 2000, 7, 'command', 'iot/command/index', '', '', 1, 0, 'C', '0', '0', 'lock:command:list', 'job', 'admin', CURRENT_TIMESTAMP, '命令记录菜单'),
|
||||
(2080, '报文日志', 2000, 8, 'mqttlog', 'iot/mqttlog/index', '', '', 1, 0, 'C', '0', '0', 'lock:mqttlog:list', 'log', 'admin', CURRENT_TIMESTAMP, '报文日志菜单'),
|
||||
(2090, '系统参数', 2000, 9, 'config', 'iot/config/index', '', '', 1, 0, 'C', '0', '0', 'lock:config:list', 'edit', 'admin', CURRENT_TIMESTAMP, '系统参数菜单');
|
||||
|
||||
-- 三级菜单:按钮权限
|
||||
insert into iotlocks.sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
-- 公寓分组
|
||||
(2011, '分组查询', 2010, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:group:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2012, '分组新增', 2010, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:group:add', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2013, '分组修改', 2010, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:group:edit', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2014, '分组删除', 2010, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:group:remove', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2015, '分组导出', 2010, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:group:export', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 门锁网关
|
||||
(2021, '网关查询', 2020, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2022, '网关新增', 2020, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:add', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2023, '网关修改', 2020, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:edit', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2024, '网关删除', 2020, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:remove', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2025, '网关导出', 2020, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:export', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2026, '网关配置下发',2020, 6, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:config', '#', 'admin', CURRENT_TIMESTAMP, '修改网络/LORA/MQTT参数与保存配置'),
|
||||
(2027, '网关重启', 2020, 7, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:reboot', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2028, '网关绑定门锁',2020, 8, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:bind', '#', 'admin', CURRENT_TIMESTAMP, '绑定/清除门锁'),
|
||||
-- 智能门锁
|
||||
(2031, '门锁查询', 2030, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2032, '门锁新增', 2030, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:add', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2033, '门锁修改', 2030, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:edit', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2034, '门锁删除', 2030, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:remove', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2035, '门锁导出', 2030, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:export', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2036, '绑定/解绑网关',2030, 6, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:bind', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2037, '时间同步', 2030, 7, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:sync', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2038, '远程开锁', 2030, 8, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:open', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 人脸数据
|
||||
(2041, '人脸查询', 2040, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:face:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2042, '人脸新增', 2040, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:face:add', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2043, '人脸修改', 2040, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:face:edit', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2044, '人脸删除', 2040, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:face:remove', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2045, '人脸导出', 2040, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:face:export', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2046, '特征提取', 2040, 6, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:face:extract', '#', 'admin', CURRENT_TIMESTAMP, '调用人脸特征提取服务'),
|
||||
-- 授权管理
|
||||
(2051, '授权查询', 2050, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:auth:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2052, '授权新增', 2050, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:auth:add', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2053, '授权修改', 2050, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:auth:edit', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2054, '授权删除', 2050, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:auth:remove', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2055, '授权导出', 2050, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:auth:export', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2056, '授权下发', 2050, 6, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:auth:push', '#', 'admin', CURRENT_TIMESTAMP, '向设备下发授权'),
|
||||
(2057, '清除授权', 2050, 7, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:auth:clear', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 通行记录
|
||||
(2061, '记录查询', 2060, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:accesslog:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2062, '记录导出', 2060, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:accesslog:export', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 命令记录
|
||||
(2071, '命令查询', 2070, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:command:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2072, '命令重发', 2070, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:command:retry', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 报文日志
|
||||
(2081, '报文查询', 2080, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:mqttlog:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 系统参数
|
||||
(2091, '参数查询', 2090, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:config:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2092, '参数修改', 2090, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:config:edit', '#', 'admin', CURRENT_TIMESTAMP, '');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 12、序列复位
|
||||
-- 本脚本与 ry.sql 均以显式主键插入种子数据,bigserial 序列不会自动推进,
|
||||
-- 必须复位,否则后续通过页面新增记录会报主键冲突(23505)。
|
||||
-- =========================================================================
|
||||
select case when exists (select 1 from iotlocks.lock_group)
|
||||
then setval(pg_get_serial_sequence('iotlocks.lock_group', 'group_id'), greatest((select max(group_id) from iotlocks.lock_group), 0))
|
||||
else 1 end;
|
||||
select case when exists (select 1 from iotlocks.lock_gateway)
|
||||
then setval(pg_get_serial_sequence('iotlocks.lock_gateway', 'gateway_id'), greatest((select max(gateway_id) from iotlocks.lock_gateway), 0))
|
||||
else 1 end;
|
||||
select case when exists (select 1 from iotlocks.lock_device)
|
||||
then setval(pg_get_serial_sequence('iotlocks.lock_device', 'device_id'), greatest((select max(device_id) from iotlocks.lock_device), 0))
|
||||
else 1 end;
|
||||
select case when exists (select 1 from iotlocks.lock_face)
|
||||
then setval(pg_get_serial_sequence('iotlocks.lock_face', 'face_id'), greatest((select max(face_id) from iotlocks.lock_face), 0))
|
||||
else 1 end;
|
||||
select case when exists (select 1 from iotlocks.lock_auth)
|
||||
then setval(pg_get_serial_sequence('iotlocks.lock_auth', 'auth_id'), greatest((select max(auth_id) from iotlocks.lock_auth), 0))
|
||||
else 1 end;
|
||||
select case when exists (select 1 from iotlocks.lock_access_log)
|
||||
then setval(pg_get_serial_sequence('iotlocks.lock_access_log', 'log_id'), greatest((select max(log_id) from iotlocks.lock_access_log), 0))
|
||||
else 1 end;
|
||||
select case when exists (select 1 from iotlocks.lock_command)
|
||||
then setval(pg_get_serial_sequence('iotlocks.lock_command', 'command_id'), greatest((select max(command_id) from iotlocks.lock_command), 0))
|
||||
else 1 end;
|
||||
select case when exists (select 1 from iotlocks.lock_mqtt_log)
|
||||
then setval(pg_get_serial_sequence('iotlocks.lock_mqtt_log', 'log_id'), greatest((select max(log_id) from iotlocks.lock_mqtt_log), 0))
|
||||
else 1 end;
|
||||
select case when exists (select 1 from iotlocks.lock_service_config)
|
||||
then setval(pg_get_serial_sequence('iotlocks.lock_service_config', 'config_id'), greatest((select max(config_id) from iotlocks.lock_service_config), 0))
|
||||
else 1 end;
|
||||
select case when exists (select 1 from iotlocks.sys_menu where menu_id >= 2000)
|
||||
then setval(pg_get_serial_sequence('iotlocks.sys_menu', 'menu_id'), greatest((select max(menu_id) from iotlocks.sys_menu), 2999))
|
||||
else 1 end;
|
||||
select case when exists (select 1 from iotlocks.sys_dict_type)
|
||||
then setval(pg_get_serial_sequence('iotlocks.sys_dict_type', 'dict_id'), greatest((select max(dict_id) from iotlocks.sys_dict_type), 199))
|
||||
else 1 end;
|
||||
select case when exists (select 1 from iotlocks.sys_dict_data)
|
||||
then setval(pg_get_serial_sequence('iotlocks.sys_dict_data', 'dict_code'), greatest((select max(dict_code) from iotlocks.sys_dict_data), 299))
|
||||
else 1 end;
|
||||
|
||||
-- =========================================================================
|
||||
-- 脚本结束
|
||||
-- =========================================================================
|
||||
@@ -0,0 +1,290 @@
|
||||
-- =========================================================================
|
||||
-- 人大金仓 KingbaseES 初始化脚本
|
||||
--
|
||||
-- 重要:KingbaseES 在 sys_catalog 系统模式下内置了名为 sys_user 的系统对象
|
||||
-- (存放数据库用户/角色信息),与若依业务表 sys_user 同名。未限定 schema
|
||||
-- 时,部分函数(如 pg_get_serial_sequence)可能命中系统对象并报错:
|
||||
-- SQL 错误 [42809]: ERROR: "sys_user" 不是一个表
|
||||
--
|
||||
-- 处理方式:本脚本所有对象一律使用 iotlocks.<对象名> 显式限定,
|
||||
-- 不再依赖 search_path,因此不会命中系统内置的同名对象。
|
||||
-- 若业务表建在其它模式,请把本文件中的 iotlocks 替换为该模式名。
|
||||
-- =========================================================================
|
||||
|
||||
set search_path to iotlocks;
|
||||
|
||||
DROP TABLE IF EXISTS iotlocks.QRTZ_FIRED_TRIGGERS;
|
||||
DROP TABLE IF EXISTS iotlocks.QRTZ_PAUSED_TRIGGER_GRPS;
|
||||
DROP TABLE IF EXISTS iotlocks.QRTZ_SCHEDULER_STATE;
|
||||
DROP TABLE IF EXISTS iotlocks.QRTZ_LOCKS;
|
||||
DROP TABLE IF EXISTS iotlocks.QRTZ_SIMPLE_TRIGGERS;
|
||||
DROP TABLE IF EXISTS iotlocks.QRTZ_SIMPROP_TRIGGERS;
|
||||
DROP TABLE IF EXISTS iotlocks.QRTZ_CRON_TRIGGERS;
|
||||
DROP TABLE IF EXISTS iotlocks.QRTZ_BLOB_TRIGGERS;
|
||||
DROP TABLE IF EXISTS iotlocks.QRTZ_TRIGGERS;
|
||||
DROP TABLE IF EXISTS iotlocks.QRTZ_JOB_DETAILS;
|
||||
DROP TABLE IF EXISTS iotlocks.QRTZ_CALENDARS;
|
||||
|
||||
-- ----------------------------
|
||||
-- 1、存储每一个已配置的 jobDetail 的详细信息
|
||||
-- ----------------------------
|
||||
create table iotlocks.QRTZ_JOB_DETAILS (
|
||||
sched_name varchar(120) not null,
|
||||
job_name varchar(200) not null,
|
||||
job_group varchar(200) not null,
|
||||
description varchar(250) null,
|
||||
job_class_name varchar(250) not null,
|
||||
is_durable varchar(1) not null,
|
||||
is_nonconcurrent varchar(1) not null,
|
||||
is_update_data varchar(1) not null,
|
||||
requests_recovery varchar(1) not null,
|
||||
job_data bytea null,
|
||||
primary key (sched_name, job_name, job_group)
|
||||
);
|
||||
|
||||
comment on table iotlocks.QRTZ_JOB_DETAILS is '任务详细信息表';
|
||||
comment on column iotlocks.QRTZ_JOB_DETAILS.sched_name is '调度名称';
|
||||
comment on column iotlocks.QRTZ_JOB_DETAILS.job_name is '任务名称';
|
||||
comment on column iotlocks.QRTZ_JOB_DETAILS.job_group is '任务组名';
|
||||
comment on column iotlocks.QRTZ_JOB_DETAILS.description is '相关介绍';
|
||||
comment on column iotlocks.QRTZ_JOB_DETAILS.job_class_name is '执行任务类名称';
|
||||
comment on column iotlocks.QRTZ_JOB_DETAILS.is_durable is '是否持久化';
|
||||
comment on column iotlocks.QRTZ_JOB_DETAILS.is_nonconcurrent is '是否并发';
|
||||
comment on column iotlocks.QRTZ_JOB_DETAILS.is_update_data is '是否更新数据';
|
||||
comment on column iotlocks.QRTZ_JOB_DETAILS.requests_recovery is '是否接受恢复执行';
|
||||
comment on column iotlocks.QRTZ_JOB_DETAILS.job_data is '存放持久化job对象';
|
||||
|
||||
-- ----------------------------
|
||||
-- 2、 存储已配置的 Trigger 的信息
|
||||
-- ----------------------------
|
||||
create table iotlocks.QRTZ_TRIGGERS (
|
||||
sched_name varchar(120) not null,
|
||||
trigger_name varchar(200) not null,
|
||||
trigger_group varchar(200) not null,
|
||||
job_name varchar(200) not null,
|
||||
job_group varchar(200) not null,
|
||||
description varchar(250) null,
|
||||
next_fire_time bigint null,
|
||||
prev_fire_time bigint null,
|
||||
priority integer null,
|
||||
trigger_state varchar(16) not null,
|
||||
trigger_type varchar(8) not null,
|
||||
start_time bigint not null,
|
||||
end_time bigint null,
|
||||
calendar_name varchar(200) null,
|
||||
misfire_instr smallint null,
|
||||
job_data bytea null,
|
||||
primary key (sched_name, trigger_name, trigger_group),
|
||||
foreign key (sched_name, job_name, job_group) references QRTZ_JOB_DETAILS(sched_name, job_name, job_group)
|
||||
);
|
||||
|
||||
comment on table iotlocks.QRTZ_TRIGGERS is '触发器详细信息表';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.sched_name is '调度名称';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.trigger_name is '触发器的名字';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.trigger_group is '触发器所属组的名字';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.job_name is 'qrtz_job_details表job_name的外键';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.job_group is 'qrtz_job_details表job_group的外键';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.description is '相关介绍';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.next_fire_time is '上一次触发时间(毫秒)';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.prev_fire_time is '下一次触发时间(默认为-1表示不触发)';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.priority is '优先级';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.trigger_state is '触发器状态';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.trigger_type is '触发器的类型';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.start_time is '开始时间';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.end_time is '结束时间';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.calendar_name is '日程表名称';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.misfire_instr is '补偿执行的策略';
|
||||
comment on column iotlocks.QRTZ_TRIGGERS.job_data is '存放持久化job对象';
|
||||
|
||||
-- ----------------------------
|
||||
-- 3、 存储简单的 Trigger,包括重复次数,间隔,以及已触发的次数
|
||||
-- ----------------------------
|
||||
create table iotlocks.QRTZ_SIMPLE_TRIGGERS (
|
||||
sched_name varchar(120) not null,
|
||||
trigger_name varchar(200) not null,
|
||||
trigger_group varchar(200) not null,
|
||||
repeat_count bigint not null,
|
||||
repeat_interval bigint not null,
|
||||
times_triggered bigint not null,
|
||||
primary key (sched_name, trigger_name, trigger_group),
|
||||
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
|
||||
);
|
||||
|
||||
comment on table iotlocks.QRTZ_SIMPLE_TRIGGERS is '简单触发器的信息表';
|
||||
comment on column iotlocks.QRTZ_SIMPLE_TRIGGERS.sched_name is '调度名称';
|
||||
comment on column iotlocks.QRTZ_SIMPLE_TRIGGERS.trigger_name is 'qrtz_triggers表trigger_name的外键';
|
||||
comment on column iotlocks.QRTZ_SIMPLE_TRIGGERS.trigger_group is 'qrtz_triggers表trigger_group的外键';
|
||||
comment on column iotlocks.QRTZ_SIMPLE_TRIGGERS.repeat_count is '重复的次数统计';
|
||||
comment on column iotlocks.QRTZ_SIMPLE_TRIGGERS.repeat_interval is '重复的间隔时间';
|
||||
comment on column iotlocks.QRTZ_SIMPLE_TRIGGERS.times_triggered is '已经触发的次数';
|
||||
|
||||
-- ----------------------------
|
||||
-- 4、 存储 Cron Trigger,包括 Cron 表达式和时区信息
|
||||
-- ----------------------------
|
||||
create table iotlocks.QRTZ_CRON_TRIGGERS (
|
||||
sched_name varchar(120) not null,
|
||||
trigger_name varchar(200) not null,
|
||||
trigger_group varchar(200) not null,
|
||||
cron_expression varchar(200) not null,
|
||||
time_zone_id varchar(80),
|
||||
primary key (sched_name, trigger_name, trigger_group),
|
||||
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
|
||||
);
|
||||
|
||||
comment on table iotlocks.QRTZ_CRON_TRIGGERS is 'Cron类型的触发器表';
|
||||
comment on column iotlocks.QRTZ_CRON_TRIGGERS.sched_name is '调度名称';
|
||||
comment on column iotlocks.QRTZ_CRON_TRIGGERS.trigger_name is 'qrtz_triggers表trigger_name的外键';
|
||||
comment on column iotlocks.QRTZ_CRON_TRIGGERS.trigger_group is 'qrtz_triggers表trigger_group的外键';
|
||||
comment on column iotlocks.QRTZ_CRON_TRIGGERS.cron_expression is 'cron表达式';
|
||||
comment on column iotlocks.QRTZ_CRON_TRIGGERS.time_zone_id is '时区';
|
||||
|
||||
-- ----------------------------
|
||||
-- 5、 Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)
|
||||
-- ----------------------------
|
||||
create table iotlocks.QRTZ_BLOB_TRIGGERS (
|
||||
sched_name varchar(120) not null,
|
||||
trigger_name varchar(200) not null,
|
||||
trigger_group varchar(200) not null,
|
||||
blob_data bytea null,
|
||||
primary key (sched_name, trigger_name, trigger_group),
|
||||
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
|
||||
);
|
||||
|
||||
comment on table iotlocks.QRTZ_BLOB_TRIGGERS is 'Blob类型的触发器表';
|
||||
comment on column iotlocks.QRTZ_BLOB_TRIGGERS.sched_name is '调度名称';
|
||||
comment on column iotlocks.QRTZ_BLOB_TRIGGERS.trigger_name is 'qrtz_triggers表trigger_name的外键';
|
||||
comment on column iotlocks.QRTZ_BLOB_TRIGGERS.trigger_group is 'qrtz_triggers表trigger_group的外键';
|
||||
comment on column iotlocks.QRTZ_BLOB_TRIGGERS.blob_data is '存放持久化Trigger对象';
|
||||
|
||||
-- ----------------------------
|
||||
-- 6、 以 Blob 类型存储存放日历信息, quartz可配置一个日历来指定一个时间范围
|
||||
-- ----------------------------
|
||||
create table iotlocks.QRTZ_CALENDARS (
|
||||
sched_name varchar(120) not null,
|
||||
calendar_name varchar(200) not null,
|
||||
calendar bytea not null,
|
||||
primary key (sched_name, calendar_name)
|
||||
);
|
||||
|
||||
comment on table iotlocks.QRTZ_CALENDARS is '日历信息表';
|
||||
comment on column iotlocks.QRTZ_CALENDARS.sched_name is '调度名称';
|
||||
comment on column iotlocks.QRTZ_CALENDARS.calendar_name is '日历名称';
|
||||
comment on column iotlocks.QRTZ_CALENDARS.calendar is '存放持久化calendar对象';
|
||||
|
||||
-- ----------------------------
|
||||
-- 7、 存储已暂停的 Trigger 组的信息
|
||||
-- ----------------------------
|
||||
create table iotlocks.QRTZ_PAUSED_TRIGGER_GRPS (
|
||||
sched_name varchar(120) not null,
|
||||
trigger_group varchar(200) not null,
|
||||
primary key (sched_name, trigger_group)
|
||||
);
|
||||
|
||||
comment on table iotlocks.QRTZ_PAUSED_TRIGGER_GRPS is '暂停的触发器表';
|
||||
comment on column iotlocks.QRTZ_PAUSED_TRIGGER_GRPS.sched_name is '调度名称';
|
||||
comment on column iotlocks.QRTZ_PAUSED_TRIGGER_GRPS.trigger_group is 'qrtz_triggers表trigger_group的外键';
|
||||
|
||||
-- ----------------------------
|
||||
-- 8、 存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息
|
||||
-- ----------------------------
|
||||
create table iotlocks.QRTZ_FIRED_TRIGGERS (
|
||||
sched_name varchar(120) not null,
|
||||
entry_id varchar(95) not null,
|
||||
trigger_name varchar(200) not null,
|
||||
trigger_group varchar(200) not null,
|
||||
instance_name varchar(200) not null,
|
||||
fired_time bigint not null,
|
||||
sched_time bigint not null,
|
||||
priority integer not null,
|
||||
state varchar(16) not null,
|
||||
job_name varchar(200) null,
|
||||
job_group varchar(200) null,
|
||||
is_nonconcurrent varchar(1) null,
|
||||
requests_recovery varchar(1) null,
|
||||
primary key (sched_name, entry_id)
|
||||
);
|
||||
|
||||
comment on table iotlocks.QRTZ_FIRED_TRIGGERS is '已触发的触发器表';
|
||||
comment on column iotlocks.QRTZ_FIRED_TRIGGERS.sched_name is '调度名称';
|
||||
comment on column iotlocks.QRTZ_FIRED_TRIGGERS.entry_id is '调度器实例id';
|
||||
comment on column iotlocks.QRTZ_FIRED_TRIGGERS.trigger_name is 'qrtz_triggers表trigger_name的外键';
|
||||
comment on column iotlocks.QRTZ_FIRED_TRIGGERS.trigger_group is 'qrtz_triggers表trigger_group的外键';
|
||||
comment on column iotlocks.QRTZ_FIRED_TRIGGERS.instance_name is '调度器实例名';
|
||||
comment on column iotlocks.QRTZ_FIRED_TRIGGERS.fired_time is '触发的时间';
|
||||
comment on column iotlocks.QRTZ_FIRED_TRIGGERS.sched_time is '定时器制定的时间';
|
||||
comment on column iotlocks.QRTZ_FIRED_TRIGGERS.priority is '优先级';
|
||||
comment on column iotlocks.QRTZ_FIRED_TRIGGERS.state is '状态';
|
||||
comment on column iotlocks.QRTZ_FIRED_TRIGGERS.job_name is '任务名称';
|
||||
comment on column iotlocks.QRTZ_FIRED_TRIGGERS.job_group is '任务组名';
|
||||
comment on column iotlocks.QRTZ_FIRED_TRIGGERS.is_nonconcurrent is '是否并发';
|
||||
comment on column iotlocks.QRTZ_FIRED_TRIGGERS.requests_recovery is '是否接受恢复执行';
|
||||
|
||||
-- ----------------------------
|
||||
-- 9、 存储少量的有关 Scheduler 的状态信息,假如是用于集群中,可以看到其他的 Scheduler 实例
|
||||
-- ----------------------------
|
||||
create table iotlocks.QRTZ_SCHEDULER_STATE (
|
||||
sched_name varchar(120) not null,
|
||||
instance_name varchar(200) not null,
|
||||
last_checkin_time bigint not null,
|
||||
checkin_interval bigint not null,
|
||||
primary key (sched_name, instance_name)
|
||||
);
|
||||
|
||||
comment on table iotlocks.QRTZ_SCHEDULER_STATE is '调度器状态表';
|
||||
comment on column iotlocks.QRTZ_SCHEDULER_STATE.sched_name is '调度名称';
|
||||
comment on column iotlocks.QRTZ_SCHEDULER_STATE.instance_name is '实例名称';
|
||||
comment on column iotlocks.QRTZ_SCHEDULER_STATE.last_checkin_time is '上次检查时间';
|
||||
comment on column iotlocks.QRTZ_SCHEDULER_STATE.checkin_interval is '检查间隔时间';
|
||||
|
||||
-- ----------------------------
|
||||
-- 10、 存储程序的悲观锁的信息(假如使用了悲观锁)
|
||||
-- ----------------------------
|
||||
create table iotlocks.QRTZ_LOCKS (
|
||||
sched_name varchar(120) not null,
|
||||
lock_name varchar(40) not null,
|
||||
primary key (sched_name, lock_name)
|
||||
);
|
||||
|
||||
comment on table iotlocks.QRTZ_LOCKS is '存储的悲观锁信息表';
|
||||
comment on column iotlocks.QRTZ_LOCKS.sched_name is '调度名称';
|
||||
comment on column iotlocks.QRTZ_LOCKS.lock_name is '悲观锁名称';
|
||||
|
||||
-- ----------------------------
|
||||
-- 11、 Quartz集群实现同步机制的行锁表
|
||||
-- ----------------------------
|
||||
create table iotlocks.QRTZ_SIMPROP_TRIGGERS (
|
||||
sched_name varchar(120) not null,
|
||||
trigger_name varchar(200) not null,
|
||||
trigger_group varchar(200) not null,
|
||||
str_prop_1 varchar(512) null,
|
||||
str_prop_2 varchar(512) null,
|
||||
str_prop_3 varchar(512) null,
|
||||
int_prop_1 int null,
|
||||
int_prop_2 int null,
|
||||
long_prop_1 bigint null,
|
||||
long_prop_2 bigint null,
|
||||
dec_prop_1 numeric(13,4) null,
|
||||
dec_prop_2 numeric(13,4) null,
|
||||
bool_prop_1 varchar(1) null,
|
||||
bool_prop_2 varchar(1) null,
|
||||
primary key (sched_name, trigger_name, trigger_group),
|
||||
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
|
||||
);
|
||||
|
||||
comment on table iotlocks.QRTZ_SIMPROP_TRIGGERS is '同步机制的行锁表';
|
||||
comment on column iotlocks.QRTZ_SIMPROP_TRIGGERS.sched_name is '调度名称';
|
||||
comment on column iotlocks.QRTZ_SIMPROP_TRIGGERS.trigger_name is 'qrtz_triggers表trigger_name的外键';
|
||||
comment on column iotlocks.QRTZ_SIMPROP_TRIGGERS.trigger_group is 'qrtz_triggers表trigger_group的外键';
|
||||
comment on column iotlocks.QRTZ_SIMPROP_TRIGGERS.str_prop_1 is 'String类型的trigger的第一个参数';
|
||||
comment on column iotlocks.QRTZ_SIMPROP_TRIGGERS.str_prop_2 is 'String类型的trigger的第二个参数';
|
||||
comment on column iotlocks.QRTZ_SIMPROP_TRIGGERS.str_prop_3 is 'String类型的trigger的第三个参数';
|
||||
comment on column iotlocks.QRTZ_SIMPROP_TRIGGERS.int_prop_1 is 'int类型的trigger的第一个参数';
|
||||
comment on column iotlocks.QRTZ_SIMPROP_TRIGGERS.int_prop_2 is 'int类型的trigger的第二个参数';
|
||||
comment on column iotlocks.QRTZ_SIMPROP_TRIGGERS.long_prop_1 is 'long类型的trigger的第一个参数';
|
||||
comment on column iotlocks.QRTZ_SIMPROP_TRIGGERS.long_prop_2 is 'long类型的trigger的第二个参数';
|
||||
comment on column iotlocks.QRTZ_SIMPROP_TRIGGERS.dec_prop_1 is 'decimal类型的trigger的第一个参数';
|
||||
comment on column iotlocks.QRTZ_SIMPROP_TRIGGERS.dec_prop_2 is 'decimal类型的trigger的第二个参数';
|
||||
comment on column iotlocks.QRTZ_SIMPROP_TRIGGERS.bool_prop_1 is 'Boolean类型的trigger的第一个参数';
|
||||
comment on column iotlocks.QRTZ_SIMPROP_TRIGGERS.bool_prop_2 is 'Boolean类型的trigger的第二个参数';
|
||||
|
||||
commit;
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,686 @@
|
||||
-- =========================================================================
|
||||
-- 公寓人脸门禁系统(智能门锁)业务表 —— MySQL 初始化脚本
|
||||
--
|
||||
-- 库名:iotlocks(与 application-druid.yml 中 master.url 保持一致)
|
||||
-- 前置:先执行同目录 ry_20260417.sql(若依基础表)
|
||||
-- 版本:v1.3(D8:人员主数据 lock_person;D17:lock_device_gateway 一锁多网关;
|
||||
-- D9:lock_face_feature 按算法版本一人多份特征)
|
||||
--
|
||||
-- 规范(与 ry_20260417.sql 完全一致):
|
||||
-- 1) 主键统一 bigint(20) auto_increment;关联列统一 bigint(20)
|
||||
-- (不建物理外键,由业务层保证)。
|
||||
-- 2) 状态/标志位统一 char(1) 或 char(2),与若依 del_flag/status 风格一致;
|
||||
-- 时间统一 datetime,默认值用 CURRENT_TIMESTAMP。
|
||||
-- 3) 表与列注释使用 comment;索引统一 idx_ / uk_ 前缀。
|
||||
-- 4) 脚本可重复执行:建表前 drop table if exists,种子数据先 delete 再 insert。
|
||||
-- 5) 显式指定主键的种子数据由 auto_increment 自动推进,无需额外复位。
|
||||
--
|
||||
-- 表清单:
|
||||
-- 1. lock_group 公寓分组表
|
||||
-- 2. lock_gateway 门锁网关表
|
||||
-- 3. lock_device 智能门锁表
|
||||
-- 4. lock_device_gateway 门锁-网关归属表(多对多)
|
||||
-- 5. lock_person 人员主数据表
|
||||
-- 6. lock_face 人脸特征表(人员维度在 lock_person)
|
||||
-- 7. lock_face_feature 人脸特征-算法版本表(一人多版本)
|
||||
-- 8. lock_auth 授权数据表
|
||||
-- 9. lock_access_log 门禁通行日志表
|
||||
-- 10. lock_command 下行命令记录表
|
||||
-- 11. lock_mqtt_log MQTT 报文留痕表
|
||||
-- 12. lock_service_config 服务参数配置表
|
||||
-- =========================================================================
|
||||
|
||||
set names utf8mb4;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 1、公寓分组表
|
||||
-- 业务含义:一个公寓对应一个分组;分组是 MQTT 分组级主题
|
||||
-- (ydlink/{groupCode}/thing/...)的载体,也是批量授权/远程开锁的粒度。
|
||||
-- =========================================================================
|
||||
drop table if exists lock_group;
|
||||
create table lock_group (
|
||||
group_id bigint(20) not null auto_increment comment '分组ID',
|
||||
group_code varchar(32) not null comment '分组编号(MQTT主题第2段,全局唯一,一经占用不再复用)',
|
||||
group_name varchar(64) not null comment '公寓/分组名称',
|
||||
dept_id bigint(20) default null comment '所属部门ID(用于数据权限)',
|
||||
manager varchar(64) default null comment '负责人',
|
||||
phone varchar(20) default null comment '联系电话',
|
||||
address varchar(255) default null comment '公寓地址',
|
||||
config_id bigint(20) default null comment '关联MQTT服务器配置ID(lock_service_config.config_id,空表示用全局默认)',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
order_num int(4) default 0 comment '显示顺序',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (group_id),
|
||||
unique key uk_lock_group_code (group_code),
|
||||
key idx_lock_group_dept (dept_id),
|
||||
key idx_lock_group_status (status)
|
||||
) engine=innodb comment = '公寓分组表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 2、门锁网关表
|
||||
-- 业务含义:门锁网关是 LoRa 汇聚节点,下挂多台门锁;一个网关属于一个分组。
|
||||
-- 网关是 MQTT 网关级主题(ydlink/{gatewaySn}/thing/...)的载体。
|
||||
-- =========================================================================
|
||||
drop table if exists lock_gateway;
|
||||
create table lock_gateway (
|
||||
gateway_id bigint(20) not null auto_increment comment '网关ID',
|
||||
gateway_sn varchar(32) not null comment '网关SN(MQTT主题第2段,全局唯一)',
|
||||
gateway_name varchar(64) default null comment '网关名称',
|
||||
group_id bigint(20) default null comment '所属分组ID(lock_group.group_id)',
|
||||
gateway_ip varchar(64) default null comment '网关IP',
|
||||
subnet_mask varchar(64) default null comment '子网掩码',
|
||||
default_gateway varchar(64) default null comment '默认网关',
|
||||
gateway_password varchar(128) default null comment '网关密码(密文存储,AES加密)',
|
||||
config_id bigint(20) default null comment '关联MQTT服务器配置ID',
|
||||
lora_config varchar(1024) default null comment 'LORA参数配置(JSON)',
|
||||
mqtt_config varchar(1024) default null comment '网关侧MQTT参数(JSON)',
|
||||
config_version int(11) default 0 comment '配置版本号(每次下发+1,用于比对网关侧是否已同步)',
|
||||
sync_status char(1) default '0' comment '配置同步状态(0未同步 1已同步 2同步失败)',
|
||||
online_status char(1) default '1' comment '在线状态(0在线 1离线)',
|
||||
last_online_time datetime comment '最后在线时间',
|
||||
last_sync_time datetime comment '最后配置同步时间',
|
||||
device_count int(11) default 0 comment '下挂门锁数量(冗余统计)',
|
||||
firmware_ver varchar(32) default null comment '网关固件版本',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (gateway_id),
|
||||
unique key uk_lock_gateway_sn (gateway_sn),
|
||||
key idx_lock_gateway_group (group_id),
|
||||
key idx_lock_gateway_online (online_status),
|
||||
key idx_lock_gateway_sync (sync_status)
|
||||
) engine=innodb comment = '门锁网关表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 3、门锁-网关归属表(多对多)
|
||||
-- 业务含义:一把门锁登记到了哪些网关上,以及每个网关视角下的信号与绑定状态。
|
||||
--
|
||||
-- 为什么独立成表:厂家协议里 locklist 是「网关的从设备清单」,绑定动作本身
|
||||
-- 就是 per-gateway 的——locklist(add) 必须在每个期望为该锁服务的网关上各下发
|
||||
-- 一次。同一把锁被两个网关覆盖时,两个网关按 LoRa 信号强度自行择优执行;
|
||||
-- 平台只在跨分组下发时选一个主控网关(选路规则 R1-R4 见 RouteResolver)。
|
||||
--
|
||||
-- lock_device.gateway_id / group_id 退化为「当前主控网关」缓存,供列表、筛选、
|
||||
-- 审计展示;下发前仍按本表实时选路,不能直接读缓存。
|
||||
--
|
||||
-- 解除归属用物理删除:本表可由网关 locklist 回执重建,不存在需要保留的业务
|
||||
-- 历史;走 del_flag 会被 uk_lock_device_gateway 挡住重新绑定。
|
||||
-- =========================================================================
|
||||
drop table if exists lock_device_gateway;
|
||||
create table lock_device_gateway (
|
||||
rel_id bigint(20) not null auto_increment comment '归属关系ID',
|
||||
device_id bigint(20) not null comment '门锁ID(lock_device.device_id)',
|
||||
gateway_id bigint(20) not null comment '网关ID(lock_gateway.gateway_id)',
|
||||
signal_strength varchar(8) default null comment '该网关视角下的锁信号强度(dBm,如 -42,用于选路比较)',
|
||||
last_signal_time datetime comment '该网关最后一次上报本锁信号/状态的时间',
|
||||
online_status char(1) default '2' comment '该网关视角下的锁在线状态(0在线 1离线 2未知,字典 lock_online_status)',
|
||||
bind_status char(1) default '0' comment 'locklist 下发状态(0待下发 1已下发 2下发失败,字典 lock_bind_status)',
|
||||
bind_msg varchar(512) default null comment 'locklist 下发结果说明',
|
||||
bind_time datetime comment '首次登记到该网关的时间',
|
||||
last_sync_time datetime comment '最后一次 locklist 同步时间',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (rel_id),
|
||||
unique key uk_lock_device_gateway (device_id, gateway_id),
|
||||
key idx_lock_dg_gateway (gateway_id),
|
||||
key idx_lock_dg_device (device_id),
|
||||
key idx_lock_dg_route (gateway_id, online_status, last_signal_time),
|
||||
key idx_lock_dg_bind (bind_status)
|
||||
) engine=innodb comment = '门锁-网关归属表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 4、智能门锁表
|
||||
-- 业务含义:门锁终端,可通过 LoRa 登记到一个或多个网关(归属事实源为
|
||||
-- lock_device_gateway)。gateway_id/group_id 只是当前主控网关与其分组的缓存,
|
||||
-- 为空表示尚未选择主控网关(并非未绑定任何网关)。
|
||||
-- 协议字段映射:device_sn -> devId,device_password -> devPsw,
|
||||
-- dev_type -> devType,dev_ver -> devVer。
|
||||
-- =========================================================================
|
||||
drop table if exists lock_device;
|
||||
create table lock_device (
|
||||
device_id bigint(20) not null auto_increment comment '门锁ID',
|
||||
device_sn varchar(32) not null comment '门锁SN(对应协议devId,全局唯一)',
|
||||
device_name varchar(64) default null comment '门锁名称',
|
||||
gateway_id bigint(20) default null comment '当前主控网关ID(选路结果缓存,事实源为 lock_device_gateway)',
|
||||
group_id bigint(20) default null comment '主控网关所属分组ID(选路结果缓存,下发以网关分组为准)',
|
||||
device_password varchar(128) default null comment '门锁密码(密文存储,对应协议devPsw)',
|
||||
dev_type varchar(8) default null comment '设备类型(对应协议devType)',
|
||||
dev_ver varchar(16) default null comment '设备固件版本(对应协议devVer)',
|
||||
face_algo_version varchar(32) default null comment '人脸算法版本(特征提取服务的 algorithm_version 入参,由每把门锁各自维护,如 2.14.5_2.7.1_M3)',
|
||||
room_no varchar(64) default null comment '分配房间号',
|
||||
bind_time datetime comment '绑定网关时间',
|
||||
last_sync_time datetime comment '最后时间同步时间',
|
||||
signal_strength varchar(8) default null comment '信号强度RSSI(dBm,op=lockrssi 上报,如 -42)',
|
||||
battery_level int(11) default null comment '剩余电量(百分比,op=lockrssi 上报)',
|
||||
last_status_time datetime comment '最后状态上报时间(信号/电量上报时间)',
|
||||
online_status char(1) default '1' comment '在线状态(0在线 1离线 2未知)',
|
||||
last_online_time datetime comment '最后在线时间',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (device_id),
|
||||
unique key uk_lock_device_sn (device_sn),
|
||||
key idx_lock_device_gateway (gateway_id),
|
||||
key idx_lock_device_group (group_id),
|
||||
key idx_lock_device_room (room_no)
|
||||
) engine=innodb comment = '智能门锁表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 5、人员主数据表
|
||||
-- 业务含义:人员是「是谁」,与凭证(凭什么开门)、授权(能开哪把锁)分离。
|
||||
-- person_no 是协议中的人员/人脸 ID,2 位字母 + 6 位数字(如 AA000003),
|
||||
-- 一经下发到设备不可变更;sys_user_id 关联若依账号(员工自助场景,可为空)。
|
||||
-- =========================================================================
|
||||
drop table if exists lock_person;
|
||||
create table lock_person (
|
||||
person_id bigint(20) not null auto_increment comment '人员ID',
|
||||
person_no varchar(16) not null comment '人员编号(协议人员/人脸ID,2位字母+6位数字,全局唯一且不可变更)',
|
||||
person_name varchar(64) default null comment '姓名',
|
||||
person_type char(1) default '0' comment '人员类型(0住户 1员工 2访客 3其他,字典 lock_person_type)',
|
||||
dept_id bigint(20) default null comment '所属部门ID(数据权限)',
|
||||
sys_user_id bigint(20) default null comment '关联若依账号ID(员工自助场景,可为空)',
|
||||
id_card_no varchar(256) default null comment '证件号(v1 明文存储,见架构设计 D10 决策)',
|
||||
phone varchar(20) default null comment '联系电话',
|
||||
valid_from datetime comment '人员有效期起(未填不限)',
|
||||
valid_to datetime comment '人员有效期止(空表示永久)',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (person_id),
|
||||
unique key uk_lock_person_no (person_no),
|
||||
key idx_lock_person_name (person_name),
|
||||
key idx_lock_person_dept (dept_id),
|
||||
key idx_lock_person_sys_user (sys_user_id)
|
||||
) engine=innodb comment = '人员主数据表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 6、人脸特征表
|
||||
-- 业务含义:人员的人脸生物特征(v1 一人一份;算法多版本见 D9/v2 lock_biometric)。
|
||||
-- 人员维度(姓名/类型/电话/部门)已拆到 lock_person,本表只保留图片与特征;
|
||||
-- person_no 保留为协议键——授权帧按人员编号下发,设备侧用它索引特征。
|
||||
-- 图片与特征分离存储:图片走对象存储/文件服务,特征以 base64 落 text 列。
|
||||
-- =========================================================================
|
||||
drop table if exists lock_face;
|
||||
create table lock_face (
|
||||
face_id bigint(20) not null auto_increment comment '人脸特征ID',
|
||||
person_id bigint(20) not null comment '人员ID(lock_person.person_id)',
|
||||
person_no varchar(32) not null comment '人员编号(冗余协议键,与 lock_person.person_no 一致)',
|
||||
photo_url varchar(512) default null comment '人脸图片URL',
|
||||
photo_md5 varchar(32) default null comment '图片指纹(用于变更检测与去重)',
|
||||
feature_data mediumtext comment '人脸特征值(base64编码)',
|
||||
feature_md5 varchar(32) default null comment '特征指纹(变更检测与幂等下发用)',
|
||||
feature_algo_version varchar(32) default null comment '特征算法版本(提取时实际使用的 algorithm_version)',
|
||||
feature_size int(11) default 0 comment '特征字节数',
|
||||
extract_status char(1) default '0' comment '特征提取状态(0未提取 1成功 2失败)',
|
||||
extract_time datetime comment '特征提取时间',
|
||||
extract_msg varchar(512) default null comment '特征提取失败原因',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (face_id),
|
||||
unique key uk_lock_face_person_id (person_id),
|
||||
unique key uk_lock_face_person_no (person_no),
|
||||
key idx_lock_face_extract (extract_status)
|
||||
) engine=innodb comment = '人脸特征表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 7、人脸特征-算法版本表
|
||||
-- 业务含义:同一张人脸照片按不同门锁算法版本分别提取,得到多份特征。
|
||||
-- 门锁只接受与自身 face_algo_version 一致的特征,换算法不能覆盖旧版本,
|
||||
-- 否则算法版本不同的老锁会集体失效(D9)。
|
||||
-- lock_face 继续保存图片与「最近一次成功提取」的镜像,本表是下发选值的
|
||||
-- 唯一事实源:下发时按 (person_no, algo_version) 取对应版本。
|
||||
-- 存量数据由 sql/upgrade_d9_face_feature.sql 从 lock_face 回填。
|
||||
-- =========================================================================
|
||||
drop table if exists lock_face_feature;
|
||||
create table lock_face_feature (
|
||||
feature_id bigint(20) not null auto_increment comment '特征ID',
|
||||
face_id bigint(20) not null comment '人脸ID(lock_face.face_id)',
|
||||
person_id bigint(20) not null comment '人员ID(lock_person.person_id)',
|
||||
person_no varchar(32) not null comment '人员编号(冗余协议键,与 lock_face.person_no 一致)',
|
||||
algo_version varchar(32) not null comment '算法版本(提取时使用的 algorithm_version,来自 lock_device.face_algo_version)',
|
||||
feature_data mediumtext comment '人脸特征值(base64编码)',
|
||||
feature_md5 varchar(32) default null comment '特征指纹(变更检测与幂等下发用)',
|
||||
feature_size int(11) default 0 comment '特征字节数',
|
||||
extract_status char(1) default '0' comment '特征提取状态(0未提取 1成功 2失败)',
|
||||
extract_time datetime comment '特征提取时间',
|
||||
extract_msg varchar(512) default null comment '特征提取失败原因',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (feature_id),
|
||||
unique key uk_lock_face_feature_algo (face_id, algo_version),
|
||||
key idx_lock_face_feature_person (person_no, algo_version),
|
||||
key idx_lock_face_feature_person_id (person_id)
|
||||
) engine=innodb comment = '人脸特征-算法版本表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 8、授权数据表
|
||||
-- 业务含义:把某个人员(person_no)在某个门锁(device_id)上的某类凭证
|
||||
-- (人脸/密码/指纹/IC卡)授权关系落库,并跟踪下发到设备的同步状态。
|
||||
-- 协议对应:ydlink/{groupCode}/thing/data/batch 的 params 数组(add/delete)。
|
||||
-- =========================================================================
|
||||
drop table if exists lock_auth;
|
||||
create table lock_auth (
|
||||
auth_id bigint(20) not null auto_increment comment '授权ID',
|
||||
auth_no varchar(64) not null comment '授权编号(业务唯一,建议规则 AUTH+日期+序号)',
|
||||
person_no varchar(32) not null comment '人员编号(lock_person.person_no)',
|
||||
person_name varchar(64) default null comment '冗余人员姓名',
|
||||
device_id bigint(20) not null comment '授权锁ID(lock_device.device_id)',
|
||||
device_sn varchar(32) default null comment '冗余门锁SN(下发组包直接用)',
|
||||
gateway_id bigint(20) default null comment '冗余网关ID',
|
||||
group_id bigint(20) default null comment '冗余分组ID(决定下发主题)',
|
||||
auth_type char(2) not null comment '授权类型(01人脸 02密码 03指纹 04IC卡)',
|
||||
auth_value mediumtext comment '授权内容(人脸特征base64/密码密文/指纹特征/IC卡号)',
|
||||
auth_value_md5 varchar(32) default null comment '授权内容指纹(变更检测与重复下发判断)',
|
||||
begin_time datetime comment '生效开始时间',
|
||||
end_time datetime comment '生效结束时间(空表示永久有效)',
|
||||
auth_time datetime comment '授权操作时间',
|
||||
sync_status char(1) default '0' comment '下发同步状态(0待下发 1已下发 2下发成功 3下发失败 4已清除 6待清除;5 预留给 v2 的已过期)',
|
||||
sync_time datetime comment '最后下发/响应时间',
|
||||
sync_msg varchar(512) default null comment '下发结果说明',
|
||||
retry_count int(11) default 0 comment '下发重试次数',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (auth_id),
|
||||
unique key uk_lock_auth_no (auth_no),
|
||||
unique key uk_lock_auth_person_lock (person_no, device_id, auth_type),
|
||||
key idx_lock_auth_person (person_no),
|
||||
key idx_lock_auth_device (device_id),
|
||||
key idx_lock_auth_group (group_id),
|
||||
key idx_lock_auth_sync (sync_status)
|
||||
) engine=innodb comment = '授权数据表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 9、门禁通行日志表
|
||||
-- 业务含义:设备通过 ydlink/{groupCode}/thing/event/trigger(op=lockrecord)
|
||||
-- 上报的开门记录。本表为高频只追加表,故不设 del_flag / update_*。
|
||||
--
|
||||
-- 【性能提示】单公寓千级住户、日均万级记录时,建议按 open_time 做范围分区,
|
||||
-- 或按 recv_time 定期归档(见 LockAccessLogTask)。
|
||||
-- =========================================================================
|
||||
drop table if exists lock_access_log;
|
||||
create table lock_access_log (
|
||||
log_id bigint(20) not null auto_increment comment '日志ID',
|
||||
device_id bigint(20) default null comment '门锁ID(解析device_sn得到,未登记时为空)',
|
||||
device_sn varchar(32) not null comment '门锁SN',
|
||||
gateway_id bigint(20) default null comment '上报网关ID',
|
||||
gateway_sn varchar(32) default null comment '上报网关SN',
|
||||
group_id bigint(20) default null comment '所属分组ID',
|
||||
person_no varchar(32) default null comment '人员编号',
|
||||
person_name varchar(64) default null comment '冗余人员姓名',
|
||||
card_no varchar(32) default null comment '卡号/凭证号',
|
||||
open_type varchar(8) default null comment '开门方式(设备码 2密码 3IC卡 4指纹 5二维码 7人脸,平台远程 9;字典 lock_open_type)',
|
||||
open_result varchar(8) default null comment '开门结果(0失败 1成功)',
|
||||
open_dir varchar(8) default null comment '开门方向(0进门 1出门 空未知;设备原样上报,长度不固定)',
|
||||
open_time datetime comment '开门时间(设备上报时间)',
|
||||
recv_time datetime comment '服务端接收时间',
|
||||
seq varchar(32) default null comment '报文序号(用于幂等去重)',
|
||||
raw_params text comment '原始params数组(JSON,便于协议字段二次解析)',
|
||||
create_time datetime comment '创建时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (log_id),
|
||||
key idx_lock_access_log_device (device_sn),
|
||||
key idx_lock_access_log_person (person_no),
|
||||
key idx_lock_access_log_time (open_time),
|
||||
key idx_lock_access_log_seq (device_sn, seq),
|
||||
key idx_lock_access_log_group (group_id)
|
||||
) engine=innodb comment = '门禁通行日志表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 10、下行命令记录表
|
||||
-- 业务含义:所有平台→设备的指令统一下发留痕,支撑响应匹配、失败重试、
|
||||
-- 离线补发与操作审计。覆盖:绑定/解绑门锁、同步时间、远程开关锁、重启网关、
|
||||
-- 修改网络/LORA/MQTT参数、保存配置、授权下发、清除授权、清除门锁。
|
||||
-- =========================================================================
|
||||
drop table if exists lock_command;
|
||||
create table lock_command (
|
||||
command_id bigint(20) not null auto_increment comment '命令ID',
|
||||
command_no varchar(64) not null comment '命令编号(对应协议seq,全局唯一)',
|
||||
command_type char(4) not null comment '命令类型(字典 lock_command_type)',
|
||||
target_type char(1) not null comment '目标类型(1网关 2门锁 3分组)',
|
||||
target_id bigint(20) default null comment '目标对象ID',
|
||||
target_code varchar(32) default null comment '目标编号(网关SN/门锁SN/分组编号,用于主题拼装)',
|
||||
biz_id bigint(20) default null comment '关联业务ID(如授权下发时指向 lock_auth.auth_id)',
|
||||
topic varchar(255) default null comment '下发主题',
|
||||
payload mediumtext comment '下发报文内容',
|
||||
req_time datetime comment '下发时间',
|
||||
resp_topic varchar(255) default null comment '响应主题',
|
||||
resp_payload mediumtext comment '响应报文内容',
|
||||
resp_time datetime comment '响应时间',
|
||||
command_status char(1) default '0' comment '命令状态(0待发送 1已发送 2成功 3失败 4超时 5已取消)',
|
||||
retry_count int(11) default 0 comment '已重试次数',
|
||||
max_retry int(11) default 3 comment '最大重试次数',
|
||||
next_retry_time datetime comment '下次重试时间(补偿任务扫描用)',
|
||||
gateway_ack char(1) default '0' comment '是否已收到网关回执(0否 1是)',
|
||||
device_ack char(1) default '0' comment '是否已收到门锁回执(0否 1是)',
|
||||
device_result char(1) default null comment '门锁回执结果(0失败 1成功),双回执齐备才判定命令成功',
|
||||
error_msg varchar(512) default null comment '失败原因',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (command_id),
|
||||
unique key uk_lock_command_no (command_no),
|
||||
key idx_lock_command_status (command_status),
|
||||
key idx_lock_command_target (target_code),
|
||||
key idx_lock_command_time (req_time),
|
||||
key idx_lock_command_retry (command_status, next_retry_time)
|
||||
) engine=innodb comment = '下行命令记录表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 11、MQTT 报文留痕表
|
||||
-- 业务含义:上下行原始报文的落库留痕,用于协议联调、问题回溯与审计。
|
||||
-- 可通过配置开关(仅记录收发/记录全部)控制写入量。
|
||||
-- =========================================================================
|
||||
drop table if exists lock_mqtt_log;
|
||||
create table lock_mqtt_log (
|
||||
log_id bigint(20) not null auto_increment comment '日志ID',
|
||||
direction char(1) not null comment '方向(1上行设备→平台 2下行平台→设备)',
|
||||
topic varchar(255) not null comment 'MQTT主题',
|
||||
group_code varchar(32) default null comment '解析出的分组编号',
|
||||
gateway_sn varchar(32) default null comment '解析出的网关SN',
|
||||
device_sn varchar(32) default null comment '解析出的设备SN(协议devId)',
|
||||
op varchar(32) default null comment '操作类型(协议op)',
|
||||
mode varchar(8) default null comment '方向标识(s2d服务端→设备 d2s设备→服务端)',
|
||||
ac varchar(8) default null comment '动作类型(协议ac)',
|
||||
seq varchar(32) default null comment '报文序号(协议seq)',
|
||||
qos smallint default 1 comment '服务质量',
|
||||
retained char(1) default '0' comment '是否保留消息(0否 1是)',
|
||||
payload mediumtext comment '报文原文',
|
||||
chksum varchar(32) default null comment '报文校验和',
|
||||
verify_status char(1) default '0' comment '校验结果(0未校验 1通过 2失败)',
|
||||
handle_status char(1) default '0' comment '处理状态(0待处理 1成功 2失败 3已忽略)',
|
||||
handle_msg varchar(512) default null comment '处理结果说明',
|
||||
cost_time int(11) default 0 comment '处理耗时(毫秒)',
|
||||
recv_time datetime comment '接收/发送时间',
|
||||
create_time datetime comment '创建时间',
|
||||
primary key (log_id),
|
||||
key idx_lock_mqtt_log_topic (topic),
|
||||
key idx_lock_mqtt_log_device (device_sn),
|
||||
key idx_lock_mqtt_log_time (recv_time),
|
||||
key idx_lock_mqtt_log_handle (handle_status),
|
||||
key idx_lock_mqtt_log_seq (seq),
|
||||
key idx_lock_mqtt_log_direct (direction)
|
||||
) engine=innodb comment = 'MQTT报文留痕表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 12、服务参数配置表
|
||||
-- 业务含义:承载“系统参数”中的 MQTT 服务器配置、人脸特征提取服务配置
|
||||
-- 以及其它平台参数。采用 结构化分类字段 + JSON 值 的折中方案:
|
||||
-- 新增配置项无需改表,前端按 config_type 渲染不同表单。
|
||||
--
|
||||
-- config_value JSON 约定:
|
||||
-- config_type=01(MQTT服务器)
|
||||
-- {"brokerUrl":"tcp://127.0.0.1:1883","clientId":"","username":"","password":"",
|
||||
-- "defaultQos":1,"cleanSession":true,"keepAlive":60,"connectionTimeout":30}
|
||||
-- config_type=02(人脸特征服务)
|
||||
-- 协议:POST multipart/form-data,表单字段名 file,值为图片文件
|
||||
-- 返回:{"functionSuccess":true,"resultSuccess":true,"resultData":"特征base64","msg":"处理成功..."}
|
||||
-- {"endpoint":"http://192.168.1.202:8802/bdws_api/Third/Api/Easen/getFaceFeatureData","timeout":10000}
|
||||
-- 未配置时使用代码内置默认地址(同上)
|
||||
-- config_type=03(平台参数)
|
||||
-- {"accessLogKeepDays":180,"mqttLogLevel":"error","commandTimeout":10,"maxRetry":3}
|
||||
-- =========================================================================
|
||||
drop table if exists lock_service_config;
|
||||
create table lock_service_config (
|
||||
config_id bigint(20) not null auto_increment comment '配置ID',
|
||||
config_name varchar(100) not null comment '配置名称',
|
||||
config_type char(2) not null comment '配置类型(01MQTT服务器 02人脸特征服务 03平台参数,字典 lock_config_type)',
|
||||
config_value text comment '配置内容(JSON)',
|
||||
group_id bigint(20) default null comment '归属分组ID(为空表示全局默认)',
|
||||
is_default char(1) default '1' comment '是否默认(0是 1否)',
|
||||
enabled char(1) default '0' comment '是否启用(0启用 1停用)',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (config_id),
|
||||
unique key uk_lock_service_config_name (config_name, config_type),
|
||||
key idx_lock_service_config_type (config_type)
|
||||
) engine=innodb comment = '服务参数配置表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 13、字典数据初始化
|
||||
-- 先按 dict_type 清理,保证脚本可重复执行。
|
||||
-- =========================================================================
|
||||
delete from sys_dict_data where dict_type in
|
||||
('lock_online_status','lock_open_type','lock_open_result','lock_auth_type',
|
||||
'lock_command_type','lock_command_status','lock_sync_status','lock_handle_status',
|
||||
'lock_config_type','lock_extract_status','lock_person_type','lock_target_type',
|
||||
'lock_bind_status');
|
||||
delete from sys_dict_type where dict_type in
|
||||
('lock_online_status','lock_open_type','lock_open_result','lock_auth_type',
|
||||
'lock_command_type','lock_command_status','lock_sync_status','lock_handle_status',
|
||||
'lock_config_type','lock_extract_status','lock_person_type','lock_target_type',
|
||||
'lock_bind_status');
|
||||
|
||||
insert into sys_dict_type (dict_id, dict_name, dict_type, status, create_by, create_time, remark) values
|
||||
(100, '门禁设备在线状态', 'lock_online_status', '0', 'admin', CURRENT_TIMESTAMP, '网关/门锁在线状态列表'),
|
||||
(101, '门禁开门方式', 'lock_open_type', '0', 'admin', CURRENT_TIMESTAMP, '只保留设备码(2密码 3IC卡 4指纹 5二维码 7人脸 9远程开锁)'),
|
||||
(102, '门禁开门结果', 'lock_open_result', '0', 'admin', CURRENT_TIMESTAMP, '开门结果列表'),
|
||||
(103, '门禁授权类型', 'lock_auth_type', '0', 'admin', CURRENT_TIMESTAMP, '人脸/密码/指纹/IC卡'),
|
||||
(104, '门禁命令类型', 'lock_command_type', '0', 'admin', CURRENT_TIMESTAMP, '下行命令类型列表'),
|
||||
(105, '门禁命令状态', 'lock_command_status','0', 'admin', CURRENT_TIMESTAMP, '命令下发状态列表'),
|
||||
(106, '门禁授权同步状态', 'lock_sync_status', '0', 'admin', CURRENT_TIMESTAMP, '授权下发同步状态列表'),
|
||||
(107, '门禁报文处理状态', 'lock_handle_status', '0', 'admin', CURRENT_TIMESTAMP, 'MQTT报文处理状态列表'),
|
||||
(108, '门禁服务配置类型', 'lock_config_type', '0', 'admin', CURRENT_TIMESTAMP, '服务参数配置类型列表'),
|
||||
(109, '人脸特征提取状态', 'lock_extract_status','0', 'admin', CURRENT_TIMESTAMP, '人脸特征提取状态列表'),
|
||||
(110, '门禁人员类型', 'lock_person_type', '0', 'admin', CURRENT_TIMESTAMP, '人员类型列表'),
|
||||
(111, '门禁命令目标类型', 'lock_target_type', '0', 'admin', CURRENT_TIMESTAMP, '命令下发目标类型列表'),
|
||||
(112, '门锁绑定状态', 'lock_bind_status', '0', 'admin', CURRENT_TIMESTAMP, 'locklist 下发状态');
|
||||
|
||||
insert into sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) values
|
||||
-- 在线状态
|
||||
(100, 1, '在线', '0', 'lock_online_status', '', 'success', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(101, 2, '离线', '1', 'lock_online_status', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(102, 3, '未知', '2', 'lock_online_status', '', 'info', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 开门方式(只保留设备码,与 lockrecord params[2] 一致;远程开锁为平台生成)
|
||||
(110, 1, '密码', '2', 'lock_open_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, '设备码'),
|
||||
(111, 2, 'IC卡', '3', 'lock_open_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, '设备码'),
|
||||
(112, 3, '指纹', '4', 'lock_open_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, '设备码'),
|
||||
(113, 4, '二维码', '5', 'lock_open_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, '设备码'),
|
||||
(114, 5, '人脸', '7', 'lock_open_type', '', 'success', 'Y', '0', 'admin', CURRENT_TIMESTAMP, '设备码,实测值'),
|
||||
(115, 6, '远程开锁', '9', 'lock_open_type', '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, '平台生成,非设备上报'),
|
||||
-- 开门结果
|
||||
(120, 1, '失败', '0', 'lock_open_result', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(121, 2, '成功', '1', 'lock_open_result', '', 'success', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 授权类型
|
||||
(130, 1, '人脸', '01', 'lock_auth_type', '', 'primary', 'Y', '0', 'admin', CURRENT_TIMESTAMP, 'op=facefeature'),
|
||||
(131, 2, '密码', '02', 'lock_auth_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'op=password'),
|
||||
(132, 3, '指纹', '03', 'lock_auth_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(133, 4, 'IC卡', '04', 'lock_auth_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'op=iccard'),
|
||||
-- 命令类型
|
||||
(140, 1, '绑定门锁', '0001', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(141, 2, '解绑门锁', '0002', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(142, 3, '同步门锁时间', '0003', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(143, 4, '远程开锁', '0004', 'lock_command_type', '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{grpId}/thing/action/execute'),
|
||||
(144, 5, '远程关锁', '0005', 'lock_command_type', '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{grpId}/thing/action/execute'),
|
||||
(145, 6, '重启网关', '0006', 'lock_command_type', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(146, 7, '修改网络参数', '0007', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(147, 8, '修改LORA参数', '0008', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(148, 9, '修改MQTT参数', '0009', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(149, 10, '保存配置', '0010', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
(150, 11, '授权下发', '0011', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{grpId}/thing/data/batch'),
|
||||
(151, 12, '清除授权', '0012', 'lock_command_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{grpId}/thing/data/batch'),
|
||||
(152, 13, '清除门锁', '0013', 'lock_command_type', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, 'ydlink/{gwId}/thing/property/set'),
|
||||
-- 命令状态
|
||||
(160, 1, '待发送', '0', 'lock_command_status', '', 'info', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(161, 2, '已发送', '1', 'lock_command_status', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(162, 3, '成功', '2', 'lock_command_status', '', 'success', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(163, 4, '失败', '3', 'lock_command_status', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(164, 5, '超时', '4', 'lock_command_status', '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(165, 6, '已取消', '5', 'lock_command_status', '', 'info', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 授权同步状态
|
||||
(170, 1, '待下发', '0', 'lock_sync_status', '', 'info', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(171, 2, '已下发', '1', 'lock_sync_status', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(172, 3, '下发成功', '2', 'lock_sync_status', '', 'success', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(173, 4, '下发失败', '3', 'lock_sync_status', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(174, 5, '已清除', '4', 'lock_sync_status', '', 'info', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(175, 6, '待清除', '6', 'lock_sync_status', '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, '清除指令失败,等待补偿重发删除'),
|
||||
-- 报文处理状态
|
||||
(180, 1, '待处理', '0', 'lock_handle_status', '', 'info', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(181, 2, '成功', '1', 'lock_handle_status', '', 'success', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(182, 3, '失败', '2', 'lock_handle_status', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(183, 4, '已忽略', '3', 'lock_handle_status', '', 'info', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 服务配置类型
|
||||
(190, 1, 'MQTT服务器', '01', 'lock_config_type', '', 'primary', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(191, 2, '人脸特征服务', '02', 'lock_config_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(192, 3, '平台参数', '03', 'lock_config_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 特征提取状态
|
||||
(200, 1, '未提取', '0', 'lock_extract_status', '', 'info', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(201, 2, '成功', '1', 'lock_extract_status', '', 'success', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(202, 3, '失败', '2', 'lock_extract_status', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 人员类型
|
||||
(210, 1, '住户', '0', 'lock_person_type', '', 'primary', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(211, 2, '员工', '1', 'lock_person_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(212, 3, '访客', '2', 'lock_person_type', '', 'warning', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(213, 4, '其他', '3', 'lock_person_type', '', 'info', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 门锁绑定状态(locklist 下发状态)
|
||||
(230, 1, '待下发', '0', 'lock_bind_status', '', 'info', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(231, 2, '已下发', '1', 'lock_bind_status', '', 'success', 'N', '0', 'admin', CURRENT_TIMESTAMP, '网关已接收 locklist'),
|
||||
(232, 3, '下发失败', '2', 'lock_bind_status', '', 'danger', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 命令目标类型
|
||||
(220, 1, '网关', '1', 'lock_target_type', '', 'primary', 'Y', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(221, 2, '门锁', '2', 'lock_target_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(222, 3, '分组', '3', 'lock_target_type', '', 'primary', 'N', '0', 'admin', CURRENT_TIMESTAMP, '');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 14、菜单初始化
|
||||
-- 使用 2000+ 号段(ry_20260417.sql 的 sys_menu auto_increment 为 2000)。
|
||||
-- 若依 admin 角色(role_key='admin')默认拥有全部菜单,无需写 sys_role_menu。
|
||||
-- =========================================================================
|
||||
delete from sys_menu where perms like 'lock:%';
|
||||
delete from sys_menu where menu_name = '门禁管理' and parent_id = 0;
|
||||
|
||||
-- 一级目录
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2000, '门禁管理', 0, 4, 'iot', null, '', '', 1, 0, 'M', '0', '0', '', 'lock', 'admin', CURRENT_TIMESTAMP, '公寓人脸门禁系统目录');
|
||||
|
||||
-- 二级菜单:页面
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2010, '公寓分组', 2000, 1, 'group', 'iot/group/index', '', '', 1, 0, 'C', '0', '0', 'lock:group:list', 'tree', 'admin', CURRENT_TIMESTAMP, '公寓分组菜单'),
|
||||
(2020, '门锁网关', 2000, 2, 'gateway', 'iot/gateway/index', '', '', 1, 0, 'C', '0', '0', 'lock:gateway:list', 'server', 'admin', CURRENT_TIMESTAMP, '门锁网关菜单'),
|
||||
(2030, '智能门锁', 2000, 3, 'device', 'iot/device/index', '', '', 1, 0, 'C', '0', '0', 'lock:device:list', 'lock', 'admin', CURRENT_TIMESTAMP, '智能门锁菜单'),
|
||||
(2100, '人员管理', 2000, 4, 'person', 'iot/person/index', '', '', 1, 0, 'C', '0', '0', 'lock:person:list', 'peoples', 'admin', CURRENT_TIMESTAMP, '人员主数据菜单'),
|
||||
(2040, '人脸数据', 2000, 5, 'face', 'iot/face/index', '', '', 1, 0, 'C', '0', '0', 'lock:face:list', 'peoples', 'admin', CURRENT_TIMESTAMP, '人脸特征菜单'),
|
||||
(2050, '授权管理', 2000, 6, 'auth', 'iot/auth/index', '', '', 1, 0, 'C', '0', '0', 'lock:auth:list', 'lock', 'admin', CURRENT_TIMESTAMP, '授权管理菜单'),
|
||||
(2060, '通行记录', 2000, 7, 'accesslog', 'iot/accesslog/index','', '', 1, 0, 'C', '0', '0', 'lock:accesslog:list','list', 'admin', CURRENT_TIMESTAMP, '通行记录菜单'),
|
||||
(2070, '命令记录', 2000, 8, 'command', 'iot/command/index', '', '', 1, 0, 'C', '0', '0', 'lock:command:list', 'job', 'admin', CURRENT_TIMESTAMP, '命令记录菜单'),
|
||||
(2080, '报文日志', 2000, 9, 'mqttlog', 'iot/mqttlog/index', '', '', 1, 0, 'C', '0', '0', 'lock:mqttlog:list', 'log', 'admin', CURRENT_TIMESTAMP, '报文日志菜单'),
|
||||
(2090, '系统参数', 2000, 10,'config', 'iot/config/index', '', '', 1, 0, 'C', '0', '0', 'lock:config:list', 'edit', 'admin', CURRENT_TIMESTAMP, '系统参数菜单');
|
||||
|
||||
-- 三级菜单:按钮权限
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
-- 公寓分组
|
||||
(2011, '分组查询', 2010, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:group:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2012, '分组新增', 2010, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:group:add', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2013, '分组修改', 2010, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:group:edit', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2014, '分组删除', 2010, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:group:remove', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2015, '分组导出', 2010, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:group:export', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 门锁网关
|
||||
(2021, '网关查询', 2020, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2022, '网关新增', 2020, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:add', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2023, '网关修改', 2020, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:edit', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2024, '网关删除', 2020, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:remove', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2025, '网关导出', 2020, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:export', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2026, '网关配置下发',2020, 6, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:config', '#', 'admin', CURRENT_TIMESTAMP, '修改网络/LORA/MQTT参数与保存配置'),
|
||||
(2027, '网关重启', 2020, 7, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:reboot', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2028, '网关绑定门锁',2020, 8, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:gateway:bind', '#', 'admin', CURRENT_TIMESTAMP, '绑定/清除门锁'),
|
||||
-- 智能门锁
|
||||
(2031, '门锁查询', 2030, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2032, '门锁新增', 2030, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:add', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2033, '门锁修改', 2030, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:edit', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2034, '门锁删除', 2030, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:remove', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2035, '门锁导出', 2030, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:export', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2036, '绑定/解绑网关',2030, 6, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:bind', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2037, '时间同步', 2030, 7, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:sync', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2038, '远程开锁', 2030, 8, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:device:open', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 人员管理
|
||||
(2101, '人员查询', 2100, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:person:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2102, '人员新增', 2100, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:person:add', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2103, '人员修改', 2100, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:person:edit', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2104, '人员删除', 2100, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:person:remove', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2105, '人员导出', 2100, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:person:export', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2106, '人员下拉', 2100, 6, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:person:option', '#', 'admin', CURRENT_TIMESTAMP, '人员选择组件数据源'),
|
||||
-- 人脸数据
|
||||
(2041, '人脸查询', 2040, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:face:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2042, '人脸新增', 2040, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:face:add', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2043, '人脸修改', 2040, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:face:edit', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2044, '人脸删除', 2040, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:face:remove', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2045, '人脸导出', 2040, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:face:export', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2046, '特征提取', 2040, 6, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:face:extract', '#', 'admin', CURRENT_TIMESTAMP, '调用人脸特征提取服务'),
|
||||
-- 授权管理
|
||||
(2051, '授权查询', 2050, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:auth:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2052, '授权新增', 2050, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:auth:add', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2053, '授权修改', 2050, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:auth:edit', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2054, '授权删除', 2050, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:auth:remove', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2055, '授权导出', 2050, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:auth:export', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2056, '授权下发', 2050, 6, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:auth:push', '#', 'admin', CURRENT_TIMESTAMP, '向设备下发授权'),
|
||||
(2057, '清除授权', 2050, 7, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:auth:clear', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 通行记录
|
||||
(2061, '记录查询', 2060, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:accesslog:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2062, '记录导出', 2060, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:accesslog:export', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 命令记录
|
||||
(2071, '命令查询', 2070, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:command:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2072, '命令重发', 2070, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:command:retry', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 报文日志
|
||||
(2081, '报文查询', 2080, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:mqttlog:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
-- 系统参数
|
||||
(2091, '参数查询', 2090, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:config:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2092, '参数修改', 2090, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:config:edit', '#', 'admin', CURRENT_TIMESTAMP, '');
|
||||
|
||||
-- =========================================================================
|
||||
-- 脚本结束
|
||||
-- =========================================================================
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,174 @@
|
||||
DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
|
||||
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
|
||||
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
|
||||
DROP TABLE IF EXISTS QRTZ_LOCKS;
|
||||
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
|
||||
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
|
||||
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
|
||||
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
|
||||
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
|
||||
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
|
||||
DROP TABLE IF EXISTS QRTZ_CALENDARS;
|
||||
|
||||
-- ----------------------------
|
||||
-- 1、存储每一个已配置的 jobDetail 的详细信息
|
||||
-- ----------------------------
|
||||
create table QRTZ_JOB_DETAILS (
|
||||
sched_name varchar(120) not null comment '调度名称',
|
||||
job_name varchar(200) not null comment '任务名称',
|
||||
job_group varchar(200) not null comment '任务组名',
|
||||
description varchar(250) null comment '相关介绍',
|
||||
job_class_name varchar(250) not null comment '执行任务类名称',
|
||||
is_durable varchar(1) not null comment '是否持久化',
|
||||
is_nonconcurrent varchar(1) not null comment '是否并发',
|
||||
is_update_data varchar(1) not null comment '是否更新数据',
|
||||
requests_recovery varchar(1) not null comment '是否接受恢复执行',
|
||||
job_data blob null comment '存放持久化job对象',
|
||||
primary key (sched_name, job_name, job_group)
|
||||
) engine=innodb comment = '任务详细信息表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 2、 存储已配置的 Trigger 的信息
|
||||
-- ----------------------------
|
||||
create table QRTZ_TRIGGERS (
|
||||
sched_name varchar(120) not null comment '调度名称',
|
||||
trigger_name varchar(200) not null comment '触发器的名字',
|
||||
trigger_group varchar(200) not null comment '触发器所属组的名字',
|
||||
job_name varchar(200) not null comment 'qrtz_job_details表job_name的外键',
|
||||
job_group varchar(200) not null comment 'qrtz_job_details表job_group的外键',
|
||||
description varchar(250) null comment '相关介绍',
|
||||
next_fire_time bigint(13) null comment '上一次触发时间(毫秒)',
|
||||
prev_fire_time bigint(13) null comment '下一次触发时间(默认为-1表示不触发)',
|
||||
priority integer null comment '优先级',
|
||||
trigger_state varchar(16) not null comment '触发器状态',
|
||||
trigger_type varchar(8) not null comment '触发器的类型',
|
||||
start_time bigint(13) not null comment '开始时间',
|
||||
end_time bigint(13) null comment '结束时间',
|
||||
calendar_name varchar(200) null comment '日程表名称',
|
||||
misfire_instr smallint(2) null comment '补偿执行的策略',
|
||||
job_data blob null comment '存放持久化job对象',
|
||||
primary key (sched_name, trigger_name, trigger_group),
|
||||
foreign key (sched_name, job_name, job_group) references QRTZ_JOB_DETAILS(sched_name, job_name, job_group)
|
||||
) engine=innodb comment = '触发器详细信息表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 3、 存储简单的 Trigger,包括重复次数,间隔,以及已触发的次数
|
||||
-- ----------------------------
|
||||
create table QRTZ_SIMPLE_TRIGGERS (
|
||||
sched_name varchar(120) not null comment '调度名称',
|
||||
trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键',
|
||||
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
|
||||
repeat_count bigint(7) not null comment '重复的次数统计',
|
||||
repeat_interval bigint(12) not null comment '重复的间隔时间',
|
||||
times_triggered bigint(10) not null comment '已经触发的次数',
|
||||
primary key (sched_name, trigger_name, trigger_group),
|
||||
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
|
||||
) engine=innodb comment = '简单触发器的信息表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 4、 存储 Cron Trigger,包括 Cron 表达式和时区信息
|
||||
-- ----------------------------
|
||||
create table QRTZ_CRON_TRIGGERS (
|
||||
sched_name varchar(120) not null comment '调度名称',
|
||||
trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键',
|
||||
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
|
||||
cron_expression varchar(200) not null comment 'cron表达式',
|
||||
time_zone_id varchar(80) comment '时区',
|
||||
primary key (sched_name, trigger_name, trigger_group),
|
||||
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
|
||||
) engine=innodb comment = 'Cron类型的触发器表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 5、 Trigger 作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)
|
||||
-- ----------------------------
|
||||
create table QRTZ_BLOB_TRIGGERS (
|
||||
sched_name varchar(120) not null comment '调度名称',
|
||||
trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键',
|
||||
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
|
||||
blob_data blob null comment '存放持久化Trigger对象',
|
||||
primary key (sched_name, trigger_name, trigger_group),
|
||||
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
|
||||
) engine=innodb comment = 'Blob类型的触发器表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 6、 以 Blob 类型存储存放日历信息, quartz可配置一个日历来指定一个时间范围
|
||||
-- ----------------------------
|
||||
create table QRTZ_CALENDARS (
|
||||
sched_name varchar(120) not null comment '调度名称',
|
||||
calendar_name varchar(200) not null comment '日历名称',
|
||||
calendar blob not null comment '存放持久化calendar对象',
|
||||
primary key (sched_name, calendar_name)
|
||||
) engine=innodb comment = '日历信息表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 7、 存储已暂停的 Trigger 组的信息
|
||||
-- ----------------------------
|
||||
create table QRTZ_PAUSED_TRIGGER_GRPS (
|
||||
sched_name varchar(120) not null comment '调度名称',
|
||||
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
|
||||
primary key (sched_name, trigger_group)
|
||||
) engine=innodb comment = '暂停的触发器表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 8、 存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息
|
||||
-- ----------------------------
|
||||
create table QRTZ_FIRED_TRIGGERS (
|
||||
sched_name varchar(120) not null comment '调度名称',
|
||||
entry_id varchar(95) not null comment '调度器实例id',
|
||||
trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键',
|
||||
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
|
||||
instance_name varchar(200) not null comment '调度器实例名',
|
||||
fired_time bigint(13) not null comment '触发的时间',
|
||||
sched_time bigint(13) not null comment '定时器制定的时间',
|
||||
priority integer not null comment '优先级',
|
||||
state varchar(16) not null comment '状态',
|
||||
job_name varchar(200) null comment '任务名称',
|
||||
job_group varchar(200) null comment '任务组名',
|
||||
is_nonconcurrent varchar(1) null comment '是否并发',
|
||||
requests_recovery varchar(1) null comment '是否接受恢复执行',
|
||||
primary key (sched_name, entry_id)
|
||||
) engine=innodb comment = '已触发的触发器表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 9、 存储少量的有关 Scheduler 的状态信息,假如是用于集群中,可以看到其他的 Scheduler 实例
|
||||
-- ----------------------------
|
||||
create table QRTZ_SCHEDULER_STATE (
|
||||
sched_name varchar(120) not null comment '调度名称',
|
||||
instance_name varchar(200) not null comment '实例名称',
|
||||
last_checkin_time bigint(13) not null comment '上次检查时间',
|
||||
checkin_interval bigint(13) not null comment '检查间隔时间',
|
||||
primary key (sched_name, instance_name)
|
||||
) engine=innodb comment = '调度器状态表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 10、 存储程序的悲观锁的信息(假如使用了悲观锁)
|
||||
-- ----------------------------
|
||||
create table QRTZ_LOCKS (
|
||||
sched_name varchar(120) not null comment '调度名称',
|
||||
lock_name varchar(40) not null comment '悲观锁名称',
|
||||
primary key (sched_name, lock_name)
|
||||
) engine=innodb comment = '存储的悲观锁信息表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 11、 Quartz集群实现同步机制的行锁表
|
||||
-- ----------------------------
|
||||
create table QRTZ_SIMPROP_TRIGGERS (
|
||||
sched_name varchar(120) not null comment '调度名称',
|
||||
trigger_name varchar(200) not null comment 'qrtz_triggers表trigger_name的外键',
|
||||
trigger_group varchar(200) not null comment 'qrtz_triggers表trigger_group的外键',
|
||||
str_prop_1 varchar(512) null comment 'String类型的trigger的第一个参数',
|
||||
str_prop_2 varchar(512) null comment 'String类型的trigger的第二个参数',
|
||||
str_prop_3 varchar(512) null comment 'String类型的trigger的第三个参数',
|
||||
int_prop_1 int null comment 'int类型的trigger的第一个参数',
|
||||
int_prop_2 int null comment 'int类型的trigger的第二个参数',
|
||||
long_prop_1 bigint null comment 'long类型的trigger的第一个参数',
|
||||
long_prop_2 bigint null comment 'long类型的trigger的第二个参数',
|
||||
dec_prop_1 numeric(13,4) null comment 'decimal类型的trigger的第一个参数',
|
||||
dec_prop_2 numeric(13,4) null comment 'decimal类型的trigger的第二个参数',
|
||||
bool_prop_1 varchar(1) null comment 'Boolean类型的trigger的第一个参数',
|
||||
bool_prop_2 varchar(1) null comment 'Boolean类型的trigger的第二个参数',
|
||||
primary key (sched_name, trigger_name, trigger_group),
|
||||
foreign key (sched_name, trigger_name, trigger_group) references QRTZ_TRIGGERS(sched_name, trigger_name, trigger_group)
|
||||
) engine=innodb comment = '同步机制的行锁表';
|
||||
|
||||
commit;
|
||||
@@ -0,0 +1,723 @@
|
||||
-- ----------------------------
|
||||
-- 1、部门表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_dept;
|
||||
create table sys_dept (
|
||||
dept_id bigint(20) not null auto_increment comment '部门id',
|
||||
parent_id bigint(20) default 0 comment '父部门id',
|
||||
ancestors varchar(50) default '' comment '祖级列表',
|
||||
dept_name varchar(30) default '' comment '部门名称',
|
||||
order_num int(4) default 0 comment '显示顺序',
|
||||
leader varchar(20) default null comment '负责人',
|
||||
phone varchar(11) default null comment '联系电话',
|
||||
email varchar(50) default null comment '邮箱',
|
||||
status char(1) default '0' comment '部门状态(0正常 1停用)',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
primary key (dept_id)
|
||||
) engine=innodb auto_increment=200 comment = '部门表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 初始化-部门表数据
|
||||
-- ----------------------------
|
||||
insert into sys_dept values(100, 0, '0', '若依科技', 0, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
|
||||
insert into sys_dept values(101, 100, '0,100', '深圳总公司', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
|
||||
insert into sys_dept values(102, 100, '0,100', '长沙分公司', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
|
||||
insert into sys_dept values(103, 101, '0,100,101', '研发部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
|
||||
insert into sys_dept values(104, 101, '0,100,101', '市场部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
|
||||
insert into sys_dept values(105, 101, '0,100,101', '测试部门', 3, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
|
||||
insert into sys_dept values(106, 101, '0,100,101', '财务部门', 4, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
|
||||
insert into sys_dept values(107, 101, '0,100,101', '运维部门', 5, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
|
||||
insert into sys_dept values(108, 102, '0,100,102', '市场部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
|
||||
insert into sys_dept values(109, 102, '0,100,102', '财务部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', sysdate(), '', null);
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 2、用户信息表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_user;
|
||||
create table sys_user (
|
||||
user_id bigint(20) not null auto_increment comment '用户ID',
|
||||
dept_id bigint(20) default null comment '部门ID',
|
||||
user_name varchar(30) not null comment '用户账号',
|
||||
nick_name varchar(30) not null comment '用户昵称',
|
||||
user_type varchar(2) default '00' comment '用户类型(00系统用户)',
|
||||
email varchar(50) default '' comment '用户邮箱',
|
||||
phonenumber varchar(11) default '' comment '手机号码',
|
||||
sex char(1) default '0' comment '用户性别(0男 1女 2未知)',
|
||||
avatar varchar(100) default '' comment '头像地址',
|
||||
password varchar(100) default '' comment '密码',
|
||||
status char(1) default '0' comment '账号状态(0正常 1停用)',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
login_ip varchar(128) default '' comment '最后登录IP',
|
||||
login_date datetime comment '最后登录时间',
|
||||
pwd_update_date datetime comment '密码最后更新时间',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (user_id)
|
||||
) engine=innodb auto_increment=100 comment = '用户信息表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 初始化-用户信息表数据
|
||||
-- ----------------------------
|
||||
insert into sys_user values(1, 103, 'admin', '若依', '00', 'ry@163.com', '15888888888', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), sysdate(), 'admin', sysdate(), '', null, '管理员');
|
||||
insert into sys_user values(2, 105, 'ry', '若依', '00', 'ry@qq.com', '15666666666', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), sysdate(), 'admin', sysdate(), '', null, '测试员');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 3、岗位信息表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_post;
|
||||
create table sys_post
|
||||
(
|
||||
post_id bigint(20) not null auto_increment comment '岗位ID',
|
||||
post_code varchar(64) not null comment '岗位编码',
|
||||
post_name varchar(50) not null comment '岗位名称',
|
||||
post_sort int(4) not null comment '显示顺序',
|
||||
status char(1) not null comment '状态(0正常 1停用)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (post_id)
|
||||
) engine=innodb comment = '岗位信息表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 初始化-岗位信息表数据
|
||||
-- ----------------------------
|
||||
insert into sys_post values(1, 'ceo', '董事长', 1, '0', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_post values(2, 'se', '项目经理', 2, '0', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_post values(3, 'hr', '人力资源', 3, '0', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_post values(4, 'user', '普通员工', 4, '0', 'admin', sysdate(), '', null, '');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 4、角色信息表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_role;
|
||||
create table sys_role (
|
||||
role_id bigint(20) not null auto_increment comment '角色ID',
|
||||
role_name varchar(30) not null comment '角色名称',
|
||||
role_key varchar(100) not null comment '角色权限字符串',
|
||||
role_sort int(4) not null comment '显示顺序',
|
||||
data_scope char(1) default '1' comment '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',
|
||||
menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示',
|
||||
dept_check_strictly tinyint(1) default 1 comment '部门树选择项是否关联显示',
|
||||
status char(1) not null comment '角色状态(0正常 1停用)',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (role_id)
|
||||
) engine=innodb auto_increment=100 comment = '角色信息表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 初始化-角色信息表数据
|
||||
-- ----------------------------
|
||||
insert into sys_role values('1', '超级管理员', 'admin', 1, 1, 1, 1, '0', '0', 'admin', sysdate(), '', null, '超级管理员');
|
||||
insert into sys_role values('2', '普通角色', 'common', 2, 2, 1, 1, '0', '0', 'admin', sysdate(), '', null, '普通角色');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 5、菜单权限表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_menu;
|
||||
create table sys_menu (
|
||||
menu_id bigint(20) not null auto_increment comment '菜单ID',
|
||||
menu_name varchar(50) not null comment '菜单名称',
|
||||
parent_id bigint(20) default 0 comment '父菜单ID',
|
||||
order_num int(4) default 0 comment '显示顺序',
|
||||
path varchar(200) default '' comment '路由地址',
|
||||
component varchar(255) default null comment '组件路径',
|
||||
query varchar(255) default null comment '路由参数',
|
||||
route_name varchar(50) default '' comment '路由名称',
|
||||
is_frame int(1) default 1 comment '是否为外链(0是 1否)',
|
||||
is_cache int(1) default 0 comment '是否缓存(0缓存 1不缓存)',
|
||||
menu_type char(1) default '' comment '菜单类型(M目录 C菜单 F按钮)',
|
||||
visible char(1) default 0 comment '菜单状态(0显示 1隐藏)',
|
||||
status char(1) default 0 comment '菜单状态(0正常 1停用)',
|
||||
perms varchar(100) default null comment '权限标识',
|
||||
icon varchar(100) default '#' comment '菜单图标',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default '' comment '备注',
|
||||
primary key (menu_id)
|
||||
) engine=innodb auto_increment=2000 comment = '菜单权限表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 初始化-菜单信息表数据
|
||||
-- ----------------------------
|
||||
-- 一级菜单
|
||||
insert into sys_menu values('1', '系统管理', '0', '1', 'system', null, '', '', 1, 0, 'M', '0', '0', '', 'system', 'admin', sysdate(), '', null, '系统管理目录');
|
||||
insert into sys_menu values('2', '系统监控', '0', '2', 'monitor', null, '', '', 1, 0, 'M', '0', '0', '', 'monitor', 'admin', sysdate(), '', null, '系统监控目录');
|
||||
insert into sys_menu values('3', '系统工具', '0', '3', 'tool', null, '', '', 1, 0, 'M', '0', '0', '', 'tool', 'admin', sysdate(), '', null, '系统工具目录');
|
||||
insert into sys_menu values('4', '若依官网', '0', '4', 'http://ruoyi.vip', null, '', '', 0, 0, 'M', '0', '0', '', 'guide', 'admin', sysdate(), '', null, '若依官网地址');
|
||||
-- 二级菜单
|
||||
insert into sys_menu values('100', '用户管理', '1', '1', 'user', 'system/user/index', '', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 'admin', sysdate(), '', null, '用户管理菜单');
|
||||
insert into sys_menu values('101', '角色管理', '1', '2', 'role', 'system/role/index', '', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 'admin', sysdate(), '', null, '角色管理菜单');
|
||||
insert into sys_menu values('102', '菜单管理', '1', '3', 'menu', 'system/menu/index', '', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 'admin', sysdate(), '', null, '菜单管理菜单');
|
||||
insert into sys_menu values('103', '部门管理', '1', '4', 'dept', 'system/dept/index', '', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 'admin', sysdate(), '', null, '部门管理菜单');
|
||||
insert into sys_menu values('104', '岗位管理', '1', '5', 'post', 'system/post/index', '', '', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 'admin', sysdate(), '', null, '岗位管理菜单');
|
||||
insert into sys_menu values('105', '字典管理', '1', '6', 'dict', 'system/dict/index', '', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 'admin', sysdate(), '', null, '字典管理菜单');
|
||||
insert into sys_menu values('106', '参数设置', '1', '7', 'config', 'system/config/index', '', '', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 'admin', sysdate(), '', null, '参数设置菜单');
|
||||
insert into sys_menu values('107', '通知公告', '1', '8', 'notice', 'system/notice/index', '', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'message', 'admin', sysdate(), '', null, '通知公告菜单');
|
||||
insert into sys_menu values('108', '日志管理', '1', '9', 'log', '', '', '', 1, 0, 'M', '0', '0', '', 'log', 'admin', sysdate(), '', null, '日志管理菜单');
|
||||
insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 'admin', sysdate(), '', null, '在线用户菜单');
|
||||
insert into sys_menu values('110', '定时任务', '2', '2', 'job', 'monitor/job/index', '', '', 1, 0, 'C', '0', '0', 'monitor:job:list', 'job', 'admin', sysdate(), '', null, '定时任务菜单');
|
||||
insert into sys_menu values('111', '数据监控', '2', '3', 'druid', 'monitor/druid/index', '', '', 1, 0, 'C', '0', '0', 'monitor:druid:list', 'druid', 'admin', sysdate(), '', null, '数据监控菜单');
|
||||
insert into sys_menu values('112', '服务监控', '2', '4', 'server', 'monitor/server/index', '', '', 1, 0, 'C', '0', '0', 'monitor:server:list', 'server', 'admin', sysdate(), '', null, '服务监控菜单');
|
||||
insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 'admin', sysdate(), '', null, '缓存监控菜单');
|
||||
insert into sys_menu values('114', '缓存列表', '2', '6', 'cacheList', 'monitor/cache/list', '', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis-list', 'admin', sysdate(), '', null, '缓存列表菜单');
|
||||
insert into sys_menu values('115', '表单构建', '3', '1', 'build', 'tool/build/index', '', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 'admin', sysdate(), '', null, '表单构建菜单');
|
||||
insert into sys_menu values('116', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 'admin', sysdate(), '', null, '代码生成菜单');
|
||||
insert into sys_menu values('117', '系统接口', '3', '3', 'swagger', 'tool/swagger/index', '', '', 1, 0, 'C', '0', '0', 'tool:swagger:list', 'swagger', 'admin', sysdate(), '', null, '系统接口菜单');
|
||||
-- 三级菜单
|
||||
insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 'admin', sysdate(), '', null, '操作日志菜单');
|
||||
insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 'admin', sysdate(), '', null, '登录日志菜单');
|
||||
-- 用户管理按钮
|
||||
insert into sys_menu values('1000', '用户查询', '100', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1001', '用户新增', '100', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1002', '用户修改', '100', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1003', '用户删除', '100', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1004', '用户导出', '100', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1005', '用户导入', '100', '6', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1006', '重置密码', '100', '7', '', '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 'admin', sysdate(), '', null, '');
|
||||
-- 角色管理按钮
|
||||
insert into sys_menu values('1007', '角色查询', '101', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1008', '角色新增', '101', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1009', '角色修改', '101', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1010', '角色删除', '101', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1011', '角色导出', '101', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 'admin', sysdate(), '', null, '');
|
||||
-- 菜单管理按钮
|
||||
insert into sys_menu values('1012', '菜单查询', '102', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1013', '菜单新增', '102', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1014', '菜单修改', '102', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1015', '菜单删除', '102', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 'admin', sysdate(), '', null, '');
|
||||
-- 部门管理按钮
|
||||
insert into sys_menu values('1016', '部门查询', '103', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1017', '部门新增', '103', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1018', '部门修改', '103', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1019', '部门删除', '103', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 'admin', sysdate(), '', null, '');
|
||||
-- 岗位管理按钮
|
||||
insert into sys_menu values('1020', '岗位查询', '104', '1', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1021', '岗位新增', '104', '2', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1022', '岗位修改', '104', '3', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1023', '岗位删除', '104', '4', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1024', '岗位导出', '104', '5', '', '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 'admin', sysdate(), '', null, '');
|
||||
-- 字典管理按钮
|
||||
insert into sys_menu values('1025', '字典查询', '105', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1026', '字典新增', '105', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1027', '字典修改', '105', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1028', '字典删除', '105', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1029', '字典导出', '105', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 'admin', sysdate(), '', null, '');
|
||||
-- 参数设置按钮
|
||||
insert into sys_menu values('1030', '参数查询', '106', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1031', '参数新增', '106', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1032', '参数修改', '106', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1033', '参数删除', '106', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1034', '参数导出', '106', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 'admin', sysdate(), '', null, '');
|
||||
-- 通知公告按钮
|
||||
insert into sys_menu values('1035', '公告查询', '107', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1036', '公告新增', '107', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1037', '公告修改', '107', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1038', '公告删除', '107', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 'admin', sysdate(), '', null, '');
|
||||
-- 操作日志按钮
|
||||
insert into sys_menu values('1039', '操作查询', '500', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1040', '操作删除', '500', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1041', '日志导出', '500', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 'admin', sysdate(), '', null, '');
|
||||
-- 登录日志按钮
|
||||
insert into sys_menu values('1042', '登录查询', '501', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1043', '登录删除', '501', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1044', '日志导出', '501', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1045', '账户解锁', '501', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 'admin', sysdate(), '', null, '');
|
||||
-- 在线用户按钮
|
||||
insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1048', '单条强退', '109', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', sysdate(), '', null, '');
|
||||
-- 定时任务按钮
|
||||
insert into sys_menu values('1049', '任务查询', '110', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:query', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1050', '任务新增', '110', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:add', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1051', '任务修改', '110', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:edit', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1052', '任务删除', '110', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:remove', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1053', '状态修改', '110', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1054', '任务导出', '110', '6', '#', '', '', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', 'admin', sysdate(), '', null, '');
|
||||
-- 代码生成按钮
|
||||
insert into sys_menu values('1055', '生成查询', '116', '1', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1056', '生成修改', '116', '2', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1057', '生成删除', '116', '3', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1058', '导入代码', '116', '4', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1059', '预览代码', '116', '5', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_menu values('1060', '生成代码', '116', '6', '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', sysdate(), '', null, '');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 6、用户和角色关联表 用户N-1角色
|
||||
-- ----------------------------
|
||||
drop table if exists sys_user_role;
|
||||
create table sys_user_role (
|
||||
user_id bigint(20) not null comment '用户ID',
|
||||
role_id bigint(20) not null comment '角色ID',
|
||||
primary key(user_id, role_id)
|
||||
) engine=innodb comment = '用户和角色关联表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 初始化-用户和角色关联表数据
|
||||
-- ----------------------------
|
||||
insert into sys_user_role values ('1', '1');
|
||||
insert into sys_user_role values ('2', '2');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 7、角色和菜单关联表 角色1-N菜单
|
||||
-- ----------------------------
|
||||
drop table if exists sys_role_menu;
|
||||
create table sys_role_menu (
|
||||
role_id bigint(20) not null comment '角色ID',
|
||||
menu_id bigint(20) not null comment '菜单ID',
|
||||
primary key(role_id, menu_id)
|
||||
) engine=innodb comment = '角色和菜单关联表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 初始化-角色和菜单关联表数据
|
||||
-- ----------------------------
|
||||
insert into sys_role_menu values ('2', '1');
|
||||
insert into sys_role_menu values ('2', '2');
|
||||
insert into sys_role_menu values ('2', '3');
|
||||
insert into sys_role_menu values ('2', '4');
|
||||
insert into sys_role_menu values ('2', '100');
|
||||
insert into sys_role_menu values ('2', '101');
|
||||
insert into sys_role_menu values ('2', '102');
|
||||
insert into sys_role_menu values ('2', '103');
|
||||
insert into sys_role_menu values ('2', '104');
|
||||
insert into sys_role_menu values ('2', '105');
|
||||
insert into sys_role_menu values ('2', '106');
|
||||
insert into sys_role_menu values ('2', '107');
|
||||
insert into sys_role_menu values ('2', '108');
|
||||
insert into sys_role_menu values ('2', '109');
|
||||
insert into sys_role_menu values ('2', '110');
|
||||
insert into sys_role_menu values ('2', '111');
|
||||
insert into sys_role_menu values ('2', '112');
|
||||
insert into sys_role_menu values ('2', '113');
|
||||
insert into sys_role_menu values ('2', '114');
|
||||
insert into sys_role_menu values ('2', '115');
|
||||
insert into sys_role_menu values ('2', '116');
|
||||
insert into sys_role_menu values ('2', '117');
|
||||
insert into sys_role_menu values ('2', '500');
|
||||
insert into sys_role_menu values ('2', '501');
|
||||
insert into sys_role_menu values ('2', '1000');
|
||||
insert into sys_role_menu values ('2', '1001');
|
||||
insert into sys_role_menu values ('2', '1002');
|
||||
insert into sys_role_menu values ('2', '1003');
|
||||
insert into sys_role_menu values ('2', '1004');
|
||||
insert into sys_role_menu values ('2', '1005');
|
||||
insert into sys_role_menu values ('2', '1006');
|
||||
insert into sys_role_menu values ('2', '1007');
|
||||
insert into sys_role_menu values ('2', '1008');
|
||||
insert into sys_role_menu values ('2', '1009');
|
||||
insert into sys_role_menu values ('2', '1010');
|
||||
insert into sys_role_menu values ('2', '1011');
|
||||
insert into sys_role_menu values ('2', '1012');
|
||||
insert into sys_role_menu values ('2', '1013');
|
||||
insert into sys_role_menu values ('2', '1014');
|
||||
insert into sys_role_menu values ('2', '1015');
|
||||
insert into sys_role_menu values ('2', '1016');
|
||||
insert into sys_role_menu values ('2', '1017');
|
||||
insert into sys_role_menu values ('2', '1018');
|
||||
insert into sys_role_menu values ('2', '1019');
|
||||
insert into sys_role_menu values ('2', '1020');
|
||||
insert into sys_role_menu values ('2', '1021');
|
||||
insert into sys_role_menu values ('2', '1022');
|
||||
insert into sys_role_menu values ('2', '1023');
|
||||
insert into sys_role_menu values ('2', '1024');
|
||||
insert into sys_role_menu values ('2', '1025');
|
||||
insert into sys_role_menu values ('2', '1026');
|
||||
insert into sys_role_menu values ('2', '1027');
|
||||
insert into sys_role_menu values ('2', '1028');
|
||||
insert into sys_role_menu values ('2', '1029');
|
||||
insert into sys_role_menu values ('2', '1030');
|
||||
insert into sys_role_menu values ('2', '1031');
|
||||
insert into sys_role_menu values ('2', '1032');
|
||||
insert into sys_role_menu values ('2', '1033');
|
||||
insert into sys_role_menu values ('2', '1034');
|
||||
insert into sys_role_menu values ('2', '1035');
|
||||
insert into sys_role_menu values ('2', '1036');
|
||||
insert into sys_role_menu values ('2', '1037');
|
||||
insert into sys_role_menu values ('2', '1038');
|
||||
insert into sys_role_menu values ('2', '1039');
|
||||
insert into sys_role_menu values ('2', '1040');
|
||||
insert into sys_role_menu values ('2', '1041');
|
||||
insert into sys_role_menu values ('2', '1042');
|
||||
insert into sys_role_menu values ('2', '1043');
|
||||
insert into sys_role_menu values ('2', '1044');
|
||||
insert into sys_role_menu values ('2', '1045');
|
||||
insert into sys_role_menu values ('2', '1046');
|
||||
insert into sys_role_menu values ('2', '1047');
|
||||
insert into sys_role_menu values ('2', '1048');
|
||||
insert into sys_role_menu values ('2', '1049');
|
||||
insert into sys_role_menu values ('2', '1050');
|
||||
insert into sys_role_menu values ('2', '1051');
|
||||
insert into sys_role_menu values ('2', '1052');
|
||||
insert into sys_role_menu values ('2', '1053');
|
||||
insert into sys_role_menu values ('2', '1054');
|
||||
insert into sys_role_menu values ('2', '1055');
|
||||
insert into sys_role_menu values ('2', '1056');
|
||||
insert into sys_role_menu values ('2', '1057');
|
||||
insert into sys_role_menu values ('2', '1058');
|
||||
insert into sys_role_menu values ('2', '1059');
|
||||
insert into sys_role_menu values ('2', '1060');
|
||||
|
||||
-- ----------------------------
|
||||
-- 8、角色和部门关联表 角色1-N部门
|
||||
-- ----------------------------
|
||||
drop table if exists sys_role_dept;
|
||||
create table sys_role_dept (
|
||||
role_id bigint(20) not null comment '角色ID',
|
||||
dept_id bigint(20) not null comment '部门ID',
|
||||
primary key(role_id, dept_id)
|
||||
) engine=innodb comment = '角色和部门关联表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 初始化-角色和部门关联表数据
|
||||
-- ----------------------------
|
||||
insert into sys_role_dept values ('2', '100');
|
||||
insert into sys_role_dept values ('2', '101');
|
||||
insert into sys_role_dept values ('2', '105');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 9、用户与岗位关联表 用户1-N岗位
|
||||
-- ----------------------------
|
||||
drop table if exists sys_user_post;
|
||||
create table sys_user_post
|
||||
(
|
||||
user_id bigint(20) not null comment '用户ID',
|
||||
post_id bigint(20) not null comment '岗位ID',
|
||||
primary key (user_id, post_id)
|
||||
) engine=innodb comment = '用户与岗位关联表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 初始化-用户与岗位关联表数据
|
||||
-- ----------------------------
|
||||
insert into sys_user_post values ('1', '1');
|
||||
insert into sys_user_post values ('2', '2');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 10、操作日志记录
|
||||
-- ----------------------------
|
||||
drop table if exists sys_oper_log;
|
||||
create table sys_oper_log (
|
||||
oper_id bigint(20) not null auto_increment comment '日志主键',
|
||||
title varchar(50) default '' comment '模块标题',
|
||||
business_type int(2) default 0 comment '业务类型(0其它 1新增 2修改 3删除)',
|
||||
method varchar(200) default '' comment '方法名称',
|
||||
request_method varchar(10) default '' comment '请求方式',
|
||||
operator_type int(1) default 0 comment '操作类别(0其它 1后台用户 2手机端用户)',
|
||||
oper_name varchar(50) default '' comment '操作人员',
|
||||
dept_name varchar(50) default '' comment '部门名称',
|
||||
oper_url varchar(255) default '' comment '请求URL',
|
||||
oper_ip varchar(128) default '' comment '主机地址',
|
||||
oper_location varchar(255) default '' comment '操作地点',
|
||||
oper_param varchar(2000) default '' comment '请求参数',
|
||||
json_result varchar(2000) default '' comment '返回参数',
|
||||
status int(1) default 0 comment '操作状态(0正常 1异常)',
|
||||
error_msg varchar(2000) default '' comment '错误消息',
|
||||
oper_time datetime comment '操作时间',
|
||||
cost_time bigint(20) default 0 comment '消耗时间',
|
||||
primary key (oper_id),
|
||||
key idx_sys_oper_log_bt (business_type),
|
||||
key idx_sys_oper_log_s (status),
|
||||
key idx_sys_oper_log_ot (oper_time)
|
||||
) engine=innodb auto_increment=100 comment = '操作日志记录';
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 11、字典类型表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_dict_type;
|
||||
create table sys_dict_type
|
||||
(
|
||||
dict_id bigint(20) not null auto_increment comment '字典主键',
|
||||
dict_name varchar(100) default '' comment '字典名称',
|
||||
dict_type varchar(100) default '' comment '字典类型',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (dict_id),
|
||||
unique (dict_type)
|
||||
) engine=innodb auto_increment=100 comment = '字典类型表';
|
||||
|
||||
insert into sys_dict_type values(1, '用户性别', 'sys_user_sex', '0', 'admin', sysdate(), '', null, '用户性别列表');
|
||||
insert into sys_dict_type values(2, '菜单状态', 'sys_show_hide', '0', 'admin', sysdate(), '', null, '菜单状态列表');
|
||||
insert into sys_dict_type values(3, '系统开关', 'sys_normal_disable', '0', 'admin', sysdate(), '', null, '系统开关列表');
|
||||
insert into sys_dict_type values(4, '任务状态', 'sys_job_status', '0', 'admin', sysdate(), '', null, '任务状态列表');
|
||||
insert into sys_dict_type values(5, '任务分组', 'sys_job_group', '0', 'admin', sysdate(), '', null, '任务分组列表');
|
||||
insert into sys_dict_type values(6, '系统是否', 'sys_yes_no', '0', 'admin', sysdate(), '', null, '系统是否列表');
|
||||
insert into sys_dict_type values(7, '通知类型', 'sys_notice_type', '0', 'admin', sysdate(), '', null, '通知类型列表');
|
||||
insert into sys_dict_type values(8, '通知状态', 'sys_notice_status', '0', 'admin', sysdate(), '', null, '通知状态列表');
|
||||
insert into sys_dict_type values(9, '操作类型', 'sys_oper_type', '0', 'admin', sysdate(), '', null, '操作类型列表');
|
||||
insert into sys_dict_type values(10, '系统状态', 'sys_common_status', '0', 'admin', sysdate(), '', null, '登录状态列表');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 12、字典数据表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_dict_data;
|
||||
create table sys_dict_data
|
||||
(
|
||||
dict_code bigint(20) not null auto_increment comment '字典编码',
|
||||
dict_sort int(4) default 0 comment '字典排序',
|
||||
dict_label varchar(100) default '' comment '字典标签',
|
||||
dict_value varchar(100) default '' comment '字典键值',
|
||||
dict_type varchar(100) default '' comment '字典类型',
|
||||
css_class varchar(100) default null comment '样式属性(其他样式扩展)',
|
||||
list_class varchar(100) default null comment '表格回显样式',
|
||||
is_default char(1) default 'N' comment '是否默认(Y是 N否)',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (dict_code)
|
||||
) engine=innodb auto_increment=100 comment = '字典数据表';
|
||||
|
||||
insert into sys_dict_data values(1, 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', sysdate(), '', null, '性别男');
|
||||
insert into sys_dict_data values(2, 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', sysdate(), '', null, '性别女');
|
||||
insert into sys_dict_data values(3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', sysdate(), '', null, '性别未知');
|
||||
insert into sys_dict_data values(4, 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '显示菜单');
|
||||
insert into sys_dict_data values(5, 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '隐藏菜单');
|
||||
insert into sys_dict_data values(6, 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态');
|
||||
insert into sys_dict_data values(7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态');
|
||||
insert into sys_dict_data values(8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态');
|
||||
insert into sys_dict_data values(9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态');
|
||||
insert into sys_dict_data values(10, 1, '默认', 'DEFAULT', 'sys_job_group', '', '', 'Y', '0', 'admin', sysdate(), '', null, '默认分组');
|
||||
insert into sys_dict_data values(11, 2, '系统', 'SYSTEM', 'sys_job_group', '', '', 'N', '0', 'admin', sysdate(), '', null, '系统分组');
|
||||
insert into sys_dict_data values(12, 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '系统默认是');
|
||||
insert into sys_dict_data values(13, 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '系统默认否');
|
||||
insert into sys_dict_data values(14, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', sysdate(), '', null, '通知');
|
||||
insert into sys_dict_data values(15, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', sysdate(), '', null, '公告');
|
||||
insert into sys_dict_data values(16, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', sysdate(), '', null, '正常状态');
|
||||
insert into sys_dict_data values(17, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '关闭状态');
|
||||
insert into sys_dict_data values(18, 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '其他操作');
|
||||
insert into sys_dict_data values(19, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '新增操作');
|
||||
insert into sys_dict_data values(20, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', sysdate(), '', null, '修改操作');
|
||||
insert into sys_dict_data values(21, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '删除操作');
|
||||
insert into sys_dict_data values(22, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '授权操作');
|
||||
insert into sys_dict_data values(23, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导出操作');
|
||||
insert into sys_dict_data values(24, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '导入操作');
|
||||
insert into sys_dict_data values(25, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '强退操作');
|
||||
insert into sys_dict_data values(26, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', sysdate(), '', null, '生成操作');
|
||||
insert into sys_dict_data values(27, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '清空操作');
|
||||
insert into sys_dict_data values(28, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', sysdate(), '', null, '正常状态');
|
||||
insert into sys_dict_data values(29, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', sysdate(), '', null, '停用状态');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 13、参数配置表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_config;
|
||||
create table sys_config (
|
||||
config_id int(5) not null auto_increment comment '参数主键',
|
||||
config_name varchar(100) default '' comment '参数名称',
|
||||
config_key varchar(100) default '' comment '参数键名',
|
||||
config_value varchar(500) default '' comment '参数键值',
|
||||
config_type char(1) default 'N' comment '系统内置(Y是 N否)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (config_id)
|
||||
) engine=innodb auto_increment=100 comment = '参数配置表';
|
||||
|
||||
insert into sys_config values(1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', sysdate(), '', null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' );
|
||||
insert into sys_config values(2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', sysdate(), '', null, '初始化密码 123456' );
|
||||
insert into sys_config values(3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', sysdate(), '', null, '深色主题theme-dark,浅色主题theme-light' );
|
||||
insert into sys_config values(4, '账号自助-验证码开关', 'sys.account.captchaEnabled', 'true', 'Y', 'admin', sysdate(), '', null, '是否开启验证码功能(true开启,false关闭)');
|
||||
insert into sys_config values(5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 'admin', sysdate(), '', null, '是否开启注册用户功能(true开启,false关闭)');
|
||||
insert into sys_config values(6, '用户登录-黑名单列表', 'sys.login.blackIPList', '', 'Y', 'admin', sysdate(), '', null, '设置登录IP黑名单限制,多个匹配项以;分隔,支持匹配(*通配、网段)');
|
||||
insert into sys_config values(7, '用户管理-初始密码修改策略', 'sys.account.initPasswordModify', '1', 'Y', 'admin', sysdate(), '', null, '0:初始密码修改策略关闭,没有任何提示,1:提醒用户,如果未修改初始密码,则在登录时就会提醒修改密码对话框');
|
||||
insert into sys_config values(8, '用户管理-账号密码更新周期', 'sys.account.passwordValidateDays', '0', 'Y', 'admin', sysdate(), '', null, '密码更新周期(填写数字,数据初始化值为0不限制,若修改必须为大于0小于365的正整数),如果超过这个周期登录系统时,则在登录时就会提醒修改密码对话框');
|
||||
insert into sys_config values(9, '用户管理-密码字符范围', 'sys.account.chrtype', '0', 'Y', 'admin', sysdate(), '', null, '默认任意字符范围,0任意(密码可以输入任意字符),1数字(密码只能为0-9数字),2英文字母(密码只能为a-z和A-Z字母),3字母和数字(密码必须包含字母,数字),4字母数字和特殊字符(目前支持的特殊字符包括:~!@#$%^&*()-=_+)');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 14、系统访问记录
|
||||
-- ----------------------------
|
||||
drop table if exists sys_logininfor;
|
||||
create table sys_logininfor (
|
||||
info_id bigint(20) not null auto_increment comment '访问ID',
|
||||
user_name varchar(50) default '' comment '用户账号',
|
||||
ipaddr varchar(128) default '' comment '登录IP地址',
|
||||
login_location varchar(255) default '' comment '登录地点',
|
||||
browser varchar(50) default '' comment '浏览器类型',
|
||||
os varchar(50) default '' comment '操作系统',
|
||||
status char(1) default '0' comment '登录状态(0成功 1失败)',
|
||||
msg varchar(255) default '' comment '提示消息',
|
||||
login_time datetime comment '访问时间',
|
||||
primary key (info_id),
|
||||
key idx_sys_logininfor_s (status),
|
||||
key idx_sys_logininfor_lt (login_time)
|
||||
) engine=innodb auto_increment=100 comment = '系统访问记录';
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 15、定时任务调度表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_job;
|
||||
create table sys_job (
|
||||
job_id bigint(20) not null auto_increment comment '任务ID',
|
||||
job_name varchar(64) default '' comment '任务名称',
|
||||
job_group varchar(64) default 'DEFAULT' comment '任务组名',
|
||||
invoke_target varchar(500) not null comment '调用目标字符串',
|
||||
cron_expression varchar(255) default '' comment 'cron执行表达式',
|
||||
misfire_policy varchar(20) default '3' comment '计划执行错误策略(1立即执行 2执行一次 3放弃执行)',
|
||||
concurrent char(1) default '1' comment '是否并发执行(0允许 1禁止)',
|
||||
status char(1) default '0' comment '状态(0正常 1暂停)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default '' comment '备注信息',
|
||||
primary key (job_id, job_name, job_group)
|
||||
) engine=innodb auto_increment=100 comment = '定时任务调度表';
|
||||
|
||||
insert into sys_job values(1, '系统默认(无参)', 'DEFAULT', 'ryTask.ryNoParams', '0/10 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_job values(2, '系统默认(有参)', 'DEFAULT', 'ryTask.ryParams(\'ry\')', '0/15 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, '');
|
||||
insert into sys_job values(3, '系统默认(多参)', 'DEFAULT', 'ryTask.ryMultipleParams(\'ry\', true, 2000L, 316.50D, 100)', '0/20 * * * * ?', '3', '1', '1', 'admin', sysdate(), '', null, '');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 16、定时任务调度日志表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_job_log;
|
||||
create table sys_job_log (
|
||||
job_log_id bigint(20) not null auto_increment comment '任务日志ID',
|
||||
job_name varchar(64) not null comment '任务名称',
|
||||
job_group varchar(64) not null comment '任务组名',
|
||||
invoke_target varchar(500) not null comment '调用目标字符串',
|
||||
job_message varchar(500) comment '日志信息',
|
||||
status char(1) default '0' comment '执行状态(0正常 1失败)',
|
||||
exception_info varchar(2000) default '' comment '异常信息',
|
||||
start_time datetime comment '执行开始时间',
|
||||
end_time datetime comment '执行结束时间',
|
||||
create_time datetime comment '创建时间',
|
||||
primary key (job_log_id)
|
||||
) engine=innodb comment = '定时任务调度日志表';
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 17、通知公告表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_notice;
|
||||
create table sys_notice (
|
||||
notice_id int(4) not null auto_increment comment '公告ID',
|
||||
notice_title varchar(50) not null comment '公告标题',
|
||||
notice_type char(1) not null comment '公告类型(1通知 2公告)',
|
||||
notice_content longblob default null comment '公告内容',
|
||||
status char(1) default '0' comment '公告状态(0正常 1关闭)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(255) default null comment '备注',
|
||||
primary key (notice_id)
|
||||
) engine=innodb auto_increment=10 comment = '通知公告表';
|
||||
|
||||
-- ----------------------------
|
||||
-- 初始化-公告信息表数据
|
||||
-- ----------------------------
|
||||
insert into sys_notice values('1', '温馨提醒:2018-07-01 若依新版本发布啦', '2', '新版本内容', '0', 'admin', sysdate(), '', null, '管理员');
|
||||
insert into sys_notice values('2', '维护通知:2018-07-01 若依系统凌晨维护', '1', '维护内容', '0', 'admin', sysdate(), '', null, '管理员');
|
||||
insert into sys_notice values('3', '若依开源框架介绍', '1', '<p><span style=\"color: rgb(230, 0, 0);\">项目介绍</span></p><p><font color=\"#333333\">RuoYi开源项目是为企业用户定制的后台脚手架框架,为企业打造的一站式解决方案,降低企业开发成本,提升开发效率。主要包括用户管理、角色管理、部门管理、菜单管理、参数管理、字典管理、</font><span style=\"color: rgb(51, 51, 51);\">岗位管理</span><span style=\"color: rgb(51, 51, 51);\">、定时任务</span><span style=\"color: rgb(51, 51, 51);\">、</span><span style=\"color: rgb(51, 51, 51);\">服务监控、登录日志、操作日志、代码生成等功能。其中,还支持多数据源、数据权限、国际化、Redis缓存、Docker部署、滑动验证码、第三方认证登录、分布式事务、</span><font color=\"#333333\">分布式文件存储</font><span style=\"color: rgb(51, 51, 51);\">、分库分表处理等技术特点。</span></p><p><img src=\"https://foruda.gitee.com/images/1773931848342439032/a4d22313_1815095.png\" style=\"width: 64px;\"><br></p><p><span style=\"color: rgb(230, 0, 0);\">官网及演示</span></p><p><span style=\"color: rgb(51, 51, 51);\">若依官网地址: </span><a href=\"http://ruoyi.vip\" target=\"_blank\">http://ruoyi.vip</a><a href=\"http://ruoyi.vip\" target=\"_blank\"></a></p><p><span style=\"color: rgb(51, 51, 51);\">若依文档地址: </span><a href=\"http://doc.ruoyi.vip\" target=\"_blank\">http://doc.ruoyi.vip</a><br></p><p><span style=\"color: rgb(51, 51, 51);\">演示地址【不分离版】: </span><a href=\"http://demo.ruoyi.vip\" target=\"_blank\">http://demo.ruoyi.vip</a></p><p><span style=\"color: rgb(51, 51, 51);\">演示地址【分离版本】: </span><a href=\"http://vue.ruoyi.vip\" target=\"_blank\">http://vue.ruoyi.vip</a></p><p><span style=\"color: rgb(51, 51, 51);\">演示地址【微服务版】: </span><a href=\"http://cloud.ruoyi.vip\" target=\"_blank\">http://cloud.ruoyi.vip</a></p><p><span style=\"color: rgb(51, 51, 51);\">演示地址【移动端版】: </span><a href=\"http://h5.ruoyi.vip\" target=\"_blank\">http://h5.ruoyi.vip</a></p><p><br style=\"color: rgb(48, 49, 51); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 12px;\"></p>', '0', 'admin', sysdate(), '', null, '管理员');
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 18、公告已读记录表
|
||||
-- ----------------------------
|
||||
drop table if exists sys_notice_read;
|
||||
create table sys_notice_read (
|
||||
read_id bigint(20) not null auto_increment comment '已读主键',
|
||||
notice_id int(4) not null comment '公告id',
|
||||
user_id bigint(20) not null comment '用户id',
|
||||
read_time datetime not null comment '阅读时间',
|
||||
primary key (read_id),
|
||||
unique key uk_user_notice (user_id, notice_id) comment '同一用户同一公告只记录一次'
|
||||
) engine=innodb auto_increment=1 comment='公告已读记录表';
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 19、代码生成业务表
|
||||
-- ----------------------------
|
||||
drop table if exists gen_table;
|
||||
create table gen_table (
|
||||
table_id bigint(20) not null auto_increment comment '编号',
|
||||
table_name varchar(200) default '' comment '表名称',
|
||||
table_comment varchar(500) default '' comment '表描述',
|
||||
sub_table_name varchar(64) default null comment '关联子表的表名',
|
||||
sub_table_fk_name varchar(64) default null comment '子表关联的外键名',
|
||||
class_name varchar(100) default '' comment '实体类名称',
|
||||
tpl_category varchar(200) default 'crud' comment '使用的模板(crud单表操作 tree树表操作)',
|
||||
tpl_web_type varchar(30) default '' comment '前端模板类型(element-ui模版 element-plus模版)',
|
||||
package_name varchar(100) comment '生成包路径',
|
||||
module_name varchar(30) comment '生成模块名',
|
||||
business_name varchar(30) comment '生成业务名',
|
||||
function_name varchar(50) comment '生成功能名',
|
||||
function_author varchar(50) comment '生成功能作者',
|
||||
form_col_num int(1) default 1 comment '表单布局(单列 双列 三列)',
|
||||
gen_type char(1) default '0' comment '生成代码方式(0zip压缩包 1自定义路径)',
|
||||
gen_path varchar(200) default '/' comment '生成路径(不填默认项目路径)',
|
||||
options varchar(1000) comment '其它生成选项',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (table_id)
|
||||
) engine=innodb auto_increment=1 comment = '代码生成业务表';
|
||||
|
||||
|
||||
-- ----------------------------
|
||||
-- 20、代码生成业务表字段
|
||||
-- ----------------------------
|
||||
drop table if exists gen_table_column;
|
||||
create table gen_table_column (
|
||||
column_id bigint(20) not null auto_increment comment '编号',
|
||||
table_id bigint(20) comment '归属表编号',
|
||||
column_name varchar(200) comment '列名称',
|
||||
column_comment varchar(500) comment '列描述',
|
||||
column_type varchar(100) comment '列类型',
|
||||
java_type varchar(500) comment 'JAVA类型',
|
||||
java_field varchar(200) comment 'JAVA字段名',
|
||||
is_pk char(1) comment '是否主键(1是)',
|
||||
is_increment char(1) comment '是否自增(1是)',
|
||||
is_required char(1) comment '是否必填(1是)',
|
||||
is_insert char(1) comment '是否为插入字段(1是)',
|
||||
is_edit char(1) comment '是否编辑字段(1是)',
|
||||
is_list char(1) comment '是否列表字段(1是)',
|
||||
is_query char(1) comment '是否查询字段(1是)',
|
||||
query_type varchar(200) default 'EQ' comment '查询方式(等于、不等于、大于、小于、范围)',
|
||||
html_type varchar(200) comment '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',
|
||||
dict_type varchar(200) default '' comment '字典类型',
|
||||
sort int comment '排序',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
primary key (column_id)
|
||||
) engine=innodb auto_increment=1 comment = '代码生成业务表字段';
|
||||
@@ -0,0 +1,72 @@
|
||||
-- =========================================================================
|
||||
-- 存量升级:D13 开门方式字典归一(v1 库)
|
||||
--
|
||||
-- 背景:v1 的 lock_open_type 同时存在两套编码——
|
||||
-- 平台自造:01 人脸 / 02 密码 / 03 指纹 / 04 IC卡 / 05 远程开锁 / 06 机械钥匙 / 99 其他;
|
||||
-- 设备实测:2 密码 / 3 IC卡 / 4 指纹 / 5 二维码 / 7 人脸。
|
||||
-- 归一后只保留设备码,平台远程开锁固定为 9,与 lock_v2.sql 及架构设计 §9.4 一致。
|
||||
--
|
||||
-- 执行前置:备份 lock_access_log / sys_dict_data / sys_dict_type。
|
||||
-- 可重复执行:映射只命中旧码,字典按 dict_type 先删后插。
|
||||
--
|
||||
-- 注意:外部报表/大屏若硬编码了 01/02 等旧值,需同步改为设备码。
|
||||
-- =========================================================================
|
||||
|
||||
set names utf8mb4;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 1、历史通行记录:旧自造码 → 设备码
|
||||
-- 06 机械钥匙 / 99 其他不是设备上报值,不自动改写(raw_params 仍保留原值),
|
||||
-- 如确有数据请人工确认后再处理;文末给出残留核对语句。
|
||||
-- =========================================================================
|
||||
update lock_access_log
|
||||
set open_type = case open_type
|
||||
when '01' then '7'
|
||||
when '02' then '2'
|
||||
when '03' then '4'
|
||||
when '04' then '3'
|
||||
when '05' then '9'
|
||||
else open_type
|
||||
end
|
||||
where open_type in ('01', '02', '03', '04', '05');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 2、字典:lock_open_type 只保留设备码 + 平台远程 9
|
||||
-- =========================================================================
|
||||
delete from sys_dict_data where dict_type = 'lock_open_type';
|
||||
|
||||
update sys_dict_type
|
||||
set remark = '只保留设备码(2密码 3IC卡 4指纹 5二维码 7人脸 9远程开锁)',
|
||||
update_by = 'migrate',
|
||||
update_time = now()
|
||||
where dict_type = 'lock_open_type';
|
||||
|
||||
insert into sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) values
|
||||
(110, 1, '密码', '2', 'lock_open_type', '', 'primary', 'N', '0', 'admin', now(), '设备码'),
|
||||
(111, 2, 'IC卡', '3', 'lock_open_type', '', 'primary', 'N', '0', 'admin', now(), '设备码'),
|
||||
(112, 3, '指纹', '4', 'lock_open_type', '', 'primary', 'N', '0', 'admin', now(), '设备码'),
|
||||
(113, 4, '二维码', '5', 'lock_open_type', '', 'primary', 'N', '0', 'admin', now(), '设备码'),
|
||||
(114, 5, '人脸', '7', 'lock_open_type', '', 'success', 'Y', '0', 'admin', now(), '设备码,实测值'),
|
||||
(115, 6, '远程开锁', '9', 'lock_open_type', '', 'warning', 'N', '0', 'admin', now(), '平台生成,非设备上报');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 3、核对
|
||||
-- =========================================================================
|
||||
-- 3.1 归一后的分布(应只剩 2/3/4/5/7/9 与空值)
|
||||
-- select open_type, count(*) from lock_access_log group by open_type order by open_type;
|
||||
|
||||
-- 3.2 残留旧码/未知码(正常情况下应为空)
|
||||
-- select open_type, count(*) from lock_access_log
|
||||
-- where open_type is not null and open_type not in ('2','3','4','5','7','9')
|
||||
-- group by open_type;
|
||||
|
||||
-- 3.3 字典核对(应为 6 条)
|
||||
-- select dict_value, dict_label from sys_dict_data where dict_type = 'lock_open_type' order by dict_sort;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 脚本结束
|
||||
-- =========================================================================
|
||||
@@ -0,0 +1,150 @@
|
||||
-- =========================================================================
|
||||
-- 存量升级:D17 一锁多网关(v1 库)
|
||||
--
|
||||
-- 背景:v1 的 lock_device 只有单个 gateway_id/group_id,同一把锁被两个网关
|
||||
-- 登记时后写入覆盖前值。D17 新增 lock_device_gateway 作为归属事实源:
|
||||
-- 一个 (device_id, gateway_id) 一行,分别记录该网关视角下的信号、在线、
|
||||
-- locklist 下发状态;lock_device.gateway_id/group_id 退化为「当前主控网关」
|
||||
-- 缓存,下发前由 RouteResolver 按 R1-R4 实时选路。
|
||||
--
|
||||
-- 执行前置:
|
||||
-- 1) 停止应用(至少停止门禁业务的下发与上行消费);
|
||||
-- 2) 备份 lock_device / lock_gateway / sys_dict_type / sys_dict_data;
|
||||
-- 3) 先执行本脚本,再发布包含 D17 代码的版本。旧代码不认识新表,可继续
|
||||
-- 运行;新代码在归属表为空时会拒绝下发,因此不要跳过回填。
|
||||
--
|
||||
-- 可重复执行:建表用 if not exists,回填用 insert ... on duplicate key update。
|
||||
-- =========================================================================
|
||||
|
||||
set names utf8mb4;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 1、门锁-网关归属表
|
||||
-- =========================================================================
|
||||
create table if not exists lock_device_gateway (
|
||||
rel_id bigint(20) not null auto_increment comment '归属关系ID',
|
||||
device_id bigint(20) not null comment '门锁ID(lock_device.device_id)',
|
||||
gateway_id bigint(20) not null comment '网关ID(lock_gateway.gateway_id)',
|
||||
signal_strength varchar(8) default null comment '该网关视角下的锁信号强度(dBm,如 -42,用于选路比较)',
|
||||
last_signal_time datetime comment '该网关最后一次上报本锁信号/状态的时间',
|
||||
online_status char(1) default '2' comment '该网关视角下的锁在线状态(0在线 1离线 2未知,字典 lock_online_status)',
|
||||
bind_status char(1) default '0' comment 'locklist 下发状态(0待下发 1已下发 2下发失败,字典 lock_bind_status)',
|
||||
bind_msg varchar(512) default null comment 'locklist 下发结果说明',
|
||||
bind_time datetime comment '首次登记到该网关的时间',
|
||||
last_sync_time datetime comment '最后一次 locklist 同步时间',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (rel_id),
|
||||
unique key uk_lock_device_gateway (device_id, gateway_id),
|
||||
key idx_lock_dg_gateway (gateway_id),
|
||||
key idx_lock_dg_device (device_id),
|
||||
key idx_lock_dg_route (gateway_id, online_status, last_signal_time),
|
||||
key idx_lock_dg_bind (bind_status)
|
||||
) engine=innodb comment = '门锁-网关归属表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 2、回填:存量「一锁一网关」关系转成归属记录
|
||||
-- - 只回填网关仍存在的记录;
|
||||
-- - bind_status 记为 1(已下发):这些锁在旧模型下已经实际绑定并在用,
|
||||
-- 若不确定,可在回填后统一改为 0(待下发)并由后台重新下发 locklist;
|
||||
-- - 信号/在线取 lock_device 上的聚合值,作为该网关视角的初始值。
|
||||
-- =========================================================================
|
||||
insert into lock_device_gateway (
|
||||
device_id, gateway_id, signal_strength, last_signal_time, online_status,
|
||||
bind_status, bind_time, last_sync_time, status, del_flag, create_by, create_time, remark
|
||||
)
|
||||
select d.device_id,
|
||||
d.gateway_id,
|
||||
d.signal_strength,
|
||||
d.last_status_time,
|
||||
coalesce(d.online_status, '2'),
|
||||
'1',
|
||||
d.bind_time,
|
||||
d.bind_time,
|
||||
'0',
|
||||
'0',
|
||||
'migrate',
|
||||
now(),
|
||||
'D17 存量回填'
|
||||
from lock_device d
|
||||
join lock_gateway g on g.gateway_id = d.gateway_id
|
||||
where d.gateway_id is not null
|
||||
and d.del_flag = '0'
|
||||
and g.del_flag = '0'
|
||||
on duplicate key update
|
||||
status = '0',
|
||||
del_flag = '0',
|
||||
update_by = 'migrate',
|
||||
update_time = now();
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 3、校正主控网关缓存:group_id 以网关实际分组为准
|
||||
-- 回填后把 lock_device.group_id 与网关分组对齐,避免旧数据中的冗余列失真。
|
||||
-- =========================================================================
|
||||
update lock_device d
|
||||
join lock_gateway g on g.gateway_id = d.gateway_id
|
||||
set d.group_id = g.group_id,
|
||||
d.update_time = now()
|
||||
where d.gateway_id is not null
|
||||
and (d.group_id is null or d.group_id <> g.group_id);
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 4、字典:lock_bind_status(locklist 下发状态)
|
||||
-- =========================================================================
|
||||
delete from sys_dict_data where dict_type = 'lock_bind_status';
|
||||
|
||||
delete from sys_dict_type where dict_type = 'lock_bind_status';
|
||||
|
||||
insert into sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark) values
|
||||
('门锁绑定状态', 'lock_bind_status', '0', 'admin', now(), 'locklist 下发状态');
|
||||
|
||||
insert into sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) values
|
||||
(1, '待下发', '0', 'lock_bind_status', '', 'info', 'Y', '0', 'admin', now(), ''),
|
||||
(2, '已下发', '1', 'lock_bind_status', '', 'success', 'N', '0', 'admin', now(), '网关已接收 locklist'),
|
||||
(3, '下发失败', '2', 'lock_bind_status', '', 'danger', 'N', '0', 'admin', now(), '');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 5、执行后核对(只读,按需执行)
|
||||
-- =========================================================================
|
||||
-- 5.1 归属记录数与已绑定门锁数应一致
|
||||
-- select (select count(1) from lock_device_gateway where del_flag = '0') as rel_cnt,
|
||||
-- (select count(1) from lock_device where gateway_id is not null and del_flag = '0') as bound_device_cnt;
|
||||
--
|
||||
-- 5.2 已绑定但缺归属记录的门锁(应为空;有值说明网关已删除或回填被跳过)
|
||||
-- select d.device_id, d.device_sn, d.gateway_id
|
||||
-- from lock_device d
|
||||
-- left join lock_device_gateway dg
|
||||
-- on dg.device_id = d.device_id and dg.gateway_id = d.gateway_id and dg.del_flag = '0'
|
||||
-- where d.gateway_id is not null and d.del_flag = '0' and dg.rel_id is null;
|
||||
--
|
||||
-- 5.3 主控缓存与归属表不一致的门锁(下发前会由 RouteResolver 实时纠正)
|
||||
-- select d.device_id, d.device_sn, d.gateway_id, d.group_id, g.group_id as gateway_group_id
|
||||
-- from lock_device d
|
||||
-- left join lock_gateway g on g.gateway_id = d.gateway_id
|
||||
-- where d.gateway_id is not null and d.group_id <> g.group_id;
|
||||
--
|
||||
-- 5.4 字典
|
||||
-- select dict_type, count(1) from sys_dict_data
|
||||
-- where dict_type = 'lock_bind_status' group by dict_type; -- 期望 3
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 6、回滚
|
||||
-- 新代码依赖归属表,不能只删表:先回退到不含 D17 的应用版本,再执行:
|
||||
-- delete from sys_dict_data where dict_type = 'lock_bind_status';
|
||||
-- delete from sys_dict_type where dict_type = 'lock_bind_status';
|
||||
-- drop table if exists lock_device_gateway;
|
||||
-- lock_device.gateway_id/group_id 未被本脚本改写(仅按网关分组校正了
|
||||
-- group_id),回退后旧代码可直接按原字段工作。已执行的 group_id 校正如需
|
||||
-- 还原,请使用备份。
|
||||
-- =========================================================================
|
||||
@@ -0,0 +1,199 @@
|
||||
-- =========================================================================
|
||||
-- 存量升级:D19 住宿管理(v1 库)
|
||||
--
|
||||
-- 背景:新增「房间」与「入住单」两个业务对象。房间是住宿主体,门锁分配给
|
||||
-- 房间(一房一锁);入住单记录谁在什么时间段住哪个房间,入住/退房/换房
|
||||
-- 都翻译成对既有 lock_auth 的操作(有效期 + 幂等新增 + 单人删除),
|
||||
-- 不新建"住宿授权表"。
|
||||
--
|
||||
-- 本文档对应设计:doc/住宿管理模块设计.md
|
||||
--
|
||||
-- 执行前置:
|
||||
-- 1) 备份 lock_device / sys_dict_type / sys_dict_data / sys_menu;
|
||||
-- 2) 本脚本可重复执行(建表 if not exists、字典先删后插、回填 insert ignore);
|
||||
-- 3) 建议在门禁业务低峰期执行;S1 上线只需本脚本,S2(住宿页)另追加菜单。
|
||||
--
|
||||
-- 阶段说明:
|
||||
-- - S1(房间管理):建两张表、三组字典、房间菜单与按钮;
|
||||
-- - S2(住宿管理):追加 2130 住宿菜单与前端页面,无需再改表结构。
|
||||
-- =========================================================================
|
||||
|
||||
set names utf8mb4;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 1、房间表
|
||||
-- 一房一锁:device_id 唯一(未绑锁的房间 device_id 为 null,不参与唯一约束)。
|
||||
-- room_status 兼作入住闸门:只有 0空闲 可办理入住;1在住/2维修/3停用 不可。
|
||||
-- current_stay_id / current_person_no 为房态冗余,入住/退房时与 lock_stay 同事务维护。
|
||||
-- =========================================================================
|
||||
create table if not exists lock_room (
|
||||
room_id bigint(20) not null auto_increment comment '房间ID',
|
||||
room_code varchar(64) not null comment '房间编码(全局唯一,建议 公寓编号-房号,如 FFFA26102918-1203)',
|
||||
room_no varchar(32) not null comment '房号(显示用,如 1203)',
|
||||
room_name varchar(64) default null comment '房间名称/房型说明',
|
||||
group_id bigint(20) default null comment '所属公寓/分区(lock_group.group_id)',
|
||||
building varchar(32) default null comment '楼栋',
|
||||
floor int(4) default null comment '楼层',
|
||||
capacity int(4) default 1 comment '可住人数(仅作参考,系统不限制入住人数)',
|
||||
device_id bigint(20) default null comment '绑定门锁(lock_device.device_id),一房一锁',
|
||||
room_status char(1) default '0' comment '房态(0空闲 1在住 2维修 3停用,字典 lock_room_status)',
|
||||
current_stay_id bigint(20) default null comment '当前在住入住单ID(冗余,空即无人在住)',
|
||||
current_person_no varchar(32) default null comment '当前在住人员编号(冗余)',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (room_id),
|
||||
unique key uk_lock_room_code (room_code),
|
||||
unique key uk_lock_room_device (device_id),
|
||||
key idx_lock_room_group (group_id),
|
||||
key idx_lock_room_status (room_status),
|
||||
key idx_lock_room_no (room_no)
|
||||
) engine=innodb comment = '房间表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 2、入住单表
|
||||
-- 一条入住单对应一条 lock_auth(auth_type='01' 人脸);
|
||||
-- stay_status 0待入住 1在住 2已退房 3已换房 4已取消。
|
||||
-- 同一房间同时只能一条 1在住(房间行锁保证);同一人可同时在多个房间。
|
||||
-- =========================================================================
|
||||
create table if not exists lock_stay (
|
||||
stay_id bigint(20) not null auto_increment comment '入住单ID',
|
||||
stay_no varchar(32) not null comment '入住编号(业务唯一,建议 STAY+日期+序号)',
|
||||
person_id bigint(20) not null comment '人员ID',
|
||||
person_no varchar(32) not null comment '人员编号(协议键,冗余)',
|
||||
person_name varchar(64) default null comment '人员姓名(冗余快照)',
|
||||
guest_type char(1) default '0' comment '入住人员类型(0内部 1外部,字典 lock_guest_type)',
|
||||
room_id bigint(20) not null comment '房间ID',
|
||||
room_code varchar(64) default null comment '房间编码(冗余快照)',
|
||||
device_id bigint(20) default null comment '入住时的门锁ID(冗余快照)',
|
||||
device_sn varchar(32) default null comment '门锁SN(冗余快照)',
|
||||
auth_id bigint(20) default null comment '对应 lock_auth.auth_id',
|
||||
begin_time datetime not null comment '入住开始时间(授权生效起)',
|
||||
end_time datetime not null comment '预计退房时间(授权生效止)',
|
||||
checkin_time datetime comment '实际入住时间',
|
||||
checkout_time datetime comment '实际退房/换房时间',
|
||||
change_from_id bigint(20) default null comment '换房来源入住单ID',
|
||||
stay_status char(1) default '0' comment '入住状态(0待入住 1在住 2已退房 3已换房 4已取消,字典 lock_stay_status)',
|
||||
auth_status char(1) default '0' comment '人脸授权状态(0待下发 1已下发 2成功 3失败,字典 lock_sync_status)',
|
||||
auth_msg varchar(512) default null comment '授权下发结果说明',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (stay_id),
|
||||
unique key uk_lock_stay_no (stay_no),
|
||||
key idx_lock_stay_person (person_no, stay_status),
|
||||
key idx_lock_stay_room (room_id, stay_status),
|
||||
key idx_lock_stay_end (end_time, stay_status),
|
||||
key idx_lock_stay_auth (auth_id)
|
||||
) engine=innodb comment = '入住单表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 3、字典
|
||||
-- =========================================================================
|
||||
delete from sys_dict_data where dict_type in ('lock_room_status', 'lock_guest_type', 'lock_stay_status');
|
||||
|
||||
delete from sys_dict_type where dict_type in ('lock_room_status', 'lock_guest_type', 'lock_stay_status');
|
||||
|
||||
insert into sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark) values
|
||||
('房间状态', 'lock_room_status', '0', 'admin', now(), '住宿房间房态'),
|
||||
('入住人员类型', 'lock_guest_type', '0', 'admin', now(), '住宿入住人员内部/外部'),
|
||||
('入住状态', 'lock_stay_status', '0', 'admin', now(), '入住单状态');
|
||||
|
||||
insert into sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) values
|
||||
(1, '空闲', '0', 'lock_room_status', '', 'success', 'Y', '0', 'admin', now(), '可办理入住'),
|
||||
(2, '在住', '1', 'lock_room_status', '', 'primary', 'N', '0', 'admin', now(), ''),
|
||||
(3, '维修', '2', 'lock_room_status', '', 'warning', 'N', '0', 'admin', now(), '不可办理入住'),
|
||||
(4, '停用', '3', 'lock_room_status', '', 'danger', 'N', '0', 'admin', now(), '不可办理入住'),
|
||||
(1, '内部', '0', 'lock_guest_type', '', 'primary', 'Y', '0', 'admin', now(), '住户/员工'),
|
||||
(2, '外部', '1', 'lock_guest_type', '', 'info', 'N', '0', 'admin', now(), '访客等外部人员'),
|
||||
(1, '待入住', '0', 'lock_stay_status', '', 'info', 'N', '0', 'admin', now(), ''),
|
||||
(2, '在住', '1', 'lock_stay_status', '', 'success', 'Y', '0', 'admin', now(), ''),
|
||||
(3, '已退房', '2', 'lock_stay_status', '', 'info', 'N', '0', 'admin', now(), ''),
|
||||
(4, '已换房', '3', 'lock_stay_status', '', 'warning', 'N', '0', 'admin', now(), ''),
|
||||
(5, '已取消', '4', 'lock_stay_status', '', 'danger', 'N', '0', 'admin', now(), '');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 4、菜单:房间管理(S1)与住宿管理(S2)
|
||||
-- 一级目录沿用 2000 门禁管理;号段 2120 房间、2130 住宿,与人员 2100 错开。
|
||||
-- =========================================================================
|
||||
delete from sys_menu where perms like 'lock:room:%';
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2120, '房间管理', 2000, 11, 'room', 'iot/room/index', '', '', 1, 0, 'C', '0', '0', 'lock:room:list', 'tree', 'admin', CURRENT_TIMESTAMP, '住宿房间菜单');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2121, '房间查询', 2120, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:room:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2122, '房间新增', 2120, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:room:add', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2123, '房间修改', 2120, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:room:edit', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2124, '房间删除', 2120, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:room:remove', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2125, '房间导出', 2120, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:room:export', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2126, '分配门锁', 2120, 6, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:room:bind', '#', 'admin', CURRENT_TIMESTAMP, '门锁与房间绑定/解绑');
|
||||
|
||||
delete from sys_menu where perms like 'lock:stay:%';
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2130, '住宿管理', 2000, 12, 'stay', 'iot/stay/index', '', '', 1, 0, 'C', '0', '0', 'lock:stay:list', 'peoples', 'admin', CURRENT_TIMESTAMP, '住宿入住/退房菜单');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2131, '住宿查询', 2130, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:stay:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2132, '入住登记', 2130, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:stay:checkin', '#', 'admin', CURRENT_TIMESTAMP, '含外部人员一步建档'),
|
||||
(2133, '退房', 2130, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:stay:checkout', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2134, '换房', 2130, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:stay:change', '#', 'admin', CURRENT_TIMESTAMP, 'S3 启用'),
|
||||
(2135, '续住', 2130, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:stay:extend', '#', 'admin', CURRENT_TIMESTAMP, 'S3 启用'),
|
||||
(2136, '住宿导出', 2130, 6, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:stay:export', '#', 'admin', CURRENT_TIMESTAMP, '');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 5、存量回填:按 lock_device.room_no 建房间并绑定门锁
|
||||
-- 规则(见设计文档 §11.1):
|
||||
-- - room_code = 公寓编号-房号(无公寓编号时直接用房号);
|
||||
-- - 同一 room_code 只保留 device_id 最小的一条(最早的锁),其余由人工在页面处理;
|
||||
-- - 回填只建房间、绑门锁,不改 lock_device 任何字段。
|
||||
-- 执行后跑第 6 节核对语句,确认未回填的门锁。
|
||||
-- =========================================================================
|
||||
insert ignore into lock_room (room_code, room_no, group_id, device_id, room_status, del_flag,
|
||||
create_by, create_time, remark)
|
||||
select t.room_code, t.room_no, t.group_id, t.device_id, '0', '0', 'system', now(), '由 lock_device.room_no 回填'
|
||||
from (
|
||||
select case
|
||||
when g.group_code is null or trim(g.group_code) = '' then trim(d.room_no)
|
||||
else concat(trim(g.group_code), '-', trim(d.room_no))
|
||||
end as room_code,
|
||||
min(trim(d.room_no)) as room_no,
|
||||
any_value(d.group_id) as group_id,
|
||||
min(d.device_id) as device_id
|
||||
from lock_device d
|
||||
left join lock_group g on g.group_id = d.group_id and g.del_flag = '0'
|
||||
where d.del_flag = '0'
|
||||
and d.room_no is not null
|
||||
and trim(d.room_no) <> ''
|
||||
group by room_code
|
||||
) t;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 6、执行后核对(只读,按需执行)
|
||||
-- =========================================================================
|
||||
-- 6.1 房间数与回填门锁数
|
||||
-- select (select count(1) from lock_room where del_flag = '0') as room_cnt,
|
||||
-- (select count(1) from lock_room where del_flag = '0' and device_id is not null) as bound_cnt;
|
||||
--
|
||||
-- 6.2 有房号但未回填到房间的门锁(多为同房号重复或 room_code 冲突,需人工处理)
|
||||
-- select d.device_id, d.device_sn, d.room_no, d.group_id
|
||||
-- from lock_device d
|
||||
-- where d.del_flag = '0' and d.room_no is not null and trim(d.room_no) <> ''
|
||||
-- and not exists (select 1 from lock_room r where r.device_id = d.device_id and r.del_flag = '0');
|
||||
--
|
||||
-- 6.3 一把锁被多个房间绑定的异常数据(应为空,唯一键保证)
|
||||
-- select device_id, count(1) from lock_room
|
||||
-- where del_flag = '0' and device_id is not null group by device_id having count(1) > 1;
|
||||
@@ -0,0 +1,162 @@
|
||||
-- =========================================================================
|
||||
-- 存量升级:D20 对外房间门禁服务接口 P1(v1 库)
|
||||
--
|
||||
-- 背景:向外部业务系统(PMS/访客/园区平台)开放入住、退房、续住能力。
|
||||
-- 对外接口复用住宿模块(lock_room / lock_stay)与授权下发(lock_auth),
|
||||
-- 本期只补三处数据结构:
|
||||
-- 1) lock_stay 增加业务系统归属字段,用于幂等与数据隔离;
|
||||
-- 2) lock_person_ref 把外部人员标识映射到平台 person_no(按应用隔离);
|
||||
-- 3) lock_room_device_history 记录房间-门锁绑定历史,支撑后续
|
||||
-- 「开锁记录查询包含历史门锁」(P3)。
|
||||
--
|
||||
-- 本文档对应设计:doc/对外开放房间门禁服务接口设计.md §9
|
||||
--
|
||||
-- 执行前置:
|
||||
-- 1) 备份 lock_stay / lock_room / lock_device;
|
||||
-- 2) 与 D20 代码同批次发布:新代码写 biz_no/biz_system/source 三列,
|
||||
-- 缺列会导致接口入住直接失败(平台页面入住不受影响);
|
||||
-- 3) 低峰期执行;alter 段锁表时间取决于 lock_stay 行数。
|
||||
--
|
||||
-- 可重复执行说明:建表用 if not exists、回填用 not exists 保护;
|
||||
-- MySQL 不支持 add column / add index if not exists,第 1 节重复执行会报
|
||||
-- "Duplicate column name 'biz_no'" 或 "Duplicate key name",忽略即可继续。
|
||||
--
|
||||
-- 未包含:lock_callback_task(结果回调与重试,P2 交付时再建)。
|
||||
-- =========================================================================
|
||||
|
||||
set names utf8mb4;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 1、lock_stay 增加业务系统字段
|
||||
-- biz_system + biz_no 为对外幂等键:业务号只在应用内唯一,平台手工单
|
||||
-- 两者均为 NULL(MySQL 唯一索引允许多行 NULL,不会互相冲突)。
|
||||
-- source 区分单据来源,便于页面与对账区分「平台办理」和「接口办理」。
|
||||
-- =========================================================================
|
||||
alter table lock_stay
|
||||
add column biz_no varchar(64) default null comment '业务系统单号(应用内唯一,平台手工单为空)' after stay_no,
|
||||
add column biz_system varchar(32) default null comment '业务系统编码(iot.openapi.apps[].app-code,平台手工单为空)' after biz_no,
|
||||
add column source char(1) default '1' comment '单据来源(1平台 2接口)' after biz_system;
|
||||
|
||||
alter table lock_stay
|
||||
add unique key uk_lock_stay_biz (biz_system, biz_no);
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 2、外部人员标识映射表
|
||||
-- 业务系统的人员标识格式不受 person_no(2 字母 + 6 数字)约束,因此单独
|
||||
-- 建映射;(app_code, external_id) 唯一,同一自然人在不同应用各自建档。
|
||||
-- =========================================================================
|
||||
create table if not exists lock_person_ref (
|
||||
ref_id bigint(20) not null auto_increment comment '映射ID',
|
||||
person_id bigint(20) not null comment '人员ID(lock_person.person_id)',
|
||||
person_no varchar(32) not null comment '人员编号(冗余协议键)',
|
||||
app_code varchar(32) not null comment '接入应用编码(iot.openapi.apps[].app-code)',
|
||||
external_id varchar(64) not null comment '业务系统人员标识(假定稳定不变)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (ref_id),
|
||||
unique key uk_lock_person_ref (app_code, external_id),
|
||||
key idx_lock_person_ref_person (person_no)
|
||||
) engine=innodb comment = '外部人员标识映射表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 3、房间-门锁绑定历史表
|
||||
-- 只增不改(解绑时回填 unbind_time):房间换锁后,历史时段内的开锁记录
|
||||
-- 仍要能按房间查出来,因此需要保留「哪段时间绑的是哪把锁」。
|
||||
-- =========================================================================
|
||||
create table if not exists lock_room_device_history (
|
||||
history_id bigint(20) not null auto_increment comment '历史ID',
|
||||
room_id bigint(20) not null comment '房间ID(lock_room.room_id)',
|
||||
device_id bigint(20) not null comment '门锁ID(lock_device.device_id)',
|
||||
device_sn varchar(32) default null comment '门锁SN(冗余快照)',
|
||||
bind_time datetime not null comment '绑定生效时间',
|
||||
unbind_time datetime default null comment '解绑时间(为空表示当前仍在绑)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (history_id),
|
||||
key idx_lock_room_device_history (room_id, bind_time, unbind_time),
|
||||
key idx_lock_room_device_history_device (device_id)
|
||||
) engine=innodb comment = '房间门锁绑定历史表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 4、存量回填:把房间当前绑定登记为一条未解绑的历史
|
||||
-- bind_time 取房间的 update_time(最近一次绑定/换锁),缺失时退到
|
||||
-- create_time,再缺失取当前时间。
|
||||
-- =========================================================================
|
||||
insert into lock_room_device_history (room_id, device_id, device_sn, bind_time, create_by, create_time, remark)
|
||||
select r.room_id, r.device_id, d.device_sn,
|
||||
ifnull(r.update_time, ifnull(r.create_time, now())), 'migrate', now(),
|
||||
'D20 存量回填:当前绑定视为历史起点'
|
||||
from lock_room r
|
||||
join lock_device d on d.device_id = r.device_id
|
||||
where r.del_flag = '0'
|
||||
and r.device_id is not null
|
||||
and not exists (
|
||||
select 1 from lock_room_device_history h
|
||||
where h.room_id = r.room_id and h.device_id = r.device_id and h.unbind_time is null
|
||||
);
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 5、执行后核对(只读,按需执行)
|
||||
-- =========================================================================
|
||||
-- 5.1 新增列与唯一键是否到位
|
||||
-- select column_name, column_type, column_default, column_comment
|
||||
-- from information_schema.columns
|
||||
-- where table_schema = database() and table_name = 'lock_stay'
|
||||
-- and column_name in ('biz_no', 'biz_system', 'source');
|
||||
--
|
||||
-- select index_name, column_name from information_schema.statistics
|
||||
-- where table_schema = database() and table_name = 'lock_stay'
|
||||
-- and index_name = 'uk_lock_stay_biz';
|
||||
--
|
||||
-- 5.2 回填的历史行数应等于当前已绑锁的房间数
|
||||
-- select (select count(1) from lock_room_device_history where unbind_time is null) as open_history_cnt,
|
||||
-- (select count(1) from lock_room where del_flag = '0' and device_id is not null) as bound_room_cnt;
|
||||
--
|
||||
-- 5.3 存量入住单的 source 应全部为 1(平台),biz_no/biz_system 应为空
|
||||
-- select source, count(1) from lock_stay group by source;
|
||||
--
|
||||
-- 5.4 业务号重复检查(应为空)
|
||||
-- select biz_system, biz_no, count(1) from lock_stay
|
||||
-- where biz_no is not null group by biz_system, biz_no having count(1) > 1;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 5.5 修复:平台手工单被写成空串的 biz_no / biz_system(2026-11-01)
|
||||
-- 现象:入住管理第二次办理入住报
|
||||
-- Duplicate entry '' for key 'lock_stay.uk_lock_stay_biz'
|
||||
-- 原因:唯一键只允许多行 NULL,平台单落的却是空串。
|
||||
-- 代码已修正为空 → NULL;存量空串按下面语句归一,可重复执行。
|
||||
-- 接口单的业务号必非空,这里的空串只可能来自平台手工单,不会误伤接口单据。
|
||||
-- =========================================================================
|
||||
update lock_stay
|
||||
set biz_no = null
|
||||
where biz_no = ''
|
||||
and (biz_system is null or biz_system = '');
|
||||
|
||||
update lock_stay
|
||||
set biz_system = null
|
||||
where biz_system = ''
|
||||
and biz_no is null;
|
||||
|
||||
-- 核对:结果应为 0
|
||||
-- select count(1) from lock_stay where biz_no = '' or biz_system = '';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 6、回滚(仅在确认没有接口单据后执行)
|
||||
-- =========================================================================
|
||||
-- 6.1 删除新增表
|
||||
-- drop table if exists lock_room_device_history;
|
||||
-- drop table if exists lock_person_ref;
|
||||
--
|
||||
-- 6.2 回退 lock_stay 字段(会丢失接口单据的业务号归属,执行前先确认)
|
||||
-- select count(1) from lock_stay where biz_no is not null;
|
||||
-- alter table lock_stay drop index uk_lock_stay_biz;
|
||||
-- alter table lock_stay drop column source, drop column biz_system, drop column biz_no;
|
||||
@@ -0,0 +1,118 @@
|
||||
-- =========================================================================
|
||||
-- 存量升级:D20 对外房间门禁服务接口 P2(结果回调)
|
||||
--
|
||||
-- 背景:P1 只做「同步受理」,门锁下发结果没有回传渠道。P2 在授权/清除命令
|
||||
-- 进入终态时生成回调任务,按应用配置的地址上报,失败按退避重试,最终死信,
|
||||
-- 支持人工重发。本文档对应设计:doc/对外开放房间门禁服务接口设计.md §8、§9
|
||||
--
|
||||
-- 只新增一张表 + 两个字典 + 一组菜单,不改动 P1 已建的表结构。
|
||||
--
|
||||
-- 执行前置:
|
||||
-- 1) 先执行 upgrade_d20_openapi_stay.sql(P1),本脚本依赖入住单的
|
||||
-- biz_no / biz_system 字段;
|
||||
-- 2) 与 P2 代码同批次发布:代码会在入住/退房/续住时写本表,缺表会导致
|
||||
-- 这些操作在事务内报错回滚(受影响的只是接口单,平台手工单不受影响);
|
||||
-- 3) 每个接入应用需在 iot.openapi.apps[] 配置 callback-url 与 callback-secret:
|
||||
-- callback-url 为空视为「未开通回调」,不产生任务;
|
||||
-- callback-url 已配置但 callback-secret 为空时事件直接落死信(避免无签名报文),
|
||||
-- 补齐密钥后在页面人工重发即可。
|
||||
--
|
||||
-- 可重复执行:建表用 if not exists、字典与菜单先 delete 再 insert。
|
||||
-- =========================================================================
|
||||
|
||||
set names utf8mb4;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 1、回调任务表
|
||||
-- status:0 待结果(已登记事件,等设备回执)1 待发送 2 已成功 3 死信
|
||||
-- revision:同一应用 + 同一单号 + 同一事件的结果版本,补偿成功后递增,
|
||||
-- 对方按 revision 最大者为最终结果(见设计稿 §8.3)
|
||||
-- callback_url 存事件产生时的配置快照,避免上线换地址后旧事件发错地方
|
||||
-- =========================================================================
|
||||
create table if not exists lock_callback_task (
|
||||
task_id bigint(20) not null auto_increment comment '任务ID',
|
||||
event_id varchar(64) not null comment '事件ID(回调头 X-Callback-Id,对方据此去重)',
|
||||
app_code varchar(32) not null comment '接入应用编码(iot.openapi.apps[].app-code)',
|
||||
event_type varchar(32) not null comment '事件类型(STAY_CHECKIN_RESULT / STAY_CHECKOUT_RESULT / STAY_EXTEND_RESULT)',
|
||||
biz_no varchar(64) not null comment '业务系统单号',
|
||||
revision int(11) not null default 1 comment '同单同事件的版本(结果变更时递增)',
|
||||
auth_id bigint(20) default null comment '关联授权ID(lock_auth.auth_id),命令终态据此落库',
|
||||
callback_url varchar(500) default null comment '回调地址(事件产生时的应用配置快照)',
|
||||
payload text comment '回调报文原文(参与签名)',
|
||||
status char(1) not null default '0' comment '状态(0待结果 1待发送 2已成功 3死信,字典 lock_callback_status)',
|
||||
retry_count int(11) not null default 0 comment '已重试次数',
|
||||
next_retry_time datetime default null comment '下次发送时间',
|
||||
last_error varchar(500) default null comment '最后一次失败原因',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_time datetime comment '更新时间',
|
||||
primary key (task_id),
|
||||
unique key uk_lock_callback_event (event_id),
|
||||
unique key uk_lock_callback_rev (app_code, biz_no, event_type, revision),
|
||||
key idx_lock_callback_due (status, next_retry_time),
|
||||
key idx_lock_callback_auth (auth_id, status),
|
||||
key idx_lock_callback_list (app_code, create_time)
|
||||
) engine=innodb comment = '开放接口结果回调任务表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 2、字典
|
||||
-- =========================================================================
|
||||
delete from sys_dict_data where dict_type in ('lock_callback_status', 'lock_callback_event');
|
||||
|
||||
delete from sys_dict_type where dict_type in ('lock_callback_status', 'lock_callback_event');
|
||||
|
||||
insert into sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark) values
|
||||
('回调任务状态', 'lock_callback_status', '0', 'admin', now(), '开放接口结果回调任务状态'),
|
||||
('回调事件类型', 'lock_callback_event', '0', 'admin', now(), '开放接口结果回调事件');
|
||||
|
||||
insert into sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) values
|
||||
(1, '待结果', '0', 'lock_callback_status', '', 'info', 'Y', '0', 'admin', now(), '已登记事件,等待设备回执'),
|
||||
(2, '待发送', '1', 'lock_callback_status', '', 'primary', 'N', '0', 'admin', now(), '报文就绪,等待投递'),
|
||||
(3, '已成功', '2', 'lock_callback_status', '', 'success', 'N', '0', 'admin', now(), '对方已接收'),
|
||||
(4, '死信', '3', 'lock_callback_status', '', 'danger', 'N', '0', 'admin', now(), '重试耗尽或配置缺失,需人工处理'),
|
||||
(1, '入住结果', 'STAY_CHECKIN_RESULT', 'lock_callback_event', '', 'primary', 'Y', '0', 'admin', now(), ''),
|
||||
(2, '退房结果', 'STAY_CHECKOUT_RESULT', 'lock_callback_event', '', 'warning', 'N', '0', 'admin', now(), ''),
|
||||
(3, '续住结果', 'STAY_EXTEND_RESULT', 'lock_callback_event', '', 'success', 'N', '0', 'admin', now(), '');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 3、菜单:回调任务(2140 号段,接在住宿 2130 之后)
|
||||
-- =========================================================================
|
||||
delete from sys_menu where perms like 'lock:callback:%';
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2140, '回调任务', 2000, 13, 'callback', 'iot/callback/index', '', '', 1, 0, 'C', '0', '0', 'lock:callback:list', 'message', 'admin', CURRENT_TIMESTAMP, '开放接口结果回调任务');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2141, '回调查询', 2140, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:callback:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2142, '人工重发', 2140, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:callback:resend', '#', 'admin', CURRENT_TIMESTAMP, '死信重新投递');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 4、执行后核对(只读,按需执行)
|
||||
-- =========================================================================
|
||||
-- 4.1 表与索引是否到位(应返回 1 行,含 3 个索引)
|
||||
-- show create table lock_callback_task;
|
||||
|
||||
-- 4.2 各状态任务数(上线初期除 0/1 外都应为 0)
|
||||
-- select status, count(1) as total from lock_callback_task group by status;
|
||||
|
||||
-- 4.3 同一单号同一事件不应出现重复 revision(应为空)
|
||||
-- select app_code, biz_no, event_type, revision, count(1) c
|
||||
-- from lock_callback_task group by app_code, biz_no, event_type, revision having c > 1;
|
||||
|
||||
-- 4.4 长期卡在「待结果」的任务(超过 24 小时,通常是被补偿任务覆盖或命令丢失)
|
||||
-- select task_id, app_code, biz_no, event_type, create_time
|
||||
-- from lock_callback_task
|
||||
-- where status = '0' and create_time < date_sub(now(), interval 1 day);
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 5、回滚(仅在确认不再需要回调记录后执行)
|
||||
-- =========================================================================
|
||||
-- drop table if exists lock_callback_task;
|
||||
-- delete from sys_menu where perms like 'lock:callback:%';
|
||||
-- delete from sys_dict_data where dict_type in ('lock_callback_status', 'lock_callback_event');
|
||||
-- delete from sys_dict_type where dict_type in ('lock_callback_status', 'lock_callback_event');
|
||||
@@ -0,0 +1,122 @@
|
||||
-- =========================================================================
|
||||
-- 存量升级:D21 开放平台接入管理(v1 库)
|
||||
--
|
||||
-- 背景:D20 把外部应用(PMS/访客系统)的配置放在 application.yml 的
|
||||
-- iot.openapi.apps[],改配置要重启,且无法在平台里查看用量。本脚本把
|
||||
-- 应用配置落到 lock_open_app,由「开放管理 › 应用接入」维护。
|
||||
--
|
||||
-- 行为变化:
|
||||
-- 1) 鉴权、回调和接口响应中的应用信息一律读表(带 30 秒缓存,改完即时生效);
|
||||
-- 2) 服务首次启动时若表为空,会把 yml 的 apps[](或单 Key 模式的 api-key)
|
||||
-- 原样导入本表,外部系统不用改 Key;导入后以表为准,yml 中 apps 可删除;
|
||||
-- 3) 表不可用时(本脚本未执行)服务仍按 yml 运行,只打告警,不影响存量调用。
|
||||
--
|
||||
-- 幂等性:建表用 if not exists;菜单先按 perms 删除再插入;
|
||||
-- 本脚本可重复执行。
|
||||
--
|
||||
-- 执行前置:备份 sys_menu;lock_open_app 为新表,无存量数据。
|
||||
-- =========================================================================
|
||||
|
||||
set names utf8mb4;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 1、外部应用接入配置表
|
||||
-- app_code 是数据隔离键,写入 lock_stay.biz_system 与 lock_person_ref.app_code,
|
||||
-- 创建后不可修改(改编码会让历史入住单失去归属)。
|
||||
-- api_key / callback_secret 明文存储(与 D10 口径一致),页面只展示掩码,
|
||||
-- 完整值仅在新增与重置时返回一次。
|
||||
-- 不设 del_flag:app_code/api_key 唯一键需要覆盖全部行;删除仅允许在
|
||||
-- 该应用没有任何入住单时执行(有数据只能停用)。
|
||||
-- =========================================================================
|
||||
create table if not exists lock_open_app (
|
||||
app_id bigint(20) not null auto_increment comment '应用ID',
|
||||
app_code varchar(32) not null comment '应用编码(数据隔离键,创建后不可改)',
|
||||
app_name varchar(64) not null comment '应用名称',
|
||||
api_key varchar(128) not null comment '接口密钥(X-API-Key,明文存储)',
|
||||
callback_url varchar(255) default null comment '结果回调地址(为空表示不开通回调)',
|
||||
callback_secret varchar(128) default null comment '回调签名密钥(为空表示不签名)',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (app_id),
|
||||
unique key uk_lock_open_app_code (app_code),
|
||||
unique key uk_lock_open_app_key (api_key)
|
||||
) engine=innodb comment = '外部应用接入配置';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 2、菜单:开放管理(顶级目录)→ 应用接入
|
||||
-- 2200 目录,2210 页面,2211–2216 按钮权限。
|
||||
-- =========================================================================
|
||||
delete from sys_menu where perms like 'lock:openapp:%';
|
||||
delete from sys_menu where menu_id = 2200;
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2200, '开放管理', 0, 5, 'openapi', null, '', '', 1, 0, 'M', '0', '0', '', 'link', 'admin', CURRENT_TIMESTAMP, '外部应用接入管理目录');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2210, '应用接入', 2200, 1, 'openapp', 'iot/openapp/index', '', '', 1, 0, 'C', '0', '0', 'lock:openapp:list', 'international', 'admin', CURRENT_TIMESTAMP, '外部应用配置与入住统计');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2211, '应用查询', 2210, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:openapp:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2212, '应用新增', 2210, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:openapp:add', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2213, '应用修改', 2210, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:openapp:edit', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2214, '应用删除', 2210, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:openapp:remove', '#', 'admin', CURRENT_TIMESTAMP, '有入住数据的应用不可删除'),
|
||||
(2215, '重置密钥', 2210, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:openapp:resetkey','#', 'admin', CURRENT_TIMESTAMP, '生成新的 X-API-Key'),
|
||||
(2216, '启停应用', 2210, 6, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:openapp:status', '#', 'admin', CURRENT_TIMESTAMP, '');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 3、存量配置迁移
|
||||
-- yml 中还配着 iot.openapi.apps[](或单 Key 模式 api-key)时,服务首次启动
|
||||
-- 若发现本表为空,会自动把这些应用原样写入本表(保留原 Key 与密钥),
|
||||
-- 外部系统无需改 Key。导入完成后可在 yml 中删除 apps 段。
|
||||
--
|
||||
-- 若希望手工建档而不依赖自动导入,可参考下面的语句(示例,按实际值改):
|
||||
-- insert into lock_open_app (app_code, app_name, api_key, callback_url, callback_secret, status, create_by, create_time, remark)
|
||||
-- values ('PMS', '公寓 PMS', '<原Key>', 'https://pms.example.com/hook/lock', '<原密钥>', '0', 'admin', now(), '由 yml 迁入');
|
||||
-- =========================================================================
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 4、执行后核对(只读)
|
||||
-- =========================================================================
|
||||
-- 4.1 表结构
|
||||
-- show create table lock_open_app;
|
||||
--
|
||||
-- 4.2 应用清单与状态
|
||||
-- select app_id, app_code, app_name, status,
|
||||
-- case when callback_url is null or callback_url = '' then '未开通回调' else '已开通回调' end as callback,
|
||||
-- create_time
|
||||
-- from lock_open_app order by app_id;
|
||||
--
|
||||
-- 4.3 各应用入住统计(与页面口径一致:按 lock_stay.biz_system)
|
||||
-- select a.app_code, a.app_name,
|
||||
-- count(s.stay_id) as stay_total,
|
||||
-- sum(case when s.stay_status = '1' then 1 else 0 end) as stay_active,
|
||||
-- sum(case when date(s.checkin_time) = curdate() then 1 else 0 end) as stay_today,
|
||||
-- max(s.checkin_time) as last_checkin_time
|
||||
-- from lock_open_app a
|
||||
-- left join lock_stay s on s.biz_system = a.app_code
|
||||
-- group by a.app_id, a.app_code, a.app_name
|
||||
-- order by a.app_id;
|
||||
--
|
||||
-- 4.4 菜单是否到位
|
||||
-- select menu_id, menu_name, parent_id, menu_type, perms from sys_menu
|
||||
-- where menu_id between 2200 and 2216 order by menu_id;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 5、回滚(确认已切回 yml 配置后再执行)
|
||||
-- =========================================================================
|
||||
-- 5.1 菜单
|
||||
-- delete from sys_menu where perms like 'lock:openapp:%';
|
||||
-- delete from sys_menu where menu_id = 2200;
|
||||
--
|
||||
-- 5.2 表:确认 lock_stay.biz_system 的取值已同步回 yml 的 apps[].app-code 后再删
|
||||
-- select distinct biz_system from lock_stay where biz_system is not null;
|
||||
-- drop table if exists lock_open_app;
|
||||
@@ -0,0 +1,71 @@
|
||||
-- =========================================================================
|
||||
-- 存量升级:D22 服务器系统时间校时(v1 库)
|
||||
--
|
||||
-- 背景:开门授权依赖时间窗(人脸/密码有效期按绝对时间下发与校验),
|
||||
-- 门锁系统将部署在 Linux 服务器上,内网离线环境缺少时间源时
|
||||
-- 服务器时钟漂移会直接影响授权有效期、到期任务与日志时序,
|
||||
-- 因此提供「门禁管理 › 系统时间」页面:查看服务器时间/时区/NTP 状态,
|
||||
-- 由管理员手动校时或开关 NTP 自动同步。
|
||||
--
|
||||
-- 行为说明:
|
||||
-- 1) 本脚本只加菜单,不建表(时间信息来自操作系统,不落库);
|
||||
-- 2) 修改系统时间是高危操作,需在 application.yml 打开
|
||||
-- iot.time.control-enabled=true,并满足:Linux + systemd(timedatectl)、
|
||||
-- 服务以 root 运行或配置免密 sudo(iot.time.use-sudo=true);
|
||||
-- 3) 默认 control-enabled=false,页面只读,不会误改服务器时钟。
|
||||
--
|
||||
-- 号段:2150 页面 + 2151–2152 按钮。2140–2142 已被 D20 P2 回调任务占用,
|
||||
-- 本脚本不得再使用;若后续再加菜单请从 2153 往后排。
|
||||
--
|
||||
-- 幂等性:菜单只按自身 perms 删除再插入,不按号段整段删除;可重复执行。
|
||||
--
|
||||
-- 执行前置:备份 sys_menu。
|
||||
-- =========================================================================
|
||||
|
||||
set names utf8mb4;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 0、修复:D22 早前版本误用 2140–2142(与 D20 P2 回调任务号段冲突),
|
||||
-- 其中 `delete from sys_menu where menu_id = 2140` 会删掉「回调任务」父菜单。
|
||||
-- 先清掉可能残留的本模块菜单,再确保 2140 回调任务父菜单存在。
|
||||
-- (若从未执行过旧版脚本,本段为空操作。)
|
||||
-- =========================================================================
|
||||
delete from sys_menu where perms like 'lock:time:%';
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2140, '回调任务', 2000, 13, 'callback', 'iot/callback/index', '', '', 1, 0, 'C', '0', '0', 'lock:callback:list', 'message', 'admin', CURRENT_TIMESTAMP, '开放接口结果回调任务')
|
||||
on duplicate key update menu_name = menu_name;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 1、菜单:门禁管理 › 系统时间
|
||||
-- 2150 页面(perms 即查询权限),2151–2152 操作按钮;接在住宿 2130 之后。
|
||||
-- =========================================================================
|
||||
delete from sys_menu where menu_id in (2150, 2151, 2152);
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2150, '系统时间', 2000, 14, 'systime', 'iot/systime/index', '', '', 1, 0, 'C', '0', '0', 'lock:time:query', 'time', 'admin', CURRENT_TIMESTAMP, '服务器时间查看、手动校时与 NTP 开关');
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2151, '手动校时', 2150, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:time:set', '#', 'admin', CURRENT_TIMESTAMP, '需 root 或免密 sudo'),
|
||||
(2152, 'NTP开关', 2150, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:time:ntp', '#', 'admin', CURRENT_TIMESTAMP, '开关 NTP 自动同步');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 2、核对(执行后可跑一次)
|
||||
-- =========================================================================
|
||||
-- 2.1 本模块菜单:应为 3 行(2150 页面 + 2151/2152 按钮)
|
||||
-- select menu_id, menu_name, parent_id, menu_type, perms from sys_menu
|
||||
-- where menu_id between 2150 and 2152 order by menu_id;
|
||||
|
||||
-- 2.2 回调任务菜单必须仍在:应为 3 行(2140 父 + 2141/2142 按钮,parent_id 指向 2140)
|
||||
-- select menu_id, menu_name, parent_id, menu_type, perms from sys_menu
|
||||
-- where menu_id between 2140 and 2142 order by menu_id;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 3、回滚
|
||||
-- =========================================================================
|
||||
-- delete from sys_menu where perms like 'lock:time:%';
|
||||
-- delete from sys_menu where menu_id in (2150, 2151, 2152);
|
||||
@@ -0,0 +1,146 @@
|
||||
-- =========================================================================
|
||||
-- 存量升级:D8 人员主数据(v1 库,lock.sql v1.0 → v1.1)
|
||||
--
|
||||
-- 适用范围:已按 sql/lock.sql(v1.0,9 张表)建库、且代码为 D8 之前的版本。
|
||||
-- 全新库请直接执行 sql/lock.sql(v1.1)或 sql/lock_v2.sql,不要执行本脚本。
|
||||
--
|
||||
-- 执行前置:
|
||||
-- 1) 停应用(或至少停止授权下发/人脸新增),避免迁移期间写入 lock_face;
|
||||
-- 2) 备份 lock_face / lock_auth / sys_menu;
|
||||
-- 3) 按顺序整段执行,中途失败按报错点重跑(各步骤可重复执行)。
|
||||
--
|
||||
-- 迁移内容:
|
||||
-- 1. 新建 lock_person(人员主数据,字段与 lock_v2.sql 第 5 节一致);
|
||||
-- 2. 从 lock_face 按 person_no 去重回填人员;
|
||||
-- 3. 从 lock_auth 补齐「只有密码/卡授权、没有人脸」的人员;
|
||||
-- 4. lock_face 增加 person_id 并回填,建立唯一索引(v1 一人一份人脸);
|
||||
-- 5. 新增人员管理菜单与按钮权限。
|
||||
-- 6. 旧列 person_name/person_type/phone 暂不删除,代码已不再读写,
|
||||
-- 确认新版本稳定后再执行文末注释掉的清理语句。
|
||||
--
|
||||
-- 回滚:人员域为新增,回滚只需还原 lock_face 结构与删除 lock_person / 菜单;
|
||||
-- 回滚前请确认没有新版本写入的数据只存在于 lock_person。
|
||||
-- =========================================================================
|
||||
|
||||
set names utf8mb4;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 1、人员主数据表
|
||||
-- =========================================================================
|
||||
create table if not exists lock_person (
|
||||
person_id bigint(20) not null auto_increment comment '人员ID',
|
||||
person_no varchar(16) not null comment '人员编号(协议人员/人脸ID,2位字母+6位数字,全局唯一且不可变更)',
|
||||
person_name varchar(64) default null comment '姓名',
|
||||
person_type char(1) default '0' comment '人员类型(0住户 1员工 2访客 3其他,字典 lock_person_type)',
|
||||
dept_id bigint(20) default null comment '所属部门ID(数据权限)',
|
||||
sys_user_id bigint(20) default null comment '关联若依账号ID(员工自助场景,可为空)',
|
||||
id_card_no varchar(256) default null comment '证件号(v1 明文存储,见架构设计 D10 决策)',
|
||||
phone varchar(20) default null comment '联系电话',
|
||||
valid_from datetime comment '人员有效期起(未填不限)',
|
||||
valid_to datetime comment '人员有效期止(空表示永久)',
|
||||
status char(1) default '0' comment '状态(0正常 1停用)',
|
||||
del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (person_id),
|
||||
unique key uk_lock_person_no (person_no),
|
||||
key idx_lock_person_name (person_name),
|
||||
key idx_lock_person_dept (dept_id),
|
||||
key idx_lock_person_sys_user (sys_user_id)
|
||||
) engine=innodb comment = '人员主数据表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 2、从 lock_face 回填人员(按 person_no 去重)
|
||||
-- 同一 person_no 在 v1 已被人脸唯一键约束,这里取聚合值只为兼容异常数据。
|
||||
-- =========================================================================
|
||||
insert into lock_person (person_no, person_name, person_type, phone, status, del_flag,
|
||||
create_by, create_time, update_by, update_time, remark)
|
||||
select f.person_no, max(f.person_name), max(f.person_type), max(f.phone), '0', '0',
|
||||
'migrate', now(), 'migrate', now(), 'v1 lock_face 迁移'
|
||||
from lock_face f
|
||||
where f.person_no is not null and f.person_no <> ''
|
||||
group by f.person_no
|
||||
on duplicate key update update_time = values(update_time);
|
||||
|
||||
-- 核对:应等于 lock_face 中不同 person_no 的数量
|
||||
-- select count(distinct person_no) from lock_face;
|
||||
-- select count(*) from lock_person where remark = 'v1 lock_face 迁移';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 3、从 lock_auth 补齐只有密码/卡授权、没有人脸的人员
|
||||
-- =========================================================================
|
||||
insert into lock_person (person_no, person_name, person_type, status, del_flag,
|
||||
create_by, create_time, update_by, update_time, remark)
|
||||
select a.person_no, max(a.person_name), '0', '0', '0',
|
||||
'migrate', now(), 'migrate', now(), 'v1 lock_auth 迁移(无人脸)'
|
||||
from lock_auth a
|
||||
where a.person_no is not null and a.person_no <> ''
|
||||
and not exists (select 1 from lock_person p where p.person_no = a.person_no)
|
||||
group by a.person_no;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 4、lock_face 关联人员
|
||||
-- 注意:MySQL 不支持 add column if not exists,重复执行时本段会报
|
||||
-- "Duplicate column name 'person_id'",忽略即可,继续执行回填。
|
||||
-- =========================================================================
|
||||
alter table lock_face
|
||||
add column person_id bigint(20) not null default 0
|
||||
comment '人员ID(lock_person.person_id)' after face_id;
|
||||
|
||||
update lock_face f
|
||||
join lock_person p on p.person_no = f.person_no
|
||||
set f.person_id = p.person_id
|
||||
where f.person_id = 0;
|
||||
|
||||
-- 核对:不应有 0;有 0 说明该人脸没有对应人员,需人工处理后再建索引
|
||||
-- select face_id, person_no from lock_face where person_id = 0;
|
||||
|
||||
alter table lock_face
|
||||
add unique key uk_lock_face_person_id (person_id),
|
||||
drop index idx_lock_face_name;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 5、菜单:人员管理(2100 号段)+ 按钮权限
|
||||
-- 重复执行时先删人员菜单,且不再重复后移其它菜单顺序。
|
||||
-- =========================================================================
|
||||
set @has_person_menu = (select count(*) from sys_menu where menu_id = 2100);
|
||||
|
||||
delete from sys_menu where perms like 'lock:person:%';
|
||||
|
||||
update sys_menu set order_num = order_num + 1
|
||||
where parent_id = 2000 and menu_type = 'C' and order_num >= 4 and @has_person_menu = 0;
|
||||
|
||||
insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name,
|
||||
is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) values
|
||||
(2100, '人员管理', 2000, 4, 'person', 'iot/person/index', '', '', 1, 0, 'C', '0', '0',
|
||||
'lock:person:list', 'peoples', 'admin', CURRENT_TIMESTAMP, '人员主数据菜单'),
|
||||
(2101, '人员查询', 2100, 1, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:person:query', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2102, '人员新增', 2100, 2, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:person:add', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2103, '人员修改', 2100, 3, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:person:edit', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2104, '人员删除', 2100, 4, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:person:remove', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2105, '人员导出', 2100, 5, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:person:export', '#', 'admin', CURRENT_TIMESTAMP, ''),
|
||||
(2106, '人员下拉', 2100, 6, '', null, '', '', 1, 0, 'F', '0', '0', 'lock:person:option', '#', 'admin', CURRENT_TIMESTAMP, '人员选择组件数据源');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 6、旧列清理(可选,新版本上线并稳定后再执行)
|
||||
-- lock_face.person_name / person_type / phone 已由 lock_person 承载,
|
||||
-- 代码不再读写;保留期间为新旧版本混跑留缓冲。
|
||||
-- =========================================================================
|
||||
-- alter table lock_face
|
||||
-- drop column person_name,
|
||||
-- drop column person_type,
|
||||
-- drop column phone;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 脚本结束
|
||||
-- =========================================================================
|
||||
@@ -0,0 +1,118 @@
|
||||
-- =========================================================================
|
||||
-- 存量升级:D9 人脸特征多算法版本(v1.2 → v1.3)
|
||||
--
|
||||
-- 背景:v1.2 的 lock_face 只有一组 feature_data/feature_algo_version,
|
||||
-- 同一人员按算法 v1 提取后再按 v2 提取会覆盖旧值,算法版本为 v1 的门锁
|
||||
-- 随即失去可用特征。D9 新增 lock_face_feature:
|
||||
-- 一个 (face_id, algo_version) 一行,一人多版本共存;
|
||||
-- 下发时按目标门锁 lock_device.face_algo_version 选对应版本;
|
||||
-- lock_face 保留图片与「最近一次成功提取」的镜像,旧接口不受影响。
|
||||
--
|
||||
-- 执行前置:
|
||||
-- 1) 停止应用(至少停止授权下发与人脸提取);
|
||||
-- 2) 备份 lock_face;
|
||||
-- 3) 先执行本脚本,再发布包含 D9 代码的版本。旧代码不认识新表,可继续
|
||||
-- 运行(仍读写 lock_face 旧列),但新代码在匹配不到特征时会阻断下发。
|
||||
--
|
||||
-- 可重复执行:建表用 if not exists,回填只补缺失行,不覆盖运行期新数据。
|
||||
-- =========================================================================
|
||||
|
||||
set names utf8mb4;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 1、人脸特征-算法版本表
|
||||
-- =========================================================================
|
||||
create table if not exists lock_face_feature (
|
||||
feature_id bigint(20) not null auto_increment comment '特征ID',
|
||||
face_id bigint(20) not null comment '人脸ID(lock_face.face_id)',
|
||||
person_id bigint(20) not null comment '人员ID(lock_person.person_id)',
|
||||
person_no varchar(32) not null comment '人员编号(冗余协议键,与 lock_face.person_no 一致)',
|
||||
algo_version varchar(32) not null comment '算法版本(提取时使用的 algorithm_version,来自 lock_device.face_algo_version)',
|
||||
feature_data mediumtext comment '人脸特征值(base64编码)',
|
||||
feature_md5 varchar(32) default null comment '特征指纹(变更检测与幂等下发用)',
|
||||
feature_size int(11) default 0 comment '特征字节数',
|
||||
extract_status char(1) default '0' comment '特征提取状态(0未提取 1成功 2失败)',
|
||||
extract_time datetime comment '特征提取时间',
|
||||
extract_msg varchar(512) default null comment '特征提取失败原因',
|
||||
create_by varchar(64) default '' comment '创建者',
|
||||
create_time datetime comment '创建时间',
|
||||
update_by varchar(64) default '' comment '更新者',
|
||||
update_time datetime comment '更新时间',
|
||||
remark varchar(500) default null comment '备注',
|
||||
primary key (feature_id),
|
||||
unique key uk_lock_face_feature_algo (face_id, algo_version),
|
||||
key idx_lock_face_feature_person (person_no, algo_version),
|
||||
key idx_lock_face_feature_person_id (person_id)
|
||||
) engine=innodb comment = '人脸特征-算法版本表';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 2、回填:lock_face 最近一次成功提取的特征转成对应版本的一行
|
||||
-- - 只回填有特征值且有算法版本的记录;无版本的旧数据无法归位,
|
||||
-- 由人脸管理页按门锁版本重新提取(下发前会阻断并提示)。
|
||||
-- - 只插入缺失行,重复执行不会覆盖运行期已提取的更优数据。
|
||||
-- =========================================================================
|
||||
insert into lock_face_feature (
|
||||
face_id, person_id, person_no, algo_version, feature_data, feature_md5,
|
||||
feature_size, extract_status, extract_time, extract_msg,
|
||||
create_by, create_time, update_by, update_time, remark
|
||||
)
|
||||
select f.face_id,
|
||||
f.person_id,
|
||||
f.person_no,
|
||||
trim(f.feature_algo_version),
|
||||
f.feature_data,
|
||||
f.feature_md5,
|
||||
coalesce(f.feature_size, 0),
|
||||
coalesce(f.extract_status, '1'),
|
||||
f.extract_time,
|
||||
f.extract_msg,
|
||||
'migrate',
|
||||
now(),
|
||||
'migrate',
|
||||
now(),
|
||||
'D9 存量回填'
|
||||
from lock_face f
|
||||
where f.del_flag = '0'
|
||||
and f.feature_data is not null
|
||||
and trim(coalesce(f.feature_algo_version, '')) <> ''
|
||||
and not exists (
|
||||
select 1 from lock_face_feature x
|
||||
where x.face_id = f.face_id
|
||||
and x.algo_version = trim(f.feature_algo_version)
|
||||
);
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 3、执行后核对(只读,按需执行)
|
||||
-- =========================================================================
|
||||
-- 3.1 回填条数:应与「有特征且有版本」的人脸数一致
|
||||
-- select (select count(1) from lock_face_feature) as feature_cnt,
|
||||
-- (select count(1) from lock_face
|
||||
-- where del_flag = '0' and feature_data is not null
|
||||
-- and trim(coalesce(feature_algo_version, '')) <> '') as migratable_cnt;
|
||||
--
|
||||
-- 3.2 仍未归位的旧特征(有特征值但无算法版本,需按门锁版本重新提取)
|
||||
-- select face_id, person_no, extract_status, extract_time
|
||||
-- from lock_face
|
||||
-- where del_flag = '0' and feature_data is not null
|
||||
-- and trim(coalesce(feature_algo_version, '')) = '';
|
||||
--
|
||||
-- 3.3 唯一约束自检:同一人脸同一版本不应多行
|
||||
-- select face_id, algo_version, count(1) c
|
||||
-- from lock_face_feature group by face_id, algo_version having c > 1;
|
||||
--
|
||||
-- 3.4 人员编号与主表是否一致(应返回空)
|
||||
-- select ff.feature_id, ff.person_no, f.person_no as face_person_no
|
||||
-- from lock_face_feature ff join lock_face f on f.face_id = ff.face_id
|
||||
-- where ff.person_no <> f.person_no;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 4、回滚
|
||||
-- 先回退到不含 D9 的应用版本,再执行:
|
||||
-- drop table if exists lock_face_feature;
|
||||
-- lock_face 的 feature_data/feature_algo_version 等旧列未被本脚本改写,
|
||||
-- 回退后旧代码可继续按单特征模型工作。
|
||||
-- =========================================================================
|
||||
@@ -0,0 +1,17 @@
|
||||
-- =========================================================================
|
||||
-- 热修复:lock_auth.status 为 NULL 导致授权补偿永远捞不到
|
||||
--
|
||||
-- 现象:批量下发两条人脸授权时,第二条被同网关串行闸门正确排队(sync_status=0),
|
||||
-- 但补偿任务每 5 秒查 selectPendingAuths 都是 0 行,这笔授权一直不下发。
|
||||
--
|
||||
-- 原因:授权表单没有状态项,insertAuth 的 SQL 显式列出 status 列并写入 NULL,
|
||||
-- 列默认值 '0' 不生效;而 selectPendingAuths 条件为 status='0'。
|
||||
--
|
||||
-- 代码侧已修:insertAuth 缺省时补 '0',查询侧把 NULL 视为正常。
|
||||
-- 本脚本只修存量数据,可重复执行。
|
||||
-- =========================================================================
|
||||
|
||||
update lock_auth set status = '0' where status is null;
|
||||
|
||||
-- 核对:应为 0
|
||||
select count(*) as null_status_auth from lock_auth where status is null;
|
||||
@@ -0,0 +1,62 @@
|
||||
-- =========================================================================
|
||||
-- 热修复:区分「人脸下发失败」与「人脸清除失败」
|
||||
--
|
||||
-- 背景:
|
||||
-- lock_auth.sync_status 原先把两种失败都写成 3(下发失败):
|
||||
-- - 人脸 add 失败 → 补偿按「待下发」重发 add,正确;
|
||||
-- - 人脸 delete 失败(退房/换房/整锁清空)→ 补偿同样按「待下发」重发 add,
|
||||
-- 把刚删掉的人脸又加回设备,导致"旧房授权删除失败、越删越有"。
|
||||
--
|
||||
-- 处理:
|
||||
-- 1) 新增字典值 6 = 待清除(清除指令失败,等待补偿重发 delete);
|
||||
-- 2) 把历史数据中「最新一条授权类命令是 0012 清除、且当前为 3」的授权改为 6,
|
||||
-- 让补偿改走 delete 通道;其余 3 保持「下发失败」,仍按 add 补偿。
|
||||
--
|
||||
-- 执行前置:备份 lock_auth / sys_dict_data;可重复执行。
|
||||
-- 说明:脚本只交付,由 DBA 在窗口期执行;应用需同步升级到包含本修复的版本。
|
||||
-- =========================================================================
|
||||
|
||||
set names utf8mb4;
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 1、字典:lock_sync_status 增加 6 = 待清除(5 在 v2 基线中规划为「已过期」,故取 6)
|
||||
-- =========================================================================
|
||||
delete from sys_dict_data where dict_type = 'lock_sync_status' and dict_value = '6';
|
||||
|
||||
insert into sys_dict_data (dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark) values
|
||||
(6, '待清除', '6', 'lock_sync_status', '', 'warning', 'N', '0', 'admin', now(), '清除指令失败,等待补偿重发删除');
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 2、历史数据:清除失败(3)改为待清除(6)
|
||||
-- 判定依据:该授权最近一条授权类命令(0011 下发 / 0012 清除)是 0012
|
||||
-- =========================================================================
|
||||
update lock_auth a
|
||||
set a.sync_status = '6',
|
||||
a.sync_msg = '清除失败,等待重发删除指令',
|
||||
a.update_time = CURRENT_TIMESTAMP
|
||||
where a.sync_status = '3'
|
||||
and coalesce((
|
||||
select c.command_type
|
||||
from lock_command c
|
||||
where c.biz_id = a.auth_id
|
||||
and c.command_type in ('0011', '0012')
|
||||
order by c.command_id desc
|
||||
limit 1
|
||||
), '') = '0012';
|
||||
|
||||
|
||||
-- =========================================================================
|
||||
-- 3、执行后核对(只读)
|
||||
-- =========================================================================
|
||||
-- 3.1 各同步状态数量
|
||||
-- select sync_status, count(1) as total from lock_auth where del_flag = '0' group by sync_status;
|
||||
--
|
||||
-- 3.2 仍为「下发失败」且最近命令是清除的授权(应为空,否则可手工置 5)
|
||||
-- select a.auth_id, a.person_no, a.device_sn, a.sync_status, a.sync_msg
|
||||
-- from lock_auth a
|
||||
-- where a.sync_status = '3'
|
||||
-- and (select c.command_type from lock_command c
|
||||
-- where c.biz_id = a.auth_id and c.command_type in ('0011','0012')
|
||||
-- order by c.command_id desc limit 1) = '0012';
|
||||
Reference in new issue
Block a user