提交 31bc9e8a 作者: 17607474349

Merge remote-tracking branch 'origin/dev_tml' into dev_lijing

...@@ -67,7 +67,7 @@ public enum FenceTypeEnum { ...@@ -67,7 +67,7 @@ public enum FenceTypeEnum {
} }
} }
} }
return "未知围栏类别"; throw new RuntimeException("FenceTypeEnum获取未知围栏类别");
} }
/** /**
......
...@@ -37,7 +37,7 @@ public enum InformMannerEnum { ...@@ -37,7 +37,7 @@ public enum InformMannerEnum {
private static final List<CodeNameVo> LIST; private static final List<CodeNameVo> LIST;
static { static {
LIST = new ArrayList<CodeNameVo>(); LIST = new ArrayList<>();
for (InformMannerEnum item : values()) { for (InformMannerEnum item : values()) {
LIST.add(new CodeNameVo(item.code, item.name)); LIST.add(new CodeNameVo(item.code, item.name));
} }
...@@ -54,7 +54,7 @@ public enum InformMannerEnum { ...@@ -54,7 +54,7 @@ public enum InformMannerEnum {
return item.getName(); return item.getName();
} }
} }
return "未知通知类型"; throw new RuntimeException("InformMannerEnum获取未知通知类型");
} }
public static List<CodeNameVo> getAll() { public static List<CodeNameVo> getAll() {
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.constant.alarm;
import com.yiring.app.vo.CodeNameVo;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
/**
* 接受状态枚举
* @author tml
* @version 1.0
* @date 2022/5/18 9:37
*/
public enum ReceiveStatusEnum {
/**
* 成功
*/
SUCCESS(1, "成功"),
/**
* 失败
*/
FAIL(2, "失败");
private static final List<CodeNameVo> LIST;
static {
LIST = new ArrayList<>();
for (ReceiveStatusEnum item : values()) {
LIST.add(new CodeNameVo(item.getCode(), item.name));
}
}
@Getter
private final int code;
@Getter
private final String name;
ReceiveStatusEnum(Integer code, String name) {
this.code = code;
this.name = name;
}
public static String getByCode(int code) {
for (ReceiveStatusEnum item : values()) {
if (item.code == code) {
return item.getName();
}
}
throw new RuntimeException("ReceiveStatusEnum获取未知状态");
}
public static List<CodeNameVo> findAll() {
return LIST;
}
}
...@@ -87,7 +87,7 @@ public enum RelevanceParamEnum { ...@@ -87,7 +87,7 @@ public enum RelevanceParamEnum {
} }
} }
} }
return "未知关联参数"; throw new RuntimeException("RelevanceParamEnum获取未知关联参数");
} }
/** /**
......
...@@ -58,6 +58,6 @@ public enum RehearsalPlanStatusEnum { ...@@ -58,6 +58,6 @@ public enum RehearsalPlanStatusEnum {
return item.getName(); return item.getName();
} }
} }
return "未知状态"; throw new RuntimeException("RehearsalPlanStatusEnum获取异常状态");
} }
} }
...@@ -63,6 +63,6 @@ public enum RiskLevelEnum { ...@@ -63,6 +63,6 @@ public enum RiskLevelEnum {
return item.getName(); return item.getName();
} }
} }
return "未知风险"; throw new RuntimeException("RiskLevelEnum获取未知风险");
} }
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.constant.risk;
import com.yiring.app.excel.risk.RiskWarnExcel;
import java.util.ArrayList;
import java.util.List;
/**
* @author tml
* @version 1.0
* @date 2022/5/24 16:32
*/
public class TemplateList {
private static final List<RiskWarnExcel> LIST = new ArrayList<>();
static {
LIST.add(
RiskWarnExcel
.builder()
.workAreaName("BTC产品库房")
.point("112.863173604639,30.4786075211555,0")
.install("产品库房北侧中间立柱东1")
.monitoring("有毒气体报警器")
.locationNum("AT-4736")
.range("0-1.6")
.unit("ppm")
.lowLow("0.15")
.low("0.2")
.high("0.5")
.highHigh("0.55")
.flame("")
.remark("注意:工区、安装位置、监控参数、位号为必填,导入时备注这一列可以删除")
.build()
);
LIST.add(
RiskWarnExcel
.builder()
.workAreaName("计量槽")
.point("112.863173604639,30.4786075211555,0")
.install("1号槽液位")
.monitoring("液位")
.locationNum("PI-2107A")
.range("-27.18-7.32KPa")
.unit("ppm")
.lowLow("3%")
.low("5%")
.high("70%")
.highHigh("73%")
.flame("")
.remark("注意:区间要么都为百分比要么都不为百分比")
.build()
);
LIST.add(
RiskWarnExcel
.builder()
.workAreaName("合成盐酸")
.point("112.863173604639,30.4786075211555,0")
.install("1号炉一楼")
.monitoring("火焰检测")
.locationNum("BSA-1401A")
.range("")
.unit("")
.lowLow("")
.low("")
.high("")
.highHigh("")
.flame("1")
.remark("注意:火焰检测在报警值(熄灭)这里添加预警值,等于这个数值时显示熄灭")
.build()
);
}
public static List<RiskWarnExcel> getTemplateList() {
return LIST;
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.constant.risk;
import com.yiring.app.vo.CodeNameVo;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
/**
* @author tml
* @version 1.0
* @date 2022/5/23 17:01
*/
public enum ThresholdStatusEnum {
/**
* 低低
*/
LOW_LOW(1, "低低"),
/**
* 低
*/
LOW(2, "低"),
/**
* 高
*/
HIGH(3, "高"),
/**
* 高高
*/
HIGH_HIGH(4, "高高"),
/**
* 熄灭
*/
FLAME_EXTINGUISH(5, "熄灭");
@Getter
private final Integer code;
@Getter
private final String name;
private static final List<CodeNameVo> LIST = new ArrayList<>();
static {
for (ThresholdStatusEnum item : values()) {
LIST.add(new CodeNameVo(item.code, item.name));
}
}
ThresholdStatusEnum(Integer code, String name) {
this.code = code;
this.name = name;
}
public static String getByCode(Integer code) {
for (ThresholdStatusEnum item : values()) {
if (item.code.equals(code)) {
return item.getName();
}
}
throw new RuntimeException("ThresholdStatus获取异常状态");
}
public static List<CodeNameVo> getAll() {
return LIST;
}
}
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.design.strategy; package com.yiring.app.design.strategy;
import com.yiring.app.domain.location.LocationFenceAlarm;
import com.yiring.app.param.location.fence.LocationFenceJobParam; import com.yiring.app.param.location.fence.LocationFenceJobParam;
import com.yiring.app.vo.location.fence.LocationFenceJobVo; import com.yiring.app.vo.location.fence.LocationFenceJobVo;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.util.CollectionUtils;
/** /**
* 扫描是否满足报警策略 * 扫描是否满足报警策略
...@@ -18,4 +23,27 @@ public interface IScanAlarmStrategy { ...@@ -18,4 +23,27 @@ public interface IScanAlarmStrategy {
* @return 需要报警的报警信息 * @return 需要报警的报警信息
*/ */
LocationFenceJobVo scanAlarm(LocationFenceJobParam param); LocationFenceJobVo scanAlarm(LocationFenceJobParam param);
/**
* 将两个集合不相交的部分筛选出来,并封装到结果集
* @param newAlarms 集合1
* @param oldAlarms 集合2
* @param jobVo 结果集
*/
static void notIntersect(
List<LocationFenceAlarm> newAlarms,
List<LocationFenceAlarm> oldAlarms,
LocationFenceJobVo jobVo
) {
if (!CollectionUtils.isEmpty(oldAlarms)) {
Set<Long> newSet = newAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
Set<Long> oldSet = oldAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
newAlarms =
newAlarms.stream().filter(e -> !oldSet.contains(e.getTag().getId())).collect(Collectors.toList());
oldAlarms =
oldAlarms.stream().filter(e -> !newSet.contains(e.getTag().getId())).collect(Collectors.toList());
}
jobVo.setAddAlarm(newAlarms);
jobVo.setModifyAlarm(oldAlarms);
}
} }
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.design.strategy.fence; package com.yiring.app.design.strategy.fence;
import com.yiring.app.constant.alarm.RelevanceParamEnum; import com.yiring.app.constant.alarm.FenceTypeEnum;
import com.yiring.app.design.strategy.IParamInitStrategy; import com.yiring.app.design.strategy.IParamInitStrategy;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam; import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/** /**
* 重大危险源
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/29 11:08 * @date 2022/4/29 11:08
...@@ -16,7 +17,7 @@ import org.springframework.stereotype.Component; ...@@ -16,7 +17,7 @@ import org.springframework.stereotype.Component;
public class DangerousStrategy implements IParamInitStrategy<LocationFenceRuleAddParam> { public class DangerousStrategy implements IParamInitStrategy<LocationFenceRuleAddParam> {
public DangerousStrategy() { public DangerousStrategy() {
Integer fenceType = RelevanceParamEnum.MAX_PEOPLE_NUMBER.getCode(); Integer fenceType = FenceTypeEnum.DANGEROUS.getCode();
LocationFenceTypeContext.register(fenceType, this); LocationFenceTypeContext.register(fenceType, this);
} }
......
...@@ -9,19 +9,19 @@ import com.yiring.app.domain.location.LocationFence; ...@@ -9,19 +9,19 @@ import com.yiring.app.domain.location.LocationFence;
import com.yiring.app.domain.location.LocationFenceAlarm; import com.yiring.app.domain.location.LocationFenceAlarm;
import com.yiring.app.domain.location.LocationTag; import com.yiring.app.domain.location.LocationTag;
import com.yiring.app.param.location.fence.LocationFenceJobParam; import com.yiring.app.param.location.fence.LocationFenceJobParam;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam; import com.yiring.app.param.location.rule.*;
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.util.TimeUtil; import com.yiring.app.util.TimeUtil;
import com.yiring.app.vo.location.fence.LocationFenceJobVo; import com.yiring.app.vo.location.fence.LocationFenceJobVo;
import com.yiring.auth.domain.user.User;
import com.yiring.auth.domain.user.UserRepository;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.core.Status; import com.yiring.common.core.Status;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.persistence.criteria.CriteriaBuilder;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
...@@ -34,9 +34,13 @@ import org.springframework.util.CollectionUtils; ...@@ -34,9 +34,13 @@ import org.springframework.util.CollectionUtils;
@Component @Component
public class AllowEntranceStrategy implements IParamInitStrategy<LocationFenceRuleAddParam>, IScanAlarmStrategy { public class AllowEntranceStrategy implements IParamInitStrategy<LocationFenceRuleAddParam>, IScanAlarmStrategy {
@Resource
private UserRepository userRepository;
public AllowEntranceStrategy() { public AllowEntranceStrategy() {
Integer relevanceParam = RelevanceParamEnum.ALLOW_ENTRANCE.getCode(); Integer relevanceParam = RelevanceParamEnum.ALLOW_ENTRANCE.getCode();
LocationFenceRuleContext.register(relevanceParam, this); LocationFenceRuleContext.register(relevanceParam, this);
ScanAlarmContext.register(relevanceParam, this);
} }
@Override @Override
...@@ -51,8 +55,48 @@ public class AllowEntranceStrategy implements IParamInitStrategy<LocationFenceRu ...@@ -51,8 +55,48 @@ public class AllowEntranceStrategy implements IParamInitStrategy<LocationFenceRu
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一个允许进入的人员"); return Result.no(Status.EXPECTATION_FAILED, "请至少配置一个允许进入的人员");
} }
} }
ruleParam.setDuration(-1); //如果只设置星期没有设置时间,则默认时间是全天
ruleParam.setDistance(-1); for (TimeAndUserParam item : timeAndUser) {
for (TimeParam time : item.getTime()) {
if (time.getWeek() != null) {
if (time.getBeginTime() == null) {
time.setBeginTime("00:00:00");
}
if (time.getEndTime() == null) {
time.setEndTime("23:59:59");
}
}
}
}
//检查配置的员工是否存在
Specification<User> specification = (root, query, criteriaBuilder) -> {
CriteriaBuilder.In<Object> in = criteriaBuilder.in(root.get(User.Fields.uuid));
HashSet<String> ids = new HashSet<>();
for (TimeAndUserParam item : timeAndUser) {
for (RelevanceUserParam userParam : item.getUser()) {
ids.add(userParam.getUuid());
}
}
for (String uuid : ids) {
in.value(uuid);
}
return criteriaBuilder.and(in);
};
Map<String, List<User>> map = userRepository
.findAll(specification)
.stream()
.collect(Collectors.groupingBy(User::getUuid));
for (TimeAndUserParam item : timeAndUser) {
for (RelevanceUserParam userParam : item.getUser()) {
List<User> list = map.get(userParam.getUuid());
if (CollectionUtils.isEmpty(list)) {
return Result.no(Status.EXPECTATION_FAILED, "工号为:" + userParam.getUuid() + "员工不存在");
}
userParam.setRealName(list.get(0).getRealName());
}
}
ruleParam.setDuration(null);
ruleParam.setDistance(null);
ruleParam.setTimeAndNumber(new ArrayList<>()); ruleParam.setTimeAndNumber(new ArrayList<>());
return Result.ok(); return Result.ok();
} }
...@@ -70,9 +114,13 @@ public class AllowEntranceStrategy implements IParamInitStrategy<LocationFenceRu ...@@ -70,9 +114,13 @@ public class AllowEntranceStrategy implements IParamInitStrategy<LocationFenceRu
TimeAndUserParam timeAndUserParam = null; TimeAndUserParam timeAndUserParam = null;
//筛选在当前时间生效的配置 //筛选在当前时间生效的配置
for (TimeAndUserParam item : timeAndUserParamList) { for (TimeAndUserParam item : timeAndUserParamList) {
if (TimeUtil.judgeTime(LocalDateTime.now(), item.getBeginTime(), item.getEndTime())) { for (TimeParam time : item.getTime()) {
timeAndUserParam = item; if (TimeUtil.judgeWeek(LocalDateTime.now(), time.getWeek())) {
break; if (TimeUtil.judgeTime(LocalDateTime.now(), time.getBeginTime(), time.getEndTime())) {
timeAndUserParam = item;
break;
}
}
} }
} }
//如果不在配置的时间内,则将报警记录中的状态刷新为结束,并且需要添加的报警为空 //如果不在配置的时间内,则将报警记录中的状态刷新为结束,并且需要添加的报警为空
...@@ -90,7 +138,7 @@ public class AllowEntranceStrategy implements IParamInitStrategy<LocationFenceRu ...@@ -90,7 +138,7 @@ public class AllowEntranceStrategy implements IParamInitStrategy<LocationFenceRu
.stream() .stream()
.filter(e -> !uuids.contains(e.getUser().getUuid())) .filter(e -> !uuids.contains(e.getUser().getUuid()))
.map(e -> { .map(e -> {
LocationFence fence = LocationFence.builder().id(fenceId).build(); LocationFence fence = LocationFence.builder().id(fenceId).name(param.getFenceName()).build();
AlarmType alarmType = AlarmType.builder().id(alarmTypeId).build(); AlarmType alarmType = AlarmType.builder().id(alarmTypeId).build();
return LocationFenceAlarm return LocationFenceAlarm
.builder() .builder()
...@@ -106,16 +154,7 @@ public class AllowEntranceStrategy implements IParamInitStrategy<LocationFenceRu ...@@ -106,16 +154,7 @@ public class AllowEntranceStrategy implements IParamInitStrategy<LocationFenceRu
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());
//取两个集合没有相交的部分,newAlarms不重合的部分代表需要添加的报警,oldAlarms不重合的部分代表需要结束的报警 //取两个集合没有相交的部分,newAlarms不重合的部分代表需要添加的报警,oldAlarms不重合的部分代表需要结束的报警
if (!CollectionUtils.isEmpty(oldAlarms)) { IScanAlarmStrategy.notIntersect(newAlarms, oldAlarms, jobVo);
Set<Long> newSet = newAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
Set<Long> oldSet = oldAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
newAlarms =
newAlarms.stream().filter(e -> !oldSet.contains(e.getTag().getId())).collect(Collectors.toList());
oldAlarms =
oldAlarms.stream().filter(e -> !newSet.contains(e.getTag().getId())).collect(Collectors.toList());
}
jobVo.setAddAlarm(newAlarms);
jobVo.setModifyAlarm(oldAlarms);
return jobVo; return jobVo;
} }
} }
...@@ -7,10 +7,7 @@ import com.yiring.app.design.strategy.IScanAlarmStrategy; ...@@ -7,10 +7,7 @@ import com.yiring.app.design.strategy.IScanAlarmStrategy;
import com.yiring.app.domain.alarm.AlarmType; import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.domain.location.*; import com.yiring.app.domain.location.*;
import com.yiring.app.param.location.fence.LocationFenceJobParam; import com.yiring.app.param.location.fence.LocationFenceJobParam;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam; import com.yiring.app.param.location.rule.*;
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.util.TimeUtil; import com.yiring.app.util.TimeUtil;
import com.yiring.app.vo.location.fence.LocationFenceJobVo; import com.yiring.app.vo.location.fence.LocationFenceJobVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
...@@ -52,16 +49,25 @@ public class MaxPeopleNumberStrategy implements IParamInitStrategy<LocationFence ...@@ -52,16 +49,25 @@ public class MaxPeopleNumberStrategy implements IParamInitStrategy<LocationFence
} }
for (TimeAndNumberParam item : timeAndNumber) { for (TimeAndNumberParam item : timeAndNumber) {
if (item.getNumber() == null || item.getNumber() < 0) { if (item.getNumber() == null || item.getNumber() < 0) {
item.setNumber(0); Result.no(Status.EXPECTATION_FAILED, "最大人数不能空或小于零");
} }
if (item.getBeginTime() == null || item.getEndTime() == null) { }
item.setBeginTime(null); //如果只设置星期没有设置时间,则默认时间是全天
item.setEndTime(null); for (TimeAndNumberParam item : timeAndNumber) {
for (TimeParam time : item.getTime()) {
if (time.getWeek() != null) {
if (time.getBeginTime() == null) {
time.setBeginTime("00:00:00");
}
if (time.getEndTime() == null) {
time.setEndTime("23:59:59");
}
}
} }
} }
//将时间和距离都设为-1 //将时间和距离都设为-1
ruleParam.setDuration(-1); ruleParam.setDuration(null);
ruleParam.setDistance(-1); ruleParam.setDistance(null);
ArrayList<TimeAndUserParam> list = new ArrayList<>(); ArrayList<TimeAndUserParam> list = new ArrayList<>();
ruleParam.setTimeAndUser(list); ruleParam.setTimeAndUser(list);
return Result.ok(); return Result.ok();
...@@ -78,11 +84,19 @@ public class MaxPeopleNumberStrategy implements IParamInitStrategy<LocationFence ...@@ -78,11 +84,19 @@ public class MaxPeopleNumberStrategy implements IParamInitStrategy<LocationFence
LocationFenceJobVo jobVo = new LocationFenceJobVo(); LocationFenceJobVo jobVo = new LocationFenceJobVo();
List<TimeAndNumberParam> timeAndNumberParamList = rule.getTimeAndNumber(); List<TimeAndNumberParam> timeAndNumberParamList = rule.getTimeAndNumber();
TimeAndNumberParam timeAndNumberParam = null; TimeAndNumberParam timeAndNumberParam = null;
StringBuilder begin = new StringBuilder();
StringBuilder end = new StringBuilder();
//筛选在当前时间生效的配置 //筛选在当前时间生效的配置
for (TimeAndNumberParam item : timeAndNumberParamList) { for (TimeAndNumberParam item : timeAndNumberParamList) {
if (TimeUtil.judgeTime(LocalDateTime.now(), item.getBeginTime(), item.getEndTime())) { for (TimeParam time : item.getTime()) {
timeAndNumberParam = item; if (TimeUtil.judgeWeek(LocalDateTime.now(), time.getWeek())) {
break; if (TimeUtil.judgeTime(LocalDateTime.now(), time.getBeginTime(), time.getEndTime())) {
begin.append(time.getWeek()).append(" ").append(time.getBeginTime());
end.append(time.getWeek()).append(" ").append(time.getEndTime());
timeAndNumberParam = item;
break;
}
}
} }
} }
//如果现在不在配置的时间内,或围栏中的人少于配置的最大人数,则将报警记录中的状态刷新为结束,并且需要添加的报警为空 //如果现在不在配置的时间内,或围栏中的人少于配置的最大人数,则将报警记录中的状态刷新为结束,并且需要添加的报警为空
...@@ -94,20 +108,18 @@ public class MaxPeopleNumberStrategy implements IParamInitStrategy<LocationFence ...@@ -94,20 +108,18 @@ public class MaxPeopleNumberStrategy implements IParamInitStrategy<LocationFence
int exceed = tagSet.size() - timeAndNumberParam.getNumber(); int exceed = tagSet.size() - timeAndNumberParam.getNumber();
List<LocationFenceAlarm> newAlarms = new ArrayList<>(); List<LocationFenceAlarm> newAlarms = new ArrayList<>();
//查询围栏内人员进入时的信息 //查询围栏内人员进入时的信息
String beginTime = timeAndNumberParam.getBeginTime();
String endTime = timeAndNumberParam.getEndTime();
List<LocationTurnover> turnoverList = locationTurnoverRepository.withinFence(fenceId, true); List<LocationTurnover> turnoverList = locationTurnoverRepository.withinFence(fenceId, true);
//筛选出在配置时间段内进入的进出信息 //筛选出在配置时间段内进入的进出信息
turnoverList = turnoverList =
turnoverList turnoverList
.stream() .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()) .sorted(Comparator.comparing(LocationTurnover::getTime).reversed())
.collect(Collectors.toList()); .collect(Collectors.toList());
//记录触发报警的信息(例如最大人数是3,那么前三个员工进入的不会记录) //记录触发报警的信息(例如最大人数是3,那么前三个员工进入的不会记录)
for (int i = 0; i < exceed; i++) { for (int i = 0; i < exceed; i++) {
LocationTurnover turnover = turnoverList.get(i); LocationTurnover turnover = turnoverList.get(i);
LocationFence fence = LocationFence.builder().id(fenceId).build(); LocationFence fence = LocationFence.builder().id(fenceId).name(param.getFenceName()).build();
AlarmType alarmType = AlarmType.builder().id(alarmTypeId).build(); AlarmType alarmType = AlarmType.builder().id(alarmTypeId).build();
LocationFenceAlarm locationFenceAlarm = LocationFenceAlarm LocationFenceAlarm locationFenceAlarm = LocationFenceAlarm
.builder() .builder()
...@@ -123,16 +135,7 @@ public class MaxPeopleNumberStrategy implements IParamInitStrategy<LocationFence ...@@ -123,16 +135,7 @@ public class MaxPeopleNumberStrategy implements IParamInitStrategy<LocationFence
newAlarms.add(locationFenceAlarm); newAlarms.add(locationFenceAlarm);
} }
//取两个集合没有相交的部分,newAlarms不重合的部分代表需要添加的报警,oldAlarms不重合的部分代表需要结束的报警 //取两个集合没有相交的部分,newAlarms不重合的部分代表需要添加的报警,oldAlarms不重合的部分代表需要结束的报警
if (!CollectionUtils.isEmpty(oldAlarms)) { IScanAlarmStrategy.notIntersect(newAlarms, oldAlarms, jobVo);
Set<Long> newSet = newAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
Set<Long> oldSet = oldAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
newAlarms =
newAlarms.stream().filter(e -> !oldSet.contains(e.getTag().getId())).collect(Collectors.toList());
oldAlarms =
oldAlarms.stream().filter(e -> !newSet.contains(e.getTag().getId())).collect(Collectors.toList());
}
jobVo.setAddAlarm(newAlarms);
jobVo.setModifyAlarm(oldAlarms);
return jobVo; return jobVo;
} }
} }
...@@ -7,10 +7,7 @@ import com.yiring.app.design.strategy.IScanAlarmStrategy; ...@@ -7,10 +7,7 @@ import com.yiring.app.design.strategy.IScanAlarmStrategy;
import com.yiring.app.domain.alarm.AlarmType; import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.domain.location.*; import com.yiring.app.domain.location.*;
import com.yiring.app.param.location.fence.LocationFenceJobParam; import com.yiring.app.param.location.fence.LocationFenceJobParam;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam; import com.yiring.app.param.location.rule.*;
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.util.TimeUtil; import com.yiring.app.util.TimeUtil;
import com.yiring.app.vo.location.fence.LocationFenceJobVo; import com.yiring.app.vo.location.fence.LocationFenceJobVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
...@@ -40,6 +37,7 @@ public class MinPeopleNumberStrategy implements IParamInitStrategy<LocationFence ...@@ -40,6 +37,7 @@ public class MinPeopleNumberStrategy implements IParamInitStrategy<LocationFence
public MinPeopleNumberStrategy() { public MinPeopleNumberStrategy() {
Integer relevanceParam = RelevanceParamEnum.MIN_PEOPLE_NUMBER.getCode(); Integer relevanceParam = RelevanceParamEnum.MIN_PEOPLE_NUMBER.getCode();
LocationFenceRuleContext.register(relevanceParam, this); LocationFenceRuleContext.register(relevanceParam, this);
ScanAlarmContext.register(relevanceParam, this);
} }
@Override @Override
...@@ -47,20 +45,29 @@ public class MinPeopleNumberStrategy implements IParamInitStrategy<LocationFence ...@@ -47,20 +45,29 @@ public class MinPeopleNumberStrategy implements IParamInitStrategy<LocationFence
RuleParam ruleParam = param.getRuleParam(); RuleParam ruleParam = param.getRuleParam();
List<TimeAndNumberParam> timeAndNumber = ruleParam.getTimeAndNumber(); List<TimeAndNumberParam> timeAndNumber = ruleParam.getTimeAndNumber();
if (CollectionUtils.isEmpty(timeAndNumber)) { if (CollectionUtils.isEmpty(timeAndNumber)) {
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一条最人数的规则"); return Result.no(Status.EXPECTATION_FAILED, "请至少配置一条最人数的规则");
} }
for (TimeAndNumberParam item : timeAndNumber) { for (TimeAndNumberParam item : timeAndNumber) {
if (item.getNumber() == null || item.getNumber() < 0) { if (item.getNumber() == null || item.getNumber() < 0) {
item.setNumber(0); Result.no(Status.EXPECTATION_FAILED, "最大人数不能空或小于零");
} }
if (item.getBeginTime() == null || item.getEndTime() == null) { }
item.setBeginTime(null); //如果只设置星期没有设置时间,则默认时间是全天
item.setEndTime(null); for (TimeAndNumberParam item : timeAndNumber) {
for (TimeParam time : item.getTime()) {
if (time.getWeek() != null) {
if (time.getBeginTime() == null) {
time.setBeginTime("00:00:00");
}
if (time.getEndTime() == null) {
time.setEndTime("23:59:59");
}
}
} }
} }
//将时间和距离都设为-1 //将时间和距离都设为-1
ruleParam.setDuration(-1); ruleParam.setDuration(null);
ruleParam.setDistance(-1); ruleParam.setDistance(null);
ArrayList<TimeAndUserParam> list = new ArrayList<>(); ArrayList<TimeAndUserParam> list = new ArrayList<>();
ruleParam.setTimeAndUser(list); ruleParam.setTimeAndUser(list);
return Result.ok(); return Result.ok();
...@@ -77,11 +84,19 @@ public class MinPeopleNumberStrategy implements IParamInitStrategy<LocationFence ...@@ -77,11 +84,19 @@ public class MinPeopleNumberStrategy implements IParamInitStrategy<LocationFence
LocationFenceJobVo jobVo = new LocationFenceJobVo(); LocationFenceJobVo jobVo = new LocationFenceJobVo();
List<TimeAndNumberParam> timeAndNumberParamList = rule.getTimeAndNumber(); List<TimeAndNumberParam> timeAndNumberParamList = rule.getTimeAndNumber();
TimeAndNumberParam timeAndNumberParam = null; TimeAndNumberParam timeAndNumberParam = null;
StringBuilder begin = new StringBuilder();
StringBuilder end = new StringBuilder();
//筛选在当前时间生效的配置 //筛选在当前时间生效的配置
for (TimeAndNumberParam item : timeAndNumberParamList) { for (TimeAndNumberParam item : timeAndNumberParamList) {
if (TimeUtil.judgeTime(LocalDateTime.now(), item.getBeginTime(), item.getEndTime())) { for (TimeParam time : item.getTime()) {
timeAndNumberParam = item; if (TimeUtil.judgeWeek(LocalDateTime.now(), time.getWeek())) {
break; if (TimeUtil.judgeTime(LocalDateTime.now(), time.getBeginTime(), time.getEndTime())) {
begin.append(time.getWeek()).append(" ").append(time.getBeginTime());
end.append(time.getWeek()).append(" ").append(time.getEndTime());
timeAndNumberParam = item;
break;
}
}
} }
} }
//如果现在不在配置的时间内,或围栏中的人大于配置的最小人数,则将报警记录中的状态刷新为结束,并且需要添加的报警为空 //如果现在不在配置的时间内,或围栏中的人大于配置的最小人数,则将报警记录中的状态刷新为结束,并且需要添加的报警为空
...@@ -92,21 +107,19 @@ public class MinPeopleNumberStrategy implements IParamInitStrategy<LocationFence ...@@ -92,21 +107,19 @@ public class MinPeopleNumberStrategy implements IParamInitStrategy<LocationFence
//少的人数 //少的人数
int missing = timeAndNumberParam.getNumber() - tagSet.size(); int missing = timeAndNumberParam.getNumber() - tagSet.size();
List<LocationFenceAlarm> newAlarms = new ArrayList<>(); List<LocationFenceAlarm> newAlarms = new ArrayList<>();
//查询出这个围栏的信息 //查询员工’出‘这个围栏的进出信息
String beginTime = timeAndNumberParam.getBeginTime();
String endTime = timeAndNumberParam.getEndTime();
List<LocationTurnover> turnoverList = locationTurnoverRepository.withinFence(fenceId, false); List<LocationTurnover> turnoverList = locationTurnoverRepository.withinFence(fenceId, false);
//筛选出在配置时间段内这个围栏的进出信息 //筛选出在配置时间段内’出‘这个围栏的进出信息
turnoverList = turnoverList =
turnoverList turnoverList
.stream() .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()) .sorted(Comparator.comparing(LocationTurnover::getTime).reversed())
.collect(Collectors.toList()); .collect(Collectors.toList());
//记录触发报警的信息(例如最小人数是3,这段时间一开始有6个人在围栏,然后出去的4个,那么只有第四个人出去才会记录) //记录触发报警的信息(例如最小人数是3,这段时间一开始有6个人在围栏,然后出去的4个,那么只有第四个人出去才会记录)
for (int i = 0; i < missing; i++) { for (int i = 0; i < missing; i++) {
LocationTurnover turnover = turnoverList.get(i); LocationTurnover turnover = turnoverList.get(i);
LocationFence fence = LocationFence.builder().id(fenceId).build(); LocationFence fence = LocationFence.builder().id(fenceId).name(param.getFenceName()).build();
AlarmType alarmType = AlarmType.builder().id(alarmTypeId).build(); AlarmType alarmType = AlarmType.builder().id(alarmTypeId).build();
LocationFenceAlarm locationFenceAlarm = LocationFenceAlarm LocationFenceAlarm locationFenceAlarm = LocationFenceAlarm
.builder() .builder()
...@@ -122,16 +135,7 @@ public class MinPeopleNumberStrategy implements IParamInitStrategy<LocationFence ...@@ -122,16 +135,7 @@ public class MinPeopleNumberStrategy implements IParamInitStrategy<LocationFence
newAlarms.add(locationFenceAlarm); newAlarms.add(locationFenceAlarm);
} }
//取两个集合没有相交的部分,newAlarms不重合的部分代表需要添加的报警,oldAlarms不重合的部分代表需要结束的报警 //取两个集合没有相交的部分,newAlarms不重合的部分代表需要添加的报警,oldAlarms不重合的部分代表需要结束的报警
if (!CollectionUtils.isEmpty(oldAlarms)) { IScanAlarmStrategy.notIntersect(newAlarms, oldAlarms, jobVo);
Set<Long> newSet = newAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
Set<Long> oldSet = oldAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
newAlarms =
newAlarms.stream().filter(e -> !oldSet.contains(e.getTag().getId())).collect(Collectors.toList());
oldAlarms =
oldAlarms.stream().filter(e -> !newSet.contains(e.getTag().getId())).collect(Collectors.toList());
}
jobVo.setAddAlarm(newAlarms);
jobVo.setModifyAlarm(oldAlarms);
return jobVo; return jobVo;
} }
} }
...@@ -7,21 +7,19 @@ import com.yiring.app.design.strategy.IScanAlarmStrategy; ...@@ -7,21 +7,19 @@ import com.yiring.app.design.strategy.IScanAlarmStrategy;
import com.yiring.app.domain.alarm.AlarmType; import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.domain.location.*; import com.yiring.app.domain.location.*;
import com.yiring.app.param.location.fence.LocationFenceJobParam; import com.yiring.app.param.location.fence.LocationFenceJobParam;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam; import com.yiring.app.param.location.rule.*;
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.util.TimeUtil; import com.yiring.app.util.TimeUtil;
import com.yiring.app.vo.location.fence.LocationFenceJobVo; import com.yiring.app.vo.location.fence.LocationFenceJobVo;
import com.yiring.auth.domain.user.User;
import com.yiring.auth.domain.user.UserRepository;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.core.Status; import com.yiring.common.core.Status;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.*;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.persistence.criteria.CriteriaBuilder;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
...@@ -37,9 +35,13 @@ public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRu ...@@ -37,9 +35,13 @@ public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRu
@Resource @Resource
private LocationTurnoverRepository locationTurnoverRepository; private LocationTurnoverRepository locationTurnoverRepository;
@Resource
private UserRepository userRepository;
public NotAllowLeaveStrategy() { public NotAllowLeaveStrategy() {
Integer relevanceParam = RelevanceParamEnum.NOT_ALLOW_LEAVE.getCode(); Integer relevanceParam = RelevanceParamEnum.NOT_ALLOW_LEAVE.getCode();
LocationFenceRuleContext.register(relevanceParam, this); LocationFenceRuleContext.register(relevanceParam, this);
ScanAlarmContext.register(relevanceParam, this);
} }
@Override @Override
...@@ -54,8 +56,48 @@ public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRu ...@@ -54,8 +56,48 @@ public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRu
return Result.no(Status.EXPECTATION_FAILED, "请至少配置一个不允许离开的人员"); return Result.no(Status.EXPECTATION_FAILED, "请至少配置一个不允许离开的人员");
} }
} }
ruleParam.setDuration(-1); //如果只设置星期没有设置时间,则默认时间是全天
ruleParam.setDistance(-1); for (TimeAndUserParam item : timeAndUser) {
for (TimeParam time : item.getTime()) {
if (time.getWeek() != null) {
if (time.getBeginTime() == null) {
time.setBeginTime("00:00:00");
}
if (time.getEndTime() == null) {
time.setEndTime("23:59:59");
}
}
}
}
//检查配置的员工是否存在
Specification<User> specification = (root, query, criteriaBuilder) -> {
CriteriaBuilder.In<Object> in = criteriaBuilder.in(root.get(User.Fields.uuid));
HashSet<String> ids = new HashSet<>();
for (TimeAndUserParam item : timeAndUser) {
for (RelevanceUserParam userParam : item.getUser()) {
ids.add(userParam.getUuid());
}
}
for (String uuid : ids) {
in.value(uuid);
}
return criteriaBuilder.and(in);
};
Map<String, List<User>> map = userRepository
.findAll(specification)
.stream()
.collect(Collectors.groupingBy(User::getUuid));
for (TimeAndUserParam item : timeAndUser) {
for (RelevanceUserParam userParam : item.getUser()) {
List<User> list = map.get(userParam.getUuid());
if (CollectionUtils.isEmpty(list)) {
return Result.no(Status.EXPECTATION_FAILED, "工号为:" + userParam.getUuid() + "员工不存在");
}
userParam.setRealName(list.get(0).getRealName());
}
}
ruleParam.setDuration(null);
ruleParam.setDistance(null);
ruleParam.setTimeAndNumber(new ArrayList<>()); ruleParam.setTimeAndNumber(new ArrayList<>());
return Result.ok(); return Result.ok();
} }
...@@ -71,11 +113,19 @@ public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRu ...@@ -71,11 +113,19 @@ public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRu
LocationFenceJobVo jobVo = new LocationFenceJobVo(); LocationFenceJobVo jobVo = new LocationFenceJobVo();
List<TimeAndUserParam> timeAndUserParamList = rule.getTimeAndUser(); List<TimeAndUserParam> timeAndUserParamList = rule.getTimeAndUser();
TimeAndUserParam timeAndUserParam = null; TimeAndUserParam timeAndUserParam = null;
StringBuilder begin = new StringBuilder();
StringBuilder end = new StringBuilder();
//筛选在当前时间生效的配置 //筛选在当前时间生效的配置
for (TimeAndUserParam item : timeAndUserParamList) { for (TimeAndUserParam item : timeAndUserParamList) {
if (TimeUtil.judgeTime(LocalDateTime.now(), item.getBeginTime(), item.getEndTime())) { for (TimeParam time : item.getTime()) {
timeAndUserParam = item; if (TimeUtil.judgeWeek(LocalDateTime.now(), time.getWeek())) {
break; if (TimeUtil.judgeTime(LocalDateTime.now(), time.getBeginTime(), time.getEndTime())) {
timeAndUserParam = item;
begin.append(time.getWeek()).append(" ").append(time.getBeginTime());
end.append(time.getWeek()).append(" ").append(time.getEndTime());
break;
}
}
} }
} }
//如果不在配置的时间内,则将报警记录中的状态刷新为结束,并且需要添加的报警为空 //如果不在配置的时间内,则将报警记录中的状态刷新为结束,并且需要添加的报警为空
...@@ -83,15 +133,13 @@ public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRu ...@@ -83,15 +133,13 @@ public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRu
jobVo.setModifyAlarm(oldAlarms); jobVo.setModifyAlarm(oldAlarms);
return jobVo; return jobVo;
} }
String beginTime = timeAndUserParam.getBeginTime();
String endTime = timeAndUserParam.getEndTime();
//筛选出在配置时间段内出这个围栏的进出信息 //筛选出在配置时间段内出这个围栏的进出信息
List<LocationTurnover> turnoverList = locationTurnoverRepository.withinFence(fenceId, false); List<LocationTurnover> turnoverList = locationTurnoverRepository.withinFence(fenceId, false);
//筛选出在配置时间段内出这个围栏的进出信息 //筛选出在配置时间段内出这个围栏的进出信息
turnoverList = turnoverList =
turnoverList turnoverList
.stream() .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()) .sorted(Comparator.comparing(LocationTurnover::getTime).reversed())
.collect(Collectors.toList()); .collect(Collectors.toList());
//筛选出离开围栏的人员是不允许离开的人员 //筛选出离开围栏的人员是不允许离开的人员
...@@ -104,7 +152,7 @@ public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRu ...@@ -104,7 +152,7 @@ public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRu
.stream() .stream()
.filter(e -> uuids.contains(e.getTag().getUser().getUuid())) .filter(e -> uuids.contains(e.getTag().getUser().getUuid()))
.map(e -> { .map(e -> {
LocationFence fence = LocationFence.builder().id(fenceId).build(); LocationFence fence = LocationFence.builder().id(fenceId).name(param.getFenceName()).build();
AlarmType alarmType = AlarmType.builder().id(alarmTypeId).build(); AlarmType alarmType = AlarmType.builder().id(alarmTypeId).build();
return LocationFenceAlarm return LocationFenceAlarm
.builder() .builder()
...@@ -120,16 +168,7 @@ public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRu ...@@ -120,16 +168,7 @@ public class NotAllowLeaveStrategy implements IParamInitStrategy<LocationFenceRu
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());
//取两个集合没有相交的部分,newAlarms不重合的部分代表需要添加的报警,oldAlarms不重合的部分代表需要结束的报警 //取两个集合没有相交的部分,newAlarms不重合的部分代表需要添加的报警,oldAlarms不重合的部分代表需要结束的报警
if (!CollectionUtils.isEmpty(oldAlarms)) { IScanAlarmStrategy.notIntersect(newAlarms, oldAlarms, jobVo);
Set<Long> newSet = newAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
Set<Long> oldSet = oldAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
newAlarms =
newAlarms.stream().filter(e -> !oldSet.contains(e.getTag().getId())).collect(Collectors.toList());
oldAlarms =
oldAlarms.stream().filter(e -> !newSet.contains(e.getTag().getId())).collect(Collectors.toList());
}
jobVo.setAddAlarm(newAlarms);
jobVo.setModifyAlarm(oldAlarms);
return jobVo; return jobVo;
} }
} }
...@@ -19,7 +19,6 @@ import java.util.Set; ...@@ -19,7 +19,6 @@ import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
/** /**
* 滞留时长相关策略 * 滞留时长相关策略
...@@ -36,6 +35,7 @@ public class RetentionDurationStrategy implements IParamInitStrategy<LocationFen ...@@ -36,6 +35,7 @@ public class RetentionDurationStrategy implements IParamInitStrategy<LocationFen
public RetentionDurationStrategy() { public RetentionDurationStrategy() {
Integer relevanceParam = RelevanceParamEnum.RETENTION_DURATION.getCode(); Integer relevanceParam = RelevanceParamEnum.RETENTION_DURATION.getCode();
LocationFenceRuleContext.register(relevanceParam, this); LocationFenceRuleContext.register(relevanceParam, this);
ScanAlarmContext.register(relevanceParam, this);
} }
@Override @Override
...@@ -44,7 +44,7 @@ public class RetentionDurationStrategy implements IParamInitStrategy<LocationFen ...@@ -44,7 +44,7 @@ public class RetentionDurationStrategy implements IParamInitStrategy<LocationFen
if (ruleParam.getDuration() == null || ruleParam.getDuration() < 0) { if (ruleParam.getDuration() == null || ruleParam.getDuration() < 0) {
return Result.no(Status.EXPECTATION_FAILED, "滞留时长异常"); return Result.no(Status.EXPECTATION_FAILED, "滞留时长异常");
} }
ruleParam.setDistance(-1); ruleParam.setDistance(null);
ruleParam.setTimeAndUser(new ArrayList<>()); ruleParam.setTimeAndUser(new ArrayList<>());
ruleParam.setTimeAndNumber(new ArrayList<>()); ruleParam.setTimeAndNumber(new ArrayList<>());
return Result.ok(); return Result.ok();
...@@ -67,7 +67,7 @@ public class RetentionDurationStrategy implements IParamInitStrategy<LocationFen ...@@ -67,7 +67,7 @@ public class RetentionDurationStrategy implements IParamInitStrategy<LocationFen
.stream() .stream()
.filter(e -> e.getTime().isBefore(time)) .filter(e -> e.getTime().isBefore(time))
.map(e -> { .map(e -> {
LocationFence fence = LocationFence.builder().id(fenceId).build(); LocationFence fence = LocationFence.builder().id(fenceId).name(param.getFenceName()).build();
AlarmType alarmType = AlarmType.builder().id(alarmTypeId).build(); AlarmType alarmType = AlarmType.builder().id(alarmTypeId).build();
return LocationFenceAlarm return LocationFenceAlarm
.builder() .builder()
...@@ -83,16 +83,7 @@ public class RetentionDurationStrategy implements IParamInitStrategy<LocationFen ...@@ -83,16 +83,7 @@ public class RetentionDurationStrategy implements IParamInitStrategy<LocationFen
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());
//取两个集合没有相交的部分,newAlarms不重合的部分代表需要添加的报警,oldAlarms不重合的部分代表需要结束的报警 //取两个集合没有相交的部分,newAlarms不重合的部分代表需要添加的报警,oldAlarms不重合的部分代表需要结束的报警
if (!CollectionUtils.isEmpty(oldAlarms)) { IScanAlarmStrategy.notIntersect(newAlarms, oldAlarms, jobVo);
Set<Long> newSet = newAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
Set<Long> oldSet = oldAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
newAlarms =
newAlarms.stream().filter(e -> !oldSet.contains(e.getTag().getId())).collect(Collectors.toList());
oldAlarms =
oldAlarms.stream().filter(e -> !newSet.contains(e.getTag().getId())).collect(Collectors.toList());
}
jobVo.setAddAlarm(newAlarms);
jobVo.setModifyAlarm(oldAlarms);
return jobVo; return jobVo;
} }
} }
...@@ -20,7 +20,6 @@ import java.util.List; ...@@ -20,7 +20,6 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
/** /**
* 静止时长相关策略 * 静止时长相关策略
...@@ -34,6 +33,7 @@ public class StaticDurationStrategy implements IParamInitStrategy<LocationFenceR ...@@ -34,6 +33,7 @@ public class StaticDurationStrategy implements IParamInitStrategy<LocationFenceR
public StaticDurationStrategy() { public StaticDurationStrategy() {
Integer relevanceParam = RelevanceParamEnum.STATIC_DURATION.getCode(); Integer relevanceParam = RelevanceParamEnum.STATIC_DURATION.getCode();
LocationFenceRuleContext.register(relevanceParam, this); LocationFenceRuleContext.register(relevanceParam, this);
ScanAlarmContext.register(relevanceParam, this);
} }
@Override @Override
...@@ -42,7 +42,7 @@ public class StaticDurationStrategy implements IParamInitStrategy<LocationFenceR ...@@ -42,7 +42,7 @@ public class StaticDurationStrategy implements IParamInitStrategy<LocationFenceR
if (ruleParam.getDuration() == null || ruleParam.getDuration() < 0) { if (ruleParam.getDuration() == null || ruleParam.getDuration() < 0) {
return Result.no(Status.EXPECTATION_FAILED, "静止时长异常"); return Result.no(Status.EXPECTATION_FAILED, "静止时长异常");
} }
ruleParam.setDistance(-1); ruleParam.setDistance(null);
ruleParam.setTimeAndUser(new ArrayList<>()); ruleParam.setTimeAndUser(new ArrayList<>());
ruleParam.setTimeAndNumber(new ArrayList<>()); ruleParam.setTimeAndNumber(new ArrayList<>());
return Result.ok(); return Result.ok();
...@@ -65,7 +65,7 @@ public class StaticDurationStrategy implements IParamInitStrategy<LocationFenceR ...@@ -65,7 +65,7 @@ public class StaticDurationStrategy implements IParamInitStrategy<LocationFenceR
.filter(LocationTag::getSilent) .filter(LocationTag::getSilent)
.filter(e -> e.getTime().isBefore(time)) .filter(e -> e.getTime().isBefore(time))
.map(e -> { .map(e -> {
LocationFence fence = LocationFence.builder().id(fenceId).build(); LocationFence fence = LocationFence.builder().id(fenceId).name(param.getFenceName()).build();
AlarmType alarmType = AlarmType.builder().id(alarmTypeId).build(); AlarmType alarmType = AlarmType.builder().id(alarmTypeId).build();
return LocationFenceAlarm return LocationFenceAlarm
.builder() .builder()
...@@ -81,16 +81,7 @@ public class StaticDurationStrategy implements IParamInitStrategy<LocationFenceR ...@@ -81,16 +81,7 @@ public class StaticDurationStrategy implements IParamInitStrategy<LocationFenceR
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());
//取两个集合没有相交的部分,newAlarms不重合的部分代表需要添加的报警,oldAlarms不重合的部分代表需要结束的报警 //取两个集合没有相交的部分,newAlarms不重合的部分代表需要添加的报警,oldAlarms不重合的部分代表需要结束的报警
if (!CollectionUtils.isEmpty(oldAlarms)) { IScanAlarmStrategy.notIntersect(newAlarms, oldAlarms, jobVo);
Set<Long> newSet = newAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
Set<Long> oldSet = oldAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
newAlarms =
newAlarms.stream().filter(e -> !oldSet.contains(e.getTag().getId())).collect(Collectors.toList());
oldAlarms =
oldAlarms.stream().filter(e -> !newSet.contains(e.getTag().getId())).collect(Collectors.toList());
}
jobVo.setAddAlarm(newAlarms);
jobVo.setModifyAlarm(oldAlarms);
return jobVo; return jobVo;
} }
} }
...@@ -23,7 +23,6 @@ import java.util.stream.Collectors; ...@@ -23,7 +23,6 @@ import java.util.stream.Collectors;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Geometry;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
/** /**
* 触发报警距离相关策略 * 触发报警距离相关策略
...@@ -40,6 +39,7 @@ public class TriggerAlarmDistanceStrategy implements IParamInitStrategy<Location ...@@ -40,6 +39,7 @@ public class TriggerAlarmDistanceStrategy implements IParamInitStrategy<Location
public TriggerAlarmDistanceStrategy() { public TriggerAlarmDistanceStrategy() {
Integer relevanceParam = RelevanceParamEnum.TRIGGER_ALARM_DISTANCE.getCode(); Integer relevanceParam = RelevanceParamEnum.TRIGGER_ALARM_DISTANCE.getCode();
LocationFenceRuleContext.register(relevanceParam, this); LocationFenceRuleContext.register(relevanceParam, this);
ScanAlarmContext.register(relevanceParam, this);
} }
@Override @Override
...@@ -48,7 +48,7 @@ public class TriggerAlarmDistanceStrategy implements IParamInitStrategy<Location ...@@ -48,7 +48,7 @@ public class TriggerAlarmDistanceStrategy implements IParamInitStrategy<Location
if (ruleParam.getDistance() == null || ruleParam.getDistance() < 0) { if (ruleParam.getDistance() == null || ruleParam.getDistance() < 0) {
return Result.no(Status.EXPECTATION_FAILED, "触发报警距离异常"); return Result.no(Status.EXPECTATION_FAILED, "触发报警距离异常");
} }
ruleParam.setDuration(-1); ruleParam.setDuration(null);
ruleParam.setTimeAndUser(new ArrayList<>()); ruleParam.setTimeAndUser(new ArrayList<>());
ruleParam.setTimeAndNumber(new ArrayList<>()); ruleParam.setTimeAndNumber(new ArrayList<>());
return Result.ok(); return Result.ok();
...@@ -70,7 +70,7 @@ public class TriggerAlarmDistanceStrategy implements IParamInitStrategy<Location ...@@ -70,7 +70,7 @@ public class TriggerAlarmDistanceStrategy implements IParamInitStrategy<Location
List<LocationFenceAlarm> newAlarms = locationTags List<LocationFenceAlarm> newAlarms = locationTags
.stream() .stream()
.map(e -> { .map(e -> {
LocationFence fence = LocationFence.builder().id(fenceId).build(); LocationFence fence = LocationFence.builder().id(fenceId).name(param.getFenceName()).build();
AlarmType alarmType = AlarmType.builder().id(alarmTypeId).build(); AlarmType alarmType = AlarmType.builder().id(alarmTypeId).build();
return LocationFenceAlarm return LocationFenceAlarm
.builder() .builder()
...@@ -86,16 +86,7 @@ public class TriggerAlarmDistanceStrategy implements IParamInitStrategy<Location ...@@ -86,16 +86,7 @@ public class TriggerAlarmDistanceStrategy implements IParamInitStrategy<Location
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());
//取两个集合没有相交的部分,newAlarms不重合的部分代表需要添加的报警,oldAlarms不重合的部分代表需要结束的报警 //取两个集合没有相交的部分,newAlarms不重合的部分代表需要添加的报警,oldAlarms不重合的部分代表需要结束的报警
if (!CollectionUtils.isEmpty(oldAlarms)) { IScanAlarmStrategy.notIntersect(newAlarms, oldAlarms, jobVo);
Set<Long> newSet = newAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
Set<Long> oldSet = oldAlarms.stream().map(e -> e.getTag().getId()).collect(Collectors.toSet());
newAlarms =
newAlarms.stream().filter(e -> !oldSet.contains(e.getTag().getId())).collect(Collectors.toList());
oldAlarms =
oldAlarms.stream().filter(e -> !newSet.contains(e.getTag().getId())).collect(Collectors.toList());
}
jobVo.setAddAlarm(newAlarms);
jobVo.setModifyAlarm(oldAlarms);
return jobVo; return jobVo;
} }
} }
...@@ -51,6 +51,9 @@ public class District implements Serializable { ...@@ -51,6 +51,9 @@ public class District implements Serializable {
@Comment("区域信息名称") @Comment("区域信息名称")
private String name; private String name;
@Comment("地图id")
private Integer mapId;
@Comment("风险等级") @Comment("风险等级")
private String riskGrade; private String riskGrade;
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.location;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.yiring.auth.domain.user.User;
import com.yiring.common.domain.BasicEntity;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import lombok.*;
import lombok.experimental.FieldNameConstants;
import org.hibernate.annotations.Comment;
/**
* @author tml
* @version 1.0
* @date 2022/5/18 9:25
*/
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@FieldNameConstants
@Entity
@Table(name = "BS_FENCE_ALARM_PUSH_LOG")
@Comment("围栏报警推送记录")
public class FenceAlarmPushLog extends BasicEntity implements Serializable {
@Serial
private static final long serialVersionUID = 7859768330784835564L;
@ManyToOne
@JoinColumn(name = "fence_alarm_id")
@JsonIgnore
@Comment("围栏报警记录")
private LocationFenceAlarm fenceAlarm;
@Comment("通知方式")
private Integer informManner;
@Comment("接收状态")
private Integer status;
@Comment("接收时间")
private LocalDateTime time;
@ManyToOne
@JoinColumn(name = "user_id")
@JsonIgnore
@Comment("报警接收人")
User user;
}
/* (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/5/18 10:29
*/
@Repository
public interface FenceAlarmPushLogRepository
extends JpaRepository<FenceAlarmPushLog, Serializable>, JpaSpecificationExecutor<FenceAlarmPushLog> {}
...@@ -13,6 +13,7 @@ import lombok.experimental.FieldNameConstants; ...@@ -13,6 +13,7 @@ import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import org.hibernate.annotations.Comment; import org.hibernate.annotations.Comment;
import org.hibernate.annotations.Where; import org.hibernate.annotations.Where;
import org.springframework.util.CollectionUtils;
/** /**
* @author tml * @author tml
...@@ -62,4 +63,20 @@ public class LocationAlarmRule extends BasicEntity implements Serializable { ...@@ -62,4 +63,20 @@ public class LocationAlarmRule extends BasicEntity implements Serializable {
@Comment(value = "是否删除") @Comment(value = "是否删除")
@Column(nullable = false) @Column(nullable = false)
Boolean deleted; Boolean deleted;
/**
* 判断本实体类的报警类型集是否包含搞报警类型
* @param alarmType 报警类型
* @return true:包含 false:不包含
*/
public boolean typesContains(AlarmType alarmType) {
if (!CollectionUtils.isEmpty(alarmTypes)) {
for (AlarmType item : alarmTypes) {
if (item.getId().equals(alarmType.getId())) {
return true;
}
}
}
return false;
}
} }
...@@ -2,8 +2,11 @@ ...@@ -2,8 +2,11 @@
package com.yiring.app.domain.location; package com.yiring.app.domain.location;
import java.io.Serializable; import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
/** /**
...@@ -13,4 +16,15 @@ import org.springframework.stereotype.Repository; ...@@ -13,4 +16,15 @@ import org.springframework.stereotype.Repository;
*/ */
@Repository @Repository
public interface LocationAlarmRuleRepository public interface LocationAlarmRuleRepository
extends JpaRepository<LocationAlarmRule, Serializable>, JpaSpecificationExecutor<LocationAlarmRule> {} extends JpaRepository<LocationAlarmRule, Serializable>, JpaSpecificationExecutor<LocationAlarmRule> {
/**
* 根据多个围栏id查询
* @param fenceIds 围栏id
* @return 规则
*/
@Query(
value = "SELECT * FROM BS_LOCATION_ALARM_RULE WHERE deleted = false AND fence_id IN (?1)",
nativeQuery = true
)
List<LocationAlarmRule> findAllByFenceIds(Collection<Long> fenceIds);
}
...@@ -93,6 +93,12 @@ public class LocationFence extends BasicEntity implements Serializable { ...@@ -93,6 +93,12 @@ public class LocationFence extends BasicEntity implements Serializable {
@Builder.Default @Builder.Default
@ManyToMany(fetch = FetchType.LAZY) @ManyToMany(fetch = FetchType.LAZY)
Set<LocationTag> tags = new HashSet<>(0); Set<LocationTag> tags = new HashSet<>(0);
@ToString.Exclude
@Comment("围栏中的报警记录集合")
@Builder.Default
@OneToMany(mappedBy = "fence")
Set<LocationFenceAlarm> fenceAlarms = new HashSet<>(0);
/*@SuppressWarnings({ "unused" }) /*@SuppressWarnings({ "unused" })
public enum Mode { public enum Mode {
NORMAL("常规区域"), NORMAL("常规区域"),
......
...@@ -7,6 +7,9 @@ import com.yiring.common.domain.BasicEntity; ...@@ -7,6 +7,9 @@ import com.yiring.common.domain.BasicEntity;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import javax.persistence.*; import javax.persistence.*;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
...@@ -71,8 +74,10 @@ public class LocationFenceAlarm extends BasicEntity implements Serializable { ...@@ -71,8 +74,10 @@ public class LocationFenceAlarm extends BasicEntity implements Serializable {
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
Status status; Status status;
// 推送记录集合(含接收状态) @Builder.Default
// TODO @OneToMany(mappedBy = "fenceAlarm")
@Comment("推送记录")
List<FenceAlarmPushLog> pushLogs = new ArrayList<>();
@SuppressWarnings({ "unused" }) @SuppressWarnings({ "unused" })
public enum Status { public enum Status {
...@@ -93,4 +98,28 @@ public class LocationFenceAlarm extends BasicEntity implements Serializable { ...@@ -93,4 +98,28 @@ public class LocationFenceAlarm extends BasicEntity implements Serializable {
return flag ? ING : OVER; return flag ? ING : OVER;
} }
} }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
LocationFenceAlarm that = (LocationFenceAlarm) o;
return (
Objects.equals(fence, that.fence) &&
Objects.equals(point, that.point) &&
Objects.equals(areaId, that.areaId) &&
Objects.equals(user, that.user) &&
Objects.equals(tag, that.tag) &&
Objects.equals(startTime, that.startTime) &&
Objects.equals(endTime, that.endTime) &&
Objects.equals(type, that.type) &&
status == that.status &&
Objects.equals(pushLogs, that.pushLogs)
);
}
@Override
public int hashCode() {
return Objects.hash(fence, point, areaId, user, tag, startTime, endTime, type, status, pushLogs);
}
} }
...@@ -2,11 +2,15 @@ ...@@ -2,11 +2,15 @@
package com.yiring.app.domain.location; package com.yiring.app.domain.location;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Set;
import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Geometry;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
/** /**
...@@ -58,4 +62,17 @@ public interface LocationFenceRepository ...@@ -58,4 +62,17 @@ public interface LocationFenceRepository
nativeQuery = true nativeQuery = true
) )
List<LocationFence> findByGeometryContains(Long areaId, Geometry geometry); List<LocationFence> findByGeometryContains(Long areaId, Geometry geometry);
/**
* 批量启用或停用围栏
* @param ids 围栏id集
* @param enable true:启用 false:停用
* @param now 当前时间
* @return 修改了几条
*/
@Query(
value = "UPDATE LocationFence set enable = :enable, updateTime = :now WHERE id IN (:ids) AND deleted = false "
)
@Modifying
int batchEnable(@Param("ids") Set<Long> ids, @Param("enable") boolean enable, @Param("now") LocalDateTime now);
} }
...@@ -53,6 +53,7 @@ public class LocationFenceRule extends BasicEntity implements Serializable { ...@@ -53,6 +53,7 @@ public class LocationFenceRule extends BasicEntity implements Serializable {
private Integer relevanceParamType; private Integer relevanceParamType;
@Comment("规则,用json存入") @Comment("规则,用json存入")
@Column(columnDefinition = "text")
private String rule; private String rule;
@Comment(value = "是否删除") @Comment(value = "是否删除")
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
package com.yiring.app.domain.location; package com.yiring.app.domain.location;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
...@@ -13,4 +14,11 @@ import org.springframework.stereotype.Repository; ...@@ -13,4 +14,11 @@ import org.springframework.stereotype.Repository;
*/ */
@Repository @Repository
public interface LocationFenceRuleRepository 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.app.domain.workArea.WorkArea;
import com.yiring.common.domain.BasicEntity;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
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
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@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;
@Comment("所属工区")
@ManyToOne
@JoinColumn(name = "workArea_id")
private WorkArea workArea;
@Comment("安装位置")
private String install;
@Comment("经纬度")
@Column(columnDefinition = "geometry(PointZ,4326)")
private Point point;
@Comment("监控参数")
private String monitoring;
@Comment("位号")
private String locationNum;
@Comment("量程起始值")
private BigDecimal min;
@Comment("量程结束值")
private BigDecimal max;
@Comment("量程单位")
private String unit;
@Comment("启用")
private Boolean enable;
@Comment("最新监测值")
private BigDecimal newestMonitor;
@Comment("最新预警状态:1-正常,2-预警中")
private Integer warnStatus;
@Comment("最新阈值状态:1-低低,2-低,3-高,4-高高,5-熄灭")
private Integer thresholdStatus;
@Comment("最新风险等级::1-红色风险,2-橙色风险,3-黄色风险,4-蓝色风险")
private Integer riskLevel;
@Comment("最新状态更新时间")
private LocalDateTime newestUpdateTime;
@ToString.Exclude
@Comment("阈值区间信息")
@Builder.Default
@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REFRESH })
@JoinColumn(name = "risk_warn_id")
private List<Threshold> thresholds = new ArrayList<>();
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.risk;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Set;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
/**
* @author tml
* @version 1.0
* @date 2022/5/23 17:58
*/
@Repository
public interface RiskWarnRepository extends JpaRepository<RiskWarn, Serializable>, JpaSpecificationExecutor<RiskWarn> {
/**
* 批量启用或停用
* @param ids ids
* @param enable 启用或停用
* @param now 当前时间
* @return 修改的条数
*/
@Query(value = "UPDATE RiskWarn SET enable = :enable, updateTime = :now WHERE id IN (:ids)")
@Modifying
int batchEnable(@Param("ids") Set<Long> ids, @Param("enable") boolean enable, @Param("now") LocalDateTime now);
}
/* (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.FieldNameConstants;
import lombok.experimental.SuperBuilder;
import org.hibernate.annotations.Comment;
/**
* @author tml
* @version 1.0
* @date 2022/5/24 11:21
*/
@Getter
@Setter
@ToString
@SuperBuilder(toBuilder = true)
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@Entity
@Table(name = "BS_THRESHOLD")
@Comment("阈值区间信息")
public class Threshold extends BasicEntity implements Serializable {
@Serial
private static final long serialVersionUID = 3115736944401082777L;
/*@ManyToOne
@JoinColumn(name = "risk_warn_id")
@Comment("对应的风险预警信息")
private RiskWarn riskWarn;*/
@Comment("阈值区间起始值")
private String min;
@Comment("阈值区间结束值")
private String max;
@Comment("阈值状态")
private Integer status;
@Comment("风险等级")
private Integer riskLevel;
}
...@@ -8,6 +8,7 @@ import com.yiring.app.domain.location.LocationFenceAlarm; ...@@ -8,6 +8,7 @@ import com.yiring.app.domain.location.LocationFenceAlarm;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.stream.Collectors;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
...@@ -28,37 +29,43 @@ public class FenceAlarmExcel implements Serializable { ...@@ -28,37 +29,43 @@ public class FenceAlarmExcel implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 4526095986813965381L; private static final long serialVersionUID = 4526095986813965381L;
@ExcelColumn(title = "地图名称") @ExcelColumn(title = "地图名称", width = 10)
private String mapName; private String mapName;
@ExcelColumn(title = "围栏名称") @ExcelColumn(title = "围栏名称", width = 10)
private String fenceName; private String fenceName;
@ExcelColumn(title = "围栏类别") @ExcelColumn(title = "围栏类别", width = 10)
private String fenceTypeName; private String fenceTypeName;
@ExcelColumn(title = "报警人员") @ExcelColumn(title = "报警人员", width = 10)
private String realName; private String realName;
@ExcelColumn(title = "标签号") @ExcelColumn(title = "标签号", width = 10)
private String tagId; private String tagId;
@ExcelColumn(title = "报警开始时间") @ExcelColumn(title = "报警开始时间", width = 15)
private LocalDateTime startTime; private LocalDateTime startTime;
@ExcelColumn(title = "报警结束时间") @ExcelColumn(title = "报警结束时间", width = 15)
private LocalDateTime endTime; private LocalDateTime endTime;
@ExcelColumn(title = "报警类型") @ExcelColumn(title = "报警类型", width = 10)
private String alarmTypeName; private String alarmTypeName;
@ExcelColumn(title = "接收人") @ExcelColumn(title = "接收人", width = 15)
private String recipient; private String recipient;
@ExcelColumn(title = "报警状态") @ExcelColumn(title = "报警状态", width = 10)
private String statusName; private String statusName;
public static FenceAlarmExcel transform(LocationFenceAlarm fenceAlarm) { public static FenceAlarmExcel transform(LocationFenceAlarm fenceAlarm) {
String recipient = fenceAlarm
.getPushLogs()
.stream()
.map(e -> e.getUser().getRealName())
.distinct()
.collect(Collectors.joining(", "));
return FenceAlarmExcel return FenceAlarmExcel
.builder() .builder()
.fenceName(fenceAlarm.getFence().getName()) .fenceName(fenceAlarm.getFence().getName())
...@@ -68,8 +75,7 @@ public class FenceAlarmExcel implements Serializable { ...@@ -68,8 +75,7 @@ public class FenceAlarmExcel implements Serializable {
.startTime(fenceAlarm.getStartTime()) .startTime(fenceAlarm.getStartTime())
.endTime(fenceAlarm.getEndTime()) .endTime(fenceAlarm.getEndTime())
.alarmTypeName(fenceAlarm.getType().getName()) .alarmTypeName(fenceAlarm.getType().getName())
//todo .recipient(recipient)
//.recipient()
.statusName(fenceAlarm.getStatus().text()) .statusName(fenceAlarm.getStatus().text())
.build(); .build();
} }
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.excel.risk;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.github.liaochong.myexcel.core.annotation.ExcelModel;
import com.yiring.app.constant.risk.ThresholdStatusEnum;
import com.yiring.app.domain.risk.RiskWarn;
import com.yiring.app.domain.risk.Threshold;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.util.CollectionUtils;
/**
* @author tml
* @version 1.0
* @date 2022/5/24 11:17
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ExcelModel
public class RiskWarnExcel implements Serializable {
@Serial
private static final long serialVersionUID = -535906627975355631L;
@ExcelColumn(title = "工区", width = 15)
private String workAreaName;
@ExcelColumn(title = "安装位置", width = 15)
private String install;
@ExcelColumn(title = "经纬度", width = 30)
private String point;
@ExcelColumn(title = "监控参数", width = 15)
private String monitoring;
@ExcelColumn(title = "位号", width = 10)
private String locationNum;
@ExcelColumn(title = "量程", width = 10)
private String range;
@ExcelColumn(title = "量程单位", width = 10)
private String unit;
@ExcelColumn(title = "报警值(低低)", width = 10)
private String lowLow;
@ExcelColumn(title = "报警值(低)", width = 10)
private String low;
@ExcelColumn(title = "报警值(高)", width = 10)
private String high;
@ExcelColumn(title = "报警值(高高)", width = 10)
private String highHigh;
@ExcelColumn(title = "报警值(熄灭)", width = 10)
private String flame;
@ExcelColumn(title = "备注", width = 40)
private String remark;
public static RiskWarnExcel transform(RiskWarn riskWarn) {
String range = "";
if (riskWarn.getMin() != null && riskWarn.getMax() != null) {
range = riskWarn.getMin() + "-" + riskWarn.getMax();
}
String point =
riskWarn.getPoint().getCoordinate().getX() +
"," +
riskWarn.getPoint().getCoordinate().getY() +
"," +
riskWarn.getPoint().getCoordinate().getZ();
Map<Integer, List<Threshold>> map = riskWarn
.getThresholds()
.stream()
.collect(Collectors.groupingBy(Threshold::getStatus));
List<Threshold> lowLowList = map.get(ThresholdStatusEnum.LOW_LOW.getCode());
List<Threshold> lowList = map.get(ThresholdStatusEnum.LOW.getCode());
List<Threshold> highList = map.get(ThresholdStatusEnum.HIGH.getCode());
List<Threshold> highHighList = map.get(ThresholdStatusEnum.HIGH_HIGH.getCode());
List<Threshold> flameList = map.get(ThresholdStatusEnum.FLAME_EXTINGUISH.getCode());
String lowLow = CollectionUtils.isEmpty(lowLowList) ? "" : lowLowList.get(0).getMin();
String low = CollectionUtils.isEmpty(lowList) ? "" : lowList.get(0).getMin();
String high = CollectionUtils.isEmpty(highList) ? "" : highList.get(0).getMin();
String highHigh = CollectionUtils.isEmpty(highHighList) ? "" : highHighList.get(0).getMin();
String flame = CollectionUtils.isEmpty(flameList) ? "" : flameList.get(0).getMin();
return RiskWarnExcel
.builder()
.workAreaName(riskWarn.getWorkArea().getWorkAreaName())
.point(point)
.install(riskWarn.getInstall())
.monitoring(riskWarn.getMonitoring())
.locationNum(riskWarn.getLocationNum())
.range(range)
.unit(riskWarn.getUnit())
.lowLow(lowLow)
.low(low)
.high(high)
.highHigh(highHigh)
.flame(flame)
.build();
}
}
...@@ -2,12 +2,15 @@ ...@@ -2,12 +2,15 @@
package com.yiring.app.job; package com.yiring.app.job;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.xxl.job.core.handler.annotation.XxlJob; import com.xxl.job.core.handler.annotation.XxlJob;
import com.yiring.app.design.strategy.rule.ScanAlarmContext; import com.yiring.app.design.strategy.rule.ScanAlarmContext;
import com.yiring.app.domain.location.*; import com.yiring.app.domain.location.*;
import com.yiring.app.param.location.fence.LocationFenceJobParam; import com.yiring.app.param.location.fence.LocationFenceJobParam;
import com.yiring.app.param.location.rule.RuleParam; import com.yiring.app.param.location.rule.RuleParam;
import com.yiring.app.service.location.fence.FenceAlarmService;
import com.yiring.app.vo.location.fence.LocationFenceJobVo; import com.yiring.app.vo.location.fence.LocationFenceJobVo;
import com.yiring.auth.domain.user.User;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
...@@ -34,6 +37,15 @@ public class FenceAlarmJob { ...@@ -34,6 +37,15 @@ public class FenceAlarmJob {
@Resource @Resource
private LocationFenceAlarmRepository locationFenceAlarmRepository; private LocationFenceAlarmRepository locationFenceAlarmRepository;
@Resource
private LocationAlarmRuleRepository locationAlarmRuleRepository;
@Resource
private FenceAlarmPushLogRepository fenceAlarmPushLogRepository;
@Resource
private FenceAlarmService fenceAlarmService;
@XxlJob("ScanAlarmHandler") @XxlJob("ScanAlarmHandler")
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void scanAlarmHandler() { public void scanAlarmHandler() {
...@@ -60,6 +72,7 @@ public class FenceAlarmJob { ...@@ -60,6 +72,7 @@ public class FenceAlarmJob {
.builder() .builder()
.rule(ruleParam) .rule(ruleParam)
.fenceId(fence.getId()) .fenceId(fence.getId())
.fenceName(fence.getName())
.alarmTypeId(fenceRule.getAlarmType().getId()) .alarmTypeId(fenceRule.getAlarmType().getId())
.tagSet(fence.getTags()) .tagSet(fence.getTags())
.mapId(fence.getMapId()) .mapId(fence.getMapId())
...@@ -73,6 +86,8 @@ public class FenceAlarmJob { ...@@ -73,6 +86,8 @@ public class FenceAlarmJob {
jobVo.merge(locationFenceJobVo); jobVo.merge(locationFenceJobVo);
} }
} }
//异步将新添加的报警信息推送给前端
fenceAlarmService.alarmPushWeb(jobVo.getAddAlarm());
//添加报警和关闭报警 //添加报警和关闭报警
locationFenceAlarmRepository.saveAllAndFlush(jobVo.getAddAlarm()); locationFenceAlarmRepository.saveAllAndFlush(jobVo.getAddAlarm());
List<Long> ids = jobVo.getModifyAlarm().stream().map(LocationFenceAlarm::getId).collect(Collectors.toList()); List<Long> ids = jobVo.getModifyAlarm().stream().map(LocationFenceAlarm::getId).collect(Collectors.toList());
...@@ -82,5 +97,39 @@ public class FenceAlarmJob { ...@@ -82,5 +97,39 @@ public class FenceAlarmJob {
JSON.toJSONString(jobVo.getAddAlarm()), JSON.toJSONString(jobVo.getAddAlarm()),
JSON.toJSONString(jobVo.getModifyAlarm()) JSON.toJSONString(jobVo.getModifyAlarm())
); );
//todo 推送报警信息
//添加报警推送记录,可以考虑异步执行
Set<Long> fenceIds = jobVo.getAddAlarm().stream().map(e -> e.getFence().getId()).collect(Collectors.toSet());
List<LocationAlarmRule> locationAlarmRuleList = locationAlarmRuleRepository.findAllByFenceIds(fenceIds);
List<FenceAlarmPushLog> pushLogList = new ArrayList<>();
for (LocationFenceAlarm fenceAlarm : jobVo.getAddAlarm()) {
//筛选出该条报警记录对应的报警规则
locationAlarmRuleList =
locationAlarmRuleList
.stream()
.filter(e -> fenceAlarm.getFence().getId().equals(e.getLocationFence().getId()))
.filter(e -> e.typesContains(fenceAlarm.getType()))
.collect(Collectors.toList());
//一条报警记录可能对应多个报警规则(报警给谁的规则),报警规则的接收人和通知方式用笛卡尔积存到数据库
for (LocationAlarmRule alarmRule : locationAlarmRuleList) {
List<Integer> informManners = JSONArray.parseArray(alarmRule.getInformManner(), Integer.class);
for (User user : alarmRule.getUsers()) {
for (Integer informManner : informManners) {
FenceAlarmPushLog pushLog = FenceAlarmPushLog
.builder()
.fenceAlarm(fenceAlarm)
.informManner(informManner)
.user(user)
.build();
pushLogList.add(pushLog);
}
}
}
}
//落库
fenceAlarmPushLogRepository.saveAllAndFlush(pushLogList);
log.info("FenceAlarmJob.scanAlarmHandler: 生成的推送记录:[{}]", JSON.toJSONString(pushLogList));
} }
} }
...@@ -29,20 +29,20 @@ public class HistoryRouteConditionParam implements Serializable { ...@@ -29,20 +29,20 @@ public class HistoryRouteConditionParam implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 2386493816691457426L; private static final long serialVersionUID = 2386493816691457426L;
@ApiModelProperty(value = "地图id", example = "1", required = true) @ApiModelProperty(value = "地图id", example = "10019", required = true)
@NotNull(message = "请选择地图") @NotNull(message = "请选择地图")
private Long mapId; private Long mapId;
@ApiModelProperty(value = "用户id", example = "1", required = true) @ApiModelProperty(value = "用户id", example = "1522770547178475520", required = true)
@NotNull(message = "请选择员工") @NotNull(message = "请选择员工")
private Long userId; private Long userId;
@ApiModelProperty(value = "开始时间", example = "2022-05-06 14:00:00", required = true) @ApiModelProperty(value = "开始时间", example = "2022-05-01 14:00:00", required = true)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@NotNull(message = "请选择开始时间") @NotNull(message = "请选择开始时间")
private LocalDateTime beginTime; private LocalDateTime beginTime;
@ApiModelProperty(value = "结束时间", example = "2022-05-06 14:05:00", required = true) @ApiModelProperty(value = "结束时间", example = "2022-05-20 14:05:00", required = true)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@NotNull(message = "请选择结束时间") @NotNull(message = "请选择结束时间")
private LocalDateTime endTime; private LocalDateTime endTime;
......
...@@ -2,12 +2,14 @@ ...@@ -2,12 +2,14 @@
package com.yiring.app.param.district; package com.yiring.app.param.district;
import com.yiring.app.domain.district.District; import com.yiring.app.domain.district.District;
import com.yiring.common.constant.RegEx;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import lombok.*; import lombok.*;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Length;
import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Geometry;
...@@ -33,9 +35,14 @@ public class DistrictAddParam implements Serializable { ...@@ -33,9 +35,14 @@ public class DistrictAddParam implements Serializable {
@Length(max = 10, message = "区域名称不能超过10个字符") @Length(max = 10, message = "区域名称不能超过10个字符")
private String name; private String name;
@ApiModelProperty(value = "风险等级", example = "1", required = true) @ApiModelProperty(value = "地图id", example = "1", required = true)
@NotNull(message = "地图id不能为空")
private Integer mapId;
@ApiModelProperty(value = "风险等级", example = "#FF0000", required = true)
@NotEmpty(message = "风险等级不能为空") @NotEmpty(message = "风险等级不能为空")
@Length(min = 6, max = 7, message = "请选择正确的颜色") @Length(min = 6, max = 7, message = "请选择正确的颜色")
@Pattern(regexp = RegEx.COLOUR_RGB, message = "颜色格式不正确")
private String riskGrade; private String riskGrade;
@ApiModelProperty(value = "消抖时间(秒)", example = "10", required = true) @ApiModelProperty(value = "消抖时间(秒)", example = "10", required = true)
...@@ -54,6 +61,7 @@ public class DistrictAddParam implements Serializable { ...@@ -54,6 +61,7 @@ public class DistrictAddParam implements Serializable {
return District return District
.builder() .builder()
.name(name) .name(name)
.mapId(mapId)
.deleted(false) .deleted(false)
.riskGrade(riskGrade) .riskGrade(riskGrade)
.debouncingDuration(debouncingDuration) .debouncingDuration(debouncingDuration)
......
...@@ -2,11 +2,13 @@ ...@@ -2,11 +2,13 @@
package com.yiring.app.param.district; package com.yiring.app.param.district;
import com.yiring.app.domain.district.District; import com.yiring.app.domain.district.District;
import com.yiring.common.constant.RegEx;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
...@@ -38,8 +40,12 @@ public class DistrictModifyParam implements Serializable { ...@@ -38,8 +40,12 @@ public class DistrictModifyParam implements Serializable {
@Length(max = 10, message = "区域名称不能超过10个字符") @Length(max = 10, message = "区域名称不能超过10个字符")
private String name; private String name;
@ApiModelProperty(value = "地图id", example = "1")
private Integer mapId;
@ApiModelProperty(value = "风险等级", example = "1", required = true) @ApiModelProperty(value = "风险等级", example = "1", required = true)
@Length(min = 6, max = 7, message = "请选择正确的颜色") @Length(min = 6, max = 7, message = "请选择正确的颜色")
@Pattern(regexp = RegEx.COLOUR_RGB, message = "颜色格式不正确")
private String riskGrade; private String riskGrade;
@ApiModelProperty(value = "消抖时间(秒)", example = "10", required = true) @ApiModelProperty(value = "消抖时间(秒)", example = "10", required = true)
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.district;
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/19 15:57
*/
@ApiModel("实时区域查询条件")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class DistrictRealtimeConditionParam implements Serializable {
@Serial
private static final long serialVersionUID = 5749083087928117992L;
@ApiModelProperty(value = "地图id", example = "1")
private Integer mapId;
}
...@@ -35,12 +35,12 @@ public class FenceAlarmConditionParam implements Serializable { ...@@ -35,12 +35,12 @@ public class FenceAlarmConditionParam implements Serializable {
@ApiModelProperty(value = "报警人员真名", example = "张三") @ApiModelProperty(value = "报警人员真名", example = "张三")
private String realName; private String realName;
@ApiModelProperty(value = "报警状态", example = "true|false") @ApiModelProperty(value = "报警状态", example = "true")
private Boolean status; private Boolean status;
@ApiModelProperty(value = "报警开始时间", example = "2022-05-06 14:00:00") @ApiModelProperty(value = "报警开始时间", example = "2022-05-06 14:00:00")
private LocalDateTime beginTime; private LocalDateTime beginTime;
@ApiModelProperty(value = "报警结束时间", example = "2022-05-7 14:00:00") @ApiModelProperty(value = "报警结束时间", example = "2022-05-07 14:00:00")
private LocalDateTime endTime; private LocalDateTime endTime;
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.fence;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/5/20 9:44
*/
@ApiModel("实时报警记录")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FenceAlarmLogParam implements Serializable {
@Serial
private static final long serialVersionUID = 3164664481416232633L;
@ApiModelProperty(value = "开始时间", example = "2022-05-01 00:00:00", required = true)
@NotNull(message = "开始时间不能为空")
private LocalDateTime beginTime;
@ApiModelProperty(value = "结束时间", example = "2022-10-30 00:00:00", required = true)
@NotNull(message = "结束时间不能为空")
private LocalDateTime endTime;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.fence;
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.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/5/18 10:08
*/
@ApiModel("围栏报警推送记录")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FenceAlarmPushLogConditionParam implements Serializable {
@Serial
private static final long serialVersionUID = -3348481008334535142L;
@ApiModelProperty(value = "围栏报警记录id", example = "1")
@NotNull(message = "围栏报警记录id不能为空")
private Long fenceAlarmId;
@ApiModelProperty(value = "通知方式: 1-app消息 2-短信通知 3-电话通知", example = "[1,2,3]", dataType = "array")
private Set<Integer> informManner;
@ApiModelProperty(value = "接受状态: 1-成功 2-失败", example = "1")
private Integer status;
@ApiModelProperty(value = "联系电话", example = "18283943672")
private String phone;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.fence;
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.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/5/19 17:26
*/
@ApiModel("实时围栏信息查询条件")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FenceRealtimeConditionParam implements Serializable {
@Serial
private static final long serialVersionUID = -8094425977297009035L;
@ApiModelProperty(value = "地图id", example = "1", required = true)
@NotNull(message = "地图id不能为空")
private Integer mapId;
}
...@@ -40,6 +40,11 @@ public class LocationFenceJobParam implements Serializable { ...@@ -40,6 +40,11 @@ public class LocationFenceJobParam implements Serializable {
private Long fenceId; private Long fenceId;
/** /**
* 围栏名称
*/
private String fenceName;
/**
* 报警类别id * 报警类别id
*/ */
private Long alarmTypeId; private Long alarmTypeId;
......
...@@ -45,7 +45,11 @@ public class LocationFenceRuleAddParam implements Serializable { ...@@ -45,7 +45,11 @@ public class LocationFenceRuleAddParam implements Serializable {
@NotNull(message = "所属的报警类别id不能为空") @NotNull(message = "所属的报警类别id不能为空")
private Long alarmTypeId; private Long alarmTypeId;
@ApiModelProperty(value = "设置的关联参数类型", example = "1", required = true) @ApiModelProperty(
value = "设置的关联参数类型:1-最多人数,2-最少人数,3-允许进入人员,4-不允许离开人员,5-静止时长,6-滞留时长,7-触发报警距离",
example = "1",
required = true
)
@NotNull(message = "所属的关联参数类别不能为空") @NotNull(message = "所属的关联参数类别不能为空")
@Range(min = RelevanceParamEnum.MIN, max = RelevanceParamEnum.MAX, message = "关联参数类别异常") @Range(min = RelevanceParamEnum.MIN, max = RelevanceParamEnum.MAX, message = "关联参数类别异常")
private Integer relevanceParamType; private Integer relevanceParamType;
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.rule; package com.yiring.app.param.location.rule;
import com.yiring.app.util.TimeUtil;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
...@@ -48,4 +52,31 @@ public class RuleParam implements Serializable { ...@@ -48,4 +52,31 @@ public class RuleParam implements Serializable {
private List<TimeAndNumberParam> timeAndNumber; private List<TimeAndNumberParam> timeAndNumber;
private List<TimeAndUserParam> timeAndUser; private List<TimeAndUserParam> timeAndUser;
/**
* 设置全时间生效
*/
public void setTimeAndNumberAll() {
Integer number = timeAndNumber.get(0).getNumber();
List<TimeParam> list = TimeUtil.WEEK
.stream()
.map(e -> TimeParam.builder().week(e).beginTime("00:00:00").endTime("23:59:59").build())
.collect(Collectors.toList());
TimeAndNumberParam timeAndNumberParam = TimeAndNumberParam.builder().number(number).time(list).build();
List<TimeAndNumberParam> arrayList = new ArrayList<>();
arrayList.add(timeAndNumberParam);
timeAndNumber = arrayList;
}
public void setTimeAndUserAll() {
Set<RelevanceUserParam> user = timeAndUser.get(0).getUser();
List<TimeParam> list = TimeUtil.WEEK
.stream()
.map(e -> TimeParam.builder().week(e).beginTime("00:00:00").endTime("23:59:59").build())
.collect(Collectors.toList());
TimeAndUserParam timeAndUserParam = TimeAndUserParam.builder().user(user).time(list).build();
List<TimeAndUserParam> arrayList = new ArrayList<>();
arrayList.add(timeAndUserParam);
timeAndUser = arrayList;
}
} }
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.rule; package com.yiring.app.param.location.rule;
import com.yiring.common.constant.RegEx;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import javax.validation.constraints.Pattern; import java.util.List;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
...@@ -27,13 +26,7 @@ public class TimeAndNumberParam implements Serializable { ...@@ -27,13 +26,7 @@ public class TimeAndNumberParam implements Serializable {
@Serial @Serial
private static final long serialVersionUID = -6796977663003158881L; private static final long serialVersionUID = -6796977663003158881L;
@ApiModelProperty(value = "起始时间", example = "星期一 08:00:00") private List<TimeParam> time;
@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") @ApiModelProperty(value = "人数", example = "100")
private Integer number; private Integer number;
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.rule; package com.yiring.app.param.location.rule;
import com.yiring.common.constant.RegEx;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
import java.util.Set; import java.util.Set;
import javax.validation.constraints.Pattern;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
...@@ -28,13 +26,7 @@ public class TimeAndUserParam implements Serializable { ...@@ -28,13 +26,7 @@ public class TimeAndUserParam implements Serializable {
@Serial @Serial
private static final long serialVersionUID = -7037620599825901175L; private static final long serialVersionUID = -7037620599825901175L;
@ApiModelProperty(value = "起始时间", example = "星期一 08:00:00") private List<TimeParam> time;
@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; 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 = "星期一")
@Pattern(regexp = RegEx.TIME_RULE, message = "时间格式不正确")
private String week;
@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;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.risk;
import com.yiring.app.domain.risk.RiskWarn;
import com.yiring.app.domain.risk.Threshold;
import com.yiring.app.domain.workArea.WorkArea;
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.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import lombok.Data;
import org.locationtech.jts.geom.Point;
/**
* @author tml
* @version 1.0
* @date 2022/5/23 15:04
*/
@ApiModel("风险预警管理")
@Data
public class RiskWarnAddParam implements Serializable {
@Serial
private static final long serialVersionUID = -322828089862736394L;
@ApiModelProperty(value = "所属工区id", example = "1", required = true)
@NotNull(message = "工区不能为空")
private Long workAreaId;
@ApiModelProperty(value = "安装位置", example = "组件厂区二楼", required = true)
@NotNull(message = "安装位置不能为空")
private String install;
@ApiModelProperty(value = "经纬度", required = true, dataType = "java.lang.String")
@NotNull(message = "经纬度不能为空")
private Point point;
@ApiModelProperty(value = "监控参数", example = "有毒气体报警器", required = true)
@NotNull(message = "监控参数不能为空")
private String monitoring;
@ApiModelProperty(value = "位号", example = "AT-4736", required = true)
@NotNull(message = "位号不能为空")
private String locationNum;
@ApiModelProperty(value = "量程起始值", example = "1.3")
@Pattern(regexp = RegEx.DIGIT_DECIMALS, message = "量程的数字格式不正确,只能为整数或小数")
private BigDecimal min;
@ApiModelProperty(value = "量程结束值", example = "50.2")
@Pattern(regexp = RegEx.DIGIT_DECIMALS, message = "量程的数字格式不正确,只能为整数或小数")
private BigDecimal max;
@ApiModelProperty(value = "量程单位", example = "ppm")
private String unit;
private List<ThresholdParam> thresholds;
public RiskWarn transform() {
WorkArea workArea = new WorkArea();
workArea.setId(workAreaId);
List<Threshold> list = thresholds.stream().map(ThresholdParam::transform).collect(Collectors.toList());
return RiskWarn
.builder()
.workArea(workArea)
.install(install)
.point(point)
.monitoring(monitoring)
.locationNum(locationNum)
.min(min)
.max(max)
.unit(unit)
.enable(true)
.thresholds(list)
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.risk;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import lombok.Data;
/**
* @author tml
* @version 1.0
* @date 2022/5/23 17:23
*/
@ApiModel("风险预警管理")
@Data
public class RiskWarnConditionParam implements Serializable {
@Serial
private static final long serialVersionUID = 6509069447006234492L;
@ApiModelProperty(value = "工区id", example = "1")
private Long workAreaId;
@ApiModelProperty(value = "监控参数", example = "有毒气体报警器")
private String monitoring;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.risk;
import com.yiring.app.domain.risk.RiskWarn;
import com.yiring.app.domain.risk.Threshold;
import com.yiring.app.domain.workArea.WorkArea;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;
import lombok.Data;
import org.locationtech.jts.geom.Point;
/**
* @author tml
* @version 1.0
* @date 2022/5/23 15:04
*/
@ApiModel("风险预警管理")
@Data
public class RiskWarnModifyParam implements Serializable {
@Serial
private static final long serialVersionUID = 1728064881609580496L;
@ApiModelProperty(value = "id", example = "1", required = true)
private Long id;
@ApiModelProperty(value = "所属工区id", example = "1", required = true)
private Long workAreaId;
@ApiModelProperty(value = "安装位置", example = "组件厂区二楼", required = true)
private String install;
@ApiModelProperty(value = "经纬度", required = true, dataType = "java.lang.String")
private Point point;
@ApiModelProperty(value = "监控参数", example = "有毒气体报警器", required = true)
private String monitoring;
@ApiModelProperty(value = "位号", example = "AT-4736", required = true)
private String locationNum;
@ApiModelProperty(value = "量程起始值", example = "1.3")
private BigDecimal min;
@ApiModelProperty(value = "量程结束值", example = "50.2")
private BigDecimal max;
@ApiModelProperty(value = "量程单位", example = "ppm")
private String unit;
private List<ThresholdParam> thresholds;
public RiskWarn transform() {
WorkArea workArea = new WorkArea();
workArea.setId(workAreaId);
List<Threshold> list = thresholds.stream().map(ThresholdParam::transform).collect(Collectors.toList());
return RiskWarn
.builder()
.id(id)
.workArea(workArea)
.install(install)
.point(point)
.monitoring(monitoring)
.locationNum(locationNum)
.min(min)
.max(max)
.unit(unit)
.enable(true)
.thresholds(list)
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.risk;
import com.yiring.app.domain.risk.Threshold;
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/5/20 17:42
*/
@ApiModel("风险预警管理")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ThresholdParam implements Serializable {
@Serial
private static final long serialVersionUID = 5075164198170220832L;
@ApiModelProperty(value = "阈值区间起始值", example = "1.5")
private String min;
@ApiModelProperty(value = "阈值区间结束值", example = "20.2")
private String max;
@ApiModelProperty(value = "阈值状态:1-低低,2-低,3-高,4-高高,5-熄灭", example = "1")
private Integer status;
@ApiModelProperty(value = "风险等级:1-红色风险,2-橙色风险,3-黄色风险,4-蓝色风险", example = "1")
private Integer riskLevel;
public Threshold transform() {
return Threshold.builder().min(min).max(max).status(status).riskLevel(riskLevel).build();
}
}
...@@ -4,8 +4,10 @@ package com.yiring.app.service.analysis.history; ...@@ -4,8 +4,10 @@ package com.yiring.app.service.analysis.history;
import com.yiring.app.param.analysis.history.HistoryRouteConditionParam; import com.yiring.app.param.analysis.history.HistoryRouteConditionParam;
import com.yiring.app.vo.analysis.history.HistoryRouteVo; import com.yiring.app.vo.analysis.history.HistoryRouteVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
/** /**
* @author tml * @author tml
...@@ -21,6 +23,14 @@ public interface HistoryRouteService { ...@@ -21,6 +23,14 @@ public interface HistoryRouteService {
Result<PageVo<HistoryRouteVo>> findByCondition(HistoryRouteConditionParam param); Result<PageVo<HistoryRouteVo>> findByCondition(HistoryRouteConditionParam param);
/** /**
* 分页条件查询
* @param param 条件
* @param pageParam 分页参数
* @return 历史轨迹信息
*/
Result<PageVo<HistoryRouteVo>> findByPage(@Valid HistoryRouteConditionParam param, @Valid PageParam pageParam);
/**
* 导出历史轨迹信息 * 导出历史轨迹信息
* @param param 地图、员工和时间条件 * @param param 地图、员工和时间条件
* @param response 历史轨迹信息 * @param response 历史轨迹信息
......
...@@ -12,6 +12,7 @@ import com.yiring.app.vo.analysis.history.HistoryRouteVo; ...@@ -12,6 +12,7 @@ import com.yiring.app.vo.analysis.history.HistoryRouteVo;
import com.yiring.app.vo.map.MapVo; import com.yiring.app.vo.map.MapVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.core.Status; import com.yiring.common.core.Status;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.URLEncoder; import java.net.URLEncoder;
...@@ -25,6 +26,7 @@ import javax.persistence.criteria.Predicate; ...@@ -25,6 +26,7 @@ import javax.persistence.criteria.Predicate;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -63,6 +65,27 @@ public class HistoryRouteServiceImpl implements HistoryRouteService { ...@@ -63,6 +65,27 @@ public class HistoryRouteServiceImpl implements HistoryRouteService {
} }
@Override @Override
public Result<PageVo<HistoryRouteVo>> findByPage(HistoryRouteConditionParam param, PageParam pageParam) {
Pageable pageable = PageParam.toPageable(pageParam);
Specification<LocationLog> specification = getSpecification(param);
ArrayList<MapVo.MapVoReuslt> list1 = new ArrayList<>();
List<LocationLog> list = locationLogRepository
.findAll(specification, pageable)
.stream()
.collect(Collectors.toList());
List<HistoryRouteVo> voList = list
.stream()
.map(e -> {
HistoryRouteVo routeVo = HistoryRouteVo.transform(e);
routeVo.setMapName(mapUtil.getMapName(e.getAreaId().intValue()));
return routeVo;
})
.collect(Collectors.toList());
PageVo<HistoryRouteVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo);
}
@Override
public void exportHistoryRoute(HistoryRouteConditionParam param, HttpServletResponse response) { public void exportHistoryRoute(HistoryRouteConditionParam param, HttpServletResponse response) {
Result<PageVo<HistoryRouteVo>> result = findByCondition(param); Result<PageVo<HistoryRouteVo>> result = findByCondition(param);
if (Status.OK.value() != result.getStatus()) { if (Status.OK.value() != result.getStatus()) {
......
...@@ -3,6 +3,9 @@ package com.yiring.app.service.district; ...@@ -3,6 +3,9 @@ package com.yiring.app.service.district;
import com.yiring.app.param.district.DistrictAddParam; import com.yiring.app.param.district.DistrictAddParam;
import com.yiring.app.param.district.DistrictModifyParam; import com.yiring.app.param.district.DistrictModifyParam;
import com.yiring.app.param.district.DistrictRealtimeConditionParam;
import com.yiring.app.vo.district.DistrictDetailsVo;
import com.yiring.app.vo.district.DistrictUserVo;
import com.yiring.app.vo.district.DistrictVo; import com.yiring.app.vo.district.DistrictVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
...@@ -42,4 +45,18 @@ public interface DistrictService { ...@@ -42,4 +45,18 @@ public interface DistrictService {
* @return 区域信息 * @return 区域信息
*/ */
Result<PageVo<DistrictVo>> findByNameLike(String name); Result<PageVo<DistrictVo>> findByNameLike(String name);
/**
* 查询实时区域列表信息
* @param param 条件
* @return 区域列表
*/
Result<PageVo<DistrictDetailsVo>> findRealtimeList(DistrictRealtimeConditionParam param);
/**
* 查询区域内员工数量
* @param param 条件
* @return 区域列表
*/
Result<PageVo<DistrictUserVo>> findDistrictUser(DistrictRealtimeConditionParam param);
} }
...@@ -5,18 +5,25 @@ import com.yiring.app.domain.district.District; ...@@ -5,18 +5,25 @@ import com.yiring.app.domain.district.District;
import com.yiring.app.domain.district.DistrictRepository; import com.yiring.app.domain.district.DistrictRepository;
import com.yiring.app.param.district.DistrictAddParam; import com.yiring.app.param.district.DistrictAddParam;
import com.yiring.app.param.district.DistrictModifyParam; import com.yiring.app.param.district.DistrictModifyParam;
import com.yiring.app.param.district.DistrictRealtimeConditionParam;
import com.yiring.app.service.district.DistrictService; import com.yiring.app.service.district.DistrictService;
import com.yiring.app.util.JpaUtil; import com.yiring.app.util.JpaUtil;
import com.yiring.app.vo.district.DistrictDetailsVo;
import com.yiring.app.vo.district.DistrictUserVo;
import com.yiring.app.vo.district.DistrictVo; import com.yiring.app.vo.district.DistrictVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.core.Status; import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
import com.yiring.common.util.Commons; import com.yiring.common.util.Commons;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.persistence.criteria.Predicate;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -90,4 +97,36 @@ public class DistrictServiceImpl implements DistrictService { ...@@ -90,4 +97,36 @@ public class DistrictServiceImpl implements DistrictService {
PageVo<DistrictVo> pageVo = PageVo.build(voList, voList.size()); PageVo<DistrictVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo); return Result.ok(pageVo);
} }
@Override
public Result<PageVo<DistrictDetailsVo>> findRealtimeList(DistrictRealtimeConditionParam param) {
Specification<District> specification = getSpecification(param);
List<District> districtList = districtRepository.findAll(specification);
List<DistrictDetailsVo> voList = districtList
.stream()
.map(DistrictDetailsVo::transform)
.collect(Collectors.toList());
PageVo<DistrictDetailsVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo);
}
@Override
public Result<PageVo<DistrictUserVo>> findDistrictUser(DistrictRealtimeConditionParam param) {
Specification<District> specification = getSpecification(param);
List<District> districtList = districtRepository.findAll(specification);
List<DistrictUserVo> voList = districtList.stream().map(DistrictUserVo::transform).collect(Collectors.toList());
PageVo<DistrictUserVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo);
}
private Specification<District> getSpecification(DistrictRealtimeConditionParam param) {
return (root, query, criteriaBuilder) -> {
ArrayList<Predicate> list = new ArrayList<>();
if (param.getMapId() != null) {
list.add(criteriaBuilder.equal(root.get(District.Fields.mapId), param.getMapId()));
}
Predicate[] array = list.toArray(new Predicate[0]);
return criteriaBuilder.and(array);
};
}
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.location.fence;
import com.yiring.app.param.location.fence.FenceAlarmPushLogConditionParam;
import com.yiring.app.vo.location.fence.FenceAlarmPushLogVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import javax.validation.Valid;
/**
* @author tml
* @version 1.0
* @date 2022/5/18 10:26
*/
public interface FenceAlarmPushLogService {
/**
* 查询围栏报警推送记录列表
* @param conditionParam 条件参数
* @param pageParam 分页参数
* @return 推送记录
*/
Result<PageVo<FenceAlarmPushLogVo>> findList(
@Valid FenceAlarmPushLogConditionParam conditionParam,
@Valid PageParam pageParam
);
}
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.location.fence; package com.yiring.app.service.location.fence;
import com.yiring.app.domain.location.LocationFenceAlarm;
import com.yiring.app.param.location.fence.FenceAlarmConditionParam; import com.yiring.app.param.location.fence.FenceAlarmConditionParam;
import com.yiring.app.param.location.fence.FenceAlarmLogParam;
import com.yiring.app.param.location.fence.FenceRealtimeConditionParam;
import com.yiring.app.vo.IdNameVo; import com.yiring.app.vo.IdNameVo;
import com.yiring.app.vo.location.fence.FenceAlarmLogVo;
import com.yiring.app.vo.location.fence.FenceAlarmRealtimeVo;
import com.yiring.app.vo.location.fence.FenceAlarmVo; import com.yiring.app.vo.location.fence.FenceAlarmVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam; import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import java.util.List;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
/** /**
* @author tml * @author tml
...@@ -32,6 +40,30 @@ public interface FenceAlarmService { ...@@ -32,6 +40,30 @@ public interface FenceAlarmService {
/** /**
* 导出围栏报警数据 * 导出围栏报警数据
* @param param 查询条件 * @param param 查询条件
* @param response response
*/ */
void export(FenceAlarmConditionParam param, HttpServletResponse response); void export(FenceAlarmConditionParam param, HttpServletResponse response);
Result<FenceAlarmVo> findOne(IdParam idParam);
/**
* 推送报警信息给前端
* @param newAlarm 新生成的报警信息
*/
void alarmPushWeb(List<LocationFenceAlarm> newAlarm);
/**
* 查询报警记录统计
* @param fenceAlarmLogParam 条件
* @return 报警记录统计
*/
Result<PageVo<FenceAlarmLogVo>> findAlarmLog(FenceAlarmLogParam fenceAlarmLogParam);
/**
* 查询正在报警的报警记录
* @param param 条件
* @param pageParam 分页参数
* @return 报警信息
*/
Result<PageVo<FenceAlarmRealtimeVo>> fenRealtimeList(@Valid FenceRealtimeConditionParam param, PageParam pageParam);
} }
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.location.fence; package com.yiring.app.service.location.fence;
import com.yiring.app.param.location.fence.FenceRealtimeConditionParam;
import com.yiring.app.param.location.fence.LocationFenceAddParam; import com.yiring.app.param.location.fence.LocationFenceAddParam;
import com.yiring.app.param.location.fence.LocationFenceConditionParam; import com.yiring.app.param.location.fence.LocationFenceConditionParam;
import com.yiring.app.param.location.fence.LocationFenceModifyParam; import com.yiring.app.param.location.fence.LocationFenceModifyParam;
import com.yiring.app.vo.CodeNameVo; import com.yiring.app.vo.CodeNameVo;
import com.yiring.app.vo.location.fence.FenceRealtimeVo;
import com.yiring.app.vo.location.fence.LocationFenceGeoVo;
import com.yiring.app.vo.location.fence.LocationFenceSearchVo; import com.yiring.app.vo.location.fence.LocationFenceSearchVo;
import com.yiring.app.vo.location.fence.LocationFenceVo; import com.yiring.app.vo.location.fence.LocationFenceVo;
import com.yiring.auth.param.IdsParam;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam; import com.yiring.common.param.PageParam;
...@@ -49,11 +53,18 @@ public interface LocationFenceService { ...@@ -49,11 +53,18 @@ public interface LocationFenceService {
Result<PageVo<LocationFenceVo>> findList(LocationFenceConditionParam conditionParam, PageParam pageParam); Result<PageVo<LocationFenceVo>> findList(LocationFenceConditionParam conditionParam, PageParam pageParam);
/** /**
* 查询围栏的位置信息列表
* @param conditionParam 条件
* @return 是否成功
*/
Result<PageVo<LocationFenceGeoVo>> findGeoList(LocationFenceConditionParam conditionParam);
/**
* 根据id查询围栏信息 * 根据id查询围栏信息
* @param param id * @param param id
* @return 详细信息 * @return 详细信息
*/ */
Result<LocationFenceVo> findById(@Valid IdParam param); Result<LocationFenceVo> findById(IdParam param);
/** /**
* 根据名称模糊查询围栏信息 * 根据名称模糊查询围栏信息
...@@ -67,4 +78,27 @@ public interface LocationFenceService { ...@@ -67,4 +78,27 @@ public interface LocationFenceService {
* @return 地图下拉框 * @return 地图下拉框
*/ */
Result<PageVo<CodeNameVo>> findMapList(); Result<PageVo<CodeNameVo>> findMapList();
/**
* 启用或停用一个围栏
* @param idParam 围栏id
* @param enable true:启用 false:停用
* @return 是否成功
*/
Result<String> enable(IdParam idParam, Boolean enable);
/**
* 批量启用或停用围栏
* @param idsParam 围栏id集
* @param enable true:启用 false:停用
* @return 是否成功
*/
Result<String> batchEnable(@Valid IdsParam idsParam, Boolean enable);
/**
* 查询实时围栏信息
* @param param 条件
* @return 是否成功
*/
Result<PageVo<FenceRealtimeVo>> fenRealtimeList(FenceRealtimeConditionParam param);
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.location.fence.impl;
import com.yiring.app.domain.location.FenceAlarmPushLog;
import com.yiring.app.domain.location.FenceAlarmPushLogRepository;
import com.yiring.app.param.location.fence.FenceAlarmPushLogConditionParam;
import com.yiring.app.service.location.fence.FenceAlarmPushLogService;
import com.yiring.app.vo.location.fence.FenceAlarmPushLogVo;
import com.yiring.auth.domain.user.User;
import com.yiring.common.core.Result;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.persistence.criteria.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author tml
* @version 1.0
* @date 2022/5/18 10:27
*/
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
public class FenceAlarmPushLogServiceImpl implements FenceAlarmPushLogService {
@Resource
private FenceAlarmPushLogRepository fenceAlarmPushLogRepository;
@Override
public Result<PageVo<FenceAlarmPushLogVo>> findList(
FenceAlarmPushLogConditionParam conditionParam,
PageParam pageParam
) {
Pageable pageable = PageParam.toPageable(pageParam);
Specification<FenceAlarmPushLog> specification = (root, query, criteriaBuilder) -> {
ArrayList<Predicate> list = new ArrayList<>();
if (conditionParam.getFenceAlarmId() != null) {
list.add(
criteriaBuilder.equal(
root.get(FenceAlarmPushLog.Fields.fenceAlarm),
conditionParam.getFenceAlarmId()
)
);
}
if (conditionParam.getInformManner() != null) {
CriteriaBuilder.In<Object> in = criteriaBuilder.in(root.get(FenceAlarmPushLog.Fields.informManner));
for (Integer item : conditionParam.getInformManner()) {
in.value(item);
}
list.add(in);
}
if (conditionParam.getStatus() != null) {
list.add(criteriaBuilder.equal(root.get(FenceAlarmPushLog.Fields.status), conditionParam.getStatus()));
}
if (conditionParam.getPhone() != null) {
Join<Object, Object> join = root.join(FenceAlarmPushLog.Fields.user, JoinType.LEFT);
list.add(criteriaBuilder.like(join.get(User.Fields.mobile), "%" + conditionParam.getPhone() + "%"));
}
Predicate[] array = list.toArray(new Predicate[0]);
return criteriaBuilder.and(array);
};
Page<FenceAlarmPushLog> page = fenceAlarmPushLogRepository.findAll(specification, pageable);
List<FenceAlarmPushLogVo> voList = page.get().map(FenceAlarmPushLogVo::transform).collect(Collectors.toList());
PageVo<FenceAlarmPushLogVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo);
}
}
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.location.fence.impl; package com.yiring.app.service.location.fence.impl;
import static com.yiring.app.domain.location.LocationFenceAlarm.Status.ING;
import static java.util.stream.Collectors.toList;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder; import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder;
import com.yiring.app.constant.alarm.FenceTypeEnum;
import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.domain.location.LocationFence; import com.yiring.app.domain.location.LocationFence;
import com.yiring.app.domain.location.LocationFenceAlarm; import com.yiring.app.domain.location.LocationFenceAlarm;
import com.yiring.app.domain.location.LocationFenceAlarmRepository; import com.yiring.app.domain.location.LocationFenceAlarmRepository;
import com.yiring.app.domain.location.LocationFenceRepository; import com.yiring.app.domain.location.LocationFenceRepository;
import com.yiring.app.excel.location.fence.FenceAlarmExcel; import com.yiring.app.excel.location.fence.FenceAlarmExcel;
import com.yiring.app.param.location.fence.FenceAlarmConditionParam; import com.yiring.app.param.location.fence.FenceAlarmConditionParam;
import com.yiring.app.param.location.fence.FenceAlarmLogParam;
import com.yiring.app.param.location.fence.FenceRealtimeConditionParam;
import com.yiring.app.service.location.fence.FenceAlarmService; import com.yiring.app.service.location.fence.FenceAlarmService;
import com.yiring.app.util.MapUtil; import com.yiring.app.util.MapUtil;
import com.yiring.app.vo.IdNameVo; import com.yiring.app.vo.IdNameVo;
import com.yiring.app.vo.location.fence.FenceAlarmLogVo;
import com.yiring.app.vo.location.fence.FenceAlarmRealtimeVo;
import com.yiring.app.vo.location.fence.FenceAlarmVo; import com.yiring.app.vo.location.fence.FenceAlarmVo;
import com.yiring.auth.domain.user.User; import com.yiring.auth.domain.user.User;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam; import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import java.io.OutputStream; import java.io.OutputStream;
...@@ -21,18 +34,20 @@ import java.net.URLEncoder; ...@@ -21,18 +34,20 @@ import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.persistence.criteria.Join; import javax.persistence.criteria.*;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Predicate;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -53,6 +68,9 @@ public class FenceAlarmServiceImpl implements FenceAlarmService { ...@@ -53,6 +68,9 @@ public class FenceAlarmServiceImpl implements FenceAlarmService {
private LocationFenceRepository locationFenceRepository; private LocationFenceRepository locationFenceRepository;
@Resource @Resource
SimpMessagingTemplate simpMessagingTemplate;
@Resource
private MapUtil mapUtil; private MapUtil mapUtil;
@Override @Override
...@@ -126,6 +144,107 @@ public class FenceAlarmServiceImpl implements FenceAlarmService { ...@@ -126,6 +144,107 @@ public class FenceAlarmServiceImpl implements FenceAlarmService {
} }
} }
@Override
public Result<FenceAlarmVo> findOne(IdParam idParam) {
Optional<LocationFenceAlarm> optional = locationFenceAlarmRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "报警记录不存在");
}
FenceAlarmVo vo = FenceAlarmVo.transform(optional.get());
return Result.ok(vo);
}
@Async
@Override
public void alarmPushWeb(List<LocationFenceAlarm> newAlarm) {
JSONArray jsonArray = new JSONArray();
for (LocationFenceAlarm item : newAlarm) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("fence", item.getFence().getName());
jsonObject.put("map", mapUtil.getMapName(item.getAreaId().intValue()));
jsonObject.put("user", item.getUser().getRealName());
jsonObject.put("tagId", item.getTag().getId());
jsonObject.put("startTime", item.getStartTime());
jsonObject.put("AlarmType", item.getType().getName());
jsonObject.put("status", item.getStatus().text());
jsonArray.add(jsonObject);
}
simpMessagingTemplate.convertAndSend("/topic/position", jsonArray.toJSONString());
}
@Override
public Result<PageVo<FenceAlarmLogVo>> findAlarmLog(FenceAlarmLogParam param) {
Specification<LocationFenceAlarm> specification = (root, query, criteriaBuilder) -> {
ArrayList<Predicate> list = new ArrayList<>();
if (param.getBeginTime() != null) {
list.add(
criteriaBuilder.greaterThanOrEqualTo(
root.get(LocationFenceAlarm.Fields.startTime),
param.getBeginTime()
)
);
}
if (param.getEndTime() != null) {
list.add(
criteriaBuilder.lessThanOrEqualTo(root.get(LocationFenceAlarm.Fields.startTime), param.getEndTime())
);
}
Predicate[] array = list.toArray(new Predicate[0]);
return criteriaBuilder.and(array);
};
List<LocationFenceAlarm> alarmList = locationFenceAlarmRepository.findAll(specification);
Map<Integer, List<LocationFenceAlarm>> map = alarmList
.stream()
.collect(Collectors.groupingBy(e -> e.getFence().getFenceType()));
List<FenceAlarmLogVo> voList = map
.keySet()
.stream()
.map(e ->
FenceAlarmLogVo
.builder()
.fenceType(e)
.fenceTypeName(FenceTypeEnum.getByCode(e))
.number(map.get(e).size())
.build()
)
.collect(toList());
for (FenceAlarmLogVo item : voList) {
List<LocationFenceAlarm> list = map.get(item.getFenceType());
Map<AlarmType, List<LocationFenceAlarm>> listMap = list
.stream()
.collect(Collectors.groupingBy(LocationFenceAlarm::getType));
List<FenceAlarmLogVo.AlarmTypeVo> alarmTypeVos = listMap
.keySet()
.stream()
.map(e -> new FenceAlarmLogVo.AlarmTypeVo(e.getId(), e.getName(), listMap.get(e).size()))
.collect(toList());
item.setAlarmTypeVos(alarmTypeVos);
}
PageVo<FenceAlarmLogVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo);
}
@Override
public Result<PageVo<FenceAlarmRealtimeVo>> fenRealtimeList(
FenceRealtimeConditionParam param,
PageParam pageParam
) {
Pageable pageable = PageParam.toPageable(pageParam);
Specification<LocationFenceAlarm> specification = (root, query, criteriaBuilder) -> {
ArrayList<Predicate> list = new ArrayList<>();
if (param.getMapId() != null) {
list.add(criteriaBuilder.equal(root.get(LocationFenceAlarm.Fields.areaId), param.getMapId()));
}
list.add(criteriaBuilder.equal(root.get(LocationFenceAlarm.Fields.status), ING));
Predicate[] array = list.toArray(new Predicate[0]);
return criteriaBuilder.and(array);
};
Page<LocationFenceAlarm> page = locationFenceAlarmRepository.findAll(specification, pageable);
List<FenceAlarmRealtimeVo> voList = page.get().map(FenceAlarmRealtimeVo::transform).collect(toList());
PageVo<FenceAlarmRealtimeVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo);
}
private Specification<LocationFenceAlarm> getSpecification(FenceAlarmConditionParam param) { private Specification<LocationFenceAlarm> getSpecification(FenceAlarmConditionParam param) {
return (root, query, criteriaBuilder) -> { return (root, query, criteriaBuilder) -> {
ArrayList<Predicate> list = new ArrayList<>(); ArrayList<Predicate> list = new ArrayList<>();
...@@ -138,7 +257,7 @@ public class FenceAlarmServiceImpl implements FenceAlarmService { ...@@ -138,7 +257,7 @@ public class FenceAlarmServiceImpl implements FenceAlarmService {
} }
if (param.getRealName() != null) { if (param.getRealName() != null) {
Join<Object, Object> join = root.join(LocationFenceAlarm.Fields.user, JoinType.LEFT); Join<Object, Object> join = root.join(LocationFenceAlarm.Fields.user, JoinType.LEFT);
list.add(criteriaBuilder.equal(join.get(User.Fields.realName), param.getRealName())); list.add(criteriaBuilder.like(join.get(User.Fields.realName), "%" + param.getRealName() + "%"));
} }
if (param.getStatus() != null) { if (param.getStatus() != null) {
list.add( list.add(
...@@ -158,7 +277,7 @@ public class FenceAlarmServiceImpl implements FenceAlarmService { ...@@ -158,7 +277,7 @@ public class FenceAlarmServiceImpl implements FenceAlarmService {
} }
if (param.getEndTime() != null) { if (param.getEndTime() != null) {
list.add( list.add(
criteriaBuilder.lessThanOrEqualTo(root.get(LocationFenceAlarm.Fields.endTime), param.getEndTime()) criteriaBuilder.lessThanOrEqualTo(root.get(LocationFenceAlarm.Fields.startTime), param.getEndTime())
); );
} }
Predicate[] array = list.toArray(new Predicate[0]); Predicate[] array = list.toArray(new Predicate[0]);
......
...@@ -5,21 +5,26 @@ import com.alibaba.fastjson.JSONArray; ...@@ -5,21 +5,26 @@ import com.alibaba.fastjson.JSONArray;
import com.yiring.app.constant.RedisKey; import com.yiring.app.constant.RedisKey;
import com.yiring.app.domain.location.LocationFence; import com.yiring.app.domain.location.LocationFence;
import com.yiring.app.domain.location.LocationFenceRepository; import com.yiring.app.domain.location.LocationFenceRepository;
import com.yiring.app.param.location.fence.FenceRealtimeConditionParam;
import com.yiring.app.param.location.fence.LocationFenceAddParam; import com.yiring.app.param.location.fence.LocationFenceAddParam;
import com.yiring.app.param.location.fence.LocationFenceConditionParam; import com.yiring.app.param.location.fence.LocationFenceConditionParam;
import com.yiring.app.param.location.fence.LocationFenceModifyParam; import com.yiring.app.param.location.fence.LocationFenceModifyParam;
import com.yiring.app.service.location.fence.LocationFenceService; import com.yiring.app.service.location.fence.LocationFenceService;
import com.yiring.app.util.JpaUtil; import com.yiring.app.util.JpaUtil;
import com.yiring.app.vo.CodeNameVo; import com.yiring.app.vo.CodeNameVo;
import com.yiring.app.vo.location.fence.FenceRealtimeVo;
import com.yiring.app.vo.location.fence.LocationFenceGeoVo;
import com.yiring.app.vo.location.fence.LocationFenceSearchVo; import com.yiring.app.vo.location.fence.LocationFenceSearchVo;
import com.yiring.app.vo.location.fence.LocationFenceVo; import com.yiring.app.vo.location.fence.LocationFenceVo;
import com.yiring.app.vo.map.MapVo; import com.yiring.app.vo.map.MapVo;
import com.yiring.auth.param.IdsParam;
import com.yiring.common.core.Redis; import com.yiring.common.core.Redis;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.core.Status; import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam; import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
...@@ -32,6 +37,7 @@ import org.springframework.data.domain.Pageable; ...@@ -32,6 +37,7 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
/** /**
* 围栏信息service * 围栏信息service
...@@ -92,13 +98,34 @@ public class LocationFenceServiceImpl implements LocationFenceService { ...@@ -92,13 +98,34 @@ public class LocationFenceServiceImpl implements LocationFenceService {
if (optional.isEmpty()) { if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要删除的围栏信息不存在"); return Result.no(Status.EXPECTATION_FAILED, "要删除的围栏信息不存在");
} }
if (!CollectionUtils.isEmpty(optional.get().getRules())) {
return Result.no(Status.EXPECTATION_FAILED, "要删除的围栏已经配置了规则,不能删除");
}
optional.get().setDeleted(true); optional.get().setDeleted(true);
return Result.ok(); return Result.ok();
} }
@Override @Override
public Result<PageVo<LocationFenceVo>> findList(LocationFenceConditionParam conditionParam, PageParam pageParam) { public Result<PageVo<LocationFenceVo>> findList(LocationFenceConditionParam conditionParam, PageParam pageParam) {
Specification<LocationFence> specification = (root, query, criteriaBuilder) -> { Specification<LocationFence> specification = getSpecification(conditionParam);
Pageable pageable = PageParam.toPageable(pageParam);
Page<LocationFence> fencePage = locationFenceRepository.findAll(specification, pageable);
List<LocationFenceVo> voList = fencePage.get().map(LocationFenceVo::transform).collect(Collectors.toList());
PageVo<LocationFenceVo> pageVo = PageVo.build(voList, fencePage.getTotalElements());
return Result.ok(pageVo);
}
@Override
public Result<PageVo<LocationFenceGeoVo>> findGeoList(LocationFenceConditionParam conditionParam) {
Specification<LocationFence> specification = getSpecification(conditionParam);
List<LocationFence> list = locationFenceRepository.findAll(specification);
List<LocationFenceGeoVo> voList = list.stream().map(LocationFenceGeoVo::transform).collect(Collectors.toList());
PageVo<LocationFenceGeoVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo);
}
private Specification<LocationFence> getSpecification(LocationFenceConditionParam conditionParam) {
return (root, query, criteriaBuilder) -> {
ArrayList<Predicate> list = new ArrayList<>(); ArrayList<Predicate> list = new ArrayList<>();
if (conditionParam.getMapId() != null) { if (conditionParam.getMapId() != null) {
list.add(criteriaBuilder.equal(root.get("mapId"), conditionParam.getMapId())); list.add(criteriaBuilder.equal(root.get("mapId"), conditionParam.getMapId()));
...@@ -109,11 +136,6 @@ public class LocationFenceServiceImpl implements LocationFenceService { ...@@ -109,11 +136,6 @@ public class LocationFenceServiceImpl implements LocationFenceService {
Predicate[] array = list.toArray(new Predicate[0]); Predicate[] array = list.toArray(new Predicate[0]);
return criteriaBuilder.and(array); return criteriaBuilder.and(array);
}; };
Pageable pageable = PageParam.toPageable(pageParam);
Page<LocationFence> fencePage = locationFenceRepository.findAll(specification, pageable);
List<LocationFenceVo> voList = fencePage.get().map(LocationFenceVo::transform).collect(Collectors.toList());
PageVo<LocationFenceVo> pageVo = PageVo.build(voList, fencePage.getTotalElements());
return Result.ok(pageVo);
} }
@Override @Override
...@@ -150,4 +172,38 @@ public class LocationFenceServiceImpl implements LocationFenceService { ...@@ -150,4 +172,38 @@ public class LocationFenceServiceImpl implements LocationFenceService {
PageVo<CodeNameVo> pageVo = PageVo.build(voList, voList.size()); PageVo<CodeNameVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo); return Result.ok(pageVo);
} }
@Override
public Result<String> enable(IdParam idParam, Boolean enable) {
Optional<LocationFence> optional = locationFenceRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "围栏不存在");
}
optional.get().setEnable(enable);
return Result.ok();
}
@Override
public Result<String> batchEnable(IdsParam idsParam, Boolean enable) {
int i = locationFenceRepository.batchEnable(idsParam.toIds(), enable, LocalDateTime.now());
String s = enable ? "启用了" : "停用了";
return Result.ok(s + i + "个围栏");
}
@Override
public Result<PageVo<FenceRealtimeVo>> fenRealtimeList(FenceRealtimeConditionParam param) {
Specification<LocationFence> specification = (root, query, criteriaBuilder) -> {
ArrayList<Predicate> list = new ArrayList<>();
if (param.getMapId() != null) {
list.add(criteriaBuilder.equal(root.get(LocationFence.Fields.mapId), param.getMapId()));
}
list.add(criteriaBuilder.equal(root.get(LocationFence.Fields.enable), true));
Predicate[] array = list.toArray(new Predicate[0]);
return criteriaBuilder.and(array);
};
List<LocationFence> list = locationFenceRepository.findAll(specification);
List<FenceRealtimeVo> voList = list.stream().map(FenceRealtimeVo::transform).collect(Collectors.toList());
PageVo<FenceRealtimeVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo);
}
} }
...@@ -6,6 +6,7 @@ import com.yiring.app.param.location.rule.LocationFenceRuleModifyParam; ...@@ -6,6 +6,7 @@ import com.yiring.app.param.location.rule.LocationFenceRuleModifyParam;
import com.yiring.app.vo.location.rule.LocationFenceRuleVo; import com.yiring.app.vo.location.rule.LocationFenceRuleVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
import com.yiring.common.vo.PageVo;
/** /**
* @author tml * @author tml
...@@ -40,4 +41,11 @@ public interface LocationFenceRuleService { ...@@ -40,4 +41,11 @@ public interface LocationFenceRuleService {
* @return 规则信息 * @return 规则信息
*/ */
Result<LocationFenceRuleVo> findRule(IdParam idParam); Result<LocationFenceRuleVo> findRule(IdParam idParam);
/**
* 根据围栏id查询报警信息
* @param idParam 围栏id
* @return 规则信息
*/
Result<PageVo<LocationFenceRuleVo>> findByFenceId(IdParam idParam);
} }
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.location.rule.impl; 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.LocationFenceRule;
import com.yiring.app.domain.location.LocationFenceRuleRepository; import com.yiring.app.domain.location.LocationFenceRuleRepository;
import com.yiring.app.param.location.rule.LocationFenceRuleAddParam; import com.yiring.app.param.location.rule.LocationFenceRuleAddParam;
...@@ -11,7 +12,11 @@ import com.yiring.app.vo.location.rule.LocationFenceRuleVo; ...@@ -11,7 +12,11 @@ import com.yiring.app.vo.location.rule.LocationFenceRuleVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.core.Status; import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
import com.yiring.common.vo.PageVo;
import java.util.Comparator;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import javax.annotation.Resource; import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -62,9 +67,26 @@ public class LocationFenceRuleServiceImpl implements LocationFenceRuleService { ...@@ -62,9 +67,26 @@ public class LocationFenceRuleServiceImpl implements LocationFenceRuleService {
public Result<LocationFenceRuleVo> findRule(IdParam idParam) { public Result<LocationFenceRuleVo> findRule(IdParam idParam) {
Optional<LocationFenceRule> optional = locationFenceRuleRepository.findById(idParam.getId()); Optional<LocationFenceRule> optional = locationFenceRuleRepository.findById(idParam.getId());
if (optional.isEmpty()) { if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要删除的规则不存在"); return Result.no(Status.EXPECTATION_FAILED, "要查询的规则不存在");
} }
LocationFenceRuleVo ruleVo = LocationFenceRuleVo.transform(optional.get()); LocationFenceRuleVo ruleVo = LocationFenceRuleVo.transform(optional.get());
return Result.ok(ruleVo); 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)
.sorted(
Comparator
.comparing(LocationFenceRuleVo::getRelevanceParamType)
.thenComparing(LocationFenceRuleVo::getId)
)
.collect(Collectors.toList());
PageVo<LocationFenceRuleVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo);
}
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.risk;
import com.yiring.app.param.risk.RiskWarnAddParam;
import com.yiring.app.param.risk.RiskWarnConditionParam;
import com.yiring.app.param.risk.RiskWarnModifyParam;
import com.yiring.app.vo.risk.RiskWarnDetailVo;
import com.yiring.app.vo.risk.RiskWarnVo;
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 java.util.Set;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import org.springframework.web.multipart.MultipartFile;
/**
* @author tml
* @version 1.0
* @date 2022/5/23 17:42
*/
public interface RiskWarnService {
/**
* 添加一条
* @param param 风险预警信息
* @return 是否成功
*/
Result<String> addOne(@Valid RiskWarnAddParam param);
/**
* 修改一条
* @param param 风险预警信息
* @return 是否成功
*/
Result<String> modifyOne(@Valid RiskWarnModifyParam param);
/**
* 删除一条
* @param idParam id
* @return 是否成功
*/
Result<String> removeOne(@Valid IdParam idParam);
/**
* 查询一条
* @param idParam id
* @return 风险预警详细信息
*/
Result<RiskWarnDetailVo> findOne(@Valid IdParam idParam);
/**
* 查询列表
* @param conditionParam 条件
* @param pageParam 分页参数
* @return 列表
*/
Result<PageVo<RiskWarnVo>> findList(@Valid RiskWarnConditionParam conditionParam, @Valid PageParam pageParam);
/**
* 导出
* @param conditionParam 条件
* @param response response
*/
void exportRiskWarn(@Valid RiskWarnConditionParam conditionParam, HttpServletResponse response);
/**
* 导入
* @param file excel文件
* @return 是否成功
*/
Result<String> importRiskWarn(MultipartFile file);
/**
* 导出模板
* @param response response
*/
void exportTemplate(HttpServletResponse response);
/**
* 批量启用或停用
* @param ids ids
* @param enable 启用:true-启用,false-停用
* @return 是否成功
*/
Result<String> batchEnable(Set<Long> ids, boolean enable);
}
...@@ -4,6 +4,8 @@ package com.yiring.app.util; ...@@ -4,6 +4,8 @@ package com.yiring.app.util;
import com.yiring.common.constant.RegEx; import com.yiring.common.constant.RegEx;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
/** /**
* @author tml * @author tml
...@@ -12,6 +14,18 @@ import java.time.format.DateTimeFormatter; ...@@ -12,6 +14,18 @@ import java.time.format.DateTimeFormatter;
*/ */
public class TimeUtil { 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 判断的时间 * @param time 判断的时间
...@@ -19,8 +33,8 @@ public class TimeUtil { ...@@ -19,8 +33,8 @@ public class TimeUtil {
* @param endTime 配置的结束时间 * @param endTime 配置的结束时间
* @return true:在 false:不在 * @return true:在 false:不在
*/ */
public static boolean judgeTime(LocalDateTime time, String beginTime, String endTime) { public static boolean judgeWeekTime(LocalDateTime time, String beginTime, String endTime) {
if (!beginTime.matches(RegEx.TIME_RULE) || !endTime.matches(RegEx.TIME_RULE)) { if (!beginTime.matches(RegEx.WEEK_TIME_RULE) || !endTime.matches(RegEx.WEEK_TIME_RULE)) {
throw new IllegalArgumentException("时间格式不正确"); throw new IllegalArgumentException("时间格式不正确");
} }
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("E HH:mm:ss"); DateTimeFormatter pattern = DateTimeFormatter.ofPattern("E HH:mm:ss");
...@@ -28,28 +42,62 @@ public class TimeUtil { ...@@ -28,28 +42,62 @@ public class TimeUtil {
int beginWeek = transform(beginTime.charAt(2)); int beginWeek = transform(beginTime.charAt(2));
int endWeek = transform(endTime.charAt(2)); int endWeek = transform(endTime.charAt(2));
int nowWeek = transform(source.charAt(1)); int nowWeek = transform(source.charAt(1));
if (nowWeek < beginWeek || nowWeek > endWeek) {
return false; String beginHour = beginTime.substring(4, 6);
} String endHour = endTime.substring(4, 6);
int beginHour = Integer.parseInt(beginTime.substring(4, 6)); String nowHour = source.substring(3, 5);
int endHour = Integer.parseInt(endTime.substring(4, 6));
int nowHour = Integer.parseInt(beginTime.substring(3, 5)); String beginMinute = beginTime.substring(7, 9);
if (nowHour < beginHour || nowHour > endHour) { String endMinute = endTime.substring(7, 9);
return false; String nowMinute = source.substring(6, 8);
}
int beginMinute = Integer.parseInt(beginTime.substring(7, 9)); String beginSecond = beginTime.substring(10);
int endMinute = Integer.parseInt(endTime.substring(7, 9)); String endSecond = endTime.substring(10);
int nowMinute = Integer.parseInt(beginTime.substring(6, 8)); String nowSecond = source.substring(9);
if (nowMinute < beginMinute || nowHour > endMinute) {
return false; String beginString = beginWeek + beginHour + beginMinute + beginSecond;
} String endString = endWeek + endHour + endMinute + endSecond;
int beginSecond = Integer.parseInt(beginTime.substring(10)); String nowString = nowWeek + nowHour + nowMinute + nowSecond;
int endSecond = Integer.parseInt(endTime.substring(10)); int begin = Integer.parseInt(beginString);
int nowSecond = Integer.parseInt(beginTime.substring(9)); int end = Integer.parseInt(endString);
if (nowSecond < beginSecond || nowSecond > endSecond) { int now = Integer.parseInt(nowString);
return false; return now >= begin && now <= end;
}
public static boolean judgeWeek(LocalDateTime time, String week) {
if (week.matches(RegEx.WEEK_RULE)) {
throw new IllegalArgumentException("星期格式不正确");
} }
return true; 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) { private static int transform(char source) {
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.district;
import com.yiring.app.domain.district.District;
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;
import org.locationtech.jts.geom.Geometry;
/**
* @author tml
* @version 1.0
* @date 2022/5/19 16:02
*/
@ApiModel("区域信息")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class DistrictDetailsVo implements Serializable {
@Serial
private static final long serialVersionUID = 3900485837172743182L;
@ApiModelProperty(value = "区域id", example = "1")
private Long id;
@ApiModelProperty(value = "区域名称", example = "生产区域")
private String name;
@ApiModelProperty(value = "风险等级(区域颜色)", example = "f##0000")
private String riskGrade;
@ApiModelProperty(value = "空间信息", dataType = "java.lang.String")
private Geometry geometry;
@ApiModelProperty(value = "地图id", example = "1")
private Integer mapId;
public static DistrictDetailsVo transform(District district) {
return DistrictDetailsVo
.builder()
.id(district.getId())
.name(district.getName())
.riskGrade(district.getRiskGrade())
.geometry(district.getGeometry())
.mapId(builder().mapId)
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.district;
import com.yiring.app.domain.district.District;
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/20 14:41
*/
@ApiModel("区域内员工数量")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class DistrictUserVo implements Serializable {
@Serial
private static final long serialVersionUID = 6164018365847108448L;
@ApiModelProperty(value = "区域名称", example = "生产区域")
private String name;
@ApiModelProperty(value = "此区域的员工数量", example = "20")
private Integer userNum;
public static DistrictUserVo transform(District district) {
return DistrictUserVo.builder().name(district.getName()).userNum(district.getTags().size()).build();
}
}
...@@ -12,6 +12,7 @@ import lombok.AllArgsConstructor; ...@@ -12,6 +12,7 @@ import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.locationtech.jts.geom.Geometry;
/** /**
* 区域信息VO * 区域信息VO
...@@ -19,7 +20,7 @@ import lombok.NoArgsConstructor; ...@@ -19,7 +20,7 @@ import lombok.NoArgsConstructor;
* @version 1.0 * @version 1.0
* @date 2022/4/27 9:10 * @date 2022/4/27 9:10
*/ */
@ApiModel("DistrictVo") @ApiModel("区域信息")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
...@@ -39,12 +40,16 @@ public class DistrictVo implements Serializable { ...@@ -39,12 +40,16 @@ public class DistrictVo implements Serializable {
@ApiModelProperty(value = "风险等级(区域颜色)", example = "f##0000") @ApiModelProperty(value = "风险等级(区域颜色)", example = "f##0000")
private String riskGrade; private String riskGrade;
@ApiModelProperty(value = "区域位置信息", dataType = "java.lang.String")
private Geometry geometry;
public static DistrictVo transform(District district) { public static DistrictVo transform(District district) {
return DistrictVo return DistrictVo
.builder() .builder()
.id(district.getId()) .id(district.getId())
.name(district.getName()) .name(district.getName())
.riskGrade(district.getRiskGrade()) .riskGrade(district.getRiskGrade())
.geometry(district.getGeometry())
.build(); .build();
} }
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.location.fence;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
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/5/20 9:50
*/
@ApiModel("围栏报警数据记录")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class FenceAlarmLogVo implements Serializable {
@Serial
private static final long serialVersionUID = 5038611185916574099L;
@ApiModelProperty(value = "围栏类别:1-普通围栏,2-特殊作业,3-重大危险源", example = "1")
private Integer fenceType;
@ApiModelProperty(value = "围栏类别名称", example = "普通围栏")
private String fenceTypeName;
@ApiModelProperty(value = "报警数量", example = "20")
private Integer number;
@ApiModelProperty(value = "报警类型相关数据记录")
private List<AlarmTypeVo> alarmTypeVos;
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class AlarmTypeVo {
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "报警类型id", example = "1524218162491428864")
private Long alarmType;
@ApiModelProperty(value = "报警类型名称", example = "超员报警")
private String alarmTypeName;
@ApiModelProperty(value = "报警数量", example = "20")
private Integer number;
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.location.fence;
import com.yiring.app.constant.alarm.InformMannerEnum;
import com.yiring.app.constant.alarm.ReceiveStatusEnum;
import com.yiring.app.domain.location.FenceAlarmPushLog;
import io.swagger.annotations.ApiModel;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.Comment;
/**
* @author tml
* @version 1.0
* @date 2022/5/18 9:56
*/
@ApiModel("围栏报警推送记录")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class FenceAlarmPushLogVo implements Serializable {
@Serial
private static final long serialVersionUID = 4628469269093052929L;
@Comment("报警接受人")
private String name;
@Comment("联系电话")
private String phone;
@Comment("通知方式: 1-app消息 2-短信通知 3-电话通知")
private String informManner;
@Comment("通知状态: 1-成功 2-失败")
private String status;
@Comment("接受时间")
private LocalDateTime time;
public static FenceAlarmPushLogVo transform(FenceAlarmPushLog pushLog) {
return FenceAlarmPushLogVo
.builder()
.name(pushLog.getUser().getRealName() + "(" + pushLog.getUser().getDepartment().getName() + ")")
.phone(pushLog.getUser().getMobile())
.informManner(InformMannerEnum.getByCode(pushLog.getInformManner()))
.status(ReceiveStatusEnum.getByCode(pushLog.getStatus()))
.time(pushLog.getTime())
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.location.fence;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.domain.location.LocationFenceAlarm;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/5/20 9:48
*/
@ApiModel("实时围栏报警信息")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class FenceAlarmRealtimeVo implements Serializable {
@Serial
private static final long serialVersionUID = -16864683628344917L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "报警信息id", example = "2")
private Long id;
@ApiModelProperty(value = "所在围栏名称", example = "一号围栏")
private String fenceName;
@ApiModelProperty(value = "触警人", example = "张三")
private String user;
@ApiModelProperty(value = "报警时间", example = "2022-05-20 10:00:00")
private LocalDateTime startTime;
@ApiModelProperty(value = "报警类型", example = "超员报警")
private String alarmType;
public static FenceAlarmRealtimeVo transform(LocationFenceAlarm locationFenceAlarm) {
return FenceAlarmRealtimeVo
.builder()
.id(locationFenceAlarm.getId())
.fenceName(locationFenceAlarm.getFence().getName())
.user(locationFenceAlarm.getUser().getRealName())
.startTime(locationFenceAlarm.getStartTime())
.alarmType(locationFenceAlarm.getType().getName())
.build();
}
}
...@@ -4,12 +4,14 @@ package com.yiring.app.vo.location.fence; ...@@ -4,12 +4,14 @@ package com.yiring.app.vo.location.fence;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.constant.alarm.FenceTypeEnum; import com.yiring.app.constant.alarm.FenceTypeEnum;
import com.yiring.app.constant.alarm.InformMannerEnum;
import com.yiring.app.domain.location.LocationFenceAlarm; import com.yiring.app.domain.location.LocationFenceAlarm;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.stream.Collectors;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
...@@ -70,7 +72,22 @@ public class FenceAlarmVo implements Serializable { ...@@ -70,7 +72,22 @@ public class FenceAlarmVo implements Serializable {
@ApiModelProperty(value = "报警状态", example = "报警中") @ApiModelProperty(value = "报警状态", example = "报警中")
private String statusName; private String statusName;
@ApiModelProperty(value = "通知方式", example = "app消息, 短信, 电话")
private String informManner;
public static FenceAlarmVo transform(LocationFenceAlarm fenceAlarm) { public static FenceAlarmVo transform(LocationFenceAlarm fenceAlarm) {
String recipient = fenceAlarm
.getPushLogs()
.stream()
.map(e -> e.getUser().getRealName())
.distinct()
.collect(Collectors.joining(", "));
String informManner = fenceAlarm
.getPushLogs()
.stream()
.map(e -> InformMannerEnum.getByCode(e.getInformManner()))
.distinct()
.collect(Collectors.joining(", "));
return FenceAlarmVo return FenceAlarmVo
.builder() .builder()
.id(fenceAlarm.getId()) .id(fenceAlarm.getId())
...@@ -83,9 +100,9 @@ public class FenceAlarmVo implements Serializable { ...@@ -83,9 +100,9 @@ public class FenceAlarmVo implements Serializable {
.startTime(fenceAlarm.getStartTime()) .startTime(fenceAlarm.getStartTime())
.endTime(fenceAlarm.getEndTime()) .endTime(fenceAlarm.getEndTime())
.alarmTypeName(fenceAlarm.getType().getName()) .alarmTypeName(fenceAlarm.getType().getName())
//todo .recipient(recipient)
//.recipient()
.statusName(fenceAlarm.getStatus().text()) .statusName(fenceAlarm.getStatus().text())
.informManner(informManner)
.build(); .build();
} }
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.location.fence;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.constant.alarm.FenceTypeEnum;
import com.yiring.app.domain.location.LocationFence;
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;
import org.locationtech.jts.geom.Geometry;
/**
* @author tml
* @version 1.0
* @date 2022/5/20 9:11
*/
@ApiModel("围栏实时数据")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class FenceRealtimeVo implements Serializable {
@Serial
private static final long serialVersionUID = 5364975855865067076L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "围栏id", example = "1527096652123344896")
private Long id;
@ApiModelProperty(value = "围栏名称", example = "一号围栏")
private String name;
@ApiModelProperty(value = "地图id", example = "1")
private Integer mapId;
@ApiModelProperty(value = "地图名称", example = "总图")
private String mapName;
@ApiModelProperty(value = "围栏类别:1-普通围栏,2-特殊作业,3-重大危险源", example = "1")
private Integer fenceType;
@ApiModelProperty(value = "围栏类别名称", example = "普通围栏")
private String fenceTypeName;
@ApiModelProperty(value = "空间信息", dataType = "java.lang.String")
private Geometry geometry;
public static FenceRealtimeVo transform(LocationFence fence) {
return FenceRealtimeVo
.builder()
.id(fence.getId())
.name(fence.getName())
.mapId(fence.getMapId().intValue())
.mapName(fence.getMapName())
.fenceType(fence.getFenceType())
.fenceTypeName(FenceTypeEnum.getByCode(fence.getFenceType()))
.geometry(fence.getGeometry())
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.location.fence;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.domain.location.LocationFence;
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;
import org.locationtech.jts.geom.Geometry;
/**
* @author tml
* @version 1.0
* @date 2022/5/26 9:08
*/
@ApiModel("电子围栏地图信息")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class LocationFenceGeoVo implements Serializable {
@Serial
private static final long serialVersionUID = 7736396772271720214L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "id")
private Long id;
@ApiModelProperty(value = "type")
private String type;
@ApiModelProperty("properties")
private Properties properties;
@ApiModelProperty(value = "位置信息")
private Geometry geometry;
public static LocationFenceGeoVo transform(LocationFence locationFence) {
return LocationFenceGeoVo
.builder()
.id(locationFence.getId())
.type("Feature")
.properties(
new Properties(
locationFence.getId(),
locationFence.getName(),
locationFence.getGeometry().getGeometryType()
)
)
.geometry(locationFence.getGeometry())
.build();
}
@Data
@AllArgsConstructor
@NoArgsConstructor
static class Properties {
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "id")
private Long id;
@ApiModelProperty(value = "围栏名称")
private String name;
@ApiModelProperty(value = "位置类型")
private String type;
}
}
...@@ -45,6 +45,10 @@ public class LocationFenceVo implements Serializable { ...@@ -45,6 +45,10 @@ public class LocationFenceVo implements Serializable {
@ApiModelProperty(value = "地图名称") @ApiModelProperty(value = "地图名称")
private String mapName; private String mapName;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "摄像头id")
private Long videoId;
@ApiModelProperty(value = "摄像头名称") @ApiModelProperty(value = "摄像头名称")
private String videoName; private String videoName;
...@@ -77,6 +81,7 @@ public class LocationFenceVo implements Serializable { ...@@ -77,6 +81,7 @@ public class LocationFenceVo implements Serializable {
.id(locationFence.getId()) .id(locationFence.getId())
.name(locationFence.getName()) .name(locationFence.getName())
.mapName(locationFence.getMapName()) .mapName(locationFence.getMapName())
.videoId(locationFence.getVideo().getId())
.videoName(locationFence.getVideo().getVideoName()) .videoName(locationFence.getVideo().getVideoName())
.fenceType(locationFence.getFenceType()) .fenceType(locationFence.getFenceType())
.fenceTypeName(FenceTypeEnum.getByCode(locationFence.getFenceType())) .fenceTypeName(FenceTypeEnum.getByCode(locationFence.getFenceType()))
......
...@@ -52,8 +52,11 @@ public class LocationFenceRuleVo implements Serializable { ...@@ -52,8 +52,11 @@ public class LocationFenceRuleVo implements Serializable {
@ApiModelProperty(value = "所属的报警类别id", example = "1", required = true) @ApiModelProperty(value = "所属的报警类别id", example = "1", required = true)
private Long alarmTypeId; private Long alarmTypeId;
@ApiModelProperty(value = "所属的报警类别名称", example = "超员报警", required = true)
private String alarmTypeName;
@ApiModelProperty( @ApiModelProperty(
value = "设置的关联参数类型(1:最大人数,2:最小人数,3:允许进入人员,4:不允许离开人员,5:静止时长(分钟),6:滞留时长(分钟),7:触发报警距离)", value = "设置的关联参数类型:1-最多人数,2-最少人数,3-允许进入人员,4-不允许离开人员,5-静止时长,6-滞留时长,7-触发报警距离",
example = "1", example = "1",
required = true required = true
) )
...@@ -75,6 +78,7 @@ public class LocationFenceRuleVo implements Serializable { ...@@ -75,6 +78,7 @@ public class LocationFenceRuleVo implements Serializable {
.fenceType(locationFenceRule.getFence().getFenceType()) .fenceType(locationFenceRule.getFence().getFenceType())
.fenceTypeName(FenceTypeEnum.getByCode(locationFenceRule.getFence().getFenceType())) .fenceTypeName(FenceTypeEnum.getByCode(locationFenceRule.getFence().getFenceType()))
.alarmTypeId(locationFenceRule.getAlarmType().getId()) .alarmTypeId(locationFenceRule.getAlarmType().getId())
.alarmTypeName(locationFenceRule.getAlarmType().getName())
.relevanceParamType(locationFenceRule.getRelevanceParamType()) .relevanceParamType(locationFenceRule.getRelevanceParamType())
.relevanceParamTypeName(RelevanceParamEnum.getByCode(locationFenceRule.getRelevanceParamType())) .relevanceParamTypeName(RelevanceParamEnum.getByCode(locationFenceRule.getRelevanceParamType()))
.ruleVo(ruleVo) .ruleVo(ruleVo)
......
...@@ -36,6 +36,7 @@ public class RuleVo implements Serializable { ...@@ -36,6 +36,7 @@ public class RuleVo implements Serializable {
@ApiModelProperty(value = "选择的播放语音名称", example = "紧急语音") @ApiModelProperty(value = "选择的播放语音名称", example = "紧急语音")
private String voiceName; private String voiceName;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "选择的播放设备id", example = "1") @ApiModelProperty(value = "选择的播放设备id", example = "1")
private Long playEquipmentId; private Long playEquipmentId;
......
...@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModel; ...@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Set;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
...@@ -25,11 +26,7 @@ public class TimeAndNumberVo implements Serializable { ...@@ -25,11 +26,7 @@ public class TimeAndNumberVo implements Serializable {
@Serial @Serial
private static final long serialVersionUID = -6796977663003158881L; private static final long serialVersionUID = -6796977663003158881L;
@ApiModelProperty(value = "起始时间", example = "星期一 08:00:00") private Set<TimeVo> time;
private String beginTime;
@ApiModelProperty(value = "终止时间", example = "星期一 18:00:00")
private String endTime;
@ApiModelProperty(value = "人数", example = "100") @ApiModelProperty(value = "人数", example = "100")
private Integer number; private Integer number;
......
...@@ -2,12 +2,10 @@ ...@@ -2,12 +2,10 @@
package com.yiring.app.vo.location.rule; package com.yiring.app.vo.location.rule;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Set; import java.util.Set;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
...@@ -20,7 +18,6 @@ import lombok.experimental.SuperBuilder; ...@@ -20,7 +18,6 @@ import lombok.experimental.SuperBuilder;
@ApiModel("报警类型中的允许进入人员或不允许离开人员") @ApiModel("报警类型中的允许进入人员或不允许离开人员")
@Data @Data
@SuperBuilder(toBuilder = true) @SuperBuilder(toBuilder = true)
@Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class TimeAndUserVo implements Serializable { public class TimeAndUserVo implements Serializable {
...@@ -28,11 +25,7 @@ public class TimeAndUserVo implements Serializable { ...@@ -28,11 +25,7 @@ public class TimeAndUserVo implements Serializable {
@Serial @Serial
private static final long serialVersionUID = -7037620599825901175L; private static final long serialVersionUID = -7037620599825901175L;
@ApiModelProperty(value = "起始时间", example = "星期一 08:00:00") private Set<TimeVo> time;
private String beginTime;
@ApiModelProperty(value = "终止时间", example = "星期一 18:00:00")
private String endTime;
private Set<RelevanceUserVo> user; 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 = "星期一")
private String week;
@ApiModelProperty(value = "起始时间", example = "08:00:00")
private String beginTime;
@ApiModelProperty(value = "终止时间", example = "18:00:00")
private String endTime;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.risk;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.domain.risk.RiskWarn;
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.stream.Collectors;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.locationtech.jts.geom.Point;
/**
* @author tml
* @version 1.0
* @date 2022/5/23 16:06
*/
@ApiModel("风险预警管理")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RiskWarnDetailVo implements Serializable {
@Serial
private static final long serialVersionUID = 519127002530795898L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "id", example = "1")
private Long id;
@ApiModelProperty(value = "工区名称", example = "组装工区")
private String workAreaName;
@ApiModelProperty(value = "经纬度", dataType = "java.lang.String")
private Point point;
@ApiModelProperty(value = "安装位置", example = "组装厂区二楼")
private String install;
@ApiModelProperty(value = "监控参数", example = "有毒气体报警器")
private String monitoring;
@ApiModelProperty(value = "位号", example = "AT-4736")
private String locationNum;
@ApiModelProperty(value = "量程", example = "0-100PPm")
private String range;
@ApiModelProperty(value = "量程单位", example = "PPm")
private String unit;
@ApiModelProperty(value = "是否启用", example = "true")
private Boolean enable;
private List<ThresholdVo> thresholdVos;
public static RiskWarnDetailVo transform(RiskWarn riskWarn) {
List<ThresholdVo> list = riskWarn
.getThresholds()
.stream()
.map(ThresholdVo::transform)
.collect(Collectors.toList());
String range = riskWarn.getMin() + "-" + riskWarn.getMax();
return RiskWarnDetailVo
.builder()
.id(riskWarn.getId())
.workAreaName(riskWarn.getWorkArea().getWorkAreaName())
.point(riskWarn.getPoint())
.install(riskWarn.getInstall())
.monitoring(riskWarn.getMonitoring())
.locationNum(riskWarn.getLocationNum())
.range(range)
.unit(riskWarn.getUnit())
.enable(riskWarn.getEnable())
.thresholdVos(list)
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.risk;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.domain.risk.RiskWarn;
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 15:40
*/
@ApiModel("风险预警管理")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RiskWarnVo implements Serializable {
@Serial
private static final long serialVersionUID = 6006976424270409054L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "id", example = "1")
private Long id;
@ApiModelProperty(value = "工区名称", example = "组装工区")
private String workAreaName;
@ApiModelProperty(value = "安装位置", example = "组装厂区二楼")
private String install;
@ApiModelProperty(value = "监控参数", example = "有毒气体报警器")
private String monitoring;
@ApiModelProperty(value = "位号", example = "AT-4736")
private String locationNum;
@ApiModelProperty(value = "量程", example = "0-100PPm")
private String range;
@ApiModelProperty(value = "是否启用", example = "true")
private Boolean enable;
public static RiskWarnVo transform(RiskWarn riskWarn) {
String range = riskWarn.getMin().toString() + "-" + riskWarn.getMax().toString();
return RiskWarnVo
.builder()
.id(riskWarn.getId())
.workAreaName(riskWarn.getWorkArea().getWorkAreaName())
.install(riskWarn.getInstall())
.monitoring(riskWarn.getMonitoring())
.locationNum(riskWarn.getLocationNum())
.range(range)
.enable(riskWarn.getEnable())
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.risk;
import com.yiring.app.constant.rehearsal.RiskLevelEnum;
import com.yiring.app.domain.risk.Threshold;
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/20 17:42
*/
@ApiModel("风险预警管理")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ThresholdVo implements Serializable {
@Serial
private static final long serialVersionUID = 5075164198170220832L;
@ApiModelProperty(value = "阈值区间起始值", example = "1.5")
private String min;
@ApiModelProperty(value = "阈值区间结束值", example = "20.2")
private String max;
@ApiModelProperty(value = "阈值状态", example = "1")
private Integer status;
@ApiModelProperty(value = "风险等级:1-红色风险,2-橙色风险,3-黄色风险,4-蓝色风险", example = "1")
private String riskLevel;
public static ThresholdVo transform(Threshold threshold) {
return ThresholdVo
.builder()
.min(threshold.getMin())
.max(threshold.getMax())
.status(threshold.getStatus())
.riskLevel(RiskLevelEnum.getByCode(threshold.getRiskLevel()))
.build();
}
}
...@@ -4,6 +4,7 @@ package com.yiring.app.web.alarm; ...@@ -4,6 +4,7 @@ package com.yiring.app.web.alarm;
import com.yiring.app.constant.alarm.FenceTypeEnum; import com.yiring.app.constant.alarm.FenceTypeEnum;
import com.yiring.app.constant.alarm.RelevanceParamEnum; import com.yiring.app.constant.alarm.RelevanceParamEnum;
import com.yiring.app.domain.alarm.AlarmType; import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.job.FenceAlarmJob;
import com.yiring.app.param.alarm.AlarmConditionParam; import com.yiring.app.param.alarm.AlarmConditionParam;
import com.yiring.app.param.alarm.AlarmTypeAddParam; import com.yiring.app.param.alarm.AlarmTypeAddParam;
import com.yiring.app.param.alarm.AlarmTypeModifyParam; import com.yiring.app.param.alarm.AlarmTypeModifyParam;
...@@ -45,6 +46,9 @@ public class AlarmTypeController { ...@@ -45,6 +46,9 @@ public class AlarmTypeController {
@Resource @Resource
private AlarmService alarmService; private AlarmService alarmService;
@Resource
private FenceAlarmJob fenceAlarmJob;
@ApiOperation(value = "添加报警类型") @ApiOperation(value = "添加报警类型")
@PostMapping("/addAlarmType") @PostMapping("/addAlarmType")
public Result<String> addAlarmType(@Valid AlarmTypeAddParam param) { public Result<String> addAlarmType(@Valid AlarmTypeAddParam param) {
...@@ -101,4 +105,10 @@ public class AlarmTypeController { ...@@ -101,4 +105,10 @@ public class AlarmTypeController {
public void exportAlarmType(@Valid AlarmConditionParam conditionParam, HttpServletResponse response) { public void exportAlarmType(@Valid AlarmConditionParam conditionParam, HttpServletResponse response) {
alarmService.exportAlarmType(conditionParam, response); alarmService.exportAlarmType(conditionParam, response);
} }
@ApiOperation(value = "test")
@PostMapping("/test")
public void test() {
fenceAlarmJob.scanAlarmHandler();
}
} }
...@@ -5,6 +5,7 @@ import com.yiring.app.param.analysis.history.HistoryRouteConditionParam; ...@@ -5,6 +5,7 @@ import com.yiring.app.param.analysis.history.HistoryRouteConditionParam;
import com.yiring.app.service.analysis.history.HistoryRouteService; import com.yiring.app.service.analysis.history.HistoryRouteService;
import com.yiring.app.vo.analysis.history.HistoryRouteVo; import com.yiring.app.vo.analysis.history.HistoryRouteVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
...@@ -13,6 +14,7 @@ import javax.servlet.http.HttpServletResponse; ...@@ -13,6 +14,7 @@ import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
...@@ -39,6 +41,15 @@ public class HistoryRouteController { ...@@ -39,6 +41,15 @@ public class HistoryRouteController {
return historyRouteService.findByCondition(param); return historyRouteService.findByCondition(param);
} }
@ApiOperation("分页查询历史轨迹")
@GetMapping("/findByPage")
public Result<PageVo<HistoryRouteVo>> findByPage(
@Valid HistoryRouteConditionParam param,
@Valid PageParam pageParam
) {
return historyRouteService.findByPage(param, pageParam);
}
@ApiOperation(value = "导出历史轨迹", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) @ApiOperation(value = "导出历史轨迹", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@PostMapping("/exportHistoryRoute") @PostMapping("/exportHistoryRoute")
public void exportHistoryRoute(@Valid HistoryRouteConditionParam param, HttpServletResponse response) { public void exportHistoryRoute(@Valid HistoryRouteConditionParam param, HttpServletResponse response) {
......
...@@ -3,7 +3,10 @@ package com.yiring.app.web.district; ...@@ -3,7 +3,10 @@ package com.yiring.app.web.district;
import com.yiring.app.param.district.DistrictAddParam; import com.yiring.app.param.district.DistrictAddParam;
import com.yiring.app.param.district.DistrictModifyParam; import com.yiring.app.param.district.DistrictModifyParam;
import com.yiring.app.param.district.DistrictRealtimeConditionParam;
import com.yiring.app.service.district.DistrictService; import com.yiring.app.service.district.DistrictService;
import com.yiring.app.vo.district.DistrictDetailsVo;
import com.yiring.app.vo.district.DistrictUserVo;
import com.yiring.app.vo.district.DistrictVo; import com.yiring.app.vo.district.DistrictVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
...@@ -60,4 +63,16 @@ public class DistrictController { ...@@ -60,4 +63,16 @@ public class DistrictController {
} }
return districtService.findByNameLike(name); return districtService.findByNameLike(name);
} }
@ApiOperation(value = "查询实时区域列表")
@GetMapping("/findRealtimeList")
public Result<PageVo<DistrictDetailsVo>> findRealtimeList(@Valid DistrictRealtimeConditionParam param) {
return districtService.findRealtimeList(param);
}
@ApiOperation(value = "查询区域内员工数量统计")
@GetMapping("/findDistrictUser")
public Result<PageVo<DistrictUserVo>> findDistrictUser(@Valid DistrictRealtimeConditionParam param) {
return districtService.findDistrictUser(param);
}
} }
...@@ -2,11 +2,16 @@ ...@@ -2,11 +2,16 @@
package com.yiring.app.web.location.fence; package com.yiring.app.web.location.fence;
import com.yiring.app.param.location.fence.FenceAlarmConditionParam; import com.yiring.app.param.location.fence.FenceAlarmConditionParam;
import com.yiring.app.param.location.fence.FenceAlarmLogParam;
import com.yiring.app.param.location.fence.FenceRealtimeConditionParam;
import com.yiring.app.service.location.fence.FenceAlarmService; import com.yiring.app.service.location.fence.FenceAlarmService;
import com.yiring.app.vo.IdNameVo; import com.yiring.app.vo.IdNameVo;
import com.yiring.app.vo.location.fence.FenceAlarmLogVo;
import com.yiring.app.vo.location.fence.FenceAlarmRealtimeVo;
import com.yiring.app.vo.location.fence.FenceAlarmVo; import com.yiring.app.vo.location.fence.FenceAlarmVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.domain.BasicEntity; import com.yiring.common.domain.BasicEntity;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam; import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -57,4 +62,29 @@ public class FenceAlarmController { ...@@ -57,4 +62,29 @@ public class FenceAlarmController {
public void export(@Valid FenceAlarmConditionParam param, HttpServletResponse response) { public void export(@Valid FenceAlarmConditionParam param, HttpServletResponse response) {
fenceAlarmService.export(param, response); fenceAlarmService.export(param, response);
} }
@ApiOperation("根据id查询报警记录")
@GetMapping("/findOne")
public Result<FenceAlarmVo> findOne(@Valid IdParam idParam) {
return fenceAlarmService.findOne(idParam);
}
@ApiOperation(value = "查询报警记录统计")
@GetMapping("/findAlarmLog")
public Result<PageVo<FenceAlarmLogVo>> findAlarmLog(@Valid FenceAlarmLogParam fenceAlarmLogParam) {
return fenceAlarmService.findAlarmLog(fenceAlarmLogParam);
}
@ApiOperation("查询正在报警的报警记录")
@GetMapping("/fenRealtimeList")
public Result<PageVo<FenceAlarmRealtimeVo>> fenRealtimeList(
@Valid FenceRealtimeConditionParam param,
@Valid PageParam pageParam
) {
if (Objects.isNull(pageParam.getSortField())) {
pageParam.setSortField(BasicEntity.Fields.createTime);
pageParam.setSortOrder(Sort.Direction.DESC);
}
return fenceAlarmService.fenRealtimeList(param, pageParam);
}
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.web.location.fence;
import com.yiring.app.param.location.fence.FenceAlarmPushLogConditionParam;
import com.yiring.app.service.location.fence.FenceAlarmPushLogService;
import com.yiring.app.vo.location.fence.FenceAlarmPushLogVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.PageParam;
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.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author tml
* @version 1.0
* @date 2022/5/18 10:21
*/
@Api(tags = "围栏报警推送记录")
@RestController
@RequestMapping("/push/log")
public class FenceAlarmPushLogController {
@Resource
private FenceAlarmPushLogService fenceAlarmPushLogService;
@ApiOperation(value = "查询推送记录列表")
@GetMapping("/findList")
public Result<PageVo<FenceAlarmPushLogVo>> findList(
@Valid FenceAlarmPushLogConditionParam conditionParam,
@Valid PageParam pageParam
) {
return fenceAlarmPushLogService.findList(conditionParam, pageParam);
}
}
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.web.location.fence; package com.yiring.app.web.location.fence;
import com.yiring.app.constant.alarm.FenceTypeEnum;
import com.yiring.app.domain.alarm.AlarmType; import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.param.location.fence.FenceRealtimeConditionParam;
import com.yiring.app.param.location.fence.LocationFenceAddParam; import com.yiring.app.param.location.fence.LocationFenceAddParam;
import com.yiring.app.param.location.fence.LocationFenceConditionParam; import com.yiring.app.param.location.fence.LocationFenceConditionParam;
import com.yiring.app.param.location.fence.LocationFenceModifyParam; import com.yiring.app.param.location.fence.LocationFenceModifyParam;
import com.yiring.app.service.location.fence.LocationFenceService; import com.yiring.app.service.location.fence.LocationFenceService;
import com.yiring.app.vo.CodeNameVo; import com.yiring.app.vo.CodeNameVo;
import com.yiring.app.vo.location.fence.FenceRealtimeVo;
import com.yiring.app.vo.location.fence.LocationFenceGeoVo;
import com.yiring.app.vo.location.fence.LocationFenceSearchVo; import com.yiring.app.vo.location.fence.LocationFenceSearchVo;
import com.yiring.app.vo.location.fence.LocationFenceVo; import com.yiring.app.vo.location.fence.LocationFenceVo;
import com.yiring.auth.param.IdsParam;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam; import com.yiring.common.param.PageParam;
...@@ -16,15 +21,13 @@ import com.yiring.common.vo.PageVo; ...@@ -16,15 +21,13 @@ import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/** /**
* @author tml * @author tml
...@@ -61,7 +64,7 @@ public class LocationFenceController { ...@@ -61,7 +64,7 @@ public class LocationFenceController {
} }
@ApiOperation("根据条件分页查询围栏信息") @ApiOperation("根据条件分页查询围栏信息")
@PostMapping("/LocationFenceVo") @PostMapping("/findList")
public Result<PageVo<LocationFenceVo>> findList( public Result<PageVo<LocationFenceVo>> findList(
@Valid LocationFenceConditionParam conditionParam, @Valid LocationFenceConditionParam conditionParam,
@Valid PageParam pageParam @Valid PageParam pageParam
...@@ -73,7 +76,13 @@ public class LocationFenceController { ...@@ -73,7 +76,13 @@ public class LocationFenceController {
return locationFenceService.findList(conditionParam, pageParam); return locationFenceService.findList(conditionParam, pageParam);
} }
@ApiOperation("根据条id查询围栏信息") @ApiOperation("根据条件查询围栏地图位置信息")
@GetMapping("/findGeoList")
public Result<PageVo<LocationFenceGeoVo>> findGeoList(@Valid LocationFenceConditionParam conditionParam) {
return locationFenceService.findGeoList(conditionParam);
}
@ApiOperation("根据id查询围栏信息")
@PostMapping("/findById") @PostMapping("/findById")
public Result<LocationFenceVo> findById(@Valid IdParam param) { public Result<LocationFenceVo> findById(@Valid IdParam param) {
return locationFenceService.findById(param); return locationFenceService.findById(param);
...@@ -89,9 +98,47 @@ public class LocationFenceController { ...@@ -89,9 +98,47 @@ public class LocationFenceController {
return locationFenceService.findByNameLike(name); return locationFenceService.findByNameLike(name);
} }
@ApiOperation("查询围栏类型下拉框")
@GetMapping("/findFenceType")
public Result<PageVo<CodeNameVo>> findFenceType() {
List<CodeNameVo> list = FenceTypeEnum.getAll();
PageVo<CodeNameVo> pageVo = PageVo.build(list, list.size());
return Result.ok(pageVo);
}
@ApiOperation("获取地图下拉框") @ApiOperation("获取地图下拉框")
@PostMapping("/findMapList") @PostMapping("/findMapList")
public Result<PageVo<CodeNameVo>> findMapList() { public Result<PageVo<CodeNameVo>> findMapList() {
return locationFenceService.findMapList(); return locationFenceService.findMapList();
} }
@ApiOperation("启用一个围栏")
@PostMapping("/enable")
public Result<String> enable(@Valid IdParam idParam) {
return locationFenceService.enable(idParam, true);
}
@ApiOperation("停用一个围栏")
@PostMapping("/unEnable")
public Result<String> unEnable(@Valid IdParam idParam) {
return locationFenceService.enable(idParam, false);
}
@ApiOperation("批量启用一个围栏")
@PostMapping("/batchEnable")
public Result<String> batchEnable(@Valid IdsParam idsParam) {
return locationFenceService.batchEnable(idsParam, true);
}
@ApiOperation("批量停用一个围栏")
@PostMapping("/batchUnEnable")
public Result<String> batchUnEnable(@Valid IdsParam idsParam) {
return locationFenceService.batchEnable(idsParam, false);
}
@ApiOperation("实时查询围栏信息")
@GetMapping("/fenRealtimeList")
public Result<PageVo<FenceRealtimeVo>> fenRealtimeList(@Valid FenceRealtimeConditionParam param) {
return locationFenceService.fenRealtimeList(param);
}
} }
...@@ -33,7 +33,7 @@ import org.springframework.web.bind.annotation.*; ...@@ -33,7 +33,7 @@ import org.springframework.web.bind.annotation.*;
@Validated @Validated
@SuppressWarnings({ "deprecation" }) @SuppressWarnings({ "deprecation" })
@Api(tags = "报警规则", description = "AlarmRule") @Api(tags = "报警规则:报警给谁", description = "AlarmRule")
@RestController @RestController
@RequestMapping("/alarm/rule") @RequestMapping("/alarm/rule")
public class LocationAlarmRuleController { public class LocationAlarmRuleController {
......
...@@ -9,15 +9,13 @@ import com.yiring.app.vo.location.rule.LocationFenceRuleVo; ...@@ -9,15 +9,13 @@ import com.yiring.app.vo.location.rule.LocationFenceRuleVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.core.Status; import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/** /**
* @author tml * @author tml
...@@ -27,7 +25,7 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -27,7 +25,7 @@ import org.springframework.web.bind.annotation.RestController;
@Validated @Validated
@SuppressWarnings({ "deprecation" }) @SuppressWarnings({ "deprecation" })
@Api(tags = "电子围栏报警规则", description = "FenceRule") @Api(tags = "报警规则:什么情况报警", description = "FenceRule")
@RestController @RestController
@RequestMapping("/location/rule") @RequestMapping("/location/rule")
public class LocationFenceRuleController { public class LocationFenceRuleController {
...@@ -66,4 +64,10 @@ public class LocationFenceRuleController { ...@@ -66,4 +64,10 @@ public class LocationFenceRuleController {
public Result<LocationFenceRuleVo> findRule(@Valid IdParam idParam) { public Result<LocationFenceRuleVo> findRule(@Valid IdParam idParam) {
return locationFenceRuleService.findRule(idParam); return locationFenceRuleService.findRule(idParam);
} }
@ApiOperation("根据围栏id查询报警规则")
@GetMapping("/findByFenceId")
public Result<PageVo<LocationFenceRuleVo>> findByFenceId(@Valid IdParam idParam) {
return locationFenceRuleService.findByFenceId(idParam);
}
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.web.risk;
import com.yiring.app.constant.rehearsal.RiskLevelEnum;
import com.yiring.app.constant.risk.ThresholdStatusEnum;
import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.param.risk.RiskWarnAddParam;
import com.yiring.app.param.risk.RiskWarnConditionParam;
import com.yiring.app.param.risk.RiskWarnModifyParam;
import com.yiring.app.service.risk.RiskWarnService;
import com.yiring.app.vo.CodeNameVo;
import com.yiring.app.vo.risk.RiskWarnDetailVo;
import com.yiring.app.vo.risk.RiskWarnVo;
import com.yiring.auth.param.IdsParam;
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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import java.util.Objects;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import org.springframework.data.domain.Sort;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
/**
* @author tml
* @version 1.0
* @date 2022/5/23 17:16
*/
@Api(tags = "风险预警管理")
@Validated
@RestController
@RequestMapping("/risk/warn")
public class RiskWarnController {
@Resource
private RiskWarnService riskWarnService;
@ApiOperation("添加一条")
@PostMapping("/addOne")
public Result<String> addOne(@Valid RiskWarnAddParam param) {
return riskWarnService.addOne(param);
}
@ApiOperation("修改一条")
@PostMapping("/modifyOne")
public Result<String> modifyOne(@Valid RiskWarnModifyParam param) {
return riskWarnService.modifyOne(param);
}
@ApiOperation("删除一条")
@PostMapping("/removeOne")
public Result<String> removeOne(@Valid IdParam idParam) {
return riskWarnService.removeOne(idParam);
}
@ApiOperation("查询一条")
@GetMapping("/findOne")
public Result<RiskWarnDetailVo> findOne(@Valid IdParam idParam) {
return riskWarnService.findOne(idParam);
}
@ApiOperation("查询列表")
@GetMapping("/findList")
public Result<PageVo<RiskWarnVo>> findList(
@Valid RiskWarnConditionParam conditionParam,
@Valid PageParam pageParam
) {
if (Objects.isNull(pageParam.getSortField())) {
pageParam.setSortField(AlarmType.Fields.createTime);
pageParam.setSortOrder(Sort.Direction.DESC);
}
return riskWarnService.findList(conditionParam, pageParam);
}
@ApiOperation("查询阈值状态下拉框")
@GetMapping("/findThresholds")
public Result<PageVo<CodeNameVo>> findThresholds() {
List<CodeNameVo> list = ThresholdStatusEnum.getAll();
PageVo<CodeNameVo> pageVo = PageVo.build(list, list.size());
return Result.ok(pageVo);
}
@ApiOperation("查询风险等级下拉框")
@GetMapping("/findRiskLevels")
public Result<PageVo<CodeNameVo>> findRiskLevels() {
List<CodeNameVo> list = RiskLevelEnum.getAll();
PageVo<CodeNameVo> pageVo = PageVo.build(list, list.size());
return Result.ok(pageVo);
}
@ApiOperation(value = "导出", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@GetMapping("/exportRiskWarn")
public void exportRiskWarn(@Valid RiskWarnConditionParam conditionParam, HttpServletResponse response) {
riskWarnService.exportRiskWarn(conditionParam, response);
}
@ApiOperation("导入")
@PostMapping("/importRiskWarn")
public Result<String> importRiskWarn(MultipartFile file) {
return riskWarnService.importRiskWarn(file);
}
@ApiOperation(value = "导出模板", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@GetMapping("/exportTemplate")
public void exportTemplate(HttpServletResponse response) {
riskWarnService.exportTemplate(response);
}
@ApiOperation("批量启用或停用")
@ApiImplicitParam(value = "启用:true-启用,false-停用", required = true)
@PostMapping("/batchEnable")
public Result<String> batchEnable(@Valid IdsParam idsParam, boolean enable) {
return riskWarnService.batchEnable(idsParam.toIds(), enable);
}
}
...@@ -26,5 +26,16 @@ public class RegEx { ...@@ -26,5 +26,16 @@ 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}$";
/**
* 数字或小数
*/
public static final String DIGIT_DECIMALS = "^(-?\\d+)|(-?\\d+.\\d+)$";
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论