提交 c2d0aaa0 作者: 涂茂林

feat:实时围栏信息和实时报警信息

上级 75f817ae
......@@ -93,6 +93,12 @@ public class LocationFence extends BasicEntity implements Serializable {
@Builder.Default
@ManyToMany(fetch = FetchType.LAZY)
Set<LocationTag> tags = new HashSet<>(0);
@ToString.Exclude
@Comment("围栏中的报警记录集合")
@Builder.Default
@OneToMany(mappedBy = "fence")
Set<LocationFenceAlarm> fenceAlarms = new HashSet<>(0);
/*@SuppressWarnings({ "unused" })
public enum Mode {
NORMAL("常规区域"),
......
......@@ -9,6 +9,7 @@ import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldDefaults;
......@@ -97,4 +98,28 @@ public class LocationFenceAlarm extends BasicEntity implements Serializable {
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 @@
package com.yiring.app.domain.location;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;
import org.locationtech.jts.geom.Geometry;
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;
/**
......@@ -58,4 +62,17 @@ public interface LocationFenceRepository
nativeQuery = true
)
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);
}
......@@ -15,12 +15,12 @@ import lombok.NoArgsConstructor;
* @version 1.0
* @date 2022/5/19 15:57
*/
@ApiModel("区域查询条件")
@ApiModel("实时区域查询条件")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class DistrictConditionParam implements Serializable {
public class DistrictRealtimeConditionParam implements Serializable {
@Serial
private static final long serialVersionUID = 5749083087928117992L;
......
/* (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 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;
}
......@@ -2,8 +2,9 @@
package com.yiring.app.service.district;
import com.yiring.app.param.district.DistrictAddParam;
import com.yiring.app.param.district.DistrictConditionParam;
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.common.core.Result;
......@@ -46,9 +47,16 @@ public interface DistrictService {
Result<PageVo<DistrictVo>> findByNameLike(String name);
/**
* 查询实时围栏列表信息
* 查询实时区域列表信息
* @param param 条件
* @return 区域列表
*/
Result<PageVo<DistrictUserVo>> findList(DistrictConditionParam param);
Result<PageVo<DistrictDetailsVo>> findRealtimeList(DistrictRealtimeConditionParam param);
/**
* 查询区域内员工数量
* @param param 条件
* @return 区域列表
*/
Result<PageVo<DistrictUserVo>> findDistrictUser(DistrictRealtimeConditionParam param);
}
......@@ -4,10 +4,11 @@ package com.yiring.app.service.district.impl;
import com.yiring.app.domain.district.District;
import com.yiring.app.domain.district.DistrictRepository;
import com.yiring.app.param.district.DistrictAddParam;
import com.yiring.app.param.district.DistrictConditionParam;
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.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.common.core.Result;
......@@ -98,8 +99,28 @@ public class DistrictServiceImpl implements DistrictService {
}
@Override
public Result<PageVo<DistrictUserVo>> findList(DistrictConditionParam param) {
Specification<District> specification = (root, query, criteriaBuilder) -> {
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()));
......@@ -107,9 +128,5 @@ public class DistrictServiceImpl implements DistrictService {
Predicate[] array = list.toArray(new Predicate[0]);
return criteriaBuilder.and(array);
};
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);
}
}
......@@ -3,13 +3,19 @@ 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.FenceAlarmLogParam;
import com.yiring.app.param.location.fence.FenceRealtimeConditionParam;
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.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
/**
* @author tml
......@@ -34,12 +40,30 @@ public interface FenceAlarmService {
/**
* 导出围栏报警数据
* @param param 查询条件
* @param response 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. */
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.LocationFenceConditionParam;
import com.yiring.app.param.location.fence.LocationFenceModifyParam;
import com.yiring.app.vo.CodeNameVo;
import com.yiring.app.vo.location.fence.FenceRealtimeVo;
import com.yiring.app.vo.location.fence.LocationFenceSearchVo;
import com.yiring.app.vo.location.fence.LocationFenceVo;
import com.yiring.auth.param.IdsParam;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
......@@ -53,7 +56,7 @@ public interface LocationFenceService {
* @param param id
* @return 详细信息
*/
Result<LocationFenceVo> findById(@Valid IdParam param);
Result<LocationFenceVo> findById(IdParam param);
/**
* 根据名称模糊查询围栏信息
......@@ -67,4 +70,27 @@ public interface LocationFenceService {
* @return 地图下拉框
*/
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 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.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.LocationFenceAlarm;
import com.yiring.app.domain.location.LocationFenceAlarmRepository;
import com.yiring.app.domain.location.LocationFenceRepository;
import com.yiring.app.excel.location.fence.FenceAlarmExcel;
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.util.MapUtil;
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.auth.domain.user.User;
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.io.OutputStream;
......@@ -23,12 +34,12 @@ import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.*;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
......@@ -133,6 +144,16 @@ 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) {
......@@ -151,6 +172,79 @@ public class FenceAlarmServiceImpl implements FenceAlarmService {
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) {
return (root, query, criteriaBuilder) -> {
ArrayList<Predicate> list = new ArrayList<>();
......
......@@ -5,21 +5,25 @@ import com.alibaba.fastjson.JSONArray;
import com.yiring.app.constant.RedisKey;
import com.yiring.app.domain.location.LocationFence;
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.LocationFenceConditionParam;
import com.yiring.app.param.location.fence.LocationFenceModifyParam;
import com.yiring.app.service.location.fence.LocationFenceService;
import com.yiring.app.util.JpaUtil;
import com.yiring.app.vo.CodeNameVo;
import com.yiring.app.vo.location.fence.FenceRealtimeVo;
import com.yiring.app.vo.location.fence.LocationFenceSearchVo;
import com.yiring.app.vo.location.fence.LocationFenceVo;
import com.yiring.app.vo.map.MapVo;
import com.yiring.auth.param.IdsParam;
import com.yiring.common.core.Redis;
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.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
......@@ -150,4 +154,38 @@ public class LocationFenceServiceImpl implements LocationFenceService {
PageVo<CodeNameVo> pageVo = PageVo.build(voList, voList.size());
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);
}
}
/* (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();
}
}
......@@ -10,14 +10,13 @@ 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
* @date 2022/5/20 14:41
*/
@ApiModel("区域信息和区域内员工数量")
@ApiModel("区域内员工数量")
@Data
@AllArgsConstructor
@NoArgsConstructor
......@@ -25,31 +24,15 @@ import org.locationtech.jts.geom.Geometry;
public class DistrictUserVo implements Serializable {
@Serial
private static final long serialVersionUID = 3900485837172743182L;
private static final long serialVersionUID = 6164018365847108448L;
@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;
@ApiModelProperty(value = "此区域的员工数量", example = "20")
private Integer userNum;
public static DistrictUserVo transform(District district) {
return DistrictUserVo
.builder()
.name(district.getName())
.riskGrade(district.getRiskGrade())
.geometry(district.getGeometry())
.mapId(builder().mapId)
.userNum(district.getTags().size())
.build();
return DistrictUserVo.builder().name(district.getName()).userNum(district.getTags().size()).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.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();
}
}
/* (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();
}
}
......@@ -2,9 +2,10 @@
package com.yiring.app.web.district;
import com.yiring.app.param.district.DistrictAddParam;
import com.yiring.app.param.district.DistrictConditionParam;
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.vo.district.DistrictDetailsVo;
import com.yiring.app.vo.district.DistrictUserVo;
import com.yiring.app.vo.district.DistrictVo;
import com.yiring.common.core.Result;
......@@ -63,9 +64,15 @@ public class DistrictController {
return districtService.findByNameLike(name);
}
@ApiOperation(value = "查询实时围栏列表")
@GetMapping("/findList")
public Result<PageVo<DistrictUserVo>> findList(@Valid DistrictConditionParam param) {
return districtService.findList(param);
@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 @@
package com.yiring.app.web.location.fence;
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.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.common.core.Result;
import com.yiring.common.domain.BasicEntity;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api;
......@@ -57,4 +62,29 @@ public class FenceAlarmController {
public void export(@Valid FenceAlarmConditionParam param, HttpServletResponse 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.constant.alarm.FenceTypeEnum;
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.LocationFenceConditionParam;
import com.yiring.app.param.location.fence.LocationFenceModifyParam;
import com.yiring.app.service.location.fence.LocationFenceService;
import com.yiring.app.vo.CodeNameVo;
import com.yiring.app.vo.location.fence.FenceRealtimeVo;
import com.yiring.app.vo.location.fence.LocationFenceSearchVo;
import com.yiring.app.vo.location.fence.LocationFenceVo;
import com.yiring.auth.param.IdsParam;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
......@@ -16,15 +20,13 @@ 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.validation.Valid;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
/**
* @author tml
......@@ -73,7 +75,7 @@ public class LocationFenceController {
return locationFenceService.findList(conditionParam, pageParam);
}
@ApiOperation("根据id查询围栏信息")
@ApiOperation("根据id查询围栏信息")
@PostMapping("/findById")
public Result<LocationFenceVo> findById(@Valid IdParam param) {
return locationFenceService.findById(param);
......@@ -89,9 +91,47 @@ public class LocationFenceController {
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("获取地图下拉框")
@PostMapping("/findMapList")
public Result<PageVo<CodeNameVo>> 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);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论