提交 b10b3086 作者: 涂茂林

feat:围栏报警规则

上级 c2d0aaa0
......@@ -9,10 +9,7 @@ import com.yiring.app.domain.location.LocationFence;
import com.yiring.app.domain.location.LocationFenceAlarm;
import com.yiring.app.domain.location.LocationTag;
import com.yiring.app.param.location.fence.LocationFenceJobParam;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.app.param.location.rule.RelevanceUserParam;
import com.yiring.app.param.location.rule.RuleParam;
import com.yiring.app.param.location.rule.TimeAndUserParam;
import com.yiring.app.param.location.rule.*;
import com.yiring.app.util.TimeUtil;
import com.yiring.app.vo.location.fence.LocationFenceJobVo;
import com.yiring.common.core.Result;
......@@ -47,6 +44,9 @@ public class AllowEntranceStrategy implements IParamInitStrategy<LocationFenceRu
if (CollectionUtils.isEmpty(timeAndUser)) {
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一条允许进入人员的规则");
}
if (timeAndUser.size() == 1 && CollectionUtils.isEmpty(timeAndUser.get(0).getTime())) {
param.getRuleParam().setTimeAndUserAll();
}
for (TimeAndUserParam item : timeAndUser) {
if (CollectionUtils.isEmpty(item.getUser())) {
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一个允许进入的人员");
......@@ -71,9 +71,13 @@ public class AllowEntranceStrategy implements IParamInitStrategy<LocationFenceRu
TimeAndUserParam timeAndUserParam = null;
//筛选在当前时间生效的配置
for (TimeAndUserParam item : timeAndUserParamList) {
if (TimeUtil.judgeTime(LocalDateTime.now(), item.getBeginTime(), item.getEndTime())) {
timeAndUserParam = item;
break;
if (TimeUtil.judgeWeek(LocalDateTime.now(), item.getWeek())) {
for (TimeParam time : item.getTime()) {
if (TimeUtil.judgeTime(LocalDateTime.now(), time.getBeginTime(), time.getEndTome())) {
timeAndUserParam = item;
break;
}
}
}
}
//如果不在配置的时间内,则将报警记录中的状态刷新为结束,并且需要添加的报警为空
......
......@@ -7,10 +7,7 @@ import com.yiring.app.design.strategy.IScanAlarmStrategy;
import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.domain.location.*;
import com.yiring.app.param.location.fence.LocationFenceJobParam;
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.app.param.location.rule.*;
import com.yiring.app.util.TimeUtil;
import com.yiring.app.vo.location.fence.LocationFenceJobVo;
import com.yiring.common.core.Result;
......@@ -50,13 +47,12 @@ public class MaxPeopleNumberStrategy implements IParamInitStrategy<LocationFence
if (CollectionUtils.isEmpty(timeAndNumber)) {
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一条最多人数的规则");
}
if (timeAndNumber.size() == 1 && CollectionUtils.isEmpty(timeAndNumber.get(0).getTime())) {
param.getRuleParam().setTimeAndNumberAll();
}
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);
Result.no(Status.EXPECTATION_FAILED, "最大人数不能空或小于零");
}
}
//将时间和距离都设为-1
......@@ -78,11 +74,19 @@ public class MaxPeopleNumberStrategy implements IParamInitStrategy<LocationFence
LocationFenceJobVo jobVo = new LocationFenceJobVo();
List<TimeAndNumberParam> timeAndNumberParamList = rule.getTimeAndNumber();
TimeAndNumberParam timeAndNumberParam = null;
StringBuilder begin = new StringBuilder();
StringBuilder end = new StringBuilder();
//筛选在当前时间生效的配置
for (TimeAndNumberParam item : timeAndNumberParamList) {
if (TimeUtil.judgeTime(LocalDateTime.now(), item.getBeginTime(), item.getEndTime())) {
timeAndNumberParam = item;
break;
if (TimeUtil.judgeWeek(LocalDateTime.now(), item.getWeek())) {
for (TimeParam time : item.getTime()) {
if (TimeUtil.judgeTime(LocalDateTime.now(), time.getBeginTime(), time.getEndTome())) {
begin.append(item.getWeek()).append(" ").append(time.getBeginTime());
end.append(item.getWeek()).append(" ").append(time.getEndTome());
timeAndNumberParam = item;
break;
}
}
}
}
//如果现在不在配置的时间内,或围栏中的人少于配置的最大人数,则将报警记录中的状态刷新为结束,并且需要添加的报警为空
......@@ -94,14 +98,12 @@ public class MaxPeopleNumberStrategy implements IParamInitStrategy<LocationFence
int exceed = tagSet.size() - timeAndNumberParam.getNumber();
List<LocationFenceAlarm> newAlarms = new ArrayList<>();
//查询围栏内人员进入时的信息
String beginTime = timeAndNumberParam.getBeginTime();
String endTime = timeAndNumberParam.getEndTime();
List<LocationTurnover> turnoverList = locationTurnoverRepository.withinFence(fenceId, true);
//筛选出在配置时间段内进入的进出信息
turnoverList =
turnoverList
.stream()
.filter(e -> TimeUtil.judgeTime(e.getTime(), beginTime, endTime))
.filter(e -> TimeUtil.judgeWeekTime(e.getTime(), begin.toString(), end.toString()))
.sorted(Comparator.comparing(LocationTurnover::getTime).reversed())
.collect(Collectors.toList());
//记录触发报警的信息(例如最大人数是3,那么前三个员工进入的不会记录)
......
......@@ -7,10 +7,7 @@ import com.yiring.app.design.strategy.IScanAlarmStrategy;
import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.domain.location.*;
import com.yiring.app.param.location.fence.LocationFenceJobParam;
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.app.param.location.rule.*;
import com.yiring.app.util.TimeUtil;
import com.yiring.app.vo.location.fence.LocationFenceJobVo;
import com.yiring.common.core.Result;
......@@ -48,15 +45,14 @@ public class MinPeopleNumberStrategy implements IParamInitStrategy<LocationFence
RuleParam ruleParam = param.getRuleParam();
List<TimeAndNumberParam> timeAndNumber = ruleParam.getTimeAndNumber();
if (CollectionUtils.isEmpty(timeAndNumber)) {
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一条最小人数的规则");
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一条最少人数的规则");
}
if (timeAndNumber.size() == 1 && CollectionUtils.isEmpty(timeAndNumber.get(0).getTime())) {
param.getRuleParam().setTimeAndNumberAll();
}
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);
Result.no(Status.EXPECTATION_FAILED, "最大人数不能空或小于零");
}
}
//将时间和距离都设为-1
......@@ -78,11 +74,19 @@ public class MinPeopleNumberStrategy implements IParamInitStrategy<LocationFence
LocationFenceJobVo jobVo = new LocationFenceJobVo();
List<TimeAndNumberParam> timeAndNumberParamList = rule.getTimeAndNumber();
TimeAndNumberParam timeAndNumberParam = null;
StringBuilder begin = new StringBuilder();
StringBuilder end = new StringBuilder();
//筛选在当前时间生效的配置
for (TimeAndNumberParam item : timeAndNumberParamList) {
if (TimeUtil.judgeTime(LocalDateTime.now(), item.getBeginTime(), item.getEndTime())) {
timeAndNumberParam = item;
break;
if (TimeUtil.judgeWeek(LocalDateTime.now(), item.getWeek())) {
for (TimeParam time : item.getTime()) {
if (TimeUtil.judgeTime(LocalDateTime.now(), time.getBeginTime(), time.getEndTome())) {
begin.append(item.getWeek()).append(" ").append(time.getBeginTime());
end.append(item.getWeek()).append(" ").append(time.getEndTome());
timeAndNumberParam = item;
break;
}
}
}
}
//如果现在不在配置的时间内,或围栏中的人大于配置的最小人数,则将报警记录中的状态刷新为结束,并且需要添加的报警为空
......@@ -94,14 +98,12 @@ public class MinPeopleNumberStrategy implements IParamInitStrategy<LocationFence
int missing = timeAndNumberParam.getNumber() - tagSet.size();
List<LocationFenceAlarm> newAlarms = new ArrayList<>();
//查询员工’出‘这个围栏的进出信息
String beginTime = timeAndNumberParam.getBeginTime();
String endTime = timeAndNumberParam.getEndTime();
List<LocationTurnover> turnoverList = locationTurnoverRepository.withinFence(fenceId, false);
//筛选出在配置时间段内’出‘这个围栏的进出信息
turnoverList =
turnoverList
.stream()
.filter(e -> TimeUtil.judgeTime(e.getTime(), beginTime, endTime))
.filter(e -> TimeUtil.judgeWeekTime(e.getTime(), begin.toString(), end.toString()))
.sorted(Comparator.comparing(LocationTurnover::getTime).reversed())
.collect(Collectors.toList());
//记录触发报警的信息(例如最小人数是3,这段时间一开始有6个人在围栏,然后出去的4个,那么只有第四个人出去才会记录)
......
......@@ -7,10 +7,7 @@ import com.yiring.app.design.strategy.IScanAlarmStrategy;
import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.domain.location.*;
import com.yiring.app.param.location.fence.LocationFenceJobParam;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.app.param.location.rule.RelevanceUserParam;
import com.yiring.app.param.location.rule.RuleParam;
import com.yiring.app.param.location.rule.TimeAndUserParam;
import com.yiring.app.param.location.rule.*;
import com.yiring.app.util.TimeUtil;
import com.yiring.app.vo.location.fence.LocationFenceJobVo;
import com.yiring.common.core.Result;
......@@ -50,6 +47,9 @@ public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRu
if (CollectionUtils.isEmpty(timeAndUser)) {
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一条不允许离开人员的规则");
}
if (timeAndUser.size() == 1 && CollectionUtils.isEmpty(timeAndUser.get(0).getTime())) {
param.getRuleParam().setTimeAndUserAll();
}
for (TimeAndUserParam item : timeAndUser) {
if (CollectionUtils.isEmpty(item.getUser())) {
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一个不允许离开的人员");
......@@ -72,11 +72,19 @@ public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRu
LocationFenceJobVo jobVo = new LocationFenceJobVo();
List<TimeAndUserParam> timeAndUserParamList = rule.getTimeAndUser();
TimeAndUserParam timeAndUserParam = null;
StringBuilder begin = new StringBuilder();
StringBuilder end = new StringBuilder();
//筛选在当前时间生效的配置
for (TimeAndUserParam item : timeAndUserParamList) {
if (TimeUtil.judgeTime(LocalDateTime.now(), item.getBeginTime(), item.getEndTime())) {
timeAndUserParam = item;
break;
if (TimeUtil.judgeWeek(LocalDateTime.now(), item.getWeek())) {
for (TimeParam time : item.getTime()) {
if (TimeUtil.judgeTime(LocalDateTime.now(), time.getBeginTime(), time.getEndTome())) {
begin.append(item.getWeek()).append(" ").append(time.getBeginTime());
end.append(item.getWeek()).append(" ").append(time.getEndTome());
timeAndUserParam = item;
break;
}
}
}
}
//如果不在配置的时间内,则将报警记录中的状态刷新为结束,并且需要添加的报警为空
......@@ -84,15 +92,13 @@ public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRu
jobVo.setModifyAlarm(oldAlarms);
return jobVo;
}
String beginTime = timeAndUserParam.getBeginTime();
String endTime = timeAndUserParam.getEndTime();
//筛选出在配置时间段内出这个围栏的进出信息
List<LocationTurnover> turnoverList = locationTurnoverRepository.withinFence(fenceId, false);
//筛选出在配置时间段内出这个围栏的进出信息
turnoverList =
turnoverList
.stream()
.filter(e -> TimeUtil.judgeTime(e.getTime(), beginTime, endTime))
.filter(e -> TimeUtil.judgeTime(e.getTime(), begin.toString(), end.toString()))
.sorted(Comparator.comparing(LocationTurnover::getTime).reversed())
.collect(Collectors.toList());
//筛选出离开围栏的人员是不允许离开的人员
......
......@@ -53,6 +53,7 @@ public class LocationFenceRule extends BasicEntity implements Serializable {
private Integer relevanceParamType;
@Comment("规则,用json存入")
@Column(columnDefinition = "text")
private String rule;
@Comment(value = "是否删除")
......
......@@ -2,6 +2,7 @@
package com.yiring.app.domain.location;
import java.io.Serializable;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
......@@ -13,4 +14,11 @@ import org.springframework.stereotype.Repository;
*/
@Repository
public interface LocationFenceRuleRepository
extends JpaRepository<LocationFenceRule, Serializable>, JpaSpecificationExecutor<LocationFenceRule> {}
extends JpaRepository<LocationFenceRule, Serializable>, JpaSpecificationExecutor<LocationFenceRule> {
/**
* 根据围栏id查询规则
* @param fence 围栏id
* @return 规则
*/
List<LocationFenceRule> findAllByFence(LocationFence fence);
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.risk;
import com.yiring.common.domain.BasicEntity;
import java.io.Serial;
import java.io.Serializable;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants;
import org.hibernate.annotations.Comment;
import org.locationtech.jts.geom.Point;
/**
* @author tml
* @version 1.0
* @date 2022/5/20 17:19
*/
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@FieldDefaults(level = AccessLevel.PRIVATE)
@Entity
@Table(name = "BS_RISK_WARN", uniqueConstraints = @UniqueConstraint(columnNames = { "locationNum" }))
@Comment("风险预警")
public class RiskWarn extends BasicEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1345477064611048638L;
//todo 工区
@Comment("安装位置")
private String install;
@Comment("经纬度")
@Column(columnDefinition = "geometry(Point,4326)")
private Point point;
@Comment("监控参数")
private String monitoring;
@Comment("位号")
private String locationNum;
@Comment("量程起始值")
private Integer min;
@Comment("量程结束值")
private Integer max;
@Comment("量程单位")
private String unit;
@Comment("启用")
private Boolean enable;
/*@Builder.Default
@OneToMany(mappedBy = "riskWarn")
@ToString.Exclude
private Set<Threshold> thresholds = new HashSet<>();*/
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.risk;
import com.yiring.common.domain.BasicEntity;
import java.io.Serial;
import java.io.Serializable;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants;
import org.hibernate.annotations.Comment;
/**
* @author tml
* @version 1.0
* @date 2022/5/20 17:42
*/
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@FieldDefaults(level = AccessLevel.PRIVATE)
@Entity
@Table(name = "BS_THRESHOLD")
@Comment("风险预警下的阈值设置")
public class Threshold extends BasicEntity implements Serializable {
@Serial
private static final long serialVersionUID = 5075164198170220832L;
@ManyToOne
@JoinColumn(name = "risk_warn_id")
@Comment("风险预警")
private RiskWarn riskWarn;
@Comment("阈值区间起始值")
private Integer min;
@Comment("阈值区间结束值")
private Integer max;
}
......@@ -45,7 +45,11 @@ public class LocationFenceRuleAddParam implements Serializable {
@NotNull(message = "所属的报警类别id不能为空")
private Long alarmTypeId;
@ApiModelProperty(value = "设置的关联参数类型", example = "1", required = true)
@ApiModelProperty(
value = "设置的关联参数类型:1-最多人数,2-最少人数,3-允许进入人员,4-不允许离开人员,5-静止时长,6-滞留时长,7-触发报警距离",
example = "1",
required = true
)
@NotNull(message = "所属的关联参数类别不能为空")
@Range(min = RelevanceParamEnum.MIN, max = RelevanceParamEnum.MAX, message = "关联参数类别异常")
private Integer relevanceParamType;
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.rule;
import com.yiring.app.util.TimeUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
......@@ -48,4 +52,29 @@ public class RuleParam implements Serializable {
private List<TimeAndNumberParam> timeAndNumber;
private List<TimeAndUserParam> timeAndUser;
/**
* 设置全时间生效
*/
public void setTimeAndNumberAll() {
Integer number = timeAndNumber.get(0).getNumber();
HashSet<TimeParam> set = new HashSet<>();
TimeParam timeParam = TimeParam.builder().beginTime("00:00:00").endTome("23:59:59").build();
timeAndNumber =
TimeUtil.WEEK
.stream()
.map(e -> TimeAndNumberParam.builder().week(e).number(number).time(set).build())
.collect(Collectors.toList());
}
public void setTimeAndUserAll() {
Set<RelevanceUserParam> user = timeAndUser.get(0).getUser();
HashSet<TimeParam> set = new HashSet<>();
TimeParam timeParam = TimeParam.builder().beginTime("00:00:00").endTome("23:59:59").build();
timeAndUser =
TimeUtil.WEEK
.stream()
.map(e -> TimeAndUserParam.builder().week(e).user(user).time(set).build())
.collect(Collectors.toList());
}
}
......@@ -6,6 +6,7 @@ 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;
......@@ -27,13 +28,11 @@ public class TimeAndNumberParam implements Serializable {
@Serial
private static final long serialVersionUID = -6796977663003158881L;
@ApiModelProperty(value = "起始时间", example = "星期一 08:00:00")
@ApiModelProperty(value = "星期", example = "星期一")
@Pattern(regexp = RegEx.TIME_RULE, message = "时间格式不正确")
private String beginTime;
private String week;
@ApiModelProperty(value = "终止时间", example = "星期一 18:00:00")
@Pattern(regexp = RegEx.TIME_RULE, message = "时间格式不正确")
private String endTime;
private Set<TimeParam> time;
@ApiModelProperty(value = "人数", example = "100")
private Integer number;
......
......@@ -28,13 +28,11 @@ public class TimeAndUserParam implements Serializable {
@Serial
private static final long serialVersionUID = -7037620599825901175L;
@ApiModelProperty(value = "起始时间", example = "星期一 08:00:00")
@ApiModelProperty(value = "星期", example = "星期一")
@Pattern(regexp = RegEx.TIME_RULE, message = "时间格式不正确")
private String beginTime;
private String week;
@ApiModelProperty(value = "终止时间", example = "星期一 18:00:00")
@Pattern(regexp = RegEx.TIME_RULE, message = "时间格式不正确")
private String endTime;
private Set<TimeParam> time;
private Set<RelevanceUserParam> user;
}
/* (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/5/23 10:08
*/
@ApiModel("TimeParam")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TimeParam implements Serializable {
@Serial
private static final long serialVersionUID = 3657642913058744140L;
@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 endTome;
}
......@@ -6,6 +6,7 @@ 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;
import com.yiring.common.vo.PageVo;
/**
* @author tml
......@@ -40,4 +41,11 @@ public interface LocationFenceRuleService {
* @return 规则信息
*/
Result<LocationFenceRuleVo> findRule(IdParam idParam);
/**
* 根据围栏id查询报警信息
* @param idParam 围栏id
* @return 规则信息
*/
Result<PageVo<LocationFenceRuleVo>> findByFenceId(IdParam idParam);
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.location.rule.impl;
import com.yiring.app.domain.location.LocationFence;
import com.yiring.app.domain.location.LocationFenceRule;
import com.yiring.app.domain.location.LocationFenceRuleRepository;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
......@@ -11,7 +12,10 @@ 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 com.yiring.common.vo.PageVo;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
......@@ -62,9 +66,21 @@ public class LocationFenceRuleServiceImpl implements LocationFenceRuleService {
public Result<LocationFenceRuleVo> findRule(IdParam idParam) {
Optional<LocationFenceRule> optional = locationFenceRuleRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要删除的规则不存在");
return Result.no(Status.EXPECTATION_FAILED, "要查询的规则不存在");
}
LocationFenceRuleVo ruleVo = LocationFenceRuleVo.transform(optional.get());
return Result.ok(ruleVo);
}
@Override
public Result<PageVo<LocationFenceRuleVo>> findByFenceId(IdParam idParam) {
LocationFence fence = LocationFence.builder().id(idParam.getId()).build();
List<LocationFenceRule> ruleList = locationFenceRuleRepository.findAllByFence(fence);
List<LocationFenceRuleVo> voList = ruleList
.stream()
.map(LocationFenceRuleVo::transform)
.collect(Collectors.toList());
PageVo<LocationFenceRuleVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo);
}
}
......@@ -4,6 +4,8 @@ package com.yiring.app.util;
import com.yiring.common.constant.RegEx;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
/**
* @author tml
......@@ -12,6 +14,18 @@ import java.time.format.DateTimeFormatter;
*/
public class TimeUtil {
public static final List<String> WEEK = new ArrayList<>();
static {
WEEK.add("星期一");
WEEK.add("星期二");
WEEK.add("星期三");
WEEK.add("星期四");
WEEK.add("星期五");
WEEK.add("星期六");
WEEK.add("星期日");
}
/**
* 判断一个时间是否在配置的时间内
* @param time 判断的时间
......@@ -19,8 +33,8 @@ public class TimeUtil {
* @param endTime 配置的结束时间
* @return true:在 false:不在
*/
public static boolean judgeTime(LocalDateTime time, String beginTime, String endTime) {
if (!beginTime.matches(RegEx.TIME_RULE) || !endTime.matches(RegEx.TIME_RULE)) {
public static boolean judgeWeekTime(LocalDateTime time, String beginTime, String endTime) {
if (!beginTime.matches(RegEx.WEEK_TIME_RULE) || !endTime.matches(RegEx.WEEK_TIME_RULE)) {
throw new IllegalArgumentException("时间格式不正确");
}
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("E HH:mm:ss");
......@@ -50,6 +64,42 @@ public class TimeUtil {
return now >= begin && now <= end;
}
public static boolean judgeWeek(LocalDateTime time, String week) {
if (week.matches(RegEx.WEEK_RULE)) {
throw new IllegalArgumentException("星期格式不正确");
}
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("E");
String timeFormat = time.format(pattern);
char a = timeFormat.charAt(1);
char b = week.charAt(2);
return a == b;
}
public static boolean judgeTime(LocalDateTime time, String beginTime, String endTime) {
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("HH:mm:ss");
String source = time.format(pattern);
String beginHour = beginTime.substring(0, 2);
String endHour = endTime.substring(0, 2);
String nowHour = source.substring(0, 2);
String beginMinute = beginTime.substring(3, 5);
String endMinute = endTime.substring(3, 5);
String nowMinute = source.substring(3, 5);
String beginSecond = beginTime.substring(6);
String endSecond = endTime.substring(6);
String nowSecond = source.substring(6);
String beginString = beginHour + beginMinute + beginSecond;
String endString = endHour + endMinute + endSecond;
String nowString = nowHour + nowMinute + nowSecond;
int begin = Integer.parseInt(beginString);
int end = Integer.parseInt(endString);
int now = Integer.parseInt(nowString);
return now >= begin && now <= end;
}
private static int transform(char source) {
return switch (source) {
case '一' -> 1;
......
......@@ -45,6 +45,10 @@ public class LocationFenceVo implements Serializable {
@ApiModelProperty(value = "地图名称")
private String mapName;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "摄像头id")
private Long videoId;
@ApiModelProperty(value = "摄像头名称")
private String videoName;
......@@ -77,6 +81,7 @@ public class LocationFenceVo implements Serializable {
.id(locationFence.getId())
.name(locationFence.getName())
.mapName(locationFence.getMapName())
.videoId(locationFence.getVideo().getId())
.videoName(locationFence.getVideo().getVideoName())
.fenceType(locationFence.getFenceType())
.fenceTypeName(FenceTypeEnum.getByCode(locationFence.getFenceType()))
......
......@@ -52,8 +52,11 @@ public class LocationFenceRuleVo implements Serializable {
@ApiModelProperty(value = "所属的报警类别id", example = "1", required = true)
private Long alarmTypeId;
@ApiModelProperty(value = "所属的报警类别名称", example = "超员报警", required = true)
private String alarmTypeName;
@ApiModelProperty(
value = "设置的关联参数类型(1:最大人数,2:最小人数,3:允许进入人员,4:不允许离开人员,5:静止时长(分钟),6:滞留时长(分钟),7:触发报警距离)",
value = "设置的关联参数类型:1-最多人数,2-最少人数,3-允许进入人员,4-不允许离开人员,5-静止时长,6-滞留时长,7-触发报警距离",
example = "1",
required = true
)
......@@ -75,6 +78,7 @@ public class LocationFenceRuleVo implements Serializable {
.fenceType(locationFenceRule.getFence().getFenceType())
.fenceTypeName(FenceTypeEnum.getByCode(locationFenceRule.getFence().getFenceType()))
.alarmTypeId(locationFenceRule.getAlarmType().getId())
.alarmTypeName(locationFenceRule.getAlarmType().getName())
.relevanceParamType(locationFenceRule.getRelevanceParamType())
.relevanceParamTypeName(RelevanceParamEnum.getByCode(locationFenceRule.getRelevanceParamType()))
.ruleVo(ruleVo)
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.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;
......@@ -25,11 +28,11 @@ public class TimeAndNumberVo implements Serializable {
@Serial
private static final long serialVersionUID = -6796977663003158881L;
@ApiModelProperty(value = "起始时间", example = "星期一 08:00:00")
private String beginTime;
@ApiModelProperty(value = "星期", example = "星期一")
@Pattern(regexp = RegEx.TIME_RULE, message = "时间格式不正确")
private String week;
@ApiModelProperty(value = "终止时间", example = "星期一 18:00:00")
private String endTime;
private Set<TimeVo> time;
@ApiModelProperty(value = "人数", example = "100")
private Integer number;
......
......@@ -7,7 +7,6 @@ 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;
......@@ -20,7 +19,6 @@ import lombok.experimental.SuperBuilder;
@ApiModel("报警类型中的允许进入人员或不允许离开人员")
@Data
@SuperBuilder(toBuilder = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TimeAndUserVo implements Serializable {
......@@ -28,11 +26,10 @@ public class TimeAndUserVo implements Serializable {
@Serial
private static final long serialVersionUID = -7037620599825901175L;
@ApiModelProperty(value = "起始时间", example = "星期一 08:00:00")
private String beginTime;
@ApiModelProperty(value = "星期", example = "星期一")
private String week;
@ApiModelProperty(value = "终止时间", example = "星期一 18:00:00")
private String endTime;
private Set<TimeVo> time;
private Set<RelevanceUserVo> user;
}
/* (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/5/23 11:53
*/
@ApiModel("TimeVo")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TimeVo implements Serializable {
@Serial
private static final long serialVersionUID = -3275638425715878794L;
@ApiModelProperty(value = "起始时间", example = "08:00:00")
private String beginTime;
@ApiModelProperty(value = "终止时间", example = "18:00:00")
private String endTome;
}
......@@ -9,15 +9,13 @@ 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 com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.validation.Valid;
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;
import org.springframework.web.bind.annotation.*;
/**
* @author tml
......@@ -66,4 +64,10 @@ public class LocationFenceRuleController {
public Result<LocationFenceRuleVo> findRule(@Valid IdParam idParam) {
return locationFenceRuleService.findRule(idParam);
}
@ApiOperation("根据围栏id查询报警规则")
@GetMapping("/findByFenceId")
public Result<PageVo<LocationFenceRuleVo>> findByFenceId(@Valid IdParam idParam) {
return locationFenceRuleService.findByFenceId(idParam);
}
}
......@@ -26,7 +26,11 @@ public class RegEx {
/**
* 报警规则的时间格式
*/
public static final String TIME_RULE = "^星期[一二三四五六日]\\ (2[0-4]|[0-1]\\d)(\\:[0-5]\\d){2}$";
public static final String WEEK_TIME_RULE = "^星期[一二三四五六日]\\ (2[0-4]|[0-1]\\d)(\\:[0-5]\\d){2}$";
public static final String TIME_RULE = "^(2[0-4]|[0-1]\\d)(\\:[0-5]\\d){2}$";
public static final String WEEK_RULE = "^星期[一二三四五六日]$";
public static final String COLOUR_RGB = "^#(\\d|[A-F a-f]){6}$";
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论