feat(ops): 新增安保模块数据模型与 Mapper

新增安保区域人员绑定表 ops_area_security_user 和安保工单扩展表
ops_order_security_ext,以及对应的 DO 和 Mapper 接口。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
lzh
2026-03-11 17:32:56 +08:00
parent b8d0a77156
commit d53d1c4584
6 changed files with 289 additions and 0 deletions

View File

@@ -0,0 +1,16 @@
CREATE TABLE ops_area_security_user (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
area_id BIGINT NOT NULL COMMENT '区域ID关联 ops_bus_area.id',
user_id BIGINT NOT NULL COMMENT '安保人员用户ID关联 system_users.id',
user_name VARCHAR(64) DEFAULT '' COMMENT '安保人员姓名(冗余)',
team_id BIGINT DEFAULT NULL COMMENT '所属班组ID',
enabled BIT DEFAULT 1 COMMENT '是否启用',
sort INT DEFAULT 0 COMMENT '排序值',
creator VARCHAR(64) DEFAULT '',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
updater VARCHAR(64) DEFAULT '',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted BIT DEFAULT 0,
tenant_id BIGINT DEFAULT 0,
UNIQUE KEY uk_area_user (area_id, user_id, deleted)
) COMMENT '区域-安保人员绑定表';

View File

@@ -0,0 +1,41 @@
-- ----------------------------
-- Table structure for ops_order_security_ext
-- ----------------------------
DROP TABLE IF EXISTS `ops_order_security_ext`;
CREATE TABLE `ops_order_security_ext` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`ops_order_id` bigint NOT NULL COMMENT '工单ID关联 ops_order.id',
-- 告警来源(告警工单必填,手动工单可空)
`alarm_id` varchar(64) DEFAULT NULL COMMENT '关联告警ID',
`alarm_type` varchar(50) DEFAULT NULL COMMENT '告警类型: intrusion/leave_post/fire/fence',
`camera_id` varchar(64) DEFAULT NULL COMMENT '摄像头ID',
`roi_id` varchar(64) DEFAULT NULL COMMENT 'ROI区域ID',
`image_url` varchar(512) DEFAULT NULL COMMENT '告警截图URL',
-- 处理人(冗余快照,创建时写入)
`assigned_user_id` bigint DEFAULT NULL COMMENT '处理人user_id',
`assigned_user_name` varchar(100) DEFAULT NULL COMMENT '处理人姓名',
`assigned_team_id` bigint DEFAULT NULL COMMENT '班组ID',
-- 处理结果(完成时提交)
`result` text DEFAULT NULL COMMENT '处理结果描述',
`result_img_urls` varchar(2048) DEFAULT NULL COMMENT '处理结果图片URLJSON数组',
-- 关键时间点
`dispatched_time` datetime DEFAULT NULL COMMENT '派单时间',
`confirmed_time` datetime DEFAULT NULL COMMENT '确认时间',
`completed_time` datetime DEFAULT NULL COMMENT '完成时间',
-- 审计字段
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_ops_order_id` (`ops_order_id`, `deleted`) USING BTREE,
INDEX `idx_alarm_id` (`alarm_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '安保工单扩展表' ROW_FORMAT = Dynamic;

View File

@@ -0,0 +1,58 @@
package com.viewsh.module.ops.security.dal.dataobject.area;
import com.viewsh.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* 区域-安保人员绑定 DO
*
* @author lzh
*/
@TableName("ops_area_security_user")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OpsAreaSecurityUserDO extends BaseDO {
/**
* 主键
*/
@TableId
private Long id;
/**
* 区域ID关联 ops_bus_area.id
*/
private Long areaId;
/**
* 安保人员用户ID关联 system_users.id
*/
private Long userId;
/**
* 安保人员姓名(冗余)
*/
private String userName;
/**
* 所属班组ID
*/
private Long teamId;
/**
* 是否启用
*/
private Boolean enabled;
/**
* 排序值
*/
private Integer sort;
}

View File

