提交 75866cb0 作者: 17607474349

Merge branch 'merge_dev' into dev_lijing

...@@ -36,7 +36,7 @@ dependencies { ...@@ -36,7 +36,7 @@ dependencies {
// Optional: Doc // Optional: Doc
implementation project(":basic-common:doc") implementation project(":basic-common:doc")
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}" implementation "com.github.xiaoymin:knife4j-spring-boot-starter:${knife4jVersion}"
// Optional: Auth // Optional: Auth
implementation project(":basic-auth") implementation project(":basic-auth")
......
...@@ -4,6 +4,7 @@ package com.yiring.app.domain.alarm; ...@@ -4,6 +4,7 @@ package com.yiring.app.domain.alarm;
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.Objects;
import javax.persistence.*; import javax.persistence.*;
import lombok.*; import lombok.*;
import lombok.experimental.FieldNameConstants; import lombok.experimental.FieldNameConstants;
...@@ -68,4 +69,26 @@ public class AlarmType implements Serializable { ...@@ -68,4 +69,26 @@ public class AlarmType implements Serializable {
@Comment(value = "是否删除") @Comment(value = "是否删除")
@Column(nullable = false) @Column(nullable = false)
private Boolean deleted; private Boolean deleted;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
AlarmType alarmType = (AlarmType) o;
return (
Objects.equals(id, alarmType.id) &&
Objects.equals(name, alarmType.name) &&
Objects.equals(fenceType, alarmType.fenceType) &&
Objects.equals(relevanceParam, alarmType.relevanceParam) &&
Objects.equals(comment, alarmType.comment) &&
Objects.equals(createTime, alarmType.createTime) &&
Objects.equals(lastUpdateTime, alarmType.lastUpdateTime) &&
Objects.equals(deleted, alarmType.deleted)
);
}
@Override
public int hashCode() {
return Objects.hash(id, name, fenceType, relevanceParam, comment, createTime, lastUpdateTime, deleted);
}
} }
...@@ -4,10 +4,7 @@ package com.yiring.app.domain.broadcast; ...@@ -4,10 +4,7 @@ package com.yiring.app.domain.broadcast;
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 javax.persistence.Entity; import javax.persistence.*;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants; import lombok.experimental.FieldNameConstants;
...@@ -52,6 +49,7 @@ public class Broadcast implements Serializable { ...@@ -52,6 +49,7 @@ public class Broadcast implements Serializable {
String broadcastName; String broadcastName;
@Comment("坐标点信息") @Comment("坐标点信息")
@Column(columnDefinition = "geometry(Point,4326)")
Point point; Point point;
@Comment("播报设备地址") @Comment("播报设备地址")
......
...@@ -59,7 +59,7 @@ public class District implements Serializable { ...@@ -59,7 +59,7 @@ public class District implements Serializable {
@Comment("区域信息") @Comment("区域信息")
@Type(type = "jts_geometry") @Type(type = "jts_geometry")
@Column(columnDefinition = "geometry") @Column(columnDefinition = "geometry(Geometry,4326)")
private Geometry geometry; private Geometry geometry;
@Comment("创建时间") @Comment("创建时间")
......
...@@ -3,6 +3,7 @@ package com.yiring.app.domain.district; ...@@ -3,6 +3,7 @@ package com.yiring.app.domain.district;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
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.Query; import org.springframework.data.jpa.repository.Query;
...@@ -36,4 +37,12 @@ public interface DistrictRepository extends JpaRepository<District, Serializable ...@@ -36,4 +37,12 @@ public interface DistrictRepository extends JpaRepository<District, Serializable
*/ */
@Query("SELECT d FROM District d WHERE d.name like %?1%") @Query("SELECT d FROM District d WHERE d.name like %?1%")
List<District> findLikeName(String name); List<District> findLikeName(String name);
/**
* 查询空间信息在区域内的区域信息
* @param geometry 空间信息
* @return 区域信息
*/
@Query(value = "select d.* from bs_district d where st_contains(d.geometry, :geometry)", nativeQuery = true)
List<District> findByGeometryContains(Geometry geometry);
} }
...@@ -55,9 +55,9 @@ public class LocationAlarmRule extends BasicEntity implements Serializable { ...@@ -55,9 +55,9 @@ public class LocationAlarmRule extends BasicEntity implements Serializable {
private String informManner; private String informManner;
@Comment("报警类型") @Comment("报警类型")
@ManyToOne @ManyToMany
@JoinColumn(name = "alarm_type_id") @ToString.Exclude
private AlarmType alarmType; private Set<AlarmType> alarmTypes;
@Comment(value = "是否删除") @Comment(value = "是否删除")
@Column(nullable = false) @Column(nullable = false)
......
...@@ -80,6 +80,7 @@ public class LocationBeacon extends BasicEntity implements Serializable { ...@@ -80,6 +80,7 @@ public class LocationBeacon extends BasicEntity implements Serializable {
Double distance; Double distance;
@Comment("坐标点信息") @Comment("坐标点信息")
@Column(columnDefinition = "geometry(Point,4326)")
Point point; Point point;
@FieldMapping @FieldMapping
......
...@@ -51,7 +51,7 @@ public class LocationFence extends BasicEntity implements Serializable { ...@@ -51,7 +51,7 @@ public class LocationFence extends BasicEntity implements Serializable {
private String mapName; private String mapName;
@Comment("摄像头") @Comment("摄像头")
@ManyToOne @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "video_id") @JoinColumn(name = "video_id")
private Video video; private Video video;
...@@ -60,7 +60,7 @@ public class LocationFence extends BasicEntity implements Serializable { ...@@ -60,7 +60,7 @@ public class LocationFence extends BasicEntity implements Serializable {
@Comment("空间信息") @Comment("空间信息")
@Type(type = "jts_geometry") @Type(type = "jts_geometry")
@Column(columnDefinition = "geometry") @Column(columnDefinition = "geometry(Geometry,4326)")
private Geometry geometry; private Geometry geometry;
@Comment("滞留时间(秒)") @Comment("滞留时间(秒)")
...@@ -87,6 +87,12 @@ public class LocationFence extends BasicEntity implements Serializable { ...@@ -87,6 +87,12 @@ public class LocationFence extends BasicEntity implements Serializable {
@OneToMany(mappedBy = "fence") @OneToMany(mappedBy = "fence")
@ToString.Exclude @ToString.Exclude
private Set<LocationFenceRule> rules = new HashSet<>(0); private Set<LocationFenceRule> rules = new HashSet<>(0);
@ToString.Exclude
@Comment("围栏中的标签集合")
@Builder.Default
@ManyToMany(fetch = FetchType.LAZY)
Set<LocationTag> tags = new HashSet<>(0);
/*@SuppressWarnings({ "unused" }) /*@SuppressWarnings({ "unused" })
public enum Mode { public enum Mode {
NORMAL("常规区域"), NORMAL("常规区域"),
......
/* (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 java.time.LocalDateTime;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants;
import org.hibernate.annotations.Comment;
import org.locationtech.jts.geom.Point;
/**
* 围栏报警记录
*
* @author Jim
* @version 0.1
* 2022/5/12 21:33
*/
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@FieldDefaults(level = AccessLevel.PRIVATE)
@Entity
@Table(name = "BS_LOCATION_FENCE_ALARM")
@Comment("围栏报警记录")
public class LocationFenceAlarm extends BasicEntity implements Serializable {
@Serial
private static final long serialVersionUID = 2984248537199016912L;
@Comment("围栏")
@ManyToOne(fetch = FetchType.LAZY)
LocationFence fence;
@Comment("触警位置")
@Column(columnDefinition = "geometry(Point,4326)")
Point point;
@Comment("地图编号")
Long areaId;
@Comment("触警人员")
@ManyToOne(fetch = FetchType.LAZY)
User user;
@Comment("触警标签")
@ManyToOne(fetch = FetchType.LAZY)
LocationTag tag;
@Comment("报警开始时间")
LocalDateTime startTime;
@Comment("报警结束时间")
LocalDateTime endTime;
@Comment("报警类型")
@ManyToOne(fetch = FetchType.LAZY)
AlarmType type;
@Comment("状态")
@Enumerated(EnumType.STRING)
Status status;
// 推送记录集合(含接收状态)
// TODO
@SuppressWarnings({ "unused" })
public enum Status {
ING("进行中"),
OVER("结束");
final String text;
Status(String text) {
this.text = text;
}
public String text() {
return this.text;
}
}
}
/* (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 Jim
* @version 0.1
* 2022/5/12 21:34
*/
@Repository
public interface LocationFenceAlarmRepository
extends JpaRepository<LocationFenceAlarm, Serializable>, JpaSpecificationExecutor<LocationFenceAlarm> {}
...@@ -3,6 +3,7 @@ package com.yiring.app.domain.location; ...@@ -3,6 +3,7 @@ package com.yiring.app.domain.location;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
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.Query; import org.springframework.data.jpa.repository.Query;
...@@ -37,4 +38,12 @@ public interface LocationFenceRepository ...@@ -37,4 +38,12 @@ public interface LocationFenceRepository
*/ */
@Query("SELECT f FROM LocationFence f WHERE name like %?1% AND deleted = false") @Query("SELECT f FROM LocationFence f WHERE name like %?1% AND deleted = false")
List<LocationFence> findLikeName(String name); List<LocationFence> findLikeName(String name);
/**
* 查询空间信息在围栏内的围栏信息
* @param geometry 空间信息
* @return 围栏信息
*/
@Query(value = "select f.* from bs_location_fence f where st_contains(f.geometry, :geometry)", nativeQuery = true)
List<LocationFence> findByGeometryContains(Geometry geometry);
} }
...@@ -9,7 +9,7 @@ import org.springframework.stereotype.Repository; ...@@ -9,7 +9,7 @@ import org.springframework.stereotype.Repository;
/** /**
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/29 11:40 * 2022/4/29 11:40
*/ */
@Repository @Repository
public interface LocationFenceRuleRepository public interface LocationFenceRuleRepository
......
...@@ -71,6 +71,7 @@ public class LocationLog implements Serializable { ...@@ -71,6 +71,7 @@ public class LocationLog implements Serializable {
User.Status status; User.Status status;
@Comment("坐标点信息") @Comment("坐标点信息")
@Column(columnDefinition = "geometry(Point,4326)")
Point point; Point point;
@Comment("信标集合") @Comment("信标集合")
...@@ -83,6 +84,11 @@ public class LocationLog implements Serializable { ...@@ -83,6 +84,11 @@ public class LocationLog implements Serializable {
@Column(columnDefinition = "jsonb") @Column(columnDefinition = "jsonb")
JSONArray fences; JSONArray fences;
@Comment("区域集合")
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
JSONArray districts;
@Comment("静止/运动") @Comment("静止/运动")
Boolean silent; Boolean silent;
...@@ -92,6 +98,9 @@ public class LocationLog implements Serializable { ...@@ -92,6 +98,9 @@ public class LocationLog implements Serializable {
@Comment("电量单位") @Comment("电量单位")
String voltUnit; String voltUnit;
@Comment("是否在厂区外")
Boolean out;
@Comment("原始数据") @Comment("原始数据")
@Type(type = "jsonb") @Type(type = "jsonb")
@Column(columnDefinition = "jsonb") @Column(columnDefinition = "jsonb")
......
...@@ -6,13 +6,11 @@ import com.yiring.common.annotation.FieldMapping; ...@@ -6,13 +6,11 @@ import com.yiring.common.annotation.FieldMapping;
import com.yiring.common.domain.BasicEntity; import com.yiring.common.domain.BasicEntity;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Objects;
import javax.persistence.*; import javax.persistence.*;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants; import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import org.hibernate.Hibernate;
import org.hibernate.annotations.Comment; import org.hibernate.annotations.Comment;
import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Point;
...@@ -102,9 +100,13 @@ public class LocationTag extends BasicEntity implements Serializable { ...@@ -102,9 +100,13 @@ public class LocationTag extends BasicEntity implements Serializable {
@Comment("类型(1:内部/2:访客)") @Comment("类型(1:内部/2:访客)")
Integer category; Integer category;
@Comment("最后定位坐标") @Comment("最新定位坐标")
@Column(columnDefinition = "geometry(Point,4326)")
Point point; Point point;
@Comment("是否在厂外")
Boolean out;
@SuppressWarnings({ "unused" }) @SuppressWarnings({ "unused" })
public enum Type { public enum Type {
BTT01("蓝牙人员定位卡"), BTT01("蓝牙人员定位卡"),
...@@ -120,17 +122,4 @@ public class LocationTag extends BasicEntity implements Serializable { ...@@ -120,17 +122,4 @@ public class LocationTag extends BasicEntity implements Serializable {
return this.text; return this.text;
} }
} }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
LocationTag that = (LocationTag) o;
return getId() != null && Objects.equals(getId(), that.getId());
}
@Override
public int hashCode() {
return getClass().hashCode();
}
} }
...@@ -2,16 +2,43 @@ ...@@ -2,16 +2,43 @@
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.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.Query;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
/** /**
* 定位标签JPA * 定位标签JPA
* @author LJ-2204 * @author LJ-2204
* @date 2022/4/14 * 2022/4/14
*/ */
@Repository @Repository
public interface LocationTagRepository public interface LocationTagRepository
extends JpaRepository<LocationTag, Serializable>, JpaSpecificationExecutor<LocationTag> {} extends JpaRepository<LocationTag, Serializable>, JpaSpecificationExecutor<LocationTag> {
/**
* 查询在指定区域内的所有标签
* @param geometry 指定区域
* @return 标签
*/
@Query(value = "SELECT * FROM BS_LOCATION_TAG bl WHERE ST_Contains(?1, bl.point)", nativeQuery = true)
List<LocationTag> findInArea(Geometry geometry);
/**
* 查询在指定区域内的所有标签数量
* @param geometry 指定区域
* @return 标签数量
*/
@Query(value = "SELECT count(*) FROM BS_LOCATION_TAG bl WHERE ST_Contains(?1, bl.point)", nativeQuery = true)
int findInAreaNum(Geometry geometry);
/**
* 根据多个员工id查询定位标签
* @param userIds 员工id集
* @return 定位标签
*/
@Query(value = "SELECT * FROM BS_LOCATION_TAG WHERE user_id IN (?1)", nativeQuery = true)
List<LocationTag> findByUserIds(List<Long> userIds);
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.location;
import com.vladmihalcea.hibernate.type.json.JsonBinaryType;
import com.yiring.common.domain.BasicEntity;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.TypeDef;
/**
* 定位进出记录
*
* @author Jim
* @version 0.1
* 2022/5/12 17:54
*/
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@FieldDefaults(level = AccessLevel.PRIVATE)
@Entity
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
@Table(name = "BS_LOCATION_TURNOVER", indexes = { @Index(columnList = "type"), @Index(columnList = "sourceId") })
@Comment("定位进出记录")
public class LocationTurnover extends BasicEntity implements Serializable {
@Serial
private static final long serialVersionUID = 887764448464587364L;
@Comment("进出区域/围栏表主键")
Long sourceId;
@Comment("类型")
@Enumerated(EnumType.STRING)
Type type;
@Comment("定位标签")
@ManyToOne(fetch = FetchType.LAZY)
LocationTag tag;
@Comment("定位时间")
LocalDateTime time;
@Comment("进入")
Boolean enter;
@Comment("是否为最新状态")
Boolean isLatest;
@SuppressWarnings({ "unused" })
public enum Type {
FENCE("围栏"),
DISTRICT("区域");
final String text;
Type(String text) {
this.text = text;
}
public String text() {
return this.text;
}
}
}
/* (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 Jim
* @version 0.1
* 2022/5/12 18:13
*/
@Repository
public interface LocationTurnoverRepository
extends JpaRepository<LocationTurnover, Serializable>, JpaSpecificationExecutor<LocationTurnover> {}
...@@ -48,7 +48,7 @@ public class AccidentSpot extends BasicEntity implements Serializable { ...@@ -48,7 +48,7 @@ public class AccidentSpot extends BasicEntity implements Serializable {
@Comment("空间信息") @Comment("空间信息")
@Type(type = "jts_geometry") @Type(type = "jts_geometry")
@Column(columnDefinition = "geometry") @Column(columnDefinition = "geometry(Geometry,4326)")
private Geometry geometry; private Geometry geometry;
@Comment("摄像头") @Comment("摄像头")
......
...@@ -48,7 +48,7 @@ public class EvacuationZone extends BasicEntity implements Serializable { ...@@ -48,7 +48,7 @@ public class EvacuationZone extends BasicEntity implements Serializable {
@Comment("空间信息") @Comment("空间信息")
@Type(type = "jts_geometry") @Type(type = "jts_geometry")
@Column(columnDefinition = "geometry") @Column(columnDefinition = "geometry(Geometry,4326)")
private Geometry geometry; private Geometry geometry;
@Comment("摄像头") @Comment("摄像头")
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.rehearsal;
import com.yiring.common.domain.BasicEntity;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.Type;
import org.locationtech.jts.geom.Geometry;
/**
* @author tml
* @version 1.0
* @date 2022/5/10 10:56
*/
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder(toBuilder = true)
@FieldNameConstants
@Entity
//@Where(clause = "deleted = false")
@Table(name = "BS_REHEARSAL_PLAN_LOG")
@Comment("演练计划实施数据")
public class RehearsalPlanLog extends BasicEntity implements Serializable {
@Serial
private static final long serialVersionUID = -6920108507160621905L;
@Comment("演练计划")
@OneToOne
@JoinColumn(name = "rehearsal_plan_id")
private RehearsalPlan rehearsalPlan;
@Comment("开始时间")
private LocalDateTime beginTime;
@Comment("结束时间")
private LocalDateTime endTime;
@Comment("开始时事故点人数")
private Integer accidentPeopleNum;
@Comment("事故点内员工id集")
private String userIds;
@Comment("结束时撤离区人数")
private Integer evacuationPeopleNum;
@Comment("事故点影响范围的空间信息")
@Type(type = "jts_geometry")
@Column(columnDefinition = "geometry")
private Geometry geometry;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.rehearsal;
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/11 17:04
*/
@Repository
public interface RehearsalPlanLogRepository
extends JpaRepository<RehearsalPlanLog, Serializable>, JpaSpecificationExecutor<RehearsalPlanLog> {
/**
* 根据演练计划查询演练计划实施数据
* @param rehearsalPlan 演练计划
* @return 演练计划实施数据
*/
RehearsalPlanLog findByRehearsalPlan(RehearsalPlan rehearsalPlan);
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.rehearsal;
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/10 10:49
*/
@Repository
public interface RehearsalPlanRepository
extends JpaRepository<RehearsalPlan, Serializable>, JpaSpecificationExecutor<RehearsalPlan> {}
...@@ -44,6 +44,7 @@ public class Video implements Serializable { ...@@ -44,6 +44,7 @@ public class Video implements Serializable {
Long id; Long id;
@Comment("坐标点信息") @Comment("坐标点信息")
@Column(columnDefinition = "geometry(Point,4326)")
Point point; Point point;
@Comment("标识") @Comment("标识")
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.excel.location; package com.yiring.app.excel.location;
import com.alibaba.fastjson.JSON;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn; import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.github.liaochong.myexcel.core.annotation.ExcelModel; import com.github.liaochong.myexcel.core.annotation.ExcelModel;
import com.yiring.app.vo.location.rule.LocationAlarmRuleVo; import com.yiring.app.constant.alarm.InformMannerEnum;
import com.yiring.app.domain.location.LocationAlarmRule;
import com.yiring.auth.domain.user.User;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
...@@ -29,7 +33,7 @@ public class LocationAlarmRuleExcel implements Serializable { ...@@ -29,7 +33,7 @@ public class LocationAlarmRuleExcel implements Serializable {
@ExcelColumn(title = "地图名称") @ExcelColumn(title = "地图名称")
private String mapName; private String mapName;
@ExcelColumn(title = "电子围栏名称") @ExcelColumn(title = "电子围栏名称", width = 15)
private String fenceName; private String fenceName;
@ExcelColumn(title = "接收人", width = 20) @ExcelColumn(title = "接收人", width = 20)
...@@ -38,25 +42,25 @@ public class LocationAlarmRuleExcel implements Serializable { ...@@ -38,25 +42,25 @@ public class LocationAlarmRuleExcel implements Serializable {
@ExcelColumn(title = "通知方式", width = 18) @ExcelColumn(title = "通知方式", width = 18)
private String informManner; private String informManner;
public static LocationAlarmRuleExcel transform(LocationAlarmRuleVo locationAlarmRuleVo) { public static LocationAlarmRuleExcel transform(LocationAlarmRule locationAlarmRule) {
StringBuilder users = new StringBuilder(); StringBuilder usersBuilder = new StringBuilder();
StringBuilder informManner = new StringBuilder(); StringBuilder informManner = new StringBuilder();
for (int i = 0; i < locationAlarmRuleVo.getUsers().size(); i++) { List<Integer> informMannerList = JSON.parseArray(locationAlarmRule.getInformManner(), Integer.class);
if (i != 0) { for (User user : locationAlarmRule.getUsers()) {
users.append(", "); usersBuilder.append(", ");
} usersBuilder.append(user.getRealName());
users.append(locationAlarmRuleVo.getUsers().get(i).getRealName());
} }
for (int i = 0; i < locationAlarmRuleVo.getInformManner().size(); i++) { String users = usersBuilder.substring(2);
for (int i = 0; i < informMannerList.size(); i++) {
if (i != 0) { if (i != 0) {
informManner.append(", "); informManner.append(", ");
} }
informManner.append(locationAlarmRuleVo.getInformManner().get(i).getName()); informManner.append(InformMannerEnum.getByCode(informMannerList.get(i)));
} }
return LocationAlarmRuleExcel return LocationAlarmRuleExcel
.builder() .builder()
.mapName(locationAlarmRuleVo.getMapName()) .mapName(locationAlarmRule.getMapName())
.fenceName(locationAlarmRuleVo.getFenceName()) .fenceName(locationAlarmRule.getLocationFence().getName())
.users(users.toString()) .users(users.toString())
.informManner(informManner.toString()) .informManner(informManner.toString())
.build(); .build();
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.excel.rehearsal;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.github.liaochong.myexcel.core.annotation.ExcelModel;
import com.yiring.app.constant.rehearsal.RehearsalPlanStatusEnum;
import com.yiring.app.constant.rehearsal.RiskLevelEnum;
import com.yiring.app.domain.rehearsal.RehearsalPlan;
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/10 13:48
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ExcelModel
public class RehearsalPlanExcel implements Serializable {
@Serial
private static final long serialVersionUID = -2976618459214077036L;
@ExcelColumn(title = "演练主题")
private String topical;
@ExcelColumn(title = "事故点")
private String accidentSpotName;
@ExcelColumn(title = "周边范围(m)")
private Integer scope;
@ExcelColumn(title = "撤离点")
private String evacuationZoneName;
@ExcelColumn(title = "风险程度")
private String riskLevelName;
@ExcelColumn(title = "事故信息")
private String accidentMsg;
@ExcelColumn(title = "演练时间")
private LocalDateTime rehearsalTime;
@ExcelColumn(title = "推送信息")
private String pushMsg;
@ExcelColumn(title = "状态")
private String statusName;
public static RehearsalPlanExcel transform(RehearsalPlan rehearsalPlan) {
return RehearsalPlanExcel
.builder()
.topical(rehearsalPlan.getTopical())
.accidentSpotName(rehearsalPlan.getAccidentSpot().getName())
.scope(rehearsalPlan.getScope())
.evacuationZoneName(rehearsalPlan.getEvacuationZone().getName())
.riskLevelName(RiskLevelEnum.getByCode(rehearsalPlan.getRiskLevel()))
.accidentMsg(rehearsalPlan.getAccidentMsg())
.rehearsalTime(rehearsalPlan.getRehearsalTime())
.pushMsg(rehearsalPlan.getPushMsg())
.statusName(RehearsalPlanStatusEnum.getByCode(rehearsalPlan.getStatus()))
.build();
}
}
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.job; package com.yiring.app.job;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob; import com.xxl.job.core.handler.annotation.XxlJob;
import com.yiring.app.domain.location.LocationLog; import com.yiring.app.domain.location.LocationLog;
import com.yiring.app.domain.location.LocationLogRepository; import com.yiring.app.domain.location.LocationLogRepository;
import com.yiring.app.rabbit.config.ZyRabbitConfig; import com.yiring.app.rabbit.config.ZyConfigProperties;
import com.yiring.app.util.GeoUtils; import com.yiring.app.util.GeoUtils;
import com.yiring.common.constant.DateFormatter; import com.yiring.common.constant.DateFormatter;
import java.time.LocalDateTime; import java.time.LocalDateTime;
...@@ -29,7 +31,7 @@ import org.springframework.stereotype.Component; ...@@ -29,7 +31,7 @@ import org.springframework.stereotype.Component;
@SuppressWarnings("unused") @SuppressWarnings("unused")
@Slf4j @Slf4j
@Component @Component
public class MockZyMessageJob { public class MockPositionMessageJob {
@Resource @Resource
RabbitTemplate rabbitTemplate; RabbitTemplate rabbitTemplate;
...@@ -37,19 +39,36 @@ public class MockZyMessageJob { ...@@ -37,19 +39,36 @@ public class MockZyMessageJob {
@Resource @Resource
LocationLogRepository locationLogRepository; LocationLogRepository locationLogRepository;
@XxlJob("MockZyMessageHandler") @Resource
public void mockMessageHandler() { ZyConfigProperties.ZyConfigRabbitmq rabbitmq;
log.info("MockZyMessageHandler: {}", LocalDateTime.now().format(DateFormatter.DATE_TIME));
@XxlJob("MockPositionHandler")
public void MockPositionHandler() {
JSONObject extra = toJSON(XxlJobHelper.getJobParam());
log.info("[Mock] Position: {}, {}", mockPositionMessage(extra), extra);
}
@XxlJob("MockLowPowerHandler")
public void MockLowPowerHandler() {
JSONObject extra = toJSON(XxlJobHelper.getJobParam());
log.info("[Mock] LowPower: {}, {}", mockLowPowerMessage(extra), extra);
}
@XxlJob("MockDeviceStatusHandler")
public void MockDeviceStatusHandler() {
JSONObject extra = toJSON(XxlJobHelper.getJobParam());
log.info("[Mock] DeviceStatus: {}, {}", mockDeviceStatusMessage(extra), extra);
}
log.info("[Mock] Position: {}", mockPositionMessage()); @XxlJob("MockKeyWarningHandler")
log.info("[Mock] LowPower: {}", mockLowPowerMessage()); public void MockKeyWarningHandler() {
log.info("[Mock] DeviceStatus: {}", mockDeviceStatusMessage()); JSONObject extra = toJSON(XxlJobHelper.getJobParam());
log.info("[Mock] KeyWarning: {}", mockKeyWarningMessage()); log.info("[Mock] KeyWarning: {}, {}", mockKeyWarningMessage(extra), extra);
} }
@XxlJob("QueryMessageHandler") @XxlJob("QueryMessageHandler")
public void queryMessageHandler() { public void queryMessageHandler() {
log.info("QueryZyMessageHandler: {}", LocalDateTime.now().format(DateFormatter.DATE_TIME)); log.info("QueryMessageHandler: {}", LocalDateTime.now().format(DateFormatter.DATE_TIME));
try { try {
Specification<LocationLog> spec = (root, query, cb) -> { Specification<LocationLog> spec = (root, query, cb) -> {
...@@ -59,17 +78,31 @@ public class MockZyMessageJob { ...@@ -59,17 +78,31 @@ public class MockZyMessageJob {
}; };
List<LocationLog> logs = locationLogRepository.findAll(spec); List<LocationLog> logs = locationLogRepository.findAll(spec);
log.info("QueryZyMessageHandler: {}", logs.size()); log.info("log size: {}", logs.size());
} catch (Exception e) { } catch (Exception e) {
log.error(e.getMessage(), e); log.error(e.getMessage(), e);
} }
} }
public JSONObject send(JSONObject body) { public JSONObject send(JSONObject body) {
rabbitTemplate.convertAndSend(ZyRabbitConfig.MESSAGE_QUEUES_NAME, body.toJSONString()); if (rabbitmq.isMock()) {
rabbitTemplate.convertAndSend(rabbitmq.getQueueName(), body.toJSONString());
}
return body; return body;
} }
public JSONObject toJSON(String params) {
JSONObject extra = new JSONObject();
try {
extra = JSON.parseObject(params);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return extra == null ? new JSONObject() : extra;
}
private String mockTag() { private String mockTag() {
return "BTT33333331"; return "BTT33333331";
} }
...@@ -78,7 +111,7 @@ public class MockZyMessageJob { ...@@ -78,7 +111,7 @@ public class MockZyMessageJob {
return 10019L; return 10019L;
} }
private JSONObject mockPositionMessage() { private JSONObject mockPositionMessage(JSONObject extra) {
// 随机生成一个坐标点 // 随机生成一个坐标点
Point point = GeoUtils.randomPoint(GeoUtils.defaultBounds(), 0); Point point = GeoUtils.randomPoint(GeoUtils.defaultBounds(), 0);
...@@ -95,6 +128,7 @@ public class MockZyMessageJob { ...@@ -95,6 +128,7 @@ public class MockZyMessageJob {
params.put("volt", 3650); params.put("volt", 3650);
params.put("voltUnit", "mV"); params.put("voltUnit", "mV");
params.put("floor", 1); params.put("floor", 1);
params.putAll(extra);
JSONObject body = new JSONObject(); JSONObject body = new JSONObject();
body.put("method", "position"); body.put("method", "position");
...@@ -102,11 +136,12 @@ public class MockZyMessageJob { ...@@ -102,11 +136,12 @@ public class MockZyMessageJob {
return send(body); return send(body);
} }
private JSONObject mockLowPowerMessage() { private JSONObject mockLowPowerMessage(JSONObject extra) {
JSONObject params = new JSONObject(); JSONObject params = new JSONObject();
params.put("tagId", mockTag()); params.put("tagId", mockTag());
params.put("volt", 3650); params.put("volt", 3650);
params.put("voltUnit", "mV"); params.put("voltUnit", "mV");
params.putAll(extra);
JSONObject body = new JSONObject(); JSONObject body = new JSONObject();
body.put("method", "lowPower"); body.put("method", "lowPower");
...@@ -114,7 +149,7 @@ public class MockZyMessageJob { ...@@ -114,7 +149,7 @@ public class MockZyMessageJob {
return send(body); return send(body);
} }
private JSONObject mockDeviceStatusMessage() { private JSONObject mockDeviceStatusMessage(JSONObject extra) {
JSONObject params = new JSONObject(); JSONObject params = new JSONObject();
params.put("deviceId", mockTag()); params.put("deviceId", mockTag());
params.put("areaId", mockAreaId()); params.put("areaId", mockAreaId());
...@@ -122,6 +157,7 @@ public class MockZyMessageJob { ...@@ -122,6 +157,7 @@ public class MockZyMessageJob {
params.put("volt", 3650); params.put("volt", 3650);
params.put("field_21", "mV"); params.put("field_21", "mV");
params.put("updateTime", System.currentTimeMillis()); params.put("updateTime", System.currentTimeMillis());
params.putAll(extra);
JSONObject body = new JSONObject(); JSONObject body = new JSONObject();
body.put("method", "deviceStatus"); body.put("method", "deviceStatus");
...@@ -129,7 +165,7 @@ public class MockZyMessageJob { ...@@ -129,7 +165,7 @@ public class MockZyMessageJob {
return send(body); return send(body);
} }
private JSONObject mockKeyWarningMessage() { private JSONObject mockKeyWarningMessage(JSONObject extra) {
JSONObject params = new JSONObject(); JSONObject params = new JSONObject();
params.put("tagId", mockTag()); params.put("tagId", mockTag());
params.put("entityId", "4376"); params.put("entityId", "4376");
...@@ -139,6 +175,7 @@ public class MockZyMessageJob { ...@@ -139,6 +175,7 @@ public class MockZyMessageJob {
params.put("y", 100); params.put("y", 100);
params.put("z", 0); params.put("z", 0);
params.put("floor", 1); params.put("floor", 1);
params.putAll(extra);
JSONObject body = new JSONObject(); JSONObject body = new JSONObject();
body.put("method", "keyWarning"); body.put("method", "keyWarning");
......
...@@ -14,11 +14,12 @@ import lombok.NoArgsConstructor; ...@@ -14,11 +14,12 @@ import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Range; import org.hibernate.validator.constraints.Range;
/** /**
* 报警类型的条件param
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/27 14:28 * @date 2022/4/27 14:28
*/ */
@ApiModel("AlarmConditionParam(报警类型的条件param)") @ApiModel("AlarmConditionParam")
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
......
...@@ -18,11 +18,12 @@ import org.hibernate.validator.constraints.Length; ...@@ -18,11 +18,12 @@ import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range; import org.hibernate.validator.constraints.Range;
/** /**
* 报警类型的添加param
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/27 11:28 * @date 2022/4/27 11:28
*/ */
@ApiModel("AlarmTypeAddParam(报警类型的添加param)") @ApiModel("AlarmTypeAddParam")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
......
...@@ -15,11 +15,12 @@ import lombok.NoArgsConstructor; ...@@ -15,11 +15,12 @@ import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Length;
/** /**
* 报警类型修改param
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/27 11:28 * @date 2022/4/27 11:28
*/ */
@ApiModel("AlarmTypeModifyParam(报警类型修改param)") @ApiModel("AlarmTypeModifyParam")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
...@@ -58,7 +59,6 @@ public class AlarmTypeModifyParam implements Serializable { ...@@ -58,7 +59,6 @@ public class AlarmTypeModifyParam implements Serializable {
.fenceType(fenceType) .fenceType(fenceType)
.relevanceParam(relevanceParam) .relevanceParam(relevanceParam)
.comment(comment) .comment(comment)
.deleted(false)
.build(); .build();
} }
} }
...@@ -14,11 +14,12 @@ import lombok.Data; ...@@ -14,11 +14,12 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
/** /**
* 历史轨迹的条件param
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/5/6 10:53 * @date 2022/5/6 10:53
*/ */
@ApiModel("HistoryRoute(历史轨迹的条件param)") @ApiModel("HistoryRoute")
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
......
...@@ -18,7 +18,7 @@ import org.locationtech.jts.geom.Geometry; ...@@ -18,7 +18,7 @@ import org.locationtech.jts.geom.Geometry;
* @version 1.0 * @version 1.0
* @date 2022/4/26 10:40 * @date 2022/4/26 10:40
*/ */
@ApiModel("DistrictAddParam(添加区域param)") @ApiModel("DistrictAddParam")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
......
...@@ -20,7 +20,7 @@ import org.locationtech.jts.geom.Geometry; ...@@ -20,7 +20,7 @@ import org.locationtech.jts.geom.Geometry;
* @version 1.0 * @version 1.0
* @date 2022/4/26 10:40 * @date 2022/4/26 10:40
*/ */
@ApiModel("DistrictAddParam(添加区域param)") @ApiModel("DistrictAddParam")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
......
...@@ -17,11 +17,12 @@ import org.hibernate.validator.constraints.Range; ...@@ -17,11 +17,12 @@ import org.hibernate.validator.constraints.Range;
import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Geometry;
/** /**
* 添加围栏信息的param
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/28 10:52 * @date 2022/4/28 10:52
*/ */
@ApiModel("LocationFenceAddParam(添加围栏信息的param)") @ApiModel("LocationFenceAddParam")
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
......
...@@ -11,11 +11,12 @@ import lombok.Data; ...@@ -11,11 +11,12 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
/** /**
* 查询围栏信息的条件param
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/28 13:35 * @date 2022/4/28 13:35
*/ */
@ApiModel("LocationFenceConditionParam(查询围栏信息的条件param)") @ApiModel("LocationFenceConditionParam")
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
......
...@@ -16,11 +16,12 @@ import org.hibernate.validator.constraints.Range; ...@@ -16,11 +16,12 @@ import org.hibernate.validator.constraints.Range;
import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Geometry;
/** /**
* 修改围栏信息的param
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/28 10:52 * @date 2022/4/28 10:52
*/ */
@ApiModel("LocationFenceModifyParam(修改围栏信息的param)") @ApiModel("LocationFenceModifyParam")
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
...@@ -70,7 +71,6 @@ public class LocationFenceModifyParam { ...@@ -70,7 +71,6 @@ public class LocationFenceModifyParam {
.geometry(geometry) .geometry(geometry)
.residenceTime(residenceTime) .residenceTime(residenceTime)
.threshold(threshold) .threshold(threshold)
.enable(false)
.build(); .build();
} }
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.rule;
import io.swagger.annotations.ApiModel;
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/11 14:17
*/
@ApiModel("批量添加配置报警类别的报警规则")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AlarmRuleBatchAddParam implements Serializable {
@Serial
private static final long serialVersionUID = 7123885270967732491L;
private Set<LocationAlarmRuleAddParam> params;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.location.rule;
import io.swagger.annotations.ApiModel;
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/12 9:46
*/
@ApiModel("批量修改配置报警类别的报警规则")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AlarmRuleBatchModifyParam implements Serializable {
@Serial
private static final long serialVersionUID = -9160183461478867656L;
private Set<LocationAlarmRuleModifyParam> params;
}
...@@ -14,6 +14,7 @@ import java.io.Serial; ...@@ -14,6 +14,7 @@ import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
...@@ -36,6 +37,12 @@ public class LocationAlarmRuleAddParam implements Serializable { ...@@ -36,6 +37,12 @@ public class LocationAlarmRuleAddParam implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 388296602724939033L; private static final long serialVersionUID = 388296602724939033L;
/**
* 这个字段给前端标识用,后端无意义
*/
@ApiModelProperty(value = "标识ID,无意义")
private Integer tabId;
@JsonSerialize(using = ToStringSerializer.class) @JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "地图id", example = "1", required = true) @ApiModelProperty(value = "地图id", example = "1", required = true)
@NotNull(message = "地图id不能为空") @NotNull(message = "地图id不能为空")
...@@ -49,16 +56,16 @@ public class LocationAlarmRuleAddParam implements Serializable { ...@@ -49,16 +56,16 @@ public class LocationAlarmRuleAddParam implements Serializable {
@NotNull(message = "电子围栏id不能为空") @NotNull(message = "电子围栏id不能为空")
private Long fenceId; private Long fenceId;
@ApiModelProperty(value = "报警类型id", example = "1", required = true) @ApiModelProperty(value = "报警类型id", required = true)
@NotNull(message = "报警类型id不能为空") @NotEmpty(message = "报警类型id不能为空")
private Long alarmId; private Set<Long> alarmIds;
@ApiModelProperty(value = "接收人集合(id)", required = true) @ApiModelProperty(value = "接收人集合(id)", required = true)
@NotNull(message = "接收人id不能为空") @NotEmpty(message = "接收人id不能为空")
private Set<Long> users; private Set<Long> users;
@ApiModelProperty(value = "通知方式集合", required = true) @ApiModelProperty(value = "通知方式集合", required = true)
@NotNull(message = "通知方式不能为空") @NotEmpty(message = "通知方式不能为空")
private Set<Integer> informManner; private Set<Integer> informManner;
public LocationAlarmRule transform() { public LocationAlarmRule transform() {
...@@ -67,7 +74,10 @@ public class LocationAlarmRuleAddParam implements Serializable { ...@@ -67,7 +74,10 @@ public class LocationAlarmRuleAddParam implements Serializable {
for (Long item : this.users) { for (Long item : this.users) {
set.add(User.builder().id(item).build()); set.add(User.builder().id(item).build());
} }
AlarmType alarmType = AlarmType.builder().id(alarmId).build(); Set<AlarmType> alarmTypes = alarmIds
.stream()
.map(e -> AlarmType.builder().id(e).build())
.collect(Collectors.toSet());
String json = JSON.toJSONString(informManner); String json = JSON.toJSONString(informManner);
return LocationAlarmRule return LocationAlarmRule
.builder() .builder()
...@@ -75,7 +85,7 @@ public class LocationAlarmRuleAddParam implements Serializable { ...@@ -75,7 +85,7 @@ public class LocationAlarmRuleAddParam implements Serializable {
.mapName(mapName) .mapName(mapName)
.locationFence(locationFence) .locationFence(locationFence)
.users(set) .users(set)
.alarmType(alarmType) .alarmTypes(alarmTypes)
.informManner(json) .informManner(json)
.deleted(false) .deleted(false)
.build(); .build();
......
...@@ -12,6 +12,7 @@ import java.io.Serial; ...@@ -12,6 +12,7 @@ import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
...@@ -34,6 +35,12 @@ public class LocationAlarmRuleModifyParam implements Serializable { ...@@ -34,6 +35,12 @@ public class LocationAlarmRuleModifyParam implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 388296602724939033L; private static final long serialVersionUID = 388296602724939033L;
/**
* 这个字段给前端标识用,后端无意义
*/
@ApiModelProperty(value = "标识ID,无意义")
private Integer tabId;
@ApiModelProperty(value = "id", example = "1", required = true) @ApiModelProperty(value = "id", example = "1", required = true)
@NotEmpty(message = "规则id不能为空") @NotEmpty(message = "规则id不能为空")
private Long id; private Long id;
...@@ -44,9 +51,9 @@ public class LocationAlarmRuleModifyParam implements Serializable { ...@@ -44,9 +51,9 @@ public class LocationAlarmRuleModifyParam implements Serializable {
@ApiModelProperty(value = "地图名称", example = "一层", required = true) @ApiModelProperty(value = "地图名称", example = "一层", required = true)
private String mapName; private String mapName;
@ApiModelProperty(value = "报警类型id", example = "1", required = true) @ApiModelProperty(value = "报警类型id", required = true)
@NotNull(message = "报警类型id不能为空") @NotNull(message = "报警类型id不能为空")
private Long alarmId; private Set<Long> alarmIds;
@ApiModelProperty(value = "电子围栏id", example = "1", required = true) @ApiModelProperty(value = "电子围栏id", example = "1", required = true)
private Long fenceId; private Long fenceId;
...@@ -63,7 +70,10 @@ public class LocationAlarmRuleModifyParam implements Serializable { ...@@ -63,7 +70,10 @@ public class LocationAlarmRuleModifyParam implements Serializable {
for (Long item : this.users) { for (Long item : this.users) {
set.add(User.builder().id(item).build()); set.add(User.builder().id(item).build());
} }
AlarmType alarmType = AlarmType.builder().id(alarmId).build(); Set<AlarmType> alarmTypes = alarmIds
.stream()
.map(e -> AlarmType.builder().id(e).build())
.collect(Collectors.toSet());
String json = JSON.toJSONString(informManner); String json = JSON.toJSONString(informManner);
return LocationAlarmRule return LocationAlarmRule
.builder() .builder()
...@@ -72,9 +82,8 @@ public class LocationAlarmRuleModifyParam implements Serializable { ...@@ -72,9 +82,8 @@ public class LocationAlarmRuleModifyParam implements Serializable {
.mapName(mapName) .mapName(mapName)
.locationFence(locationFence) .locationFence(locationFence)
.users(set) .users(set)
.alarmType(alarmType) .alarmTypes(alarmTypes)
.informManner(json) .informManner(json)
.deleted(false)
.build(); .build();
} }
} }
...@@ -18,11 +18,12 @@ import lombok.NoArgsConstructor; ...@@ -18,11 +18,12 @@ import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Range; import org.hibernate.validator.constraints.Range;
/** /**
* 添加配置报警类别的报警规则,根据不同类型传入不同参数
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/28 16:16 * @date 2022/4/28 16:16
*/ */
@ApiModel("添加配置报警类别的报警规则,根据不同类型传入不同参数") @ApiModel("LocationFenceRuleAddParam")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
......
...@@ -10,12 +10,13 @@ import javax.validation.constraints.NotNull; ...@@ -10,12 +10,13 @@ import javax.validation.constraints.NotNull;
import lombok.*; import lombok.*;
/** /**
* 修改配置报警类别的报警规则,根据不同类型传入不同参数
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/28 16:16 * @date 2022/4/28 16:16
*/ */
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ApiModel("修改配置报警类别的报警规则,根据不同类型传入不同参数") @ApiModel("LocationFenceRuleModifyParam")
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
......
...@@ -12,11 +12,12 @@ import lombok.Data; ...@@ -12,11 +12,12 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
/** /**
* 报警规则,根据不同类型传入不同参数
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/29 14:12 * @date 2022/4/29 14:12
*/ */
@ApiModel("报警规则,根据不同类型传入不同参数") @ApiModel("RuleParam")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
......
...@@ -66,8 +66,6 @@ public class AccidentSpotModifyParam implements Serializable { ...@@ -66,8 +66,6 @@ public class AccidentSpotModifyParam implements Serializable {
.video(video) .video(video)
.timeoutDuration(timeoutDuration) .timeoutDuration(timeoutDuration)
.threshold(threshold) .threshold(threshold)
.enable(false)
.deleted(false)
.build(); .build();
} }
} }
...@@ -64,8 +64,6 @@ public class EvacuationZoneModifyParam implements Serializable { ...@@ -64,8 +64,6 @@ public class EvacuationZoneModifyParam implements Serializable {
.video(video) .video(video)
.timeoutDuration(timeoutDuration) .timeoutDuration(timeoutDuration)
.threshold(threshold) .threshold(threshold)
.enable(false)
.deleted(false)
.build(); .build();
} }
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.rehearsal;
import com.yiring.app.constant.rehearsal.RehearsalPlanStatusEnum;
import com.yiring.app.domain.rehearsal.AccidentSpot;
import com.yiring.app.domain.rehearsal.EvacuationZone;
import com.yiring.app.domain.rehearsal.RehearsalPlan;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
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/10 11:29
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel("演练计划新增param")
public class RehearsalPlanAddParam implements Serializable {
@Serial
private static final long serialVersionUID = 6574628197950618904L;
@ApiModelProperty(value = "演练主题", example = "红色演练", required = true)
@NotEmpty(message = "演练主题不能为空")
private String topical;
@ApiModelProperty(value = "事故点id", example = "1522844636060585984", required = true)
@NotNull(message = "事故点id不能为空")
private Long accidentSpotId;
@ApiModelProperty(value = "周边范围(事故点周围多少米)", example = "50", required = true)
@NotNull(message = "周边范围不能为空")
private Integer scope;
@ApiModelProperty(value = "撤离区id", example = "1523562795864428544", required = true)
@NotNull(message = "撤离区id不能为空")
private Long evacuationZoneId;
@ApiModelProperty(value = "风险程度", example = "1", required = true)
@NotNull(message = "撤离区id不能为空")
private Integer riskLevel;
@ApiModelProperty(value = "事故信息", example = "气体泄露", required = true)
@NotEmpty(message = "事故信息不能为空")
private String accidentMsg;
@ApiModelProperty(value = "推送信息", example = "气体泄露,请尽快逃离", required = true)
@NotEmpty(message = "推送信息不能为空")
private String pushMsg;
public RehearsalPlan transform() {
AccidentSpot accidentSpot = AccidentSpot.builder().id(accidentSpotId).build();
EvacuationZone evacuationZone = EvacuationZone.builder().id(evacuationZoneId).build();
return RehearsalPlan
.builder()
.topical(topical)
.accidentSpot(accidentSpot)
.scope(scope)
.evacuationZone(evacuationZone)
.riskLevel(riskLevel)
.accidentMsg(accidentMsg)
.pushMsg(pushMsg)
.status(RehearsalPlanStatusEnum.UN_START.getCode())
.deleted(false)
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.rehearsal;
import com.fasterxml.jackson.annotation.JsonFormat;
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/10 11:29
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel("演练计划查询条件param")
public class RehearsalPlanConditionParam implements Serializable {
@Serial
private static final long serialVersionUID = 6574628197950618904L;
@ApiModelProperty(value = "风险程度", example = "1")
private Integer riskLevel;
@ApiModelProperty(value = "状态", example = "1")
private Integer status;
@ApiModelProperty(value = "开始时间", example = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime beginTime;
@ApiModelProperty(value = "结束时间", example = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.rehearsal;
import com.yiring.app.domain.rehearsal.AccidentSpot;
import com.yiring.app.domain.rehearsal.EvacuationZone;
import com.yiring.app.domain.rehearsal.RehearsalPlan;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/5/10 11:29
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel("演练计划修改param")
public class RehearsalPlanModifyParam implements Serializable {
@Serial
private static final long serialVersionUID = 6574628197950618904L;
@ApiModelProperty(value = "id", example = "1", required = true)
@NotNull(message = "id不能为空")
private Long id;
@ApiModelProperty(value = "演练主题", example = "红色演练")
private String topical;
@ApiModelProperty(value = "事故点id", example = "1522844636060585984")
private Long accidentSpotId;
@ApiModelProperty(value = "周边范围(事故点周围多少米)", example = "50")
private Integer scope;
@ApiModelProperty(value = "撤离区id", example = "1523562795864428544")
private Long evacuationZoneId;
@ApiModelProperty(value = "风险程度", example = "1")
private Integer riskLevel;
@ApiModelProperty(value = "事故信息", example = "气体泄露")
private String accidentMsg;
@ApiModelProperty(value = "推送信息", example = "气体泄露,请尽快逃离")
private String pushMsg;
public RehearsalPlan transform() {
AccidentSpot accidentSpot = AccidentSpot.builder().id(accidentSpotId).build();
EvacuationZone evacuationZone = EvacuationZone.builder().id(evacuationZoneId).build();
return RehearsalPlan
.builder()
.id(id)
.topical(topical)
.accidentSpot(accidentSpot)
.scope(scope)
.evacuationZone(evacuationZone)
.riskLevel(riskLevel)
.accidentMsg(accidentMsg)
.pushMsg(pushMsg)
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.rehearsal;
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.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/5/12 11:56
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel("演练计划查看回放param")
public class RehearsalPlanPlaybackParam implements Serializable {
@Serial
private static final long serialVersionUID = 5765142306154131375L;
@ApiModelProperty(value = "演练计划id", example = "1", required = true)
@NotNull(message = "演练计划id不能为空")
private Long id;
@ApiModelProperty(value = "看回放的开始时间(不传则默认演练开始的时间)")
private LocalDateTime beginTime;
}
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.rabbit.config; package com.yiring.app.rabbit.config;
import org.springframework.amqp.core.Binding; import com.yiring.app.rabbit.receiver.PositionMessageHandler;
import org.springframework.amqp.core.BindingBuilder; import javax.annotation.Resource;
import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.*;
import org.springframework.amqp.core.TopicExchange; import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
...@@ -16,8 +18,12 @@ import org.springframework.context.annotation.Configuration; ...@@ -16,8 +18,12 @@ import org.springframework.context.annotation.Configuration;
* 2019/8/21 15:44 * 2019/8/21 15:44
*/ */
@Configuration @Configuration
@ConditionalOnProperty(prefix = "zy-config.rabbitmq", value = "mock", havingValue = "true")
public class MockZyRabbitConfig { public class MockZyRabbitConfig {
@Resource
ZyConfigProperties.ZyConfigRabbitmq rabbitmq;
/** /**
* 消息交换机 * 消息交换机
*/ */
...@@ -33,16 +39,20 @@ public class MockZyRabbitConfig { ...@@ -33,16 +39,20 @@ public class MockZyRabbitConfig {
return new TopicExchange(ZY_TOPIC_EXCHANGE, true, false); return new TopicExchange(ZY_TOPIC_EXCHANGE, true, false);
} }
@Bean(ZyRabbitConfig.MESSAGE_QUEUES_NAME)
public Queue mockMessageQueue() {
return new Queue(ZyRabbitConfig.MESSAGE_QUEUES_NAME, true, false, false);
}
@Bean @Bean
Binding bindingExchangeMock( Binding bindingExchangeMock(
@Qualifier(ZyRabbitConfig.MESSAGE_QUEUES_NAME) Queue queue, @Qualifier(ZyRabbitConfig.QUEUE_BEAN_NAME) Queue queue,
@Qualifier(ZY_TOPIC_EXCHANGE) TopicExchange exchange @Qualifier(ZY_TOPIC_EXCHANGE) TopicExchange exchange
) { ) {
return BindingBuilder.bind(queue).to(exchange).with(ZyRabbitConfig.MESSAGE_QUEUES_NAME); return BindingBuilder.bind(queue).to(exchange).with(rabbitmq.getQueueName());
}
@Bean(ZyRabbitConfig.LISTENER_CONTAINER_NAME)
public SimpleMessageListenerContainer simpleMessageListenerContainer(
PositionMessageHandler handler,
@Qualifier(ZyRabbitConfig.QUEUE_BEAN_NAME) Queue queue,
@Qualifier(RabbitConfig.CONNECTION_FACTORY_NAME) ConnectionFactory connectionFactory
) {
return ZyRabbitConfig.buildPositionMessageListenerContainer(handler, queue, connectionFactory);
} }
} }
...@@ -2,15 +2,11 @@ ...@@ -2,15 +2,11 @@
package com.yiring.app.rabbit.config; package com.yiring.app.rabbit.config;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.amqp.RabbitProperties; import org.springframework.boot.autoconfigure.amqp.RabbitProperties;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
...@@ -43,19 +39,6 @@ public class RabbitConfig { ...@@ -43,19 +39,6 @@ public class RabbitConfig {
@Bean @Bean
@Primary @Primary
public RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(
SimpleRabbitListenerContainerFactoryConfigurer configurer,
@Qualifier(CONNECTION_FACTORY_NAME) ConnectionFactory connectionFactory
) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
// 手动确认消息模式
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
configurer.configure(factory, connectionFactory);
return factory;
}
@Bean
@Primary
public RabbitTemplate rabbitTemplate(@Qualifier(CONNECTION_FACTORY_NAME) ConnectionFactory connectionFactory) { public RabbitTemplate rabbitTemplate(@Qualifier(CONNECTION_FACTORY_NAME) ConnectionFactory connectionFactory) {
return new RabbitTemplate(connectionFactory); return new RabbitTemplate(connectionFactory);
} }
......
...@@ -36,6 +36,7 @@ public class ZyConfigProperties { ...@@ -36,6 +36,7 @@ public class ZyConfigProperties {
@ConfigurationProperties(prefix = "zy-config.rabbitmq") @ConfigurationProperties(prefix = "zy-config.rabbitmq")
public static class ZyConfigRabbitmq { public static class ZyConfigRabbitmq {
boolean mock;
boolean enabled; boolean enabled;
String host; String host;
int port; int port;
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.rabbit.config; package com.yiring.app.rabbit.config;
import com.yiring.app.rabbit.receiver.PositionMessageHandler;
import javax.annotation.Resource; import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AcknowledgeMode; import org.springframework.amqp.core.AcknowledgeMode;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
...@@ -31,19 +29,9 @@ public class ZyRabbitConfig { ...@@ -31,19 +29,9 @@ public class ZyRabbitConfig {
@Resource @Resource
ZyConfigProperties.ZyConfigRabbitmq rabbitmq; ZyConfigProperties.ZyConfigRabbitmq rabbitmq;
@Resource
ConfigurableApplicationContext context;
public static final String CONNECTION_FACTORY_NAME = "zyRabbitConnectionFactory"; public static final String CONNECTION_FACTORY_NAME = "zyRabbitConnectionFactory";
public static final String LISTENER_FACTORY_NAME = "zyRabbitListenerFactory"; public static final String LISTENER_CONTAINER_NAME = "zyPositionMessageListenerContainer";
public static final String TEMPLATE_NAME = "zyRabbitTemplate"; public static final String QUEUE_BEAN_NAME = "messageHandlerQueue";
/**
* 消息队列名称(必须要与配置文件中的 queue-name 完全一致)
* 规则: tenant_msg_${open.client-secret}_${open.client-id}
* 参见文档: 定位平台接口规范V3.0.1 - 通用版.pdf #6
*/
public static final String MESSAGE_QUEUES_NAME = "tenant_msg_12A14FDC_sc21080400";
@Bean(CONNECTION_FACTORY_NAME) @Bean(CONNECTION_FACTORY_NAME)
public ConnectionFactory zyConnectionFactory() { public ConnectionFactory zyConnectionFactory() {
...@@ -56,27 +44,35 @@ public class ZyRabbitConfig { ...@@ -56,27 +44,35 @@ public class ZyRabbitConfig {
); );
} }
@Bean(LISTENER_FACTORY_NAME) @Bean(LISTENER_CONTAINER_NAME)
public RabbitListenerContainerFactory<?> rabbitListenerContainerFactory( @ConditionalOnProperty(prefix = "zy-config.rabbitmq", value = "mock", havingValue = "false")
SimpleRabbitListenerContainerFactoryConfigurer configurer, public SimpleMessageListenerContainer simpleMessageListenerContainer(
PositionMessageHandler handler,
@Qualifier(QUEUE_BEAN_NAME) Queue queue,
@Qualifier(CONNECTION_FACTORY_NAME) ConnectionFactory connectionFactory @Qualifier(CONNECTION_FACTORY_NAME) ConnectionFactory connectionFactory
) { ) {
// 检查队列名称是否与配置文件一致,避免监听错误 return buildPositionMessageListenerContainer(handler, queue, connectionFactory);
if (!MESSAGE_QUEUES_NAME.equals(rabbitmq.getQueueName())) { }
log.error("队列名称不一致,请检查配置文件");
context.close();
return null;
}
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); @Bean(QUEUE_BEAN_NAME)
// 手动确认消息模式 public Queue messageHandlerQueue() {
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL); return new Queue(rabbitmq.getQueueName(), true, false, false);
configurer.configure(factory, connectionFactory);
return factory;
} }
@Bean(TEMPLATE_NAME) public static SimpleMessageListenerContainer buildPositionMessageListenerContainer(
public RabbitTemplate rabbitTemplate(@Qualifier(CONNECTION_FACTORY_NAME) ConnectionFactory connectionFactory) { PositionMessageHandler handler,
return new RabbitTemplate(connectionFactory); Queue queue,
ConnectionFactory connectionFactory
) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setAcknowledgeMode(AcknowledgeMode.MANUAL);
container.setBatchSize(10);
container.setConcurrentConsumers(1);
container.setMaxConcurrentConsumers(1);
container.setExposeListenerChannel(true);
container.setMessageListener(handler);
container.addQueues(queue);
return container;
} }
} }
...@@ -2,31 +2,29 @@ ...@@ -2,31 +2,29 @@
package com.yiring.app.rabbit.receiver; package com.yiring.app.rabbit.receiver;
import com.rabbitmq.client.Channel; import com.rabbitmq.client.Channel;
import com.yiring.app.rabbit.config.ZyRabbitConfig; import com.yiring.app.service.message.PositionMessageService;
import com.yiring.app.service.message.ZyMessageService; import com.yiring.common.annotation.Times;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets;
import javax.annotation.Resource; import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message; import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/** /**
* 真源 RabbitMQ 消息监听(消息消费者) * 真源消息监听处理器
* *
* @author Jim * @author Jim
* @version 0.1 * @version 0.1
* 2022/4/13 17:13 * 2022/5/11 16:35
*/ */
@Slf4j @Slf4j
@Component @Component
@Configuration @Transactional(rollbackFor = Exception.class)
@ConditionalOnProperty(prefix = "zy-config.rabbitmq", value = "enabled", havingValue = "true") public class PositionMessageHandler implements ChannelAwareMessageListener {
public class ZyRabbitReceiver {
// TODO // TODO
// 1. 新增消息订阅定时任务,检查是否正常订阅了真源定位系统的消息 // 1. 新增消息订阅定时任务,检查是否正常订阅了真源定位系统的消息
...@@ -34,26 +32,15 @@ public class ZyRabbitReceiver { ...@@ -34,26 +32,15 @@ public class ZyRabbitReceiver {
// 3. 订阅 position(定位数据)、lowPower(低电量报警)、deviceStatus(设备状态)、keyWarning(按键报警) // 3. 订阅 position(定位数据)、lowPower(低电量报警)、deviceStatus(设备状态)、keyWarning(按键报警)
@Resource @Resource
ZyMessageService zyMessageService; PositionMessageService positionMessageService;
/** @Times("Position System Message Handler")
* 订阅真源定位系统 RabbitMQ 推送过来的消息(主动订阅的一些消息类别) @Override
* 参见: 定位平台接口规范V3.0.1 - 通用版.pdf #6 public void onMessage(Message message, Channel channel) throws IOException {
* @param msg 消息内容
* @param channel 消息通道
* @param message 消息主体
* @throws IOException 消息确认异常
*/
@RabbitHandler
// @RabbitListener(
// queues = ZyRabbitConfig.MESSAGE_QUEUES_NAME,
// containerFactory = ZyRabbitConfig.LISTENER_FACTORY_NAME
// )
@RabbitListener(queues = ZyRabbitConfig.MESSAGE_QUEUES_NAME, containerFactory = "rabbitListenerContainerFactory")
public void listen(String msg, Channel channel, Message message) throws IOException {
// 消费消息 // 消费消息
zyMessageService.consume(msg); positionMessageService.consume(new String(message.getBody(), StandardCharsets.UTF_8));
// 手动确认消息已收到 // 手动确认消息已收到
assert channel != null;
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} }
} }
...@@ -58,5 +58,5 @@ public interface AlarmService { ...@@ -58,5 +58,5 @@ public interface AlarmService {
* @param conditionParam 条件 * @param conditionParam 条件
* @param response response * @param response response
*/ */
void exportAlarmType(AlarmConditionParam conditionParam, HttpServletResponse response, PageParam pageParam); void exportAlarmType(AlarmConditionParam conditionParam, HttpServletResponse response);
} }
...@@ -79,7 +79,7 @@ public class AlarmServiceImpl implements AlarmService { ...@@ -79,7 +79,7 @@ public class AlarmServiceImpl implements AlarmService {
} }
alarmType = optional.get(); alarmType = optional.get();
} }
JpaUtil.copyNotNullProperties(param, alarmType); JpaUtil.copyNotNullProperties(param.transform(), alarmType);
return Result.ok(); return Result.ok();
} }
...@@ -114,11 +114,10 @@ public class AlarmServiceImpl implements AlarmService { ...@@ -114,11 +114,10 @@ public class AlarmServiceImpl implements AlarmService {
} }
@Override @Override
public void exportAlarmType(AlarmConditionParam conditionParam, HttpServletResponse response, PageParam pageParam) { public void exportAlarmType(AlarmConditionParam conditionParam, HttpServletResponse response) {
Pageable pageable = PageParam.toPageable(pageParam);
Specification<AlarmType> specification = getSpecification(conditionParam); Specification<AlarmType> specification = getSpecification(conditionParam);
Page<AlarmType> page = alarmTypeRepository.findAll(specification, pageable); List<AlarmType> page = alarmTypeRepository.findAll(specification);
List<AlarmTypeExcel> list = page.get().map(AlarmTypeExcel::transform).collect(Collectors.toList()); List<AlarmTypeExcel> list = page.stream().map(AlarmTypeExcel::transform).collect(Collectors.toList());
try ( try (
DefaultStreamExcelBuilder<AlarmTypeExcel> streamExcelBuilder = DefaultStreamExcelBuilder DefaultStreamExcelBuilder<AlarmTypeExcel> streamExcelBuilder = DefaultStreamExcelBuilder
.of(AlarmTypeExcel.class) .of(AlarmTypeExcel.class)
......
...@@ -68,7 +68,7 @@ public class DistrictServiceImpl implements DistrictService { ...@@ -68,7 +68,7 @@ public class DistrictServiceImpl implements DistrictService {
district = optional.get(); district = optional.get();
} }
//只修改要修改的值 //只修改要修改的值
JpaUtil.copyNotNullProperties(param, district); JpaUtil.copyNotNullProperties(param.transform(), district);
return Result.ok(); return Result.ok();
} }
......
...@@ -82,7 +82,7 @@ public class LocationFenceServiceImpl implements LocationFenceService { ...@@ -82,7 +82,7 @@ public class LocationFenceServiceImpl implements LocationFenceService {
} }
locationFence = optional.get(); locationFence = optional.get();
} }
JpaUtil.copyNotNullProperties(param, locationFence); JpaUtil.copyNotNullProperties(param.transform(), locationFence);
return Result.ok(); return Result.ok();
} }
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.location.rule; package com.yiring.app.service.location.rule;
import com.yiring.app.param.location.rule.AlarmRuleBatchModifyParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleAddParam; import com.yiring.app.param.location.rule.LocationAlarmRuleAddParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleModifyParam; import com.yiring.app.param.location.rule.LocationAlarmRuleModifyParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleParam; import com.yiring.app.param.location.rule.LocationAlarmRuleParam;
...@@ -10,7 +11,9 @@ import com.yiring.common.core.Result; ...@@ -10,7 +11,9 @@ 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;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import java.util.Set;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
/** /**
* @author tml * @author tml
...@@ -26,6 +29,13 @@ public interface LocationAlarmRuleService { ...@@ -26,6 +29,13 @@ public interface LocationAlarmRuleService {
Result<String> addRule(LocationAlarmRuleAddParam param); Result<String> addRule(LocationAlarmRuleAddParam param);
/** /**
* 批量添加
* @param params 规则信息
* @return 是否成功
*/
Result<String> batchAdd(@Valid Set<LocationAlarmRuleAddParam> params);
/**
* 修改一条规则 * 修改一条规则
* @param param 规则信息 * @param param 规则信息
* @return 是否成功 * @return 是否成功
...@@ -33,6 +43,13 @@ public interface LocationAlarmRuleService { ...@@ -33,6 +43,13 @@ public interface LocationAlarmRuleService {
Result<String> modifyRule(LocationAlarmRuleModifyParam param); Result<String> modifyRule(LocationAlarmRuleModifyParam param);
/** /**
* 批量修改规则
* @param params 规则信息
* @return 是否成功
*/
Result<String> batchModify(AlarmRuleBatchModifyParam params);
/**
* 删除一条规则 * 删除一条规则
* @param idParam 规则id * @param idParam 规则id
* @return 是否成功 * @return 是否成功
...@@ -58,9 +75,8 @@ public interface LocationAlarmRuleService { ...@@ -58,9 +75,8 @@ public interface LocationAlarmRuleService {
* 导出电子围栏规则 * 导出电子围栏规则
* @param param 条件 * @param param 条件
* @param response response * @param response response
* @param pageParam 分页参数
*/ */
void exportAlarmRule(LocationAlarmRuleParam param, HttpServletResponse response, PageParam pageParam); void exportAlarmRule(LocationAlarmRuleParam param, HttpServletResponse response);
/** /**
* 根据电子围栏名称模糊查询围栏id和名称 * 根据电子围栏名称模糊查询围栏id和名称
......
...@@ -9,6 +9,7 @@ import com.yiring.app.domain.location.LocationAlarmRuleRepository; ...@@ -9,6 +9,7 @@ import com.yiring.app.domain.location.LocationAlarmRuleRepository;
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.excel.location.LocationAlarmRuleExcel; import com.yiring.app.excel.location.LocationAlarmRuleExcel;
import com.yiring.app.param.location.rule.AlarmRuleBatchModifyParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleAddParam; import com.yiring.app.param.location.rule.LocationAlarmRuleAddParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleModifyParam; import com.yiring.app.param.location.rule.LocationAlarmRuleModifyParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleParam; import com.yiring.app.param.location.rule.LocationAlarmRuleParam;
...@@ -69,6 +70,16 @@ public class LocationAlarmRuleServiceImpl implements LocationAlarmRuleService { ...@@ -69,6 +70,16 @@ public class LocationAlarmRuleServiceImpl implements LocationAlarmRuleService {
} }
@Override @Override
public Result<String> batchAdd(Set<LocationAlarmRuleAddParam> params) {
List<LocationAlarmRule> list = params
.stream()
.map(LocationAlarmRuleAddParam::transform)
.collect(Collectors.toList());
List<LocationAlarmRule> flush = locationAlarmRuleRepository.saveAllAndFlush(list);
return Result.ok("已成功添加" + flush.size() + "条规则");
}
@Override
public Result<String> modifyRule(LocationAlarmRuleModifyParam param) { public Result<String> modifyRule(LocationAlarmRuleModifyParam param) {
LocationAlarmRule locationAlarmRule = param.transform(); LocationAlarmRule locationAlarmRule = param.transform();
Optional<LocationAlarmRule> optional = locationAlarmRuleRepository.findById(param.getId()); Optional<LocationAlarmRule> optional = locationAlarmRuleRepository.findById(param.getId());
...@@ -80,6 +91,17 @@ public class LocationAlarmRuleServiceImpl implements LocationAlarmRuleService { ...@@ -80,6 +91,17 @@ public class LocationAlarmRuleServiceImpl implements LocationAlarmRuleService {
} }
@Override @Override
public Result<String> batchModify(AlarmRuleBatchModifyParam params) {
for (LocationAlarmRuleModifyParam item : params.getParams()) {
Result<String> result = modifyRule(item);
if (Status.OK.value() != result.getStatus()) {
return result;
}
}
return Result.ok();
}
@Override
public Result<String> removeRule(IdParam idParam) { public Result<String> removeRule(IdParam idParam) {
Optional<LocationAlarmRule> optional = locationAlarmRuleRepository.findById(idParam.getId()); Optional<LocationAlarmRule> optional = locationAlarmRuleRepository.findById(idParam.getId());
if (optional.isEmpty()) { if (optional.isEmpty()) {
...@@ -144,14 +166,26 @@ public class LocationAlarmRuleServiceImpl implements LocationAlarmRuleService { ...@@ -144,14 +166,26 @@ public class LocationAlarmRuleServiceImpl implements LocationAlarmRuleService {
} }
@Override @Override
public void exportAlarmRule(LocationAlarmRuleParam param, HttpServletResponse response, PageParam pageParam) { public void exportAlarmRule(LocationAlarmRuleParam param, HttpServletResponse response) {
Result<PageVo<LocationAlarmRuleVo>> result = findByCondition(param, pageParam); Specification<LocationAlarmRule> specification = getSpecification(param);
if (Status.OK.value() != result.getStatus()) { Set<Integer> informManner = param.getInformManner();
return; List<LocationAlarmRule> list = locationAlarmRuleRepository.findAll(specification);
if (!CollectionUtils.isEmpty(informManner)) {
list =
list
.stream()
.filter(e -> {
for (Integer item : informManner) {
boolean contains = e.getInformManner().contains(item.toString());
if (!contains) {
return false;
}
}
return true;
})
.collect(Collectors.toList());
} }
List<LocationAlarmRuleExcel> excelList = result List<LocationAlarmRuleExcel> excelList = list
.getBody()
.getData()
.stream() .stream()
.map(LocationAlarmRuleExcel::transform) .map(LocationAlarmRuleExcel::transform)
.collect(Collectors.toList()); .collect(Collectors.toList());
......
...@@ -8,7 +8,7 @@ package com.yiring.app.service.message; ...@@ -8,7 +8,7 @@ package com.yiring.app.service.message;
* @version 0.1 * @version 0.1
* 2022/5/9 10:16 * 2022/5/9 10:16
*/ */
public interface ZyMessageService { public interface PositionMessageService {
/** /**
* 消费消息 * 消费消息
* @param message 消息内容 * @param message 消息内容
......
...@@ -4,12 +4,14 @@ package com.yiring.app.service.message.impl; ...@@ -4,12 +4,14 @@ package com.yiring.app.service.message.impl;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.yiring.app.domain.district.District;
import com.yiring.app.domain.district.DistrictRepository;
import com.yiring.app.domain.key.*; import com.yiring.app.domain.key.*;
import com.yiring.app.domain.location.*; import com.yiring.app.domain.location.*;
import com.yiring.app.domain.log.ZyRealtimeLog; import com.yiring.app.domain.log.ZyRealtimeLog;
import com.yiring.app.domain.log.ZyRealtimeLogRepository; import com.yiring.app.domain.log.ZyRealtimeLogRepository;
import com.yiring.app.param.key.KeyAlarmAddParam; import com.yiring.app.param.key.KeyAlarmAddParam;
import com.yiring.app.service.message.ZyMessageService; import com.yiring.app.service.message.PositionMessageService;
import com.yiring.app.util.GeoUtils; import com.yiring.app.util.GeoUtils;
import com.yiring.auth.domain.dept.Department; import com.yiring.auth.domain.dept.Department;
import com.yiring.auth.domain.user.User; import com.yiring.auth.domain.user.User;
...@@ -18,15 +20,15 @@ import com.yiring.common.annotation.Times; ...@@ -18,15 +20,15 @@ import com.yiring.common.annotation.Times;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneId; import java.time.ZoneId;
import java.util.Arrays; import java.util.*;
import java.util.HashSet;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Point;
import org.springframework.data.domain.Example; import org.springframework.data.domain.*;
import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -42,7 +44,7 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -42,7 +44,7 @@ import org.springframework.transaction.annotation.Transactional;
@Slf4j @Slf4j
@Service @Service
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public class ZyMessageServiceImpl implements ZyMessageService { public class PositionMessageServiceImpl implements PositionMessageService {
@Resource @Resource
LocationTagRepository locationTagRepository; LocationTagRepository locationTagRepository;
...@@ -51,6 +53,15 @@ public class ZyMessageServiceImpl implements ZyMessageService { ...@@ -51,6 +53,15 @@ public class ZyMessageServiceImpl implements ZyMessageService {
LocationLogRepository locationLogRepository; LocationLogRepository locationLogRepository;
@Resource @Resource
LocationFenceRepository locationFenceRepository;
@Resource
DistrictRepository districtRepository;
@Resource
LocationTurnoverRepository locationTurnoverRepository;
@Resource
SimpMessagingTemplate simpMessagingTemplate; SimpMessagingTemplate simpMessagingTemplate;
@Resource @Resource
...@@ -68,7 +79,7 @@ public class ZyMessageServiceImpl implements ZyMessageService { ...@@ -68,7 +79,7 @@ public class ZyMessageServiceImpl implements ZyMessageService {
@Resource @Resource
UserRepository userRepository; UserRepository userRepository;
@Times @Times("Message Consume")
@Override @Override
public void consume(String message) { public void consume(String message) {
// 将消息转换成 JSON 格式 // 将消息转换成 JSON 格式
...@@ -135,13 +146,14 @@ public class ZyMessageServiceImpl implements ZyMessageService { ...@@ -135,13 +146,14 @@ public class ZyMessageServiceImpl implements ZyMessageService {
LocationLog locationLog = LocationLog LocationLog locationLog = LocationLog
.builder() .builder()
.id(id) .id(id)
.raw(data)
.locationTime(locationTime) .locationTime(locationTime)
.areaId(data.getLong("areaId")) .areaId(data.getLong("areaId"))
.floor(data.getString("floor")) .floor(data.getString("floor"))
.silent(data.getBoolean("silent")) .silent(data.getBoolean("silent"))
.volt(data.getInteger("volt")) .volt(data.getInteger("volt"))
.voltUnit(data.getString("voltUnit")) .voltUnit(data.getString("voltUnit"))
.raw(data) .out(data.getBoolean("out"))
.build(); .build();
// 获取定位卡当前绑定的用户 // 获取定位卡当前绑定的用户
...@@ -162,30 +174,226 @@ public class ZyMessageServiceImpl implements ZyMessageService { ...@@ -162,30 +174,226 @@ public class ZyMessageServiceImpl implements ZyMessageService {
locationLog.setPoint(point); locationLog.setPoint(point);
// 定位信标 // 定位信标
Set<String> codes = Arrays Set<String> beaconCodes = Arrays
.stream(data.getString("beacons").split(",")) .stream(data.getString("beacons").split(","))
.map(beacon -> beacon.replaceAll("\\(.*\\)", "")) .map(beacon -> beacon.replaceAll("\\(.*\\)", ""))
.collect(Collectors.toSet()); .collect(Collectors.toSet());
locationLog.setBeacons(new JSONArray().fluentAddAll(codes)); locationLog.setBeacons(new JSONArray().fluentAddAll(beaconCodes));
// 计算出入标记(围栏、区域)
List<LocationTurnover> turnovers = new ArrayList<>();
// 查询定位在围栏内的围栏信息
List<LocationFence> fences = locationFenceRepository.findByGeometryContains(point);
Set<Long> fenceIds = fences.stream().map(LocationFence::getId).collect(Collectors.toSet());
locationLog.setFences(new JSONArray().fluentAddAll(fenceIds));
// 计算围栏进出
for (LocationFence fence : fences) {
// 查询当前围栏的防抖时间内的所有定位记录
List<LocationLog> logs = findByTagTimeIdAndThreshold(id, fence.getThreshold());
List<JSONArray> list = logs.stream().map(LocationLog::getFences).toList();
if (list.isEmpty()) {
continue;
}
// TODO // 检查是否进入区域
// 并计算出入标记(围栏、区域) Boolean isEnter = checkEnter(list, fence.getId());
if (isEnter != null) {
// 检查是否为重复进入/退出
Optional<LocationTurnover> enter = findRepeatTurnoverRecord(
fence.getId(),
LocationTurnover.Type.FENCE,
id.getTag(),
isEnter
);
if (enter.isEmpty()) {
// 尝试将上一次记录标记为非最新记录
trySetPrevTurnoverExpired(fence.getId(), LocationTurnover.Type.FENCE, id.getTag());
// 当前标签进入/离开围栏的动作标记为最新记录
LocationTurnover turnover = LocationTurnover
.builder()
.enter(isEnter)
.type(LocationTurnover.Type.FENCE)
.sourceId(fence.getId())
.tag(id.getTag())
.time(id.getTime())
.isLatest(true)
.build();
turnovers.add(turnover);
// 更新围栏内的标签
Set<LocationTag> tags = fence.getTags();
if (Boolean.TRUE.equals(isEnter)) {
tags.add(id.getTag());
} else {
tags.remove(id.getTag());
}
fence.setTags(tags);
// 有人员进出围栏,需要检查是否触发围栏报警规则
// TODO: 通过定时任务调度异步实现,提高定位消息消费能力
// 1. 判断是否触发围栏报警规则,触发则记录报警记录,同时记录报警记录触发所需推送的消息
// 2. 同时进行 WebSocket 消息推送
}
}
}
// 查询定位在区域内的区域信息
List<District> districts = districtRepository.findByGeometryContains(point);
Set<Long> districtIds = districts.stream().map(District::getId).collect(Collectors.toSet());
locationLog.setDistricts(new JSONArray().fluentAddAll(districtIds));
// 计算区域进出
for (District district : districts) {
// 查询当前区域的防抖时间内的所有定位记录
List<LocationLog> logs = findByTagTimeIdAndThreshold(id, district.getDebouncingDuration());
List<JSONArray> list = logs.stream().map(LocationLog::getDistricts).toList();
if (list.isEmpty()) {
continue;
}
// 写入数据 // 检查是否进入区域
Boolean isEnter = checkEnter(list, district.getId());
if (isEnter != null) {
// 检查是否为重复进入/退出
Optional<LocationTurnover> enter = findRepeatTurnoverRecord(
district.getId(),
LocationTurnover.Type.DISTRICT,
id.getTag(),
isEnter
);
if (enter.isEmpty()) {
// 尝试将上一次记录标记为非最新记录
trySetPrevTurnoverExpired(district.getId(), LocationTurnover.Type.DISTRICT, id.getTag());
// 当前标签进入/离开围栏的动作标记为最新记录
LocationTurnover turnover = LocationTurnover
.builder()
.enter(isEnter)
.type(LocationTurnover.Type.DISTRICT)
.sourceId(district.getId())
.tag(id.getTag())
.time(id.getTime())
.isLatest(true)
.build();
turnovers.add(turnover);
}
}
}
// 写入定位数据
locationLogRepository.saveAndFlush(locationLog); locationLogRepository.saveAndFlush(locationLog);
// 更新定位标签卡状态信息 // 更新定位标签卡状态信息
tag.setOut(locationLog.getOut());
tag.setPoint(locationLog.getPoint()); tag.setPoint(locationLog.getPoint());
tag.setVolt(locationLog.getVolt()); tag.setVolt(locationLog.getVolt());
tag.setVoltUnit(locationLog.getVoltUnit()); tag.setVoltUnit(locationLog.getVoltUnit());
tag.setSilent(locationLog.getSilent()); tag.setSilent(locationLog.getSilent());
locationTagRepository.save(tag); locationTagRepository.save(tag);
// 更新围栏记录的标签数据
locationFenceRepository.saveAll(fences);
// 写入围栏/区域进出记录
locationTurnoverRepository.saveAll(turnovers);
// WebSocket 推送定位消息 // WebSocket 推送定位消息
// 消息内容需要确定 TODO // 消息内容需要确定 TODO
simpMessagingTemplate.convertAndSend("/topic/position", "{}"); JSONObject message = new JSONObject();
// TODO message.put("type", "location");
// 判断围栏告警是否触发,触发写入告警记录,并推送消息 message.put("time", id.getTime());
message.put("tagId", id.getTag().getId());
message.put("tagCode", id.getTag().getCode());
message.put("entityId", locationLog.getPoint());
message.put("point", locationLog.getPoint());
simpMessagingTemplate.convertAndSend("/topic/position", message.toJSONString());
}
/**
* 根据定位日志 ID 和防抖时间查询定位日志
* @param id 定位日志 ID
* @param threshold 防抖时间
* @return 定位日志集合
*/
public List<LocationLog> findByTagTimeIdAndThreshold(TagTimeId id, int threshold) {
return locationLogRepository.findAll((root, query, cb) -> {
Predicate predicate = cb.conjunction();
List<Expression<Boolean>> expressions = predicate.getExpressions();
expressions.add(cb.equal(root.get("id").get("tag"), id.getTag()));
expressions.add(cb.greaterThanOrEqualTo(root.get("id").get("time"), id.getTime().minusSeconds(threshold)));
expressions.add(cb.lessThanOrEqualTo(root.get("id").get("time"), id.getTime()));
return predicate;
});
}
/**
* 根据防抖期间进入的区域/围栏以及新产生的围栏/区域记录,判断是否进入
* @param array 区域/围栏集合
* @param id 区域/围栏 ID
* @return true 进入,false 退出,null 未发生变化
*/
public Boolean checkEnter(List<JSONArray> array, Long id) {
long count = array.stream().filter(ids -> ids != null && ids.contains(id)).count();
Boolean isEnter = null;
if (count == array.size()) {
isEnter = true;
} else if (count == 0) {
isEnter = false;
}
return isEnter;
}
/**
* 查找
* @param sourceId 区域/围栏 ID
* @param type 类型(区域/围栏)
* @param tag 定位标签
* @param enter true 进入,false 退出
* @return true 重复进入,false 非重复进入
*/
public Optional<LocationTurnover> findRepeatTurnoverRecord(
Long sourceId,
LocationTurnover.Type type,
LocationTag tag,
Boolean enter
) {
Pageable pageable = PageRequest.of(0, 1, Sort.by(Sort.Order.desc(LocationTurnover.Fields.time)));
Page<LocationTurnover> page = locationTurnoverRepository.findAll(
(root, query, cb) -> {
Predicate predicate = cb.conjunction();
List<Expression<Boolean>> expressions = predicate.getExpressions();
expressions.add(cb.equal(root.get(LocationTurnover.Fields.sourceId), sourceId));
expressions.add(cb.equal(root.get(LocationTurnover.Fields.type), type));
expressions.add(cb.equal(root.get(LocationTurnover.Fields.tag), tag));
return predicate;
},
pageable
);
if (page.getTotalElements() > 0) {
// 检查是否重复进入
Stream<LocationTurnover> stream = page.get();
if (enter == null || stream.anyMatch(turnover -> turnover.getEnter() == enter)) {
return stream.findFirst();
}
}
return Optional.empty();
}
/**
* 尝试设置上一个进出记录为过期标识
* @param sourceId 区域/围栏 ID
* @param type 类型(区域/围栏)
* @param tag 定位标签
*/
public void trySetPrevTurnoverExpired(Long sourceId, LocationTurnover.Type type, LocationTag tag) {
Optional<LocationTurnover> record = findRepeatTurnoverRecord(sourceId, type, tag, null);
if (record.isPresent()) {
LocationTurnover turnoverRecord = record.get();
turnoverRecord.setIsLatest(false);
locationTurnoverRepository.save(turnoverRecord);
}
} }
/** /**
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.rehearsal;
import com.yiring.app.param.rehearsal.RehearsalPlanAddParam;
import com.yiring.app.param.rehearsal.RehearsalPlanConditionParam;
import com.yiring.app.param.rehearsal.RehearsalPlanModifyParam;
import com.yiring.app.param.rehearsal.RehearsalPlanPlaybackParam;
import com.yiring.app.vo.rehearsal.RehearsalPlanRealTimeVo;
import com.yiring.app.vo.rehearsal.RehearsalPlanVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import javax.servlet.http.HttpServletResponse;
/**
* @author tml
* @version 1.0
* @date 2022/5/10 14:18
*/
public interface RehearsalPlanService {
/**
* 添加一条演练计划
* @param param 演练计划信息
* @return 是否成功
*/
Result<String> addOne(RehearsalPlanAddParam param);
/**
* 修改一条演练计划
* @param param 演练计划信息
* @return 是否成功
*/
Result<String> modifyOne(RehearsalPlanModifyParam param);
/**
* 删除一条演练计划
* @param idParam 演练计划id
* @return 是否成功
*/
Result<String> removeOne(IdParam idParam);
/**
* 查询一条演练计划信息
* @param idParam 演练计划id
* @return 演练计划信息
*/
Result<RehearsalPlanVo> findOne(IdParam idParam);
/**
* 查询演练计划列表
* @param conditionParam 条件参数
* @param pageParam 分页参数
* @return 演练计划列表
*/
Result<PageVo<RehearsalPlanVo>> findList(RehearsalPlanConditionParam conditionParam, PageParam pageParam);
/**
* 导出演练计划
* @param conditionParam 条件参数
* @param response response
*/
void export(RehearsalPlanConditionParam conditionParam, HttpServletResponse response);
/**
* 启动一个演练计划
* @param idParam 演练计划id
* @return 是否成功
*/
Result<String> start(IdParam idParam);
/**
* 停止一个演练计划
* @param idParam 演练计划id
* @return 是否成功
*/
Result<String> stop(IdParam idParam);
/**
* 查看演练(实时)
* @param idParam 演练计划id
* @return 实时信息
*/
Result<RehearsalPlanRealTimeVo> findRealTime(IdParam idParam);
/**
* 查看回放
* @param param 演练计划id和时间
* @return 回放信息
*/
Result<PageVo<RehearsalPlanRealTimeVo>> findPlayback(RehearsalPlanPlaybackParam param);
}
...@@ -75,7 +75,7 @@ public class AccidentSpotServiceImpl implements AccidentSpotService { ...@@ -75,7 +75,7 @@ public class AccidentSpotServiceImpl implements AccidentSpotService {
} }
accidentSpot = optional.get(); accidentSpot = optional.get();
} }
JpaUtil.copyNotNullProperties(param, accidentSpot); JpaUtil.copyNotNullProperties(param.transform(), accidentSpot);
return Result.ok(); return Result.ok();
} }
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.rehearsal.impl;
import com.alibaba.fastjson.JSONArray;
import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder;
import com.yiring.app.constant.rehearsal.RehearsalPlanStatusEnum;
import com.yiring.app.domain.location.LocationLog;
import com.yiring.app.domain.location.LocationLogRepository;
import com.yiring.app.domain.location.LocationTag;
import com.yiring.app.domain.location.LocationTagRepository;
import com.yiring.app.domain.rehearsal.*;
import com.yiring.app.excel.rehearsal.RehearsalPlanExcel;
import com.yiring.app.param.rehearsal.RehearsalPlanAddParam;
import com.yiring.app.param.rehearsal.RehearsalPlanConditionParam;
import com.yiring.app.param.rehearsal.RehearsalPlanModifyParam;
import com.yiring.app.param.rehearsal.RehearsalPlanPlaybackParam;
import com.yiring.app.service.rehearsal.RehearsalPlanService;
import com.yiring.app.util.GeoUtils;
import com.yiring.app.util.JpaUtil;
import com.yiring.app.vo.rehearsal.RehearsalPlanRealTimeVo;
import com.yiring.app.vo.rehearsal.RehearsalPlanVo;
import com.yiring.app.vo.rehearsal.UserLocationVo;
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;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Predicate;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.locationtech.jts.geom.Geometry;
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/10 14:33
*/
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
public class RehearsalPlanServiceImpl implements RehearsalPlanService {
@Resource
private RehearsalPlanRepository rehearsalPlanRepository;
@Resource
private AccidentSpotRepository accidentSpotRepository;
@Resource
private EvacuationZoneRepository evacuationZoneRepository;
@Resource
private LocationTagRepository locationTagRepository;
@Resource
private LocationLogRepository locationLogRepository;
@Resource
private RehearsalPlanLogRepository rehearsalPlanLogRepository;
@Override
public Result<String> addOne(RehearsalPlanAddParam param) {
Result<String> result = checkEnable(param.getAccidentSpotId(), param.getEvacuationZoneId());
if (Status.OK.value() != result.getStatus()) {
return result;
}
RehearsalPlan rehearsalPlan = param.transform();
rehearsalPlanRepository.saveAndFlush(rehearsalPlan);
return Result.ok();
}
@Override
public Result<String> modifyOne(RehearsalPlanModifyParam param) {
Result<String> result = checkEnable(param.getAccidentSpotId(), param.getEvacuationZoneId());
if (Status.OK.value() != result.getStatus()) {
return result;
}
Optional<RehearsalPlan> optional = rehearsalPlanRepository.findById(param.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要修改的演练计划不存在");
}
//只有未开始的演练计划才能修改
if (!RehearsalPlanStatusEnum.UN_START.getCode().equals(optional.get().getStatus())) {
return Result.no(Status.EXPECTATION_FAILED, "只有未开始的演练计划才能修改");
}
JpaUtil.copyNotNullProperties(param.transform(), optional.get());
return Result.ok();
}
private Result<String> checkEnable(Long accidentSpotId, Long evacuationZoneId) {
Optional<AccidentSpot> spotOptional = accidentSpotRepository.findById(accidentSpotId);
if (spotOptional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "事故点不存在");
}
if (!spotOptional.get().getEnable()) {
return Result.no(Status.EXPECTATION_FAILED, "事故点未启用");
}
Optional<EvacuationZone> zoneOptional = evacuationZoneRepository.findById(evacuationZoneId);
if (zoneOptional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "撤离区不存在");
}
if (!zoneOptional.get().getEnable()) {
return Result.no(Status.EXPECTATION_FAILED, "撤离区未启用");
}
return Result.ok();
}
@Override
public Result<String> removeOne(IdParam idParam) {
Optional<RehearsalPlan> optional = rehearsalPlanRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要删除的演练计划不存在");
}
//只有未开始的演练计划才能删除
if (!RehearsalPlanStatusEnum.UN_START.getCode().equals(optional.get().getStatus())) {
return Result.no(Status.EXPECTATION_FAILED, "只有未开始的演练计划才能删除");
}
optional.get().setDeleted(true);
return Result.ok();
}
@Override
public Result<RehearsalPlanVo> findOne(IdParam idParam) {
Optional<RehearsalPlan> optional = rehearsalPlanRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要删除的演练计划不存在");
}
RehearsalPlanVo planVo = RehearsalPlanVo.transform(optional.get());
return Result.ok(planVo);
}
@Override
public Result<PageVo<RehearsalPlanVo>> findList(RehearsalPlanConditionParam conditionParam, PageParam pageParam) {
Pageable pageable = PageParam.toPageable(pageParam);
Specification<RehearsalPlan> specification = getSpecification(conditionParam);
Page<RehearsalPlan> page = rehearsalPlanRepository.findAll(specification, pageable);
List<RehearsalPlanVo> voList = page.get().map(RehearsalPlanVo::transform).collect(Collectors.toList());
PageVo<RehearsalPlanVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo);
}
@Override
public void export(RehearsalPlanConditionParam conditionParam, HttpServletResponse response) {
Specification<RehearsalPlan> specification = getSpecification(conditionParam);
List<RehearsalPlan> page = rehearsalPlanRepository.findAll(specification);
List<RehearsalPlanExcel> list = page.stream().map(RehearsalPlanExcel::transform).collect(Collectors.toList());
try (
DefaultStreamExcelBuilder<RehearsalPlanExcel> streamExcelBuilder = DefaultStreamExcelBuilder
.of(RehearsalPlanExcel.class)
.threadPool(Executors.newFixedThreadPool(2))
.rowHeight(14)
.titleRowHeight(14)
.style(
"cell->vertical-align:center;text-align:center",
"title->vertical-align:center;text-align:center;font-weight:bold;font-family:等线"
)
.start()
) {
streamExcelBuilder.append(list);
String fileName = URLEncoder.encode("演练计划列表.xlsx", StandardCharsets.UTF_8);
response.setContentType("application/octet-stream");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
OutputStream out = response.getOutputStream();
Workbook workbook = streamExcelBuilder.fixedTitles().build();
workbook.write(out);
workbook.close();
out.flush();
out.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new RuntimeException("报警类型列表导出失败: " + e.getMessage());
}
}
private Specification<RehearsalPlan> getSpecification(RehearsalPlanConditionParam conditionParam) {
return (root, query, criteriaBuilder) -> {
ArrayList<Predicate> list = new ArrayList<>();
if (conditionParam.getStatus() != null) {
list.add(criteriaBuilder.equal(root.get(RehearsalPlan.Fields.status), conditionParam.getStatus()));
}
if (conditionParam.getRiskLevel() != null) {
list.add(
criteriaBuilder.equal(root.get(RehearsalPlan.Fields.riskLevel), conditionParam.getRiskLevel())
);
}
if (conditionParam.getBeginTime() != null) {
list.add(
criteriaBuilder.greaterThanOrEqualTo(
root.get(RehearsalPlan.Fields.rehearsalTime),
conditionParam.getBeginTime()
)
);
}
if (conditionParam.getEndTime() != null) {
list.add(
criteriaBuilder.lessThanOrEqualTo(
root.get(RehearsalPlan.Fields.rehearsalTime),
conditionParam.getEndTime()
)
);
}
Predicate[] array = list.toArray(new Predicate[0]);
return criteriaBuilder.and(array);
};
}
@Override
public Result<String> start(IdParam idParam) {
Optional<RehearsalPlan> optional = rehearsalPlanRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要启动的演练计划不存在");
}
RehearsalPlan rehearsalPlan = optional.get();
if (!RehearsalPlanStatusEnum.UN_START.getCode().equals(rehearsalPlan.getStatus())) {
return Result.no(Status.EXPECTATION_FAILED, "演练计划已经启动过了");
}
rehearsalPlan.setStatus(RehearsalPlanStatusEnum.RUNNING.getCode());
//事故点信息
AccidentSpot accidentSpot = rehearsalPlan.getAccidentSpot();
Integer scope = rehearsalPlan.getScope();
//计算影响的范围
Geometry geometry = GeoUtils.expandGeometry(accidentSpot.getGeometry(), scope);
//获取在事故点及周边的员工
List<LocationTag> inArea = locationTagRepository.findInArea(geometry);
//演练计划实施数据落库
List<Long> idList = inArea.stream().map(e -> e.getUser().getId()).collect(Collectors.toList());
String ids = JSONArray.toJSONString(idList);
RehearsalPlanLog rehearsalPlanLog = RehearsalPlanLog
.builder()
.rehearsalPlan(rehearsalPlan)
.beginTime(LocalDateTime.now())
.accidentPeopleNum(inArea.size())
.userIds(ids)
.geometry(geometry)
.build();
rehearsalPlanLogRepository.saveAndFlush(rehearsalPlanLog);
//todo:给这些标签卡绑定的用户发送 App 消息推送 - 同时是否会生成广播消息未知?
return Result.ok();
}
@Override
public Result<String> stop(IdParam idParam) {
Optional<RehearsalPlan> optional = rehearsalPlanRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要启动的演练计划不存在");
}
RehearsalPlan rehearsalPlan = optional.get();
if (!RehearsalPlanStatusEnum.RUNNING.getCode().equals(rehearsalPlan.getStatus())) {
return Result.no(Status.EXPECTATION_FAILED, "演练计划没有在进行中");
}
rehearsalPlan.setStatus(RehearsalPlanStatusEnum.END.getCode());
RehearsalPlanLog rehearsalPlanLog = rehearsalPlanLogRepository.findByRehearsalPlan(rehearsalPlan);
//查询出结束时在撤离区的员工,并落库
EvacuationZone evacuationZone = rehearsalPlan.getEvacuationZone();
int inAreaNum = locationTagRepository.findInAreaNum(evacuationZone.getGeometry());
rehearsalPlanLog.setEndTime(LocalDateTime.now());
rehearsalPlanLog.setEvacuationPeopleNum(inAreaNum);
return Result.ok();
}
@Override
public Result<RehearsalPlanRealTimeVo> findRealTime(IdParam idParam) {
RehearsalPlan rehearsalPlan = RehearsalPlan.builder().id(idParam.getId()).build();
RehearsalPlanLog rehearsalPlanLog = rehearsalPlanLogRepository.findByRehearsalPlan(rehearsalPlan);
if (rehearsalPlanLog == null) {
return Result.no(Status.EXPECTATION_FAILED, "演练计划不存在或未启动");
}
if (rehearsalPlanLog.getEndTime() != null) {
return Result.no(Status.EXPECTATION_FAILED, "演练计划已停止");
}
String idString = rehearsalPlanLog.getUserIds();
List<Long> idList = JSONArray.parseArray(idString, Long.class);
//查看员工位置
List<LocationTag> locationTagList = locationTagRepository.findByUserIds(idList);
List<UserLocationVo> userLocationVos = locationTagList
.stream()
.map(e -> new UserLocationVo(e.getUser().getId(), e.getUser().getRealName(), e.getPoint()))
.collect(Collectors.toList());
//查看撤离区人员数量
Geometry geometry = rehearsalPlanLog.getRehearsalPlan().getEvacuationZone().getGeometry();
int inAreaNum = locationTagRepository.findInAreaNum(geometry);
RehearsalPlanRealTimeVo vo = RehearsalPlanRealTimeVo
.builder()
.beginPeopleNum(rehearsalPlanLog.getAccidentPeopleNum())
.evacuationPeopleNum(inAreaNum)
.userLocation(userLocationVos)
.time(LocalDateTime.now())
.build();
return Result.ok(vo);
}
@Override
public Result<PageVo<RehearsalPlanRealTimeVo>> findPlayback(RehearsalPlanPlaybackParam param) {
RehearsalPlan rehearsalPlan = RehearsalPlan.builder().id(param.getId()).build();
RehearsalPlanLog rehearsalPlanLog = rehearsalPlanLogRepository.findByRehearsalPlan(rehearsalPlan);
//校验参数
Result<PageVo<RehearsalPlanRealTimeVo>> result = checkPlaybackParam(param, rehearsalPlanLog);
if (Status.OK.value() != result.getStatus()) {
return result;
}
//撤离区空间信息
Geometry evacuationGeometry = rehearsalPlanLog.getRehearsalPlan().getEvacuationZone().getGeometry();
String idString = rehearsalPlanLog.getUserIds();
List<Long> idList = JSONArray.parseArray(idString, Long.class);
//初始化查询的结束时间
LocalDateTime endTime;
if (param.getBeginTime().plusMinutes(1).isAfter(rehearsalPlanLog.getEndTime())) {
endTime = rehearsalPlanLog.getEndTime();
} else {
endTime = param.getBeginTime().plusMinutes(1);
}
//查询开始时间到一分钟后这段时间的员工定位信息
Specification<LocationLog> specification = (root, query, criteriaBuilder) -> {
ArrayList<Predicate> list = new ArrayList<>();
CriteriaBuilder.In<Object> in = criteriaBuilder.in(root.get(LocationLog.Fields.user));
for (Long id : idList) {
in.value(id);
}
list.add(in);
list.add(
criteriaBuilder.greaterThanOrEqualTo(root.get(LocationLog.Fields.locationTime), param.getBeginTime())
);
list.add(criteriaBuilder.lessThanOrEqualTo(root.get(LocationLog.Fields.locationTime), endTime));
Predicate[] array = list.toArray(new Predicate[0]);
return criteriaBuilder.and(array);
};
List<LocationLog> locationLogList = locationLogRepository.findAll(specification);
//处理每秒中员工的定位信息,并包装
ArrayList<RehearsalPlanRealTimeVo> voList = new ArrayList<>();
HashSet<Long> set = new HashSet<>();
//每次筛选的开始时间和结束时间(一秒间隔)
LocalDateTime tabTime = param.getBeginTime();
LocalDateTime tabTimeOnes = tabTime.plusSeconds(1);
while (tabTime.isBefore(endTime)) {
ArrayList<UserLocationVo> userLocationVos = new ArrayList<>();
RehearsalPlanRealTimeVo realTimeVo = RehearsalPlanRealTimeVo
.builder()
.beginPeopleNum(rehearsalPlanLog.getAccidentPeopleNum())
.evacuationPeopleNum(0)
.userLocation(userLocationVos)
.time(tabTime)
.build();
//循环员工的信息,筛选在这一秒的定位信息
for (LocationLog locationLog : locationLogList) {
LocalDateTime locationTime = locationLog.getLocationTime();
if (tabTime.isBefore(locationTime) && tabTimeOnes.isAfter(locationTime)) {
User user = locationLog.getUser();
//同一秒只记录用户的一次定位信息
if (!set.contains(user.getId())) {
set.add(user.getId());
UserLocationVo userLocationVo = UserLocationVo
.builder()
.userId(user.getId())
.realmName(user.getRealName())
.point(locationLog.getPoint())
.build();
userLocationVos.add(userLocationVo);
//如果是这一秒内的定位信息,记录已在撤离区的人数
boolean contains = evacuationGeometry.contains(locationLog.getPoint());
if (contains) {
realTimeVo.setEvacuationPeopleNum(realTimeVo.getEvacuationPeopleNum() + 1);
}
}
}
}
//将这一秒的数据添加到结果集
voList.add(realTimeVo);
//用户去重的set清空
set.clear();
//设置下一秒
tabTime = tabTime.plusSeconds(1);
tabTimeOnes = tabTime.plusSeconds(1);
}
PageVo<RehearsalPlanRealTimeVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo);
}
private Result<PageVo<RehearsalPlanRealTimeVo>> checkPlaybackParam(
RehearsalPlanPlaybackParam param,
RehearsalPlanLog rehearsalPlanLog
) {
if (rehearsalPlanLog == null) {
return Result.no(Status.EXPECTATION_FAILED, "演练计划不存在或未启动");
}
if (rehearsalPlanLog.getEndTime() == null) {
return Result.no(Status.EXPECTATION_FAILED, "演练计划停止后才能生成演练回放");
}
if (param.getBeginTime() == null) {
param.setBeginTime(rehearsalPlanLog.getBeginTime());
}
if (param.getBeginTime().isBefore(rehearsalPlanLog.getBeginTime())) {
return Result.no(Status.EXPECTATION_FAILED, "演练回放只能回放演练计划开始之后的数据");
}
return Result.ok();
}
}
...@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject; ...@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
import com.yiring.app.util.zy.LonLatUtil; import com.yiring.app.util.zy.LonLatUtil;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Point;
...@@ -22,6 +23,8 @@ public class GeoUtils { ...@@ -22,6 +23,8 @@ public class GeoUtils {
public final GeometryFactory factory = new GeometryFactory(); public final GeometryFactory factory = new GeometryFactory();
public final int DEFAULT_SRID = 4326;
/** /**
* 创建点 * 创建点
* *
...@@ -30,7 +33,7 @@ public class GeoUtils { ...@@ -30,7 +33,7 @@ public class GeoUtils {
* @return 点 * @return 点
*/ */
public Point createPoint(double lon, double lat) { public Point createPoint(double lon, double lat) {
return factory.createPoint(new Coordinate(lon, lat)); return createPoint(lon, lat, 0);
} }
/** /**
...@@ -41,7 +44,9 @@ public class GeoUtils { ...@@ -41,7 +44,9 @@ public class GeoUtils {
* @return 点 * @return 点
*/ */
public Point createPoint(double lon, double lat, double alt) { public Point createPoint(double lon, double lat, double alt) {
return factory.createPoint(new Coordinate(lon, lat, alt)); Point point = factory.createPoint(new Coordinate(lon, lat, alt));
point.setSRID(DEFAULT_SRID);
return point;
} }
/** /**
...@@ -70,13 +75,12 @@ public class GeoUtils { ...@@ -70,13 +75,12 @@ public class GeoUtils {
y y
); );
// 构建经纬度坐标信息 // 构建一个坐标点
Coordinate coordinate = new Coordinate( return createPoint(
result.getDoubleValue("lon"), result.getDoubleValue("lon"),
result.getDoubleValue("lat"), result.getDoubleValue("lat"),
root.getDoubleValue("altitude") + z result.getDoubleValue("altitude") + z
); );
return factory.createPoint(coordinate);
} }
/** /**
...@@ -110,6 +114,17 @@ public class GeoUtils { ...@@ -110,6 +114,17 @@ public class GeoUtils {
public Point randomPoint(double minX, double minY, double maxX, double maxY, double z) { public Point randomPoint(double minX, double minY, double maxX, double maxY, double z) {
double x = minX + (maxX - minX) * Math.random(); double x = minX + (maxX - minX) * Math.random();
double y = minY + (maxY - minY) * Math.random(); double y = minY + (maxY - minY) * Math.random();
return factory.createPoint(new Coordinate(x, y, z)); return createPoint(x, y, z);
}
/**
* 将一个空间信息向外扩张
* @param geometry 空间信息
* @param length 扩张长度(米)
* @return 扩张后的空间信息
*/
public static Geometry expandGeometry(Geometry geometry, Integer length) {
double degree = length / (2 * Math.PI * 6371004) * 360;
return geometry.buffer(degree);
} }
} }
...@@ -4,6 +4,7 @@ package com.yiring.app.util.zy; ...@@ -4,6 +4,7 @@ package com.yiring.app.util.zy;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
/** /**
* 从真源拿到的引擎计算经纬度的工具类
* @author Jim * @author Jim
* @version 0.1 * @version 0.1
* 2022/5/9 16:41 * 2022/5/9 16:41
...@@ -16,8 +17,8 @@ public class LonLatUtil { ...@@ -16,8 +17,8 @@ public class LonLatUtil {
public static JSONObject getRoot() { public static JSONObject getRoot() {
JSONObject root = new JSONObject(); JSONObject root = new JSONObject();
root.put("lon", 0D); root.put("lon", 112.85893346021206);
root.put("lat", 0D); root.put("lat", 30.473384230484854);
root.put("x", 0D); root.put("x", 0D);
root.put("y", 0D); root.put("y", 0D);
root.put("altitude", 0D); root.put("altitude", 0D);
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo; package com.yiring.app.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
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;
...@@ -27,6 +29,7 @@ public class CodeNameVo implements Serializable { ...@@ -27,6 +29,7 @@ public class CodeNameVo implements Serializable {
private static final long serialVersionUID = -7565315836652536620L; private static final long serialVersionUID = -7565315836652536620L;
@ApiModelProperty(value = "code", example = "1", required = true) @ApiModelProperty(value = "code", example = "1", required = true)
@JsonSerialize(using = ToStringSerializer.class)
private Integer code; private Integer code;
@ApiModelProperty(value = "name", example = "名称", required = true) @ApiModelProperty(value = "name", example = "名称", required = true)
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo; package com.yiring.app.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
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;
...@@ -25,6 +27,7 @@ public class IdNameVo implements Serializable { ...@@ -25,6 +27,7 @@ public class IdNameVo implements Serializable {
@Serial @Serial
private static final long serialVersionUID = -8990274383112436122L; private static final long serialVersionUID = -8990274383112436122L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "id", example = "1", required = true) @ApiModelProperty(value = "id", example = "1", required = true)
private Long id; private Long id;
......
...@@ -20,7 +20,7 @@ import lombok.NoArgsConstructor; ...@@ -20,7 +20,7 @@ import lombok.NoArgsConstructor;
* @version 1.0 * @version 1.0
* @date 2022/4/27 11:55 * @date 2022/4/27 11:55
*/ */
@ApiModel("AlarmTypeVo(报警信息)") @ApiModel("报警信息")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
......
...@@ -19,7 +19,7 @@ import lombok.NoArgsConstructor; ...@@ -19,7 +19,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("DistrictVo")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
......
...@@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; ...@@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.constant.alarm.InformMannerEnum; import com.yiring.app.constant.alarm.InformMannerEnum;
import com.yiring.app.domain.location.LocationAlarmRule; import com.yiring.app.domain.location.LocationAlarmRule;
import com.yiring.app.vo.CodeNameVo; import com.yiring.app.vo.CodeNameVo;
import com.yiring.app.vo.IdNameVo;
import com.yiring.app.vo.user.UserVo; import com.yiring.app.vo.user.UserVo;
import com.yiring.auth.domain.user.User; import com.yiring.auth.domain.user.User;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
...@@ -61,6 +62,9 @@ public class LocationAlarmRuleVo implements Serializable { ...@@ -61,6 +62,9 @@ public class LocationAlarmRuleVo implements Serializable {
@ApiModelProperty(value = "通知方式集合", required = true) @ApiModelProperty(value = "通知方式集合", required = true)
private List<CodeNameVo> informManner; private List<CodeNameVo> informManner;
@ApiModelProperty(value = "报警类型id", required = true)
private List<IdNameVo> alarmTypeIds;
public static LocationAlarmRuleVo transform(LocationAlarmRule locationAlarmRule) { public static LocationAlarmRuleVo transform(LocationAlarmRule locationAlarmRule) {
Set<User> users = locationAlarmRule.getUsers(); Set<User> users = locationAlarmRule.getUsers();
List<UserVo> userVos = users.stream().map(UserVo::transformDept).collect(Collectors.toList()); List<UserVo> userVos = users.stream().map(UserVo::transformDept).collect(Collectors.toList());
...@@ -70,6 +74,11 @@ public class LocationAlarmRuleVo implements Serializable { ...@@ -70,6 +74,11 @@ public class LocationAlarmRuleVo implements Serializable {
for (Integer item : list) { for (Integer item : list) {
codeNameVos.add(new CodeNameVo(item, InformMannerEnum.getByCode(item))); codeNameVos.add(new CodeNameVo(item, InformMannerEnum.getByCode(item)));
} }
List<IdNameVo> alarmTypeList = locationAlarmRule
.getAlarmTypes()
.stream()
.map(e -> new IdNameVo(e.getId(), e.getName()))
.collect(Collectors.toList());
return LocationAlarmRuleVo return LocationAlarmRuleVo
.builder() .builder()
.id(locationAlarmRule.getId()) .id(locationAlarmRule.getId())
...@@ -79,6 +88,7 @@ public class LocationAlarmRuleVo implements Serializable { ...@@ -79,6 +88,7 @@ public class LocationAlarmRuleVo implements Serializable {
.fenceName(locationAlarmRule.getLocationFence().getName()) .fenceName(locationAlarmRule.getLocationFence().getName())
.users(userVos) .users(userVos)
.informManner(codeNameVos) .informManner(codeNameVos)
.alarmTypeIds(alarmTypeList)
.build(); .build();
} }
} }
...@@ -19,11 +19,12 @@ import lombok.Data; ...@@ -19,11 +19,12 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
/** /**
* 修改配置报警类别的报警规则,根据不同类型传入不同参数
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/28 16:16 * @date 2022/4/28 16:16
*/ */
@ApiModel("修改配置报警类别的报警规则,根据不同类型传入不同参数") @ApiModel("LocationFenceRuleVo")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
......
...@@ -14,11 +14,12 @@ import lombok.Data; ...@@ -14,11 +14,12 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
/** /**
* 报警规则,根据不同类型传入不同参数
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/29 14:12 * @date 2022/4/29 14:12
*/ */
@ApiModel("报警规则,根据不同类型传入不同参数") @ApiModel("RuleVo")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.rehearsal; package com.yiring.app.vo.rehearsal;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.domain.rehearsal.AccidentSpot; import com.yiring.app.domain.rehearsal.AccidentSpot;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
...@@ -27,6 +29,7 @@ public class AccidentSpotVo implements Serializable { ...@@ -27,6 +29,7 @@ public class AccidentSpotVo implements Serializable {
@Serial @Serial
private static final long serialVersionUID = -7696351020089245510L; private static final long serialVersionUID = -7696351020089245510L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "事故点id", example = "1") @ApiModelProperty(value = "事故点id", example = "1")
private Long id; private Long id;
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.rehearsal; package com.yiring.app.vo.rehearsal;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.domain.rehearsal.EvacuationZone; import com.yiring.app.domain.rehearsal.EvacuationZone;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
...@@ -27,6 +29,7 @@ public class EvacuationZoneVo implements Serializable { ...@@ -27,6 +29,7 @@ public class EvacuationZoneVo implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 919152196104921261L; private static final long serialVersionUID = 919152196104921261L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "撤离区id", example = "1") @ApiModelProperty(value = "撤离区id", example = "1")
private Long id; private Long id;
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.rehearsal;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/5/12 11:40
*/
@ApiModel("演练计划实时数据VO")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RehearsalPlanRealTimeVo implements Serializable {
@Serial
private static final long serialVersionUID = 2540857588207414303L;
@ApiModelProperty(value = "该数据的时间")
private LocalDateTime time;
@ApiModelProperty(value = "演练开始时在危险区域的人数")
private Integer beginPeopleNum;
@ApiModelProperty(value = "已在撤离区的人数", example = "20")
private Integer evacuationPeopleNum;
private List<UserLocationVo> userLocation;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.rehearsal;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.constant.rehearsal.RehearsalPlanStatusEnum;
import com.yiring.app.constant.rehearsal.RiskLevelEnum;
import com.yiring.app.domain.rehearsal.RehearsalPlan;
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/10 13:48
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel("演练计划VO")
public class RehearsalPlanVo implements Serializable {
@Serial
private static final long serialVersionUID = 6580835031371232948L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "id", example = "1", required = true)
private Long id;
@ApiModelProperty(value = "演练主题", example = "红色演练")
private String topical;
@ApiModelProperty(value = "事故点id", example = "1522844636060585984")
private Long accidentSpotId;
@ApiModelProperty(value = "事故点名称", example = "事故点1")
private String accidentSpotName;
@ApiModelProperty(value = "周边范围(事故点周围多少米)", example = "50")
private Integer scope;
@ApiModelProperty(value = "撤离区id", example = "1523562795864428544")
private Long evacuationZoneId;
@ApiModelProperty(value = "撤离点名称", example = "撤离点1")
private String evacuationZoneName;
@ApiModelProperty(value = "风险程度code", example = "1")
private Integer riskLevel;
@ApiModelProperty(value = "风险等级名称", example = "红色风险")
private String riskLevelName;
@ApiModelProperty(value = "事故信息", example = "气体泄露")
private String accidentMsg;
@ApiModelProperty(value = "演练时间", example = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime rehearsalTime;
@ApiModelProperty(value = "推送信息", example = "气体泄露,请尽快逃离")
private String pushMsg;
@ApiModelProperty(value = "演练计划的状态code", example = "1")
private Integer status;
@ApiModelProperty(value = "演练计划的状态名称", example = "未开始")
private String statusName;
public static RehearsalPlanVo transform(RehearsalPlan rehearsalPlan) {
return RehearsalPlanVo
.builder()
.id(rehearsalPlan.getId())
.topical(rehearsalPlan.getTopical())
.accidentSpotId(rehearsalPlan.getAccidentSpot().getId())
.accidentSpotName(rehearsalPlan.getAccidentSpot().getName())
.scope(rehearsalPlan.getScope())
.evacuationZoneId(rehearsalPlan.getEvacuationZone().getId())
.evacuationZoneName(rehearsalPlan.getEvacuationZone().getName())
.riskLevel(rehearsalPlan.getRiskLevel())
.riskLevelName(RiskLevelEnum.getByCode(rehearsalPlan.getRiskLevel()))
.accidentMsg(rehearsalPlan.getAccidentMsg())
.rehearsalTime(rehearsalPlan.getRehearsalTime())
.pushMsg(rehearsalPlan.getPushMsg())
.status(rehearsalPlan.getStatus())
.statusName(RehearsalPlanStatusEnum.getByCode(rehearsalPlan.getStatus()))
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.rehearsal;
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 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/12 11:48
*/
@ApiModel("员工位置信息VO")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserLocationVo implements Serializable {
@Serial
private static final long serialVersionUID = 7996875376293325311L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "员工id", example = "1")
private Long userId;
@ApiModelProperty(value = "员工姓名", example = "1")
private String realmName;
@ApiModelProperty(value = "员工坐标")
private Point point;
}
/* (C) 2021 YiRing, Inc. */ /* (C) 2021 YiRing, Inc. */
package com.yiring.app.web; package com.yiring.app.web;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.app.constant.Code; import com.yiring.app.constant.Code;
import com.yiring.app.exception.CodeException; import com.yiring.app.exception.CodeException;
import com.yiring.app.util.zy.ZyUtil; import com.yiring.app.util.zy.ZyUtil;
...@@ -23,10 +24,12 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -23,10 +24,12 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "Hello") @SuppressWarnings({ "deprecation" })
@RequestMapping("/hello/") @ApiSupport(order = 0)
@Api(tags = "示例", description = "Example")
@RequestMapping("/example/")
@RestController @RestController
public class HelloController { public class ExampleController {
String text = "😎 Hello World"; String text = "😎 Hello World";
......
...@@ -20,7 +20,6 @@ import java.util.Objects; ...@@ -20,7 +20,6 @@ import java.util.Objects;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
...@@ -35,9 +34,10 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -35,9 +34,10 @@ import org.springframework.web.bind.annotation.RestController;
* @version 1.0 * @version 1.0
* @date 2022/4/27 14:18 * @date 2022/4/27 14:18
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "AlarmType(报警类型)") @SuppressWarnings({ "deprecation" })
@Api(tags = "报警类型", description = "AlarmType")
@RestController @RestController
@RequestMapping("/alarm/type") @RequestMapping("/alarm/type")
public class AlarmTypeController { public class AlarmTypeController {
...@@ -98,11 +98,7 @@ public class AlarmTypeController { ...@@ -98,11 +98,7 @@ public class AlarmTypeController {
@ApiOperation(value = "报警类型导出", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) @ApiOperation(value = "报警类型导出", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@PostMapping("/exportAlarmType") @PostMapping("/exportAlarmType")
public void exportAlarmType( public void exportAlarmType(@Valid AlarmConditionParam conditionParam, HttpServletResponse response) {
@Valid AlarmConditionParam conditionParam, alarmService.exportAlarmType(conditionParam, response);
HttpServletResponse response,
@Valid PageParam pageParam
) {
alarmService.exportAlarmType(conditionParam, response, pageParam);
} }
} }
...@@ -22,8 +22,10 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -22,8 +22,10 @@ import org.springframework.web.bind.annotation.RestController;
* @version 1.0 * @version 1.0
* @date 2022/5/6 10:36 * @date 2022/5/6 10:36
*/ */
@Api(tags = "HistoryRoute(历史轨迹)")
@Validated @Validated
@SuppressWarnings({ "deprecation" })
@Api(tags = "历史轨迹", description = "HistoryRoute")
@RestController @RestController
@RequestMapping("/history/route") @RequestMapping("/history/route")
public class HistoryRouteController { public class HistoryRouteController {
......
...@@ -9,7 +9,6 @@ import io.swagger.annotations.Api; ...@@ -9,7 +9,6 @@ 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 lombok.extern.slf4j.Slf4j;
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.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
...@@ -22,9 +21,10 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -22,9 +21,10 @@ import org.springframework.web.bind.annotation.RestController;
* @description: * @description:
* @date 2022/4/28 13:48 * @date 2022/4/28 13:48
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "小程序用户") @SuppressWarnings({ "deprecation" })
@Api(tags = "小程序用户", description = "AppletUser")
@RestController @RestController
@RequestMapping("/appUser/") @RequestMapping("/appUser/")
public class AppletUserController { public class AppletUserController {
......
...@@ -18,7 +18,6 @@ import io.swagger.annotations.ApiOperation; ...@@ -18,7 +18,6 @@ import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
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.*; import org.springframework.web.bind.annotation.*;
...@@ -30,9 +29,9 @@ import org.springframework.web.bind.annotation.*; ...@@ -30,9 +29,9 @@ import org.springframework.web.bind.annotation.*;
* @date 2022/5/7 * @date 2022/5/7
*/ */
@Slf4j
@Api(tags = "播报音频")
@Validated @Validated
@SuppressWarnings({ "deprecation" })
@Api(tags = "播报音频", description = "BroadcastAudio")
@RestController @RestController
@RequestMapping("/broadcast/audio") @RequestMapping("/broadcast/audio")
public class BroadcastAudioController { public class BroadcastAudioController {
......
...@@ -17,7 +17,6 @@ import io.swagger.annotations.ApiOperation; ...@@ -17,7 +17,6 @@ import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Point;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
...@@ -33,9 +32,10 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -33,9 +32,10 @@ import org.springframework.web.multipart.MultipartFile;
* @description: * @description:
* @date 2022/5/6 10:15 * @date 2022/5/6 10:15
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "Broadcast(播报设备管理)") @SuppressWarnings({ "deprecation" })
@Api(tags = "播报设备管理", description = "Broadcast")
@RestController @RestController
@RequestMapping("/broadcast/") @RequestMapping("/broadcast/")
public class BroadcastController { public class BroadcastController {
......
...@@ -17,7 +17,6 @@ import io.swagger.annotations.ApiOperation; ...@@ -17,7 +17,6 @@ import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
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.*; import org.springframework.web.bind.annotation.*;
...@@ -29,9 +28,9 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -29,9 +28,9 @@ import org.springframework.web.multipart.MultipartFile;
* @date 2022/4/19 * @date 2022/4/19
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "部门信息") @SuppressWarnings({ "deprecation" })
@Api(tags = "部门信息", description = "Department")
@RestController @RestController
@RequestMapping("/dept/") @RequestMapping("/dept/")
public class DepartmentController { public class DepartmentController {
......
...@@ -15,7 +15,6 @@ import io.swagger.annotations.ApiOperation; ...@@ -15,7 +15,6 @@ import io.swagger.annotations.ApiOperation;
import java.util.ArrayList; import java.util.ArrayList;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
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.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
...@@ -28,9 +27,10 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -28,9 +27,10 @@ import org.springframework.web.bind.annotation.RestController;
* @author tzl * @author tzl
* 2022/4/13 17:10 * 2022/4/13 17:10
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "Dict") @SuppressWarnings({ "deprecation" })
@Api(tags = "数据字典", description = "Dict")
@RestController @RestController
@RequestMapping("/Dict/") @RequestMapping("/Dict/")
public class DictController { public class DictController {
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
package com.yiring.app.web.dict; package com.yiring.app.web.dict;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
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;
...@@ -14,9 +13,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -14,9 +13,9 @@ import org.springframework.web.bind.annotation.RestController;
* 2022/4/14 15:14 * 2022/4/14 15:14
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "DictType") @SuppressWarnings({ "deprecation" })
@Api(tags = "数据字典类型", description = "DictType")
@RestController @RestController
@RequestMapping("/DictType/") @RequestMapping("/DictType/")
public class DictTypeController { public class DictTypeController {
......
...@@ -13,7 +13,6 @@ import io.swagger.annotations.ApiImplicitParam; ...@@ -13,7 +13,6 @@ import io.swagger.annotations.ApiImplicitParam;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -23,9 +22,10 @@ import org.springframework.web.bind.annotation.*; ...@@ -23,9 +22,10 @@ import org.springframework.web.bind.annotation.*;
* @version 1.0 * @version 1.0
* @date 2022/4/26 10:15 * @date 2022/4/26 10:15
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "District(区域管理)") @SuppressWarnings({ "deprecation" })
@Api(tags = "区域管理", description = "District")
@RestController @RestController
@RequestMapping("/district/") @RequestMapping("/district/")
public class DistrictController { public class DistrictController {
......
...@@ -12,7 +12,6 @@ import io.swagger.annotations.Api; ...@@ -12,7 +12,6 @@ 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 lombok.extern.slf4j.Slf4j;
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.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
...@@ -25,9 +24,10 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -25,9 +24,10 @@ import org.springframework.web.bind.annotation.RestController;
* @description: * @description:
* @date 2022/5/5 15:18 * @date 2022/5/5 15:18
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "Icon(图标管理)") @SuppressWarnings({ "deprecation" })
@Api(tags = "图标管理", description = "Icon")
@RestController @RestController
@RequestMapping("/icon/") @RequestMapping("/icon/")
public class IconController { public class IconController {
......
...@@ -11,7 +11,6 @@ import io.swagger.annotations.Api; ...@@ -11,7 +11,6 @@ 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.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -24,9 +23,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -24,9 +23,9 @@ import org.springframework.web.bind.annotation.RestController;
* @date 2022/5/10 * @date 2022/5/10
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "按键报警") @SuppressWarnings({ "deprecation" })
@Api(tags = "按键报警", description = "KeyAlarm")
@RestController @RestController
@RequestMapping("/key/alarm") @RequestMapping("/key/alarm")
public class KeyAlarmController { public class KeyAlarmController {
......
...@@ -10,7 +10,6 @@ import com.yiring.common.vo.PageVo; ...@@ -10,7 +10,6 @@ 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 lombok.extern.slf4j.Slf4j;
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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -23,9 +22,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -23,9 +22,9 @@ import org.springframework.web.bind.annotation.RestController;
* @date 2022/5/13 * @date 2022/5/13
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "按键报警推送") @SuppressWarnings({ "deprecation" })
@Api(tags = "按键报警推送", description = "KeyAlarmLog")
@RestController @RestController
@RequestMapping("/key/alarm/log") @RequestMapping("/key/alarm/log")
public class KeyAlarmLogController { public class KeyAlarmLogController {
......
...@@ -15,7 +15,6 @@ import io.swagger.annotations.Api; ...@@ -15,7 +15,6 @@ 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.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -26,9 +25,9 @@ import org.springframework.web.bind.annotation.*; ...@@ -26,9 +25,9 @@ import org.springframework.web.bind.annotation.*;
* @date 2022/5/6 * @date 2022/5/6
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "按键报警规则") @SuppressWarnings({ "deprecation" })
@Api(tags = "按键报警规则", description = "KeyAlarmRule")
@RestController @RestController
@RequestMapping("/key/alarm/rules") @RequestMapping("/key/alarm/rules")
public class KeyAlarmRuleController { public class KeyAlarmRuleController {
......
...@@ -13,7 +13,6 @@ import io.swagger.annotations.ApiOperation; ...@@ -13,7 +13,6 @@ import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
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.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
...@@ -27,9 +26,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -27,9 +26,9 @@ import org.springframework.web.bind.annotation.RestController;
* @date 2022/4/27 * @date 2022/4/27
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "定位信标") @SuppressWarnings({ "deprecation" })
@Api(tags = "定位信标", description = "LocationBeacon")
@RestController @RestController
@RequestMapping("/location/beacon/") @RequestMapping("/location/beacon/")
public class LocationBeaconController { public class LocationBeaconController {
......
...@@ -19,7 +19,6 @@ import io.swagger.annotations.ApiOperation; ...@@ -19,7 +19,6 @@ import io.swagger.annotations.ApiOperation;
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 lombok.extern.slf4j.Slf4j;
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.PostMapping;
...@@ -32,11 +31,12 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -32,11 +31,12 @@ import org.springframework.web.bind.annotation.RestController;
* @version 1.0 * @version 1.0
* @date 2022/4/28 11:50 * @date 2022/4/28 11:50
*/ */
@RestController
@Api(tags = "Fence(围栏信息)")
@Validated @Validated
@Slf4j @SuppressWarnings({ "deprecation" })
@RequestMapping("location/fence") @Api(tags = "围栏信息", description = "LocationFence")
@RestController
@RequestMapping("/location/fence")
public class LocationFenceController { public class LocationFenceController {
@Resource @Resource
......
...@@ -3,9 +3,7 @@ package com.yiring.app.web.location.rule; ...@@ -3,9 +3,7 @@ package com.yiring.app.web.location.rule;
import com.yiring.app.constant.alarm.InformMannerEnum; import com.yiring.app.constant.alarm.InformMannerEnum;
import com.yiring.app.domain.alarm.AlarmType; import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.param.location.rule.LocationAlarmRuleAddParam; import com.yiring.app.param.location.rule.*;
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.service.location.rule.LocationAlarmRuleService;
import com.yiring.app.vo.CodeNameVo; import com.yiring.app.vo.CodeNameVo;
import com.yiring.app.vo.IdNameVo; import com.yiring.app.vo.IdNameVo;
...@@ -22,23 +20,20 @@ import java.util.Objects; ...@@ -22,23 +20,20 @@ import java.util.Objects;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
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.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/** /**
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/5/5 14:19 * @date 2022/5/5 14:19
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "AlarmRule(电子围栏报警规则,配置报警给谁)") @SuppressWarnings({ "deprecation" })
@Api(tags = "电子围栏报警规则,配置报警给谁", description = "AlarmRule")
@RestController @RestController
@RequestMapping("/alarm/rule") @RequestMapping("/alarm/rule")
public class LocationAlarmRuleController { public class LocationAlarmRuleController {
...@@ -52,12 +47,24 @@ public class LocationAlarmRuleController { ...@@ -52,12 +47,24 @@ public class LocationAlarmRuleController {
return locationAlarmRuleService.addRule(param); return locationAlarmRuleService.addRule(param);
} }
@ApiOperation(value = "批量添加电子围栏报警规则")
@PostMapping("/batchAdd")
public Result<String> batchAdd(@Valid @RequestBody AlarmRuleBatchAddParam params) {
return locationAlarmRuleService.batchAdd(params.getParams());
}
@ApiOperation(value = "修改一条电子围栏报警规则") @ApiOperation(value = "修改一条电子围栏报警规则")
@PostMapping("/modifyRule") @PostMapping("/modifyRule")
public Result<String> modifyRule(@Valid LocationAlarmRuleModifyParam param) { public Result<String> modifyRule(@Valid LocationAlarmRuleModifyParam param) {
return locationAlarmRuleService.modifyRule(param); return locationAlarmRuleService.modifyRule(param);
} }
@ApiOperation(value = "批量修改电子围栏报警规则")
@PostMapping("/batchModify")
public Result<String> batchModify(@Valid @RequestBody AlarmRuleBatchModifyParam params) {
return locationAlarmRuleService.batchModify(params);
}
@ApiOperation(value = "删除一条电子围栏报警规则") @ApiOperation(value = "删除一条电子围栏报警规则")
@PostMapping("/removeRule") @PostMapping("/removeRule")
public Result<String> removeRule(@Valid IdParam idParam) { public Result<String> removeRule(@Valid IdParam idParam) {
...@@ -93,12 +100,8 @@ public class LocationAlarmRuleController { ...@@ -93,12 +100,8 @@ public class LocationAlarmRuleController {
@ApiOperation(value = "导出电子围栏报警规则", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) @ApiOperation(value = "导出电子围栏报警规则", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@PostMapping("/exportAlarmRule") @PostMapping("/exportAlarmRule")
public void exportAlarmRule( public void exportAlarmRule(@Valid LocationAlarmRuleParam param, HttpServletResponse response) {
@Valid LocationAlarmRuleParam param, locationAlarmRuleService.exportAlarmRule(param, response);
HttpServletResponse response,
@Valid PageParam pageParam
) {
locationAlarmRuleService.exportAlarmRule(param, response, pageParam);
} }
@ApiOperation("围栏信息下拉框") @ApiOperation("围栏信息下拉框")
......
...@@ -13,7 +13,6 @@ import io.swagger.annotations.Api; ...@@ -13,7 +13,6 @@ 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 lombok.extern.slf4j.Slf4j;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
...@@ -25,9 +24,10 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -25,9 +24,10 @@ import org.springframework.web.bind.annotation.RestController;
* @version 1.0 * @version 1.0
* @date 2022/4/29 9:05 * @date 2022/4/29 9:05
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "FenceRule(电子围栏报警规则,什么情况下会报警)") @SuppressWarnings({ "deprecation" })
@Api(tags = "电子围栏报警规则,什么情况下会报警", description = "FenceRule")
@RestController @RestController
@RequestMapping("/location/rule") @RequestMapping("/location/rule")
public class LocationFenceRuleController { public class LocationFenceRuleController {
......
...@@ -14,7 +14,6 @@ import io.swagger.annotations.ApiOperation; ...@@ -14,7 +14,6 @@ import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
...@@ -25,9 +24,9 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -25,9 +24,9 @@ import org.springframework.web.multipart.MultipartFile;
* @date 2022/4/13 * @date 2022/4/13
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "定位标签") @SuppressWarnings({ "deprecation" })
@Api(tags = "定位标签", description = "LocationTag")
@RestController @RestController
@RequestMapping("/location/tag/") @RequestMapping("/location/tag/")
public class LocationTagController { public class LocationTagController {
......
...@@ -12,7 +12,6 @@ import io.swagger.annotations.Api; ...@@ -12,7 +12,6 @@ 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 lombok.extern.slf4j.Slf4j;
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.GetMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
...@@ -26,9 +25,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -26,9 +25,9 @@ import org.springframework.web.bind.annotation.RestController;
* @date 2022/4/27 * @date 2022/4/27
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "标签分配") @SuppressWarnings({ "deprecation" })
@Api(tags = "标签分配", description = "LocationTagType")
@RestController @RestController
@RequestMapping("/location/tag/type") @RequestMapping("/location/tag/type")
public class LocationTagTypeController { public class LocationTagTypeController {
......
...@@ -12,10 +12,8 @@ import com.yiring.common.core.Status; ...@@ -12,10 +12,8 @@ import com.yiring.common.core.Status;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
import java.io.Serializable;
import java.util.List; import java.util.List;
import javax.annotation.Resource; import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -28,9 +26,10 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -28,9 +26,10 @@ import org.springframework.web.bind.annotation.RestController;
* @version 1.0 * @version 1.0
* @date 2022/4/24 13:48 * @date 2022/4/24 13:48
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "Map(地图)") @SuppressWarnings({ "deprecation" })
@Api(tags = "地图", description = "Map")
@RestController @RestController
@RequestMapping("/map/") @RequestMapping("/map/")
public class MapController { public class MapController {
...@@ -40,7 +39,7 @@ public class MapController { ...@@ -40,7 +39,7 @@ public class MapController {
@GetMapping("/mapSelect") @GetMapping("/mapSelect")
@ApiImplicitParams({ @ApiImplicitParam(value = "orgId", required = true, name = "orgId") }) @ApiImplicitParams({ @ApiImplicitParam(value = "orgId", required = true, name = "orgId") })
public Result<Serializable> fail(String orgId) { public Result<MapVo> select(String orgId) {
String login = ZyUtil.openLogin(); String login = ZyUtil.openLogin();
JSONObject jsonObject = mapClient.selectMap(orgId, "bearer " + login); JSONObject jsonObject = mapClient.selectMap(orgId, "bearer " + login);
// if (ObjectUtil.isNotNull(jsonObject.getJSONArray("data"))) { // if (ObjectUtil.isNotNull(jsonObject.getJSONArray("data"))) {
......
...@@ -19,7 +19,6 @@ import io.swagger.annotations.ApiOperation; ...@@ -19,7 +19,6 @@ import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -29,9 +28,9 @@ import org.springframework.web.bind.annotation.*; ...@@ -29,9 +28,9 @@ import org.springframework.web.bind.annotation.*;
* @date 2022/4/12 * @date 2022/4/12
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "职位信息") @SuppressWarnings({ "deprecation" })
@Api(tags = "职位信息", description = "Post")
@RestController @RestController
@RequestMapping("/post/") @RequestMapping("/post/")
public class PostController { public class PostController {
......
...@@ -31,8 +31,9 @@ import org.springframework.web.bind.annotation.*; ...@@ -31,8 +31,9 @@ import org.springframework.web.bind.annotation.*;
*/ */
@Slf4j @Slf4j
@Validated @Validated
@SuppressWarnings({ "deprecation" })
@Api(tags = "事故点管理", description = "AccidentSpot")
@RestController @RestController
@Api(tags = "AccidentSpot(事故点管理)")
@RequestMapping("/accident/spot") @RequestMapping("/accident/spot")
public class AccidentSpotController { public class AccidentSpotController {
......
...@@ -16,6 +16,7 @@ import io.swagger.annotations.Api; ...@@ -16,6 +16,7 @@ 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.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
/** /**
...@@ -23,7 +24,10 @@ import org.springframework.web.bind.annotation.*; ...@@ -23,7 +24,10 @@ import org.springframework.web.bind.annotation.*;
* @version 1.0 * @version 1.0
* @date 2022/5/9 10:19 * @date 2022/5/9 10:19
*/ */
@Api(tags = "EvacuationZone(撤离区)")
@Validated
@SuppressWarnings({ "deprecation" })
@Api(tags = "撤离区", description = "EvacuationZone")
@RestController @RestController
@RequestMapping("/evacuation/zone") @RequestMapping("/evacuation/zone")
public class EvacuationZoneController { public class EvacuationZoneController {
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.web.rehearsal;
import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.domain.location.LocationTag;
import com.yiring.app.domain.location.LocationTagRepository;
import com.yiring.app.domain.rehearsal.AccidentSpot;
import com.yiring.app.domain.rehearsal.AccidentSpotRepository;
import com.yiring.app.param.rehearsal.RehearsalPlanAddParam;
import com.yiring.app.param.rehearsal.RehearsalPlanConditionParam;
import com.yiring.app.param.rehearsal.RehearsalPlanModifyParam;
import com.yiring.app.param.rehearsal.RehearsalPlanPlaybackParam;
import com.yiring.app.service.rehearsal.RehearsalPlanService;
import com.yiring.app.vo.rehearsal.RehearsalPlanRealTimeVo;
import com.yiring.app.vo.rehearsal.RehearsalPlanVo;
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.List;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import org.locationtech.jts.geom.Geometry;
import org.springframework.data.domain.Sort;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
/**
* @author tml
* @version 1.0
* @date 2022/5/10 14:08
*/
@RestController
@Api(tags = "RehearsalPlan(演练计划)")
@RequestMapping("/rehearsal/plan")
public class RehearsalPlanController {
@Resource
private RehearsalPlanService rehearsalPlanService;
@Resource
LocationTagRepository locationTagRepository;
@Resource
AccidentSpotRepository accidentSpotRepository;
@ApiOperation("添加一条演练计划")
@PostMapping("/addOne")
public Result<String> addOne(@Valid RehearsalPlanAddParam param) {
return rehearsalPlanService.addOne(param);
}
@ApiOperation("修改一条演练计划")
@PostMapping("/modifyOne")
public Result<String> modifyOne(@Valid RehearsalPlanModifyParam param) {
return rehearsalPlanService.modifyOne(param);
}
@ApiOperation("删除一条演练计划")
@PostMapping("/removeOne")
public Result<String> removeOne(@Valid IdParam idParam) {
return rehearsalPlanService.removeOne(idParam);
}
@ApiOperation("查询一条演练计划")
@GetMapping("/findOne")
public Result<RehearsalPlanVo> findOne(@Valid IdParam idParam) {
return rehearsalPlanService.findOne(idParam);
}
@ApiOperation("查询演练计划列表")
@GetMapping("/findList")
public Result<PageVo<RehearsalPlanVo>> findList(
@Valid RehearsalPlanConditionParam conditionParam,
@Valid PageParam pageParam
) {
if (Objects.isNull(pageParam.getSortField())) {
pageParam.setSortField(AlarmType.Fields.createTime);
pageParam.setSortOrder(Sort.Direction.DESC);
}
return rehearsalPlanService.findList(conditionParam, pageParam);
}
@ApiOperation(value = "导出演练计划", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@GetMapping("/export")
public void export(@Valid RehearsalPlanConditionParam conditionParam, HttpServletResponse response) {
rehearsalPlanService.export(conditionParam, response);
}
@ApiOperation("启动一个演练计划")
@PostMapping("/start")
public Result<String> start(@Valid IdParam idParam) {
return rehearsalPlanService.start(idParam);
}
@ApiOperation("停止一个演练计划")
@PostMapping("/stop")
public Result<String> stop(@Valid IdParam idParam) {
return rehearsalPlanService.stop(idParam);
}
@ApiOperation("查看演练(实时)")
@GetMapping("/findRealTime")
public Result<RehearsalPlanRealTimeVo> findRealTime(@Valid IdParam idParam) {
return rehearsalPlanService.findRealTime(idParam);
}
@ApiOperation("查看回放(每次查询一分钟的回放信息)")
@GetMapping("/findPlayback")
public Result<PageVo<RehearsalPlanRealTimeVo>> findPlayback(@Valid RehearsalPlanPlaybackParam param) {
return rehearsalPlanService.findPlayback(param);
}
@PostMapping("/test")
public Geometry test(@RequestBody Geometry geometry) {
double degree = 100 / (2 * Math.PI * 6371004) * 360;
return geometry.buffer(degree);
}
@GetMapping("/get")
public List<LocationTag> get() {
Optional<AccidentSpot> optional = accidentSpotRepository.findById(1524292027951353856L);
Geometry geometry = optional.get().getGeometry();
List<LocationTag> inArea = locationTagRepository.findInArea(geometry);
System.out.println(inArea);
return inArea;
}
}
...@@ -32,7 +32,8 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -32,7 +32,8 @@ import org.springframework.web.multipart.MultipartFile;
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "人员管理") @SuppressWarnings({ "deprecation" })
@Api(tags = "人员管理", description = "user")
@RestController @RestController
@RequestMapping("/user/app/") @RequestMapping("/user/app/")
public class UserAppController { public class UserAppController {
......
...@@ -35,7 +35,8 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -35,7 +35,8 @@ import org.springframework.web.multipart.MultipartFile;
*/ */
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "Video(监控设备)") @SuppressWarnings({ "deprecation" })
@Api(tags = "监控设备", description = "Video")
@RestController @RestController
@RequestMapping("/video/") @RequestMapping("/video/")
public class VideoController { public class VideoController {
......
...@@ -28,10 +28,11 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -28,10 +28,11 @@ import org.springframework.web.bind.annotation.RestController;
* 2022/4/11 17:02 * 2022/4/11 17:02
*/ */
@Slf4j @Slf4j
@Api(tags = "Car(车辆)")
@Validated @Validated
@RestController @SuppressWarnings({ "deprecation" })
@Api(tags = "车辆", description = "Car")
@RequestMapping("/Car/") @RequestMapping("/Car/")
@RestController
public class CarController { public class CarController {
@Resource @Resource
......
...@@ -30,7 +30,8 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -30,7 +30,8 @@ import org.springframework.web.bind.annotation.RestController;
*/ */
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "Invitation(邀请)") @SuppressWarnings({ "deprecation" })
@Api(tags = "邀请", description = "Invitation")
@RestController @RestController
@RequestMapping("/invitation/") @RequestMapping("/invitation/")
public class InvitationController { public class InvitationController {
......
...@@ -31,7 +31,8 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -31,7 +31,8 @@ import org.springframework.web.bind.annotation.RestController;
*/ */
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "Visitor(访客)") @SuppressWarnings({ "deprecation" })
@Api(tags = "访客", description = "Visitor")
@RestController @RestController
@RequestMapping("/visitor/") @RequestMapping("/visitor/")
public class VisitorController { public class VisitorController {
......
...@@ -83,21 +83,21 @@ xxl: ...@@ -83,21 +83,21 @@ xxl:
logging: logging:
level: level:
# sql bind parameter # sql bind parameter
# org.hibernate.type.descriptor.sql.BasicBinder: trace org.hibernate.type.descriptor.sql.BasicBinder: trace
org.hibernate.type.descriptor.sql.BasicBinder: error # org.hibernate.type.descriptor.sql.BasicBinder: error
# 真源定位系统相关配置 # 真源定位系统相关配置
zy-config: zy-config:
host: project.yz-online.com host: project.yz-online.com
# RabbitMQ 订阅配置 # RabbitMQ 订阅配置
rabbitmq: rabbitmq:
enabled: true enabled: false
host: ${zy-config.host} host: ${zy-config.host}
port: 672 port: 672
username: admin username: admin
password: admin password: admin
virtual-host: / virtual-host: /
queue-name: tenant_msg_${zy-config.open.client-secret}_${zy-config.open.client-id} queue-name: tenant_msg_${zy-config.open.client-secret}_${zy-config.open.client-id}_mock
# 开放接口信息配置 # 开放接口信息配置
open: open:
api: http://${zy-config.host}:789/positionApi api: http://${zy-config.host}:789/positionApi
......
...@@ -9,8 +9,8 @@ dependencies { ...@@ -9,8 +9,8 @@ dependencies {
// 本地依赖 // 本地依赖
implementation fileTree(dir: project.rootDir.getPath() + '\\libs', includes: ['*jar']) implementation fileTree(dir: project.rootDir.getPath() + '\\libs', includes: ['*jar'])
// swagger annotations // swagger(knife4j)
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}" implementation "com.github.xiaoymin:knife4j-spring-boot-starter:${knife4jVersion}"
// sa-token // sa-token
implementation "cn.dev33:sa-token-spring-boot-starter:${saTokenVersion}" implementation "cn.dev33:sa-token-spring-boot-starter:${saTokenVersion}"
......
...@@ -4,6 +4,7 @@ package com.yiring.auth.web.auth; ...@@ -4,6 +4,7 @@ package com.yiring.auth.web.auth;
import cn.dev33.satoken.secure.SaSecureUtil; import cn.dev33.satoken.secure.SaSecureUtil;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.auth.domain.user.User; import com.yiring.auth.domain.user.User;
import com.yiring.auth.domain.user.UserRepository; import com.yiring.auth.domain.user.UserRepository;
import com.yiring.auth.param.auth.LoginParam; import com.yiring.auth.param.auth.LoginParam;
...@@ -36,7 +37,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -36,7 +37,9 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "Auth") @SuppressWarnings({ "deprecation" })
@ApiSupport(order = -99)
@Api(tags = "身份认证", description = "Auth")
@RestController @RestController
@RequestMapping("/auth/") @RequestMapping("/auth/")
public class AuthController { public class AuthController {
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.auth.web.permission; package com.yiring.auth.web.permission;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.auth.domain.permission.Permission; import com.yiring.auth.domain.permission.Permission;
import com.yiring.auth.domain.permission.PermissionRepository; import com.yiring.auth.domain.permission.PermissionRepository;
import com.yiring.auth.param.permission.PermissionParam; import com.yiring.auth.param.permission.PermissionParam;
...@@ -38,7 +39,9 @@ import org.springframework.web.bind.annotation.*; ...@@ -38,7 +39,9 @@ import org.springframework.web.bind.annotation.*;
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "Permission") @SuppressWarnings({ "deprecation" })
@ApiSupport(order = -97)
@Api(tags = "权限管理", description = "Permission")
@RestController @RestController
@RequestMapping("/manage/permission/") @RequestMapping("/manage/permission/")
public class PermissionController { public class PermissionController {
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.auth.web.role; package com.yiring.auth.web.role;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.auth.domain.permission.Permission; import com.yiring.auth.domain.permission.Permission;
import com.yiring.auth.domain.permission.PermissionRepository; import com.yiring.auth.domain.permission.PermissionRepository;
import com.yiring.auth.domain.role.Role; import com.yiring.auth.domain.role.Role;
...@@ -40,7 +41,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -40,7 +41,9 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "Role") @SuppressWarnings({ "deprecation" })
@ApiSupport(order = -96)
@Api(tags = "角色管理", description = "Role")
@RestController @RestController
@RequestMapping("/manage/role/") @RequestMapping("/manage/role/")
public class RoleController { public class RoleController {
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.auth.web.user; package com.yiring.auth.web.user;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.auth.domain.permission.Permission; import com.yiring.auth.domain.permission.Permission;
import com.yiring.auth.domain.role.Role; import com.yiring.auth.domain.role.Role;
import com.yiring.auth.domain.role.RoleRepository; import com.yiring.auth.domain.role.RoleRepository;
...@@ -46,7 +47,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -46,7 +47,9 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "User") @SuppressWarnings({ "deprecation" })
@ApiSupport(order = -95)
@Api(tags = "用户管理", description = "User")
@RestController @RestController
@RequestMapping("/user/") @RequestMapping("/user/")
public class UserController { public class UserController {
......
...@@ -3,8 +3,8 @@ dependencies { ...@@ -3,8 +3,8 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-web'
// swagger // swagger(knife4j)
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}" implementation "com.github.xiaoymin:knife4j-spring-boot-starter:${knife4jVersion}"
// minio // minio
implementation "io.minio:minio:${minioVersion}" implementation "io.minio:minio:${minioVersion}"
......
...@@ -3,6 +3,7 @@ package com.yiring.common.web; ...@@ -3,6 +3,7 @@ package com.yiring.common.web;
import cn.hutool.core.lang.Snowflake; import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.common.core.Minio; import com.yiring.common.core.Minio;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.core.Status; import com.yiring.common.core.Status;
...@@ -24,7 +25,9 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -24,7 +25,9 @@ import org.springframework.web.multipart.MultipartFile;
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "Minio") @SuppressWarnings({ "deprecation" })
@ApiSupport(order = -98)
@Api(tags = "文件管理", description = "file")
@RestController @RestController
@RequestMapping("/common/minio/") @RequestMapping("/common/minio/")
public class MinioController { public class MinioController {
......
...@@ -25,9 +25,9 @@ import org.springframework.stereotype.Component; ...@@ -25,9 +25,9 @@ import org.springframework.stereotype.Component;
public class TimesAspect { public class TimesAspect {
@Pointcut("@annotation(com.yiring.common.annotation.Times)") @Pointcut("@annotation(com.yiring.common.annotation.Times)")
public void pointCut() {} public void times() {}
@Around("pointCut()") @Around("times()")
public Object around(ProceedingJoinPoint point) throws Throwable { public Object around(ProceedingJoinPoint point) throws Throwable {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
Object result = point.proceed(); Object result = point.proceed();
......
/* (C) 2021 YiRing, Inc. */
package com.yiring.common.aspect;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* XxlJob 注解切面
*
* @author ifzm
* @version 0.1
*/
@Slf4j
@Aspect
@Component
public class XxlJobAspect {
@Pointcut("@annotation(com.xxl.job.core.handler.annotation.XxlJob)")
public void log() {}
@Around("log()")
public Object around(ProceedingJoinPoint point) throws Throwable {
try {
return point.proceed();
} catch (Exception e) {
log.error("XxlJob Execute Error: " + e.getMessage(), e);
throw e;
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论