feat: 数据权限过滤 + 多模块查询增强 + 初始化数据

- 新增 DataScopeHelper 工具类,实现基于用户角色的数据权限过滤
- AM/CW/BS 三域 Service 集成数据权限,按区划/机构过滤查询结果
- RecordingTaskVO 新增录屏任务视图对象
- ScreenQuery/RecordingConfigQuery 支持多条件组合查询
- 补充 AM(录屏设置/任务/画面监控) + CW(取证/规则关联/线索) 初始化 SQL
- 修正系统初始用户 BCrypt hash

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
chenjy 2026-05-26 09:51:19 +08:00
parent 5540107aa1
commit 0f643376c0
21 changed files with 1139 additions and 30 deletions

View File

@ -124,13 +124,14 @@ INSERT INTO OARMS.SYS_ROLE_PERMISSION (id, role_id, perm_id, create_by, create_t
-- ---------------------------------------------------------------------------- -- ----------------------------------------------------------------------------
-- 4. 初始用户3 个,密码均为 123456 的 BCrypt -- 4. 初始用户3 个,密码均为 123456 的 BCrypt
-- BCrypt hash of '123456': $2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy -- BCrypt hash of '123456': $2a$10$h4yKk0mn.Uad15AOE9IFwuSDC9XeuNxqZkrZ.Y2YLuk9KurltER1i
-- 注意BCrypt 哈希每次生成不同,此为当前可用值。如需重新生成请使用 BCryptPasswordEncoder
-- 实际部署前请修改密码 -- 实际部署前请修改密码
-- ---------------------------------------------------------------------------- -- ----------------------------------------------------------------------------
INSERT INTO OARMS.SYS_USER (id, username, password, real_name, phone, org_name, district_code, status, create_by, create_time, create_name) VALUES INSERT INTO OARMS.SYS_USER (id, username, password, real_name, phone, org_name, district_code, status, create_by, create_time, create_name) VALUES
('user_city_admin', 'city_admin', '$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy', '市局管理员', '13800000001', '广州市市场监督管理局', NULL, 1, 'system', CURRENT_TIMESTAMP, '系统'), ('user_city_admin', 'city_admin', '$2a$10$h4yKk0mn.Uad15AOE9IFwuSDC9XeuNxqZkrZ.Y2YLuk9KurltER1i', '市局管理员', '13800000001', '广州市市场监督管理局', NULL, 1, 'system', CURRENT_TIMESTAMP, '系统'),
('user_district_admin', 'district_admin', '$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy', '天河区管理员', '13800000002', '广州市天河区市场监督管理局', '440106', 1, 'system', CURRENT_TIMESTAMP, '系统'), ('user_district_admin', 'district_admin', '$2a$10$h4yKk0mn.Uad15AOE9IFwuSDC9XeuNxqZkrZ.Y2YLuk9KurltER1i', '天河区管理员', '13800000002', '广州市天河区市场监督管理局', '440106', 1, 'system', CURRENT_TIMESTAMP, '系统'),
('user_operator', 'operator', '$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy', '运营商管理员', '13800000003', '广州文化传媒有限公司', '440106', 1, 'system', CURRENT_TIMESTAMP, '系统'); ('user_operator', 'operator', '$2a$10$h4yKk0mn.Uad15AOE9IFwuSDC9XeuNxqZkrZ.Y2YLuk9KurltER1i', '运营商管理员', '13800000003', '广州文化传媒有限公司', '440106', 1, 'system', CURRENT_TIMESTAMP, '系统');
-- 用户角色关联 -- 用户角色关联
INSERT INTO OARMS.SYS_USER_ROLE (id, user_id, role_id, create_by, create_time, create_name) VALUES INSERT INTO OARMS.SYS_USER_ROLE (id, user_id, role_id, create_by, create_time, create_name) VALUES

View File

@ -0,0 +1,116 @@
-- ============================================================================
-- OARMS - AM-1 录屏配置管理 初始数据
-- Database: DM8 (达梦)
-- Schema: OARMS
-- Version: V3.0.1
-- Date: 2026-05-25
-- Description: 8 条录屏配置示例数据,基于 BS 大屏种子数据生成
-- Note:
-- 1. screen_id 关联 bs_screen.id (BS-SCR-001 ~ BS-SCR-008)
-- 2. 录屏时间范围均在对应大屏 ad_play_time_range 内
-- 3. 状态为 2(停用) 的大屏/维修中的大屏,配置状态设为已停用
-- ============================================================================
-- 1. 天河路正佳广场 (广告播放 07:00-22:00) → 录屏 07:00-21:30
INSERT INTO OARMS.AM_RECORDING_CONFIG (
ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
RECORD_START_TIME, RECORD_END_TIME, RECORD_DURATION, RECORD_FREQUENCY, CONFIG_STATUS,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RC-001', 'BS-SCR-001', '天河路正佳广场LED大屏',
'广州市天河区天河路228号正佳广场', '440106',
'07:00', '21:30', 30, 15, 1,
'system', TO_TIMESTAMP('2026-05-18 10:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员',
'system', TO_TIMESTAMP('2026-05-18 10:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员'
);
-- 2. 北京路广百百货 (广告播放 08:00-22:30) → 录屏 08:00-22:00
INSERT INTO OARMS.AM_RECORDING_CONFIG (
ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
RECORD_START_TIME, RECORD_END_TIME, RECORD_DURATION, RECORD_FREQUENCY, CONFIG_STATUS,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RC-002', 'BS-SCR-002', '北京路广百百货LED大屏',
'广州市越秀区北京路298号广百百货', '440104',
'08:00', '22:00', 20, 10, 1,
'system', TO_TIMESTAMP('2026-05-18 10:35:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员',
'system', TO_TIMESTAMP('2026-05-18 10:35:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员'
);
-- 3. 江南西路海珠万达广场 (广告播放 07:30-22:00) → 录屏 08:00-21:30
INSERT INTO OARMS.AM_RECORDING_CONFIG (
ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
RECORD_START_TIME, RECORD_END_TIME, RECORD_DURATION, RECORD_FREQUENCY, CONFIG_STATUS,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RC-003', 'BS-SCR-003', '江南西路海珠万达广场LED大屏',
'广州市海珠区江南西路46号海珠万达广场', '440105',
'08:00', '21:30', 30, 20, 1,
'system', TO_TIMESTAMP('2026-05-18 10:40:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员',
'system', TO_TIMESTAMP('2026-05-18 10:40:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员'
);
-- 4. 上下九步行街 (广告播放 09:00-22:00) → 录屏 09:00-21:00
INSERT INTO OARMS.AM_RECORDING_CONFIG (
ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
RECORD_START_TIME, RECORD_END_TIME, RECORD_DURATION, RECORD_FREQUENCY, CONFIG_STATUS,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RC-004', 'BS-SCR-004', '上下九步行街LED大屏',
'广州市荔湾区下九路6号上下九广场', '440103',
'09:00', '21:00', 15, 30, 1,
'system', TO_TIMESTAMP('2026-05-18 10:45:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员',
'system', TO_TIMESTAMP('2026-05-18 10:45:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员'
);
-- 5. 白云大道白云万达广场 (广告播放 07:00-23:00) → 录屏 07:00-22:00
INSERT INTO OARMS.AM_RECORDING_CONFIG (
ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
RECORD_START_TIME, RECORD_END_TIME, RECORD_DURATION, RECORD_FREQUENCY, CONFIG_STATUS,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RC-005', 'BS-SCR-005', '白云大道白云万达广场LED大屏',
'广州市白云区云城东路501号白云万达广场', '440111',
'07:00', '22:00', 60, 15, 1,
'system', TO_TIMESTAMP('2026-05-18 10:50:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员',
'system', TO_TIMESTAMP('2026-05-18 10:50:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员'
);
-- 6. 科学城揽月路 (广告播放 08:00-21:00, 大屏已停用) → 录屏 08:00-20:30, 配置已停用
INSERT INTO OARMS.AM_RECORDING_CONFIG (
ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
RECORD_START_TIME, RECORD_END_TIME, RECORD_DURATION, RECORD_FREQUENCY, CONFIG_STATUS,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RC-006', 'BS-SCR-006', '科学城揽月路LED大屏',
'广州市黄埔区科学城揽月路101号', '440112',
'08:00', '20:30', 20, 10, 2,
'system', TO_TIMESTAMP('2026-05-18 10:55:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员',
'system', TO_TIMESTAMP('2026-05-18 10:55:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员'
);
-- 7. 市桥大北路番禺广场 (广告播放 07:30-22:30) → 录屏 08:00-22:00
INSERT INTO OARMS.AM_RECORDING_CONFIG (
ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
RECORD_START_TIME, RECORD_END_TIME, RECORD_DURATION, RECORD_FREQUENCY, CONFIG_STATUS,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RC-007', 'BS-SCR-007', '市桥大北路番禺广场LED大屏',
'广州市番禺区市桥街大北路101号番禺广场', '440113',
'08:00', '22:00', 30, 15, 1,
'system', TO_TIMESTAMP('2026-05-18 11:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员',
'system', TO_TIMESTAMP('2026-05-18 11:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员'
);
-- 8. 新华路花都广场 (广告播放 08:00-21:30, 大屏维修中) → 录屏 08:30-21:00, 配置已停用
INSERT INTO OARMS.AM_RECORDING_CONFIG (
ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
RECORD_START_TIME, RECORD_END_TIME, RECORD_DURATION, RECORD_FREQUENCY, CONFIG_STATUS,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RC-008', 'BS-SCR-008', '新华路花都广场LED大屏',
'广州市花都区新华街公益路21号花都广场', '440114',
'08:30', '21:00', 15, 20, 2,
'system', TO_TIMESTAMP('2026-05-18 11:05:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员',
'system', TO_TIMESTAMP('2026-05-18 11:05:00', 'YYYY-MM-DD HH24:MI:SS'), '系统管理员'
);

View File

@ -0,0 +1,243 @@
-- ============================================================================
-- OARMS - AM-2 录屏任务管理 初始数据
-- Database: DM8 (达梦)
-- Schema: OARMS
-- Version: V4.0.1
-- Date: 2026-05-25
-- Description: 基于 V3.0.1 录屏配置生成的 16 条录屏任务示例数据
-- Note:
-- 1. 每条 task 关联 AM-RC-001 ~ AM-RC-008 的录屏配置
-- 2. 已启用配置(1)生成已完成(2)和录屏中(1)任务
-- 3. 已停用配置(2)生成失败(3)任务
-- 4. actual_start_time 在对应配置录屏时间范围内
-- ============================================================================
-- ===================== 已启用配置对应的任务 =====================
-- 1-1. 天河路正佳广场 → 已完成
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-001', 'BS-SCR-001', 'AM-RC-001',
TO_TIMESTAMP('2026-05-25 07:00:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_TIMESTAMP('2026-05-25 07:30:00', 'YYYY-MM-DD HH24:MI:SS'),
2, '/video/2026-05-25/BS-SCR-001_0700.mp4', 0, NULL,
'system', TO_TIMESTAMP('2026-05-25 07:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 07:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 1-2. 天河路正佳广场 → 已完成
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-002', 'BS-SCR-001', 'AM-RC-001',
TO_TIMESTAMP('2026-05-25 07:30:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'),
2, '/video/2026-05-25/BS-SCR-001_0730.mp4', 0, NULL,
'system', TO_TIMESTAMP('2026-05-25 07:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 2-1. 北京路广百百货 → 已完成
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-003', 'BS-SCR-002', 'AM-RC-002',
TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_TIMESTAMP('2026-05-25 08:20:00', 'YYYY-MM-DD HH24:MI:SS'),
2, '/video/2026-05-25/BS-SCR-002_0800.mp4', 0, NULL,
'system', TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 08:20:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 2-2. 北京路广百百货 → 录屏中
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-004', 'BS-SCR-002', 'AM-RC-002',
TO_TIMESTAMP('2026-05-25 08:20:00', 'YYYY-MM-DD HH24:MI:SS'),
NULL,
1, NULL, 0, NULL,
'system', TO_TIMESTAMP('2026-05-25 08:20:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 08:20:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 3-1. 江南西路海珠万达广场 → 已完成
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-005', 'BS-SCR-003', 'AM-RC-003',
TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_TIMESTAMP('2026-05-25 08:30:00', 'YYYY-MM-DD HH24:MI:SS'),
2, '/video/2026-05-25/BS-SCR-003_0800.mp4', 0, NULL,
'system', TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 08:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 3-2. 江南西路海珠万达广场 → 已完成
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-006', 'BS-SCR-003', 'AM-RC-003',
TO_TIMESTAMP('2026-05-25 08:30:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_TIMESTAMP('2026-05-25 09:00:00', 'YYYY-MM-DD HH24:MI:SS'),
2, '/video/2026-05-25/BS-SCR-003_0830.mp4', 0, NULL,
'system', TO_TIMESTAMP('2026-05-25 08:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 09:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 4-1. 上下九步行街 → 已完成
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-007', 'BS-SCR-004', 'AM-RC-004',
TO_TIMESTAMP('2026-05-25 09:00:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_TIMESTAMP('2026-05-25 09:15:00', 'YYYY-MM-DD HH24:MI:SS'),
2, '/video/2026-05-25/BS-SCR-004_0900.mp4', 0, NULL,
'system', TO_TIMESTAMP('2026-05-25 09:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 09:15:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 4-2. 上下九步行街 → 录屏中
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-008', 'BS-SCR-004', 'AM-RC-004',
TO_TIMESTAMP('2026-05-25 09:15:00', 'YYYY-MM-DD HH24:MI:SS'),
NULL,
1, NULL, 0, NULL,
'system', TO_TIMESTAMP('2026-05-25 09:15:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 09:15:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 5-1. 白云大道白云万达广场 → 已完成
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-009', 'BS-SCR-005', 'AM-RC-005',
TO_TIMESTAMP('2026-05-25 07:00:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'),
2, '/video/2026-05-25/BS-SCR-005_0700.mp4', 0, NULL,
'system', TO_TIMESTAMP('2026-05-25 07:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 5-2. 白云大道白云万达广场 → 已完成
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-010', 'BS-SCR-005', 'AM-RC-005',
TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_TIMESTAMP('2026-05-25 09:00:00', 'YYYY-MM-DD HH24:MI:SS'),
2, '/video/2026-05-25/BS-SCR-005_0800.mp4', 0, NULL,
'system', TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 09:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 7-1. 市桥大北路番禺广场 → 已完成
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-011', 'BS-SCR-007', 'AM-RC-007',
TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_TIMESTAMP('2026-05-25 08:30:00', 'YYYY-MM-DD HH24:MI:SS'),
2, '/video/2026-05-25/BS-SCR-007_0800.mp4', 0, NULL,
'system', TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 08:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 7-2. 市桥大北路番禺广场 → 录屏中
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-012', 'BS-SCR-007', 'AM-RC-007',
TO_TIMESTAMP('2026-05-25 08:30:00', 'YYYY-MM-DD HH24:MI:SS'),
NULL,
1, NULL, 0, NULL,
'system', TO_TIMESTAMP('2026-05-25 08:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 08:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- ===================== 已停用配置对应的失败任务 =====================
-- 6-1. 科学城揽月路(配置已停用) → 失败
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-013', 'BS-SCR-006', 'AM-RC-006',
TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_TIMESTAMP('2026-05-25 08:05:00', 'YYYY-MM-DD HH24:MI:SS'),
3, NULL, 3, '设备离线,录屏失败',
'system', TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 08:05:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 8-1. 新华路花都广场(配置已停用,大屏维修中) → 失败
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-014', 'BS-SCR-008', 'AM-RC-008',
TO_TIMESTAMP('2026-05-25 08:30:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_TIMESTAMP('2026-05-25 08:35:00', 'YYYY-MM-DD HH24:MI:SS'),
3, NULL, 2, '设备维修中,无法连接',
'system', TO_TIMESTAMP('2026-05-25 08:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 08:35:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- ===================== 历史日期任务(前一天) =====================
-- 1-3. 天河路正佳广场(前一天) → 已完成
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-015', 'BS-SCR-001', 'AM-RC-001',
TO_TIMESTAMP('2026-05-24 07:00:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_TIMESTAMP('2026-05-24 07:30:00', 'YYYY-MM-DD HH24:MI:SS'),
2, '/video/2026-05-24/BS-SCR-001_0700.mp4', 0, NULL,
'system', TO_TIMESTAMP('2026-05-24 07:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-24 07:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 3-3. 江南西路海珠万达广场(前一天) → 已完成
INSERT INTO OARMS.AM_RECORDING_TASK (
ID, SCREEN_ID, CONFIG_ID, ACTUAL_START_TIME, ACTUAL_END_TIME,
TASK_STATUS, VIDEO_FILE_PATH, RETRY_COUNT, ERROR_MESSAGE,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-RT-016', 'BS-SCR-003', 'AM-RC-003',
TO_TIMESTAMP('2026-05-24 08:00:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_TIMESTAMP('2026-05-24 08:30:00', 'YYYY-MM-DD HH24:MI:SS'),
2, '/video/2026-05-24/BS-SCR-003_0800.mp4', 0, NULL,
'system', TO_TIMESTAMP('2026-05-24 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-24 08:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);

View File

@ -0,0 +1,180 @@
-- ============================================================================
-- OARMS - AM-3 监控记录管理 初始数据
-- Database: DM8 (达梦)
-- Schema: OARMS
-- Version: V5.0.1
-- Date: 2026-05-25
-- Description: 基于 V4.0.1 录屏任务生成的 12 条监控记录
-- Note:
-- 1. 每条记录关联已完成的录屏任务
-- 2. screen_name/screen_address/district 冗余存储
-- 3. 混合各种监控状态
-- ============================================================================
-- 已完成任务的监控记录 → 已完成(3)或违规(4)
-- 1. 天河路正佳广场 → 已监控正常
INSERT INTO OARMS.AM_MONITOR_RECORD (
ID, TASK_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
MONITOR_STATUS, MONITOR_RESULT, MONITOR_PERSON, MONITORED_AT,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-MR-001', 'AM-RT-001', 'BS-SCR-001',
'天河路正佳广场LED大屏', '广州市天河区天河路228号正佳广场', '440106',
3, '广告内容正常,未发现违法行为', '张三',
TO_TIMESTAMP('2026-05-25 07:35:00', 'YYYY-MM-DD HH24:MI:SS'),
'system', TO_TIMESTAMP('2026-05-25 07:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'zhangsan', TO_TIMESTAMP('2026-05-25 07:35:00', 'YYYY-MM-DD HH24:MI:SS'), '张三'
);
-- 2. 天河路正佳广场 → 违规(虚假广告)
INSERT INTO OARMS.AM_MONITOR_RECORD (
ID, TASK_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
MONITOR_STATUS, MONITOR_RESULT, MONITOR_PERSON, MONITORED_AT,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-MR-002', 'AM-RT-002', 'BS-SCR-001',
'天河路正佳广场LED大屏', '广州市天河区天河路228号正佳广场', '440106',
4, '发现疑似虚假医疗广告,宣称"根治痛风不复发"', '张三',
TO_TIMESTAMP('2026-05-25 08:05:00', 'YYYY-MM-DD HH24:MI:SS'),
'system', TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'zhangsan', TO_TIMESTAMP('2026-05-25 08:05:00', 'YYYY-MM-DD HH24:MI:SS'), '张三'
);
-- 3. 北京路广百百货 → 已监控正常
INSERT INTO OARMS.AM_MONITOR_RECORD (
ID, TASK_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
MONITOR_STATUS, MONITOR_RESULT, MONITOR_PERSON, MONITORED_AT,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-MR-003', 'AM-RT-003', 'BS-SCR-002',
'北京路广百百货LED大屏', '广州市越秀区北京路298号广百百货', '440104',
3, '广告内容正常,符合规范要求', '李四',
TO_TIMESTAMP('2026-05-25 08:25:00', 'YYYY-MM-DD HH24:MI:SS'),
'system', TO_TIMESTAMP('2026-05-25 08:20:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'lisi', TO_TIMESTAMP('2026-05-25 08:25:00', 'YYYY-MM-DD HH24:MI:SS'), '李四'
);
-- 4. 北京路广百百货 → 待监控
INSERT INTO OARMS.AM_MONITOR_RECORD (
ID, TASK_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
MONITOR_STATUS, MONITOR_RESULT, MONITOR_PERSON, MONITORED_AT,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-MR-004', 'AM-RT-004', 'BS-SCR-002',
'北京路广百百货LED大屏', '广州市越秀区北京路298号广百百货', '440104',
1, NULL, NULL, NULL,
'system', TO_TIMESTAMP('2026-05-25 08:20:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 08:20:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 5. 江南西路海珠万达 → 违规(绝对化用语)
INSERT INTO OARMS.AM_MONITOR_RECORD (
ID, TASK_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
MONITOR_STATUS, MONITOR_RESULT, MONITOR_PERSON, MONITORED_AT,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-MR-005', 'AM-RT-005', 'BS-SCR-003',
'江南西路海珠万达广场LED大屏', '广州市海珠区江南西路46号海珠万达广场', '440105',
4, '发现绝对化用语"全国最佳",涉嫌违反广告法', '王五',
TO_TIMESTAMP('2026-05-25 08:35:00', 'YYYY-MM-DD HH24:MI:SS'),
'system', TO_TIMESTAMP('2026-05-25 08:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'wangwu', TO_TIMESTAMP('2026-05-25 08:35:00', 'YYYY-MM-DD HH24:MI:SS'), '王五'
);
-- 6. 江南西路海珠万达 → 已监控正常
INSERT INTO OARMS.AM_MONITOR_RECORD (
ID, TASK_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
MONITOR_STATUS, MONITOR_RESULT, MONITOR_PERSON, MONITORED_AT,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-MR-006', 'AM-RT-006', 'BS-SCR-003',
'江南西路海珠万达广场LED大屏', '广州市海珠区江南西路46号海珠万达广场', '440105',
3, '广告内容正常', '王五',
TO_TIMESTAMP('2026-05-25 09:05:00', 'YYYY-MM-DD HH24:MI:SS'),
'system', TO_TIMESTAMP('2026-05-25 09:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'wangwu', TO_TIMESTAMP('2026-05-25 09:05:00', 'YYYY-MM-DD HH24:MI:SS'), '王五'
);
-- 7. 上下九步行街 → 监控中
INSERT INTO OARMS.AM_MONITOR_RECORD (
ID, TASK_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
MONITOR_STATUS, MONITOR_RESULT, MONITOR_PERSON, MONITORED_AT,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-MR-007', 'AM-RT-007', 'BS-SCR-004',
'上下九步行街LED大屏', '广州市荔湾区下九路6号上下九广场', '440103',
2, NULL, '赵六',
TO_TIMESTAMP('2026-05-25 09:20:00', 'YYYY-MM-DD HH24:MI:SS'),
'system', TO_TIMESTAMP('2026-05-25 09:15:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'zhaoliu', TO_TIMESTAMP('2026-05-25 09:20:00', 'YYYY-MM-DD HH24:MI:SS'), '赵六'
);
-- 8. 上下九步行街 → 待监控
INSERT INTO OARMS.AM_MONITOR_RECORD (
ID, TASK_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
MONITOR_STATUS, MONITOR_RESULT, MONITOR_PERSON, MONITORED_AT,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-MR-008', 'AM-RT-008', 'BS-SCR-004',
'上下九步行街LED大屏', '广州市荔湾区下九路6号上下九广场', '440103',
1, NULL, NULL, NULL,
'system', TO_TIMESTAMP('2026-05-25 09:15:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 09:15:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 9. 白云大道白云万达 → 已监控正常
INSERT INTO OARMS.AM_MONITOR_RECORD (
ID, TASK_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
MONITOR_STATUS, MONITOR_RESULT, MONITOR_PERSON, MONITORED_AT,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-MR-009', 'AM-RT-009', 'BS-SCR-005',
'白云大道白云万达广场LED大屏', '广州市白云区云城东路501号白云万达广场', '440111',
3, '广告内容正常', '张三',
TO_TIMESTAMP('2026-05-25 08:05:00', 'YYYY-MM-DD HH24:MI:SS'),
'system', TO_TIMESTAMP('2026-05-25 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'zhangsan', TO_TIMESTAMP('2026-05-25 08:05:00', 'YYYY-MM-DD HH24:MI:SS'), '张三'
);
-- 10. 白云大道白云万达 → 违规(虚假宣传)
INSERT INTO OARMS.AM_MONITOR_RECORD (
ID, TASK_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
MONITOR_STATUS, MONITOR_RESULT, MONITOR_PERSON, MONITORED_AT,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-MR-010', 'AM-RT-010', 'BS-SCR-005',
'白云大道白云万达广场LED大屏', '广州市白云区云城东路501号白云万达广场', '440111',
4, '发现虚假宣传,广告声称"包治百病"涉嫌违法', '李四',
TO_TIMESTAMP('2026-05-25 09:05:00', 'YYYY-MM-DD HH24:MI:SS'),
'system', TO_TIMESTAMP('2026-05-25 09:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'lisi', TO_TIMESTAMP('2026-05-25 09:05:00', 'YYYY-MM-DD HH24:MI:SS'), '李四'
);
-- 11. 番禺广场 → 已监控正常
INSERT INTO OARMS.AM_MONITOR_RECORD (
ID, TASK_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
MONITOR_STATUS, MONITOR_RESULT, MONITOR_PERSON, MONITORED_AT,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-MR-011', 'AM-RT-011', 'BS-SCR-007',
'市桥大北路番禺广场LED大屏', '广州市番禺区市桥街大北路101号番禺广场', '440113',
3, '广告内容正常', '王五',
TO_TIMESTAMP('2026-05-25 08:35:00', 'YYYY-MM-DD HH24:MI:SS'),
'system', TO_TIMESTAMP('2026-05-25 08:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'wangwu', TO_TIMESTAMP('2026-05-25 08:35:00', 'YYYY-MM-DD HH24:MI:SS'), '王五'
);
-- 12. 番禺广场 → 监控中
INSERT INTO OARMS.AM_MONITOR_RECORD (
ID, TASK_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
MONITOR_STATUS, MONITOR_RESULT, MONITOR_PERSON, MONITORED_AT,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'AM-MR-012', 'AM-RT-012', 'BS-SCR-007',
'市桥大北路番禺广场LED大屏', '广州市番禺区市桥街大北路101号番禺广场', '440113',
2, NULL, '赵六',
TO_TIMESTAMP('2026-05-25 08:50:00', 'YYYY-MM-DD HH24:MI:SS'),
'system', TO_TIMESTAMP('2026-05-25 08:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'zhaoliu', TO_TIMESTAMP('2026-05-25 08:50:00', 'YYYY-MM-DD HH24:MI:SS'), '赵六'
);

View File

@ -0,0 +1,130 @@
-- ============================================================================
-- OARMS - CW-1 固化取证管理 初始数据
-- Database: DM8 (达梦)
-- Schema: OARMS
-- Version: V7.0.1
-- Date: 2026-05-25
-- Description: 基于 V5.0.1 违规监控记录生成的 5 条取证记录 + 状态历史
-- Note:
-- 1. 取证记录来源于状态为 4(违规) 的监控记录
-- 2. 包含不同取证状态(1=待关联规则, 2=已关联规则, 3=已生成线索)
-- ============================================================================
-- 1. 天河路正佳广场虚假广告 → 待关联规则(1)
INSERT INTO OARMS.CW_EVIDENCE_RECORD (
ID, MONITOR_RECORD_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
EVIDENCE_VIDEO_FILE, CLIP_START_TIME, CLIP_END_TIME, CLIP_DURATION,
EVIDENCE_STATUS, EVIDENCE_PERSON, EVIDENCED_AT,
SOURCE_MONITOR_PERSON, SOURCE_MONITOR_TIME, SOURCE_MONITOR_REMARK,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'CW-ER-001', 'AM-MR-002', 'BS-SCR-001',
'天河路正佳广场LED大屏', '广州市天河区天河路228号正佳广场', '440106',
'/evidence/2026-05-25/CW-ER-001.mp4', '07:32:00', '07:38:00', 360,
1, '张三', TO_TIMESTAMP('2026-05-25 08:10:00', 'YYYY-MM-DD HH24:MI:SS'),
'张三', TO_TIMESTAMP('2026-05-25 08:05:00', 'YYYY-MM-DD HH24:MI:SS'), '发现疑似虚假医疗广告',
'system', TO_TIMESTAMP('2026-05-25 08:10:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 08:10:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 2. 江南西路海珠万达绝对化用语 → 已关联规则(2)
INSERT INTO OARMS.CW_EVIDENCE_RECORD (
ID, MONITOR_RECORD_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
EVIDENCE_VIDEO_FILE, CLIP_START_TIME, CLIP_END_TIME, CLIP_DURATION,
EVIDENCE_STATUS, EVIDENCE_PERSON, EVIDENCED_AT,
SOURCE_MONITOR_PERSON, SOURCE_MONITOR_TIME, SOURCE_MONITOR_REMARK,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'CW-ER-002', 'AM-MR-005', 'BS-SCR-003',
'江南西路海珠万达广场LED大屏', '广州市海珠区江南西路46号海珠万达广场', '440105',
'/evidence/2026-05-25/CW-ER-002.mp4', '08:28:00', '08:33:00', 300,
2, '王五', TO_TIMESTAMP('2026-05-25 08:40:00', 'YYYY-MM-DD HH24:MI:SS'),
'王五', TO_TIMESTAMP('2026-05-25 08:35:00', 'YYYY-MM-DD HH24:MI:SS'), '发现绝对化用语"全国最佳"',
'system', TO_TIMESTAMP('2026-05-25 08:40:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 08:50:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 3. 白云万达虚假宣传 → 已生成线索(3)
INSERT INTO OARMS.CW_EVIDENCE_RECORD (
ID, MONITOR_RECORD_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
EVIDENCE_VIDEO_FILE, CLIP_START_TIME, CLIP_END_TIME, CLIP_DURATION,
EVIDENCE_STATUS, EVIDENCE_PERSON, EVIDENCED_AT,
SOURCE_MONITOR_PERSON, SOURCE_MONITOR_TIME, SOURCE_MONITOR_REMARK,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'CW-ER-003', 'AM-MR-010', 'BS-SCR-005',
'白云大道白云万达广场LED大屏', '广州市白云区云城东路501号白云万达广场', '440111',
'/evidence/2026-05-25/CW-ER-003.mp4', '08:55:00', '09:02:00', 420,
3, '李四', TO_TIMESTAMP('2026-05-25 09:10:00', 'YYYY-MM-DD HH24:MI:SS'),
'李四', TO_TIMESTAMP('2026-05-25 09:05:00', 'YYYY-MM-DD HH24:MI:SS'), '发现虚假宣传"包治百病"',
'system', TO_TIMESTAMP('2026-05-25 09:10:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 09:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 4. 天河路正佳广场(前一天) → 已关联规则(2)
INSERT INTO OARMS.CW_EVIDENCE_RECORD (
ID, MONITOR_RECORD_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
EVIDENCE_VIDEO_FILE, CLIP_START_TIME, CLIP_END_TIME, CLIP_DURATION,
EVIDENCE_STATUS, EVIDENCE_PERSON, EVIDENCED_AT,
SOURCE_MONITOR_PERSON, SOURCE_MONITOR_TIME, SOURCE_MONITOR_REMARK,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'CW-ER-004', 'AM-MR-001', 'BS-SCR-001',
'天河路正佳广场LED大屏', '广州市天河区天河路228号正佳广场', '440106',
'/evidence/2026-05-24/CW-ER-004.mp4', '07:25:00', '07:28:00', 180,
2, '张三', TO_TIMESTAMP('2026-05-24 07:40:00', 'YYYY-MM-DD HH24:MI:SS'),
'张三', TO_TIMESTAMP('2026-05-24 07:35:00', 'YYYY-MM-DD HH24:MI:SS'), '疑似虚假宣传待进一步核实',
'system', TO_TIMESTAMP('2026-05-24 07:40:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-24 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- 5. 江南西路海珠万达(前一天) → 待关联规则(1)
INSERT INTO OARMS.CW_EVIDENCE_RECORD (
ID, MONITOR_RECORD_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
EVIDENCE_VIDEO_FILE, CLIP_START_TIME, CLIP_END_TIME, CLIP_DURATION,
EVIDENCE_STATUS, EVIDENCE_PERSON, EVIDENCED_AT,
SOURCE_MONITOR_PERSON, SOURCE_MONITOR_TIME, SOURCE_MONITOR_REMARK,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'CW-ER-005', 'AM-MR-006', 'BS-SCR-003',
'江南西路海珠万达广场LED大屏', '广州市海珠区江南西路46号海珠万达广场', '440105',
'/evidence/2026-05-24/CW-ER-005.mp4', '08:50:00', '08:55:00', 300,
1, '王五', TO_TIMESTAMP('2026-05-24 09:10:00', 'YYYY-MM-DD HH24:MI:SS'),
'王五', TO_TIMESTAMP('2026-05-24 09:05:00', 'YYYY-MM-DD HH24:MI:SS'), '广告内容存疑需进一步分析',
'system', TO_TIMESTAMP('2026-05-24 09:10:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-24 09:10:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- ===================== 状态变更历史 =====================
-- CW-ER-002: 待关联规则(1) → 已关联规则(2)
INSERT INTO OARMS.CW_EVIDENCE_STATUS_HISTORY (
ID, EVIDENCE_ID, FROM_STATUS, TO_STATUS, CHANGED_AT, CHANGED_BY
) VALUES (
'CW-ESH-001', 'CW-ER-002', 1, 2,
TO_TIMESTAMP('2026-05-25 08:50:00', 'YYYY-MM-DD HH24:MI:SS'), 'admin'
);
-- CW-ER-003: 待关联规则(1) → 已关联规则(2)
INSERT INTO OARMS.CW_EVIDENCE_STATUS_HISTORY (
ID, EVIDENCE_ID, FROM_STATUS, TO_STATUS, CHANGED_AT, CHANGED_BY
) VALUES (
'CW-ESH-002', 'CW-ER-003', 1, 2,
TO_TIMESTAMP('2026-05-25 09:15:00', 'YYYY-MM-DD HH24:MI:SS'), 'admin'
);
-- CW-ER-003: 已关联规则(2) → 已生成线索(3)
INSERT INTO OARMS.CW_EVIDENCE_STATUS_HISTORY (
ID, EVIDENCE_ID, FROM_STATUS, TO_STATUS, CHANGED_AT, CHANGED_BY
) VALUES (
'CW-ESH-003', 'CW-ER-003', 2, 3,
TO_TIMESTAMP('2026-05-25 09:30:00', 'YYYY-MM-DD HH24:MI:SS'), 'admin'
);
-- CW-ER-004: 待关联规则(1) → 已关联规则(2)
INSERT INTO OARMS.CW_EVIDENCE_STATUS_HISTORY (
ID, EVIDENCE_ID, FROM_STATUS, TO_STATUS, CHANGED_AT, CHANGED_BY
) VALUES (
'CW-ESH-004', 'CW-ER-004', 1, 2,
TO_TIMESTAMP('2026-05-24 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), 'admin'
);

View File

@ -0,0 +1,42 @@
-- ============================================================================
-- OARMS - CW-2 证据规则关联 初始数据
-- Database: DM8 (达梦)
-- Schema: OARMS
-- Version: V8.0.1
-- Date: 2026-05-25
-- Description: 基于已关联规则(2+)的取证记录生成的关联数据
-- Note:
-- 1. 关联状态为 2(已关联规则) 或 3(已生成线索) 的取证记录
-- 2. 规则 ID 来自 V6.0.0 种子数据 (MR-RUL-001 ~ MR-RUL-003)
-- ============================================================================
-- CW-ER-002(江南西路绝对化用语) → 关联规则: 绝对化用语监测
INSERT INTO OARMS.CW_EVIDENCE_RULE_RELATION (
ID, EVIDENCE_ID, RULE_ID, ASSOCIATED_BY, ASSOCIATED_AT
) VALUES (
'CW-ERR-001', 'CW-ER-002', 'MR-RUL-003', 'admin',
TO_TIMESTAMP('2026-05-25 08:50:00', 'YYYY-MM-DD HH24:MI:SS')
);
-- CW-ER-003(白云万达虚假宣传) → 关联规则: 虚假广告监测 + 医疗广告监测
INSERT INTO OARMS.CW_EVIDENCE_RULE_RELATION (
ID, EVIDENCE_ID, RULE_ID, ASSOCIATED_BY, ASSOCIATED_AT
) VALUES (
'CW-ERR-002', 'CW-ER-003', 'MR-RUL-001', 'admin',
TO_TIMESTAMP('2026-05-25 09:15:00', 'YYYY-MM-DD HH24:MI:SS')
);
INSERT INTO OARMS.CW_EVIDENCE_RULE_RELATION (
ID, EVIDENCE_ID, RULE_ID, ASSOCIATED_BY, ASSOCIATED_AT
) VALUES (
'CW-ERR-003', 'CW-ER-003', 'MR-RUL-002', 'admin',
TO_TIMESTAMP('2026-05-25 09:15:00', 'YYYY-MM-DD HH24:MI:SS')
);
-- CW-ER-004(天河路前一天) → 关联规则: 虚假广告监测
INSERT INTO OARMS.CW_EVIDENCE_RULE_RELATION (
ID, EVIDENCE_ID, RULE_ID, ASSOCIATED_BY, ASSOCIATED_AT
) VALUES (
'CW-ERR-004', 'CW-ER-004', 'MR-RUL-002', 'admin',
TO_TIMESTAMP('2026-05-24 08:00:00', 'YYYY-MM-DD HH24:MI:SS')
);

View File

@ -0,0 +1,74 @@
-- ============================================================================
-- OARMS - CW-3 监测线索管理 初始数据
-- Database: DM8 (达梦)
-- Schema: OARMS
-- Version: V9.0.1
-- Date: 2026-05-25
-- Description: 基于已生成线索(3)的取证记录生成的线索 + 生成日志
-- Note:
-- 1. 线索来源于 evidence_status=3 的取证记录
-- 2. related_rules/related_law_clauses 为 JSON 数组
-- 3. owner_unit/operator_unit 来自 bs_screen 种子数据
-- ============================================================================
-- CW-ER-003(白云万达虚假宣传) → 线索
INSERT INTO OARMS.CW_MONITORING_CLUE (
ID, CLUE_CODE, EVIDENCE_ID, SCREEN_ID, SCREEN_NAME, SCREEN_ADDRESS, DISTRICT,
OWNER_UNIT, OWNER_CONTACT, OPERATOR_UNIT, OPERATOR_CONTACT, ADVERTISER,
RELATED_RULES, RELATED_LAW_CLAUSES,
VIDEO_EVIDENCE_PATH, CLIP_START_TIME, CLIP_END_TIME, CLIP_DURATION,
CLUE_STATUS, GENERATED_BY, GENERATED_AT, TRANSFERRED_AT,
CREATE_BY, CREATE_TIME, CREATE_NAME, UPDATE_BY, UPDATE_TIME, UPDATE_NAME
) VALUES (
'CW-MC-001', 'XS-20260525-001', 'CW-ER-003', 'BS-SCR-005',
'白云大道白云万达广场LED大屏', '广州市白云区云城东路501号白云万达广场', '440111',
'白云区城市管理局', '020-87654321', '广州万达广告传媒有限公司', '020-87659999', '白云万达广场商户',
'[{"ruleId":"MR-RUL-001","ruleName":"医疗广告违法宣传监测"},{"ruleId":"MR-RUL-002","ruleName":"虚假广告监测"}]',
'[{"clauseId":"LC-GGFAL-001","clauseName":"《广告法》第四条"},{"clauseId":"LC-GGFAL-002","clauseName":"《广告法》第二十八条"}]',
'/evidence/2026-05-25/CW-ER-003.mp4', '08:55:00', '09:02:00', 420,
1, 'admin', TO_TIMESTAMP('2026-05-25 09:30:00', 'YYYY-MM-DD HH24:MI:SS'), NULL,
'system', TO_TIMESTAMP('2026-05-25 09:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统',
'system', TO_TIMESTAMP('2026-05-25 09:30:00', 'YYYY-MM-DD HH24:MI:SS'), '系统'
);
-- ===================== 线索生成日志 =====================
-- CW-MC-001 信息聚合
INSERT INTO OARMS.CW_CLUE_GENERATION_LOG (
ID, CLUE_ID, EVIDENCE_ID, OPERATION_TYPE, OPERATION_DETAIL, OPERATION_RESULT,
OPERATED_BY, OPERATED_AT
) VALUES (
'CW-CGL-001', 'CW-MC-001', 'CW-ER-003', 'INFO_AGGREGATE',
'聚合证据CW-ER-003的关联信息大屏信息、规则信息、法条信息', 'SUCCESS',
'admin', TO_TIMESTAMP('2026-05-25 09:28:00', 'YYYY-MM-DD HH24:MI:SS')
);
-- CW-MC-001 编码生成
INSERT INTO OARMS.CW_CLUE_GENERATION_LOG (
ID, CLUE_ID, EVIDENCE_ID, OPERATION_TYPE, OPERATION_DETAIL, OPERATION_RESULT,
OPERATED_BY, OPERATED_AT
) VALUES (
'CW-CGL-002', 'CW-MC-001', 'CW-ER-003', 'CODE_GENERATE',
'生成线索编码: XS-20260525-001', 'SUCCESS',
'admin', TO_TIMESTAMP('2026-05-25 09:29:00', 'YYYY-MM-DD HH24:MI:SS')
);
-- CW-MC-001 验证
INSERT INTO OARMS.CW_CLUE_GENERATION_LOG (
ID, CLUE_ID, EVIDENCE_ID, OPERATION_TYPE, OPERATION_DETAIL, OPERATION_RESULT,
OPERATED_BY, OPERATED_AT
) VALUES (
'CW-CGL-003', 'CW-MC-001', 'CW-ER-003', 'VALIDATE',
'校验线索数据完整性:必填字段齐全,关联数据有效', 'SUCCESS',
'admin', TO_TIMESTAMP('2026-05-25 09:29:30', 'YYYY-MM-DD HH24:MI:SS')
);
-- CW-MC-001 确认生成
INSERT INTO OARMS.CW_CLUE_GENERATION_LOG (
ID, CLUE_ID, EVIDENCE_ID, OPERATION_TYPE, OPERATION_DETAIL, OPERATION_RESULT,
OPERATED_BY, OPERATED_AT
) VALUES (
'CW-CGL-004', 'CW-MC-001', 'CW-ER-003', 'CONFIRM',
'确认生成监测线索XS-20260525-001', 'SUCCESS',
'admin', TO_TIMESTAMP('2026-05-25 09:30:00', 'YYYY-MM-DD HH24:MI:SS')
);

View File

@ -17,6 +17,8 @@ import com.chinaweal.youfool.prj.modules.evidence.clue.mapper.ClueGenerationLogM
import com.chinaweal.youfool.prj.modules.evidence.clue.mapper.MonitoringClueMapper; import com.chinaweal.youfool.prj.modules.evidence.clue.mapper.MonitoringClueMapper;
import com.chinaweal.youfool.prj.modules.evidence.clue.service.IMonitoringClueService; import com.chinaweal.youfool.prj.modules.evidence.clue.service.IMonitoringClueService;
import com.chinaweal.youfool.prj.modules.evidence.record.entity.EvidenceRecordEntity; import com.chinaweal.youfool.prj.modules.evidence.record.entity.EvidenceRecordEntity;
import com.chinaweal.youfool.prj.modules.system.entity.vo.LoginUserVO;
import com.chinaweal.youfool.prj.modules.system.util.DataScopeHelper;
import com.chinaweal.youfool.prj.modules.evidence.record.entity.EvidenceStatusHistoryEntity; import com.chinaweal.youfool.prj.modules.evidence.record.entity.EvidenceStatusHistoryEntity;
import com.chinaweal.youfool.prj.modules.evidence.record.mapper.EvidenceRecordMapper; import com.chinaweal.youfool.prj.modules.evidence.record.mapper.EvidenceRecordMapper;
import com.chinaweal.youfool.prj.modules.evidence.record.mapper.EvidenceStatusHistoryMapper; import com.chinaweal.youfool.prj.modules.evidence.record.mapper.EvidenceStatusHistoryMapper;
@ -73,6 +75,15 @@ public class MonitoringClueServiceImpl extends ServiceImpl<MonitoringClueMapper,
public RestResult<Page<MonitoringClueDetailVO>> queryList(MonitoringClueQuery query) { public RestResult<Page<MonitoringClueDetailVO>> queryList(MonitoringClueQuery query) {
Page<MonitoringClueEntity> page = new Page<>(query.getPageNum(), query.getPageSize()); Page<MonitoringClueEntity> page = new Page<>(query.getPageNum(), query.getPageSize());
LambdaQueryWrapper<MonitoringClueEntity> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<MonitoringClueEntity> wrapper = new LambdaQueryWrapper<>();
// 数据权限过滤
LoginUserVO currentUser = DataScopeHelper.getCurrentUser();
if (!DataScopeHelper.isCitySupervisor(currentUser)) {
if (DataScopeHelper.isDistrictSupervisor(currentUser)) {
wrapper.eq(MonitoringClueEntity::getDistrict, currentUser.getDistrictCode());
} else {
return RestResult.ok(new Page<>(query.getPageNum(), query.getPageSize(), 0));
}
}
// 线索编码精确查询 // 线索编码精确查询
if (StringUtils.isNotBlank(query.getClueCode())) { if (StringUtils.isNotBlank(query.getClueCode())) {
wrapper.eq(MonitoringClueEntity::getClueCode, query.getClueCode()); wrapper.eq(MonitoringClueEntity::getClueCode, query.getClueCode());

View File

@ -17,6 +17,8 @@ import com.chinaweal.youfool.prj.modules.evidence.record.mapper.EvidenceRecordMa
import com.chinaweal.youfool.prj.modules.evidence.record.mapper.EvidenceStatusHistoryMapper; import com.chinaweal.youfool.prj.modules.evidence.record.mapper.EvidenceStatusHistoryMapper;
import com.chinaweal.youfool.prj.modules.evidence.record.service.IEvidenceRecordService; import com.chinaweal.youfool.prj.modules.evidence.record.service.IEvidenceRecordService;
import com.chinaweal.youfool.prj.modules.screen.entity.ScreenEntity; import com.chinaweal.youfool.prj.modules.screen.entity.ScreenEntity;
import com.chinaweal.youfool.prj.modules.system.entity.vo.LoginUserVO;
import com.chinaweal.youfool.prj.modules.system.util.DataScopeHelper;
import com.chinaweal.youfool.prj.modules.screen.mapper.ScreenMapper; import com.chinaweal.youfool.prj.modules.screen.mapper.ScreenMapper;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -49,6 +51,15 @@ public class EvidenceRecordServiceImpl extends ServiceImpl<EvidenceRecordMapper,
public RestResult<Page<EvidenceRecordDetailVO>> queryList(EvidenceRecordQuery query) { public RestResult<Page<EvidenceRecordDetailVO>> queryList(EvidenceRecordQuery query) {
Page<EvidenceRecordEntity> page = new Page<>(query.getPageNum(), query.getPageSize()); Page<EvidenceRecordEntity> page = new Page<>(query.getPageNum(), query.getPageSize());
LambdaQueryWrapper<EvidenceRecordEntity> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<EvidenceRecordEntity> wrapper = new LambdaQueryWrapper<>();
// 数据权限过滤
LoginUserVO currentUser = DataScopeHelper.getCurrentUser();
if (!DataScopeHelper.isCitySupervisor(currentUser)) {
if (DataScopeHelper.isDistrictSupervisor(currentUser)) {
wrapper.eq(EvidenceRecordEntity::getDistrict, currentUser.getDistrictCode());
} else {
return RestResult.ok(new Page<>(query.getPageNum(), query.getPageSize(), 0));
}
}
// 所属区域筛选 // 所属区域筛选
if (StringUtils.isNotBlank(query.getDistrict())) { if (StringUtils.isNotBlank(query.getDistrict())) {
wrapper.eq(EvidenceRecordEntity::getDistrict, query.getDistrict()); wrapper.eq(EvidenceRecordEntity::getDistrict, query.getDistrict());

View File

@ -26,6 +26,8 @@ import com.chinaweal.youfool.prj.modules.evidence.transfer.entity.vo.PendingClue
import com.chinaweal.youfool.prj.modules.evidence.transfer.mapper.ClueTransferRecordMapper; import com.chinaweal.youfool.prj.modules.evidence.transfer.mapper.ClueTransferRecordMapper;
import com.chinaweal.youfool.prj.modules.evidence.transfer.mapper.TransferOperationLogMapper; import com.chinaweal.youfool.prj.modules.evidence.transfer.mapper.TransferOperationLogMapper;
import com.chinaweal.youfool.prj.modules.evidence.transfer.service.IClueTransferService; import com.chinaweal.youfool.prj.modules.evidence.transfer.service.IClueTransferService;
import com.chinaweal.youfool.prj.modules.system.entity.vo.LoginUserVO;
import com.chinaweal.youfool.prj.modules.system.util.DataScopeHelper;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
@ -58,6 +60,26 @@ public class ClueTransferServiceImpl extends ServiceImpl<ClueTransferRecordMappe
public RestResult<Page<ClueTransferDetailVO>> queryList(ClueTransferQuery query) { public RestResult<Page<ClueTransferDetailVO>> queryList(ClueTransferQuery query) {
Page<ClueTransferRecordEntity> page = new Page<>(query.getPageNum(), query.getPageSize()); Page<ClueTransferRecordEntity> page = new Page<>(query.getPageNum(), query.getPageSize());
LambdaQueryWrapper<ClueTransferRecordEntity> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ClueTransferRecordEntity> wrapper = new LambdaQueryWrapper<>();
// 数据权限过滤
LoginUserVO currentUser = DataScopeHelper.getCurrentUser();
if (!DataScopeHelper.isCitySupervisor(currentUser)) {
if (DataScopeHelper.isDistrictSupervisor(currentUser)) {
String districtCode = currentUser.getDistrictCode();
LambdaQueryWrapper<MonitoringClueEntity> clueWrapper = new LambdaQueryWrapper<>();
clueWrapper.eq(MonitoringClueEntity::getDistrict, districtCode);
clueWrapper.select(MonitoringClueEntity::getId);
List<String> districtClueIds = monitoringClueMapper.selectList(clueWrapper)
.stream().map(MonitoringClueEntity::getId).collect(Collectors.toList());
wrapper.and(w -> {
w.eq(ClueTransferRecordEntity::getTransferTargetDistrict, districtCode);
if (!districtClueIds.isEmpty()) {
w.or().in(ClueTransferRecordEntity::getClueId, districtClueIds);
}
});
} else {
return RestResult.ok(new Page<>(query.getPageNum(), query.getPageSize(), 0));
}
}
// 线索ID筛选 // 线索ID筛选
if (StringUtils.isNotBlank(query.getClueId())) { if (StringUtils.isNotBlank(query.getClueId())) {
wrapper.eq(ClueTransferRecordEntity::getClueId, query.getClueId()); wrapper.eq(ClueTransferRecordEntity::getClueId, query.getClueId());
@ -269,6 +291,15 @@ public class ClueTransferServiceImpl extends ServiceImpl<ClueTransferRecordMappe
Page<MonitoringClueEntity> page = new Page<>(query.getPageNum(), query.getPageSize()); Page<MonitoringClueEntity> page = new Page<>(query.getPageNum(), query.getPageSize());
LambdaQueryWrapper<MonitoringClueEntity> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<MonitoringClueEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(MonitoringClueEntity::getClueStatus, 1); wrapper.eq(MonitoringClueEntity::getClueStatus, 1);
// 数据权限过滤
LoginUserVO pendingUser = DataScopeHelper.getCurrentUser();
if (!DataScopeHelper.isCitySupervisor(pendingUser)) {
if (DataScopeHelper.isDistrictSupervisor(pendingUser)) {
wrapper.eq(MonitoringClueEntity::getDistrict, pendingUser.getDistrictCode());
} else {
return RestResult.ok(new Page<>(query.getPageNum(), query.getPageSize(), 0));
}
}
if (StringUtils.isNotBlank(query.getClueCode())) { if (StringUtils.isNotBlank(query.getClueCode())) {
wrapper.like(MonitoringClueEntity::getClueCode, query.getClueCode()); wrapper.like(MonitoringClueEntity::getClueCode, query.getClueCode());
} }

View File

@ -24,9 +24,9 @@ public class RecordingConfigQuery {
private Integer pageSize = 10; private Integer pageSize = 10;
/** /**
* 关键字大屏名称模糊查询 * 大屏名称模糊匹配
*/ */
private String keyword; private String screenName;
/** /**
* 行政区划 * 行政区划

View File

@ -14,11 +14,14 @@ import com.chinaweal.youfool.prj.modules.monitor.config.mapper.RecordingConfigMa
import com.chinaweal.youfool.prj.modules.monitor.config.service.IRecordingConfigService; import com.chinaweal.youfool.prj.modules.monitor.config.service.IRecordingConfigService;
import com.chinaweal.youfool.prj.modules.screen.entity.ScreenEntity; import com.chinaweal.youfool.prj.modules.screen.entity.ScreenEntity;
import com.chinaweal.youfool.prj.modules.screen.mapper.ScreenMapper; import com.chinaweal.youfool.prj.modules.screen.mapper.ScreenMapper;
import com.chinaweal.youfool.prj.modules.system.entity.vo.LoginUserVO;
import com.chinaweal.youfool.prj.modules.system.util.DataScopeHelper;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -41,9 +44,28 @@ public class RecordingConfigServiceImpl extends ServiceImpl<RecordingConfigMappe
public RestResult<Page<RecordingConfigEntity>> queryList(RecordingConfigQuery query) { public RestResult<Page<RecordingConfigEntity>> queryList(RecordingConfigQuery query) {
Page<RecordingConfigEntity> page = new Page<>(query.getPageNum(), query.getPageSize()); Page<RecordingConfigEntity> page = new Page<>(query.getPageNum(), query.getPageSize());
LambdaQueryWrapper<RecordingConfigEntity> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<RecordingConfigEntity> wrapper = new LambdaQueryWrapper<>();
// 关键字模糊查询(大屏名称) // 数据权限过滤
if (StringUtils.isNotBlank(query.getKeyword())) { LoginUserVO currentUser = DataScopeHelper.getCurrentUser();
wrapper.like(RecordingConfigEntity::getScreenName, query.getKeyword()); if (!DataScopeHelper.isCitySupervisor(currentUser)) {
if (DataScopeHelper.isDistrictSupervisor(currentUser)) {
wrapper.eq(RecordingConfigEntity::getDistrict, currentUser.getDistrictCode());
} else if (DataScopeHelper.isOperator(currentUser)) {
LambdaQueryWrapper<ScreenEntity> screenWrapper = new LambdaQueryWrapper<>();
screenWrapper.eq(ScreenEntity::getOperatorUnit, currentUser.getOrgName());
screenWrapper.select(ScreenEntity::getId);
List<String> screenIds = screenMapper.selectList(screenWrapper).stream()
.map(ScreenEntity::getId).collect(Collectors.toList());
if (screenIds.isEmpty()) {
return RestResult.ok(new Page<>(query.getPageNum(), query.getPageSize(), 0));
}
wrapper.in(RecordingConfigEntity::getScreenId, screenIds);
} else {
return RestResult.ok(new Page<>(query.getPageNum(), query.getPageSize(), 0));
}
}
// 大屏名称模糊查询
if (StringUtils.isNotBlank(query.getScreenName())) {
wrapper.like(RecordingConfigEntity::getScreenName, query.getScreenName());
} }
// 行政区划精确筛选 // 行政区划精确筛选
if (StringUtils.isNotBlank(query.getDistrict())) { if (StringUtils.isNotBlank(query.getDistrict())) {
@ -187,6 +209,17 @@ public class RecordingConfigServiceImpl extends ServiceImpl<RecordingConfigMappe
public RestResult<List<Map<String, Object>>> getConfigurableScreens() { public RestResult<List<Map<String, Object>>> getConfigurableScreens() {
// 查询所有大屏 // 查询所有大屏
LambdaQueryWrapper<ScreenEntity> screenWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ScreenEntity> screenWrapper = new LambdaQueryWrapper<>();
// 数据权限过滤
LoginUserVO cfgUser = DataScopeHelper.getCurrentUser();
if (!DataScopeHelper.isCitySupervisor(cfgUser)) {
if (DataScopeHelper.isDistrictSupervisor(cfgUser)) {
screenWrapper.eq(ScreenEntity::getDistrict, cfgUser.getDistrictCode());
} else if (DataScopeHelper.isOperator(cfgUser)) {
screenWrapper.eq(ScreenEntity::getOperatorUnit, cfgUser.getOrgName());
} else {
return RestResult.ok(new ArrayList<>());
}
}
screenWrapper.select(ScreenEntity::getId, ScreenEntity::getScreenName, ScreenEntity::getScreenCode, ScreenEntity::getAddress, ScreenEntity::getDistrict); screenWrapper.select(ScreenEntity::getId, ScreenEntity::getScreenName, ScreenEntity::getScreenCode, ScreenEntity::getAddress, ScreenEntity::getDistrict);
screenWrapper.eq(ScreenEntity::getScreenStatus, 1); screenWrapper.eq(ScreenEntity::getScreenStatus, 1);
screenWrapper.orderByAsc(ScreenEntity::getScreenCode); screenWrapper.orderByAsc(ScreenEntity::getScreenCode);

View File

@ -14,6 +14,8 @@ import com.chinaweal.youfool.prj.modules.monitor.record.entity.query.MonitorReco
import com.chinaweal.youfool.prj.modules.monitor.record.entity.req.MonitorJudgeReq; import com.chinaweal.youfool.prj.modules.monitor.record.entity.req.MonitorJudgeReq;
import com.chinaweal.youfool.prj.modules.monitor.record.mapper.MonitorRecordMapper; import com.chinaweal.youfool.prj.modules.monitor.record.mapper.MonitorRecordMapper;
import com.chinaweal.youfool.prj.modules.monitor.record.service.IMonitorRecordService; import com.chinaweal.youfool.prj.modules.monitor.record.service.IMonitorRecordService;
import com.chinaweal.youfool.prj.modules.system.entity.vo.LoginUserVO;
import com.chinaweal.youfool.prj.modules.system.util.DataScopeHelper;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -40,6 +42,15 @@ public class MonitorRecordServiceImpl extends ServiceImpl<MonitorRecordMapper, M
public RestResult<Page<MonitorRecordEntity>> queryList(MonitorRecordQuery query) { public RestResult<Page<MonitorRecordEntity>> queryList(MonitorRecordQuery query) {
Page<MonitorRecordEntity> page = new Page<>(query.getPageNum(), query.getPageSize()); Page<MonitorRecordEntity> page = new Page<>(query.getPageNum(), query.getPageSize());
LambdaQueryWrapper<MonitorRecordEntity> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<MonitorRecordEntity> wrapper = new LambdaQueryWrapper<>();
// 数据权限过滤
LoginUserVO currentUser = DataScopeHelper.getCurrentUser();
if (!DataScopeHelper.isCitySupervisor(currentUser)) {
if (DataScopeHelper.isDistrictSupervisor(currentUser)) {
wrapper.eq(MonitorRecordEntity::getDistrict, currentUser.getDistrictCode());
} else {
return RestResult.ok(new Page<>(query.getPageNum(), query.getPageSize(), 0));
}
}
// 大屏ID精确筛选 // 大屏ID精确筛选
if (StringUtils.isNotBlank(query.getScreenId())) { if (StringUtils.isNotBlank(query.getScreenId())) {
wrapper.eq(MonitorRecordEntity::getScreenId, query.getScreenId()); wrapper.eq(MonitorRecordEntity::getScreenId, query.getScreenId());

View File

@ -2,8 +2,8 @@ package com.chinaweal.youfool.prj.modules.monitor.task.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chinaweal.youfool.framework.springboot.rest.RestResult; import com.chinaweal.youfool.framework.springboot.rest.RestResult;
import com.chinaweal.youfool.prj.modules.monitor.task.entity.RecordingTaskEntity;
import com.chinaweal.youfool.prj.modules.monitor.task.entity.query.RecordingTaskQuery; import com.chinaweal.youfool.prj.modules.monitor.task.entity.query.RecordingTaskQuery;
import com.chinaweal.youfool.prj.modules.monitor.task.entity.vo.RecordingTaskVO;
import com.chinaweal.youfool.prj.modules.monitor.task.service.IRecordingTaskService; import com.chinaweal.youfool.prj.modules.monitor.task.service.IRecordingTaskService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
@ -40,7 +40,7 @@ public class RecordingTaskController {
*/ */
@PostMapping("query") @PostMapping("query")
@Operation(summary = "分页查询录屏任务列表") @Operation(summary = "分页查询录屏任务列表")
public RestResult<Page<RecordingTaskEntity>> queryList(@RequestBody RecordingTaskQuery query) { public RestResult<Page<RecordingTaskVO>> queryList(@RequestBody RecordingTaskQuery query) {
log.info("[OK] 分页查询录屏任务列表: pageNum={}, pageSize={}", query.getPageNum(), query.getPageSize()); log.info("[OK] 分页查询录屏任务列表: pageNum={}, pageSize={}", query.getPageNum(), query.getPageSize());
return recordingTaskService.queryList(query); return recordingTaskService.queryList(query);
} }

View File

@ -0,0 +1,47 @@
package com.chinaweal.youfool.prj.modules.monitor.task.entity.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.chinaweal.youfool.framework.springboot.common.util.DateUtil;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* 录屏任务列表 VO含大屏关联信息
*
* @author chenjy
* @since 2026/05/25
*/
@Data
@Accessors(chain = true)
public class RecordingTaskVO {
private String id;
private String screenId;
private String configId;
@JsonFormat(pattern = DateUtil.DATETIME_DEFAULT_FORMAT, timezone = "GMT+8")
private Date actualStartTime;
@JsonFormat(pattern = DateUtil.DATETIME_DEFAULT_FORMAT, timezone = "GMT+8")
private Date actualEndTime;
private Integer taskStatus;
private String videoFilePath;
private Integer retryCount;
private String errorMessage;
// ===== 大屏关联字段(来自 bs_screen =====
private String screenName;
private String screenAddress;
private String district;
}

View File

@ -2,8 +2,8 @@ package com.chinaweal.youfool.prj.modules.monitor.task.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chinaweal.youfool.framework.springboot.rest.RestResult; import com.chinaweal.youfool.framework.springboot.rest.RestResult;
import com.chinaweal.youfool.prj.modules.monitor.task.entity.RecordingTaskEntity;
import com.chinaweal.youfool.prj.modules.monitor.task.entity.query.RecordingTaskQuery; import com.chinaweal.youfool.prj.modules.monitor.task.entity.query.RecordingTaskQuery;
import com.chinaweal.youfool.prj.modules.monitor.task.entity.vo.RecordingTaskVO;
import java.util.Map; import java.util.Map;
@ -16,12 +16,12 @@ import java.util.Map;
public interface IRecordingTaskService { public interface IRecordingTaskService {
/** /**
* 分页查询录屏任务列表 * 分页查询录屏任务列表含大屏关联信息
* *
* @param query 查询条件 * @param query 查询条件
* @return 分页结果 * @return 分页结果
*/ */
RestResult<Page<RecordingTaskEntity>> queryList(RecordingTaskQuery query); RestResult<Page<RecordingTaskVO>> queryList(RecordingTaskQuery query);
/** /**
* 获取录屏任务详情含关联告警通知列表 * 获取录屏任务详情含关联告警通知列表

View File

@ -9,11 +9,14 @@ import com.chinaweal.youfool.framework.springboot.rest.RestResult;
import com.chinaweal.youfool.prj.modules.monitor.task.entity.AlertNotificationEntity; import com.chinaweal.youfool.prj.modules.monitor.task.entity.AlertNotificationEntity;
import com.chinaweal.youfool.prj.modules.monitor.task.entity.RecordingTaskEntity; import com.chinaweal.youfool.prj.modules.monitor.task.entity.RecordingTaskEntity;
import com.chinaweal.youfool.prj.modules.monitor.task.entity.query.RecordingTaskQuery; import com.chinaweal.youfool.prj.modules.monitor.task.entity.query.RecordingTaskQuery;
import com.chinaweal.youfool.prj.modules.monitor.task.entity.vo.RecordingTaskVO;
import com.chinaweal.youfool.prj.modules.monitor.task.mapper.AlertNotificationMapper; import com.chinaweal.youfool.prj.modules.monitor.task.mapper.AlertNotificationMapper;
import com.chinaweal.youfool.prj.modules.monitor.task.mapper.RecordingTaskMapper; import com.chinaweal.youfool.prj.modules.monitor.task.mapper.RecordingTaskMapper;
import com.chinaweal.youfool.prj.modules.monitor.task.service.IRecordingTaskService; import com.chinaweal.youfool.prj.modules.monitor.task.service.IRecordingTaskService;
import com.chinaweal.youfool.prj.modules.screen.entity.ScreenEntity; import com.chinaweal.youfool.prj.modules.screen.entity.ScreenEntity;
import com.chinaweal.youfool.prj.modules.screen.mapper.ScreenMapper; import com.chinaweal.youfool.prj.modules.screen.mapper.ScreenMapper;
import com.chinaweal.youfool.prj.modules.system.entity.vo.LoginUserVO;
import com.chinaweal.youfool.prj.modules.system.util.DataScopeHelper;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -21,10 +24,10 @@ import org.springframework.stereotype.Service;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -42,7 +45,7 @@ public class RecordingTaskServiceImpl extends ServiceImpl<RecordingTaskMapper, R
private final ScreenMapper screenMapper; private final ScreenMapper screenMapper;
@Override @Override
public RestResult<Page<RecordingTaskEntity>> queryList(RecordingTaskQuery query) { public RestResult<Page<RecordingTaskVO>> queryList(RecordingTaskQuery query) {
Page<RecordingTaskEntity> page = new Page<>(query.getPageNum(), query.getPageSize()); Page<RecordingTaskEntity> page = new Page<>(query.getPageNum(), query.getPageSize());
LambdaQueryWrapper<RecordingTaskEntity> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<RecordingTaskEntity> wrapper = new LambdaQueryWrapper<>();
// 大屏ID精确筛选 // 大屏ID精确筛选
@ -53,6 +56,25 @@ public class RecordingTaskServiceImpl extends ServiceImpl<RecordingTaskMapper, R
if (query.getTaskStatus() != null) { if (query.getTaskStatus() != null) {
wrapper.eq(RecordingTaskEntity::getTaskStatus, query.getTaskStatus()); wrapper.eq(RecordingTaskEntity::getTaskStatus, query.getTaskStatus());
} }
// 数据权限过滤
LoginUserVO currentUser = DataScopeHelper.getCurrentUser();
if (!DataScopeHelper.isCitySupervisor(currentUser)) {
if (DataScopeHelper.isDistrictSupervisor(currentUser)) {
query.setDistrict(currentUser.getDistrictCode());
} else if (DataScopeHelper.isOperator(currentUser)) {
LambdaQueryWrapper<ScreenEntity> opScreenWrapper = new LambdaQueryWrapper<>();
opScreenWrapper.eq(ScreenEntity::getOperatorUnit, currentUser.getOrgName());
opScreenWrapper.select(ScreenEntity::getId);
List<String> opScreenIds = screenMapper.selectList(opScreenWrapper).stream()
.map(ScreenEntity::getId).collect(Collectors.toList());
if (opScreenIds.isEmpty()) {
return RestResult.ok(new Page<>(query.getPageNum(), query.getPageSize(), 0));
}
wrapper.in(RecordingTaskEntity::getScreenId, opScreenIds);
} else {
return RestResult.ok(new Page<>(query.getPageNum(), query.getPageSize(), 0));
}
}
// 行政区划/大屏名称 → 通过bs_screen两步查询 // 行政区划/大屏名称 → 通过bs_screen两步查询
if (StringUtils.isNotBlank(query.getDistrict()) || StringUtils.isNotBlank(query.getScreenName())) { if (StringUtils.isNotBlank(query.getDistrict()) || StringUtils.isNotBlank(query.getScreenName())) {
LambdaQueryWrapper<ScreenEntity> screenWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ScreenEntity> screenWrapper = new LambdaQueryWrapper<>();
@ -66,7 +88,6 @@ public class RecordingTaskServiceImpl extends ServiceImpl<RecordingTaskMapper, R
List<String> screenIds = screens.stream() List<String> screenIds = screens.stream()
.map(ScreenEntity::getId).collect(Collectors.toList()); .map(ScreenEntity::getId).collect(Collectors.toList());
if (screenIds.isEmpty()) { if (screenIds.isEmpty()) {
// 无匹配大屏,返回空结果
return RestResult.ok(new Page<>(query.getPageNum(), query.getPageSize(), 0)); return RestResult.ok(new Page<>(query.getPageNum(), query.getPageSize(), 0));
} }
wrapper.in(RecordingTaskEntity::getScreenId, screenIds); wrapper.in(RecordingTaskEntity::getScreenId, screenIds);
@ -90,7 +111,36 @@ public class RecordingTaskServiceImpl extends ServiceImpl<RecordingTaskMapper, R
} }
wrapper.orderByDesc(RecordingTaskEntity::getCreateTime); wrapper.orderByDesc(RecordingTaskEntity::getCreateTime);
Page<RecordingTaskEntity> entityPage = this.page(page, wrapper); Page<RecordingTaskEntity> entityPage = this.page(page, wrapper);
return RestResult.ok(entityPage);
// 转换为 VO 并补充大屏关联信息
Page<RecordingTaskVO> voPage = new Page<>(entityPage.getCurrent(), entityPage.getSize(), entityPage.getTotal());
if (!entityPage.getRecords().isEmpty()) {
Set<String> screenIds = entityPage.getRecords().stream()
.map(RecordingTaskEntity::getScreenId)
.collect(Collectors.toSet());
Map<String, ScreenEntity> screenMap = screenMapper.selectBatchIds(screenIds).stream()
.collect(Collectors.toMap(ScreenEntity::getId, s -> s, (a, b) -> a));
voPage.setRecords(entityPage.getRecords().stream().map(entity -> {
RecordingTaskVO vo = new RecordingTaskVO();
vo.setId(entity.getId())
.setScreenId(entity.getScreenId())
.setConfigId(entity.getConfigId())
.setActualStartTime(entity.getActualStartTime())
.setActualEndTime(entity.getActualEndTime())
.setTaskStatus(entity.getTaskStatus())
.setVideoFilePath(entity.getVideoFilePath())
.setRetryCount(entity.getRetryCount())
.setErrorMessage(entity.getErrorMessage());
ScreenEntity screen = screenMap.get(entity.getScreenId());
if (screen != null) {
vo.setScreenName(screen.getScreenName())
.setScreenAddress(screen.getAddress())
.setDistrict(screen.getDistrict());
}
return vo;
}).collect(Collectors.toList()));
}
return RestResult.ok(voPage);
} }
@Override @Override
@ -113,6 +163,14 @@ public class RecordingTaskServiceImpl extends ServiceImpl<RecordingTaskMapper, R
detail.put("retryCount", taskEntity.getRetryCount()); detail.put("retryCount", taskEntity.getRetryCount());
detail.put("errorMessage", taskEntity.getErrorMessage()); detail.put("errorMessage", taskEntity.getErrorMessage());
// 补充大屏关联信息
ScreenEntity screen = screenMapper.selectById(taskEntity.getScreenId());
if (screen != null) {
detail.put("screenName", screen.getScreenName());
detail.put("screenAddress", screen.getAddress());
detail.put("district", screen.getDistrict());
}
// 查询关联告警通知列表 // 查询关联告警通知列表
LambdaQueryWrapper<AlertNotificationEntity> alertWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<AlertNotificationEntity> alertWrapper = new LambdaQueryWrapper<>();
alertWrapper.eq(AlertNotificationEntity::getTaskId, id); alertWrapper.eq(AlertNotificationEntity::getTaskId, id);

View File

@ -24,9 +24,19 @@ public class ScreenQuery {
private Integer pageSize = 10; private Integer pageSize = 10;
/** /**
* 关键字大屏名称/编码模糊查询 * 大屏名称模糊匹配
*/ */
private String keyword; private String screenName;
/**
* 大屏编码精确匹配
*/
private String screenCode;
/**
* 业主单位模糊匹配
*/
private String ownerUnit;
/** /**
* 行政区划 * 行政区划

View File

@ -15,6 +15,8 @@ import com.chinaweal.youfool.prj.modules.screen.entity.req.ScreenSaveReq;
import com.chinaweal.youfool.prj.modules.screen.entity.vo.ScreenDetailVO; import com.chinaweal.youfool.prj.modules.screen.entity.vo.ScreenDetailVO;
import com.chinaweal.youfool.prj.modules.screen.mapper.ScreenMapper; import com.chinaweal.youfool.prj.modules.screen.mapper.ScreenMapper;
import com.chinaweal.youfool.prj.modules.screen.service.IScreenService; import com.chinaweal.youfool.prj.modules.screen.service.IScreenService;
import com.chinaweal.youfool.prj.modules.system.entity.vo.LoginUserVO;
import com.chinaweal.youfool.prj.modules.system.util.DataScopeHelper;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
@ -45,13 +47,28 @@ public class ScreenServiceImpl extends ServiceImpl<ScreenMapper, ScreenEntity> i
public RestResult<Page<ScreenDetailVO>> queryList(ScreenQuery query) { public RestResult<Page<ScreenDetailVO>> queryList(ScreenQuery query) {
Page<ScreenEntity> page = new Page<>(query.getPageNum(), query.getPageSize()); Page<ScreenEntity> page = new Page<>(query.getPageNum(), query.getPageSize());
LambdaQueryWrapper<ScreenEntity> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ScreenEntity> wrapper = new LambdaQueryWrapper<>();
// 关键字模糊查询(大屏名称或编码) // 数据权限过滤
if (StringUtils.isNotBlank(query.getKeyword())) { LoginUserVO currentUser = DataScopeHelper.getCurrentUser();
wrapper.and(w -> w if (!DataScopeHelper.isCitySupervisor(currentUser)) {
.like(ScreenEntity::getScreenName, query.getKeyword()) if (DataScopeHelper.isDistrictSupervisor(currentUser)) {
.or() wrapper.eq(ScreenEntity::getDistrict, currentUser.getDistrictCode());
.like(ScreenEntity::getScreenCode, query.getKeyword()) } else if (DataScopeHelper.isOperator(currentUser)) {
); wrapper.eq(ScreenEntity::getOperatorUnit, currentUser.getOrgName());
} else {
return RestResult.ok(new Page<>(query.getPageNum(), query.getPageSize(), 0));
}
}
// 大屏名称模糊查询
if (StringUtils.isNotBlank(query.getScreenName())) {
wrapper.like(ScreenEntity::getScreenName, query.getScreenName());
}
// 大屏编码精确查询
if (StringUtils.isNotBlank(query.getScreenCode())) {
wrapper.eq(ScreenEntity::getScreenCode, query.getScreenCode());
}
// 业主单位模糊查询
if (StringUtils.isNotBlank(query.getOwnerUnit())) {
wrapper.like(ScreenEntity::getOwnerUnit, query.getOwnerUnit());
} }
// 行政区划精确筛选 // 行政区划精确筛选
if (StringUtils.isNotBlank(query.getDistrict())) { if (StringUtils.isNotBlank(query.getDistrict())) {
@ -161,6 +178,17 @@ public class ScreenServiceImpl extends ServiceImpl<ScreenMapper, ScreenEntity> i
@Override @Override
public RestResult<List<Map<String, Object>>> getScreenOptions() { public RestResult<List<Map<String, Object>>> getScreenOptions() {
LambdaQueryWrapper<ScreenEntity> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ScreenEntity> wrapper = new LambdaQueryWrapper<>();
// 数据权限过滤
LoginUserVO optionUser = DataScopeHelper.getCurrentUser();
if (!DataScopeHelper.isCitySupervisor(optionUser)) {
if (DataScopeHelper.isDistrictSupervisor(optionUser)) {
wrapper.eq(ScreenEntity::getDistrict, optionUser.getDistrictCode());
} else if (DataScopeHelper.isOperator(optionUser)) {
wrapper.eq(ScreenEntity::getOperatorUnit, optionUser.getOrgName());
} else {
return RestResult.ok(new ArrayList<>());
}
}
wrapper.select(ScreenEntity::getId, ScreenEntity::getScreenName, ScreenEntity::getScreenCode); wrapper.select(ScreenEntity::getId, ScreenEntity::getScreenName, ScreenEntity::getScreenCode);
wrapper.orderByAsc(ScreenEntity::getScreenCode); wrapper.orderByAsc(ScreenEntity::getScreenCode);
List<ScreenEntity> list = this.list(wrapper); List<ScreenEntity> list = this.list(wrapper);
@ -217,9 +245,25 @@ public class ScreenServiceImpl extends ServiceImpl<ScreenMapper, ScreenEntity> i
@Override @Override
public RestResult<List<Map<String, Object>>> exportData(ScreenQuery query) { public RestResult<List<Map<String, Object>>> exportData(ScreenQuery query) {
LambdaQueryWrapper<ScreenEntity> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ScreenEntity> wrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotBlank(query.getKeyword())) { // 数据权限过滤
wrapper.and(w -> w.like(ScreenEntity::getScreenName, query.getKeyword()) LoginUserVO exportUser = DataScopeHelper.getCurrentUser();
.or().like(ScreenEntity::getScreenCode, query.getKeyword())); if (!DataScopeHelper.isCitySupervisor(exportUser)) {
if (DataScopeHelper.isDistrictSupervisor(exportUser)) {
wrapper.eq(ScreenEntity::getDistrict, exportUser.getDistrictCode());
} else if (DataScopeHelper.isOperator(exportUser)) {
wrapper.eq(ScreenEntity::getOperatorUnit, exportUser.getOrgName());
} else {
return RestResult.ok(new ArrayList<>());
}
}
if (StringUtils.isNotBlank(query.getScreenName())) {
wrapper.like(ScreenEntity::getScreenName, query.getScreenName());
}
if (StringUtils.isNotBlank(query.getScreenCode())) {
wrapper.eq(ScreenEntity::getScreenCode, query.getScreenCode());
}
if (StringUtils.isNotBlank(query.getOwnerUnit())) {
wrapper.like(ScreenEntity::getOwnerUnit, query.getOwnerUnit());
} }
if (StringUtils.isNotBlank(query.getDistrict())) { if (StringUtils.isNotBlank(query.getDistrict())) {
wrapper.eq(ScreenEntity::getDistrict, query.getDistrict()); wrapper.eq(ScreenEntity::getDistrict, query.getDistrict());

View File

@ -0,0 +1,50 @@
package com.chinaweal.youfool.prj.modules.system.util;
import cn.dev33.satoken.stp.StpUtil;
import com.chinaweal.youfool.prj.common.constants.SessionConstants;
import com.chinaweal.youfool.prj.modules.system.entity.vo.LoginUserVO;
/**
* 数据权限工具类
*
* @author chenjy
* @since 2026/05/25
*/
public final class DataScopeHelper {
private static final String ROLE_CITY = "CITY_SUPERVISOR";
private static final String ROLE_DISTRICT = "DISTRICT_SUPERVISOR";
private static final String ROLE_OPERATOR = "OPERATOR";
private DataScopeHelper() {
}
public static LoginUserVO getCurrentUser() {
try {
return StpUtil.getSession().getModel(SessionConstants.USER_KEY, LoginUserVO.class);
} catch (Exception e) {
return null;
}
}
public static boolean isCitySupervisor(LoginUserVO user) {
return hasRole(user, ROLE_CITY);
}
public static boolean isDistrictSupervisor(LoginUserVO user) {
return hasRole(user, ROLE_DISTRICT);
}
public static boolean isOperator(LoginUserVO user) {
return hasRole(user, ROLE_OPERATOR);
}
private static boolean hasRole(LoginUserVO user, String roleCode) {
if (user == null || user.getRoles() == null) {
return false;
}
return user.getRoles().contains(roleCode);
}
}

View File

@ -267,6 +267,23 @@ public RestResult<?> remove(...) { ... }
**注意**:数据权限需要修改现有 10 个模块的 Service 查询方法,影响范围较大。**建议先实现 Phase 1-3 的认证和操作权限Phase 4 数据权限单独迭代。** **注意**:数据权限需要修改现有 10 个模块的 Service 查询方法,影响范围较大。**建议先实现 Phase 1-3 的认证和操作权限Phase 4 数据权限单独迭代。**
**实际实施**
- 创建 `DataScopeHelper` 工具类(`modules/system/util/`),提供角色判断静态方法
- 修改 7 个 Service 的 queryList 方法,添加数据权限过滤:
- ScreenServiceImpl: queryList + exportData + getScreenOptions
- RecordingConfigServiceImpl: queryList + getConfigurableScreens
- RecordingTaskServiceImpl: queryList
- MonitorRecordServiceImpl: queryList
- EvidenceRecordServiceImpl: queryList
- MonitoringClueServiceImpl: queryList
- ClueTransferServiceImpl: queryList + queryPendingClues
- 过滤规则:
- CITY_SUPERVISOR: 不过滤(全市数据)
- DISTRICT_SUPERVISOR: 按 `district = currentUser.districtCode` 过滤
- OPERATOR: Screen 按 `operatorUnit = orgName`,其他模块通过 screenId 关联 Screen 过滤
- ClueTransferServiceImpl 特殊处理OR 条件(转办目标辖区 + 线索来源辖区)
- 跳过模块LawClauseServiceImpl无区域字段、MonitoringRuleServiceImpl复杂 scope JSON、EvidenceRuleRelationServiceImpl关联表
**状态**: ✅ 完成 **状态**: ✅ 完成
--- ---