@@ -0,0 +1,100 @@
package com.viewsh.module.ops.security.dal.dataobject.workorder;
import com.viewsh.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.time.LocalDateTime;
/**
* 安保工单扩展 DO
*
* @author lzh
*/
@TableName("ops_order_security_ext")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OpsOrderSecurityExtDO extends BaseDO {
/**
* 主键
*/
@TableId
private Long id;
/**
* 工单ID
*
* 关联 {@link com.viewsh.module.ops.dal.dataobject.workorder.OpsOrderDO#getId()}
*/
private Long opsOrderId;
// ==================== 告警来源 ====================
/**
* 关联告警ID告警工单必填手动工单可空
*/
private String alarmId;
/**
* 告警类型intrusion=入侵/leave_post=离岗/fire=火灾/fence=越界)
*/
private String alarmType;
/**
* 摄像头ID
*/
private String cameraId;
/**
* ROI区域ID
*/
private String roiId;
/**
* 告警截图URL
*/
private String imageUrl;
// ==================== 处理人信息(冗余快照) ====================
/**
* 处理人user_id
*/
private Long assignedUserId;
/**
* 处理人姓名
*/
private String assignedUserName;
/**
* 班组ID
*/
private Long assignedTeamId;
// ==================== 处理结果(完成时提交) ====================
/**
* 处理结果描述
*/
private String result;
/**
* 处理结果图片URLJSON数组
*/
private String resultImgUrls;
// ==================== 关键时间点 ====================
/**
* 派单时间
*/
private LocalDateTime dispatchedTime;
/**
* 确认时间
*/
private LocalDateTime confirmedTime;
/**
* 完成时间
*/
private LocalDateTime completedTime;
}

View File

@@ -0,0 +1,37 @@
package com.viewsh.module.ops.security.dal.mysql.area;
import com.viewsh.framework.mybatis.core.mapper.BaseMapperX;
import com.viewsh.module.ops.security.dal.dataobject.area.OpsAreaSecurityUserDO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 区域-安保人员绑定 Mapper
*
* @author lzh
*/
@Mapper
public interface OpsAreaSecurityUserMapper extends BaseMapperX<OpsAreaSecurityUserDO> {
/**
* 查询区域内所有启用的安保人员
*/
default List<OpsAreaSecurityUserDO> selectListByAreaId(Long areaId) {
return selectList(new LambdaQueryWrapper<OpsAreaSecurityUserDO>()
.eq(OpsAreaSecurityUserDO::getAreaId, areaId)
.eq(OpsAreaSecurityUserDO::getEnabled, true)
.orderByAsc(OpsAreaSecurityUserDO::getSort));
}
/**
* 根据区域ID和用户ID查询唯一性校验用
*/
default OpsAreaSecurityUserDO selectByAreaIdAndUserId(Long areaId, Long userId) {
return selectOne(new LambdaQueryWrapper<OpsAreaSecurityUserDO>()
.eq(OpsAreaSecurityUserDO::getAreaId, areaId)
.eq(OpsAreaSecurityUserDO::getUserId, userId));
}
}

View File

@@ -0,0 +1,37 @@
package com.viewsh.module.ops.security.dal.mysql.workorder;
import com.viewsh.framework.mybatis.core.mapper.BaseMapperX;
import com.viewsh.module.ops.security.dal.dataobject.workorder.OpsOrderSecurityExtDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 安保工单扩展 Mapper
*
* @author lzh
*/
@Mapper
public interface OpsOrderSecurityExtMapper extends BaseMapperX<OpsOrderSecurityExtDO> {
/**
* 根据工单ID查询扩展信息
*/
default OpsOrderSecurityExtDO selectByOpsOrderId(Long opsOrderId) {
return selectOne(OpsOrderSecurityExtDO::getOpsOrderId, opsOrderId);
}
/**
* 插入或选择性更新扩展信息
* <p>
* 已存在时按 ID 更新,不存在时插入
*/
default int insertOrUpdateSelective(OpsOrderSecurityExtDO entity) {
OpsOrderSecurityExtDO existing = selectByOpsOrderId(entity.getOpsOrderId());
if (existing == null) {
return insert(entity);
} else {
entity.setId(existing.getId());
return updateById(entity);
}
}
}