提交 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);
}
}
...@@ -5,15 +5,15 @@ import cn.hutool.core.collection.ListUtil; ...@@ -5,15 +5,15 @@ import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder; import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder;
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.KeyAlarmRulesExportExcel; import com.yiring.app.excel.key.KeyAlarmRuleExportExcel;
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.service.key.KeyAlarmRulesService; import com.yiring.app.service.key.KeyAlarmRuleService;
import com.yiring.app.vo.key.KeyAlarmRulesVo; import com.yiring.app.vo.key.KeyAlarmRuleVo;
import com.yiring.auth.domain.dept.Department; import com.yiring.auth.domain.dept.Department;
import com.yiring.auth.domain.user.User; import com.yiring.auth.domain.user.User;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
...@@ -37,6 +37,7 @@ import javax.persistence.criteria.Predicate; ...@@ -37,6 +37,7 @@ import javax.persistence.criteria.Predicate;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.data.domain.Example;
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;
...@@ -54,15 +55,28 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -54,15 +55,28 @@ import org.springframework.transaction.annotation.Transactional;
@Transactional(rollbackFor = RuntimeException.class) @Transactional(rollbackFor = RuntimeException.class)
@Service @Service
@Slf4j @Slf4j
public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService { public class KeyAlarmRuleServiceImpl implements KeyAlarmRuleService {
@Resource @Resource
KeyAlarmRulesRepository keyAlarmRulesRepository; KeyAlarmRuleRepository keyAlarmRuleRepository;
@Override @Override
public Result<String> add(KeyAlarmRulesAddParam keyAlarmRulesAddParam) { public Result<String> add(KeyAlarmRuleAddParam keyAlarmRuleAddParam) {
long count = keyAlarmRuleRepository.count(
Example.of(
KeyAlarmRule
.builder()
.department(Department.builder().id(keyAlarmRuleAddParam.getDeptId()).build())
.build()
)
);
if (count > 0) {
return Result.no(Status.BAD_REQUEST);
}
HashSet<User> users = new HashSet<>(); HashSet<User> users = new HashSet<>();
String[] strings = keyAlarmRulesAddParam.getUserIds().split(","); String[] strings = keyAlarmRuleAddParam.getUserIds().split(",");
Long[] ids = Convert.toLongArray(strings); Long[] ids = Convert.toLongArray(strings);
if (ids.length < 3) { if (ids.length < 3) {
return Result.no(Status.BAD_REQUEST, "报警接收人至少3个"); return Result.no(Status.BAD_REQUEST, "报警接收人至少3个");
...@@ -70,36 +84,34 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService { ...@@ -70,36 +84,34 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService {
for (Long id : ids) { for (Long id : ids) {
users.add(User.builder().id(id).build()); users.add(User.builder().id(id).build());
} }
KeyAlarmRules keyAlarmRules = KeyAlarmRules KeyAlarmRule keyAlarmRule = KeyAlarmRule
.builder() .builder()
.department(Department.builder().id(keyAlarmRulesAddParam.getDeptId()).build()) .department(Department.builder().id(keyAlarmRuleAddParam.getDeptId()).build())
.users(users) .users(users)
.types(keyAlarmRulesAddParam.getTypes()) .types(keyAlarmRuleAddParam.getTypes())
.build(); .build();
keyAlarmRulesRepository.save(keyAlarmRules); keyAlarmRuleRepository.save(keyAlarmRule);
return Result.ok(); return Result.ok();
} }
@Override @Override
public Result<String> delete(IdParam idParam) { public Result<String> delete(IdParam idParam) {
Optional<KeyAlarmRules> keyAlarmRulesOptional = keyAlarmRulesRepository.findById(idParam.getId()); Optional<KeyAlarmRule> keyAlarmRuleOptional = keyAlarmRuleRepository.findById(idParam.getId());
if (keyAlarmRulesOptional.isEmpty()) return Result.no(Status.BAD_REQUEST, "报警规则不存在"); if (keyAlarmRuleOptional.isEmpty()) return Result.no(Status.BAD_REQUEST, "报警规则不存在");
keyAlarmRulesRepository.delete(keyAlarmRulesOptional.get()); keyAlarmRuleRepository.delete(keyAlarmRuleOptional.get());
return Result.ok(); return Result.ok();
} }
@Override @Override
public Result<String> modify(KeyAlarmRulesModifyParam keyAlarmRulesModifyParam) { public Result<String> modify(KeyAlarmRuleModifyParam keyAlarmRuleModifyParam) {
Optional<KeyAlarmRules> keyAlarmRulesOptional = keyAlarmRulesRepository.findById( Optional<KeyAlarmRule> keyAlarmRuleOptional = keyAlarmRuleRepository.findById(keyAlarmRuleModifyParam.getId());
keyAlarmRulesModifyParam.getId()
);
if (keyAlarmRulesOptional.isEmpty()) return Result.no(Status.BAD_REQUEST, "报警规则不存在"); if (keyAlarmRuleOptional.isEmpty()) return Result.no(Status.BAD_REQUEST, "报警规则不存在");
HashSet<User> users = new HashSet<>(); HashSet<User> users = new HashSet<>();
String[] strings = keyAlarmRulesModifyParam.getUserIds().split(","); String[] strings = keyAlarmRuleModifyParam.getUserIds().split(",");
Long[] ids = Convert.toLongArray(strings); Long[] ids = Convert.toLongArray(strings);
if (ids.length < 3) { if (ids.length < 3) {
return Result.no(Status.BAD_REQUEST, "报警接收人至少3个"); return Result.no(Status.BAD_REQUEST, "报警接收人至少3个");
...@@ -108,33 +120,33 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService { ...@@ -108,33 +120,33 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService {
users.add(User.builder().id(id).build()); users.add(User.builder().id(id).build());
} }
KeyAlarmRules keyAlarmRules = keyAlarmRulesOptional.get(); KeyAlarmRule keyAlarmRule = keyAlarmRuleOptional.get();
keyAlarmRules.setDepartment(Department.builder().id(keyAlarmRulesModifyParam.getDeptId()).build()); keyAlarmRule.setDepartment(Department.builder().id(keyAlarmRuleModifyParam.getDeptId()).build());
keyAlarmRules.setUsers(users); keyAlarmRule.setUsers(users);
keyAlarmRules.setTypes(keyAlarmRulesModifyParam.getTypes()); keyAlarmRule.setTypes(keyAlarmRuleModifyParam.getTypes());
keyAlarmRulesRepository.save(keyAlarmRules); keyAlarmRuleRepository.save(keyAlarmRule);
return Result.ok(); return Result.ok();
} }
@Override @Override
public void export(KeyAlarmRulesExportParam keyAlarmRulesExportParam, HttpServletResponse response) { public void export(KeyAlarmRuleExportParam keyAlarmRuleExportParam, HttpServletResponse response) {
Specification<KeyAlarmRules> specification = (root, cq, cb) -> { Specification<KeyAlarmRule> specification = (root, cq, cb) -> {
List<Predicate> predicates = ListUtil.toList(); List<Predicate> predicates = ListUtil.toList();
if (StrUtil.isNotEmpty(keyAlarmRulesExportParam.getDeptIds())) { if (StrUtil.isNotEmpty(keyAlarmRuleExportParam.getDeptIds())) {
String[] ids = keyAlarmRulesExportParam.getDeptIds().split(","); String[] ids = keyAlarmRuleExportParam.getDeptIds().split(",");
CriteriaBuilder.In<Object> in = cb.in( CriteriaBuilder.In<Object> in = cb.in(
root.get(KeyAlarmRules.Fields.department).get(BasicEntity.Fields.id) root.get(KeyAlarmRule.Fields.department).get(BasicEntity.Fields.id)
); );
for (String id : ids) in.value(Convert.toLong(id)); for (String id : ids) in.value(Convert.toLong(id));
predicates.add(in); predicates.add(in);
} }
if (StrUtil.isNotEmpty(keyAlarmRulesExportParam.getTypes())) { if (StrUtil.isNotEmpty(keyAlarmRuleExportParam.getTypes())) {
String[] types = keyAlarmRulesExportParam.getTypes().split(","); String[] types = keyAlarmRuleExportParam.getTypes().split(",");
for (String type : types) { for (String type : types) {
predicates.add(cb.like(root.get(KeyAlarmRules.Fields.types), "%" + type + "%")); predicates.add(cb.like(root.get(KeyAlarmRule.Fields.types), "%" + type + "%"));
} }
} }
...@@ -143,15 +155,15 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService { ...@@ -143,15 +155,15 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService {
return cq.orderBy(order).where(predicates.toArray(new Predicate[0])).getRestriction(); return cq.orderBy(order).where(predicates.toArray(new Predicate[0])).getRestriction();
}; };
List<KeyAlarmRules> keyAlarmRules = keyAlarmRulesRepository.findAll(specification); List<KeyAlarmRule> keyAlarmRules = keyAlarmRuleRepository.findAll(specification);
List<KeyAlarmRulesExportExcel> keyAlarmRulesExportExcels = keyAlarmRules List<KeyAlarmRuleExportExcel> keyAlarmRuleExportExcels = keyAlarmRules
.stream() .stream()
.map(KeyAlarmRulesExportExcel::transform) .map(KeyAlarmRuleExportExcel::transform)
.collect(Collectors.toList()); .collect(Collectors.toList());
try ( try (
DefaultStreamExcelBuilder<KeyAlarmRulesExportExcel> streamExcelBuilder = DefaultStreamExcelBuilder DefaultStreamExcelBuilder<KeyAlarmRuleExportExcel> streamExcelBuilder = DefaultStreamExcelBuilder
.of(KeyAlarmRulesExportExcel.class) .of(KeyAlarmRuleExportExcel.class)
.threadPool(Executors.newFixedThreadPool(2)) .threadPool(Executors.newFixedThreadPool(2))
.rowHeight(14) .rowHeight(14)
.titleRowHeight(14) .titleRowHeight(14)
...@@ -161,7 +173,7 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService { ...@@ -161,7 +173,7 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService {
) )
.start() .start()
) { ) {
streamExcelBuilder.append(keyAlarmRulesExportExcels); streamExcelBuilder.append(keyAlarmRuleExportExcels);
String fileName = URLEncoder.encode("按键报警规则信息.xlsx", StandardCharsets.UTF_8); String fileName = URLEncoder.encode("按键报警规则信息.xlsx", StandardCharsets.UTF_8);
...@@ -183,23 +195,23 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService { ...@@ -183,23 +195,23 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService {
} }
@Override @Override
public Result<PageVo<KeyAlarmRulesVo>> page(KeyAlarmRulesPageParam keyAlarmRulesPageParam, PageParam pageParam) { public Result<PageVo<KeyAlarmRuleVo>> page(KeyAlarmRulePageParam keyAlarmRulePageParam, PageParam pageParam) {
Specification<KeyAlarmRules> specification = (root, cq, cb) -> { Specification<KeyAlarmRule> specification = (root, cq, cb) -> {
List<Predicate> predicates = ListUtil.toList(); List<Predicate> predicates = ListUtil.toList();
if (StrUtil.isNotEmpty(keyAlarmRulesPageParam.getDeptIds())) { if (StrUtil.isNotEmpty(keyAlarmRulePageParam.getDeptIds())) {
String[] ids = keyAlarmRulesPageParam.getDeptIds().split(","); String[] ids = keyAlarmRulePageParam.getDeptIds().split(",");
CriteriaBuilder.In<Object> in = cb.in( CriteriaBuilder.In<Object> in = cb.in(
root.get(KeyAlarmRules.Fields.department).get(BasicEntity.Fields.id) root.get(KeyAlarmRule.Fields.department).get(BasicEntity.Fields.id)
); );
for (String id : ids) in.value(Convert.toLong(id)); for (String id : ids) in.value(Convert.toLong(id));
predicates.add(in); predicates.add(in);
} }
if (StrUtil.isNotEmpty(keyAlarmRulesPageParam.getTypes())) { if (StrUtil.isNotEmpty(keyAlarmRulePageParam.getTypes())) {
String[] types = keyAlarmRulesPageParam.getTypes().split(","); String[] types = keyAlarmRulePageParam.getTypes().split(",");
for (String type : types) { for (String type : types) {
predicates.add(cb.like(root.get(KeyAlarmRules.Fields.types), "%" + type + "%")); predicates.add(cb.like(root.get(KeyAlarmRule.Fields.types), "%" + type + "%"));
} }
} }
...@@ -209,13 +221,13 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService { ...@@ -209,13 +221,13 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService {
}; };
Pageable pageable = PageRequest.of(pageParam.getPageNo() - 1, pageParam.getPageSize()); Pageable pageable = PageRequest.of(pageParam.getPageNo() - 1, pageParam.getPageSize());
Page<KeyAlarmRules> pages = keyAlarmRulesRepository.findAll(specification, pageable); Page<KeyAlarmRule> pages = keyAlarmRuleRepository.findAll(specification, pageable);
List<KeyAlarmRulesVo> keyAlarmRulesVos = pages List<KeyAlarmRuleVo> keyAlarmRuleVos = pages
.getContent() .getContent()
.stream() .stream()
.map(KeyAlarmRulesVo::transform) .map(KeyAlarmRuleVo::transform)
.collect(Collectors.toList()); .collect(Collectors.toList());
PageVo<KeyAlarmRulesVo> pageVo = PageVo.build(keyAlarmRulesVos, pages.getTotalElements()); PageVo<KeyAlarmRuleVo> pageVo = PageVo.build(keyAlarmRuleVos, pages.getTotalElements());
return Result.ok(pageVo); 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.district.District;
import com.yiring.app.domain.district.DistrictRepository;
import com.yiring.app.domain.key.*;
import com.yiring.app.domain.location.*;
import com.yiring.app.domain.log.ZyRealtimeLog;
import com.yiring.app.domain.log.ZyRealtimeLogRepository;
import com.yiring.app.param.key.KeyAlarmAddParam;
import com.yiring.app.service.message.PositionMessageService;
import com.yiring.app.util.GeoUtils;
import com.yiring.auth.domain.dept.Department;
import com.yiring.auth.domain.user.User;
import com.yiring.auth.domain.user.UserRepository;
import com.yiring.common.annotation.Times;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.annotation.Resource;
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.Point;
import org.springframework.data.domain.*;
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 PositionMessageServiceImpl implements PositionMessageService {
@Resource
LocationTagRepository locationTagRepository;
@Resource
LocationLogRepository locationLogRepository;
@Resource
LocationFenceRepository locationFenceRepository;
@Resource
DistrictRepository districtRepository;
@Resource
LocationTurnoverRepository locationTurnoverRepository;
@Resource
SimpMessagingTemplate simpMessagingTemplate;
@Resource
ZyRealtimeLogRepository zyRealtimeLogRepository;
@Resource
KeyAlarmRepository keyAlarmRepository;
@Resource
KeyAlarmLogRepository keyAlarmLogRepository;
@Resource
KeyAlarmRuleRepository keyAlarmRuleRepository;
@Resource
UserRepository userRepository;
@Times("Message Consume")
@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)
.raw(data)
.locationTime(locationTime)
.areaId(data.getLong("areaId"))
.floor(data.getString("floor"))
.silent(data.getBoolean("silent"))
.volt(data.getInteger("volt"))
.voltUnit(data.getString("voltUnit"))
.out(data.getBoolean("out"))
.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> beaconCodes = Arrays
.stream(data.getString("beacons").split(","))
.map(beacon -> beacon.replaceAll("\\(.*\\)", ""))
.collect(Collectors.toSet());
locationLog.setBeacons(new JSONArray().fluentAddAll(beaconCodes));
// 计算出入标记(围栏、区域)
List<LocationTurnover> turnovers = new ArrayList<>();
// 查询定位在围栏内的围栏信息
List<LocationFence> fences = locationFenceRepository.findByGeometryContains(point);
Set<Long> fenceIds = fences.stream().map(LocationFence::getId).collect(Collectors.toSet());
locationLog.setFences(new JSONArray().fluentAddAll(fenceIds));
// 计算围栏进出
for (LocationFence fence : fences) {
// 查询当前围栏的防抖时间内的所有定位记录
List<LocationLog> logs = findByTagTimeIdAndThreshold(id, fence.getThreshold());
List<JSONArray> list = logs.stream().map(LocationLog::getFences).toList();
if (list.isEmpty()) {
continue;
}
// 检查是否进入区域
Boolean isEnter = checkEnter(list, fence.getId());
if (isEnter != null) {
// 检查是否为重复进入/退出
Optional<LocationTurnover> enter = findRepeatTurnoverRecord(
fence.getId(),
LocationTurnover.Type.FENCE,
id.getTag(),
isEnter
);
if (enter.isEmpty()) {
// 尝试将上一次记录标记为非最新记录
trySetPrevTurnoverExpired(fence.getId(), LocationTurnover.Type.FENCE, id.getTag());
// 当前标签进入/离开围栏的动作标记为最新记录
LocationTurnover turnover = LocationTurnover
.builder()
.enter(isEnter)
.type(LocationTurnover.Type.FENCE)
.sourceId(fence.getId())
.tag(id.getTag())
.time(id.getTime())
.isLatest(true)
.build();
turnovers.add(turnover);
// 更新围栏内的标签
fence.setTags(resetInTags(tag, isEnter, fence.getTags()));
// 有人员进出围栏,需要检查是否触发围栏报警规则
// TODO: 通过定时任务调度异步实现,提高定位消息消费能力
// 1. 判断是否触发围栏报警规则,触发则记录报警记录,同时记录报警记录触发所需推送的消息
// 2. 同时进行 WebSocket 消息推送
}
}
}
// 查询定位在区域内的区域信息
List<District> districts = districtRepository.findByGeometryContains(point);
Set<Long> districtIds = districts.stream().map(District::getId).collect(Collectors.toSet());
locationLog.setDistricts(new JSONArray().fluentAddAll(districtIds));
// 计算区域进出
for (District district : districts) {
// 查询当前区域的防抖时间内的所有定位记录
List<LocationLog> logs = findByTagTimeIdAndThreshold(id, district.getDebouncingDuration());
List<JSONArray> list = logs.stream().map(LocationLog::getDistricts).toList();
if (list.isEmpty()) {
continue;
}
// 检查是否进入区域
Boolean isEnter = checkEnter(list, district.getId());
if (isEnter != null) {
// 检查是否为重复进入/退出
Optional<LocationTurnover> enter = findRepeatTurnoverRecord(
district.getId(),
LocationTurnover.Type.DISTRICT,
id.getTag(),
isEnter
);
if (enter.isEmpty()) {
// 尝试将上一次记录标记为非最新记录
trySetPrevTurnoverExpired(district.getId(), LocationTurnover.Type.DISTRICT, id.getTag());
// 当前标签进入/离开围栏的动作标记为最新记录
LocationTurnover turnover = LocationTurnover
.builder()
.enter(isEnter)
.type(LocationTurnover.Type.DISTRICT)
.sourceId(district.getId())
.tag(id.getTag())
.time(id.getTime())
.isLatest(true)
.build();
turnovers.add(turnover);
// 更新区域内的标签
district.setTags(resetInTags(tag, isEnter, district.getTags()));
}
}
}
// 写入定位数据
locationLogRepository.saveAndFlush(locationLog);
// 更新定位标签卡状态信息
tag.setOut(locationLog.getOut());
tag.setPoint(locationLog.getPoint());
tag.setVolt(locationLog.getVolt());
tag.setVoltUnit(locationLog.getVoltUnit());
tag.setSilent(locationLog.getSilent());
locationTagRepository.save(tag);
// 更新围栏内的标签数据
locationFenceRepository.saveAll(fences);
// 更新区域内的标签数据
districtRepository.saveAll(districts);
// 写入围栏/区域进出记录
locationTurnoverRepository.saveAll(turnovers);
// WebSocket 推送定位消息
// 消息内容需要确定 TODO
JSONObject message = new JSONObject();
message.put("type", "location");
message.put("time", id.getTime());
message.put("tagId", id.getTag().getId());
message.put("tagCode", id.getTag().getCode());
message.put("entityId", locationLog.getPoint());
message.put("point", locationLog.getPoint());
simpMessagingTemplate.convertAndSend("/topic/position", message.toJSONString());
}
/**
* 根据定位日志 ID 和防抖时间查询定位日志
* @param id 定位日志 ID
* @param threshold 防抖时间
* @return 定位日志集合
*/
public List<LocationLog> findByTagTimeIdAndThreshold(TagTimeId id, int threshold) {
return locationLogRepository.findAll((root, query, cb) -> {
Predicate predicate = cb.conjunction();
List<Expression<Boolean>> expressions = predicate.getExpressions();
expressions.add(cb.equal(root.get("id").get("tag"), id.getTag()));
expressions.add(cb.greaterThanOrEqualTo(root.get("id").get("time"), id.getTime().minusSeconds(threshold)));
expressions.add(cb.lessThanOrEqualTo(root.get("id").get("time"), id.getTime()));
return predicate;
});
}
/**
* 根据防抖期间进入的区域/围栏以及新产生的围栏/区域记录,判断是否进入
* @param array 区域/围栏集合
* @param id 区域/围栏 ID
* @return true 进入,false 退出,null 未发生变化
*/
public Boolean checkEnter(List<JSONArray> array, Long id) {
long count = array.stream().filter(ids -> ids != null && ids.contains(id)).count();
Boolean isEnter = null;
if (count == array.size()) {
isEnter = true;
} else if (count == 0) {
isEnter = false;
}
return isEnter;
}
/**
* 查找
* @param sourceId 区域/围栏 ID
* @param type 类型(区域/围栏)
* @param tag 定位标签
* @param enter true 进入,false 退出
* @return true 重复进入,false 非重复进入
*/
public Optional<LocationTurnover> findRepeatTurnoverRecord(
Long sourceId,
LocationTurnover.Type type,
LocationTag tag,
Boolean enter
) {
Pageable pageable = PageRequest.of(0, 1, Sort.by(Sort.Order.desc(LocationTurnover.Fields.time)));
Page<LocationTurnover> page = locationTurnoverRepository.findAll(
(root, query, cb) -> {
Predicate predicate = cb.conjunction();
List<Expression<Boolean>> expressions = predicate.getExpressions();
expressions.add(cb.equal(root.get(LocationTurnover.Fields.sourceId), sourceId));
expressions.add(cb.equal(root.get(LocationTurnover.Fields.type), type));
expressions.add(cb.equal(root.get(LocationTurnover.Fields.tag), tag));
return predicate;
},
pageable
);
if (page.getTotalElements() > 0) {
// 检查是否重复进入
Stream<LocationTurnover> stream = page.get();
if (enter == null || stream.anyMatch(turnover -> turnover.getEnter() == enter)) {
return stream.findFirst();
}
}
return Optional.empty();
}
/**
* 尝试设置上一个进出记录为过期标识
* @param sourceId 区域/围栏 ID
* @param type 类型(区域/围栏)
* @param tag 定位标签
*/
public void trySetPrevTurnoverExpired(Long sourceId, LocationTurnover.Type type, LocationTag tag) {
Optional<LocationTurnover> record = findRepeatTurnoverRecord(sourceId, type, tag, null);
if (record.isPresent()) {
LocationTurnover turnoverRecord = record.get();
turnoverRecord.setIsLatest(false);
locationTurnoverRepository.save(turnoverRecord);
}
}
public Set<LocationTag> resetInTags(LocationTag tag, Boolean enter, Set<LocationTag> tags) {
if (Boolean.TRUE.equals(enter)) {
tags.add(tag);
} else {
tags.remove(tag);
}
return tags;
}
/**
* 处理低电量报警消息
* @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);
KeyAlarmAddParam keyAlarmAddParam = data.toJavaObject(KeyAlarmAddParam.class);
KeyAlarm keyAlarm = KeyAlarmAddParam.transform(keyAlarmAddParam);
keyAlarm.setPoint(
GeoUtils.xyzToPoint(
keyAlarm.getX().doubleValue(),
keyAlarm.getY().doubleValue(),
keyAlarm.getZ().doubleValue()
)
);
Optional<User> userRepositoryOne = userRepository.findOne(
Example.of(User.builder().linkId(keyAlarmAddParam.getEntityId()).build())
);
if (userRepositoryOne.isEmpty()) {
// throw new RuntimeException("没找到该用户");
log.error("没找到该用户");
return;
}
User user = userRepositoryOne.get();
keyAlarm.setLeader(user);
keyAlarm.setEnable(true);
Optional<KeyAlarmRule> keyAlarmRuleOptional = keyAlarmRuleRepository.findOne(
Example.of(
KeyAlarmRule.builder().department(Department.builder().id(user.getDepartment().getId()).build()).build()
)
);
if (keyAlarmRuleOptional.isEmpty()) {
// throw new RuntimeException("该部门未设置报警规则");
log.error("该部门未设置报警规则");
return;
}
final KeyAlarm finalKeyAlarm = keyAlarmRepository.save(keyAlarm);
KeyAlarmRule keyAlarmRule = keyAlarmRuleOptional.get();
Set<User> users = keyAlarmRule.getUsers();
HashSet<KeyAlarmLog> keyAlarmLogs = new HashSet<>();
users.forEach(leader -> {
String[] split = keyAlarmRule.getTypes().split(",");
for (String type : split) {
keyAlarmLogs.add(
KeyAlarmLog.builder().status(false).user(leader).types(type).keyAlarm(finalKeyAlarm).build()
);
}
});
keyAlarmLogRepository.saveAll(keyAlarmLogs);
}
}
/* (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();
} }
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.rehearsal.impl;
import com.alibaba.fastjson.JSONArray;
import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder;
import com.yiring.app.constant.rehearsal.RehearsalPlanStatusEnum;
import com.yiring.app.domain.location.LocationLog;
import com.yiring.app.domain.location.LocationLogRepository;
import com.yiring.app.domain.location.LocationTag;
import com.yiring.app.domain.location.LocationTagRepository;
import com.yiring.app.domain.rehearsal.*;
import com.yiring.app.excel.rehearsal.RehearsalPlanExcel;
import com.yiring.app.param.rehearsal.RehearsalPlanAddParam;
import com.yiring.app.param.rehearsal.RehearsalPlanConditionParam;
import com.yiring.app.param.rehearsal.RehearsalPlanModifyParam;
import com.yiring.app.param.rehearsal.RehearsalPlanPlaybackParam;
import com.yiring.app.service.rehearsal.RehearsalPlanService;
import com.yiring.app.util.GeoUtils;
import com.yiring.app.util.JpaUtil;
import com.yiring.app.vo.rehearsal.RehearsalPlanRealTimeVo;
import com.yiring.app.vo.rehearsal.RehearsalPlanVo;
import com.yiring.app.vo.rehearsal.UserLocationVo;
import com.yiring.auth.domain.user.User;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.Predicate;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.locationtech.jts.geom.Geometry;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author tml
* @version 1.0
* @date 2022/5/10 14:33
*/
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
public class RehearsalPlanServiceImpl implements RehearsalPlanService {
@Resource
private RehearsalPlanRepository rehearsalPlanRepository;
@Resource
private AccidentSpotRepository accidentSpotRepository;
@Resource
private EvacuationZoneRepository evacuationZoneRepository;
@Resource
private LocationTagRepository locationTagRepository;
@Resource
private LocationLogRepository locationLogRepository;
@Resource
private RehearsalPlanLogRepository rehearsalPlanLogRepository;
@Override
public Result<String> addOne(RehearsalPlanAddParam param) {
Result<String> result = checkEnable(param.getAccidentSpotId(), param.getEvacuationZoneId());
if (Status.OK.value() != result.getStatus()) {
return result;
}
RehearsalPlan rehearsalPlan = param.transform();
rehearsalPlanRepository.saveAndFlush(rehearsalPlan);
return Result.ok();
}
@Override
public Result<String> modifyOne(RehearsalPlanModifyParam param) {
Result<String> result = checkEnable(param.getAccidentSpotId(), param.getEvacuationZoneId());
if (Status.OK.value() != result.getStatus()) {
return result;
}
Optional<RehearsalPlan> optional = rehearsalPlanRepository.findById(param.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要修改的演练计划不存在");
}
//只有未开始的演练计划才能修改
if (!RehearsalPlanStatusEnum.UN_START.getCode().equals(optional.get().getStatus())) {
return Result.no(Status.EXPECTATION_FAILED, "只有未开始的演练计划才能修改");
}
JpaUtil.copyNotNullProperties(param.transform(), optional.get());
return Result.ok();
}
private Result<String> checkEnable(Long accidentSpotId, Long evacuationZoneId) {
Optional<AccidentSpot> spotOptional = accidentSpotRepository.findById(accidentSpotId);
if (spotOptional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "事故点不存在");
}
if (!spotOptional.get().getEnable()) {
return Result.no(Status.EXPECTATION_FAILED, "事故点未启用");
}
Optional<EvacuationZone> zoneOptional = evacuationZoneRepository.findById(evacuationZoneId);
if (zoneOptional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "撤离区不存在");
}
if (!zoneOptional.get().getEnable()) {
return Result.no(Status.EXPECTATION_FAILED, "撤离区未启用");
}
return Result.ok();
}
@Override
public Result<String> removeOne(IdParam idParam) {
Optional<RehearsalPlan> optional = rehearsalPlanRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要删除的演练计划不存在");
}
//只有未开始的演练计划才能删除
if (!RehearsalPlanStatusEnum.UN_START.getCode().equals(optional.get().getStatus())) {
return Result.no(Status.EXPECTATION_FAILED, "只有未开始的演练计划才能删除");
}
optional.get().setDeleted(true);
return Result.ok();
}
@Override
public Result<RehearsalPlanVo> findOne(IdParam idParam) {
Optional<RehearsalPlan> optional = rehearsalPlanRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要删除的演练计划不存在");
}
RehearsalPlanVo planVo = RehearsalPlanVo.transform(optional.get());
return Result.ok(planVo);
}
@Override
public Result<PageVo<RehearsalPlanVo>> findList(RehearsalPlanConditionParam conditionParam, PageParam pageParam) {
Pageable pageable = PageParam.toPageable(pageParam);
Specification<RehearsalPlan> specification = getSpecification(conditionParam);
Page<RehearsalPlan> page = rehearsalPlanRepository.findAll(specification, pageable);
List<RehearsalPlanVo> voList = page.get().map(RehearsalPlanVo::transform).collect(Collectors.toList());
PageVo<RehearsalPlanVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo);
}
@Override
public void export(RehearsalPlanConditionParam conditionParam, HttpServletResponse response) {
Specification<RehearsalPlan> specification = getSpecification(conditionParam);
List<RehearsalPlan> page = rehearsalPlanRepository.findAll(specification);
List<RehearsalPlanExcel> list = page.stream().map(RehearsalPlanExcel::transform).collect(Collectors.toList());
try (
DefaultStreamExcelBuilder<RehearsalPlanExcel> streamExcelBuilder = DefaultStreamExcelBuilder
.of(RehearsalPlanExcel.class)
.threadPool(Executors.newFixedThreadPool(2))
.rowHeight(14)
.titleRowHeight(14)
.style(
"cell->vertical-align:center;text-align:center",
"title->vertical-align:center;text-align:center;font-weight:bold;font-family:等线"
)
.start()
) {
streamExcelBuilder.append(list);
String fileName = URLEncoder.encode("演练计划列表.xlsx", StandardCharsets.UTF_8);
response.setContentType("application/octet-stream");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
OutputStream out = response.getOutputStream();
Workbook workbook = streamExcelBuilder.fixedTitles().build();
workbook.write(out);
workbook.close();
out.flush();
out.close();
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new RuntimeException("报警类型列表导出失败: " + e.getMessage());
}
}
private Specification<RehearsalPlan> getSpecification(RehearsalPlanConditionParam conditionParam) {
return (root, query, criteriaBuilder) -> {
ArrayList<Predicate> list = new ArrayList<>();
if (conditionParam.getStatus() != null) {
list.add(criteriaBuilder.equal(root.get(RehearsalPlan.Fields.status), conditionParam.getStatus()));
}
if (conditionParam.getRiskLevel() != null) {
list.add(
criteriaBuilder.equal(root.get(RehearsalPlan.Fields.riskLevel), conditionParam.getRiskLevel())
);
}
if (conditionParam.getBeginTime() != null) {
list.add(
criteriaBuilder.greaterThanOrEqualTo(
root.get(RehearsalPlan.Fields.rehearsalTime),
conditionParam.getBeginTime()
)
);
}
if (conditionParam.getEndTime() != null) {
list.add(
criteriaBuilder.lessThanOrEqualTo(
root.get(RehearsalPlan.Fields.rehearsalTime),
conditionParam.getEndTime()
)
);
}
Predicate[] array = list.toArray(new Predicate[0]);
return criteriaBuilder.and(array);
};
}
@Override
public Result<String> start(IdParam idParam) {
Optional<RehearsalPlan> optional = rehearsalPlanRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要启动的演练计划不存在");
}
RehearsalPlan rehearsalPlan = optional.get();
if (!RehearsalPlanStatusEnum.UN_START.getCode().equals(rehearsalPlan.getStatus())) {
return Result.no(Status.EXPECTATION_FAILED, "演练计划已经启动过了");
}
rehearsalPlan.setStatus(RehearsalPlanStatusEnum.RUNNING.getCode());
//事故点信息
AccidentSpot accidentSpot = rehearsalPlan.getAccidentSpot();
Integer scope = rehearsalPlan.getScope();
//计算影响的范围
Geometry geometry = GeoUtils.expandGeometry(accidentSpot.getGeometry(), scope);
//获取在事故点及周边的员工
List<LocationTag> inArea = locationTagRepository.findInArea(geometry);
//演练计划实施数据落库
List<Long> idList = inArea.stream().map(e -> e.getUser().getId()).collect(Collectors.toList());
String ids = JSONArray.toJSONString(idList);
RehearsalPlanLog rehearsalPlanLog = RehearsalPlanLog
.builder()
.rehearsalPlan(rehearsalPlan)
.beginTime(LocalDateTime.now())
.accidentPeopleNum(inArea.size())
.userIds(ids)
.geometry(geometry)
.build();
rehearsalPlanLogRepository.saveAndFlush(rehearsalPlanLog);
//todo:给这些标签卡绑定的用户发送 App 消息推送 - 同时是否会生成广播消息未知?
return Result.ok();
}
@Override
public Result<String> stop(IdParam idParam) {
Optional<RehearsalPlan> optional = rehearsalPlanRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "要启动的演练计划不存在");
}
RehearsalPlan rehearsalPlan = optional.get();
if (!RehearsalPlanStatusEnum.RUNNING.getCode().equals(rehearsalPlan.getStatus())) {
return Result.no(Status.EXPECTATION_FAILED, "演练计划没有在进行中");
}
rehearsalPlan.setStatus(RehearsalPlanStatusEnum.END.getCode());
RehearsalPlanLog rehearsalPlanLog = rehearsalPlanLogRepository.findByRehearsalPlan(rehearsalPlan);
//查询出结束时在撤离区的员工,并落库
EvacuationZone evacuationZone = rehearsalPlan.getEvacuationZone();
int inAreaNum = locationTagRepository.findInAreaNum(evacuationZone.getGeometry());
rehearsalPlanLog.setEndTime(LocalDateTime.now());
rehearsalPlanLog.setEvacuationPeopleNum(inAreaNum);
return Result.ok();
}
@Override
public Result<RehearsalPlanRealTimeVo> findRealTime(IdParam idParam) {
RehearsalPlan rehearsalPlan = RehearsalPlan.builder().id(idParam.getId()).build();
RehearsalPlanLog rehearsalPlanLog = rehearsalPlanLogRepository.findByRehearsalPlan(rehearsalPlan);
if (rehearsalPlanLog == null) {
return Result.no(Status.EXPECTATION_FAILED, "演练计划不存在或未启动");
}
if (rehearsalPlanLog.getEndTime() != null) {
return Result.no(Status.EXPECTATION_FAILED, "演练计划已停止");
}
String idString = rehearsalPlanLog.getUserIds();
List<Long> idList = JSONArray.parseArray(idString, Long.class);
//查看员工位置
List<LocationTag> locationTagList = locationTagRepository.findByUserIds(idList);
List<UserLocationVo> userLocationVos = locationTagList
.stream()
.map(e -> new UserLocationVo(e.getUser().getId(), e.getUser().getRealName(), e.getPoint()))
.collect(Collectors.toList());
//查看撤离区人员数量
Geometry geometry = rehearsalPlanLog.getRehearsalPlan().getEvacuationZone().getGeometry();
int inAreaNum = locationTagRepository.findInAreaNum(geometry);
RehearsalPlanRealTimeVo vo = RehearsalPlanRealTimeVo
.builder()
.beginPeopleNum(rehearsalPlanLog.getAccidentPeopleNum())
.evacuationPeopleNum(inAreaNum)
.userLocation(userLocationVos)
.time(LocalDateTime.now())
.build();
return Result.ok(vo);
}
@Override
public Result<PageVo<RehearsalPlanRealTimeVo>> findPlayback(RehearsalPlanPlaybackParam param) {
RehearsalPlan rehearsalPlan = RehearsalPlan.builder().id(param.getId()).build();
RehearsalPlanLog rehearsalPlanLog = rehearsalPlanLogRepository.findByRehearsalPlan(rehearsalPlan);
//校验参数
Result<PageVo<RehearsalPlanRealTimeVo>> result = checkPlaybackParam(param, rehearsalPlanLog);
if (Status.OK.value() != result.getStatus()) {
return result;
}
//撤离区空间信息
Geometry evacuationGeometry = rehearsalPlanLog.getRehearsalPlan().getEvacuationZone().getGeometry();
String idString = rehearsalPlanLog.getUserIds();
List<Long> idList = JSONArray.parseArray(idString, Long.class);
//初始化查询的结束时间
LocalDateTime endTime;
if (param.getBeginTime().plusMinutes(1).isAfter(rehearsalPlanLog.getEndTime())) {
endTime = rehearsalPlanLog.getEndTime();
} else {
endTime = param.getBeginTime().plusMinutes(1);
}
//查询开始时间到一分钟后这段时间的员工定位信息
Specification<LocationLog> specification = (root, query, criteriaBuilder) -> {
ArrayList<Predicate> list = new ArrayList<>();
CriteriaBuilder.In<Object> in = criteriaBuilder.in(root.get(LocationLog.Fields.user));
for (Long id : idList) {
in.value(id);
}
list.add(in);
list.add(
criteriaBuilder.greaterThanOrEqualTo(root.get(LocationLog.Fields.locationTime), param.getBeginTime())
);
list.add(criteriaBuilder.lessThanOrEqualTo(root.get(LocationLog.Fields.locationTime), endTime));
Predicate[] array = list.toArray(new Predicate[0]);
return criteriaBuilder.and(array);
};
List<LocationLog> locationLogList = locationLogRepository.findAll(specification);
//处理每秒中员工的定位信息,并包装
ArrayList<RehearsalPlanRealTimeVo> voList = new ArrayList<>();
HashSet<Long> set = new HashSet<>();
//每次筛选的开始时间和结束时间(一秒间隔)
LocalDateTime tabTime = param.getBeginTime();
LocalDateTime tabTimeOnes = tabTime.plusSeconds(1);
while (tabTime.isBefore(endTime)) {
ArrayList<UserLocationVo> userLocationVos = new ArrayList<>();
RehearsalPlanRealTimeVo realTimeVo = RehearsalPlanRealTimeVo
.builder()
.beginPeopleNum(rehearsalPlanLog.getAccidentPeopleNum())
.evacuationPeopleNum(0)
.userLocation(userLocationVos)
.time(tabTime)
.build();
//循环员工的信息,筛选在这一秒的定位信息
for (LocationLog locationLog : locationLogList) {
LocalDateTime locationTime = locationLog.getLocationTime();
if (tabTime.isBefore(locationTime) && tabTimeOnes.isAfter(locationTime)) {
User user = locationLog.getUser();
//同一秒只记录用户的一次定位信息
if (!set.contains(user.getId())) {
set.add(user.getId());
UserLocationVo userLocationVo = UserLocationVo
.builder()
.userId(user.getId())
.realmName(user.getRealName())
.point(locationLog.getPoint())
.build();
userLocationVos.add(userLocationVo);
//如果是这一秒内的定位信息,记录已在撤离区的人数
boolean contains = evacuationGeometry.contains(locationLog.getPoint());
if (contains) {
realTimeVo.setEvacuationPeopleNum(realTimeVo.getEvacuationPeopleNum() + 1);
}
}
}
}
//将这一秒的数据添加到结果集
voList.add(realTimeVo);
//用户去重的set清空
set.clear();
//设置下一秒
tabTime = tabTime.plusSeconds(1);
tabTimeOnes = tabTime.plusSeconds(1);
}
PageVo<RehearsalPlanRealTimeVo> pageVo = PageVo.build(voList, voList.size());
return Result.ok(pageVo);
}
private Result<PageVo<RehearsalPlanRealTimeVo>> checkPlaybackParam(
RehearsalPlanPlaybackParam param,
RehearsalPlanLog rehearsalPlanLog
) {
if (rehearsalPlanLog == null) {
return Result.no(Status.EXPECTATION_FAILED, "演练计划不存在或未启动");
}
if (rehearsalPlanLog.getEndTime() == null) {
return Result.no(Status.EXPECTATION_FAILED, "演练计划停止后才能生成演练回放");
}
if (param.getBeginTime() == null) {
param.setBeginTime(rehearsalPlanLog.getBeginTime());
}
if (param.getBeginTime().isBefore(rehearsalPlanLog.getBeginTime())) {
return Result.no(Status.EXPECTATION_FAILED, "演练回放只能回放演练计划开始之后的数据");
}
return Result.ok();
}
}
...@@ -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();
} }
} }
...@@ -20,11 +20,12 @@ import lombok.Data; ...@@ -20,11 +20,12 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
/** /**
* 围栏信息VO
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/28 11:07 * @date 2022/4/28 11:07
*/ */
@ApiModel("围栏信息VO") @ApiModel("LocationFenceVo")
@Data @Data
@Builder @Builder
@AllArgsConstructor @AllArgsConstructor
......
...@@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; ...@@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.constant.alarm.InformMannerEnum; import com.yiring.app.constant.alarm.InformMannerEnum;
import com.yiring.app.domain.location.LocationAlarmRule; import com.yiring.app.domain.location.LocationAlarmRule;
import com.yiring.app.vo.CodeNameVo; import com.yiring.app.vo.CodeNameVo;
import com.yiring.app.vo.IdNameVo;
import com.yiring.app.vo.user.UserVo; import com.yiring.app.vo.user.UserVo;
import com.yiring.auth.domain.user.User; import com.yiring.auth.domain.user.User;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
...@@ -61,6 +62,9 @@ public class LocationAlarmRuleVo implements Serializable { ...@@ -61,6 +62,9 @@ public class LocationAlarmRuleVo implements Serializable {
@ApiModelProperty(value = "通知方式集合", required = true) @ApiModelProperty(value = "通知方式集合", required = true)
private List<CodeNameVo> informManner; private List<CodeNameVo> informManner;
@ApiModelProperty(value = "报警类型id", required = true)
private List<IdNameVo> alarmTypeIds;
public static LocationAlarmRuleVo transform(LocationAlarmRule locationAlarmRule) { public static LocationAlarmRuleVo transform(LocationAlarmRule locationAlarmRule) {
Set<User> users = locationAlarmRule.getUsers(); Set<User> users = locationAlarmRule.getUsers();
List<UserVo> userVos = users.stream().map(UserVo::transformDept).collect(Collectors.toList()); List<UserVo> userVos = users.stream().map(UserVo::transformDept).collect(Collectors.toList());
...@@ -70,6 +74,11 @@ public class LocationAlarmRuleVo implements Serializable { ...@@ -70,6 +74,11 @@ public class LocationAlarmRuleVo implements Serializable {
for (Integer item : list) { for (Integer item : list) {
codeNameVos.add(new CodeNameVo(item, InformMannerEnum.getByCode(item))); codeNameVos.add(new CodeNameVo(item, InformMannerEnum.getByCode(item)));
} }
List<IdNameVo> alarmTypeList = locationAlarmRule
.getAlarmTypes()
.stream()
.map(e -> new IdNameVo(e.getId(), e.getName()))
.collect(Collectors.toList());
return LocationAlarmRuleVo return LocationAlarmRuleVo
.builder() .builder()
.id(locationAlarmRule.getId()) .id(locationAlarmRule.getId())
...@@ -79,6 +88,7 @@ public class LocationAlarmRuleVo implements Serializable { ...@@ -79,6 +88,7 @@ public class LocationAlarmRuleVo implements Serializable {
.fenceName(locationAlarmRule.getLocationFence().getName()) .fenceName(locationAlarmRule.getLocationFence().getName())
.users(userVos) .users(userVos)
.informManner(codeNameVos) .informManner(codeNameVos)
.alarmTypeIds(alarmTypeList)
.build(); .build();
} }
} }
...@@ -19,11 +19,12 @@ import lombok.Data; ...@@ -19,11 +19,12 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
/** /**
* 修改配置报警类别的报警规则,根据不同类型传入不同参数
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/28 16:16 * @date 2022/4/28 16:16
*/ */
@ApiModel("修改配置报警类别的报警规则,根据不同类型传入不同参数") @ApiModel("LocationFenceRuleVo")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
......
...@@ -14,11 +14,12 @@ import lombok.Data; ...@@ -14,11 +14,12 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
/** /**
* 报警规则,根据不同类型传入不同参数
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/4/29 14:12 * @date 2022/4/29 14:12
*/ */
@ApiModel("报警规则,根据不同类型传入不同参数") @ApiModel("RuleVo")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.rehearsal; package com.yiring.app.vo.rehearsal;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.domain.rehearsal.AccidentSpot; import com.yiring.app.domain.rehearsal.AccidentSpot;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
...@@ -13,6 +15,7 @@ import lombok.NoArgsConstructor; ...@@ -13,6 +15,7 @@ import lombok.NoArgsConstructor;
import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.Geometry;
/** /**
* 事故点VO
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/5/7 11:25 * @date 2022/5/7 11:25
...@@ -21,12 +24,13 @@ import org.locationtech.jts.geom.Geometry; ...@@ -21,12 +24,13 @@ import org.locationtech.jts.geom.Geometry;
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@ApiModel("事故点VO") @ApiModel("AccidentSpotVo")
public class AccidentSpotVo implements Serializable { public class AccidentSpotVo implements Serializable {
@Serial @Serial
private static final long serialVersionUID = -7696351020089245510L; private static final long serialVersionUID = -7696351020089245510L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "事故点id", example = "1") @ApiModelProperty(value = "事故点id", example = "1")
private Long id; private Long id;
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.rehearsal; package com.yiring.app.vo.rehearsal;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.domain.rehearsal.EvacuationZone; import com.yiring.app.domain.rehearsal.EvacuationZone;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
...@@ -27,6 +29,7 @@ public class EvacuationZoneVo implements Serializable { ...@@ -27,6 +29,7 @@ public class EvacuationZoneVo implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 919152196104921261L; private static final long serialVersionUID = 919152196104921261L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "撤离区id", example = "1") @ApiModelProperty(value = "撤离区id", example = "1")
private Long id; private Long id;
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.rehearsal;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/5/12 11:40
*/
@ApiModel("演练计划实时数据VO")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class RehearsalPlanRealTimeVo implements Serializable {
@Serial
private static final long serialVersionUID = 2540857588207414303L;
@ApiModelProperty(value = "该数据的时间")
private LocalDateTime time;
@ApiModelProperty(value = "演练开始时在危险区域的人数")
private Integer beginPeopleNum;
@ApiModelProperty(value = "已在撤离区的人数", example = "20")
private Integer evacuationPeopleNum;
private List<UserLocationVo> userLocation;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.rehearsal;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.constant.rehearsal.RehearsalPlanStatusEnum;
import com.yiring.app.constant.rehearsal.RiskLevelEnum;
import com.yiring.app.domain.rehearsal.RehearsalPlan;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author tml
* @version 1.0
* @date 2022/5/10 13:48
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel("演练计划VO")
public class RehearsalPlanVo implements Serializable {
@Serial
private static final long serialVersionUID = 6580835031371232948L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "id", example = "1", required = true)
private Long id;
@ApiModelProperty(value = "演练主题", example = "红色演练")
private String topical;
@ApiModelProperty(value = "事故点id", example = "1522844636060585984")
private Long accidentSpotId;
@ApiModelProperty(value = "事故点名称", example = "事故点1")
private String accidentSpotName;
@ApiModelProperty(value = "周边范围(事故点周围多少米)", example = "50")
private Integer scope;
@ApiModelProperty(value = "撤离区id", example = "1523562795864428544")
private Long evacuationZoneId;
@ApiModelProperty(value = "撤离点名称", example = "撤离点1")
private String evacuationZoneName;
@ApiModelProperty(value = "风险程度code", example = "1")
private Integer riskLevel;
@ApiModelProperty(value = "风险等级名称", example = "红色风险")
private String riskLevelName;
@ApiModelProperty(value = "事故信息", example = "气体泄露")
private String accidentMsg;
@ApiModelProperty(value = "演练时间", example = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime rehearsalTime;
@ApiModelProperty(value = "推送信息", example = "气体泄露,请尽快逃离")
private String pushMsg;
@ApiModelProperty(value = "演练计划的状态code", example = "1")
private Integer status;
@ApiModelProperty(value = "演练计划的状态名称", example = "未开始")
private String statusName;
public static RehearsalPlanVo transform(RehearsalPlan rehearsalPlan) {
return RehearsalPlanVo
.builder()
.id(rehearsalPlan.getId())
.topical(rehearsalPlan.getTopical())
.accidentSpotId(rehearsalPlan.getAccidentSpot().getId())
.accidentSpotName(rehearsalPlan.getAccidentSpot().getName())
.scope(rehearsalPlan.getScope())
.evacuationZoneId(rehearsalPlan.getEvacuationZone().getId())
.evacuationZoneName(rehearsalPlan.getEvacuationZone().getName())
.riskLevel(rehearsalPlan.getRiskLevel())
.riskLevelName(RiskLevelEnum.getByCode(rehearsalPlan.getRiskLevel()))
.accidentMsg(rehearsalPlan.getAccidentMsg())
.rehearsalTime(rehearsalPlan.getRehearsalTime())
.pushMsg(rehearsalPlan.getPushMsg())
.status(rehearsalPlan.getStatus())
.statusName(RehearsalPlanStatusEnum.getByCode(rehearsalPlan.getStatus()))
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo.rehearsal;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.locationtech.jts.geom.Point;
/**
* @author tml
* @version 1.0
* @date 2022/5/12 11:48
*/
@ApiModel("员工位置信息VO")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class UserLocationVo implements Serializable {
@Serial
private static final long serialVersionUID = 7996875376293325311L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "员工id", example = "1")
private Long userId;
@ApiModelProperty(value = "员工姓名", example = "1")
private String realmName;
@ApiModelProperty(value = "员工坐标")
private Point point;
}
/* (C) 2021 YiRing, Inc. */ /* (C) 2021 YiRing, Inc. */
package com.yiring.app.web; package com.yiring.app.web;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.app.constant.Code; import com.yiring.app.constant.Code;
import com.yiring.app.exception.CodeException; import com.yiring.app.exception.CodeException;
import com.yiring.app.util.zy.ZyUtil; import com.yiring.app.util.zy.ZyUtil;
...@@ -23,10 +24,12 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -23,10 +24,12 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "Hello") @SuppressWarnings({ "deprecation" })
@RequestMapping("/hello/") @ApiSupport(order = 0)
@Api(tags = "示例", description = "Example")
@RequestMapping("/example/")
@RestController @RestController
public class HelloController { public class ExampleController {
String text = "😎 Hello World"; String text = "😎 Hello World";
......
...@@ -20,7 +20,6 @@ import java.util.Objects; ...@@ -20,7 +20,6 @@ import java.util.Objects;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
...@@ -35,9 +34,10 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -35,9 +34,10 @@ import org.springframework.web.bind.annotation.RestController;
* @version 1.0 * @version 1.0
* @date 2022/4/27 14:18 * @date 2022/4/27 14:18
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "AlarmType(报警类型)") @SuppressWarnings({ "deprecation" })
@Api(tags = "报警类型", description = "AlarmType")
@RestController @RestController
@RequestMapping("/alarm/type") @RequestMapping("/alarm/type")
public class AlarmTypeController { public class AlarmTypeController {
...@@ -98,11 +98,7 @@ public class AlarmTypeController { ...@@ -98,11 +98,7 @@ public class AlarmTypeController {
@ApiOperation(value = "报警类型导出", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) @ApiOperation(value = "报警类型导出", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@PostMapping("/exportAlarmType") @PostMapping("/exportAlarmType")
public void exportAlarmType( public void exportAlarmType(@Valid AlarmConditionParam conditionParam, HttpServletResponse response) {
@Valid AlarmConditionParam conditionParam, alarmService.exportAlarmType(conditionParam, response);
HttpServletResponse response,
@Valid PageParam pageParam
) {
alarmService.exportAlarmType(conditionParam, response, pageParam);
} }
} }
...@@ -22,8 +22,10 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -22,8 +22,10 @@ import org.springframework.web.bind.annotation.RestController;
* @version 1.0 * @version 1.0
* @date 2022/5/6 10:36 * @date 2022/5/6 10:36
*/ */
@Api(tags = "HistoryRoute(历史轨迹)")
@Validated @Validated
@SuppressWarnings({ "deprecation" })
@Api(tags = "历史轨迹", description = "HistoryRoute")
@RestController @RestController
@RequestMapping("/history/route") @RequestMapping("/history/route")
public class HistoryRouteController { public class HistoryRouteController {
......
...@@ -9,7 +9,6 @@ import io.swagger.annotations.Api; ...@@ -9,7 +9,6 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
...@@ -22,9 +21,10 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -22,9 +21,10 @@ import org.springframework.web.bind.annotation.RestController;
* @description: * @description:
* @date 2022/4/28 13:48 * @date 2022/4/28 13:48
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "小程序用户") @SuppressWarnings({ "deprecation" })
@Api(tags = "小程序用户", description = "AppletUser")
@RestController @RestController
@RequestMapping("/appUser/") @RequestMapping("/appUser/")
public class AppletUserController { public class AppletUserController {
......
...@@ -7,6 +7,7 @@ import com.yiring.app.param.broadcast.BroadcastAudioModifyParam; ...@@ -7,6 +7,7 @@ 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.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;
...@@ -15,8 +16,9 @@ import com.yiring.common.vo.PageVo; ...@@ -15,8 +16,9 @@ import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -27,9 +29,9 @@ import org.springframework.web.bind.annotation.*; ...@@ -27,9 +29,9 @@ import org.springframework.web.bind.annotation.*;
* @date 2022/5/7 * @date 2022/5/7
*/ */
@Slf4j
@Api(tags = "播报音频")
@Validated @Validated
@SuppressWarnings({ "deprecation" })
@Api(tags = "播报音频", description = "BroadcastAudio")
@RestController @RestController
@RequestMapping("/broadcast/audio") @RequestMapping("/broadcast/audio")
public class BroadcastAudioController { public class BroadcastAudioController {
...@@ -67,7 +69,9 @@ public class BroadcastAudioController { ...@@ -67,7 +69,9 @@ public class BroadcastAudioController {
return broadcastAudioService.index(indexParam); return broadcastAudioService.index(indexParam);
} }
@ApiOperation("批量下载") @ApiOperation(value = "批量下载", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@GetMapping("download") @GetMapping("download")
public void download() {} public void download(@Valid IdsParam idsParam, HttpServletResponse response) {
broadcastAudioService.download(idsParam, response);
}
} }
...@@ -17,7 +17,6 @@ import io.swagger.annotations.ApiOperation; ...@@ -17,7 +17,6 @@ import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Point;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
...@@ -33,9 +32,10 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -33,9 +32,10 @@ import org.springframework.web.multipart.MultipartFile;
* @description: * @description:
* @date 2022/5/6 10:15 * @date 2022/5/6 10:15
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "Broadcast(播报设备管理)") @SuppressWarnings({ "deprecation" })
@Api(tags = "播报设备管理", description = "Broadcast")
@RestController @RestController
@RequestMapping("/broadcast/") @RequestMapping("/broadcast/")
public class BroadcastController { public class BroadcastController {
......
...@@ -17,7 +17,7 @@ import io.swagger.annotations.ApiOperation; ...@@ -17,7 +17,7 @@ import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
...@@ -28,9 +28,9 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -28,9 +28,9 @@ import org.springframework.web.multipart.MultipartFile;
* @date 2022/4/19 * @date 2022/4/19
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "部门信息") @SuppressWarnings({ "deprecation" })
@Api(tags = "部门信息", description = "Department")
@RestController @RestController
@RequestMapping("/dept/") @RequestMapping("/dept/")
public class DepartmentController { public class DepartmentController {
...@@ -56,7 +56,7 @@ public class DepartmentController { ...@@ -56,7 +56,7 @@ public class DepartmentController {
return departmentService.findDepartmentInfo(idParam); return departmentService.findDepartmentInfo(idParam);
} }
@ApiOperation("部门导出") @ApiOperation(value = "部门导出", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@GetMapping("exportDepartment") @GetMapping("exportDepartment")
public void exportDepartment(@Valid DepartmentExportParam departmentExportParam, HttpServletResponse response) { public void exportDepartment(@Valid DepartmentExportParam departmentExportParam, HttpServletResponse response) {
departmentService.exportDepartment(departmentExportParam, response); departmentService.exportDepartment(departmentExportParam, response);
......
...@@ -15,7 +15,6 @@ import io.swagger.annotations.ApiOperation; ...@@ -15,7 +15,6 @@ import io.swagger.annotations.ApiOperation;
import java.util.ArrayList; import java.util.ArrayList;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
...@@ -28,9 +27,10 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -28,9 +27,10 @@ import org.springframework.web.bind.annotation.RestController;
* @author tzl * @author tzl
* 2022/4/13 17:10 * 2022/4/13 17:10
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "Dict") @SuppressWarnings({ "deprecation" })
@Api(tags = "数据字典", description = "Dict")
@RestController @RestController
@RequestMapping("/Dict/") @RequestMapping("/Dict/")
public class DictController { public class DictController {
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
package com.yiring.app.web.dict; package com.yiring.app.web.dict;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
...@@ -14,9 +13,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -14,9 +13,9 @@ import org.springframework.web.bind.annotation.RestController;
* 2022/4/14 15:14 * 2022/4/14 15:14
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "DictType") @SuppressWarnings({ "deprecation" })
@Api(tags = "数据字典类型", description = "DictType")
@RestController @RestController
@RequestMapping("/DictType/") @RequestMapping("/DictType/")
public class DictTypeController { public class DictTypeController {
......
...@@ -13,7 +13,6 @@ import io.swagger.annotations.ApiImplicitParam; ...@@ -13,7 +13,6 @@ import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -23,9 +22,10 @@ import org.springframework.web.bind.annotation.*; ...@@ -23,9 +22,10 @@ import org.springframework.web.bind.annotation.*;
* @version 1.0 * @version 1.0
* @date 2022/4/26 10:15 * @date 2022/4/26 10:15
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "District(区域管理)") @SuppressWarnings({ "deprecation" })
@Api(tags = "区域管理", description = "District")
@RestController @RestController
@RequestMapping("/district/") @RequestMapping("/district/")
public class DistrictController { public class DistrictController {
......
...@@ -12,7 +12,6 @@ import io.swagger.annotations.Api; ...@@ -12,7 +12,6 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
...@@ -25,9 +24,10 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -25,9 +24,10 @@ import org.springframework.web.bind.annotation.RestController;
* @description: * @description:
* @date 2022/5/5 15:18 * @date 2022/5/5 15:18
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "Icon(图标管理)") @SuppressWarnings({ "deprecation" })
@Api(tags = "图标管理", description = "Icon")
@RestController @RestController
@RequestMapping("/icon/") @RequestMapping("/icon/")
public class IconController { public class IconController {
......
...@@ -10,7 +10,7 @@ import com.yiring.common.vo.PageVo; ...@@ -10,7 +10,7 @@ import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -23,9 +23,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -23,9 +23,9 @@ import org.springframework.web.bind.annotation.RestController;
* @date 2022/5/10 * @date 2022/5/10
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "按键报警") @SuppressWarnings({ "deprecation" })
@Api(tags = "按键报警", description = "KeyAlarm")
@RestController @RestController
@RequestMapping("/key/alarm") @RequestMapping("/key/alarm")
public class KeyAlarmController { public class KeyAlarmController {
...@@ -38,4 +38,10 @@ public class KeyAlarmController { ...@@ -38,4 +38,10 @@ public class KeyAlarmController {
public Result<PageVo<KeyAlarmVo>> page(KeyAlarmFindParam param, PageParam pageParam) { public Result<PageVo<KeyAlarmVo>> page(KeyAlarmFindParam param, PageParam pageParam) {
return keyAlarmService.page(param, pageParam); return keyAlarmService.page(param, pageParam);
} }
@ApiOperation("导出")
@GetMapping
public void export(KeyAlarmFindParam param, HttpServletResponse response) {
keyAlarmService.export(param, response);
}
} }
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.web.key;
import com.yiring.app.param.key.KeyAlarmLogFindParam;
import com.yiring.app.service.key.KeyAlarmLogService;
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;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 按键报警推送信息
*
* @author LJ-2204
* @date 2022/5/13
*/
@Validated
@SuppressWarnings({ "deprecation" })
@Api(tags = "按键报警推送", description = "KeyAlarmLog")
@RestController
@RequestMapping("/key/alarm/log")
public class KeyAlarmLogController {
@Resource
KeyAlarmLogService keyAlarmLogService;
@ApiOperation("表格查询")
@GetMapping("page")
public Result<PageVo<KeyAlarmLogVo>> page(KeyAlarmLogFindParam param, PageParam pageParam) {
return keyAlarmLogService.page(param, pageParam);
}
}
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.app.web.key; package com.yiring.app.web.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.service.key.KeyAlarmRulesService; import com.yiring.app.service.key.KeyAlarmRuleService;
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;
...@@ -15,7 +15,6 @@ import io.swagger.annotations.Api; ...@@ -15,7 +15,6 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -26,43 +25,43 @@ import org.springframework.web.bind.annotation.*; ...@@ -26,43 +25,43 @@ import org.springframework.web.bind.annotation.*;
* @date 2022/5/6 * @date 2022/5/6
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "按键报警规则") @SuppressWarnings({ "deprecation" })
@Api(tags = "按键报警规则", description = "KeyAlarmRule")
@RestController @RestController
@RequestMapping("/key/alarm/rules") @RequestMapping("/key/alarm/rules")
public class KeyAlarmRulesController { public class KeyAlarmRuleController {
@Resource @Resource
KeyAlarmRulesService keyAlarmRulesService; KeyAlarmRuleService keyAlarmRuleService;
@ApiOperation("新增报警规则") @ApiOperation("新增报警规则")
@PostMapping("add") @PostMapping("add")
public Result<String> add(KeyAlarmRulesAddParam keyAlarmRulesAddParam) { public Result<String> add(KeyAlarmRuleAddParam keyAlarmRuleAddParam) {
return keyAlarmRulesService.add(keyAlarmRulesAddParam); return keyAlarmRuleService.add(keyAlarmRuleAddParam);
} }
@ApiOperation("删除报警规则") @ApiOperation("删除报警规则")
@DeleteMapping("delete") @DeleteMapping("delete")
public Result<String> delete(IdParam idParam) { public Result<String> delete(IdParam idParam) {
return keyAlarmRulesService.delete(idParam); return keyAlarmRuleService.delete(idParam);
} }
@ApiOperation("更新报警规则") @ApiOperation("更新报警规则")
@PutMapping("modify") @PutMapping("modify")
public Result<String> modify(KeyAlarmRulesModifyParam keyAlarmRulesModifyParam) { public Result<String> modify(KeyAlarmRuleModifyParam keyAlarmRuleModifyParam) {
return keyAlarmRulesService.modify(keyAlarmRulesModifyParam); return keyAlarmRuleService.modify(keyAlarmRuleModifyParam);
} }
@ApiOperation("导出") @ApiOperation("导出")
@GetMapping("export") @GetMapping("export")
public void export(KeyAlarmRulesExportParam keyAlarmRulesExportParam, HttpServletResponse response) { public void export(KeyAlarmRuleExportParam keyAlarmRuleExportParam, HttpServletResponse response) {
keyAlarmRulesService.export(keyAlarmRulesExportParam, response); keyAlarmRuleService.export(keyAlarmRuleExportParam, response);
} }
@ApiOperation("表格查询") @ApiOperation("表格查询")
@GetMapping("page") @GetMapping("page")
public Result<PageVo<KeyAlarmRulesVo>> page(KeyAlarmRulesPageParam keyAlarmRulesPageParam, PageParam pageParam) { public Result<PageVo<KeyAlarmRuleVo>> page(KeyAlarmRulePageParam keyAlarmRulePageParam, PageParam pageParam) {
return keyAlarmRulesService.page(keyAlarmRulesPageParam, pageParam); return keyAlarmRuleService.page(keyAlarmRulePageParam, pageParam);
} }
} }
...@@ -13,7 +13,6 @@ import io.swagger.annotations.ApiOperation; ...@@ -13,7 +13,6 @@ import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
...@@ -27,9 +26,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -27,9 +26,9 @@ import org.springframework.web.bind.annotation.RestController;
* @date 2022/4/27 * @date 2022/4/27
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "定位信标") @SuppressWarnings({ "deprecation" })
@Api(tags = "定位信标", description = "LocationBeacon")
@RestController @RestController
@RequestMapping("/location/beacon/") @RequestMapping("/location/beacon/")
public class LocationBeaconController { public class LocationBeaconController {
......
...@@ -19,7 +19,6 @@ import io.swagger.annotations.ApiOperation; ...@@ -19,7 +19,6 @@ import io.swagger.annotations.ApiOperation;
import java.util.Objects; import java.util.Objects;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
...@@ -32,11 +31,12 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -32,11 +31,12 @@ import org.springframework.web.bind.annotation.RestController;
* @version 1.0 * @version 1.0
* @date 2022/4/28 11:50 * @date 2022/4/28 11:50
*/ */
@RestController
@Api(tags = "Fence(围栏信息)")
@Validated @Validated
@Slf4j @SuppressWarnings({ "deprecation" })
@RequestMapping("location/fence") @Api(tags = "围栏信息", description = "LocationFence")
@RestController
@RequestMapping("/location/fence")
public class LocationFenceController { public class LocationFenceController {
@Resource @Resource
......
...@@ -3,9 +3,7 @@ package com.yiring.app.web.location.rule; ...@@ -3,9 +3,7 @@ package com.yiring.app.web.location.rule;
import com.yiring.app.constant.alarm.InformMannerEnum; import com.yiring.app.constant.alarm.InformMannerEnum;
import com.yiring.app.domain.alarm.AlarmType; import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.param.location.rule.LocationAlarmRuleAddParam; import com.yiring.app.param.location.rule.*;
import com.yiring.app.param.location.rule.LocationAlarmRuleModifyParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleParam;
import com.yiring.app.service.location.rule.LocationAlarmRuleService; import com.yiring.app.service.location.rule.LocationAlarmRuleService;
import com.yiring.app.vo.CodeNameVo; import com.yiring.app.vo.CodeNameVo;
import com.yiring.app.vo.IdNameVo; import com.yiring.app.vo.IdNameVo;
...@@ -22,23 +20,20 @@ import java.util.Objects; ...@@ -22,23 +20,20 @@ import java.util.Objects;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/** /**
* @author tml * @author tml
* @version 1.0 * @version 1.0
* @date 2022/5/5 14:19 * @date 2022/5/5 14:19
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "AlarmRule(电子围栏报警规则,配置报警给谁)") @SuppressWarnings({ "deprecation" })
@Api(tags = "电子围栏报警规则,配置报警给谁", description = "AlarmRule")
@RestController @RestController
@RequestMapping("/alarm/rule") @RequestMapping("/alarm/rule")
public class LocationAlarmRuleController { public class LocationAlarmRuleController {
...@@ -52,12 +47,24 @@ public class LocationAlarmRuleController { ...@@ -52,12 +47,24 @@ public class LocationAlarmRuleController {
return locationAlarmRuleService.addRule(param); return locationAlarmRuleService.addRule(param);
} }
@ApiOperation(value = "批量添加电子围栏报警规则")
@PostMapping("/batchAdd")
public Result<String> batchAdd(@Valid @RequestBody AlarmRuleBatchAddParam params) {
return locationAlarmRuleService.batchAdd(params.getParams());
}
@ApiOperation(value = "修改一条电子围栏报警规则") @ApiOperation(value = "修改一条电子围栏报警规则")
@PostMapping("/modifyRule") @PostMapping("/modifyRule")
public Result<String> modifyRule(@Valid LocationAlarmRuleModifyParam param) { public Result<String> modifyRule(@Valid LocationAlarmRuleModifyParam param) {
return locationAlarmRuleService.modifyRule(param); return locationAlarmRuleService.modifyRule(param);
} }
@ApiOperation(value = "批量修改电子围栏报警规则")
@PostMapping("/batchModify")
public Result<String> batchModify(@Valid @RequestBody AlarmRuleBatchModifyParam params) {
return locationAlarmRuleService.batchModify(params);
}
@ApiOperation(value = "删除一条电子围栏报警规则") @ApiOperation(value = "删除一条电子围栏报警规则")
@PostMapping("/removeRule") @PostMapping("/removeRule")
public Result<String> removeRule(@Valid IdParam idParam) { public Result<String> removeRule(@Valid IdParam idParam) {
...@@ -93,12 +100,8 @@ public class LocationAlarmRuleController { ...@@ -93,12 +100,8 @@ public class LocationAlarmRuleController {
@ApiOperation(value = "导出电子围栏报警规则", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) @ApiOperation(value = "导出电子围栏报警规则", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@PostMapping("/exportAlarmRule") @PostMapping("/exportAlarmRule")
public void exportAlarmRule( public void exportAlarmRule(@Valid LocationAlarmRuleParam param, HttpServletResponse response) {
@Valid LocationAlarmRuleParam param, locationAlarmRuleService.exportAlarmRule(param, response);
HttpServletResponse response,
@Valid PageParam pageParam
) {
locationAlarmRuleService.exportAlarmRule(param, response, pageParam);
} }
@ApiOperation("围栏信息下拉框") @ApiOperation("围栏信息下拉框")
......
...@@ -13,7 +13,6 @@ import io.swagger.annotations.Api; ...@@ -13,7 +13,6 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
...@@ -25,9 +24,10 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -25,9 +24,10 @@ import org.springframework.web.bind.annotation.RestController;
* @version 1.0 * @version 1.0
* @date 2022/4/29 9:05 * @date 2022/4/29 9:05
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "FenceRule(电子围栏报警规则,什么情况下会报警)") @SuppressWarnings({ "deprecation" })
@Api(tags = "电子围栏报警规则,什么情况下会报警", description = "FenceRule")
@RestController @RestController
@RequestMapping("/location/rule") @RequestMapping("/location/rule")
public class LocationFenceRuleController { public class LocationFenceRuleController {
......
...@@ -14,7 +14,6 @@ import io.swagger.annotations.ApiOperation; ...@@ -14,7 +14,6 @@ import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
...@@ -25,9 +24,9 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -25,9 +24,9 @@ import org.springframework.web.multipart.MultipartFile;
* @date 2022/4/13 * @date 2022/4/13
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "定位标签") @SuppressWarnings({ "deprecation" })
@Api(tags = "定位标签", description = "LocationTag")
@RestController @RestController
@RequestMapping("/location/tag/") @RequestMapping("/location/tag/")
public class LocationTagController { public class LocationTagController {
......
...@@ -12,7 +12,6 @@ import io.swagger.annotations.Api; ...@@ -12,7 +12,6 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
...@@ -26,9 +25,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -26,9 +25,9 @@ import org.springframework.web.bind.annotation.RestController;
* @date 2022/4/27 * @date 2022/4/27
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "标签分配") @SuppressWarnings({ "deprecation" })
@Api(tags = "标签分配", description = "LocationTagType")
@RestController @RestController
@RequestMapping("/location/tag/type") @RequestMapping("/location/tag/type")
public class LocationTagTypeController { public class LocationTagTypeController {
......
...@@ -12,10 +12,8 @@ import com.yiring.common.core.Status; ...@@ -12,10 +12,8 @@ import com.yiring.common.core.Status;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
import java.io.Serializable;
import java.util.List; import java.util.List;
import javax.annotation.Resource; import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -28,9 +26,10 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -28,9 +26,10 @@ import org.springframework.web.bind.annotation.RestController;
* @version 1.0 * @version 1.0
* @date 2022/4/24 13:48 * @date 2022/4/24 13:48
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "Map(地图)") @SuppressWarnings({ "deprecation" })
@Api(tags = "地图", description = "Map")
@RestController @RestController
@RequestMapping("/map/") @RequestMapping("/map/")
public class MapController { public class MapController {
...@@ -40,7 +39,7 @@ public class MapController { ...@@ -40,7 +39,7 @@ public class MapController {
@GetMapping("/mapSelect") @GetMapping("/mapSelect")
@ApiImplicitParams({ @ApiImplicitParam(value = "orgId", required = true, name = "orgId") }) @ApiImplicitParams({ @ApiImplicitParam(value = "orgId", required = true, name = "orgId") })
public Result<Serializable> fail(String orgId) { public Result<MapVo> select(String orgId) {
String login = ZyUtil.openLogin(); String login = ZyUtil.openLogin();
JSONObject jsonObject = mapClient.selectMap(orgId, "bearer " + login); JSONObject jsonObject = mapClient.selectMap(orgId, "bearer " + login);
// if (ObjectUtil.isNotNull(jsonObject.getJSONArray("data"))) { // if (ObjectUtil.isNotNull(jsonObject.getJSONArray("data"))) {
......
...@@ -28,7 +28,8 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -28,7 +28,8 @@ import org.springframework.web.bind.annotation.RestController;
*/ */
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "personnelStatistics(人员统计)") @SuppressWarnings({ "deprecation" })
@Api(tags = "人员统计", description = "PersonnelStatistics")
@RestController @RestController
@RequestMapping("/personnelStatistics/") @RequestMapping("/personnelStatistics/")
public class PersonnelStatisticsController { public class PersonnelStatisticsController {
......
...@@ -19,7 +19,6 @@ import io.swagger.annotations.ApiOperation; ...@@ -19,7 +19,6 @@ import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -29,9 +28,9 @@ import org.springframework.web.bind.annotation.*; ...@@ -29,9 +28,9 @@ import org.springframework.web.bind.annotation.*;
* @date 2022/4/12 * @date 2022/4/12
*/ */
@Slf4j
@Validated @Validated
@Api(tags = "职位信息") @SuppressWarnings({ "deprecation" })
@Api(tags = "职位信息", description = "Post")
@RestController @RestController
@RequestMapping("/post/") @RequestMapping("/post/")
public class PostController { public class PostController {
......
...@@ -31,8 +31,9 @@ import org.springframework.web.bind.annotation.*; ...@@ -31,8 +31,9 @@ import org.springframework.web.bind.annotation.*;
*/ */
@Slf4j @Slf4j
@Validated @Validated
@SuppressWarnings({ "deprecation" })
@Api(tags = "事故点管理", description = "AccidentSpot")
@RestController @RestController
@Api(tags = "AccidentSpot(事故点管理)")
@RequestMapping("/accident/spot") @RequestMapping("/accident/spot")
public class AccidentSpotController { public class AccidentSpotController {
......
...@@ -16,6 +16,7 @@ import io.swagger.annotations.Api; ...@@ -16,6 +16,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
/** /**
...@@ -23,7 +24,10 @@ import org.springframework.web.bind.annotation.*; ...@@ -23,7 +24,10 @@ import org.springframework.web.bind.annotation.*;
* @version 1.0 * @version 1.0
* @date 2022/5/9 10:19 * @date 2022/5/9 10:19
*/ */
@Api(tags = "EvacuationZone(撤离区)")
@Validated
@SuppressWarnings({ "deprecation" })
@Api(tags = "撤离区", description = "EvacuationZone")
@RestController @RestController
@RequestMapping("/evacuation/zone") @RequestMapping("/evacuation/zone")
public class EvacuationZoneController { public class EvacuationZoneController {
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.web.rehearsal;
import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.domain.location.LocationTag;
import com.yiring.app.domain.location.LocationTagRepository;
import com.yiring.app.domain.rehearsal.AccidentSpot;
import com.yiring.app.domain.rehearsal.AccidentSpotRepository;
import com.yiring.app.param.rehearsal.RehearsalPlanAddParam;
import com.yiring.app.param.rehearsal.RehearsalPlanConditionParam;
import com.yiring.app.param.rehearsal.RehearsalPlanModifyParam;
import com.yiring.app.param.rehearsal.RehearsalPlanPlaybackParam;
import com.yiring.app.service.rehearsal.RehearsalPlanService;
import com.yiring.app.vo.rehearsal.RehearsalPlanRealTimeVo;
import com.yiring.app.vo.rehearsal.RehearsalPlanVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import org.locationtech.jts.geom.Geometry;
import org.springframework.data.domain.Sort;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* @author tml
* @version 1.0
* @date 2022/5/10 14:08
*/
@Validated
@SuppressWarnings({ "deprecation" })
@Api(tags = "演练计划", description = "RehearsalPlan")
@RestController
@RequestMapping("/rehearsal/plan")
public class RehearsalPlanController {
@Resource
private RehearsalPlanService rehearsalPlanService;
@Resource
LocationTagRepository locationTagRepository;
@Resource
AccidentSpotRepository accidentSpotRepository;
@ApiOperation("添加一条演练计划")
@PostMapping("/addOne")
public Result<String> addOne(@Valid RehearsalPlanAddParam param) {
return rehearsalPlanService.addOne(param);
}
@ApiOperation("修改一条演练计划")
@PostMapping("/modifyOne")
public Result<String> modifyOne(@Valid RehearsalPlanModifyParam param) {
return rehearsalPlanService.modifyOne(param);
}
@ApiOperation("删除一条演练计划")
@PostMapping("/removeOne")
public Result<String> removeOne(@Valid IdParam idParam) {
return rehearsalPlanService.removeOne(idParam);
}
@ApiOperation("查询一条演练计划")
@GetMapping("/findOne")
public Result<RehearsalPlanVo> findOne(@Valid IdParam idParam) {
return rehearsalPlanService.findOne(idParam);
}
@ApiOperation("查询演练计划列表")
@GetMapping("/findList")
public Result<PageVo<RehearsalPlanVo>> findList(
@Valid RehearsalPlanConditionParam conditionParam,
@Valid PageParam pageParam
) {
if (Objects.isNull(pageParam.getSortField())) {
pageParam.setSortField(AlarmType.Fields.createTime);
pageParam.setSortOrder(Sort.Direction.DESC);
}
return rehearsalPlanService.findList(conditionParam, pageParam);
}
@ApiOperation(value = "导出演练计划", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@GetMapping("/export")
public void export(@Valid RehearsalPlanConditionParam conditionParam, HttpServletResponse response) {
rehearsalPlanService.export(conditionParam, response);
}
@ApiOperation("启动一个演练计划")
@PostMapping("/start")
public Result<String> start(@Valid IdParam idParam) {
return rehearsalPlanService.start(idParam);
}
@ApiOperation("停止一个演练计划")
@PostMapping("/stop")
public Result<String> stop(@Valid IdParam idParam) {
return rehearsalPlanService.stop(idParam);
}
@ApiOperation("查看演练(实时)")
@GetMapping("/findRealTime")
public Result<RehearsalPlanRealTimeVo> findRealTime(@Valid IdParam idParam) {
return rehearsalPlanService.findRealTime(idParam);
}
@ApiOperation("查看回放(每次查询一分钟的回放信息)")
@GetMapping("/findPlayback")
public Result<PageVo<RehearsalPlanRealTimeVo>> findPlayback(@Valid RehearsalPlanPlaybackParam param) {
return rehearsalPlanService.findPlayback(param);
}
@PostMapping("/test")
public Geometry test(@RequestBody Geometry geometry) {
double degree = 100 / (2 * Math.PI * 6371004) * 360;
return geometry.buffer(degree);
}
@GetMapping("/get")
public Result<ArrayList<LocationTag>> get() {
Optional<AccidentSpot> optional = accidentSpotRepository.findById(1524292027951353856L);
Geometry geometry = optional.get().getGeometry();
List<LocationTag> inArea = locationTagRepository.findInArea(geometry);
System.out.println(inArea);
return Result.ok(new ArrayList<>(inArea));
}
}
...@@ -17,6 +17,7 @@ import javax.annotation.Resource; ...@@ -17,6 +17,7 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
...@@ -31,7 +32,8 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -31,7 +32,8 @@ import org.springframework.web.multipart.MultipartFile;
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "人员管理") @SuppressWarnings({ "deprecation" })
@Api(tags = "人员管理", description = "user")
@RestController @RestController
@RequestMapping("/user/app/") @RequestMapping("/user/app/")
public class UserAppController { public class UserAppController {
...@@ -69,7 +71,7 @@ public class UserAppController { ...@@ -69,7 +71,7 @@ public class UserAppController {
return userService.deleteUser(idsParam); return userService.deleteUser(idsParam);
} }
@ApiOperation("用户导出") @ApiOperation(value = "用户导出", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@GetMapping("exportUser") @GetMapping("exportUser")
public void exportUser(@Valid UserFindParam userFindParam, HttpServletResponse response) { public void exportUser(@Valid UserFindParam userFindParam, HttpServletResponse response) {
userService.exportUser(userFindParam, response); userService.exportUser(userFindParam, response);
......
...@@ -35,7 +35,8 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -35,7 +35,8 @@ import org.springframework.web.multipart.MultipartFile;
*/ */
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "Video(监控设备)") @SuppressWarnings({ "deprecation" })
@Api(tags = "监控设备", description = "Video")
@RestController @RestController
@RequestMapping("/video/") @RequestMapping("/video/")
public class VideoController { public class VideoController {
......
...@@ -30,10 +30,11 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -30,10 +30,11 @@ import org.springframework.web.bind.annotation.RestController;
* 2022/4/11 17:02 * 2022/4/11 17:02
*/ */
@Slf4j @Slf4j
@Api(tags = "Car(车辆)")
@Validated @Validated
@RestController @SuppressWarnings({ "deprecation" })
@Api(tags = "车辆", description = "Car")
@RequestMapping("/Car/") @RequestMapping("/Car/")
@RestController
public class CarController { public class CarController {
@Resource @Resource
......
...@@ -28,7 +28,8 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -28,7 +28,8 @@ import org.springframework.web.bind.annotation.RestController;
*/ */
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "Visitor(访客)") @SuppressWarnings({ "deprecation" })
@Api(tags = "访客", description = "Visitor")
@RestController @RestController
@RequestMapping("/visitor/") @RequestMapping("/visitor/")
public class VisitorController { public class VisitorController {
......
...@@ -83,21 +83,21 @@ xxl: ...@@ -83,21 +83,21 @@ xxl:
logging: logging:
level: level:
# sql bind parameter # sql bind parameter
# org.hibernate.type.descriptor.sql.BasicBinder: trace org.hibernate.type.descriptor.sql.BasicBinder: trace
org.hibernate.type.descriptor.sql.BasicBinder: error # org.hibernate.type.descriptor.sql.BasicBinder: error
# 真源定位系统相关配置 # 真源定位系统相关配置
zy-config: zy-config:
host: project.yz-online.com host: project.yz-online.com
# RabbitMQ 订阅配置 # RabbitMQ 订阅配置
rabbitmq: rabbitmq:
enabled: true enabled: false
host: ${zy-config.host} host: ${zy-config.host}
port: 672 port: 672
username: admin username: admin
password: admin password: admin
virtual-host: / virtual-host: /
queue-name: tenant_msg_${zy-config.open.client-secret}_${zy-config.open.client-id} queue-name: tenant_msg_${zy-config.open.client-secret}_${zy-config.open.client-id}_mock
# 开放接口信息配置 # 开放接口信息配置
open: open:
api: http://${zy-config.host}:789/positionApi api: http://${zy-config.host}:789/positionApi
......
...@@ -9,8 +9,8 @@ dependencies { ...@@ -9,8 +9,8 @@ dependencies {
// 本地依赖 // 本地依赖
implementation fileTree(dir: project.rootDir.getPath() + '\\libs', includes: ['*jar']) implementation fileTree(dir: project.rootDir.getPath() + '\\libs', includes: ['*jar'])
// swagger annotations // swagger(knife4j)
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}" implementation "com.github.xiaoymin:knife4j-spring-boot-starter:${knife4jVersion}"
// sa-token // sa-token
implementation "cn.dev33:sa-token-spring-boot-starter:${saTokenVersion}" implementation "cn.dev33:sa-token-spring-boot-starter:${saTokenVersion}"
......
...@@ -5,6 +5,7 @@ import com.yiring.auth.param.user.UserFindParam; ...@@ -5,6 +5,7 @@ import com.yiring.auth.param.user.UserFindParam;
import com.yiring.auth.param.user.UserSaveParam; import com.yiring.auth.param.user.UserSaveParam;
import com.yiring.auth.vo.user.UserVo; import com.yiring.auth.vo.user.UserVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam; import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
...@@ -29,4 +30,11 @@ public interface UserService { ...@@ -29,4 +30,11 @@ public interface UserService {
* @return Result<PageVo<UserVo>> * @return Result<PageVo<UserVo>>
*/ */
Result<PageVo<UserVo>> page(UserFindParam param, PageParam pageParam); Result<PageVo<UserVo>> page(UserFindParam param, PageParam pageParam);
/**
* 重置密码
* @param idParam IdParam
* @return Result<String>
*/
Result<String> reset(IdParam idParam);
} }
...@@ -12,10 +12,13 @@ import com.yiring.auth.param.user.UserSaveParam; ...@@ -12,10 +12,13 @@ import com.yiring.auth.param.user.UserSaveParam;
import com.yiring.auth.service.user.UserService; import com.yiring.auth.service.user.UserService;
import com.yiring.auth.vo.user.UserVo; import com.yiring.auth.vo.user.UserVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.domain.BasicEntity; import com.yiring.common.domain.BasicEntity;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam; import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder;
...@@ -87,4 +90,18 @@ public class UserServiceImpl implements UserService { ...@@ -87,4 +90,18 @@ public class UserServiceImpl implements UserService {
PageVo<UserVo> pageVo = PageVo.build(userVos, users.getTotalElements()); PageVo<UserVo> pageVo = PageVo.build(userVos, users.getTotalElements());
return Result.ok(pageVo); return Result.ok(pageVo);
} }
@Override
public Result<String> reset(IdParam idParam) {
Optional<User> userOptional = userRepository.findById(idParam.getId());
if (userOptional.isPresent()) {
User user = userOptional.get();
user.setPassword("123456");
userRepository.save(user);
return Result.ok();
}
return Result.no(Status.BAD_REQUEST);
}
} }
...@@ -4,6 +4,7 @@ package com.yiring.auth.web.auth; ...@@ -4,6 +4,7 @@ package com.yiring.auth.web.auth;
import cn.dev33.satoken.secure.SaSecureUtil; import cn.dev33.satoken.secure.SaSecureUtil;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.auth.domain.user.User; import com.yiring.auth.domain.user.User;
import com.yiring.auth.domain.user.UserRepository; import com.yiring.auth.domain.user.UserRepository;
import com.yiring.auth.param.auth.LoginParam; import com.yiring.auth.param.auth.LoginParam;
...@@ -36,7 +37,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -36,7 +37,9 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "Auth") @SuppressWarnings({ "deprecation" })
@ApiSupport(order = -99)
@Api(tags = "身份认证", description = "Auth")
@RestController @RestController
@RequestMapping("/auth/") @RequestMapping("/auth/")
public class AuthController { public class AuthController {
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.auth.web.permission; package com.yiring.auth.web.permission;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.auth.domain.permission.Permission; import com.yiring.auth.domain.permission.Permission;
import com.yiring.auth.domain.permission.PermissionRepository; import com.yiring.auth.domain.permission.PermissionRepository;
import com.yiring.auth.param.permission.PermissionParam; import com.yiring.auth.param.permission.PermissionParam;
...@@ -38,7 +39,9 @@ import org.springframework.web.bind.annotation.*; ...@@ -38,7 +39,9 @@ import org.springframework.web.bind.annotation.*;
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "Permission") @SuppressWarnings({ "deprecation" })
@ApiSupport(order = -97)
@Api(tags = "权限管理", description = "Permission")
@RestController @RestController
@RequestMapping("/manage/permission/") @RequestMapping("/manage/permission/")
public class PermissionController { public class PermissionController {
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.auth.web.role; package com.yiring.auth.web.role;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.auth.domain.permission.Permission; import com.yiring.auth.domain.permission.Permission;
import com.yiring.auth.domain.permission.PermissionRepository; import com.yiring.auth.domain.permission.PermissionRepository;
import com.yiring.auth.domain.role.Role; import com.yiring.auth.domain.role.Role;
...@@ -40,7 +41,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -40,7 +41,9 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "Role") @SuppressWarnings({ "deprecation" })
@ApiSupport(order = -96)
@Api(tags = "角色管理", description = "Role")
@RestController @RestController
@RequestMapping("/manage/role/") @RequestMapping("/manage/role/")
public class RoleController { public class RoleController {
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.auth.web.user; package com.yiring.auth.web.user;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.auth.domain.permission.Permission; import com.yiring.auth.domain.permission.Permission;
import com.yiring.auth.domain.role.Role; import com.yiring.auth.domain.role.Role;
import com.yiring.auth.domain.role.RoleRepository; import com.yiring.auth.domain.role.RoleRepository;
...@@ -46,7 +47,9 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -46,7 +47,9 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "User") @SuppressWarnings({ "deprecation" })
@ApiSupport(order = -95)
@Api(tags = "用户管理", description = "User")
@RestController @RestController
@RequestMapping("/user/") @RequestMapping("/user/")
public class UserController { public class UserController {
...@@ -145,4 +148,10 @@ public class UserController { ...@@ -145,4 +148,10 @@ public class UserController {
public Result<String> add(@Valid UserSaveParam param) { public Result<String> add(@Valid UserSaveParam param) {
return userService.add(param); return userService.add(param);
} }
@ApiOperation("重置密码")
@PostMapping("reset")
public Result<String> reset(@Valid IdParam idParam) {
return userService.reset(idParam);
}
} }
...@@ -3,8 +3,8 @@ dependencies { ...@@ -3,8 +3,8 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-web'
// swagger // swagger(knife4j)
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}" implementation "com.github.xiaoymin:knife4j-spring-boot-starter:${knife4jVersion}"
// minio // minio
implementation "io.minio:minio:${minioVersion}" implementation "io.minio:minio:${minioVersion}"
......
...@@ -3,6 +3,7 @@ package com.yiring.common.web; ...@@ -3,6 +3,7 @@ package com.yiring.common.web;
import cn.hutool.core.lang.Snowflake; import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.common.core.Minio; import com.yiring.common.core.Minio;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.core.Status; import com.yiring.common.core.Status;
...@@ -15,10 +16,7 @@ import java.time.format.DateTimeFormatter; ...@@ -15,10 +16,7 @@ import java.time.format.DateTimeFormatter;
import javax.annotation.Resource; import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
/** /**
...@@ -27,7 +25,9 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -27,7 +25,9 @@ import org.springframework.web.multipart.MultipartFile;
@Slf4j @Slf4j
@Validated @Validated
@Api(tags = "Minio") @SuppressWarnings({ "deprecation" })
@ApiSupport(order = -98)
@Api(tags = "文件管理", description = "file")
@RestController @RestController
@RequestMapping("/common/minio/") @RequestMapping("/common/minio/")
public class MinioController { public class MinioController {
......
...@@ -25,9 +25,9 @@ import org.springframework.stereotype.Component; ...@@ -25,9 +25,9 @@ import org.springframework.stereotype.Component;
public class TimesAspect { public class TimesAspect {
@Pointcut("@annotation(com.yiring.common.annotation.Times)") @Pointcut("@annotation(com.yiring.common.annotation.Times)")
public void pointCut() {} public void times() {}
@Around("pointCut()") @Around("times()")
public Object around(ProceedingJoinPoint point) throws Throwable { public Object around(ProceedingJoinPoint point) throws Throwable {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
Object result = point.proceed(); Object result = point.proceed();
......
/* (C) 2021 YiRing, Inc. */
package com.yiring.common.aspect;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* XxlJob 注解切面
*
* @author ifzm
* @version 0.1
*/
@Slf4j
@Aspect
@Component
public class XxlJobAspect {
@Pointcut("@annotation(com.xxl.job.core.handler.annotation.XxlJob)")
public void log() {}
@Around("log()")
public Object around(ProceedingJoinPoint point) throws Throwable {
try {
return point.proceed();
} catch (Exception e) {
log.error("XxlJob Execute Error: " + e.getMessage(), e);
throw e;
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论