提交 b84b587a 作者: Administrator

合并

...@@ -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")
...@@ -78,4 +78,6 @@ dependencies { ...@@ -78,4 +78,6 @@ dependencies {
// xxl-job // xxl-job
implementation "com.xuxueli:xxl-job-core:${xxlJobVersion}" implementation "com.xuxueli:xxl-job-core:${xxlJobVersion}"
// minio
implementation "io.minio:minio:${minioVersion}"
} }
...@@ -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("播报设备地址")
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.district; package com.yiring.app.domain.district;
import com.yiring.app.domain.location.LocationTag;
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.HashSet;
import java.util.Set;
import javax.persistence.*; import javax.persistence.*;
import lombok.*; import lombok.*;
import lombok.experimental.FieldNameConstants; import lombok.experimental.FieldNameConstants;
...@@ -59,7 +62,7 @@ public class District implements Serializable { ...@@ -59,7 +62,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("创建时间")
...@@ -75,4 +78,10 @@ public class District implements Serializable { ...@@ -75,4 +78,10 @@ public class District implements Serializable {
@Comment(value = "是否删除") @Comment(value = "是否删除")
@Column(nullable = false) @Column(nullable = false)
Boolean deleted; Boolean deleted;
@ToString.Exclude
@Comment("区域中的标签集合")
@Builder.Default
@ManyToMany(fetch = FetchType.LAZY)
Set<LocationTag> tags = new HashSet<>(0);
} }
...@@ -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);
} }
...@@ -6,14 +6,15 @@ import com.yiring.auth.domain.user.User; ...@@ -6,14 +6,15 @@ import com.yiring.auth.domain.user.User;
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 javax.persistence.Entity; import java.math.BigDecimal;
import javax.persistence.JoinColumn; import java.util.HashSet;
import javax.persistence.ManyToOne; import java.util.Set;
import javax.persistence.Table; import javax.persistence.*;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants; import lombok.experimental.FieldNameConstants;
import org.hibernate.annotations.Comment; import org.hibernate.annotations.Comment;
import org.locationtech.jts.geom.Point;
/** /**
* *
...@@ -32,7 +33,7 @@ import org.hibernate.annotations.Comment; ...@@ -32,7 +33,7 @@ import org.hibernate.annotations.Comment;
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
@Entity @Entity
@Table(name = "BS_KEY_ALARM") @Table(name = "BS_KEY_ALARM")
@Comment("按键报警规则") @Comment("按键报警")
public class KeyAlarm extends BasicEntity implements Serializable { public class KeyAlarm extends BasicEntity implements Serializable {
@Serial @Serial
...@@ -47,6 +48,26 @@ public class KeyAlarm extends BasicEntity implements Serializable { ...@@ -47,6 +48,26 @@ public class KeyAlarm extends BasicEntity implements Serializable {
@Comment("负责人") @Comment("负责人")
User leader; User leader;
@Comment("标签编号")
String code;
@Comment("x")
BigDecimal x;
@Comment("y")
BigDecimal y;
@Comment("z")
BigDecimal z;
@Comment("坐标点信息")
Point point;
@Comment("报警状态") @Comment("报警状态")
Boolean enable; Boolean enable;
@Builder.Default
@OneToMany(mappedBy = "keyAlarm")
@Comment("推送消息记录")
Set<KeyAlarmLog> rules = new HashSet<>(0);
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.key;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.yiring.auth.domain.user.User;
import com.yiring.common.domain.BasicEntity;
import java.io.Serial;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants;
import org.hibernate.annotations.Comment;
/**
* 报警规则推送记录
*
* @author LJ-2204
* @date 2022/5/12
*/
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@FieldDefaults(level = AccessLevel.PRIVATE)
@Entity
@Table(name = "BS_KEY_ALARM_LOG")
@Comment("报警规则推送记录")
public class KeyAlarmLog extends BasicEntity implements Serializable {
@Serial
private static final long serialVersionUID = 5837910859908195485L;
@ManyToOne
@JoinColumn(name = "alarm_id")
@JsonIgnore
@Comment("按键报警")
KeyAlarm keyAlarm;
@Comment("通知方式")
String types;
@Comment("接收状态")
Boolean status;
@ManyToOne
@JoinColumn(name = "leader_id")
@JsonIgnore
@Comment("负责人")
User user;
}
...@@ -13,5 +13,5 @@ import org.springframework.stereotype.Repository; ...@@ -13,5 +13,5 @@ import org.springframework.stereotype.Repository;
*/ */
@Repository @Repository
public interface KeyAlarmRulesRepository public interface KeyAlarmLogRepository
extends JpaRepository<KeyAlarmRules, Serializable>, JpaSpecificationExecutor<KeyAlarmRules> {} extends JpaRepository<KeyAlarmLog, Serializable>, JpaSpecificationExecutor<KeyAlarmLog> {}
...@@ -33,13 +33,13 @@ import org.hibernate.annotations.Comment; ...@@ -33,13 +33,13 @@ import org.hibernate.annotations.Comment;
@Entity @Entity
@Table(name = "BS_KEY_ALARM_RULES") @Table(name = "BS_KEY_ALARM_RULES")
@Comment("按键报警规则") @Comment("按键报警规则")
public class KeyAlarmRules extends BasicEntity implements Serializable { public class KeyAlarmRule extends BasicEntity implements Serializable {
@Serial @Serial
private static final long serialVersionUID = -302167871277966250L; private static final long serialVersionUID = -302167871277966250L;
@Comment("所属部门") @Comment("所属部门")
@ManyToOne @OneToOne
@JsonIgnore @JsonIgnore
@JoinColumn(name = "department_id") @JoinColumn(name = "department_id")
Department department; Department department;
...@@ -47,12 +47,7 @@ public class KeyAlarmRules extends BasicEntity implements Serializable { ...@@ -47,12 +47,7 @@ public class KeyAlarmRules extends BasicEntity implements Serializable {
@JsonIgnore @JsonIgnore
@Builder.Default @Builder.Default
@Comment("用户集合") @Comment("用户集合")
@ManyToMany(fetch = FetchType.EAGER) @OneToMany
@JoinTable(
name = "BS_KEY_ALARM_RULES_USERS",
joinColumns = { @JoinColumn(name = "key_id") },
inverseJoinColumns = { @JoinColumn(name = "user_id") }
)
Set<User> users = new HashSet<>(0); Set<User> users = new HashSet<>(0);
@Comment("推送类型") @Comment("推送类型")
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.key;
import java.io.Serializable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.stereotype.Repository;
/**
*
* @author LJ-2204
* @date 2022/5/6
*/
@Repository
public interface KeyAlarmRuleRepository
extends JpaRepository<KeyAlarmRule, Serializable>, JpaSpecificationExecutor<KeyAlarmRule> {}
...@@ -47,7 +47,7 @@ public class LocationAlarmRule extends BasicEntity implements Serializable { ...@@ -47,7 +47,7 @@ public class LocationAlarmRule extends BasicEntity implements Serializable {
private LocationFence locationFence; private LocationFence locationFence;
@Comment("接收人集合") @Comment("接收人集合")
@ManyToMany @OneToMany
@ToString.Exclude @ToString.Exclude
private Set<User> users; private Set<User> users;
...@@ -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")
......
...@@ -7,13 +7,11 @@ import com.yiring.common.annotation.FieldMapping; ...@@ -7,13 +7,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;
...@@ -107,9 +105,13 @@ public class LocationTag extends BasicEntity implements Serializable { ...@@ -107,9 +105,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("蓝牙人员定位卡"),
...@@ -125,17 +127,4 @@ public class LocationTag extends BasicEntity implements Serializable { ...@@ -125,17 +127,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,18 +2,45 @@ ...@@ -2,18 +2,45 @@
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> {
LocationTag findByCode(String code); LocationTag findByCode(String code);
/**
* 查询在指定区域内的所有标签
* @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. */
package com.yiring.app.excel.key;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.github.liaochong.myexcel.core.annotation.ExcelModel;
import com.yiring.app.domain.key.KeyAlarm;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.FieldDefaults;
/**
* 部门信息控制器
*
* @author LJ-2204
* @date 2022/5/11
*/
@ExcelModel
@Data
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmExportExcel implements Serializable {
@Serial
private static final long serialVersionUID = -3703974403333845088L;
@ExcelColumn(title = "地图位置")
Long areaId;
@ExcelColumn(title = "报警人员")
String realName;
@ExcelColumn(title = "工号")
String uuid;
@ExcelColumn(title = "报警时间")
LocalDateTime createTime;
@ExcelColumn(title = "结束时间")
LocalDateTime endTime;
@ExcelColumn(title = "报警类型")
String type;
@ExcelColumn(title = "报警接收人")
String receiver;
@ExcelColumn(title = "报警状态")
Boolean enable;
public static KeyAlarmExportExcel transform(KeyAlarm keyAlarm) {
return KeyAlarmExportExcel
.builder()
.areaId(keyAlarm.getAreaId())
.createTime(keyAlarm.getCreateTime())
.endTime(keyAlarm.getUpdateTime())
.type("按键报警")
.enable(keyAlarm.getEnable())
.build();
}
}
...@@ -3,7 +3,7 @@ package com.yiring.app.excel.key; ...@@ -3,7 +3,7 @@ package com.yiring.app.excel.key;
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.domain.key.KeyAlarmRules; import com.yiring.app.domain.key.KeyAlarmRule;
import com.yiring.auth.domain.user.User; import com.yiring.auth.domain.user.User;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
...@@ -21,7 +21,7 @@ import lombok.experimental.FieldDefaults; ...@@ -21,7 +21,7 @@ import lombok.experimental.FieldDefaults;
@Data @Data
@Builder @Builder
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmRulesExportExcel implements Serializable { public class KeyAlarmRuleExportExcel implements Serializable {
@Serial @Serial
private static final long serialVersionUID = -800228727313291675L; private static final long serialVersionUID = -800228727313291675L;
...@@ -35,8 +35,8 @@ public class KeyAlarmRulesExportExcel implements Serializable { ...@@ -35,8 +35,8 @@ public class KeyAlarmRulesExportExcel implements Serializable {
@ExcelColumn(title = "通知类型") @ExcelColumn(title = "通知类型")
String types; String types;
public static KeyAlarmRulesExportExcel transform(KeyAlarmRules keyAlarmRules) { public static KeyAlarmRuleExportExcel transform(KeyAlarmRule keyAlarmRule) {
Set<User> users = keyAlarmRules.getUsers(); Set<User> users = keyAlarmRule.getUsers();
StringBuilder userNames = new StringBuilder(); StringBuilder userNames = new StringBuilder();
for (User user : users) { for (User user : users) {
userNames.append(user.getRealName()); userNames.append(user.getRealName());
...@@ -44,11 +44,11 @@ public class KeyAlarmRulesExportExcel implements Serializable { ...@@ -44,11 +44,11 @@ public class KeyAlarmRulesExportExcel implements Serializable {
} }
String substring = userNames.substring(0, userNames.length() - 1); String substring = userNames.substring(0, userNames.length() - 1);
return KeyAlarmRulesExportExcel return KeyAlarmRuleExportExcel
.builder() .builder()
.deptName(keyAlarmRules.getDepartment().getName()) .deptName(keyAlarmRule.getDepartment().getName())
.userNames(substring) .userNames(substring)
.types(keyAlarmRules.getTypes()) .types(keyAlarmRule.getTypes())
.build(); .build();
} }
} }
/* (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.excel.user; package com.yiring.app.excel.user;
import cn.hutool.core.util.StrUtil;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn; import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.yiring.auth.domain.user.User; import com.yiring.auth.domain.user.User;
import java.io.Serial; import java.io.Serial;
...@@ -49,10 +50,6 @@ public class UserImportExcel implements Serializable { ...@@ -49,10 +50,6 @@ public class UserImportExcel implements Serializable {
@ExcelColumn(title = "职位名称") @ExcelColumn(title = "职位名称")
String postName; String postName;
// 标签号
@ExcelColumn(title = "标签编号")
String code;
// 性别 // 性别
@ExcelColumn(title = "性别") @ExcelColumn(title = "性别")
Boolean gender; Boolean gender;
...@@ -66,7 +63,7 @@ public class UserImportExcel implements Serializable { ...@@ -66,7 +63,7 @@ public class UserImportExcel implements Serializable {
.builder() .builder()
.realName(userImportExcel.getRealName()) .realName(userImportExcel.getRealName())
.uuid(userImportExcel.getUuid()) .uuid(userImportExcel.getUuid())
.type(User.Type.valueOf(userImportExcel.getType())) .type(StrUtil.equals(userImportExcel.getType(), "员工") ? User.Type.EMPLOYEES : User.Type.GUEST)
.mobile(userImportExcel.getMobile()) .mobile(userImportExcel.getMobile())
.gender(userImportExcel.getGender()) .gender(userImportExcel.getGender())
.isSpecial(userImportExcel.getIsSpecial()) .isSpecial(userImportExcel.getIsSpecial())
......
/* (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,16 +165,17 @@ public class MockZyMessageJob { ...@@ -129,16 +165,17 @@ 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", "1522770547178475520"); params.put("entityId", "4376");
params.put("areaId", mockAreaId()); params.put("areaId", mockAreaId());
params.put("raiseTime", System.currentTimeMillis()); params.put("raiseTime", System.currentTimeMillis());
params.put("x", 100); params.put("x", 100);
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
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.key;
import com.yiring.app.domain.key.KeyAlarm;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* 按键报警
*
* @author LJ-2204
* @date 2022/5/12
*/
@ApiModel("KeyAlarmAddParam")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmAddParam implements Serializable {
@Serial
private static final long serialVersionUID = 6914927126284215967L;
@ApiModelProperty(value = "标签编号", example = "BTT88888888")
String tagId;
@ApiModelProperty(value = "报警人ID", example = "14433")
Long entityId;
@ApiModelProperty(value = "地图总图", example = "1")
Long areaId;
@ApiModelProperty(value = "推送时间", example = "")
LocalDateTime raiseTime;
@ApiModelProperty(value = "x", example = "1")
BigDecimal x;
@ApiModelProperty(value = "y", example = "1")
BigDecimal y;
@ApiModelProperty(value = "z", example = "1")
BigDecimal z;
public static KeyAlarm transform(KeyAlarmAddParam param) {
return KeyAlarm
.builder()
.areaId(param.areaId)
.code(param.getTagId())
.x(param.getX())
.y(param.getY())
.z(param.getZ())
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.key;
import com.yiring.app.push.domain.PushMessage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* 按键报警推送
*
* @author LJ-2204
* @date 2022/5/13
*/
@ApiModel("KeyAlarmLogFindParam")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmLogFindParam implements Serializable {
@Serial
private static final long serialVersionUID = -7238582681776938388L;
@ApiModelProperty(value = "通知方式", example = "SMS/APP")
PushMessage.Type type;
@ApiModelProperty(value = "联系号码", example = "18888888888")
String mobile;
@ApiModelProperty(value = "接收状态", example = "T/F")
Boolean status;
}
...@@ -17,13 +17,13 @@ import lombok.experimental.FieldDefaults; ...@@ -17,13 +17,13 @@ import lombok.experimental.FieldDefaults;
* @date 2022/5/6 * @date 2022/5/6
*/ */
@ApiModel("KeyAlarmRulesAddParam") @ApiModel("KeyAlarmRuleAddParam")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmRulesAddParam implements Serializable { public class KeyAlarmRuleAddParam implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 758462772473378637L; private static final long serialVersionUID = 758462772473378637L;
......
...@@ -15,13 +15,13 @@ import lombok.experimental.FieldDefaults; ...@@ -15,13 +15,13 @@ import lombok.experimental.FieldDefaults;
* @date 2022/5/6 * @date 2022/5/6
*/ */
@ApiModel("KeyAlarmRulesExportParam") @ApiModel("KeyAlarmRuleExportParam")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmRulesExportParam implements Serializable { public class KeyAlarmRuleExportParam implements Serializable {
@Serial @Serial
private static final long serialVersionUID = -2940487513251067057L; private static final long serialVersionUID = -2940487513251067057L;
......
...@@ -16,13 +16,13 @@ import lombok.experimental.FieldDefaults; ...@@ -16,13 +16,13 @@ import lombok.experimental.FieldDefaults;
* @date 2022/5/6 * @date 2022/5/6
*/ */
@ApiModel("KeyAlarmRulesAddParam") @ApiModel("KeyAlarmRuleAddParam")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmRulesModifyParam implements Serializable { public class KeyAlarmRuleModifyParam implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 3526756145220971363L; private static final long serialVersionUID = 3526756145220971363L;
......
...@@ -15,13 +15,13 @@ import lombok.experimental.FieldDefaults; ...@@ -15,13 +15,13 @@ import lombok.experimental.FieldDefaults;
* @date 2022/5/7 * @date 2022/5/7
*/ */
@ApiModel("KeyAlarmRulesPageParam") @ApiModel("KeyAlarmRulePageParam")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmRulesPageParam implements Serializable { public class KeyAlarmRulePageParam implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 2876239519436815639L; private static final long serialVersionUID = 2876239519436815639L;
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
package com.yiring.app.param.location.beacon; package com.yiring.app.param.location.beacon;
import com.yiring.app.domain.location.LocationBeacon; import com.yiring.app.domain.location.LocationBeacon;
import com.yiring.app.util.GeoUtils;
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;
...@@ -65,9 +66,13 @@ public class LocationBeaconAddParam implements Serializable { ...@@ -65,9 +66,13 @@ public class LocationBeaconAddParam implements Serializable {
.x(locationBeaconAddParam.getX()) .x(locationBeaconAddParam.getX())
.y(locationBeaconAddParam.getY()) .y(locationBeaconAddParam.getY())
.z(locationBeaconAddParam.getZ()) .z(locationBeaconAddParam.getZ())
// .point(GeoUtils.xyzToPoint( .point(
// locationBeaconAddParam.getPointX().doubleValue(),locationBeaconAddParam.getPointY().doubleValue(),locationBeaconAddParam.getPointZ().doubleValue() GeoUtils.xyzToPoint(
// )) locationBeaconAddParam.getX().doubleValue(),
locationBeaconAddParam.getY().doubleValue(),
locationBeaconAddParam.getZ().doubleValue()
)
)
.time(locationBeaconAddParam.getTime()) .time(locationBeaconAddParam.getTime())
.volt(locationBeaconAddParam.getVolt()) .volt(locationBeaconAddParam.getVolt())
.voltUnit(locationBeaconAddParam.getVoltUnit()) .voltUnit(locationBeaconAddParam.getVoltUnit())
......
...@@ -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)
......
...@@ -6,11 +6,13 @@ import com.yiring.app.param.broadcast.BroadcastAudioFindParam; ...@@ -6,11 +6,13 @@ import com.yiring.app.param.broadcast.BroadcastAudioFindParam;
import com.yiring.app.param.broadcast.BroadcastAudioModifyParam; import com.yiring.app.param.broadcast.BroadcastAudioModifyParam;
import com.yiring.app.vo.broadcast.BroadcastAudioIndexVo; import com.yiring.app.vo.broadcast.BroadcastAudioIndexVo;
import com.yiring.app.vo.broadcast.BroadcastAudioVo; import com.yiring.app.vo.broadcast.BroadcastAudioVo;
import com.yiring.auth.param.IdsParam;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
import com.yiring.common.param.IndexParam; import com.yiring.common.param.IndexParam;
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 javax.servlet.http.HttpServletResponse;
/** /**
* 播报语音 * 播报语音
...@@ -55,4 +57,11 @@ public interface BroadcastAudioService { ...@@ -55,4 +57,11 @@ public interface BroadcastAudioService {
* @return Result<PageVo<BroadcastAudioIndexVo>> * @return Result<PageVo<BroadcastAudioIndexVo>>
*/ */
Result<PageVo<BroadcastAudioIndexVo>> index(IndexParam indexParam); Result<PageVo<BroadcastAudioIndexVo>> index(IndexParam indexParam);
/**
* 批量下载
* @param idsParam IdsParam
* @param response HttpServletResponse
*/
void download(IdsParam idsParam, HttpServletResponse response);
} }
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
package com.yiring.app.service.broadcast.impl; package com.yiring.app.service.broadcast.impl;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.yiring.app.domain.broadcast.BroadcastAudio; import com.yiring.app.domain.broadcast.BroadcastAudio;
import com.yiring.app.domain.broadcast.BroadcastAudioRepository; import com.yiring.app.domain.broadcast.BroadcastAudioRepository;
...@@ -9,8 +11,11 @@ import com.yiring.app.param.broadcast.BroadcastAudioAddParam; ...@@ -9,8 +11,11 @@ import com.yiring.app.param.broadcast.BroadcastAudioAddParam;
import com.yiring.app.param.broadcast.BroadcastAudioFindParam; import com.yiring.app.param.broadcast.BroadcastAudioFindParam;
import com.yiring.app.param.broadcast.BroadcastAudioModifyParam; import com.yiring.app.param.broadcast.BroadcastAudioModifyParam;
import com.yiring.app.service.broadcast.BroadcastAudioService; import com.yiring.app.service.broadcast.BroadcastAudioService;
import com.yiring.app.util.ZipUtils;
import com.yiring.app.vo.broadcast.BroadcastAudioIndexVo; import com.yiring.app.vo.broadcast.BroadcastAudioIndexVo;
import com.yiring.app.vo.broadcast.BroadcastAudioVo; import com.yiring.app.vo.broadcast.BroadcastAudioVo;
import com.yiring.auth.param.IdsParam;
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;
import com.yiring.common.domain.BasicEntity; import com.yiring.common.domain.BasicEntity;
...@@ -18,12 +23,17 @@ import com.yiring.common.param.IdParam; ...@@ -18,12 +23,17 @@ import com.yiring.common.param.IdParam;
import com.yiring.common.param.IndexParam; import com.yiring.common.param.IndexParam;
import com.yiring.common.param.PageParam; import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import java.util.List; import io.minio.GetObjectResponse;
import java.util.Optional; import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.persistence.criteria.Order; import javax.persistence.criteria.Order;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
...@@ -47,6 +57,9 @@ public class BroadcastAudioServiceImpl implements BroadcastAudioService { ...@@ -47,6 +57,9 @@ public class BroadcastAudioServiceImpl implements BroadcastAudioService {
@Resource @Resource
BroadcastAudioRepository broadcastAudioRepository; BroadcastAudioRepository broadcastAudioRepository;
@Resource
Minio minio;
@Override @Override
public Result<String> save(BroadcastAudioAddParam param) { public Result<String> save(BroadcastAudioAddParam param) {
broadcastAudioRepository.save(BroadcastAudioAddParam.transform(param)); broadcastAudioRepository.save(BroadcastAudioAddParam.transform(param));
...@@ -122,4 +135,37 @@ public class BroadcastAudioServiceImpl implements BroadcastAudioService { ...@@ -122,4 +135,37 @@ public class BroadcastAudioServiceImpl implements BroadcastAudioService {
return Result.ok(pageVo); return Result.ok(pageVo);
} }
@Override
public void download(IdsParam idsParam, HttpServletResponse response) {
String[] split = idsParam.getIds().split(",");
Long[] ids = Convert.toLongArray(split);
List<BroadcastAudio> broadcastAudios = broadcastAudioRepository.findAllById(Arrays.asList(ids));
HashMap<String, File> map = new HashMap<>();
broadcastAudios.forEach(broadcastAudio -> {
String uri = broadcastAudio.getUri();
int i = uri.lastIndexOf("upload/");
uri = uri.substring(i);
try {
GetObjectResponse getObjectResponse = minio.getObject(uri);
File file = FileUtil.writeFromStream(getObjectResponse, FileUtil.createTempFile());
int j = uri.lastIndexOf(".");
uri = uri.substring(j);
map.put(broadcastAudio.getName() + uri, file);
} catch (Exception e) {
e.printStackTrace();
}
});
String fileName = URLEncoder.encode("音频文件.zip", StandardCharsets.UTF_8);
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
try {
ZipUtils.packet(map, response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
} }
...@@ -76,11 +76,11 @@ public class DepartmentServiceImpl implements DepartmentService { ...@@ -76,11 +76,11 @@ public class DepartmentServiceImpl implements DepartmentService {
@Override @Override
public Result<String> addDepartment(DepartmentAddParam departmentAddParam) { public Result<String> addDepartment(DepartmentAddParam departmentAddParam) {
// 查询用户相关信息 // 查询用户相关信息
Optional<User> userOptional = userRepository.findOne(
Example.of(User.builder().id(departmentAddParam.getLeaderId()).build())
);
Department department = DepartmentAddParam.transform(departmentAddParam); Department department = DepartmentAddParam.transform(departmentAddParam);
userOptional.ifPresent(department::setLeader); if (ObjectUtil.isNotEmpty(departmentAddParam.getLeaderId())) {
Optional<User> userOptional = userRepository.findById(departmentAddParam.getLeaderId());
userOptional.ifPresent(department::setLeader);
}
// 查询zy上级部门id // 查询zy上级部门id
Optional<Department> departmentOptional = departmentRepository.findOne( Optional<Department> departmentOptional = departmentRepository.findOne(
...@@ -157,13 +157,16 @@ public class DepartmentServiceImpl implements DepartmentService { ...@@ -157,13 +157,16 @@ public class DepartmentServiceImpl implements DepartmentService {
@Override @Override
public void exportDepartment(DepartmentExportParam departmentExportParam, HttpServletResponse response) { public void exportDepartment(DepartmentExportParam departmentExportParam, HttpServletResponse response) {
List<Department> departments = departmentRepository.findAll( HashMap<String, Department> hashMap = getStringDepartmentHashMap();
Example.of(Department.builder().enable(departmentExportParam.getEnable()).build()) List<DepartmentExportExcel> departmentExportExcels = ListUtil.toList();
); hashMap.forEach((k, v) -> {
List<DepartmentExportExcel> departmentExportExcels = departments DepartmentExportExcel departmentExportExcel = DepartmentExportExcel.transform(v);
.stream() if (v.getEnable() == departmentExportParam.getEnable()) {
.map(DepartmentExportExcel::transform) departmentExportExcel.setName(k);
.collect(Collectors.toList()); departmentExportExcels.add(departmentExportExcel);
}
});
try ( try (
DefaultStreamExcelBuilder<DepartmentExportExcel> streamExcelBuilder = DefaultStreamExcelBuilder DefaultStreamExcelBuilder<DepartmentExportExcel> streamExcelBuilder = DefaultStreamExcelBuilder
.of(DepartmentExportExcel.class) .of(DepartmentExportExcel.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();
} }
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.key;
import com.yiring.app.param.key.KeyAlarmLogFindParam;
import com.yiring.app.vo.key.KeyAlarmLogVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
/**
* 按键报警推送
*
* @author LJ-2204
* @date 2022/5/13
*/
public interface KeyAlarmLogService {
/**
* 表格查询
* @param param KeyAlarmLogFindParam
* @param pageParam PageParam
* @return Result<PageVo<KeyAlarmLogVo>>
*/
Result<PageVo<KeyAlarmLogVo>> page(KeyAlarmLogFindParam param, PageParam pageParam);
}
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.key; package com.yiring.app.service.key;
import com.yiring.app.param.key.KeyAlarmRulesAddParam; import com.yiring.app.param.key.KeyAlarmRuleAddParam;
import com.yiring.app.param.key.KeyAlarmRulesExportParam; import com.yiring.app.param.key.KeyAlarmRuleExportParam;
import com.yiring.app.param.key.KeyAlarmRulesModifyParam; import com.yiring.app.param.key.KeyAlarmRuleModifyParam;
import com.yiring.app.param.key.KeyAlarmRulesPageParam; import com.yiring.app.param.key.KeyAlarmRulePageParam;
import com.yiring.app.vo.key.KeyAlarmRulesVo; import com.yiring.app.vo.key.KeyAlarmRuleVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam; import com.yiring.common.param.PageParam;
...@@ -18,13 +18,13 @@ import javax.servlet.http.HttpServletResponse; ...@@ -18,13 +18,13 @@ import javax.servlet.http.HttpServletResponse;
* @author LJ-2204 * @author LJ-2204
* @date 2022/5/6 * @date 2022/5/6
*/ */
public interface KeyAlarmRulesService { public interface KeyAlarmRuleService {
/** /**
* 添加报警类型 * 添加报警类型
* @param keyAlarmRulesAddParam KeyAlarmRulesAddParam * @param keyAlarmRuleAddParam KeyAlarmRuleAddParam
* @return Result<String> * @return Result<String>
*/ */
Result<String> add(KeyAlarmRulesAddParam keyAlarmRulesAddParam); Result<String> add(KeyAlarmRuleAddParam keyAlarmRuleAddParam);
/** /**
* 删除报警规则 * 删除报警规则
...@@ -35,23 +35,23 @@ public interface KeyAlarmRulesService { ...@@ -35,23 +35,23 @@ public interface KeyAlarmRulesService {
/** /**
* 修改报警规则 * 修改报警规则
* @param keyAlarmRulesModifyParam KeyAlarmRulesModifyParam * @param keyAlarmRuleModifyParam KeyAlarmRuleModifyParam
* @return Result<String> * @return Result<String>
*/ */
Result<String> modify(KeyAlarmRulesModifyParam keyAlarmRulesModifyParam); Result<String> modify(KeyAlarmRuleModifyParam keyAlarmRuleModifyParam);
/** /**
* 导出 * 导出
* @param keyAlarmRulesExportParam KeyAlarmRulesExportParam * @param keyAlarmRuleExportParam KeyAlarmRuleExportParam
* @param response HttpServletResponse * @param response HttpServletResponse
*/ */
void export(KeyAlarmRulesExportParam keyAlarmRulesExportParam, HttpServletResponse response); void export(KeyAlarmRuleExportParam keyAlarmRuleExportParam, HttpServletResponse response);
/** /**
* 分页 * 分页
* @param keyAlarmRulesPageParam KeyAlarmRulesPageParam * @param keyAlarmRulePageParam KeyAlarmRulePageParam
* @param pageParam PageParam * @param pageParam PageParam
* @return Result<PageVo<KeyAlarmRulesVo>> * @return Result<PageVo<KeyAlarmRuleVo>>
*/ */
Result<PageVo<KeyAlarmRulesVo>> page(KeyAlarmRulesPageParam keyAlarmRulesPageParam, PageParam pageParam); Result<PageVo<KeyAlarmRuleVo>> page(KeyAlarmRulePageParam keyAlarmRulePageParam, PageParam pageParam);
} }
...@@ -6,6 +6,7 @@ import com.yiring.app.vo.key.KeyAlarmVo; ...@@ -6,6 +6,7 @@ import com.yiring.app.vo.key.KeyAlarmVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
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 javax.servlet.http.HttpServletResponse;
/** /**
* 部门信息控制器 * 部门信息控制器
...@@ -21,4 +22,11 @@ public interface KeyAlarmService { ...@@ -21,4 +22,11 @@ public interface KeyAlarmService {
* @return Result<PageVo<KeyAlarmVo>> * @return Result<PageVo<KeyAlarmVo>>
*/ */
Result<PageVo<KeyAlarmVo>> page(KeyAlarmFindParam param, PageParam pageParam); Result<PageVo<KeyAlarmVo>> page(KeyAlarmFindParam param, PageParam pageParam);
/**
* 导出
* @param param KeyAlarmFindParam
* @param response HttpServletResponse
*/
void export(KeyAlarmFindParam param, HttpServletResponse response);
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.key.impl;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil;
import com.yiring.app.domain.key.KeyAlarmLog;
import com.yiring.app.domain.key.KeyAlarmLogRepository;
import com.yiring.app.param.key.KeyAlarmLogFindParam;
import com.yiring.app.service.key.KeyAlarmLogService;
import com.yiring.app.vo.key.KeyAlarmLogVo;
import com.yiring.auth.domain.user.User;
import com.yiring.common.core.Result;
import com.yiring.common.domain.BasicEntity;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Predicate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
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 LJ-2204
* @date 2022/5/13
*/
@Transactional(rollbackFor = RuntimeException.class)
@Service
@Slf4j
public class KeyAlarmLogServiceImpl implements KeyAlarmLogService {
@Resource
KeyAlarmLogRepository keyAlarmLogRepository;
@Override
public Result<PageVo<KeyAlarmLogVo>> page(KeyAlarmLogFindParam param, PageParam pageParam) {
Specification<KeyAlarmLog> specification = (root, cq, cb) -> {
List<Predicate> predicates = ListUtil.toList();
if (ObjectUtil.isNotEmpty(param.getMobile())) {
predicates.add(
cb.like(root.get(KeyAlarmLog.Fields.user).get(User.Fields.mobile), "%" + param.getMobile() + "%")
);
}
if (ObjectUtil.isNotEmpty(param.getStatus())) {
predicates.add(cb.equal(root.get(KeyAlarmLog.Fields.status), param.getStatus()));
}
if (ObjectUtil.isNotEmpty(param.getType())) {
predicates.add(cb.equal(root.get(KeyAlarmLog.Fields.types), param.getType()));
}
Order order = cb.desc(root.get(BasicEntity.Fields.createTime));
return cq.orderBy(order).where(predicates.toArray(new Predicate[0])).getRestriction();
};
Pageable pageable = PageRequest.of(pageParam.getPageNo() - 1, pageParam.getPageSize());
Page<KeyAlarmLog> keyAlarmLogs = keyAlarmLogRepository.findAll(specification, pageable);
List<KeyAlarmLogVo> keyAlarmLogVos = keyAlarmLogs
.getContent()
.stream()
.map(KeyAlarmLogVo::transform)
.collect(Collectors.toList());
PageVo<KeyAlarmLogVo> pageVo = PageVo.build(keyAlarmLogVos, keyAlarmLogs.getTotalElements());
return Result.ok(pageVo);
}
}
...@@ -4,10 +4,12 @@ package com.yiring.app.service.key.impl; ...@@ -4,10 +4,12 @@ package com.yiring.app.service.key.impl;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder;
import com.yiring.app.domain.key.KeyAlarm; import com.yiring.app.domain.key.KeyAlarm;
import com.yiring.app.domain.key.KeyAlarmRepository; import com.yiring.app.domain.key.KeyAlarmRepository;
import com.yiring.app.domain.key.KeyAlarmRules; import com.yiring.app.domain.key.KeyAlarmRule;
import com.yiring.app.domain.key.KeyAlarmRulesRepository; import com.yiring.app.domain.key.KeyAlarmRuleRepository;
import com.yiring.app.excel.key.KeyAlarmExportExcel;
import com.yiring.app.param.key.KeyAlarmFindParam; import com.yiring.app.param.key.KeyAlarmFindParam;
import com.yiring.app.service.key.KeyAlarmService; import com.yiring.app.service.key.KeyAlarmService;
import com.yiring.app.vo.key.KeyAlarmVo; import com.yiring.app.vo.key.KeyAlarmVo;
...@@ -17,14 +19,20 @@ import com.yiring.common.core.Result; ...@@ -17,14 +19,20 @@ import com.yiring.common.core.Result;
import com.yiring.common.domain.BasicEntity; import com.yiring.common.domain.BasicEntity;
import com.yiring.common.param.PageParam; import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.concurrent.Executors;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.persistence.criteria.Order; import javax.persistence.criteria.Order;
import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Predicate;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
...@@ -48,7 +56,7 @@ public class KeyAlarmServiceImpl implements KeyAlarmService { ...@@ -48,7 +56,7 @@ public class KeyAlarmServiceImpl implements KeyAlarmService {
KeyAlarmRepository keyAlarmRepository; KeyAlarmRepository keyAlarmRepository;
@Resource @Resource
KeyAlarmRulesRepository keyAlarmRulesRepository; KeyAlarmRuleRepository keyAlarmRuleRepository;
@Override @Override
public Result<PageVo<KeyAlarmVo>> page(KeyAlarmFindParam param, PageParam pageParam) { public Result<PageVo<KeyAlarmVo>> page(KeyAlarmFindParam param, PageParam pageParam) {
...@@ -101,13 +109,13 @@ public class KeyAlarmServiceImpl implements KeyAlarmService { ...@@ -101,13 +109,13 @@ public class KeyAlarmServiceImpl implements KeyAlarmService {
.build(); .build();
keyAlarmVo.setUser(userVo); keyAlarmVo.setUser(userVo);
} }
Optional<KeyAlarmRules> keyAlarmRulesOptional = keyAlarmRulesRepository.findById( Optional<KeyAlarmRule> keyAlarmRuleOptional = keyAlarmRuleRepository.findById(
leader.getDepartment().getId() leader.getDepartment().getId()
); );
if (keyAlarmRulesOptional.isPresent()) { if (keyAlarmRuleOptional.isPresent()) {
KeyAlarmRules keyAlarmRules = keyAlarmRulesOptional.get(); KeyAlarmRule keyAlarmRule = keyAlarmRuleOptional.get();
Set<User> users = keyAlarmRules.getUsers(); Set<User> users = keyAlarmRule.getUsers();
List<String> names = users.stream().map(User::getRealName).collect(Collectors.toList()); List<String> names = users.stream().map(User::getRealName).collect(Collectors.toList());
keyAlarmVo.setReceiver(StrUtil.join(",", names)); keyAlarmVo.setReceiver(StrUtil.join(",", names));
} }
...@@ -119,4 +127,94 @@ public class KeyAlarmServiceImpl implements KeyAlarmService { ...@@ -119,4 +127,94 @@ public class KeyAlarmServiceImpl implements KeyAlarmService {
return Result.ok(pageVo); return Result.ok(pageVo);
} }
@Override
public void export(KeyAlarmFindParam param, HttpServletResponse response) {
Specification<KeyAlarm> specification = (root, cq, cb) -> {
List<Predicate> predicates = ListUtil.toList();
if (ObjectUtil.isNotEmpty(param.getAreaId())) {
predicates.add(cb.equal(root.get(KeyAlarm.Fields.areaId), param.getAreaId()));
}
if (ObjectUtil.isNotEmpty(param.getName())) {
predicates.add(
cb.like(root.get(KeyAlarm.Fields.leader).get(User.Fields.realName), "%" + param.getName() + "%")
);
}
if (ObjectUtil.isNotEmpty(param.getEnable())) {
predicates.add(cb.equal(root.get(KeyAlarm.Fields.enable), param.getEnable()));
}
if (ObjectUtil.isNotEmpty(param.getCreateTime())) {
predicates.add(cb.lessThan(root.get(BasicEntity.Fields.createTime), param.getCreateTime()));
}
if (ObjectUtil.isNotEmpty(param.getEndTime())) {
predicates.add(cb.greaterThan(root.get(BasicEntity.Fields.updateTime), param.getEndTime()));
}
Order order = cb.desc(root.get(BasicEntity.Fields.createTime));
return cq.orderBy(order).where(predicates.toArray(new Predicate[0])).getRestriction();
};
List<KeyAlarm> keyAlarms = keyAlarmRepository.findAll(specification);
List<KeyAlarmExportExcel> keyAlarmExportExcels = keyAlarms
.stream()
.map(keyAlarm -> {
KeyAlarmExportExcel keyAlarmExportExcel = KeyAlarmExportExcel.transform(keyAlarm);
User leader = keyAlarm.getLeader();
if (ObjectUtil.isNotEmpty(leader)) {
keyAlarmExportExcel.setRealName(leader.getRealName());
keyAlarmExportExcel.setUuid(leader.getUuid());
}
Optional<KeyAlarmRule> keyAlarmRuleOptional = keyAlarmRuleRepository.findById(
leader.getDepartment().getId()
);
if (keyAlarmRuleOptional.isPresent()) {
KeyAlarmRule keyAlarmRule = keyAlarmRuleOptional.get();
Set<User> users = keyAlarmRule.getUsers();
List<String> names = users.stream().map(User::getRealName).collect(Collectors.toList());
keyAlarmExportExcel.setReceiver(StrUtil.join(",", names));
}
return keyAlarmExportExcel;
})
.collect(Collectors.toList());
try (
DefaultStreamExcelBuilder<KeyAlarmExportExcel> streamExcelBuilder = DefaultStreamExcelBuilder
.of(KeyAlarmExportExcel.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(keyAlarmExportExcels);
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());
}
}
} }
...@@ -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 消息内容
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.message.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yiring.app.domain.location.*;
import com.yiring.app.domain.log.ZyRealtimeLog;
import com.yiring.app.domain.log.ZyRealtimeLogRepository;
import com.yiring.app.service.message.ZyMessageService;
import com.yiring.app.util.GeoUtils;
import com.yiring.auth.domain.user.User;
import com.yiring.common.annotation.Times;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.Point;
import org.springframework.data.domain.Example;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* 真源消息处理实现类
*
* @author Jim
* @version 0.1
* 2022/5/9 10:22
*/
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
public class ZyMessageServiceImpl implements ZyMessageService {
@Resource
LocationTagRepository locationTagRepository;
@Resource
LocationLogRepository locationLogRepository;
@Resource
SimpMessagingTemplate simpMessagingTemplate;
@Resource
ZyRealtimeLogRepository zyRealtimeLogRepository;
@Times
@Override
public void consume(String message) {
// 将消息转换成 JSON 格式
JSONObject info = JSON.parseObject(message);
log.info("Receiver Message: {}", info);
// 解构消息内容
JSONObject data = info.getJSONObject("params");
String method = info.getString("method");
// 记录日志
ZyRealtimeLog realtimeLog = ZyRealtimeLog.builder().method(method).raw(info).build();
zyRealtimeLogRepository.save(realtimeLog);
// 业务处理
switch (method) {
// 实时定位
case "position" -> processPositionMessage(data);
// 设备低电量
case "lowPower" -> processLowPowerMessage(data);
// 设备状态变更
case "deviceStatus" -> processDeviceStatusMessage(data);
// 按键报警
case "keyWarning" -> processKeyWarningMessage(data);
// 围栏报警
case "enclosure" -> log.warn("Ignore Message Type [enclosure]: {}", info);
default -> log.warn("Unknown Message Type: {}", info);
}
}
/**
* 处理定位消息
* @param data 消息内容
*/
public void processPositionMessage(JSONObject data) {
// TODO
log.info("Position Message: {}", data);
// 包装消息
// TODO
// 1. 解析消息内容,进行围栏、出入标识判断等处理,将定位记录录入数据库
// 2. 创建一条需要进行消息推送的记录
// 3. 将记录推送的消息推送模块
// 4. 检查是否触发围栏告警,记录告警数据,并推送消息
// 查询定位标签
String tagId = data.getString("tagId");
Example<LocationTag> example = Example.of(LocationTag.builder().code(tagId).build());
Optional<LocationTag> optional = locationTagRepository.findOne(example);
if (optional.isEmpty()) {
log.warn("Tag Not Found: {}", tagId);
return;
}
// 构建复合主键
LocationTag tag = optional.get();
TagTimeId id = new TagTimeId(tag);
// 定位时间
Instant instant = Instant.ofEpochMilli(data.getLongValue("locationTime"));
LocalDateTime locationTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
// 定位的基本信息
LocationLog locationLog = LocationLog
.builder()
.id(id)
.locationTime(locationTime)
.areaId(data.getLong("areaId"))
.floor(data.getString("floor"))
.silent(data.getBoolean("silent"))
.volt(data.getInteger("volt"))
.voltUnit(data.getString("voltUnit"))
.raw(data)
.build();
// 获取定位卡当前绑定的用户
User user = tag.getUser();
if (user != null) {
// 定位标签当时所属的用户
locationLog.setUser(user);
// 查询当前用户的状态
locationLog.setStatus(user.getStatus());
}
// 设置空间点位信息
Point point = GeoUtils.createPoint(
data.getDoubleValue("longitude"),
data.getDoubleValue("latitude"),
data.getDoubleValue("altitude")
);
locationLog.setPoint(point);
// 定位信标
Set<String> codes = Arrays
.stream(data.getString("beacons").split(","))
.map(beacon -> beacon.replaceAll("\\(.*\\)", ""))
.collect(Collectors.toSet());
locationLog.setBeacons(new JSONArray().fluentAddAll(codes));
// TODO
// 并计算出入标记(围栏、区域)
// 写入数据
locationLogRepository.saveAndFlush(locationLog);
// 更新定位标签卡状态信息
tag.setPoint(locationLog.getPoint());
tag.setVolt(locationLog.getVolt());
tag.setVoltUnit(locationLog.getVoltUnit());
tag.setSilent(locationLog.getSilent());
locationTagRepository.save(tag);
// WebSocket 推送定位消息
// 消息内容需要确定 TODO
simpMessagingTemplate.convertAndSend("/topic/position", "{}");
// TODO
// 判断围栏告警是否触发,触发写入告警记录,并推送消息
}
/**
* 处理低电量报警消息
* @param data 消息内容
*/
public void processLowPowerMessage(JSONObject data) {
// TODO
log.info("LowPower Message: {}", data);
}
/**
* 处理设备状态更新消息
* @param data 消息内容
*/
public void processDeviceStatusMessage(JSONObject data) {
// TODO
log.info("DeviceStatus Message: {}", data);
}
/**
* 处理按键报警消息
* @param data 消息内容
*/
public void processKeyWarningMessage(JSONObject data) {
// TODO
log.info("KeyWarning Message: {}", data);
}
}
/* (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();
} }
......
...@@ -434,12 +434,6 @@ public class UserAppServiceImpl implements UserAppService { ...@@ -434,12 +434,6 @@ public class UserAppServiceImpl implements UserAppService {
.filter(userImportExcel -> .filter(userImportExcel ->
userRepository.count(Example.of(User.builder().uuid(userImportExcel.getUuid()).build())) == 0 userRepository.count(Example.of(User.builder().uuid(userImportExcel.getUuid()).build())) == 0
) )
.filter(userImportExcel ->
locationTagRepository.count(
Example.of(LocationTag.builder().code(userImportExcel.getCode()).used(true).build())
) ==
0
)
.collect(Collectors.toList()); .collect(Collectors.toList());
userImportExcels.forEach(userImportExcel -> { userImportExcels.forEach(userImportExcel -> {
...@@ -475,14 +469,11 @@ public class UserAppServiceImpl implements UserAppService { ...@@ -475,14 +469,11 @@ public class UserAppServiceImpl implements UserAppService {
Object id = JSONUtil.parseObj(records.get(0)).get("id"); Object id = JSONUtil.parseObj(records.get(0)).get("id");
Post post = postMap.get(userImportExcel.getPostName()).get(0); Post post = postMap.get(userImportExcel.getPostName()).get(0);
user.setLinkId(Convert.toLong(id)); user.setLinkId(Convert.toLong(id));
user.setDepartment(department); user.setDepartment(department);
user.setPost(post); user.setPost(post);
User saveUser = userRepository.save(user); userRepository.save(user);
if (StrUtil.isNotEmpty(userImportExcel.getCode())) {
LocationTag locationTag = LocationTag.builder().code(userImportExcel.getCode()).user(saveUser).build();
locationTagRepository.save(locationTag);
}
}); });
return Result.ok(); 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);
} }
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.util;
import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.LinkedList;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class ZipUtils {
/**
* 解压文件
* @param file 压缩文件
* @param targetDir 解压文件输出的目录
* @throws IOException IOException
*/
public static void unPacket(Path file, Path targetDir) throws IOException {
if (!Files.exists(targetDir)) {
Files.createDirectories(targetDir);
}
// 创建zip对象
try (ZipFile zipFile = new ZipFile(file.toFile())) {
// 读取zip流
try (ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(file))) {
ZipEntry zipEntry;
// 遍历每一个zip项
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
// 获取zip项目名称
String entryName = zipEntry.getName();
// 构建绝对路径
Path entryFile = targetDir.resolve(entryName);
if (zipEntry.isDirectory()) { // 文件夹
if (!Files.isDirectory(entryFile)) {
Files.createDirectories(entryFile);
}
} else { // 文件
// 读取zip项数据流
try (InputStream zipEntryInputStream = zipFile.getInputStream(zipEntry)) {
try (
OutputStream fileOutputStream = Files.newOutputStream(
entryFile,
StandardOpenOption.CREATE_NEW
)
) {
byte[] buffer = new byte[4096];
int length;
while ((length = zipEntryInputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, length);
}
fileOutputStream.flush();
}
}
}
}
}
}
}
/**
* 压缩指定的文件
* @param files Path[]
* @param zipFile Path
* @throws IOException IOException
*/
public static void packet(Path[] files, Path zipFile) throws IOException {
OutputStream outputStream = Files.newOutputStream(zipFile, StandardOpenOption.CREATE_NEW);
try (outputStream; ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream)) {
for (Path file : files) {
if (Files.isDirectory(file)) {
continue;
}
try (InputStream inputStream = Files.newInputStream(file)) {
// 创建一个压缩项,指定名称
ZipEntry zipEntry = new ZipEntry(file.getFileName().toString());
// 添加到压缩流
zipOutputStream.putNextEntry(zipEntry);
// 写入数据
int len;
byte[] buffer = new byte[1024 * 10];
while ((len = inputStream.read(buffer)) > 0) {
zipOutputStream.write(buffer, 0, len);
}
zipOutputStream.flush();
}
}
// 完成所有压缩项的添加
zipOutputStream.closeEntry();
}
}
/**
* 压缩指定的文件
* @param files Map<String, File>
* @param outputStream OutputStream
*/
public static void packet(Map<String, File> files, OutputStream outputStream) {
try (outputStream; ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream)) {
for (Map.Entry<String, File> file : files.entrySet()) {
String fileName = file.getKey();
File fileValue = file.getValue();
try (InputStream inputStream = new BufferedInputStream(new FileInputStream(fileValue))) {
// 创建一个压缩项,指定名称
ZipEntry zipEntry = new ZipEntry(fileName);
// 添加到压缩流
zipOutputStream.putNextEntry(zipEntry);
// 写入数据
int len;
byte[] buffer = new byte[1024 * 10];
while ((len = inputStream.read(buffer)) > 0) {
zipOutputStream.write(buffer, 0, len);
}
zipOutputStream.flush();
}
}
// 完成所有压缩项的添加
zipOutputStream.closeEntry();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 压缩指定的目录
* @param folder Path
* @param zipFile Path
* @throws IOException IOException
*/
public static void packet(Path folder, Path zipFile) throws IOException {
if (!Files.isDirectory(folder)) {
throw new IllegalArgumentException(folder + " 不是合法的文件夹");
}
OutputStream outputStream = Files.newOutputStream(zipFile, StandardOpenOption.CREATE_NEW);
LinkedList<String> path = new LinkedList<>();
try (outputStream; ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream)) {
Files.walkFileTree(
folder,
new FileVisitor<>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
if (!dir.equals(folder)) {
// 开始遍历目录
String folder = dir.getFileName().toString();
path.addLast(folder);
// 写入目录
ZipEntry zipEntry = new ZipEntry(path.stream().collect(Collectors.joining("/", "", "/")));
try {
zipOutputStream.putNextEntry(zipEntry);
zipOutputStream.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
// 开始遍历文件
try (InputStream inputStream = Files.newInputStream(file)) {
// 创建一个压缩项,指定名称
String fileName = path.size() > 0
? path.stream().collect(Collectors.joining("/", "", "")) +
"/" +
file.getFileName().toString()
: file.getFileName().toString();
ZipEntry zipEntry = new ZipEntry(fileName);
// 添加到压缩流
zipOutputStream.putNextEntry(zipEntry);
// 写入数据
int len;
byte[] buffer = new byte[1024 * 10];
while ((len = inputStream.read(buffer)) > 0) {
zipOutputStream.write(buffer, 0, len);
}
zipOutputStream.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
// 结束遍历目录
if (!path.isEmpty()) {
path.removeLast();
}
return FileVisitResult.CONTINUE;
}
}
);
zipOutputStream.closeEntry();
}
}
}
...@@ -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
......
...@@ -14,13 +14,14 @@ import lombok.NoArgsConstructor; ...@@ -14,13 +14,14 @@ import lombok.NoArgsConstructor;
import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Point;
/** /**
* 历史轨迹信息VO
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/5/6 14:18 * @date 2022/5/6 14:18
*/ */
@Data @Data
@Builder @Builder
@ApiModel("历史轨迹信息VO") @ApiModel("HistoryRouteVo")
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class HistoryRouteVo implements Serializable { public class HistoryRouteVo implements Serializable {
......
...@@ -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
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.key;
import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.domain.key.KeyAlarmLog;
import com.yiring.app.vo.user.UserVo;
import com.yiring.auth.domain.user.User;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* 按键报警推送
*
* @author LJ-2204
* @date 2022/5/13
*/
@ApiModel("KeyAlarmLogVo")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmLogVo implements Serializable {
@Serial
private static final long serialVersionUID = 9135155632502530938L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "主键", example = "111")
Long id;
@ApiModelProperty(value = "用户", example = "111")
UserVo userVo;
@ApiModelProperty(value = "通知方式", example = "SMS/APP")
String type;
@ApiModelProperty(value = "接收状态", example = "T/F")
Boolean status;
@ApiModelProperty(value = "接收时间", example = "2011-11-11 22:22:22")
LocalDateTime updateTime;
public static KeyAlarmLogVo transform(KeyAlarmLog keyAlarmLog) {
KeyAlarmLogVo keyAlarmLogVo = KeyAlarmLogVo
.builder()
.id(keyAlarmLog.getId())
.type(keyAlarmLog.getTypes())
.status(keyAlarmLog.getStatus())
.updateTime(keyAlarmLog.getUpdateTime())
.build();
if (ObjectUtil.isNotEmpty(keyAlarmLog.getUser())) {
User user = keyAlarmLog.getUser();
keyAlarmLogVo.setUserVo(
UserVo.builder().id(user.getId()).realName(user.getRealName()).mobile(user.getMobile()).build()
);
}
return keyAlarmLogVo;
}
}
...@@ -3,7 +3,7 @@ package com.yiring.app.vo.key; ...@@ -3,7 +3,7 @@ package com.yiring.app.vo.key;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.domain.key.KeyAlarmRules; import com.yiring.app.domain.key.KeyAlarmRule;
import com.yiring.app.vo.user.UserInfoVo; import com.yiring.app.vo.user.UserInfoVo;
import com.yiring.auth.domain.user.User; import com.yiring.auth.domain.user.User;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
...@@ -23,13 +23,13 @@ import lombok.experimental.FieldDefaults; ...@@ -23,13 +23,13 @@ import lombok.experimental.FieldDefaults;
* @date 2022/5/7 * @date 2022/5/7
*/ */
@ApiModel("KeyAlarmRulesVo") @ApiModel("KeyAlarmRuleVo")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmRulesVo implements Serializable { public class KeyAlarmRuleVo implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 5083435104462641333L; private static final long serialVersionUID = 5083435104462641333L;
...@@ -51,17 +51,17 @@ public class KeyAlarmRulesVo implements Serializable { ...@@ -51,17 +51,17 @@ public class KeyAlarmRulesVo implements Serializable {
@ApiModelProperty(value = "推送类型", example = "111") @ApiModelProperty(value = "推送类型", example = "111")
String[] types; String[] types;
public static KeyAlarmRulesVo transform(KeyAlarmRules keyAlarmRules) { public static KeyAlarmRuleVo transform(KeyAlarmRule keyAlarmRule) {
Set<User> users = keyAlarmRules.getUsers(); Set<User> users = keyAlarmRule.getUsers();
List<UserInfoVo> userInfoVos = users.stream().map(UserInfoVo::transform).collect(Collectors.toList()); List<UserInfoVo> userInfoVos = users.stream().map(UserInfoVo::transform).collect(Collectors.toList());
return KeyAlarmRulesVo return KeyAlarmRuleVo
.builder() .builder()
.id(keyAlarmRules.getId()) .id(keyAlarmRule.getId())
.deptId(keyAlarmRules.getDepartment().getId()) .deptId(keyAlarmRule.getDepartment().getId())
.deptName(keyAlarmRules.getDepartment().getName()) .deptName(keyAlarmRule.getDepartment().getName())
.users(userInfoVos) .users(userInfoVos)
.types(keyAlarmRules.getTypes().split(",")) .types(keyAlarmRule.getTypes().split(","))
.build(); .build();
} }
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论