提交 d4f0d825 作者: 涂茂林

feat:报警规则的增删改查

上级 dfb5fc22
......@@ -16,12 +16,12 @@ public enum RelevanceParamEnum {
/**
* 最大人数
*/
MAX_PEOPLE_NUMBER(1, "最人数"),
MAX_PEOPLE_NUMBER(1, "最人数"),
/**
* 最小人数
*/
MIN_PEOPLE_NUMBER(2, "最人数"),
MIN_PEOPLE_NUMBER(2, "最人数"),
/**
* 允许进入人员
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.design.check;
import com.yiring.common.core.Result;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 9:21
*/
public interface IParamInitStrategy<T> {
/**
* 校验参数
* @param param 参数
* @return 是否成功
*/
Result<String> paramInit(T param);
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.design.check.fence;
import com.yiring.app.constant.alarm.RelevanceParamEnum;
import com.yiring.app.design.check.IParamInitStrategy;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.common.core.Result;
import org.springframework.stereotype.Component;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 11:08
*/
@Component
public class DangerousStrategy implements IParamInitStrategy<LocationFenceRuleAddParam> {
public DangerousStrategy() {
Integer fenceType = RelevanceParamEnum.MAX_PEOPLE_NUMBER.getCode();
LocationFenceTypeContext.register(fenceType, this);
}
@Override
public Result<String> paramInit(LocationFenceRuleAddParam param) {
//TODO
return Result.ok();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.design.check.fence;
import com.yiring.app.design.check.IParamInitStrategy;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.app.param.location.rule.RuleParam;
import com.yiring.common.core.Result;
import org.springframework.stereotype.Component;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 11:15
*/
@Component
public class DefaultStrategy implements IParamInitStrategy<LocationFenceRuleAddParam> {
public DefaultStrategy() {
Integer fenceType = 0;
LocationFenceTypeContext.register(fenceType, this);
}
@Override
public Result<String> paramInit(LocationFenceRuleAddParam param) {
RuleParam ruleParam = param.getRuleParam();
ruleParam.setVoiceId(null);
ruleParam.setVoiceName(null);
ruleParam.setPlayEquipmentId(null);
ruleParam.setPlayEquipmentName(null);
return Result.ok();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.design.check.fence;
import com.yiring.app.constant.alarm.FenceTypeEnum;
import com.yiring.app.design.check.IParamInitStrategy;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.common.core.Result;
import java.util.concurrent.ConcurrentHashMap;
import lombok.extern.slf4j.Slf4j;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 11:09
*/
@Slf4j
public class LocationFenceTypeContext {
private final IParamInitStrategy<LocationFenceRuleAddParam> checkStrategy;
private static final ConcurrentHashMap<Integer, IParamInitStrategy<LocationFenceRuleAddParam>> FENCE_TYPE_MAP = new ConcurrentHashMap<>(
4
);
public static void register(Integer relevanceParam, IParamInitStrategy<LocationFenceRuleAddParam> strategy) {
FENCE_TYPE_MAP.put(relevanceParam, strategy);
}
public LocationFenceTypeContext(Integer relevanceParam) {
if (relevanceParam == null || relevanceParam > FenceTypeEnum.MAX || relevanceParam < FenceTypeEnum.MIN) {
log.warn("报警类型的关联参数异常, relevanceParam:[{}]", relevanceParam);
throw new RuntimeException("报警类型的关联参数异常");
}
IParamInitStrategy<LocationFenceRuleAddParam> strategy = FENCE_TYPE_MAP.get(relevanceParam);
if (strategy == null) {
strategy = FENCE_TYPE_MAP.get(0);
}
this.checkStrategy = strategy;
}
public Result<String> paramInit(LocationFenceRuleAddParam param) {
return checkStrategy.paramInit(param);
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.design.check.rule;
import com.yiring.app.constant.alarm.RelevanceParamEnum;
import com.yiring.app.design.check.IParamInitStrategy;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.app.param.location.rule.RuleParam;
import com.yiring.app.param.location.rule.TimeAndUserParam;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 9:32
*/
@Component
public class AllowEntranceStrategy implements IParamInitStrategy<LocationFenceRuleAddParam> {
public AllowEntranceStrategy() {
Integer relevanceParam = RelevanceParamEnum.ALLOW_ENTRANCE.getCode();
LocationFenceRuleContext.register(relevanceParam, this);
}
@Override
public Result<String> paramInit(LocationFenceRuleAddParam param) {
RuleParam ruleParam = param.getRuleParam();
List<TimeAndUserParam> timeAndUser = ruleParam.getTimeAndUser();
if (CollectionUtils.isEmpty(timeAndUser)) {
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一条允许进入人员的规则");
}
for (TimeAndUserParam item : timeAndUser) {
if (CollectionUtils.isEmpty(item.getUser())) {
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一个允许进入的人员");
}
}
ruleParam.setDuration(-1);
ruleParam.setDistance(-1);
ruleParam.setTimeAndNumber(new ArrayList<>());
return Result.ok();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.design.check.rule;
import com.yiring.app.constant.alarm.RelevanceParamEnum;
import com.yiring.app.design.check.IParamInitStrategy;
import com.yiring.app.design.check.fence.LocationFenceTypeContext;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import java.util.concurrent.ConcurrentHashMap;
import lombok.extern.slf4j.Slf4j;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 9:36
*/
@Slf4j
public class LocationFenceRuleContext {
private final IParamInitStrategy<LocationFenceRuleAddParam> checkStrategy;
private static final ConcurrentHashMap<Integer, IParamInitStrategy<LocationFenceRuleAddParam>> RULE_MAP = new ConcurrentHashMap<>(
10
);
public static void register(Integer relevanceParam, IParamInitStrategy<LocationFenceRuleAddParam> strategy) {
RULE_MAP.put(relevanceParam, strategy);
}
public LocationFenceRuleContext(Integer relevanceParam) {
if (
relevanceParam == null || relevanceParam > RelevanceParamEnum.MAX || relevanceParam < RelevanceParamEnum.MIN
) {
log.warn("报警类型的关联参数异常, relevanceParam:[{}]", relevanceParam);
throw new RuntimeException("报警类型的关联参数异常");
}
this.checkStrategy = RULE_MAP.get(relevanceParam);
}
public Result<String> paramInit(LocationFenceRuleAddParam param) {
Result<String> result = new LocationFenceTypeContext(param.getFenceType()).paramInit(param);
if (Status.OK.value() != result.getStatus()) {
return result;
}
return checkStrategy.paramInit(param);
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.design.check.rule;
import com.yiring.app.constant.alarm.RelevanceParamEnum;
import com.yiring.app.design.check.IParamInitStrategy;
import com.yiring.app.param.location.rule.*;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
/**
* 最多人数校验
* @author tml
* @version 1.0
* @date 2022/4/29 9:28
*/
@Component
public class MaxPeopleNumberStrategy implements IParamInitStrategy<LocationFenceRuleAddParam> {
public MaxPeopleNumberStrategy() {
Integer relevanceParam = RelevanceParamEnum.MAX_PEOPLE_NUMBER.getCode();
LocationFenceRuleContext.register(relevanceParam, this);
}
@Override
public Result<String> paramInit(LocationFenceRuleAddParam param) {
RuleParam ruleParam = param.getRuleParam();
List<TimeAndNumberParam> timeAndNumber = ruleParam.getTimeAndNumber();
if (CollectionUtils.isEmpty(timeAndNumber)) {
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一条最多人数的规则");
}
for (TimeAndNumberParam item : timeAndNumber) {
if (item.getNumber() == null || item.getNumber() < 0) {
item.setNumber(0);
}
if (item.getBeginTime() == null || item.getEndTime() == null) {
item.setBeginTime(null);
item.setEndTime(null);
}
}
//将时间和距离都设为-1
ruleParam.setDuration(-1);
ruleParam.setDistance(-1);
ArrayList<TimeAndUserParam> list = new ArrayList<>();
ruleParam.setTimeAndUser(list);
return Result.ok();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.design.check.rule;
import com.yiring.app.constant.alarm.RelevanceParamEnum;
import com.yiring.app.design.check.IParamInitStrategy;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.app.param.location.rule.RuleParam;
import com.yiring.app.param.location.rule.TimeAndNumberParam;
import com.yiring.app.param.location.rule.TimeAndUserParam;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 9:31
*/
@Component
public class MinPeopleNumberStrategy implements IParamInitStrategy<LocationFenceRuleAddParam> {
public MinPeopleNumberStrategy() {
Integer relevanceParam = RelevanceParamEnum.MIN_PEOPLE_NUMBER.getCode();
LocationFenceRuleContext.register(relevanceParam, this);
}
@Override
public Result<String> paramInit(LocationFenceRuleAddParam param) {
RuleParam ruleParam = param.getRuleParam();
List<TimeAndNumberParam> timeAndNumber = ruleParam.getTimeAndNumber();
if (CollectionUtils.isEmpty(timeAndNumber)) {
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一条最小人数的规则");
}
for (TimeAndNumberParam item : timeAndNumber) {
if (item.getNumber() == null || item.getNumber() < 0) {
item.setNumber(0);
}
if (item.getBeginTime() == null || item.getEndTime() == null) {
item.setBeginTime(null);
item.setEndTime(null);
}
}
//将时间和距离都设为-1
ruleParam.setDuration(-1);
ruleParam.setDistance(-1);
ArrayList<TimeAndUserParam> list = new ArrayList<>();
ruleParam.setTimeAndUser(list);
return Result.ok();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.design.check.rule;
import com.yiring.app.constant.alarm.RelevanceParamEnum;
import com.yiring.app.design.check.IParamInitStrategy;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.app.param.location.rule.RuleParam;
import com.yiring.app.param.location.rule.TimeAndUserParam;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 9:32
*/
@Component
public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRuleAddParam> {
public NotAllowLeaveStrategy() {
Integer relevanceParam = RelevanceParamEnum.NOT_ALLOW_LEAVE.getCode();
LocationFenceRuleContext.register(relevanceParam, this);
}
@Override
public Result<String> paramInit(LocationFenceRuleAddParam param) {
RuleParam ruleParam = param.getRuleParam();
List<TimeAndUserParam> timeAndUser = ruleParam.getTimeAndUser();
if (CollectionUtils.isEmpty(timeAndUser)) {
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一条不允许离开人员的规则");
}
for (TimeAndUserParam item : timeAndUser) {
if (CollectionUtils.isEmpty(item.getUser())) {
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一个不允许离开的人员");
}
}
ruleParam.setDuration(-1);
ruleParam.setDistance(-1);
ruleParam.setTimeAndNumber(new ArrayList<>());
return Result.ok();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.design.check.rule;
import com.yiring.app.constant.alarm.RelevanceParamEnum;
import com.yiring.app.design.check.IParamInitStrategy;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.app.param.location.rule.RuleParam;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import java.util.ArrayList;
import org.springframework.stereotype.Component;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 9:33
*/
@Component
public class RetentionDurationStrategy implements IParamInitStrategy<LocationFenceRuleAddParam> {
public RetentionDurationStrategy() {
Integer relevanceParam = RelevanceParamEnum.RETENTION_DURATION.getCode();
LocationFenceRuleContext.register(relevanceParam, this);
}
@Override
public Result<String> paramInit(LocationFenceRuleAddParam param) {
RuleParam ruleParam = param.getRuleParam();
if (ruleParam.getDuration() == null || ruleParam.getDuration() < 0) {
return Result.no(Status.EXPECTATION_FAILED, "滞留时长异常");
}
ruleParam.setDistance(-1);
ruleParam.setTimeAndUser(new ArrayList<>());
ruleParam.setTimeAndNumber(new ArrayList<>());
return Result.ok();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.design.check.rule;
import com.yiring.app.constant.alarm.RelevanceParamEnum;
import com.yiring.app.design.check.IParamInitStrategy;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.app.param.location.rule.RuleParam;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import java.util.ArrayList;
import org.springframework.stereotype.Component;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 9:32
*/
@Component
public class StaticDurationStrategy implements IParamInitStrategy<LocationFenceRuleAddParam> {
public StaticDurationStrategy() {
Integer relevanceParam = RelevanceParamEnum.STATIC_DURATION.getCode();
LocationFenceRuleContext.register(relevanceParam, this);
}
@Override
public Result<String> paramInit(LocationFenceRuleAddParam param) {
RuleParam ruleParam = param.getRuleParam();
if (ruleParam.getDuration() == null || ruleParam.getDuration() < 0) {
return Result.no(Status.EXPECTATION_FAILED, "静止时长异常");
}
ruleParam.setDistance(-1);
ruleParam.setTimeAndUser(new ArrayList<>());
ruleParam.setTimeAndNumber(new ArrayList<>());
return Result.ok();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.design.check.rule;
import com.yiring.app.constant.alarm.RelevanceParamEnum;
import com.yiring.app.design.check.IParamInitStrategy;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.app.param.location.rule.RuleParam;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import java.util.ArrayList;
import org.springframework.stereotype.Component;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 9:33
*/
@Component
public class TriggerAlarmDistanceStrategy implements IParamInitStrategy<LocationFenceRuleAddParam> {
public TriggerAlarmDistanceStrategy() {
Integer relevanceParam = RelevanceParamEnum.TRIGGER_ALARM_DISTANCE.getCode();
LocationFenceRuleContext.register(relevanceParam, this);
}
@Override
public Result<String> paramInit(LocationFenceRuleAddParam param) {
RuleParam ruleParam = param.getRuleParam();
if (ruleParam.getDistance() == null || ruleParam.getDistance() < 0) {
return Result.no(Status.EXPECTATION_FAILED, "触发报警距离异常");
}
ruleParam.setDuration(-1);
ruleParam.setTimeAndUser(new ArrayList<>());
ruleParam.setTimeAndNumber(new ArrayList<>());
return Result.ok();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.location;
import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.common.domain.BasicEntity;
import java.io.Serial;
import java.io.Serializable;
import java.util.Objects;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
import org.hibernate.Hibernate;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.Where;
/**
* 围栏规则
......@@ -26,10 +26,11 @@ import org.hibernate.annotations.Comment;
@Getter
@Setter
@ToString
@Builder
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@Where(clause = "deleted = false")
@Entity
@Table(name = "BS_LOCATION_FENCE_RULE")
@Comment("围栏规则")
......@@ -43,13 +44,20 @@ public class LocationFenceRule extends BasicEntity implements Serializable {
@JoinColumn(name = "fence_id")
private LocationFence fence;
@Comment("静止时长(分钟)")
private Integer staticDuration;
@Comment("报警类别")
@ManyToOne
@JoinColumn(name = "alarm_id")
private AlarmType alarmType;
@Comment("关联参数类别")
private Integer relevanceParamType;
@Comment("规则,用json存入")
private String rule;
// TODO
// 字段补充
// 关联表补充(报警规则)
// 关联表配置值补充
@Comment(value = "是否删除")
@Column(nullable = false)
Boolean deleted;
@Override
public boolean equals(Object o) {
......@@ -61,6 +69,6 @@ public class LocationFenceRule extends BasicEntity implements Serializable {
@Override
public int hashCode() {
return Objects.hash(super.hashCode(), fence, staticDuration);
return Objects.hash(super.hashCode(), fence, alarmType, relevanceParamType, rule, deleted);
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.location;
import java.io.Serializable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 11:40
*/
@Repository
public interface LocationFenceRuleRepository
extends JpaRepository<LocationFenceRule, Serializable>, JpaSpecificationExecutor<LocationFenceRule> {}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.rule;
import com.alibaba.fastjson.JSON;
import com.yiring.app.constant.alarm.RelevanceParamEnum;
import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.domain.location.LocationFence;
import com.yiring.app.domain.location.LocationFenceRule;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Range;
/**
* @author tml
* @version 1.0
* @date 2022/4/28 16:16
*/
@ApiModel("添加配置报警类别的报警规则,根据不同类型传入不同参数")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LocationFenceRuleAddParam implements Serializable {
@Serial
private static final long serialVersionUID = -7774789748161552583L;
@ApiModelProperty(value = "所属的围栏id", example = "1", required = true)
@NotNull(message = "所属的围栏id不能为空")
private Long fenceId;
@ApiModelProperty(value = "所属的围栏类别", example = "1", required = true)
@NotNull(message = "所属的围栏类别不能为空")
private Integer fenceType;
@ApiModelProperty(value = "所属的报警类别id", example = "1", required = true)
@NotNull(message = "所属的报警类别id不能为空")
private Long alarmTypeId;
@ApiModelProperty(value = "设置的关联参数类型", example = "1", required = true)
@NotNull(message = "所属的关联参数类别不能为空")
@Range(min = RelevanceParamEnum.MIN, max = RelevanceParamEnum.MAX, message = "关联参数类别异常")
private Integer relevanceParamType;
@NotNull(message = "所属的规则不能为空")
private RuleParam ruleParam;
public LocationFenceRule transform() {
LocationFence locationFence = LocationFence.builder().id(fenceId).fenceType(fenceType).build();
AlarmType alarmType = AlarmType.builder().id(alarmTypeId).relevanceParam(relevanceParamType).build();
String rule = JSON.toJSONString(ruleParam);
return LocationFenceRule
.builder()
.fence(locationFence)
.relevanceParamType(relevanceParamType)
.alarmType(alarmType)
.rule(rule)
.deleted(false)
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.rule;
import com.yiring.app.domain.location.LocationFenceRule;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import lombok.*;
/**
* @author tml
* @version 1.0
* @date 2022/4/28 16:16
*/
@EqualsAndHashCode(callSuper = true)
@ApiModel("修改配置报警类别的报警规则,根据不同类型传入不同参数")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class LocationFenceRuleModifyParam extends LocationFenceRuleAddParam implements Serializable {
@Serial
private static final long serialVersionUID = -7774789748161552583L;
@ApiModelProperty(value = "规则id", example = "1", required = true)
@NotNull(message = "规则id不能为空")
private Long id;
@Override
public LocationFenceRule transform() {
LocationFenceRule transform = super.transform();
transform.setId(id);
return transform;
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.rule;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import lombok.*;
/**
* @author tml
* @version 1.0
* @date 2022/4/28 16:28
*/
@ApiModel("报警类型中报警规则的用户信息")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class RelevanceUserParam implements Serializable {
@Serial
private static final long serialVersionUID = -8419550356739651935L;
@ApiModelProperty(value = "工号", example = "1888888888", required = true)
private String uuid;
@ApiModelProperty(value = "真实姓名", example = "张三", required = true)
private String realName;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.rule;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 14:12
*/
@ApiModel("报警规则,根据不同类型传入不同参数")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RuleParam implements Serializable {
@Serial
private static final long serialVersionUID = 441241201908785930L;
@ApiModelProperty(value = "选择的播放语音id", example = "1")
private Long voiceId;
@ApiModelProperty(value = "选择的播放语音名称", example = "紧急语音")
private String voiceName;
@ApiModelProperty(value = "选择的播放设备id", example = "1")
private Long playEquipmentId;
@ApiModelProperty(value = "选择的播放设备名称", example = "语音设备1")
private String playEquipmentName;
@ApiModelProperty(value = "静止时长或滞留时间(分钟)", example = "10")
private Integer duration;
@ApiModelProperty(value = "触发报警的距离(米)", example = "10")
private Integer distance;
private List<TimeAndNumberParam> timeAndNumber;
private List<TimeAndUserParam> timeAndUser;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.rule;
import com.yiring.common.constant.RegEx;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/4/28 16:24
*/
@ApiModel("报警类型中的最多人数或最小人数")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TimeAndNumberParam implements Serializable {
@Serial
private static final long serialVersionUID = -6796977663003158881L;
@ApiModelProperty(value = "起始时间", example = "星期一 08:00:00")
@Pattern(regexp = RegEx.TIME_RULE, message = "时间格式不正确")
private String beginTime;
@ApiModelProperty(value = "终止时间", example = "星期一 18:00:00")
@Pattern(regexp = RegEx.TIME_RULE, message = "时间格式不正确")
private String endTime;
@ApiModelProperty(value = "人数", example = "100")
private Integer number;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.rule;
import com.yiring.common.constant.RegEx;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.util.Set;
import javax.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/4/28 16:24
*/
@ApiModel("报警类型中的允许进入人员或不允许离开人员")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TimeAndUserParam implements Serializable {
@Serial
private static final long serialVersionUID = -7037620599825901175L;
@ApiModelProperty(value = "起始时间", example = "星期一 08:00:00")
@Pattern(regexp = RegEx.TIME_RULE, message = "时间格式不正确")
private String beginTime;
@ApiModelProperty(value = "终止时间", example = "星期一 18:00:00")
@Pattern(regexp = RegEx.TIME_RULE, message = "时间格式不正确")
private String endTime;
private Set<RelevanceUserParam> user;
}
......@@ -9,6 +9,7 @@ import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import javax.validation.Valid;
/**
* @author tml
......@@ -44,4 +45,11 @@ public interface LocationFenceService {
* @return 是否成功
*/
Result<PageVo<LocationFenceVo>> findList(LocationFenceConditionParam conditionParam, PageParam pageParam);
/**
* 根据id查询围栏信息
* @param param id
* @return 详细信息
*/
Result<LocationFenceVo> findById(@Valid IdParam param);
}
......@@ -106,4 +106,15 @@ public class LocationFenceServiceImpl implements LocationFenceService {
PageVo<LocationFenceVo> pageVo = PageVo.build(voList, fencePage.getTotalElements());
return Result.ok(pageVo);
}
@Override
public Result<LocationFenceVo> findById(IdParam param) {
Optional<LocationFence> optional = locationFenceRepository.findById(param.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "查询的围栏信息不存在");
}
LocationFence fence = optional.get();
LocationFenceVo fenceVo = LocationFenceVo.transform(fence);
return Result.ok(fenceVo);
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.location.rule;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.app.param.location.rule.LocationFenceRuleModifyParam;
import com.yiring.app.vo.location.rule.LocationFenceRuleVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 11:27
*/
public interface LocationFenceRuleService {
/**
* 添加一条规则
* @param param 规则信息
* @return 是否成功
*/
Result<String> addRule(LocationFenceRuleAddParam param);
/**
* 修改一条规则
* @param param 规则信息
* @return 是否成
*/
Result<String> modifyRule(LocationFenceRuleModifyParam param);
/**
* 删除一条规则
* @param idParam 规则id
* @return 是否成功
*/
Result<String> removeRule(IdParam idParam);
/**
* 根据id查询一条规则信息
* @param idParam 规则id
* @return 规则信息
*/
Result<LocationFenceRuleVo> findRule(IdParam idParam);
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.location.rule.impl;
import com.yiring.app.domain.location.LocationFenceRule;
import com.yiring.app.domain.location.LocationFenceRuleRepository;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.app.param.location.rule.LocationFenceRuleModifyParam;
import com.yiring.app.service.location.rule.LocationFenceRuleService;
import com.yiring.app.util.JpaUtil;
import com.yiring.app.vo.location.rule.LocationFenceRuleVo;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam;
import java.util.Optional;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 11:39
*/
@Service
@Transactional(rollbackFor = Exception.class)
@Slf4j
public class LocationFenceRuleServiceImpl implements LocationFenceRuleService {
@Resource
private LocationFenceRuleRepository locationFenceRuleRepository;
@Override
public Result<String> addRule(LocationFenceRuleAddParam param) {
LocationFenceRule locationFenceRule = param.transform();
locationFenceRuleRepository.saveAndFlush(locationFenceRule);
return Result.ok();
}
@Override
public Result<String> modifyRule(LocationFenceRuleModifyParam param) {
LocationFenceRule locationFenceRule = param.transform();
Optional<LocationFenceRule> optional = locationFenceRuleRepository.findById(param.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要修改的规则不存在");
}
JpaUtil.copyNotNullProperties(locationFenceRule, optional.get());
return Result.ok();
}
@Override
public Result<String> removeRule(IdParam idParam) {
Optional<LocationFenceRule> optional = locationFenceRuleRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要删除的规则不存在");
}
optional.get().setDeleted(true);
return Result.ok();
}
@Override
public Result<LocationFenceRuleVo> findRule(IdParam idParam) {
Optional<LocationFenceRule> optional = locationFenceRuleRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要删除的规则不存在");
}
LocationFenceRuleVo ruleVo = LocationFenceRuleVo.transform(optional.get());
return Result.ok(ruleVo);
}
}
......@@ -3,11 +3,14 @@ package com.yiring.app.vo.location.fence;
import com.yiring.app.constant.alarm.FenceTypeEnum;
import com.yiring.app.domain.location.LocationFence;
import com.yiring.app.domain.location.LocationFenceRule;
import com.yiring.app.vo.location.rule.LocationFenceRuleVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.AllArgsConstructor;
import lombok.Builder;
......@@ -50,7 +53,15 @@ public class LocationFenceVo implements Serializable {
@ApiModelProperty(value = "是否启用")
private Boolean enable;
@ApiModelProperty(value = "报警规则")
private Set<LocationFenceRuleVo> rules;
public static LocationFenceVo transform(LocationFence locationFence) {
Set<LocationFenceRule> rules = locationFence.getRules();
Set<LocationFenceRuleVo> collect = rules
.stream()
.map(LocationFenceRuleVo::transform)
.collect(Collectors.toSet());
return LocationFenceVo
.builder()
.name(locationFence.getName())
......@@ -59,6 +70,7 @@ public class LocationFenceVo implements Serializable {
.fenceType(FenceTypeEnum.getByCode(locationFence.getFenceType()))
.residenceTime(locationFence.getResidenceTime())
.threshold(locationFence.getThreshold())
.rules(collect)
.enable(locationFence.getEnable())
.build();
}
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.location.rule;
import cn.hutool.core.convert.Convert;
import com.alibaba.fastjson.JSON;
import com.yiring.app.domain.location.LocationFenceRule;
import com.yiring.app.param.location.rule.RuleParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/4/28 16:16
*/
@ApiModel("修改配置报警类别的报警规则,根据不同类型传入不同参数")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LocationFenceRuleVo implements Serializable {
@Serial
private static final long serialVersionUID = -7774789748161552583L;
@ApiModelProperty(value = "规则id", example = "1", required = true)
private Long id;
@ApiModelProperty(value = "所属的围栏id", example = "1", required = true)
private Long fenceId;
@ApiModelProperty(value = "所属的围栏类别", example = "1", required = true)
private Integer fenceType;
@ApiModelProperty(value = "所属的报警类别id", example = "1", required = true)
private Long alarmTypeId;
@ApiModelProperty(
value = "设置的关联参数类型(1:最大人数,2:最小人数,3:允许进入人员,4:不允许离开人员,5:静止时长(分钟),6:滞留时长(分钟),7:触发报警距离)",
example = "1",
required = true
)
private Integer relevanceParamType;
private RuleVo ruleVo;
public static LocationFenceRuleVo transform(LocationFenceRule locationFenceRule) {
String rule = locationFenceRule.getRule();
RuleParam ruleParam = JSON.parseObject(rule, RuleParam.class);
RuleVo ruleVo = Convert.convert(RuleVo.class, ruleParam);
return LocationFenceRuleVo
.builder()
.id(locationFenceRule.getId())
.fenceId(locationFenceRule.getFence().getId())
.fenceType(locationFenceRule.getFence().getFenceType())
.alarmTypeId(locationFenceRule.getAlarmType().getId())
.relevanceParamType(locationFenceRule.getRelevanceParamType())
.ruleVo(ruleVo)
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.location.rule;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import lombok.*;
/**
* @author tml
* @version 1.0
* @date 2022/4/28 16:28
*/
@ApiModel("报警类型中报警规则的用户信息")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class RelevanceUserVo implements Serializable {
@Serial
private static final long serialVersionUID = -8419550356739651935L;
@ApiModelProperty(value = "工号", example = "1888888888", required = true)
private String uuid;
@ApiModelProperty(value = "真实姓名", example = "张三", required = true)
private String realName;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.location.rule;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 14:12
*/
@ApiModel("报警规则,根据不同类型传入不同参数")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RuleVo implements Serializable {
@Serial
private static final long serialVersionUID = 441241201908785930L;
@ApiModelProperty(value = "选择的播放语音id", example = "1")
private Long voiceId;
@ApiModelProperty(value = "选择的播放语音名称", example = "紧急语音")
private String voiceName;
@ApiModelProperty(value = "选择的播放设备id", example = "1")
private Long playEquipmentId;
@ApiModelProperty(value = "选择的播放设备名称", example = "语音设备1")
private String playEquipmentName;
@ApiModelProperty(value = "静止时长或滞留时间(分钟)", example = "10")
private Integer duration;
@ApiModelProperty(value = "触发报警的距离(米)", example = "10")
private Integer distance;
private List<TimeAndNumberVo> timeAndNumber;
private List<TimeAndUserVo> timeAndUser;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.location.rule;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/4/28 16:24
*/
@ApiModel("报警类型中的最多人数或最小人数")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TimeAndNumberVo implements Serializable {
@Serial
private static final long serialVersionUID = -6796977663003158881L;
@ApiModelProperty(value = "起始时间", example = "星期一 08:00:00")
private String beginTime;
@ApiModelProperty(value = "终止时间", example = "星期一 18:00:00")
private String endTime;
@ApiModelProperty(value = "人数", example = "100")
private Integer number;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.location.rule;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.util.Set;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* @author tml
* @version 1.0
* @date 2022/4/28 16:24
*/
@ApiModel("报警类型中的允许进入人员或不允许离开人员")
@Data
@SuperBuilder(toBuilder = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TimeAndUserVo implements Serializable {
@Serial
private static final long serialVersionUID = -7037620599825901175L;
@ApiModelProperty(value = "起始时间", example = "星期一 08:00:00")
private String beginTime;
@ApiModelProperty(value = "终止时间", example = "星期一 18:00:00")
private String endTime;
private Set<RelevanceUserVo> user;
}
......@@ -59,4 +59,10 @@ public class LocationFenceController {
) {
return locationFenceService.findList(conditionParam, pageParam);
}
@ApiOperation("根据条id查询围栏信息")
@PostMapping("/findById")
public Result<LocationFenceVo> findById(@Valid IdParam param) {
return locationFenceService.findById(param);
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.web.location.rule;
import com.yiring.app.design.check.rule.LocationFenceRuleContext;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.app.param.location.rule.LocationFenceRuleModifyParam;
import com.yiring.app.service.location.rule.impl.LocationFenceRuleServiceImpl;
import com.yiring.app.vo.location.rule.LocationFenceRuleVo;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 9:05
*/
@Slf4j
@Validated
@Api(tags = "LocationFenceRuleController(电子围栏报警规则)")
@RestController
@RequestMapping("/location/rule")
public class LocationFenceRuleController {
@Resource
private LocationFenceRuleServiceImpl locationFenceRuleService;
@ApiOperation("添加一条电子围栏的报警规则")
@PostMapping("/addRule")
public Result<String> addRule(@Valid @RequestBody LocationFenceRuleAddParam param) {
Result<String> result = new LocationFenceRuleContext(param.getRelevanceParamType()).paramInit(param);
if (Status.OK.value() != result.getStatus()) {
return result;
}
return locationFenceRuleService.addRule(param);
}
@ApiOperation("修改一条电子围栏的报警规则")
@PostMapping("/modifyRule")
public Result<String> modifyRule(@Valid @RequestBody LocationFenceRuleModifyParam param) {
Result<String> result = new LocationFenceRuleContext(param.getRelevanceParamType()).paramInit(param);
if (Status.OK.value() != result.getStatus()) {
return result;
}
return locationFenceRuleService.modifyRule(param);
}
@ApiOperation("删除一条电子围栏的报警规则")
@PostMapping("/removeRule")
public Result<String> removeRule(@Valid IdParam idParam) {
return locationFenceRuleService.removeRule(idParam);
}
@ApiOperation("查询一条电子围栏的报警规则")
@PostMapping("/findRule")
public Result<LocationFenceRuleVo> findRule(@Valid IdParam idParam) {
return locationFenceRuleService.findRule(idParam);
}
}
......@@ -19,4 +19,9 @@ public class RegEx {
//手机号码验证
public static final String MOBILE =
"^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(16[5,6])|(17[0-8])|(18[0-9])|(19[1、5、8、9]))\\d{8}$";
/**
* 报警规则的时间格式
*/
public static final String TIME_RULE = "^星期[一二三四五六日]\\ (2[0-4]|[0-1]\\d)(\\:[0-5]\\d){2}$";
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论