Files
bird_monitoring/script/sql/ry_device.sql

378 lines
35 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ----------------------------------------------------------------------------
-- 智能飞禽物联平台 · 设备域建表脚本(阶段1 / 迭代 I1)
-- 说明:
-- 1. 7 张设备表 + 8 个字典 + 设备菜单 + 12 个权限字 + 2 个角色及其菜单关联。
-- 2. 严禁出现任何直播字段(stream_url / play_url / live_*)与医疗模板字段。
-- 3. 逻辑删除取值与框架配置一致:0 存在 / 1 删除(common-mybatis.yml: logicDeleteValue=1)。
-- 4. 唯一索引(device_no / imei)叠加逻辑删除,存在「逻辑删除后编号不可复用」的既有约束,
-- 与 RuoYi 既有模式一致,已在字段注释中写明;如需复用时改用物理删除策略。
-- 作者:Kou 日期:2026-09-16
-- ----------------------------------------------------------------------------
-- ============================ 一、设备主表 ============================
drop table if exists bm_device;
create table bm_device (
device_id bigint(20) not null comment '主键(雪花,仅内部关联)',
device_no varchar(32) not null comment '业务编号,唯一(逻辑删除后编号不可复用)',
imei varchar(32) not null comment '绑定码IMEI,唯一(逻辑删除后不可复用)',
name varchar(64) default null comment '用户侧名称≤20字符',
model varchar(64) default null comment '型号',
sn varchar(64) default null comment '出厂序列号',
hw_version varchar(32) default null comment '硬件版本',
sw_version varchar(32) default null comment '软件版本',
fw_version varchar(32) default null comment '固件版本',
pkg_version varchar(32) default null comment '数据包版本',
ip varchar(64) default null comment '设备IP',
mac varchar(64) default null comment 'MAC',
wifi_ssid varchar(64) default null comment 'WiFi SSID',
status char(1) not null default '0' comment '状态(0未激活 1在线 2离线)',
bind_user_id bigint(20) default null comment '当前绑定APP用户',
bind_time datetime default null comment '最近一次绑定时间',
hood_connected char(1) not null default '0' comment '头套(0断开 1已连接)',
hood_cover_on char(1) not null default '0' comment '眼罩(0打开 1遮盖)',
signal_level tinyint not null default 0 comment '信号等级(0离线 1弱 2一般 3强)',
hood_battery tinyint default null comment '头套电量0-100',
ring_battery tinyint default null comment '脚环电量0-100',
-- 低电告警阈值:设备级配置(PRD Q9 口径),恢复阈值 = 触发阈值 + 回差(回差由 device.mqtt 的 20/25 差值派生)
hood_battery_threshold tinyint not null default 20 comment '头套低电告警阈值0-100(≤该值触发,0=不触发)',
ring_battery_threshold tinyint not null default 20 comment '脚环低电告警阈值0-100(≤该值触发,0=不触发)',
lng decimal(10,7) default null comment '最新经度',
lat decimal(10,7) default null comment '最新纬度',
address varchar(255) default null comment '地址(设备上报)',
last_online_time datetime default null comment '最后在线时间',
remark varchar(500) default null comment '备注',
create_dept bigint(20) default null comment '创建部门',
create_by bigint(20) default null comment '创建者',
create_time datetime comment '创建时间',
update_by bigint(20) default null comment '更新者',
update_time datetime comment '更新时间',
del_flag char(1) not null default '0' comment '逻辑删除(0存在 1删除)',
primary key (device_id),
unique key uk_device_no (device_no),
unique key uk_imei (imei),
key idx_bind_user (bind_user_id),
key idx_status (status),
key idx_last_online (last_online_time)
) engine=innodb comment = '设备主表';
-- ============================ 二、设备绑定流水 ============================
drop table if exists bm_device_bind;
create table bm_device_bind (
bind_id bigint(20) not null comment '主键(雪花)',
device_id bigint(20) not null comment '设备物理主键',
device_no varchar(32) default null comment '设备编号(冗余,便于审计/后台展示)',
user_id bigint(20) not null comment '操作APP用户',
imei varchar(32) default null comment 'IMEI(冗余快照)',
action varchar(16) not null comment '动作(bind/unbind/rebind)',
bind_time datetime not null comment '操作时间',
remark varchar(255) default null comment '备注',
primary key (bind_id),
key idx_device_id (device_id),
key idx_user_id (user_id),
key idx_device_action_time (device_id, action, bind_time)
) engine=innodb comment = '设备绑定流水(无逻辑删除,禁止抹除历史)';
-- ============================ 三、设备遥测历史 ============================
drop table if exists bm_device_telemetry;
create table bm_device_telemetry (
telemetry_id bigint(20) not null comment '主键(雪花)',
device_id bigint(20) not null comment '设备主键',
device_no varchar(32) default null comment '设备编号(冗余)',
hood_battery tinyint default null comment '头套电量0-100',
ring_battery tinyint default null comment '脚环电量0-100',
signal_level tinyint default null comment '信号等级(0离线 1弱 2一般 3强)',
hood_connected char(1) default null comment '头套连接(0断开 1已连接)',
hood_cover_on char(1) default null comment '眼罩状态(0打开 1遮盖)',
lng decimal(10,7) default null comment '经度',
lat decimal(10,7) default null comment '纬度',
address varchar(255) default null comment '地址',
report_time datetime not null comment '设备上报时间',
primary key (telemetry_id),
key idx_device_time (device_id, report_time)
) engine=innodb comment = '设备遥测历史(一期仅落库,不做轨迹回放)';
-- ============================ 四、设备告警 ============================
drop table if exists bm_device_alert;
create table bm_device_alert (
alert_id bigint(20) not null comment '主键(雪花)',
device_id bigint(20) not null comment '设备主键',
device_no varchar(32) default null comment '设备编号(冗余)',
alert_type varchar(32) not null comment '告警类型(offline/low_battery_hood/low_battery_ring)',
alert_level char(1) not null comment '告警级别(0提示 1警告 2严重)',
alert_value varchar(64) default null comment '触发值(如电量)',
content varchar(255) default null comment '告警文案',
status char(1) not null comment '处理状态(0未处理 1已处理)',
handle_by bigint(20) default null comment '处理人(sys_user.user_id,后台账号)',
handle_time datetime default null comment '处理时间',
message_user_id bigint(20) default null comment '告警发生时的APP收件人快照(用于消息补偿)',
alert_time datetime not null comment '告警时间',
del_flag char(1) not null default '0' comment '逻辑删除(0存在 1删除)',
primary key (alert_id),
key idx_device_id (device_id),
key idx_alert_type (alert_type),
key idx_alert_time (alert_time),
key idx_status_time (status, alert_time)
) engine=innodb comment = '设备告警';
-- ============================ 五、OTA 升级包 ============================
drop table if exists bm_ota_package;
create table bm_ota_package (
package_id bigint(20) not null comment '主键(雪花)',
model varchar(64) not null comment '适用型号',
version varchar(32) not null comment '版本号',
oss_id bigint(20) default null comment '关联sys_oss.oss_id',
file_url varchar(500) default null comment '文件URL(冗余)',
file_name varchar(255) default null comment '文件名',
file_size bigint(20) default null comment '文件字节数',
md5 varchar(64) default null comment '校验值MD5',
changelog varchar(500) default null comment '更新说明',
status char(1) not null default '0' comment '状态(0停用 1启用)',
remark varchar(500) default null comment '备注',
create_dept bigint(20) default null comment '创建部门',
create_by bigint(20) default null comment '创建者',
create_time datetime comment '创建时间',
update_by bigint(20) default null comment '更新者',
update_time datetime comment '更新时间',
del_flag char(1) not null default '0' comment '逻辑删除(0存在 1删除)',
primary key (package_id),
unique key uk_model_version (model, version),
key idx_status (status)
) engine=innodb comment = 'OTA升级包';
-- ============================ 六、OTA 升级任务 ============================
drop table if exists bm_ota_task;
create table bm_ota_task (
task_id bigint(20) not null comment '主键(雪花)',
package_id bigint(20) not null comment '升级包',
version varchar(32) default null comment '冗余版本',
device_id bigint(20) not null comment '设备主键',
device_no varchar(32) default null comment '冗余编号',
status char(1) not null default '0' comment '状态(0待升级 1升级中 2成功 3失败)',
result_msg varchar(500) default null comment '结果信息',
progress tinyint default null comment '进度0-100',
operator_id bigint(20) default null comment '操作人(后台用户)',
times int(4) not null default 0 comment '下发次数',
start_time datetime default null comment '开始时间',
finish_time datetime default null comment '完成时间',
create_dept bigint(20) default null comment '创建部门',
create_by bigint(20) default null comment '创建者',
create_time datetime comment '创建时间',
update_by bigint(20) default null comment '更新者',
update_time datetime comment '更新时间',
del_flag char(1) not null default '0' comment '逻辑删除(0存在 1删除)',
primary key (task_id),
key idx_device_no (device_no),
key idx_status (status),
key idx_package_id (package_id)
) engine=innodb comment = 'OTA升级任务';
-- ============================ 七、APP 消息表 ============================
-- 用途:仅承载「设备告警」向 APP 用户的推送副本(一期不做独立消息中心,见开发计划 D8)。
-- 设计取舍:
-- 1. 不复用框架 sys_message —— 该表无「已读」字段,无法支撑 APP 未读角标;
-- 且改框架表违反「ruoyi-* 框架不动、业务只在 ruoyi-device」的项目边界。
-- 2. 与 bm_device_alert 职责分离:alert 是「设备事实」(含处理流程),
-- message 是「推送副本」(含收件人与已读状态),二者不互相替代。
-- 3. 收件人在告警落库那一刻固化(取 bm_device.bind_user_id 快照),
-- 因此设备解绑/换绑后,历史消息仍归属当时的收件人,不会被后来者看到。
drop table if exists bm_app_message;
create table bm_app_message (
message_id bigint(20) not null comment '主键(雪花)',
user_id bigint(20) not null comment '接收用户(sys_user.user_id,APP 用户)',
device_id bigint(20) default null comment '关联设备主键',
device_no varchar(32) default null comment '关联设备编号(冗余,供展示与跳转)',
alert_id bigint(20) default null comment '关联告警主键(bm_device_alert)',
alert_type varchar(32) default null comment '告警类型(offline/low_battery_hood/low_battery_ring)',
alert_level char(1) default null comment '告警级别(0提示 1警告 2严重)',
title varchar(128) not null comment '消息标题',
content varchar(255) default null comment '消息内容',
read_flag char(1) not null default '0' comment '已读标记(0未读 1已读)',
read_time datetime default null comment '已读时间',
create_time datetime not null comment '产生时间',
primary key (message_id),
unique key uk_alert_id (alert_id),
key idx_user_read (user_id, read_flag),
key idx_user_time (user_id, create_time, message_id)
) engine=innodb comment = 'APP 消息(一期仅承载设备告警通知)';
-- ============================ 八、字典类型(8 个) ============================
insert into sys_dict_type values(1771500000000000001, '设备状态', 'bm_device_status', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '设备状态列表');
insert into sys_dict_type values(1771500000000000002, '信号等级', 'bm_signal_level', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '信号等级列表');
insert into sys_dict_type values(1771500000000000003, '头套连接', 'bm_hood_connected', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '头套连接列表');
insert into sys_dict_type values(1771500000000000004, '眼罩状态', 'bm_hood_cover', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '眼罩状态列表');
insert into sys_dict_type values(1771500000000000005, 'OTA任务状态', 'bm_ota_task_status', 1761000000000000103, 1761100000000000001, sysdate(), null, null, 'OTA任务状态列表');
insert into sys_dict_type values(1771500000000000006, '升级包状态', 'bm_ota_package_status', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '升级包状态列表');
insert into sys_dict_type values(1771500000000000007, '告警类型', 'bm_alert_type', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '告警类型列表');
insert into sys_dict_type values(1771500000000000008, '绑定动作', 'bm_bind_action', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '绑定动作列表');
-- ============================ 九、字典数据 ============================
-- 设备状态
insert into sys_dict_data values(1771600000000000001, 1, '未激活', '0', 'bm_device_status', '', 'info', 'Y', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '未激活');
insert into sys_dict_data values(1771600000000000002, 2, '在线', '1', 'bm_device_status', '', 'success', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '在线');
insert into sys_dict_data values(1771600000000000003, 3, '离线', '2', 'bm_device_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '离线');
-- 信号等级
insert into sys_dict_data values(1771600000000000004, 1, '离线', '0', 'bm_signal_level', '', 'danger', 'Y', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '离线');
insert into sys_dict_data values(1771600000000000005, 2, '弱', '1', 'bm_signal_level', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '弱');
insert into sys_dict_data values(1771600000000000006, 3, '一般', '2', 'bm_signal_level', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '一般');
insert into sys_dict_data values(1771600000000000007, 4, '强', '3', 'bm_signal_level', '', 'success', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '强');
-- 头套连接
insert into sys_dict_data values(1771600000000000008, 1, '已断开', '0', 'bm_hood_connected', '', 'danger', 'Y', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '已断开');
insert into sys_dict_data values(1771600000000000009, 2, '已连接', '1', 'bm_hood_connected', '', 'success', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '已连接');
-- 眼罩状态
insert into sys_dict_data values(1771600000000000010, 1, '打开', '0', 'bm_hood_cover', '', 'primary', 'Y', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '打开');
insert into sys_dict_data values(1771600000000000011, 2, '遮盖', '1', 'bm_hood_cover', '', 'success', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '遮盖');
-- OTA任务状态
insert into sys_dict_data values(1771600000000000012, 1, '待升级', '0', 'bm_ota_task_status', '', 'info', 'Y', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '待升级');
insert into sys_dict_data values(1771600000000000013, 2, '升级中', '1', 'bm_ota_task_status', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '升级中');
insert into sys_dict_data values(1771600000000000014, 3, '成功', '2', 'bm_ota_task_status', '', 'success', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '成功');
insert into sys_dict_data values(1771600000000000015, 4, '失败', '3', 'bm_ota_task_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '失败');
-- 升级包状态
insert into sys_dict_data values(1771600000000000016, 1, '停用', '0', 'bm_ota_package_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '停用');
insert into sys_dict_data values(1771600000000000017, 2, '启用', '1', 'bm_ota_package_status', '', 'success', 'Y', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '启用');
-- 告警类型
insert into sys_dict_data values(1771600000000000018, 1, '设备离线', 'offline', 'bm_alert_type', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '设备离线');
insert into sys_dict_data values(1771600000000000019, 2, '头套低电', 'low_battery_hood', 'bm_alert_type', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '头套低电');
insert into sys_dict_data values(1771600000000000020, 3, '脚环低电', 'low_battery_ring', 'bm_alert_type', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '脚环低电');
-- 绑定动作
insert into sys_dict_data values(1771600000000000021, 1, '绑定', 'bind', 'bm_bind_action', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '绑定');
insert into sys_dict_data values(1771600000000000022, 2, '解绑', 'unbind', 'bm_bind_action', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '解绑');
insert into sys_dict_data values(1771600000000000023, 3, '换绑', 'rebind', 'bm_bind_action', '', 'warning', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '换绑');
-- ============================ 十、菜单 + 权限字 ============================
-- 一级目录
insert into sys_menu values(1771400000000000001, '设备管理', 0, 6, 'device', null, '', 'N', 'Y', 'M', '0', '0', '', 'dashboard', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '设备管理目录');
-- 二级菜单
insert into sys_menu values(1771400000000000002, '设备列表', 1771400000000000001, 1, 'device', 'device/device/index', '', 'N', 'Y', 'C', '0', '0', 'device:device:list', 'form', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '设备列表菜单');
insert into sys_menu values(1771400000000000003, 'OTA管理', 1771400000000000001, 2, 'ota', 'device/ota/index', '', 'N', 'Y', 'C', '0', '0', 'device:ota:list', 'upload', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, 'OTA管理菜单');
-- 设备列表按钮
insert into sys_menu values(1771400000000000011, '设备查询', 1771400000000000002, 1, '', '', '', 'N', 'Y', 'F', '0', '0', 'device:device:query', '#', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '');
insert into sys_menu values(1771400000000000012, '设备新增', 1771400000000000002, 2, '', '', '', 'N', 'Y', 'F', '0', '0', 'device:device:add', '#', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '');
insert into sys_menu values(1771400000000000013, '设备修改', 1771400000000000002, 3, '', '', '', 'N', 'Y', 'F', '0', '0', 'device:device:edit', '#', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '');
insert into sys_menu values(1771400000000000014, '设备删除', 1771400000000000002, 4, '', '', '', 'N', 'Y', 'F', '0', '0', 'device:device:remove', '#', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '');
insert into sys_menu values(1771400000000000015, '设备导出', 1771400000000000002, 5, '', '', '', 'N', 'Y', 'F', '0', '0', 'device:device:export', '#', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '');
-- OTA 按钮
insert into sys_menu values(1771400000000000016, 'OTA新增', 1771400000000000003, 1, '', '', '', 'N', 'Y', 'F', '0', '0', 'device:ota:add', '#', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '');
-- APP 用户管理(后台管理 APP 注册账号;与 APP 端 /app/user 不是同一组接口)
-- 数据来源:sys_user 中 user_type = 'app_user' 的账号(仅手机号 / 邮箱注册的 C 端用户)
insert into sys_menu values(1771400000000000004, 'APP用户', 1771400000000000001, 3, 'app-user', 'device/appUser/index', '', 'N', 'Y', 'C', '0', '0', 'device:appuser:list', 'user', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, 'APP用户管理菜单');
-- APP 用户按钮(编辑权限字复用:状态变更 / 重置密码 / 解绑设备,口径同 device:ota:add)
insert into sys_menu values(1771400000000000017, '用户查询', 1771400000000000004, 1, '', '', '', 'N', 'Y', 'F', '0', '0', 'device:appuser:query', '#', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '');
insert into sys_menu values(1771400000000000018, '用户编辑', 1771400000000000004, 2, '', '', '', 'N', 'Y', 'F', '0', '0', 'device:appuser:edit', '#', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '');
-- 告警记录(后台只读 + 标记处理;告警的「消息推送」面向 APP 用户,见 bm_app_message)
insert into sys_menu values(1771400000000000005, '告警记录', 1771400000000000001, 4, 'alert', 'device/alert/index', '', 'N', 'Y', 'C', '0', '0', 'device:alert:list', 'message', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '告警记录菜单');
-- 告警记录按钮
insert into sys_menu values(1771400000000000019, '告警查询', 1771400000000000005, 1, '', '', '', 'N', 'Y', 'F', '0', '0', 'device:alert:query', '#', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '');
insert into sys_menu values(1771400000000000020, '告警处理', 1771400000000000005, 2, '', '', '', 'N', 'Y', 'F', '0', '0', 'device:alert:edit', '#', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '');
insert into sys_menu values(1771400000000000021, '告警删除', 1771400000000000005, 3, '', '', '', 'N', 'Y', 'F', '0', '0', 'device:alert:remove', '#', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '');
-- ============================ 十一、角色 ============================
insert into sys_role values(1771300000000000001, '设备管理员', 'device_admin', 5, 1, 1, 1, '0', '0', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '设备域管理角色');
insert into sys_role values(1771300000000000002, '审计员', 'device_auditor', 6, 1, 1, 1, '0', '0', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '设备域只读审计角色');
-- ============================ 十二、角色-菜单关联 ============================
-- 设备管理员:全部设备菜单
insert into sys_role_menu values (1771300000000000001, 1771400000000000001);
insert into sys_role_menu values (1771300000000000001, 1771400000000000002);
insert into sys_role_menu values (1771300000000000001, 1771400000000000003);
insert into sys_role_menu values (1771300000000000001, 1771400000000000011);
insert into sys_role_menu values (1771300000000000001, 1771400000000000012);
insert into sys_role_menu values (1771300000000000001, 1771400000000000013);
insert into sys_role_menu values (1771300000000000001, 1771400000000000014);
insert into sys_role_menu values (1771300000000000001, 1771400000000000015);
insert into sys_role_menu values (1771300000000000001, 1771400000000000016);
-- 设备管理员:APP 用户管理(菜单 + 查询 + 编辑)
insert into sys_role_menu values (1771300000000000001, 1771400000000000004);
insert into sys_role_menu values (1771300000000000001, 1771400000000000017);
insert into sys_role_menu values (1771300000000000001, 1771400000000000018);
-- 设备管理员:告警记录(菜单 + 查询 + 处理 + 删除)
insert into sys_role_menu values (1771300000000000001, 1771400000000000005);
insert into sys_role_menu values (1771300000000000001, 1771400000000000019);
insert into sys_role_menu values (1771300000000000001, 1771400000000000020);
insert into sys_role_menu values (1771300000000000001, 1771400000000000021);
-- 审计员:目录 + 列表 + 详情 + 导出 + OTA 列表 + APP 用户(只读)
insert into sys_role_menu values (1771300000000000002, 1771400000000000001);
insert into sys_role_menu values (1771300000000000002, 1771400000000000002);
insert into sys_role_menu values (1771300000000000002, 1771400000000000003);
insert into sys_role_menu values (1771300000000000002, 1771400000000000011);
insert into sys_role_menu values (1771300000000000002, 1771400000000000015);
-- 审计员:APP 用户菜单 + 查询(不含编辑——审计只读)
insert into sys_role_menu values (1771300000000000002, 1771400000000000004);
insert into sys_role_menu values (1771300000000000002, 1771400000000000017);
-- 审计员:告警记录菜单 + 查询(不含处理与删除——审计只读)
insert into sys_role_menu values (1771300000000000002, 1771400000000000005);
insert into sys_role_menu values (1771300000000000002, 1771400000000000019);
-- ============================ 十三、APP 客户端版本(第 8 张业务表) ============================
-- 用途:后台登记 APP(Android/iOS)版本记录,APP 冷启动经 GET /app/version/latest 检查更新。
-- 口径(与 bm_patch.sql 补丁 7 一致):
-- 1. 版本比较**只用整数构建号 version_code**(int,32 位正整数,人工递增),version_name 仅展示;
-- ⚠️ 禁止时间戳式构建号(int 上界 2147483647,时间戳会溢出)。
-- 2. 唯一键 uk_platform_version_code 不区分逻辑删除(沿用 bm_device.device_no 同口径):
-- 逻辑删除后同平台同构建号不可复用,构建号填错走编辑修正。
-- 3. file_size 用 bigint(对齐 OTA);框架把 Long 序列化为字符串,前端按字符串接收再转 MB。
-- 4. md5 列保留但允许为空(本期不采集,不参与校验)。
drop table if exists bm_app_version;
create table bm_app_version (
version_id bigint(20) not null comment '主键(雪花)',
platform varchar(16) not null comment '平台(android/ios,字典 bm_app_platform)',
version_name varchar(32) not null comment '展示版本号,如 1.0.10(仅展示,不参与比较)',
version_code int(11) not null comment '构建号,32位正整数、单调递增、平台内唯一(唯一比较依据;禁止时间戳式构建号)',
force_update char(1) not null default '0' comment '强制更新(0否 1是;无字典,页面本地映射)',
oss_id bigint(20) default null comment '关联 sys_oss.oss_id(安装包,两平台均上传)',
file_url varchar(500) default null comment '安装包 URL(两平台均上传;冗余自 sys_oss,供 APP 直接下载)',
file_name varchar(255) default null comment '安装包文件名(两平台均上传)',
file_size bigint(20) default null comment '安装包字节数(两平台均上传;框架序列化为字符串,前端取 file.raw.size 提交)',
md5 varchar(64) default null comment '安装包校验值 MD5(预留,本期不填,不参与校验)',
store_url varchar(500) default null comment 'App Store 引导地址(选填)',
changelog varchar(500) default null comment '更新说明(纯文本)',
status char(1) not null default '0' comment '状态(0停用 1启用,字典 bm_app_version_status)',
publish_time datetime default null comment '发布时间(首次置为启用时写入)',
remark varchar(500) default null comment '备注',
create_dept bigint(20) default null comment '创建部门',
create_by bigint(20) default null comment '创建者',
create_time datetime comment '创建时间',
update_by bigint(20) default null comment '更新者',
update_time datetime comment '更新时间',
del_flag char(1) not null default '0' comment '逻辑删除(0存在 1删除)',
primary key (version_id),
unique key uk_platform_version_code (platform, version_code),
unique key uk_platform_version_name (platform, version_name),
key idx_platform_status (platform, status),
key idx_create_time (create_time)
) engine=innodb comment = 'APP客户端版本(后台维护,APP冷启动检查更新)';
-- ============================ 十四、字典类型(增量 2 个) ============================
insert into sys_dict_type values(1771500000000000009, 'APP平台', 'bm_app_platform', 1761000000000000103, 1761100000000000001, sysdate(), null, null, 'APP平台列表');
insert into sys_dict_type values(1771500000000000010, 'APP版本状态', 'bm_app_version_status', 1761000000000000103, 1761100000000000001, sysdate(), null, null, 'APP版本状态列表');
-- ============================ 十五、字典数据(增量 4 条) ============================
-- APP 平台(强制更新无字典,页面本地映射)
insert into sys_dict_data values(1771600000000000024, 1, '安卓', 'android', 'bm_app_platform', '', 'success', 'Y', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '安卓');
insert into sys_dict_data values(1771600000000000025, 2, 'iOS', 'ios', 'bm_app_platform', '', 'primary', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, 'iOS');
-- APP 版本状态
insert into sys_dict_data values(1771600000000000026, 1, '停用', '0', 'bm_app_version_status', '', 'danger', 'N', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '停用');
insert into sys_dict_data values(1771600000000000027, 2, '启用', '1', 'bm_app_version_status', '', 'success', 'Y', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '启用');
-- ============================ 十六、菜单 + 权限字(APP版本管理) ============================
-- 二级菜单(挂「设备管理」目录 1771400000000000001,order_num=5)
insert into sys_menu values(1771400000000000006, 'APP版本管理', 1771400000000000001, 5, 'app-version', 'device/appVersion/index', '', 'N', 'Y', 'C', '0', '0', 'device:appversion:list', 'list', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, 'APP版本管理菜单');
-- 按钮
insert into sys_menu values(1771400000000000022, '版本查询', 1771400000000000006, 1, '', '', '', 'N', 'Y', 'F', '0', '0', 'device:appversion:query', '#', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '');
insert into sys_menu values(1771400000000000023, '版本新增', 1771400000000000006, 2, '', '', '', 'N', 'Y', 'F', '0', '0', 'device:appversion:add', '#', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '');
insert into sys_menu values(1771400000000000024, '版本修改', 1771400000000000006, 3, '', '', '', 'N', 'Y', 'F', '0', '0', 'device:appversion:edit', '#', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '');
insert into sys_menu values(1771400000000000025, '版本删除', 1771400000000000006, 4, '', '', '', 'N', 'Y', 'F', '0', '0', 'device:appversion:remove', '#', '', '', 1761000000000000103, 1761100000000000001, sysdate(), null, null, '');
-- ============================ 十七、角色-菜单关联(APP 版本) ============================
-- 设备管理员:菜单 + 全部按钮
insert into sys_role_menu values (1771300000000000001, 1771400000000000006);
insert into sys_role_menu values (1771300000000000001, 1771400000000000022);
insert into sys_role_menu values (1771300000000000001, 1771400000000000023);
insert into sys_role_menu values (1771300000000000001, 1771400000000000024);
insert into sys_role_menu values (1771300000000000001, 1771400000000000025);
-- 设备管理员:补授框架上传权限字 system:oss:upload(menu_id=1761400000000001601 '文件上传',见 ry_vue.sql:318)
-- 只补上传这一条,读/删/改配置属超管职责,不授。
insert into sys_role_menu values (1771300000000000001, 1761400000000001601);
-- 审计员:菜单 + 仅 query(只读)
insert into sys_role_menu values (1771300000000000002, 1771400000000000006);
insert into sys_role_menu values (1771300000000000002, 1771400000000000022);