From 0f643376c0b239b391fc60e2b9a794f9c648f605 Mon Sep 17 00:00:00 2001 From: chenjy Date: Tue, 26 May 2026 09:51:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=20+=20=E5=A4=9A=E6=A8=A1=E5=9D=97=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=A2=9E=E5=BC=BA=20+=20=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 DataScopeHelper 工具类,实现基于用户角色的数据权限过滤 - AM/CW/BS 三域 Service 集成数据权限,按区划/机构过滤查询结果 - RecordingTaskVO 新增录屏任务视图对象 - ScreenQuery/RecordingConfigQuery 支持多条件组合查询 - 补充 AM(录屏设置/任务/画面监控) + CW(取证/规则关联/线索) 初始化 SQL - 修正系统初始用户 BCrypt hash Co-Authored-By: Claude Opus 4.7 --- docs/db/sql/V11.0.0__SYS_system_init_data.sql | 9 +- .../V3.0.1__AM_recording_config_init_data.sql | 116 +++++++++ .../V4.0.1__AM_recording_task_init_data.sql | 243 ++++++++++++++++++ .../V5.0.1__AM_monitor_record_init_data.sql | 180 +++++++++++++ docs/db/sql/V7.0.1__CW_evidence_init_data.sql | 130 ++++++++++ ...1__CW_evidence_rule_relation_init_data.sql | 42 +++ .../V9.0.1__CW_monitoring_clue_init_data.sql | 74 ++++++ .../impl/MonitoringClueServiceImpl.java | 11 + .../impl/EvidenceRecordServiceImpl.java | 11 + .../service/impl/ClueTransferServiceImpl.java | 31 +++ .../entity/query/RecordingConfigQuery.java | 4 +- .../impl/RecordingConfigServiceImpl.java | 39 ++- .../impl/MonitorRecordServiceImpl.java | 11 + .../controller/RecordingTaskController.java | 4 +- .../task/entity/vo/RecordingTaskVO.java | 47 ++++ .../task/service/IRecordingTaskService.java | 6 +- .../impl/RecordingTaskServiceImpl.java | 66 ++++- .../screen/entity/query/ScreenQuery.java | 14 +- .../service/impl/ScreenServiceImpl.java | 64 ++++- .../modules/system/util/DataScopeHelper.java | 50 ++++ task_plan.md | 17 ++ 21 files changed, 1139 insertions(+), 30 deletions(-) create mode 100644 docs/db/sql/V3.0.1__AM_recording_config_init_data.sql create mode 100644 docs/db/sql/V4.0.1__AM_recording_task_init_data.sql create mode 100644 docs/db/sql/V5.0.1__AM_monitor_record_init_data.sql create mode 100644 docs/db/sql/V7.0.1__CW_evidence_init_data.sql create mode 100644 docs/db/sql/V8.0.1__CW_evidence_rule_relation_init_data.sql create mode 100644 docs/db/sql/V9.0.1__CW_monitoring_clue_init_data.sql create mode 100644 src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/entity/vo/RecordingTaskVO.java create mode 100644 src/main/java/com/chinaweal/youfool/prj/modules/system/util/DataScopeHelper.java diff --git a/docs/db/sql/V11.0.0__SYS_system_init_data.sql b/docs/db/sql/V11.0.0__SYS_system_init_data.sql index f83ce7b..f2bb3b1 100644 --- a/docs/db/sql/V11.0.0__SYS_system_init_data.sql +++ b/docs/db/sql/V11.0.0__SYS_system_init_data.sql @@ -124,13 +124,14 @@ INSERT INTO OARMS.SYS_ROLE_PERMISSION (id, role_id, perm_id, create_by, create_t -- ---------------------------------------------------------------------------- -- 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 -('user_city_admin', 'city_admin', '$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy', '市局管理员', '13800000001', '广州市市场监督管理局', NULL, 1, 'system', CURRENT_TIMESTAMP, '系统'), -('user_district_admin', 'district_admin', '$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy', '天河区管理员', '13800000002', '广州市天河区市场监督管理局', '440106', 1, 'system', CURRENT_TIMESTAMP, '系统'), -('user_operator', 'operator', '$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy', '运营商管理员', '13800000003', '广州文化传媒有限公司', '440106', 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$h4yKk0mn.Uad15AOE9IFwuSDC9XeuNxqZkrZ.Y2YLuk9KurltER1i', '天河区管理员', '13800000002', '广州市天河区市场监督管理局', '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 diff --git a/docs/db/sql/V3.0.1__AM_recording_config_init_data.sql b/docs/db/sql/V3.0.1__AM_recording_config_init_data.sql new file mode 100644 index 0000000..24ca208 --- /dev/null +++ b/docs/db/sql/V3.0.1__AM_recording_config_init_data.sql @@ -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'), '系统管理员' +); diff --git a/docs/db/sql/V4.0.1__AM_recording_task_init_data.sql b/docs/db/sql/V4.0.1__AM_recording_task_init_data.sql new file mode 100644 index 0000000..aaa0a7a --- /dev/null +++ b/docs/db/sql/V4.0.1__AM_recording_task_init_data.sql @@ -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'), '系统' +); diff --git a/docs/db/sql/V5.0.1__AM_monitor_record_init_data.sql b/docs/db/sql/V5.0.1__AM_monitor_record_init_data.sql new file mode 100644 index 0000000..568c74f --- /dev/null +++ b/docs/db/sql/V5.0.1__AM_monitor_record_init_data.sql @@ -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'), '赵六' +); diff --git a/docs/db/sql/V7.0.1__CW_evidence_init_data.sql b/docs/db/sql/V7.0.1__CW_evidence_init_data.sql new file mode 100644 index 0000000..a77fe83 --- /dev/null +++ b/docs/db/sql/V7.0.1__CW_evidence_init_data.sql @@ -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' +); diff --git a/docs/db/sql/V8.0.1__CW_evidence_rule_relation_init_data.sql b/docs/db/sql/V8.0.1__CW_evidence_rule_relation_init_data.sql new file mode 100644 index 0000000..0723cd8 --- /dev/null +++ b/docs/db/sql/V8.0.1__CW_evidence_rule_relation_init_data.sql @@ -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') +); diff --git a/docs/db/sql/V9.0.1__CW_monitoring_clue_init_data.sql b/docs/db/sql/V9.0.1__CW_monitoring_clue_init_data.sql new file mode 100644 index 0000000..9a7143b --- /dev/null +++ b/docs/db/sql/V9.0.1__CW_monitoring_clue_init_data.sql @@ -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') +); diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/evidence/clue/service/impl/MonitoringClueServiceImpl.java b/src/main/java/com/chinaweal/youfool/prj/modules/evidence/clue/service/impl/MonitoringClueServiceImpl.java index 07eefc6..2c1ff31 100644 --- a/src/main/java/com/chinaweal/youfool/prj/modules/evidence/clue/service/impl/MonitoringClueServiceImpl.java +++ b/src/main/java/com/chinaweal/youfool/prj/modules/evidence/clue/service/impl/MonitoringClueServiceImpl.java @@ -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.service.IMonitoringClueService; 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.mapper.EvidenceRecordMapper; import com.chinaweal.youfool.prj.modules.evidence.record.mapper.EvidenceStatusHistoryMapper; @@ -73,6 +75,15 @@ public class MonitoringClueServiceImpl extends ServiceImpl> queryList(MonitoringClueQuery query) { Page page = new Page<>(query.getPageNum(), query.getPageSize()); LambdaQueryWrapper 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())) { wrapper.eq(MonitoringClueEntity::getClueCode, query.getClueCode()); diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/evidence/record/service/impl/EvidenceRecordServiceImpl.java b/src/main/java/com/chinaweal/youfool/prj/modules/evidence/record/service/impl/EvidenceRecordServiceImpl.java index 35a81d8..10ddde7 100644 --- a/src/main/java/com/chinaweal/youfool/prj/modules/evidence/record/service/impl/EvidenceRecordServiceImpl.java +++ b/src/main/java/com/chinaweal/youfool/prj/modules/evidence/record/service/impl/EvidenceRecordServiceImpl.java @@ -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.service.IEvidenceRecordService; 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 lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -49,6 +51,15 @@ public class EvidenceRecordServiceImpl extends ServiceImpl> queryList(EvidenceRecordQuery query) { Page page = new Page<>(query.getPageNum(), query.getPageSize()); LambdaQueryWrapper 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())) { wrapper.eq(EvidenceRecordEntity::getDistrict, query.getDistrict()); diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/evidence/transfer/service/impl/ClueTransferServiceImpl.java b/src/main/java/com/chinaweal/youfool/prj/modules/evidence/transfer/service/impl/ClueTransferServiceImpl.java index db04845..1ccba67 100644 --- a/src/main/java/com/chinaweal/youfool/prj/modules/evidence/transfer/service/impl/ClueTransferServiceImpl.java +++ b/src/main/java/com/chinaweal/youfool/prj/modules/evidence/transfer/service/impl/ClueTransferServiceImpl.java @@ -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.TransferOperationLogMapper; 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.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -58,6 +60,26 @@ public class ClueTransferServiceImpl extends ServiceImpl> queryList(ClueTransferQuery query) { Page page = new Page<>(query.getPageNum(), query.getPageSize()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + // 数据权限过滤 + LoginUserVO currentUser = DataScopeHelper.getCurrentUser(); + if (!DataScopeHelper.isCitySupervisor(currentUser)) { + if (DataScopeHelper.isDistrictSupervisor(currentUser)) { + String districtCode = currentUser.getDistrictCode(); + LambdaQueryWrapper clueWrapper = new LambdaQueryWrapper<>(); + clueWrapper.eq(MonitoringClueEntity::getDistrict, districtCode); + clueWrapper.select(MonitoringClueEntity::getId); + List 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筛选 if (StringUtils.isNotBlank(query.getClueId())) { wrapper.eq(ClueTransferRecordEntity::getClueId, query.getClueId()); @@ -269,6 +291,15 @@ public class ClueTransferServiceImpl extends ServiceImpl page = new Page<>(query.getPageNum(), query.getPageSize()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); 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())) { wrapper.like(MonitoringClueEntity::getClueCode, query.getClueCode()); } diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/config/entity/query/RecordingConfigQuery.java b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/config/entity/query/RecordingConfigQuery.java index deaa24f..ecd4546 100644 --- a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/config/entity/query/RecordingConfigQuery.java +++ b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/config/entity/query/RecordingConfigQuery.java @@ -24,9 +24,9 @@ public class RecordingConfigQuery { private Integer pageSize = 10; /** - * 关键字(大屏名称模糊查询) + * 大屏名称(模糊匹配) */ - private String keyword; + private String screenName; /** * 行政区划 diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/config/service/impl/RecordingConfigServiceImpl.java b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/config/service/impl/RecordingConfigServiceImpl.java index 36405bc..619edbf 100644 --- a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/config/service/impl/RecordingConfigServiceImpl.java +++ b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/config/service/impl/RecordingConfigServiceImpl.java @@ -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.screen.entity.ScreenEntity; 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.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -41,9 +44,28 @@ public class RecordingConfigServiceImpl extends ServiceImpl> queryList(RecordingConfigQuery query) { Page page = new Page<>(query.getPageNum(), query.getPageSize()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - // 关键字模糊查询(大屏名称) - if (StringUtils.isNotBlank(query.getKeyword())) { - wrapper.like(RecordingConfigEntity::getScreenName, query.getKeyword()); + // 数据权限过滤 + LoginUserVO currentUser = DataScopeHelper.getCurrentUser(); + if (!DataScopeHelper.isCitySupervisor(currentUser)) { + if (DataScopeHelper.isDistrictSupervisor(currentUser)) { + wrapper.eq(RecordingConfigEntity::getDistrict, currentUser.getDistrictCode()); + } else if (DataScopeHelper.isOperator(currentUser)) { + LambdaQueryWrapper screenWrapper = new LambdaQueryWrapper<>(); + screenWrapper.eq(ScreenEntity::getOperatorUnit, currentUser.getOrgName()); + screenWrapper.select(ScreenEntity::getId); + List 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())) { @@ -187,6 +209,17 @@ public class RecordingConfigServiceImpl extends ServiceImpl>> getConfigurableScreens() { // 查询所有大屏 LambdaQueryWrapper 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.eq(ScreenEntity::getScreenStatus, 1); screenWrapper.orderByAsc(ScreenEntity::getScreenCode); diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/record/service/impl/MonitorRecordServiceImpl.java b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/record/service/impl/MonitorRecordServiceImpl.java index 09c6e36..979cb88 100644 --- a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/record/service/impl/MonitorRecordServiceImpl.java +++ b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/record/service/impl/MonitorRecordServiceImpl.java @@ -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.mapper.MonitorRecordMapper; 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.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -40,6 +42,15 @@ public class MonitorRecordServiceImpl extends ServiceImpl> queryList(MonitorRecordQuery query) { Page page = new Page<>(query.getPageNum(), query.getPageSize()); LambdaQueryWrapper 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精确筛选 if (StringUtils.isNotBlank(query.getScreenId())) { wrapper.eq(MonitorRecordEntity::getScreenId, query.getScreenId()); diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/controller/RecordingTaskController.java b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/controller/RecordingTaskController.java index e804b98..9e889fe 100644 --- a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/controller/RecordingTaskController.java +++ b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/controller/RecordingTaskController.java @@ -2,8 +2,8 @@ package com.chinaweal.youfool.prj.modules.monitor.task.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.vo.RecordingTaskVO; import com.chinaweal.youfool.prj.modules.monitor.task.service.IRecordingTaskService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -40,7 +40,7 @@ public class RecordingTaskController { */ @PostMapping("query") @Operation(summary = "分页查询录屏任务列表") - public RestResult> queryList(@RequestBody RecordingTaskQuery query) { + public RestResult> queryList(@RequestBody RecordingTaskQuery query) { log.info("[OK] 分页查询录屏任务列表: pageNum={}, pageSize={}", query.getPageNum(), query.getPageSize()); return recordingTaskService.queryList(query); } diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/entity/vo/RecordingTaskVO.java b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/entity/vo/RecordingTaskVO.java new file mode 100644 index 0000000..e56812a --- /dev/null +++ b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/entity/vo/RecordingTaskVO.java @@ -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; +} diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/service/IRecordingTaskService.java b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/service/IRecordingTaskService.java index 2ddba84..be28dd1 100644 --- a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/service/IRecordingTaskService.java +++ b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/service/IRecordingTaskService.java @@ -2,8 +2,8 @@ package com.chinaweal.youfool.prj.modules.monitor.task.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.vo.RecordingTaskVO; import java.util.Map; @@ -16,12 +16,12 @@ import java.util.Map; public interface IRecordingTaskService { /** - * 分页查询录屏任务列表 + * 分页查询录屏任务列表(含大屏关联信息) * * @param query 查询条件 * @return 分页结果 */ - RestResult> queryList(RecordingTaskQuery query); + RestResult> queryList(RecordingTaskQuery query); /** * 获取录屏任务详情(含关联告警通知列表) diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/service/impl/RecordingTaskServiceImpl.java b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/service/impl/RecordingTaskServiceImpl.java index 7cf6b9e..eb6d59d 100644 --- a/src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/service/impl/RecordingTaskServiceImpl.java +++ b/src/main/java/com/chinaweal/youfool/prj/modules/monitor/task/service/impl/RecordingTaskServiceImpl.java @@ -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.RecordingTaskEntity; 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.RecordingTaskMapper; 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.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.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -21,10 +24,10 @@ import org.springframework.stereotype.Service; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; - import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; /** @@ -42,7 +45,7 @@ public class RecordingTaskServiceImpl extends ServiceImpl> queryList(RecordingTaskQuery query) { + public RestResult> queryList(RecordingTaskQuery query) { Page page = new Page<>(query.getPageNum(), query.getPageSize()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // 大屏ID精确筛选 @@ -53,6 +56,25 @@ public class RecordingTaskServiceImpl extends ServiceImpl opScreenWrapper = new LambdaQueryWrapper<>(); + opScreenWrapper.eq(ScreenEntity::getOperatorUnit, currentUser.getOrgName()); + opScreenWrapper.select(ScreenEntity::getId); + List 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两步查询 if (StringUtils.isNotBlank(query.getDistrict()) || StringUtils.isNotBlank(query.getScreenName())) { LambdaQueryWrapper screenWrapper = new LambdaQueryWrapper<>(); @@ -66,7 +88,6 @@ public class RecordingTaskServiceImpl extends ServiceImpl screenIds = screens.stream() .map(ScreenEntity::getId).collect(Collectors.toList()); if (screenIds.isEmpty()) { - // 无匹配大屏,返回空结果 return RestResult.ok(new Page<>(query.getPageNum(), query.getPageSize(), 0)); } wrapper.in(RecordingTaskEntity::getScreenId, screenIds); @@ -90,7 +111,36 @@ public class RecordingTaskServiceImpl extends ServiceImpl entityPage = this.page(page, wrapper); - return RestResult.ok(entityPage); + + // 转换为 VO 并补充大屏关联信息 + Page voPage = new Page<>(entityPage.getCurrent(), entityPage.getSize(), entityPage.getTotal()); + if (!entityPage.getRecords().isEmpty()) { + Set screenIds = entityPage.getRecords().stream() + .map(RecordingTaskEntity::getScreenId) + .collect(Collectors.toSet()); + Map 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 @@ -113,6 +163,14 @@ public class RecordingTaskServiceImpl extends ServiceImpl alertWrapper = new LambdaQueryWrapper<>(); alertWrapper.eq(AlertNotificationEntity::getTaskId, id); diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/screen/entity/query/ScreenQuery.java b/src/main/java/com/chinaweal/youfool/prj/modules/screen/entity/query/ScreenQuery.java index f554443..61d9235 100644 --- a/src/main/java/com/chinaweal/youfool/prj/modules/screen/entity/query/ScreenQuery.java +++ b/src/main/java/com/chinaweal/youfool/prj/modules/screen/entity/query/ScreenQuery.java @@ -24,9 +24,19 @@ public class ScreenQuery { private Integer pageSize = 10; /** - * 关键字(大屏名称/编码模糊查询) + * 大屏名称(模糊匹配) */ - private String keyword; + private String screenName; + + /** + * 大屏编码(精确匹配) + */ + private String screenCode; + + /** + * 业主单位(模糊匹配) + */ + private String ownerUnit; /** * 行政区划 diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/screen/service/impl/ScreenServiceImpl.java b/src/main/java/com/chinaweal/youfool/prj/modules/screen/service/impl/ScreenServiceImpl.java index 7ada717..0ca3656 100644 --- a/src/main/java/com/chinaweal/youfool/prj/modules/screen/service/impl/ScreenServiceImpl.java +++ b/src/main/java/com/chinaweal/youfool/prj/modules/screen/service/impl/ScreenServiceImpl.java @@ -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.mapper.ScreenMapper; 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.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -45,13 +47,28 @@ public class ScreenServiceImpl extends ServiceImpl i public RestResult> queryList(ScreenQuery query) { Page page = new Page<>(query.getPageNum(), query.getPageSize()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - // 关键字模糊查询(大屏名称或编码) - if (StringUtils.isNotBlank(query.getKeyword())) { - wrapper.and(w -> w - .like(ScreenEntity::getScreenName, query.getKeyword()) - .or() - .like(ScreenEntity::getScreenCode, query.getKeyword()) - ); + // 数据权限过滤 + LoginUserVO currentUser = DataScopeHelper.getCurrentUser(); + if (!DataScopeHelper.isCitySupervisor(currentUser)) { + if (DataScopeHelper.isDistrictSupervisor(currentUser)) { + wrapper.eq(ScreenEntity::getDistrict, currentUser.getDistrictCode()); + } 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())) { @@ -161,6 +178,17 @@ public class ScreenServiceImpl extends ServiceImpl i @Override public RestResult>> getScreenOptions() { LambdaQueryWrapper 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.orderByAsc(ScreenEntity::getScreenCode); List list = this.list(wrapper); @@ -217,9 +245,25 @@ public class ScreenServiceImpl extends ServiceImpl i @Override public RestResult>> exportData(ScreenQuery query) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - if (StringUtils.isNotBlank(query.getKeyword())) { - wrapper.and(w -> w.like(ScreenEntity::getScreenName, query.getKeyword()) - .or().like(ScreenEntity::getScreenCode, query.getKeyword())); + // 数据权限过滤 + LoginUserVO exportUser = DataScopeHelper.getCurrentUser(); + 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())) { wrapper.eq(ScreenEntity::getDistrict, query.getDistrict()); diff --git a/src/main/java/com/chinaweal/youfool/prj/modules/system/util/DataScopeHelper.java b/src/main/java/com/chinaweal/youfool/prj/modules/system/util/DataScopeHelper.java new file mode 100644 index 0000000..afd830e --- /dev/null +++ b/src/main/java/com/chinaweal/youfool/prj/modules/system/util/DataScopeHelper.java @@ -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); + } +} diff --git a/task_plan.md b/task_plan.md index e80b6b8..ed16f5d 100644 --- a/task_plan.md +++ b/task_plan.md @@ -267,6 +267,23 @@ public RestResult remove(...) { ... } **注意**:数据权限需要修改现有 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(关联表) + **状态**: ✅ 完成 ---