提交 1fbfdcde 作者: 涂茂林

feat:电子围栏报警规则

上级 aadc9b1f
/* (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/5 16:05
*/
public enum InformMannerEnum {
/**
* app消息通知
*/
APP(1, "app消息"),
/**
* 短信通知
*/
MESSAGES(2, "短信通知"),
/**
* 电话通知
*/
PHONE(3, "电话通知");
@Getter
private final Integer code;
@Getter
private final String name;
private static final List<CodeNameVo> LIST;
static {
LIST = new ArrayList<CodeNameVo>();
for (InformMannerEnum item : values()) {
LIST.add(new CodeNameVo(item.code, item.name));
}
}
InformMannerEnum(Integer code, String name) {
this.code = code;
this.name = name;
}
public static String getByCode(Integer code) {
for (InformMannerEnum item : values()) {
if (item.getCode().equals(code)) {
return item.getName();
}
}
return "未知通知类型";
}
public static List<CodeNameVo> getAll() {
return LIST;
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.location;
import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.auth.domain.user.User;
import com.yiring.common.domain.BasicEntity;
import java.io.Serial;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import java.util.Set;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
......@@ -28,7 +28,7 @@ import org.hibernate.annotations.Where;
@FieldNameConstants
@Where(clause = "deleted = false")
@Entity
@Table(name = "BS_LOCATION_FENCE")
@Table(name = "BS_LOCATION_ALARM_RULE")
@Comment("电子围栏的报警规则")
public class LocationAlarmRule extends BasicEntity implements Serializable {
......@@ -45,4 +45,21 @@ public class LocationAlarmRule extends BasicEntity implements Serializable {
@ManyToOne
@JoinColumn(name = "fence_id")
private LocationFence locationFence;
@Comment("接收人集合")
@ManyToMany
@ToString.Exclude
private Set<User> users;
@Comment("通知方式")
private String informManner;
@Comment("报警类型")
@ManyToOne
@JoinColumn(name = "alarm_type_id")
private AlarmType alarmType;
@Comment(value = "是否删除")
@Column(nullable = false)
Boolean deleted;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.location;
import java.io.Serializable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
/**
* @author tml
* @version 1.0
* @date 2022/5/5 15:13
*/
@Repository
public interface LocationAlarmRuleRepository
extends JpaRepository<LocationAlarmRule, Serializable>, JpaSpecificationExecutor<LocationAlarmRule> {}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.rule;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.domain.location.LocationAlarmRule;
import com.yiring.app.domain.location.LocationFence;
import com.yiring.auth.domain.user.User;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/5/5 15:41
*/
@ApiModel("添加配置报警类别的报警规则")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LocationAlarmRuleAddParam implements Serializable {
@Serial
private static final long serialVersionUID = 388296602724939033L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "地图id", example = "1", required = true)
@NotNull(message = "地图id不能为空")
private Long mapId;
@ApiModelProperty(value = "地图名称", example = "一层", required = true)
@NotEmpty(message = "地图名称不能为空")
private String mapName;
@ApiModelProperty(value = "电子围栏id", example = "1", required = true)
@NotNull(message = "电子围栏id不能为空")
private Long fenceId;
@ApiModelProperty(value = "报警类型id", example = "1", required = true)
@NotNull(message = "报警类型id不能为空")
private Long alarmId;
@ApiModelProperty(value = "接收人集合", required = true)
@NotNull(message = "接收人id不能为空")
private Set<Long> users;
@ApiModelProperty(value = "通知方式集合", required = true)
@NotNull(message = "通知方式不能为空")
private Set<Integer> informManner;
public LocationAlarmRule transform() {
LocationFence locationFence = LocationFence.builder().id(fenceId).build();
HashSet<User> set = new HashSet<>();
for (Long item : this.users) {
set.add(User.builder().id(item).build());
}
AlarmType alarmType = AlarmType.builder().id(alarmId).build();
String json = JSON.toJSONString(informManner);
return LocationAlarmRule
.builder()
.mapId(mapId)
.mapName(mapName)
.locationFence(locationFence)
.users(set)
.alarmType(alarmType)
.informManner(json)
.deleted(false)
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.rule;
import com.alibaba.fastjson.JSON;
import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.domain.location.LocationAlarmRule;
import com.yiring.app.domain.location.LocationFence;
import com.yiring.auth.domain.user.User;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/5/5 15:41
*/
@ApiModel("修改配置报警类别的报警规则")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LocationAlarmRuleModifyParam implements Serializable {
@Serial
private static final long serialVersionUID = 388296602724939033L;
@ApiModelProperty(value = "id", example = "1", required = true)
@NotEmpty(message = "规则id不能为空")
private Long id;
@ApiModelProperty(value = "地图id", example = "1", required = true)
private Long mapId;
@ApiModelProperty(value = "地图名称", example = "一层", required = true)
private String mapName;
@ApiModelProperty(value = "报警类型id", example = "1", required = true)
@NotNull(message = "报警类型id不能为空")
private Long alarmId;
@ApiModelProperty(value = "电子围栏id", example = "1", required = true)
private Long fenceId;
@ApiModelProperty(value = "接收人集合", required = true)
private Set<Long> users;
@ApiModelProperty(value = "通知方式集合", required = true)
private Set<Integer> informManner;
public LocationAlarmRule transform() {
LocationFence locationFence = LocationFence.builder().id(fenceId).build();
HashSet<User> set = new HashSet<>();
for (Long item : this.users) {
set.add(User.builder().id(item).build());
}
AlarmType alarmType = AlarmType.builder().id(alarmId).build();
String json = JSON.toJSONString(informManner);
return LocationAlarmRule
.builder()
.id(id)
.mapId(mapId)
.mapName(mapName)
.locationFence(locationFence)
.users(set)
.alarmType(alarmType)
.informManner(json)
.deleted(false)
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.rule;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.util.Set;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/5/5 15:17
*/
@ApiModel("电子围栏报警规则的条件参数")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LocationAlarmRuleParam implements Serializable {
@Serial
private static final long serialVersionUID = 6107090049902663508L;
@ApiModelProperty(value = "地图id", example = "1")
private Long mapId;
@ApiModelProperty(value = "围栏id", example = "1")
private Long fenceId;
@ApiModelProperty(value = "通知方式", example = "1")
private Set<Integer> informManner;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.location.rule;
import com.yiring.app.param.location.rule.LocationAlarmRuleAddParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleModifyParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleParam;
import com.yiring.app.vo.location.rule.LocationAlarmRuleVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
/**
* @author tml
* @version 1.0
* @date 2022/5/5 16:55
*/
public interface LocationAlarmRuleService {
/**
* 添加一条规则
* @param param 规则信息
* @return 是否成功
*/
Result<String> addRule(LocationAlarmRuleAddParam param);
/**
* 修改一条规则
* @param param 规则信息
* @return 是否成功
*/
Result<String> modifyRule(LocationAlarmRuleModifyParam param);
/**
* 删除一条规则
* @param idParam 规则id
* @return 是否成功
*/
Result<String> removeRule(IdParam idParam);
/**
* 根据id查询规则
* @param idParam 规则id
* @return 规则信息
*/
Result<LocationAlarmRuleVo> findById(IdParam idParam);
/**
* 根据条件查询规则信息
* @param param 条件
* @param pageParam 分页参数
* @return 规则信息
*/
Result<PageVo<LocationAlarmRuleVo>> findByCondition(LocationAlarmRuleParam param, PageParam pageParam);
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.location.rule.impl;
import com.yiring.app.domain.location.LocationAlarmRule;
import com.yiring.app.domain.location.LocationAlarmRuleRepository;
import com.yiring.app.param.location.rule.LocationAlarmRuleAddParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleModifyParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleParam;
import com.yiring.app.service.location.rule.LocationAlarmRuleService;
import com.yiring.app.util.JpaUtil;
import com.yiring.app.vo.location.rule.LocationAlarmRuleVo;
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.vo.PageVo;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.persistence.criteria.Predicate;
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;
import org.springframework.util.CollectionUtils;
/**
* @author tml
* @version 1.0
* @date 2022/5/5 16:59
*/
@Service
@Slf4j
@Transactional(rollbackFor = Exception.class)
public class LocationAlarmRuleServiceImpl implements LocationAlarmRuleService {
@Resource
private LocationAlarmRuleRepository locationAlarmRuleRepository;
@Override
public Result<String> addRule(LocationAlarmRuleAddParam param) {
LocationAlarmRule locationAlarmRule = param.transform();
locationAlarmRuleRepository.saveAndFlush(locationAlarmRule);
return Result.ok();
}
@Override
public Result<String> modifyRule(LocationAlarmRuleModifyParam param) {
LocationAlarmRule locationAlarmRule = param.transform();
Optional<LocationAlarmRule> optional = locationAlarmRuleRepository.findById(param.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要修改的规则不存在");
}
JpaUtil.copyNotNullProperties(locationAlarmRule, optional.get());
return Result.ok();
}
@Override
public Result<String> removeRule(IdParam idParam) {
Optional<LocationAlarmRule> optional = locationAlarmRuleRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要修改的规则不存在");
}
optional.get().setDeleted(true);
return Result.ok();
}
@Override
public Result<LocationAlarmRuleVo> findById(IdParam idParam) {
Optional<LocationAlarmRule> optional = locationAlarmRuleRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "查询的规则不存在");
}
LocationAlarmRuleVo ruleVo = LocationAlarmRuleVo.transform(optional.get());
return Result.ok(ruleVo);
}
@Override
public Result<PageVo<LocationAlarmRuleVo>> findByCondition(LocationAlarmRuleParam param, PageParam pageParam) {
Pageable pageable = PageParam.toPageable(pageParam);
Specification<LocationAlarmRule> specification = (root, query, criteriaBuilder) -> {
List<Predicate> list = new ArrayList<>();
if (param.getMapId() != null) {
list.add(criteriaBuilder.equal(root.get("mapId"), param.getMapId()));
}
if (param.getFenceId() != null) {
list.add(criteriaBuilder.equal(root.get("locationFence"), param.getFenceId()));
}
Predicate[] array = list.toArray(new Predicate[0]);
return criteriaBuilder.and(array);
};
Set<Integer> informManner = param.getInformManner();
if (CollectionUtils.isEmpty(informManner)) {
Page<LocationAlarmRule> rulePage = locationAlarmRuleRepository.findAll(specification, pageable);
List<LocationAlarmRuleVo> voList = rulePage
.get()
.map(LocationAlarmRuleVo::transform)
.collect(Collectors.toList());
PageVo<LocationAlarmRuleVo> pageVo = PageVo.build(voList, rulePage.getTotalElements());
return Result.ok(pageVo);
}
List<LocationAlarmRule> list = locationAlarmRuleRepository.findAll(specification, pageable.getSort());
List<LocationAlarmRule> ruleList = list
.stream()
.filter(e -> {
for (Integer item : informManner) {
boolean contains = e.getInformManner().contains(item.toString());
if (!contains) {
return false;
}
}
return true;
})
.collect(Collectors.toList());
int pageBegin = (pageParam.getPageNo() - 1) * pageParam.getPageSize();
int pageEnd = pageBegin + 10;
if (pageBegin > ruleList.size()) {
return Result.no(Status.EXPECTATION_FAILED, "分页参数异常");
}
if (pageEnd > ruleList.size()) {
pageEnd = ruleList.size();
}
List<LocationAlarmRule> pageList = ruleList.subList(pageBegin, pageEnd);
List<LocationAlarmRuleVo> page = pageList
.stream()
.map(LocationAlarmRuleVo::transform)
.collect(Collectors.toList());
PageVo<LocationAlarmRuleVo> pageVo = PageVo.build(page, ruleList.size());
return Result.ok(pageVo);
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.location.rule;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.constant.alarm.InformMannerEnum;
import com.yiring.app.domain.location.LocationAlarmRule;
import com.yiring.app.vo.CodeNameVo;
import com.yiring.app.vo.user.UserVo;
import com.yiring.auth.domain.user.User;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/5/5 15:27
*/
@ApiModel("电子围栏报警规则信息")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LocationAlarmRuleVo implements Serializable {
@Serial
private static final long serialVersionUID = 8291558248133685661L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "id", example = "1", required = true)
private Long id;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "地图id", example = "1", required = true)
private Long mapId;
@ApiModelProperty(value = "地图名称", example = "一层", required = true)
private String mapName;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "电子围栏id", example = "1", required = true)
private Long fenceId;
@ApiModelProperty(value = "电子围栏名称", example = "1", required = true)
private String fenceName;
@ApiModelProperty(value = "接收人集合", required = true)
private List<UserVo> users;
@ApiModelProperty(value = "通知方式集合", required = true)
private List<CodeNameVo> informManner;
public static LocationAlarmRuleVo transform(LocationAlarmRule locationAlarmRule) {
Set<User> users = locationAlarmRule.getUsers();
List<UserVo> userVos = users.stream().map(UserVo::transformDept).collect(Collectors.toList());
String informManner = locationAlarmRule.getInformManner();
List<Integer> list = JSON.parseArray(informManner, Integer.class);
ArrayList<CodeNameVo> codeNameVos = new ArrayList<>();
for (Integer item : list) {
codeNameVos.add(new CodeNameVo(item, InformMannerEnum.getByCode(item)));
}
return LocationAlarmRuleVo
.builder()
.id(locationAlarmRule.getId())
.mapId(locationAlarmRule.getMapId())
.mapName(locationAlarmRule.getMapName())
.fenceId(locationAlarmRule.getLocationFence().getId())
.fenceName(locationAlarmRule.getLocationFence().getName())
.users(userVos)
.informManner(codeNameVos)
.build();
}
}
......@@ -37,7 +37,7 @@ import org.springframework.web.bind.annotation.RestController;
*/
@Slf4j
@Validated
@Api(tags = "AlarmTypeController(报警类型)")
@Api(tags = "AlarmType(报警类型)")
@RestController
@RequestMapping("/alarm/type")
public class AlarmTypeController {
......
......@@ -29,7 +29,7 @@ import org.springframework.web.bind.annotation.*;
* @date 2022/4/28 11:50
*/
@RestController
@Api(tags = "LocationFenceController(围栏信息)")
@Api(tags = "Fence(围栏信息)")
@Validated
@Slf4j
@RequestMapping("location/fence")
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.web.location.rule;
import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.param.location.rule.LocationAlarmRuleAddParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleModifyParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleParam;
import com.yiring.app.service.location.rule.LocationAlarmRuleService;
import com.yiring.app.vo.location.rule.LocationAlarmRuleVo;
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.ApiOperation;
import java.util.Objects;
import javax.annotation.Resource;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Sort;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
......@@ -14,7 +30,48 @@ import org.springframework.web.bind.annotation.RestController;
*/
@Slf4j
@Validated
@Api(tags = "LocationAlarmRuleController(电子围栏报警规则)")
@Api(tags = "AlarmRule(电子围栏报警规则,配置报警给谁)")
@RestController
@RequestMapping("/alarm/rule")
public class LocationAlarmRuleController {}
public class LocationAlarmRuleController {
@Resource
private LocationAlarmRuleService locationAlarmRuleService;
@ApiOperation(value = "添加一条电子围栏报警规则")
@PostMapping("/addRule")
public Result<String> addRule(@Valid LocationAlarmRuleAddParam param) {
return locationAlarmRuleService.addRule(param);
}
@ApiOperation(value = "修改一条电子围栏报警规则")
@PostMapping("/modifyRule")
public Result<String> modifyRule(@Valid LocationAlarmRuleModifyParam param) {
return locationAlarmRuleService.modifyRule(param);
}
@ApiOperation(value = "删除一条电子围栏报警规则")
@PostMapping("/removeRule")
public Result<String> removeRule(@Valid IdParam idParam) {
return locationAlarmRuleService.removeRule(idParam);
}
@ApiOperation(value = "根据id查询一条电子围栏报警规则")
@PostMapping("/findById")
public Result<LocationAlarmRuleVo> findById(@Valid IdParam idParam) {
return locationAlarmRuleService.findById(idParam);
}
@ApiOperation(value = "根据条件查询电子围栏报警规则")
@PostMapping("/findByCondition")
public Result<PageVo<LocationAlarmRuleVo>> findByCondition(
@Valid LocationAlarmRuleParam param,
@Valid PageParam pageParam
) {
if (Objects.isNull(pageParam.getSortField())) {
pageParam.setSortField(AlarmType.Fields.createTime);
pageParam.setSortOrder(Sort.Direction.DESC);
}
return locationAlarmRuleService.findByCondition(param, pageParam);
}
}
......@@ -27,7 +27,7 @@ import org.springframework.web.bind.annotation.RestController;
*/
@Slf4j
@Validated
@Api(tags = "LocationFenceRuleController(电子围栏报警规则)")
@Api(tags = "FenceRule(电子围栏报警规则,什么情况下会报警)")
@RestController
@RequestMapping("/location/rule")
public class LocationFenceRuleController {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论