提交 b84b587a 作者: Administrator

合并

......@@ -36,7 +36,7 @@ dependencies {
// Optional: Doc
implementation project(":basic-common:doc")
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}"
implementation "com.github.xiaoymin:knife4j-spring-boot-starter:${knife4jVersion}"
// Optional: Auth
implementation project(":basic-auth")
......@@ -78,4 +78,6 @@ dependencies {
// xxl-job
implementation "com.xuxueli:xxl-job-core:${xxlJobVersion}"
// minio
implementation "io.minio:minio:${minioVersion}"
}
......@@ -4,6 +4,7 @@ package com.yiring.app.domain.alarm;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Objects;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldNameConstants;
......@@ -68,4 +69,26 @@ public class AlarmType implements Serializable {
@Comment(value = "是否删除")
@Column(nullable = false)
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;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants;
......@@ -52,6 +49,7 @@ public class Broadcast implements Serializable {
String broadcastName;
@Comment("坐标点信息")
@Column(columnDefinition = "geometry(Point,4326)")
Point point;
@Comment("播报设备地址")
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.district;
import com.yiring.app.domain.location.LocationTag;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldNameConstants;
......@@ -59,7 +62,7 @@ public class District implements Serializable {
@Comment("区域信息")
@Type(type = "jts_geometry")
@Column(columnDefinition = "geometry")
@Column(columnDefinition = "geometry(Geometry,4326)")
private Geometry geometry;
@Comment("创建时间")
......@@ -75,4 +78,10 @@ public class District implements Serializable {
@Comment(value = "是否删除")
@Column(nullable = false)
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;
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.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
......@@ -36,4 +37,12 @@ public interface DistrictRepository extends JpaRepository<District, Serializable
*/
@Query("SELECT d FROM District d WHERE d.name like %?1%")
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;
import com.yiring.common.domain.BasicEntity;
import java.io.Serial;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants;
import org.hibernate.annotations.Comment;
import org.locationtech.jts.geom.Point;
/**
*
......@@ -32,7 +33,7 @@ import org.hibernate.annotations.Comment;
@FieldDefaults(level = AccessLevel.PRIVATE)
@Entity
@Table(name = "BS_KEY_ALARM")
@Comment("按键报警规则")
@Comment("按键报警")
public class KeyAlarm extends BasicEntity implements Serializable {
@Serial
......@@ -47,6 +48,26 @@ public class KeyAlarm extends BasicEntity implements Serializable {
@Comment("负责人")
User leader;
@Comment("标签编号")
String code;
@Comment("x")
BigDecimal x;
@Comment("y")
BigDecimal y;
@Comment("z")
BigDecimal z;
@Comment("坐标点信息")
Point point;
@Comment("报警状态")
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;
*/
@Repository
public interface KeyAlarmRulesRepository
extends JpaRepository<KeyAlarmRules, Serializable>, JpaSpecificationExecutor<KeyAlarmRules> {}
public interface KeyAlarmLogRepository
extends JpaRepository<KeyAlarmLog, Serializable>, JpaSpecificationExecutor<KeyAlarmLog> {}
......@@ -33,13 +33,13 @@ import org.hibernate.annotations.Comment;
@Entity
@Table(name = "BS_KEY_ALARM_RULES")
@Comment("按键报警规则")
public class KeyAlarmRules extends BasicEntity implements Serializable {
public class KeyAlarmRule extends BasicEntity implements Serializable {
@Serial
private static final long serialVersionUID = -302167871277966250L;
@Comment("所属部门")
@ManyToOne
@OneToOne
@JsonIgnore
@JoinColumn(name = "department_id")
Department department;
......@@ -47,12 +47,7 @@ public class KeyAlarmRules extends BasicEntity implements Serializable {
@JsonIgnore
@Builder.Default
@Comment("用户集合")
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "BS_KEY_ALARM_RULES_USERS",
joinColumns = { @JoinColumn(name = "key_id") },
inverseJoinColumns = { @JoinColumn(name = "user_id") }
)
@OneToMany
Set<User> users = new HashSet<>(0);
@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 {
private LocationFence locationFence;
@Comment("接收人集合")
@ManyToMany
@OneToMany
@ToString.Exclude
private Set<User> users;
......@@ -55,9 +55,9 @@ public class LocationAlarmRule extends BasicEntity implements Serializable {
private String informManner;
@Comment("报警类型")
@ManyToOne
@JoinColumn(name = "alarm_type_id")
private AlarmType alarmType;
@ManyToMany
@ToString.Exclude
private Set<AlarmType> alarmTypes;
@Comment(value = "是否删除")
@Column(nullable = false)
......
......@@ -80,6 +80,7 @@ public class LocationBeacon extends BasicEntity implements Serializable {
Double distance;
@Comment("坐标点信息")
@Column(columnDefinition = "geometry(Point,4326)")
Point point;
@FieldMapping
......
......@@ -51,7 +51,7 @@ public class LocationFence extends BasicEntity implements Serializable {
private String mapName;
@Comment("摄像头")
@ManyToOne
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "video_id")
private Video video;
......@@ -60,7 +60,7 @@ public class LocationFence extends BasicEntity implements Serializable {
@Comment("空间信息")
@Type(type = "jts_geometry")
@Column(columnDefinition = "geometry")
@Column(columnDefinition = "geometry(Geometry,4326)")
private Geometry geometry;
@Comment("滞留时间(秒)")
......@@ -87,6 +87,12 @@ public class LocationFence extends BasicEntity implements Serializable {
@OneToMany(mappedBy = "fence")
@ToString.Exclude
private Set<LocationFenceRule> rules = new HashSet<>(0);
@ToString.Exclude
@Comment("围栏中的标签集合")
@Builder.Default
@ManyToMany(fetch = FetchType.LAZY)
Set<LocationTag> tags = new HashSet<>(0);
/*@SuppressWarnings({ "unused" })
public enum Mode {
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;
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.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
......@@ -37,4 +38,12 @@ public interface LocationFenceRepository
*/
@Query("SELECT f FROM LocationFence f WHERE name like %?1% AND deleted = false")
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;
/**
* @author tml
* @version 1.0
* @date 2022/4/29 11:40
* 2022/4/29 11:40
*/
@Repository
public interface LocationFenceRuleRepository
......
......@@ -71,6 +71,7 @@ public class LocationLog implements Serializable {
User.Status status;
@Comment("坐标点信息")
@Column(columnDefinition = "geometry(Point,4326)")
Point point;
@Comment("信标集合")
......@@ -83,6 +84,11 @@ public class LocationLog implements Serializable {
@Column(columnDefinition = "jsonb")
JSONArray fences;
@Comment("区域集合")
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
JSONArray districts;
@Comment("静止/运动")
Boolean silent;
......@@ -92,6 +98,9 @@ public class LocationLog implements Serializable {
@Comment("电量单位")
String voltUnit;
@Comment("是否在厂区外")
Boolean out;
@Comment("原始数据")
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
......
......@@ -7,13 +7,11 @@ import com.yiring.common.annotation.FieldMapping;
import com.yiring.common.domain.BasicEntity;
import java.io.Serial;
import java.io.Serializable;
import java.util.Objects;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;
import org.hibernate.Hibernate;
import org.hibernate.annotations.Comment;
import org.locationtech.jts.geom.Point;
......@@ -107,9 +105,13 @@ public class LocationTag extends BasicEntity implements Serializable {
@Comment("类型(1:内部/2:访客)")
Integer category;
@Comment("最后定位坐标")
@Comment("最新定位坐标")
@Column(columnDefinition = "geometry(Point,4326)")
Point point;
@Comment("是否在厂外")
Boolean out;
@SuppressWarnings({ "unused" })
public enum Type {
BTT01("蓝牙人员定位卡"),
......@@ -125,17 +127,4 @@ public class LocationTag extends BasicEntity implements Serializable {
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 @@
package com.yiring.app.domain.location;
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.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
/**
* 定位标签JPA
* @author LJ-2204
* @date 2022/4/14
* 2022/4/14
*/
@Repository
public interface LocationTagRepository
extends JpaRepository<LocationTag, Serializable>, JpaSpecificationExecutor<LocationTag> {
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 {
@Comment("空间信息")
@Type(type = "jts_geometry")
@Column(columnDefinition = "geometry")
@Column(columnDefinition = "geometry(Geometry,4326)")
private Geometry geometry;
@Comment("摄像头")
......
......@@ -48,7 +48,7 @@ public class EvacuationZone extends BasicEntity implements Serializable {
@Comment("空间信息")
@Type(type = "jts_geometry")
@Column(columnDefinition = "geometry")
@Column(columnDefinition = "geometry(Geometry,4326)")
private Geometry geometry;
@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 {
Long id;
@Comment("坐标点信息")
@Column(columnDefinition = "geometry(Point,4326)")
Point point;
@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;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
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 java.io.Serial;
import java.io.Serializable;
......@@ -21,7 +21,7 @@ import lombok.experimental.FieldDefaults;
@Data
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmRulesExportExcel implements Serializable {
public class KeyAlarmRuleExportExcel implements Serializable {
@Serial
private static final long serialVersionUID = -800228727313291675L;
......@@ -35,8 +35,8 @@ public class KeyAlarmRulesExportExcel implements Serializable {
@ExcelColumn(title = "通知类型")
String types;
public static KeyAlarmRulesExportExcel transform(KeyAlarmRules keyAlarmRules) {
Set<User> users = keyAlarmRules.getUsers();
public static KeyAlarmRuleExportExcel transform(KeyAlarmRule keyAlarmRule) {
Set<User> users = keyAlarmRule.getUsers();
StringBuilder userNames = new StringBuilder();
for (User user : users) {
userNames.append(user.getRealName());
......@@ -44,11 +44,11 @@ public class KeyAlarmRulesExportExcel implements Serializable {
}
String substring = userNames.substring(0, userNames.length() - 1);
return KeyAlarmRulesExportExcel
return KeyAlarmRuleExportExcel
.builder()
.deptName(keyAlarmRules.getDepartment().getName())
.deptName(keyAlarmRule.getDepartment().getName())
.userNames(substring)
.types(keyAlarmRules.getTypes())
.types(keyAlarmRule.getTypes())
.build();
}
}
/* (C) 2022 YiRing, Inc. */
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.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.Serializable;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
......@@ -29,7 +33,7 @@ public class LocationAlarmRuleExcel implements Serializable {
@ExcelColumn(title = "地图名称")
private String mapName;
@ExcelColumn(title = "电子围栏名称")
@ExcelColumn(title = "电子围栏名称", width = 15)
private String fenceName;
@ExcelColumn(title = "接收人", width = 20)
......@@ -38,25 +42,25 @@ public class LocationAlarmRuleExcel implements Serializable {
@ExcelColumn(title = "通知方式", width = 18)
private String informManner;
public static LocationAlarmRuleExcel transform(LocationAlarmRuleVo locationAlarmRuleVo) {
StringBuilder users = new StringBuilder();
public static LocationAlarmRuleExcel transform(LocationAlarmRule locationAlarmRule) {
StringBuilder usersBuilder = new StringBuilder();
StringBuilder informManner = new StringBuilder();
for (int i = 0; i < locationAlarmRuleVo.getUsers().size(); i++) {
if (i != 0) {
users.append(", ");
}
users.append(locationAlarmRuleVo.getUsers().get(i).getRealName());
List<Integer> informMannerList = JSON.parseArray(locationAlarmRule.getInformManner(), Integer.class);
for (User user : locationAlarmRule.getUsers()) {
usersBuilder.append(", ");
usersBuilder.append(user.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) {
informManner.append(", ");
}
informManner.append(locationAlarmRuleVo.getInformManner().get(i).getName());
informManner.append(InformMannerEnum.getByCode(informMannerList.get(i)));
}
return LocationAlarmRuleExcel
.builder()
.mapName(locationAlarmRuleVo.getMapName())
.fenceName(locationAlarmRuleVo.getFenceName())
.mapName(locationAlarmRule.getMapName())
.fenceName(locationAlarmRule.getLocationFence().getName())
.users(users.toString())
.informManner(informManner.toString())
.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. */
package com.yiring.app.excel.user;
import cn.hutool.core.util.StrUtil;
import com.github.liaochong.myexcel.core.annotation.ExcelColumn;
import com.yiring.auth.domain.user.User;
import java.io.Serial;
......@@ -49,10 +50,6 @@ public class UserImportExcel implements Serializable {
@ExcelColumn(title = "职位名称")
String postName;
// 标签号
@ExcelColumn(title = "标签编号")
String code;
// 性别
@ExcelColumn(title = "性别")
Boolean gender;
......@@ -66,7 +63,7 @@ public class UserImportExcel implements Serializable {
.builder()
.realName(userImportExcel.getRealName())
.uuid(userImportExcel.getUuid())
.type(User.Type.valueOf(userImportExcel.getType()))
.type(StrUtil.equals(userImportExcel.getType(), "员工") ? User.Type.EMPLOYEES : User.Type.GUEST)
.mobile(userImportExcel.getMobile())
.gender(userImportExcel.getGender())
.isSpecial(userImportExcel.getIsSpecial())
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.job;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.yiring.app.domain.location.LocationLog;
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.common.constant.DateFormatter;
import java.time.LocalDateTime;
......@@ -29,7 +31,7 @@ import org.springframework.stereotype.Component;
@SuppressWarnings("unused")
@Slf4j
@Component
public class MockZyMessageJob {
public class MockPositionMessageJob {
@Resource
RabbitTemplate rabbitTemplate;
......@@ -37,19 +39,36 @@ public class MockZyMessageJob {
@Resource
LocationLogRepository locationLogRepository;
@XxlJob("MockZyMessageHandler")
public void mockMessageHandler() {
log.info("MockZyMessageHandler: {}", LocalDateTime.now().format(DateFormatter.DATE_TIME));
@Resource
ZyConfigProperties.ZyConfigRabbitmq rabbitmq;
@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());
log.info("[Mock] LowPower: {}", mockLowPowerMessage());
log.info("[Mock] DeviceStatus: {}", mockDeviceStatusMessage());
log.info("[Mock] KeyWarning: {}", mockKeyWarningMessage());
@XxlJob("MockKeyWarningHandler")
public void MockKeyWarningHandler() {
JSONObject extra = toJSON(XxlJobHelper.getJobParam());
log.info("[Mock] KeyWarning: {}, {}", mockKeyWarningMessage(extra), extra);
}
@XxlJob("QueryMessageHandler")
public void queryMessageHandler() {
log.info("QueryZyMessageHandler: {}", LocalDateTime.now().format(DateFormatter.DATE_TIME));
log.info("QueryMessageHandler: {}", LocalDateTime.now().format(DateFormatter.DATE_TIME));
try {
Specification<LocationLog> spec = (root, query, cb) -> {
......@@ -59,17 +78,31 @@ public class MockZyMessageJob {
};
List<LocationLog> logs = locationLogRepository.findAll(spec);
log.info("QueryZyMessageHandler: {}", logs.size());
log.info("log size: {}", logs.size());
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
public JSONObject send(JSONObject body) {
rabbitTemplate.convertAndSend(ZyRabbitConfig.MESSAGE_QUEUES_NAME, body.toJSONString());
if (rabbitmq.isMock()) {
rabbitTemplate.convertAndSend(rabbitmq.getQueueName(), body.toJSONString());
}
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() {
return "BTT33333331";
}
......@@ -78,7 +111,7 @@ public class MockZyMessageJob {
return 10019L;
}
private JSONObject mockPositionMessage() {
private JSONObject mockPositionMessage(JSONObject extra) {
// 随机生成一个坐标点
Point point = GeoUtils.randomPoint(GeoUtils.defaultBounds(), 0);
......@@ -95,6 +128,7 @@ public class MockZyMessageJob {
params.put("volt", 3650);
params.put("voltUnit", "mV");
params.put("floor", 1);
params.putAll(extra);
JSONObject body = new JSONObject();
body.put("method", "position");
......@@ -102,11 +136,12 @@ public class MockZyMessageJob {
return send(body);
}
private JSONObject mockLowPowerMessage() {
private JSONObject mockLowPowerMessage(JSONObject extra) {
JSONObject params = new JSONObject();
params.put("tagId", mockTag());
params.put("volt", 3650);
params.put("voltUnit", "mV");
params.putAll(extra);
JSONObject body = new JSONObject();
body.put("method", "lowPower");
......@@ -114,7 +149,7 @@ public class MockZyMessageJob {
return send(body);
}
private JSONObject mockDeviceStatusMessage() {
private JSONObject mockDeviceStatusMessage(JSONObject extra) {
JSONObject params = new JSONObject();
params.put("deviceId", mockTag());
params.put("areaId", mockAreaId());
......@@ -122,6 +157,7 @@ public class MockZyMessageJob {
params.put("volt", 3650);
params.put("field_21", "mV");
params.put("updateTime", System.currentTimeMillis());
params.putAll(extra);
JSONObject body = new JSONObject();
body.put("method", "deviceStatus");
......@@ -129,16 +165,17 @@ public class MockZyMessageJob {
return send(body);
}
private JSONObject mockKeyWarningMessage() {
private JSONObject mockKeyWarningMessage(JSONObject extra) {
JSONObject params = new JSONObject();
params.put("tagId", mockTag());
params.put("entityId", "1522770547178475520");
params.put("entityId", "4376");
params.put("areaId", mockAreaId());
params.put("raiseTime", System.currentTimeMillis());
params.put("x", 100);
params.put("y", 100);
params.put("z", 0);
params.put("floor", 1);
params.putAll(extra);
JSONObject body = new JSONObject();
body.put("method", "keyWarning");
......
......@@ -14,11 +14,12 @@ import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Range;
/**
* 报警类型的条件param
* @author tml
* @version 1.0
* @date 2022/4/27 14:28
*/
@ApiModel("AlarmConditionParam(报警类型的条件param)")
@ApiModel("AlarmConditionParam")
@Data
@AllArgsConstructor
@NoArgsConstructor
......
......@@ -18,11 +18,12 @@ import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
/**
* 报警类型的添加param
* @author tml
* @version 1.0
* @date 2022/4/27 11:28
*/
@ApiModel("AlarmTypeAddParam(报警类型的添加param)")
@ApiModel("AlarmTypeAddParam")
@Data
@Builder
@NoArgsConstructor
......
......@@ -15,11 +15,12 @@ import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
/**
* 报警类型修改param
* @author tml
* @version 1.0
* @date 2022/4/27 11:28
*/
@ApiModel("AlarmTypeModifyParam(报警类型修改param)")
@ApiModel("AlarmTypeModifyParam")
@Data
@Builder
@NoArgsConstructor
......@@ -58,7 +59,6 @@ public class AlarmTypeModifyParam implements Serializable {
.fenceType(fenceType)
.relevanceParam(relevanceParam)
.comment(comment)
.deleted(false)
.build();
}
}
......@@ -14,11 +14,12 @@ import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 历史轨迹的条件param
* @author tml
* @version 1.0
* @date 2022/5/6 10:53
*/
@ApiModel("HistoryRoute(历史轨迹的条件param)")
@ApiModel("HistoryRoute")
@Data
@AllArgsConstructor
@NoArgsConstructor
......
......@@ -18,7 +18,7 @@ import org.locationtech.jts.geom.Geometry;
* @version 1.0
* @date 2022/4/26 10:40
*/
@ApiModel("DistrictAddParam(添加区域param)")
@ApiModel("DistrictAddParam")
@Data
@Builder
@NoArgsConstructor
......
......@@ -20,7 +20,7 @@ import org.locationtech.jts.geom.Geometry;
* @version 1.0
* @date 2022/4/26 10:40
*/
@ApiModel("DistrictAddParam(添加区域param)")
@ApiModel("DistrictAddParam")
@Data
@Builder
@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;
* @date 2022/5/6
*/
@ApiModel("KeyAlarmRulesAddParam")
@ApiModel("KeyAlarmRuleAddParam")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmRulesAddParam implements Serializable {
public class KeyAlarmRuleAddParam implements Serializable {
@Serial
private static final long serialVersionUID = 758462772473378637L;
......
......@@ -15,13 +15,13 @@ import lombok.experimental.FieldDefaults;
* @date 2022/5/6
*/
@ApiModel("KeyAlarmRulesExportParam")
@ApiModel("KeyAlarmRuleExportParam")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmRulesExportParam implements Serializable {
public class KeyAlarmRuleExportParam implements Serializable {
@Serial
private static final long serialVersionUID = -2940487513251067057L;
......
......@@ -16,13 +16,13 @@ import lombok.experimental.FieldDefaults;
* @date 2022/5/6
*/
@ApiModel("KeyAlarmRulesAddParam")
@ApiModel("KeyAlarmRuleAddParam")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmRulesModifyParam implements Serializable {
public class KeyAlarmRuleModifyParam implements Serializable {
@Serial
private static final long serialVersionUID = 3526756145220971363L;
......
......@@ -15,13 +15,13 @@ import lombok.experimental.FieldDefaults;
* @date 2022/5/7
*/
@ApiModel("KeyAlarmRulesPageParam")
@ApiModel("KeyAlarmRulePageParam")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmRulesPageParam implements Serializable {
public class KeyAlarmRulePageParam implements Serializable {
@Serial
private static final long serialVersionUID = 2876239519436815639L;
......
......@@ -2,6 +2,7 @@
package com.yiring.app.param.location.beacon;
import com.yiring.app.domain.location.LocationBeacon;
import com.yiring.app.util.GeoUtils;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
......@@ -65,9 +66,13 @@ public class LocationBeaconAddParam implements Serializable {
.x(locationBeaconAddParam.getX())
.y(locationBeaconAddParam.getY())
.z(locationBeaconAddParam.getZ())
// .point(GeoUtils.xyzToPoint(
// locationBeaconAddParam.getPointX().doubleValue(),locationBeaconAddParam.getPointY().doubleValue(),locationBeaconAddParam.getPointZ().doubleValue()
// ))
.point(
GeoUtils.xyzToPoint(
locationBeaconAddParam.getX().doubleValue(),
locationBeaconAddParam.getY().doubleValue(),
locationBeaconAddParam.getZ().doubleValue()
)
)
.time(locationBeaconAddParam.getTime())
.volt(locationBeaconAddParam.getVolt())
.voltUnit(locationBeaconAddParam.getVoltUnit())
......
......@@ -17,11 +17,12 @@ import org.hibernate.validator.constraints.Range;
import org.locationtech.jts.geom.Geometry;
/**
* 添加围栏信息的param
* @author tml
* @version 1.0
* @date 2022/4/28 10:52
*/
@ApiModel("LocationFenceAddParam(添加围栏信息的param)")
@ApiModel("LocationFenceAddParam")
@Data
@AllArgsConstructor
@NoArgsConstructor
......
......@@ -11,11 +11,12 @@ import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 查询围栏信息的条件param
* @author tml
* @version 1.0
* @date 2022/4/28 13:35
*/
@ApiModel("LocationFenceConditionParam(查询围栏信息的条件param)")
@ApiModel("LocationFenceConditionParam")
@Data
@AllArgsConstructor
@NoArgsConstructor
......
......@@ -16,11 +16,12 @@ import org.hibernate.validator.constraints.Range;
import org.locationtech.jts.geom.Geometry;
/**
* 修改围栏信息的param
* @author tml
* @version 1.0
* @date 2022/4/28 10:52
*/
@ApiModel("LocationFenceModifyParam(修改围栏信息的param)")
@ApiModel("LocationFenceModifyParam")
@Data
@AllArgsConstructor
@NoArgsConstructor
......@@ -70,7 +71,6 @@ public class LocationFenceModifyParam {
.geometry(geometry)
.residenceTime(residenceTime)
.threshold(threshold)
.enable(false)
.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;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
......@@ -36,6 +37,12 @@ public class LocationAlarmRuleAddParam implements Serializable {
@Serial
private static final long serialVersionUID = 388296602724939033L;
/**
* 这个字段给前端标识用,后端无意义
*/
@ApiModelProperty(value = "标识ID,无意义")
private Integer tabId;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "地图id", example = "1", required = true)
@NotNull(message = "地图id不能为空")
......@@ -49,16 +56,16 @@ public class LocationAlarmRuleAddParam implements Serializable {
@NotNull(message = "电子围栏id不能为空")
private Long fenceId;
@ApiModelProperty(value = "报警类型id", example = "1", required = true)
@NotNull(message = "报警类型id不能为空")
private Long alarmId;
@ApiModelProperty(value = "报警类型id", required = true)
@NotEmpty(message = "报警类型id不能为空")
private Set<Long> alarmIds;
@ApiModelProperty(value = "接收人集合(id)", required = true)
@NotNull(message = "接收人id不能为空")
@NotEmpty(message = "接收人id不能为空")
private Set<Long> users;
@ApiModelProperty(value = "通知方式集合", required = true)
@NotNull(message = "通知方式不能为空")
@NotEmpty(message = "通知方式不能为空")
private Set<Integer> informManner;
public LocationAlarmRule transform() {
......@@ -67,7 +74,10 @@ public class LocationAlarmRuleAddParam implements Serializable {
for (Long item : this.users) {
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);
return LocationAlarmRule
.builder()
......@@ -75,7 +85,7 @@ public class LocationAlarmRuleAddParam implements Serializable {
.mapName(mapName)
.locationFence(locationFence)
.users(set)
.alarmType(alarmType)
.alarmTypes(alarmTypes)
.informManner(json)
.deleted(false)
.build();
......
......@@ -12,6 +12,7 @@ import java.io.Serial;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
......@@ -34,6 +35,12 @@ public class LocationAlarmRuleModifyParam implements Serializable {
@Serial
private static final long serialVersionUID = 388296602724939033L;
/**
* 这个字段给前端标识用,后端无意义
*/
@ApiModelProperty(value = "标识ID,无意义")
private Integer tabId;
@ApiModelProperty(value = "id", example = "1", required = true)
@NotEmpty(message = "规则id不能为空")
private Long id;
......@@ -44,9 +51,9 @@ public class LocationAlarmRuleModifyParam implements Serializable {
@ApiModelProperty(value = "地图名称", example = "一层", required = true)
private String mapName;
@ApiModelProperty(value = "报警类型id", example = "1", required = true)
@ApiModelProperty(value = "报警类型id", required = true)
@NotNull(message = "报警类型id不能为空")
private Long alarmId;
private Set<Long> alarmIds;
@ApiModelProperty(value = "电子围栏id", example = "1", required = true)
private Long fenceId;
......@@ -63,7 +70,10 @@ public class LocationAlarmRuleModifyParam implements Serializable {
for (Long item : this.users) {
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);
return LocationAlarmRule
.builder()
......@@ -72,9 +82,8 @@ public class LocationAlarmRuleModifyParam implements Serializable {
.mapName(mapName)
.locationFence(locationFence)
.users(set)
.alarmType(alarmType)
.alarmTypes(alarmTypes)
.informManner(json)
.deleted(false)
.build();
}
}
......@@ -18,11 +18,12 @@ import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Range;
/**
* 添加配置报警类别的报警规则,根据不同类型传入不同参数
* @author tml
* @version 1.0
* @date 2022/4/28 16:16
*/
@ApiModel("添加配置报警类别的报警规则,根据不同类型传入不同参数")
@ApiModel("LocationFenceRuleAddParam")
@Data
@Builder
@NoArgsConstructor
......
......@@ -10,12 +10,13 @@ import javax.validation.constraints.NotNull;
import lombok.*;
/**
* 修改配置报警类别的报警规则,根据不同类型传入不同参数
* @author tml
* @version 1.0
* @date 2022/4/28 16:16
*/
@EqualsAndHashCode(callSuper = true)
@ApiModel("修改配置报警类别的报警规则,根据不同类型传入不同参数")
@ApiModel("LocationFenceRuleModifyParam")
@Data
@NoArgsConstructor
@AllArgsConstructor
......
......@@ -12,11 +12,12 @@ import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 报警规则,根据不同类型传入不同参数
* @author tml
* @version 1.0
* @date 2022/4/29 14:12
*/
@ApiModel("报警规则,根据不同类型传入不同参数")
@ApiModel("RuleParam")
@Data
@Builder
@NoArgsConstructor
......
......@@ -66,8 +66,6 @@ public class AccidentSpotModifyParam implements Serializable {
.video(video)
.timeoutDuration(timeoutDuration)
.threshold(threshold)
.enable(false)
.deleted(false)
.build();
}
}
......@@ -64,8 +64,6 @@ public class EvacuationZoneModifyParam implements Serializable {
.video(video)
.timeoutDuration(timeoutDuration)
.threshold(threshold)
.enable(false)
.deleted(false)
.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. */
package com.yiring.app.rabbit.config;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import com.yiring.app.rabbit.receiver.PositionMessageHandler;
import javax.annotation.Resource;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
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.Configuration;
......@@ -16,8 +18,12 @@ import org.springframework.context.annotation.Configuration;
* 2019/8/21 15:44
*/
@Configuration
@ConditionalOnProperty(prefix = "zy-config.rabbitmq", value = "mock", havingValue = "true")
public class MockZyRabbitConfig {
@Resource
ZyConfigProperties.ZyConfigRabbitmq rabbitmq;
/**
* 消息交换机
*/
......@@ -33,16 +39,20 @@ public class MockZyRabbitConfig {
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
Binding bindingExchangeMock(
@Qualifier(ZyRabbitConfig.MESSAGE_QUEUES_NAME) Queue queue,
@Qualifier(ZyRabbitConfig.QUEUE_BEAN_NAME) Queue queue,
@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 @@
package com.yiring.app.rabbit.config;
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.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
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.Configuration;
import org.springframework.context.annotation.Primary;
......@@ -43,19 +39,6 @@ public class RabbitConfig {
@Bean
@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) {
return new RabbitTemplate(connectionFactory);
}
......
......@@ -36,6 +36,7 @@ public class ZyConfigProperties {
@ConfigurationProperties(prefix = "zy-config.rabbitmq")
public static class ZyConfigRabbitmq {
boolean mock;
boolean enabled;
String host;
int port;
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.rabbit.config;
import com.yiring.app.rabbit.receiver.PositionMessageHandler;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
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.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
......@@ -31,19 +29,9 @@ public class ZyRabbitConfig {
@Resource
ZyConfigProperties.ZyConfigRabbitmq rabbitmq;
@Resource
ConfigurableApplicationContext context;
public static final String CONNECTION_FACTORY_NAME = "zyRabbitConnectionFactory";
public static final String LISTENER_FACTORY_NAME = "zyRabbitListenerFactory";
public static final String TEMPLATE_NAME = "zyRabbitTemplate";
/**
* 消息队列名称(必须要与配置文件中的 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";
public static final String LISTENER_CONTAINER_NAME = "zyPositionMessageListenerContainer";
public static final String QUEUE_BEAN_NAME = "messageHandlerQueue";
@Bean(CONNECTION_FACTORY_NAME)
public ConnectionFactory zyConnectionFactory() {
......@@ -56,27 +44,35 @@ public class ZyRabbitConfig {
);
}
@Bean(LISTENER_FACTORY_NAME)
public RabbitListenerContainerFactory<?> rabbitListenerContainerFactory(
SimpleRabbitListenerContainerFactoryConfigurer configurer,
@Bean(LISTENER_CONTAINER_NAME)
@ConditionalOnProperty(prefix = "zy-config.rabbitmq", value = "mock", havingValue = "false")
public SimpleMessageListenerContainer simpleMessageListenerContainer(
PositionMessageHandler handler,
@Qualifier(QUEUE_BEAN_NAME) Queue queue,
@Qualifier(CONNECTION_FACTORY_NAME) ConnectionFactory connectionFactory
) {
// 检查队列名称是否与配置文件一致,避免监听错误
if (!MESSAGE_QUEUES_NAME.equals(rabbitmq.getQueueName())) {
log.error("队列名称不一致,请检查配置文件");
context.close();
return null;
}
return buildPositionMessageListenerContainer(handler, queue, connectionFactory);
}
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
// 手动确认消息模式
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
configurer.configure(factory, connectionFactory);
return factory;
@Bean(QUEUE_BEAN_NAME)
public Queue messageHandlerQueue() {
return new Queue(rabbitmq.getQueueName(), true, false, false);
}
@Bean(TEMPLATE_NAME)
public RabbitTemplate rabbitTemplate(@Qualifier(CONNECTION_FACTORY_NAME) ConnectionFactory connectionFactory) {
return new RabbitTemplate(connectionFactory);
public static SimpleMessageListenerContainer buildPositionMessageListenerContainer(
PositionMessageHandler handler,
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 @@
package com.yiring.app.rabbit.receiver;
import com.rabbitmq.client.Channel;
import com.yiring.app.rabbit.config.ZyRabbitConfig;
import com.yiring.app.service.message.ZyMessageService;
import com.yiring.app.service.message.PositionMessageService;
import com.yiring.common.annotation.Times;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
* 真源 RabbitMQ 消息监听(消息消费者)
* 真源消息监听处理器
*
* @author Jim
* @version 0.1
* 2022/4/13 17:13
* 2022/5/11 16:35
*/
@Slf4j
@Component
@Configuration
@ConditionalOnProperty(prefix = "zy-config.rabbitmq", value = "enabled", havingValue = "true")
public class ZyRabbitReceiver {
@Transactional(rollbackFor = Exception.class)
public class PositionMessageHandler implements ChannelAwareMessageListener {
// TODO
// 1. 新增消息订阅定时任务,检查是否正常订阅了真源定位系统的消息
......@@ -34,26 +32,15 @@ public class ZyRabbitReceiver {
// 3. 订阅 position(定位数据)、lowPower(低电量报警)、deviceStatus(设备状态)、keyWarning(按键报警)
@Resource
ZyMessageService zyMessageService;
PositionMessageService positionMessageService;
/**
* 订阅真源定位系统 RabbitMQ 推送过来的消息(主动订阅的一些消息类别)
* 参见: 定位平台接口规范V3.0.1 - 通用版.pdf #6
* @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 {
@Times("Position System Message Handler")
@Override
public void onMessage(Message message, Channel channel) throws IOException {
// 消费消息
zyMessageService.consume(msg);
positionMessageService.consume(new String(message.getBody(), StandardCharsets.UTF_8));
// 手动确认消息已收到
assert channel != null;
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}
}
......@@ -58,5 +58,5 @@ public interface AlarmService {
* @param conditionParam 条件
* @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 {
}
alarmType = optional.get();
}
JpaUtil.copyNotNullProperties(param, alarmType);
JpaUtil.copyNotNullProperties(param.transform(), alarmType);
return Result.ok();
}
......@@ -114,11 +114,10 @@ public class AlarmServiceImpl implements AlarmService {
}
@Override
public void exportAlarmType(AlarmConditionParam conditionParam, HttpServletResponse response, PageParam pageParam) {
Pageable pageable = PageParam.toPageable(pageParam);
public void exportAlarmType(AlarmConditionParam conditionParam, HttpServletResponse response) {
Specification<AlarmType> specification = getSpecification(conditionParam);
Page<AlarmType> page = alarmTypeRepository.findAll(specification, pageable);
List<AlarmTypeExcel> list = page.get().map(AlarmTypeExcel::transform).collect(Collectors.toList());
List<AlarmType> page = alarmTypeRepository.findAll(specification);
List<AlarmTypeExcel> list = page.stream().map(AlarmTypeExcel::transform).collect(Collectors.toList());
try (
DefaultStreamExcelBuilder<AlarmTypeExcel> streamExcelBuilder = DefaultStreamExcelBuilder
.of(AlarmTypeExcel.class)
......
......@@ -6,11 +6,13 @@ import com.yiring.app.param.broadcast.BroadcastAudioFindParam;
import com.yiring.app.param.broadcast.BroadcastAudioModifyParam;
import com.yiring.app.vo.broadcast.BroadcastAudioIndexVo;
import com.yiring.app.vo.broadcast.BroadcastAudioVo;
import com.yiring.auth.param.IdsParam;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.IndexParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import javax.servlet.http.HttpServletResponse;
/**
* 播报语音
......@@ -55,4 +57,11 @@ public interface BroadcastAudioService {
* @return Result<PageVo<BroadcastAudioIndexVo>>
*/
Result<PageVo<BroadcastAudioIndexVo>> index(IndexParam indexParam);
/**
* 批量下载
* @param idsParam IdsParam
* @param response HttpServletResponse
*/
void download(IdsParam idsParam, HttpServletResponse response);
}
......@@ -2,6 +2,8 @@
package com.yiring.app.service.broadcast.impl;
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 com.yiring.app.domain.broadcast.BroadcastAudio;
import com.yiring.app.domain.broadcast.BroadcastAudioRepository;
......@@ -9,8 +11,11 @@ import com.yiring.app.param.broadcast.BroadcastAudioAddParam;
import com.yiring.app.param.broadcast.BroadcastAudioFindParam;
import com.yiring.app.param.broadcast.BroadcastAudioModifyParam;
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.BroadcastAudioVo;
import com.yiring.auth.param.IdsParam;
import com.yiring.common.core.Minio;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.domain.BasicEntity;
......@@ -18,12 +23,17 @@ import com.yiring.common.param.IdParam;
import com.yiring.common.param.IndexParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import java.util.List;
import java.util.Optional;
import io.minio.GetObjectResponse;
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 javax.annotation.Resource;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Predicate;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
......@@ -47,6 +57,9 @@ public class BroadcastAudioServiceImpl implements BroadcastAudioService {
@Resource
BroadcastAudioRepository broadcastAudioRepository;
@Resource
Minio minio;
@Override
public Result<String> save(BroadcastAudioAddParam param) {
broadcastAudioRepository.save(BroadcastAudioAddParam.transform(param));
......@@ -122,4 +135,37 @@ public class BroadcastAudioServiceImpl implements BroadcastAudioService {
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 {
@Override
public Result<String> addDepartment(DepartmentAddParam departmentAddParam) {
// 查询用户相关信息
Optional<User> userOptional = userRepository.findOne(
Example.of(User.builder().id(departmentAddParam.getLeaderId()).build())
);
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
Optional<Department> departmentOptional = departmentRepository.findOne(
......@@ -157,13 +157,16 @@ public class DepartmentServiceImpl implements DepartmentService {
@Override
public void exportDepartment(DepartmentExportParam departmentExportParam, HttpServletResponse response) {
List<Department> departments = departmentRepository.findAll(
Example.of(Department.builder().enable(departmentExportParam.getEnable()).build())
);
List<DepartmentExportExcel> departmentExportExcels = departments
.stream()
.map(DepartmentExportExcel::transform)
.collect(Collectors.toList());
HashMap<String, Department> hashMap = getStringDepartmentHashMap();
List<DepartmentExportExcel> departmentExportExcels = ListUtil.toList();
hashMap.forEach((k, v) -> {
DepartmentExportExcel departmentExportExcel = DepartmentExportExcel.transform(v);
if (v.getEnable() == departmentExportParam.getEnable()) {
departmentExportExcel.setName(k);
departmentExportExcels.add(departmentExportExcel);
}
});
try (
DefaultStreamExcelBuilder<DepartmentExportExcel> streamExcelBuilder = DefaultStreamExcelBuilder
.of(DepartmentExportExcel.class)
......
......@@ -68,7 +68,7 @@ public class DistrictServiceImpl implements DistrictService {
district = optional.get();
}
//只修改要修改的值
JpaUtil.copyNotNullProperties(param, district);
JpaUtil.copyNotNullProperties(param.transform(), district);
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. */
package com.yiring.app.service.key;
import com.yiring.app.param.key.KeyAlarmRulesAddParam;
import com.yiring.app.param.key.KeyAlarmRulesExportParam;
import com.yiring.app.param.key.KeyAlarmRulesModifyParam;
import com.yiring.app.param.key.KeyAlarmRulesPageParam;
import com.yiring.app.vo.key.KeyAlarmRulesVo;
import com.yiring.app.param.key.KeyAlarmRuleAddParam;
import com.yiring.app.param.key.KeyAlarmRuleExportParam;
import com.yiring.app.param.key.KeyAlarmRuleModifyParam;
import com.yiring.app.param.key.KeyAlarmRulePageParam;
import com.yiring.app.vo.key.KeyAlarmRuleVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
......@@ -18,13 +18,13 @@ import javax.servlet.http.HttpServletResponse;
* @author LJ-2204
* @date 2022/5/6
*/
public interface KeyAlarmRulesService {
public interface KeyAlarmRuleService {
/**
* 添加报警类型
* @param keyAlarmRulesAddParam KeyAlarmRulesAddParam
* @param keyAlarmRuleAddParam KeyAlarmRuleAddParam
* @return Result<String>
*/
Result<String> add(KeyAlarmRulesAddParam keyAlarmRulesAddParam);
Result<String> add(KeyAlarmRuleAddParam keyAlarmRuleAddParam);
/**
* 删除报警规则
......@@ -35,23 +35,23 @@ public interface KeyAlarmRulesService {
/**
* 修改报警规则
* @param keyAlarmRulesModifyParam KeyAlarmRulesModifyParam
* @param keyAlarmRuleModifyParam KeyAlarmRuleModifyParam
* @return Result<String>
*/
Result<String> modify(KeyAlarmRulesModifyParam keyAlarmRulesModifyParam);
Result<String> modify(KeyAlarmRuleModifyParam keyAlarmRuleModifyParam);
/**
* 导出
* @param keyAlarmRulesExportParam KeyAlarmRulesExportParam
* @param keyAlarmRuleExportParam KeyAlarmRuleExportParam
* @param response HttpServletResponse
*/
void export(KeyAlarmRulesExportParam keyAlarmRulesExportParam, HttpServletResponse response);
void export(KeyAlarmRuleExportParam keyAlarmRuleExportParam, HttpServletResponse response);
/**
* 分页
* @param keyAlarmRulesPageParam KeyAlarmRulesPageParam
* @param keyAlarmRulePageParam KeyAlarmRulePageParam
* @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;
import com.yiring.common.core.Result;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import javax.servlet.http.HttpServletResponse;
/**
* 部门信息控制器
......@@ -21,4 +22,11 @@ public interface KeyAlarmService {
* @return Result<PageVo<KeyAlarmVo>>
*/
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;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.github.liaochong.myexcel.core.DefaultStreamExcelBuilder;
import com.yiring.app.domain.key.KeyAlarmRules;
import com.yiring.app.domain.key.KeyAlarmRulesRepository;
import com.yiring.app.excel.key.KeyAlarmRulesExportExcel;
import com.yiring.app.param.key.KeyAlarmRulesAddParam;
import com.yiring.app.param.key.KeyAlarmRulesExportParam;
import com.yiring.app.param.key.KeyAlarmRulesModifyParam;
import com.yiring.app.param.key.KeyAlarmRulesPageParam;
import com.yiring.app.service.key.KeyAlarmRulesService;
import com.yiring.app.vo.key.KeyAlarmRulesVo;
import com.yiring.app.domain.key.KeyAlarmRule;
import com.yiring.app.domain.key.KeyAlarmRuleRepository;
import com.yiring.app.excel.key.KeyAlarmRuleExportExcel;
import com.yiring.app.param.key.KeyAlarmRuleAddParam;
import com.yiring.app.param.key.KeyAlarmRuleExportParam;
import com.yiring.app.param.key.KeyAlarmRuleModifyParam;
import com.yiring.app.param.key.KeyAlarmRulePageParam;
import com.yiring.app.service.key.KeyAlarmRuleService;
import com.yiring.app.vo.key.KeyAlarmRuleVo;
import com.yiring.auth.domain.dept.Department;
import com.yiring.auth.domain.user.User;
import com.yiring.common.core.Result;
......@@ -37,6 +37,7 @@ import javax.persistence.criteria.Predicate;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
......@@ -54,15 +55,28 @@ import org.springframework.transaction.annotation.Transactional;
@Transactional(rollbackFor = RuntimeException.class)
@Service
@Slf4j
public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService {
public class KeyAlarmRuleServiceImpl implements KeyAlarmRuleService {
@Resource
KeyAlarmRulesRepository keyAlarmRulesRepository;
KeyAlarmRuleRepository keyAlarmRuleRepository;
@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<>();
String[] strings = keyAlarmRulesAddParam.getUserIds().split(",");
String[] strings = keyAlarmRuleAddParam.getUserIds().split(",");
Long[] ids = Convert.toLongArray(strings);
if (ids.length < 3) {
return Result.no(Status.BAD_REQUEST, "报警接收人至少3个");
......@@ -70,36 +84,34 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService {
for (Long id : ids) {
users.add(User.builder().id(id).build());
}
KeyAlarmRules keyAlarmRules = KeyAlarmRules
KeyAlarmRule keyAlarmRule = KeyAlarmRule
.builder()
.department(Department.builder().id(keyAlarmRulesAddParam.getDeptId()).build())
.department(Department.builder().id(keyAlarmRuleAddParam.getDeptId()).build())
.users(users)
.types(keyAlarmRulesAddParam.getTypes())
.types(keyAlarmRuleAddParam.getTypes())
.build();
keyAlarmRulesRepository.save(keyAlarmRules);
keyAlarmRuleRepository.save(keyAlarmRule);
return Result.ok();
}
@Override
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();
}
@Override
public Result<String> modify(KeyAlarmRulesModifyParam keyAlarmRulesModifyParam) {
Optional<KeyAlarmRules> keyAlarmRulesOptional = keyAlarmRulesRepository.findById(
keyAlarmRulesModifyParam.getId()
);
public Result<String> modify(KeyAlarmRuleModifyParam keyAlarmRuleModifyParam) {
Optional<KeyAlarmRule> keyAlarmRuleOptional = keyAlarmRuleRepository.findById(keyAlarmRuleModifyParam.getId());
if (keyAlarmRulesOptional.isEmpty()) return Result.no(Status.BAD_REQUEST, "报警规则不存在");
if (keyAlarmRuleOptional.isEmpty()) return Result.no(Status.BAD_REQUEST, "报警规则不存在");
HashSet<User> users = new HashSet<>();
String[] strings = keyAlarmRulesModifyParam.getUserIds().split(",");
String[] strings = keyAlarmRuleModifyParam.getUserIds().split(",");
Long[] ids = Convert.toLongArray(strings);
if (ids.length < 3) {
return Result.no(Status.BAD_REQUEST, "报警接收人至少3个");
......@@ -108,33 +120,33 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService {
users.add(User.builder().id(id).build());
}
KeyAlarmRules keyAlarmRules = keyAlarmRulesOptional.get();
keyAlarmRules.setDepartment(Department.builder().id(keyAlarmRulesModifyParam.getDeptId()).build());
keyAlarmRules.setUsers(users);
keyAlarmRules.setTypes(keyAlarmRulesModifyParam.getTypes());
KeyAlarmRule keyAlarmRule = keyAlarmRuleOptional.get();
keyAlarmRule.setDepartment(Department.builder().id(keyAlarmRuleModifyParam.getDeptId()).build());
keyAlarmRule.setUsers(users);
keyAlarmRule.setTypes(keyAlarmRuleModifyParam.getTypes());
keyAlarmRulesRepository.save(keyAlarmRules);
keyAlarmRuleRepository.save(keyAlarmRule);
return Result.ok();
}
@Override
public void export(KeyAlarmRulesExportParam keyAlarmRulesExportParam, HttpServletResponse response) {
Specification<KeyAlarmRules> specification = (root, cq, cb) -> {
public void export(KeyAlarmRuleExportParam keyAlarmRuleExportParam, HttpServletResponse response) {
Specification<KeyAlarmRule> specification = (root, cq, cb) -> {
List<Predicate> predicates = ListUtil.toList();
if (StrUtil.isNotEmpty(keyAlarmRulesExportParam.getDeptIds())) {
String[] ids = keyAlarmRulesExportParam.getDeptIds().split(",");
if (StrUtil.isNotEmpty(keyAlarmRuleExportParam.getDeptIds())) {
String[] ids = keyAlarmRuleExportParam.getDeptIds().split(",");
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));
predicates.add(in);
}
if (StrUtil.isNotEmpty(keyAlarmRulesExportParam.getTypes())) {
String[] types = keyAlarmRulesExportParam.getTypes().split(",");
if (StrUtil.isNotEmpty(keyAlarmRuleExportParam.getTypes())) {
String[] types = keyAlarmRuleExportParam.getTypes().split(",");
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 {
return cq.orderBy(order).where(predicates.toArray(new Predicate[0])).getRestriction();
};
List<KeyAlarmRules> keyAlarmRules = keyAlarmRulesRepository.findAll(specification);
List<KeyAlarmRulesExportExcel> keyAlarmRulesExportExcels = keyAlarmRules
List<KeyAlarmRule> keyAlarmRules = keyAlarmRuleRepository.findAll(specification);
List<KeyAlarmRuleExportExcel> keyAlarmRuleExportExcels = keyAlarmRules
.stream()
.map(KeyAlarmRulesExportExcel::transform)
.map(KeyAlarmRuleExportExcel::transform)
.collect(Collectors.toList());
try (
DefaultStreamExcelBuilder<KeyAlarmRulesExportExcel> streamExcelBuilder = DefaultStreamExcelBuilder
.of(KeyAlarmRulesExportExcel.class)
DefaultStreamExcelBuilder<KeyAlarmRuleExportExcel> streamExcelBuilder = DefaultStreamExcelBuilder
.of(KeyAlarmRuleExportExcel.class)
.threadPool(Executors.newFixedThreadPool(2))
.rowHeight(14)
.titleRowHeight(14)
......@@ -161,7 +173,7 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService {
)
.start()
) {
streamExcelBuilder.append(keyAlarmRulesExportExcels);
streamExcelBuilder.append(keyAlarmRuleExportExcels);
String fileName = URLEncoder.encode("按键报警规则信息.xlsx", StandardCharsets.UTF_8);
......@@ -183,23 +195,23 @@ public class KeyAlarmRulesServiceImpl implements KeyAlarmRulesService {
}
@Override
public Result<PageVo<KeyAlarmRulesVo>> page(KeyAlarmRulesPageParam keyAlarmRulesPageParam, PageParam pageParam) {
Specification<KeyAlarmRules> specification = (root, cq, cb) -> {
public Result<PageVo<KeyAlarmRuleVo>> page(KeyAlarmRulePageParam keyAlarmRulePageParam, PageParam pageParam) {
Specification<KeyAlarmRule> specification = (root, cq, cb) -> {
List<Predicate> predicates = ListUtil.toList();
if (StrUtil.isNotEmpty(keyAlarmRulesPageParam.getDeptIds())) {
String[] ids = keyAlarmRulesPageParam.getDeptIds().split(",");
if (StrUtil.isNotEmpty(keyAlarmRulePageParam.getDeptIds())) {
String[] ids = keyAlarmRulePageParam.getDeptIds().split(",");
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));
predicates.add(in);
}
if (StrUtil.isNotEmpty(keyAlarmRulesPageParam.getTypes())) {
String[] types = keyAlarmRulesPageParam.getTypes().split(",");
if (StrUtil.isNotEmpty(keyAlarmRulePageParam.getTypes())) {
String[] types = keyAlarmRulePageParam.getTypes().split(",");
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 {
};
Pageable pageable = PageRequest.of(pageParam.getPageNo() - 1, pageParam.getPageSize());
Page<KeyAlarmRules> pages = keyAlarmRulesRepository.findAll(specification, pageable);
List<KeyAlarmRulesVo> keyAlarmRulesVos = pages
Page<KeyAlarmRule> pages = keyAlarmRuleRepository.findAll(specification, pageable);
List<KeyAlarmRuleVo> keyAlarmRuleVos = pages
.getContent()
.stream()
.map(KeyAlarmRulesVo::transform)
.map(KeyAlarmRuleVo::transform)
.collect(Collectors.toList());
PageVo<KeyAlarmRulesVo> pageVo = PageVo.build(keyAlarmRulesVos, pages.getTotalElements());
PageVo<KeyAlarmRuleVo> pageVo = PageVo.build(keyAlarmRuleVos, pages.getTotalElements());
return Result.ok(pageVo);
}
}
......@@ -4,10 +4,12 @@ package com.yiring.app.service.key.impl;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.ObjectUtil;
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.KeyAlarmRepository;
import com.yiring.app.domain.key.KeyAlarmRules;
import com.yiring.app.domain.key.KeyAlarmRulesRepository;
import com.yiring.app.domain.key.KeyAlarmRule;
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.service.key.KeyAlarmService;
import com.yiring.app.vo.key.KeyAlarmVo;
......@@ -17,14 +19,20 @@ 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.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Predicate;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
......@@ -48,7 +56,7 @@ public class KeyAlarmServiceImpl implements KeyAlarmService {
KeyAlarmRepository keyAlarmRepository;
@Resource
KeyAlarmRulesRepository keyAlarmRulesRepository;
KeyAlarmRuleRepository keyAlarmRuleRepository;
@Override
public Result<PageVo<KeyAlarmVo>> page(KeyAlarmFindParam param, PageParam pageParam) {
......@@ -101,13 +109,13 @@ public class KeyAlarmServiceImpl implements KeyAlarmService {
.build();
keyAlarmVo.setUser(userVo);
}
Optional<KeyAlarmRules> keyAlarmRulesOptional = keyAlarmRulesRepository.findById(
Optional<KeyAlarmRule> keyAlarmRuleOptional = keyAlarmRuleRepository.findById(
leader.getDepartment().getId()
);
if (keyAlarmRulesOptional.isPresent()) {
KeyAlarmRules keyAlarmRules = keyAlarmRulesOptional.get();
Set<User> users = keyAlarmRules.getUsers();
if (keyAlarmRuleOptional.isPresent()) {
KeyAlarmRule keyAlarmRule = keyAlarmRuleOptional.get();
Set<User> users = keyAlarmRule.getUsers();
List<String> names = users.stream().map(User::getRealName).collect(Collectors.toList());
keyAlarmVo.setReceiver(StrUtil.join(",", names));
}
......@@ -119,4 +127,94 @@ public class KeyAlarmServiceImpl implements KeyAlarmService {
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 {
}
locationFence = optional.get();
}
JpaUtil.copyNotNullProperties(param, locationFence);
JpaUtil.copyNotNullProperties(param.transform(), locationFence);
return Result.ok();
}
......
/* (C) 2022 YiRing, Inc. */
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.LocationAlarmRuleModifyParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleParam;
......@@ -10,7 +11,9 @@ import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import java.util.Set;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
/**
* @author tml
......@@ -26,6 +29,13 @@ public interface LocationAlarmRuleService {
Result<String> addRule(LocationAlarmRuleAddParam param);
/**
* 批量添加
* @param params 规则信息
* @return 是否成功
*/
Result<String> batchAdd(@Valid Set<LocationAlarmRuleAddParam> params);
/**
* 修改一条规则
* @param param 规则信息
* @return 是否成功
......@@ -33,6 +43,13 @@ public interface LocationAlarmRuleService {
Result<String> modifyRule(LocationAlarmRuleModifyParam param);
/**
* 批量修改规则
* @param params 规则信息
* @return 是否成功
*/
Result<String> batchModify(AlarmRuleBatchModifyParam params);
/**
* 删除一条规则
* @param idParam 规则id
* @return 是否成功
......@@ -58,9 +75,8 @@ public interface LocationAlarmRuleService {
* 导出电子围栏规则
* @param param 条件
* @param response response
* @param pageParam 分页参数
*/
void exportAlarmRule(LocationAlarmRuleParam param, HttpServletResponse response, PageParam pageParam);
void exportAlarmRule(LocationAlarmRuleParam param, HttpServletResponse response);
/**
* 根据电子围栏名称模糊查询围栏id和名称
......
......@@ -9,6 +9,7 @@ import com.yiring.app.domain.location.LocationAlarmRuleRepository;
import com.yiring.app.domain.location.LocationFence;
import com.yiring.app.domain.location.LocationFenceRepository;
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.LocationAlarmRuleModifyParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleParam;
......@@ -69,6 +70,16 @@ public class LocationAlarmRuleServiceImpl implements LocationAlarmRuleService {
}
@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) {
LocationAlarmRule locationAlarmRule = param.transform();
Optional<LocationAlarmRule> optional = locationAlarmRuleRepository.findById(param.getId());
......@@ -80,6 +91,17 @@ public class LocationAlarmRuleServiceImpl implements LocationAlarmRuleService {
}
@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) {
Optional<LocationAlarmRule> optional = locationAlarmRuleRepository.findById(idParam.getId());
if (optional.isEmpty()) {
......@@ -144,14 +166,26 @@ public class LocationAlarmRuleServiceImpl implements LocationAlarmRuleService {
}
@Override
public void exportAlarmRule(LocationAlarmRuleParam param, HttpServletResponse response, PageParam pageParam) {
Result<PageVo<LocationAlarmRuleVo>> result = findByCondition(param, pageParam);
if (Status.OK.value() != result.getStatus()) {
return;
public void exportAlarmRule(LocationAlarmRuleParam param, HttpServletResponse response) {
Specification<LocationAlarmRule> specification = getSpecification(param);
Set<Integer> informManner = param.getInformManner();
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
.getBody()
.getData()
List<LocationAlarmRuleExcel> excelList = list
.stream()
.map(LocationAlarmRuleExcel::transform)
.collect(Collectors.toList());
......
......@@ -8,7 +8,7 @@ package com.yiring.app.service.message;
* @version 0.1
* 2022/5/9 10:16
*/
public interface ZyMessageService {
public interface PositionMessageService {
/**
* 消费消息
* @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 {
}
accidentSpot = optional.get();
}
JpaUtil.copyNotNullProperties(param, accidentSpot);
JpaUtil.copyNotNullProperties(param.transform(), accidentSpot);
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 {
.filter(userImportExcel ->
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());
userImportExcels.forEach(userImportExcel -> {
......@@ -475,14 +469,11 @@ public class UserAppServiceImpl implements UserAppService {
Object id = JSONUtil.parseObj(records.get(0)).get("id");
Post post = postMap.get(userImportExcel.getPostName()).get(0);
user.setLinkId(Convert.toLong(id));
user.setDepartment(department);
user.setPost(post);
User saveUser = userRepository.save(user);
if (StrUtil.isNotEmpty(userImportExcel.getCode())) {
LocationTag locationTag = LocationTag.builder().code(userImportExcel.getCode()).user(saveUser).build();
locationTagRepository.save(locationTag);
}
userRepository.save(user);
});
return Result.ok();
......
......@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
import com.yiring.app.util.zy.LonLatUtil;
import lombok.experimental.UtilityClass;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.Point;
......@@ -22,6 +23,8 @@ public class GeoUtils {
public final GeometryFactory factory = new GeometryFactory();
public final int DEFAULT_SRID = 4326;
/**
* 创建点
*
......@@ -30,7 +33,7 @@ public class GeoUtils {
* @return 点
*/
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 {
* @return 点
*/
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 {
y
);
// 构建经纬度坐标信息
Coordinate coordinate = new Coordinate(
// 构建一个坐标点
return createPoint(
result.getDoubleValue("lon"),
result.getDoubleValue("lat"),
root.getDoubleValue("altitude") + z
result.getDoubleValue("altitude") + z
);
return factory.createPoint(coordinate);
}
/**
......@@ -110,6 +114,17 @@ public class GeoUtils {
public Point randomPoint(double minX, double minY, double maxX, double maxY, double z) {
double x = minX + (maxX - minX) * 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;
import com.alibaba.fastjson.JSONObject;
/**
* 从真源拿到的引擎计算经纬度的工具类
* @author Jim
* @version 0.1
* 2022/5/9 16:41
......@@ -16,8 +17,8 @@ public class LonLatUtil {
public static JSONObject getRoot() {
JSONObject root = new JSONObject();
root.put("lon", 0D);
root.put("lat", 0D);
root.put("lon", 112.85893346021206);
root.put("lat", 30.473384230484854);
root.put("x", 0D);
root.put("y", 0D);
root.put("altitude", 0D);
......
/* (C) 2022 YiRing, Inc. */
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.ApiModelProperty;
import java.io.Serial;
......@@ -27,6 +29,7 @@ public class CodeNameVo implements Serializable {
private static final long serialVersionUID = -7565315836652536620L;
@ApiModelProperty(value = "code", example = "1", required = true)
@JsonSerialize(using = ToStringSerializer.class)
private Integer code;
@ApiModelProperty(value = "name", example = "名称", required = true)
......
/* (C) 2022 YiRing, Inc. */
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.ApiModelProperty;
import java.io.Serial;
......@@ -25,6 +27,7 @@ public class IdNameVo implements Serializable {
@Serial
private static final long serialVersionUID = -8990274383112436122L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "id", example = "1", required = true)
private Long id;
......
......@@ -20,7 +20,7 @@ import lombok.NoArgsConstructor;
* @version 1.0
* @date 2022/4/27 11:55
*/
@ApiModel("AlarmTypeVo(报警信息)")
@ApiModel("报警信息")
@Data
@Builder
@NoArgsConstructor
......
......@@ -14,13 +14,14 @@ import lombok.NoArgsConstructor;
import org.locationtech.jts.geom.Point;
/**
* 历史轨迹信息VO
* @author tml
* @version 1.0
* @date 2022/5/6 14:18
*/
@Data
@Builder
@ApiModel("历史轨迹信息VO")
@ApiModel("HistoryRouteVo")
@NoArgsConstructor
@AllArgsConstructor
public class HistoryRouteVo implements Serializable {
......
......@@ -19,7 +19,7 @@ import lombok.NoArgsConstructor;
* @version 1.0
* @date 2022/4/27 9:10
*/
@ApiModel("DistrictVo(区域信息)")
@ApiModel("DistrictVo")
@Data
@Builder
@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;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
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.auth.domain.user.User;
import io.swagger.annotations.ApiModel;
......@@ -23,13 +23,13 @@ import lombok.experimental.FieldDefaults;
* @date 2022/5/7
*/
@ApiModel("KeyAlarmRulesVo")
@ApiModel("KeyAlarmRuleVo")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class KeyAlarmRulesVo implements Serializable {
public class KeyAlarmRuleVo implements Serializable {
@Serial
private static final long serialVersionUID = 5083435104462641333L;
......@@ -51,17 +51,17 @@ public class KeyAlarmRulesVo implements Serializable {
@ApiModelProperty(value = "推送类型", example = "111")
String[] types;
public static KeyAlarmRulesVo transform(KeyAlarmRules keyAlarmRules) {
Set<User> users = keyAlarmRules.getUsers();
public static KeyAlarmRuleVo transform(KeyAlarmRule keyAlarmRule) {
Set<User> users = keyAlarmRule.getUsers();
List<UserInfoVo> userInfoVos = users.stream().map(UserInfoVo::transform).collect(Collectors.toList());
return KeyAlarmRulesVo
return KeyAlarmRuleVo
.builder()
.id(keyAlarmRules.getId())
.deptId(keyAlarmRules.getDepartment().getId())
.deptName(keyAlarmRules.getDepartment().getName())
.id(keyAlarmRule.getId())
.deptId(keyAlarmRule.getDepartment().getId())
.deptName(keyAlarmRule.getDepartment().getName())
.users(userInfoVos)
.types(keyAlarmRules.getTypes().split(","))
.types(keyAlarmRule.getTypes().split(","))
.build();
}
}
......@@ -20,11 +20,12 @@ import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 围栏信息VO
* @author tml
* @version 1.0
* @date 2022/4/28 11:07
*/
@ApiModel("围栏信息VO")
@ApiModel("LocationFenceVo")
@Data
@Builder
@AllArgsConstructor
......
......@@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.app.constant.alarm.InformMannerEnum;
import com.yiring.app.domain.location.LocationAlarmRule;
import com.yiring.app.vo.CodeNameVo;
import com.yiring.app.vo.IdNameVo;
import com.yiring.app.vo.user.UserVo;
import com.yiring.auth.domain.user.User;
import io.swagger.annotations.ApiModel;
......@@ -61,6 +62,9 @@ public class LocationAlarmRuleVo implements Serializable {
@ApiModelProperty(value = "通知方式集合", required = true)
private List<CodeNameVo> informManner;
@ApiModelProperty(value = "报警类型id", required = true)
private List<IdNameVo> alarmTypeIds;
public static LocationAlarmRuleVo transform(LocationAlarmRule locationAlarmRule) {
Set<User> users = locationAlarmRule.getUsers();
List<UserVo> userVos = users.stream().map(UserVo::transformDept).collect(Collectors.toList());
......@@ -70,6 +74,11 @@ public class LocationAlarmRuleVo implements Serializable {
for (Integer item : list) {
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
.builder()
.id(locationAlarmRule.getId())
......@@ -79,6 +88,7 @@ public class LocationAlarmRuleVo implements Serializable {
.fenceName(locationAlarmRule.getLocationFence().getName())
.users(userVos)
.informManner(codeNameVos)
.alarmTypeIds(alarmTypeList)
.build();
}
}
......@@ -19,11 +19,12 @@ import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 修改配置报警类别的报警规则,根据不同类型传入不同参数
* @author tml
* @version 1.0
* @date 2022/4/28 16:16
*/
@ApiModel("修改配置报警类别的报警规则,根据不同类型传入不同参数")
@ApiModel("LocationFenceRuleVo")
@Data
@Builder
@NoArgsConstructor
......
......@@ -14,11 +14,12 @@ import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 报警规则,根据不同类型传入不同参数
* @author tml
* @version 1.0
* @date 2022/4/29 14:12
*/
@ApiModel("报警规则,根据不同类型传入不同参数")
@ApiModel("RuleVo")
@Data
@Builder
@NoArgsConstructor
......
/* (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.domain.rehearsal.AccidentSpot;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
......@@ -13,6 +15,7 @@ import lombok.NoArgsConstructor;
import org.locationtech.jts.geom.Geometry;
/**
* 事故点VO
* @author tml
* @version 1.0
* @date 2022/5/7 11:25
......@@ -21,12 +24,13 @@ import org.locationtech.jts.geom.Geometry;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("事故点VO")
@ApiModel("AccidentSpotVo")
public class AccidentSpotVo implements Serializable {
@Serial
private static final long serialVersionUID = -7696351020089245510L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "事故点id", example = "1")
private Long id;
......
/* (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.domain.rehearsal.EvacuationZone;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
......@@ -27,6 +29,7 @@ public class EvacuationZoneVo implements Serializable {
@Serial
private static final long serialVersionUID = 919152196104921261L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "撤离区id", example = "1")
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. */
package com.yiring.app.web;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.app.constant.Code;
import com.yiring.app.exception.CodeException;
import com.yiring.app.util.zy.ZyUtil;
......@@ -23,10 +24,12 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Validated
@Api(tags = "Hello")
@RequestMapping("/hello/")
@SuppressWarnings({ "deprecation" })
@ApiSupport(order = 0)
@Api(tags = "示例", description = "Example")
@RequestMapping("/example/")
@RestController
public class HelloController {
public class ExampleController {
String text = "😎 Hello World";
......
......@@ -20,7 +20,6 @@ import java.util.Objects;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Sort;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
......@@ -35,9 +34,10 @@ import org.springframework.web.bind.annotation.RestController;
* @version 1.0
* @date 2022/4/27 14:18
*/
@Slf4j
@Validated
@Api(tags = "AlarmType(报警类型)")
@SuppressWarnings({ "deprecation" })
@Api(tags = "报警类型", description = "AlarmType")
@RestController
@RequestMapping("/alarm/type")
public class AlarmTypeController {
......@@ -98,11 +98,7 @@ public class AlarmTypeController {
@ApiOperation(value = "报警类型导出", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@PostMapping("/exportAlarmType")
public void exportAlarmType(
@Valid AlarmConditionParam conditionParam,
HttpServletResponse response,
@Valid PageParam pageParam
) {
alarmService.exportAlarmType(conditionParam, response, pageParam);
public void exportAlarmType(@Valid AlarmConditionParam conditionParam, HttpServletResponse response) {
alarmService.exportAlarmType(conditionParam, response);
}
}
......@@ -22,8 +22,10 @@ import org.springframework.web.bind.annotation.RestController;
* @version 1.0
* @date 2022/5/6 10:36
*/
@Api(tags = "HistoryRoute(历史轨迹)")
@Validated
@SuppressWarnings({ "deprecation" })
@Api(tags = "历史轨迹", description = "HistoryRoute")
@RestController
@RequestMapping("/history/route")
public class HistoryRouteController {
......
......@@ -9,7 +9,6 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
......@@ -22,9 +21,10 @@ import org.springframework.web.bind.annotation.RestController;
* @description:
* @date 2022/4/28 13:48
*/
@Slf4j
@Validated
@Api(tags = "小程序用户")
@SuppressWarnings({ "deprecation" })
@Api(tags = "小程序用户", description = "AppletUser")
@RestController
@RequestMapping("/appUser/")
public class AppletUserController {
......
......@@ -7,6 +7,7 @@ import com.yiring.app.param.broadcast.BroadcastAudioModifyParam;
import com.yiring.app.service.broadcast.BroadcastAudioService;
import com.yiring.app.vo.broadcast.BroadcastAudioIndexVo;
import com.yiring.app.vo.broadcast.BroadcastAudioVo;
import com.yiring.auth.param.IdsParam;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.IndexParam;
......@@ -15,8 +16,9 @@ import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -27,9 +29,9 @@ import org.springframework.web.bind.annotation.*;
* @date 2022/5/7
*/
@Slf4j
@Api(tags = "播报音频")
@Validated
@SuppressWarnings({ "deprecation" })
@Api(tags = "播报音频", description = "BroadcastAudio")
@RestController
@RequestMapping("/broadcast/audio")
public class BroadcastAudioController {
......@@ -67,7 +69,9 @@ public class BroadcastAudioController {
return broadcastAudioService.index(indexParam);
}
@ApiOperation("批量下载")
@ApiOperation(value = "批量下载", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@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;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.locationtech.jts.geom.Point;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
......@@ -33,9 +32,10 @@ import org.springframework.web.multipart.MultipartFile;
* @description:
* @date 2022/5/6 10:15
*/
@Slf4j
@Validated
@Api(tags = "Broadcast(播报设备管理)")
@SuppressWarnings({ "deprecation" })
@Api(tags = "播报设备管理", description = "Broadcast")
@RestController
@RequestMapping("/broadcast/")
public class BroadcastController {
......
......@@ -17,7 +17,7 @@ import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
......@@ -28,9 +28,9 @@ import org.springframework.web.multipart.MultipartFile;
* @date 2022/4/19
*/
@Slf4j
@Validated
@Api(tags = "部门信息")
@SuppressWarnings({ "deprecation" })
@Api(tags = "部门信息", description = "Department")
@RestController
@RequestMapping("/dept/")
public class DepartmentController {
......@@ -56,7 +56,7 @@ public class DepartmentController {
return departmentService.findDepartmentInfo(idParam);
}
@ApiOperation("部门导出")
@ApiOperation(value = "部门导出", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@GetMapping("exportDepartment")
public void exportDepartment(@Valid DepartmentExportParam departmentExportParam, HttpServletResponse response) {
departmentService.exportDepartment(departmentExportParam, response);
......
......@@ -15,7 +15,6 @@ import io.swagger.annotations.ApiOperation;
import java.util.ArrayList;
import javax.annotation.Resource;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
......@@ -28,9 +27,10 @@ import org.springframework.web.bind.annotation.RestController;
* @author tzl
* 2022/4/13 17:10
*/
@Slf4j
@Validated
@Api(tags = "Dict")
@SuppressWarnings({ "deprecation" })
@Api(tags = "数据字典", description = "Dict")
@RestController
@RequestMapping("/Dict/")
public class DictController {
......
......@@ -2,7 +2,6 @@
package com.yiring.app.web.dict;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
......@@ -14,9 +13,9 @@ import org.springframework.web.bind.annotation.RestController;
* 2022/4/14 15:14
*/
@Slf4j
@Validated
@Api(tags = "DictType")
@SuppressWarnings({ "deprecation" })
@Api(tags = "数据字典类型", description = "DictType")
@RestController
@RequestMapping("/DictType/")
public class DictTypeController {
......
......@@ -13,7 +13,6 @@ import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -23,9 +22,10 @@ import org.springframework.web.bind.annotation.*;
* @version 1.0
* @date 2022/4/26 10:15
*/
@Slf4j
@Validated
@Api(tags = "District(区域管理)")
@SuppressWarnings({ "deprecation" })
@Api(tags = "区域管理", description = "District")
@RestController
@RequestMapping("/district/")
public class DistrictController {
......
......@@ -12,7 +12,6 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
......@@ -25,9 +24,10 @@ import org.springframework.web.bind.annotation.RestController;
* @description:
* @date 2022/5/5 15:18
*/
@Slf4j
@Validated
@Api(tags = "Icon(图标管理)")
@SuppressWarnings({ "deprecation" })
@Api(tags = "图标管理", description = "Icon")
@RestController
@RequestMapping("/icon/")
public class IconController {
......
......@@ -10,7 +10,7 @@ import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
......@@ -23,9 +23,9 @@ import org.springframework.web.bind.annotation.RestController;
* @date 2022/5/10
*/
@Slf4j
@Validated
@Api(tags = "按键报警")
@SuppressWarnings({ "deprecation" })
@Api(tags = "按键报警", description = "KeyAlarm")
@RestController
@RequestMapping("/key/alarm")
public class KeyAlarmController {
......@@ -38,4 +38,10 @@ public class KeyAlarmController {
public Result<PageVo<KeyAlarmVo>> page(KeyAlarmFindParam param, PageParam 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. */
package com.yiring.app.web.key;
import com.yiring.app.param.key.KeyAlarmRulesAddParam;
import com.yiring.app.param.key.KeyAlarmRulesExportParam;
import com.yiring.app.param.key.KeyAlarmRulesModifyParam;
import com.yiring.app.param.key.KeyAlarmRulesPageParam;
import com.yiring.app.service.key.KeyAlarmRulesService;
import com.yiring.app.vo.key.KeyAlarmRulesVo;
import com.yiring.app.param.key.KeyAlarmRuleAddParam;
import com.yiring.app.param.key.KeyAlarmRuleExportParam;
import com.yiring.app.param.key.KeyAlarmRuleModifyParam;
import com.yiring.app.param.key.KeyAlarmRulePageParam;
import com.yiring.app.service.key.KeyAlarmRuleService;
import com.yiring.app.vo.key.KeyAlarmRuleVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
......@@ -15,7 +15,6 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -26,43 +25,43 @@ import org.springframework.web.bind.annotation.*;
* @date 2022/5/6
*/
@Slf4j
@Validated
@Api(tags = "按键报警规则")
@SuppressWarnings({ "deprecation" })
@Api(tags = "按键报警规则", description = "KeyAlarmRule")
@RestController
@RequestMapping("/key/alarm/rules")
public class KeyAlarmRulesController {
public class KeyAlarmRuleController {
@Resource
KeyAlarmRulesService keyAlarmRulesService;
KeyAlarmRuleService keyAlarmRuleService;
@ApiOperation("新增报警规则")
@PostMapping("add")
public Result<String> add(KeyAlarmRulesAddParam keyAlarmRulesAddParam) {
return keyAlarmRulesService.add(keyAlarmRulesAddParam);
public Result<String> add(KeyAlarmRuleAddParam keyAlarmRuleAddParam) {
return keyAlarmRuleService.add(keyAlarmRuleAddParam);
}
@ApiOperation("删除报警规则")
@DeleteMapping("delete")
public Result<String> delete(IdParam idParam) {
return keyAlarmRulesService.delete(idParam);
return keyAlarmRuleService.delete(idParam);
}
@ApiOperation("更新报警规则")
@PutMapping("modify")
public Result<String> modify(KeyAlarmRulesModifyParam keyAlarmRulesModifyParam) {
return keyAlarmRulesService.modify(keyAlarmRulesModifyParam);
public Result<String> modify(KeyAlarmRuleModifyParam keyAlarmRuleModifyParam) {
return keyAlarmRuleService.modify(keyAlarmRuleModifyParam);
}
@ApiOperation("导出")
@GetMapping("export")
public void export(KeyAlarmRulesExportParam keyAlarmRulesExportParam, HttpServletResponse response) {
keyAlarmRulesService.export(keyAlarmRulesExportParam, response);
public void export(KeyAlarmRuleExportParam keyAlarmRuleExportParam, HttpServletResponse response) {
keyAlarmRuleService.export(keyAlarmRuleExportParam, response);
}
@ApiOperation("表格查询")
@GetMapping("page")
public Result<PageVo<KeyAlarmRulesVo>> page(KeyAlarmRulesPageParam keyAlarmRulesPageParam, PageParam pageParam) {
return keyAlarmRulesService.page(keyAlarmRulesPageParam, pageParam);
public Result<PageVo<KeyAlarmRuleVo>> page(KeyAlarmRulePageParam keyAlarmRulePageParam, PageParam pageParam) {
return keyAlarmRuleService.page(keyAlarmRulePageParam, pageParam);
}
}
......@@ -13,7 +13,6 @@ import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
......@@ -27,9 +26,9 @@ import org.springframework.web.bind.annotation.RestController;
* @date 2022/4/27
*/
@Slf4j
@Validated
@Api(tags = "定位信标")
@SuppressWarnings({ "deprecation" })
@Api(tags = "定位信标", description = "LocationBeacon")
@RestController
@RequestMapping("/location/beacon/")
public class LocationBeaconController {
......
......@@ -19,7 +19,6 @@ import io.swagger.annotations.ApiOperation;
import java.util.Objects;
import javax.annotation.Resource;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Sort;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
......@@ -32,11 +31,12 @@ import org.springframework.web.bind.annotation.RestController;
* @version 1.0
* @date 2022/4/28 11:50
*/
@RestController
@Api(tags = "Fence(围栏信息)")
@Validated
@Slf4j
@RequestMapping("location/fence")
@SuppressWarnings({ "deprecation" })
@Api(tags = "围栏信息", description = "LocationFence")
@RestController
@RequestMapping("/location/fence")
public class LocationFenceController {
@Resource
......
......@@ -3,9 +3,7 @@ package com.yiring.app.web.location.rule;
import com.yiring.app.constant.alarm.InformMannerEnum;
import com.yiring.app.domain.alarm.AlarmType;
import com.yiring.app.param.location.rule.LocationAlarmRuleAddParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleModifyParam;
import com.yiring.app.param.location.rule.LocationAlarmRuleParam;
import com.yiring.app.param.location.rule.*;
import com.yiring.app.service.location.rule.LocationAlarmRuleService;
import com.yiring.app.vo.CodeNameVo;
import com.yiring.app.vo.IdNameVo;
......@@ -22,23 +20,20 @@ import java.util.Objects;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Sort;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
/**
* @author tml
* @version 1.0
* @date 2022/5/5 14:19
*/
@Slf4j
@Validated
@Api(tags = "AlarmRule(电子围栏报警规则,配置报警给谁)")
@SuppressWarnings({ "deprecation" })
@Api(tags = "电子围栏报警规则,配置报警给谁", description = "AlarmRule")
@RestController
@RequestMapping("/alarm/rule")
public class LocationAlarmRuleController {
......@@ -52,12 +47,24 @@ public class LocationAlarmRuleController {
return locationAlarmRuleService.addRule(param);
}
@ApiOperation(value = "批量添加电子围栏报警规则")
@PostMapping("/batchAdd")
public Result<String> batchAdd(@Valid @RequestBody AlarmRuleBatchAddParam params) {
return locationAlarmRuleService.batchAdd(params.getParams());
}
@ApiOperation(value = "修改一条电子围栏报警规则")
@PostMapping("/modifyRule")
public Result<String> modifyRule(@Valid LocationAlarmRuleModifyParam param) {
return locationAlarmRuleService.modifyRule(param);
}
@ApiOperation(value = "批量修改电子围栏报警规则")
@PostMapping("/batchModify")
public Result<String> batchModify(@Valid @RequestBody AlarmRuleBatchModifyParam params) {
return locationAlarmRuleService.batchModify(params);
}
@ApiOperation(value = "删除一条电子围栏报警规则")
@PostMapping("/removeRule")
public Result<String> removeRule(@Valid IdParam idParam) {
......@@ -93,12 +100,8 @@ public class LocationAlarmRuleController {
@ApiOperation(value = "导出电子围栏报警规则", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@PostMapping("/exportAlarmRule")
public void exportAlarmRule(
@Valid LocationAlarmRuleParam param,
HttpServletResponse response,
@Valid PageParam pageParam
) {
locationAlarmRuleService.exportAlarmRule(param, response, pageParam);
public void exportAlarmRule(@Valid LocationAlarmRuleParam param, HttpServletResponse response) {
locationAlarmRuleService.exportAlarmRule(param, response);
}
@ApiOperation("围栏信息下拉框")
......
......@@ -13,7 +13,6 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
......@@ -25,9 +24,10 @@ import org.springframework.web.bind.annotation.RestController;
* @version 1.0
* @date 2022/4/29 9:05
*/
@Slf4j
@Validated
@Api(tags = "FenceRule(电子围栏报警规则,什么情况下会报警)")
@SuppressWarnings({ "deprecation" })
@Api(tags = "电子围栏报警规则,什么情况下会报警", description = "FenceRule")
@RestController
@RequestMapping("/location/rule")
public class LocationFenceRuleController {
......
......@@ -14,7 +14,6 @@ import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
......@@ -25,9 +24,9 @@ import org.springframework.web.multipart.MultipartFile;
* @date 2022/4/13
*/
@Slf4j
@Validated
@Api(tags = "定位标签")
@SuppressWarnings({ "deprecation" })
@Api(tags = "定位标签", description = "LocationTag")
@RestController
@RequestMapping("/location/tag/")
public class LocationTagController {
......
......@@ -12,7 +12,6 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
......@@ -26,9 +25,9 @@ import org.springframework.web.bind.annotation.RestController;
* @date 2022/4/27
*/
@Slf4j
@Validated
@Api(tags = "标签分配")
@SuppressWarnings({ "deprecation" })
@Api(tags = "标签分配", description = "LocationTagType")
@RestController
@RequestMapping("/location/tag/type")
public class LocationTagTypeController {
......
......@@ -12,10 +12,8 @@ import com.yiring.common.core.Status;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import java.io.Serializable;
import java.util.List;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
......@@ -28,9 +26,10 @@ import org.springframework.web.bind.annotation.RestController;
* @version 1.0
* @date 2022/4/24 13:48
*/
@Slf4j
@Validated
@Api(tags = "Map(地图)")
@SuppressWarnings({ "deprecation" })
@Api(tags = "地图", description = "Map")
@RestController
@RequestMapping("/map/")
public class MapController {
......@@ -40,7 +39,7 @@ public class MapController {
@GetMapping("/mapSelect")
@ApiImplicitParams({ @ApiImplicitParam(value = "orgId", required = true, name = "orgId") })
public Result<Serializable> fail(String orgId) {
public Result<MapVo> select(String orgId) {
String login = ZyUtil.openLogin();
JSONObject jsonObject = mapClient.selectMap(orgId, "bearer " + login);
// if (ObjectUtil.isNotNull(jsonObject.getJSONArray("data"))) {
......
......@@ -28,7 +28,8 @@ import org.springframework.web.bind.annotation.RestController;
*/
@Slf4j
@Validated
@Api(tags = "personnelStatistics(人员统计)")
@SuppressWarnings({ "deprecation" })
@Api(tags = "人员统计", description = "PersonnelStatistics")
@RestController
@RequestMapping("/personnelStatistics/")
public class PersonnelStatisticsController {
......
......@@ -19,7 +19,6 @@ import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
......@@ -29,9 +28,9 @@ import org.springframework.web.bind.annotation.*;
* @date 2022/4/12
*/
@Slf4j
@Validated
@Api(tags = "职位信息")
@SuppressWarnings({ "deprecation" })
@Api(tags = "职位信息", description = "Post")
@RestController
@RequestMapping("/post/")
public class PostController {
......
......@@ -31,8 +31,9 @@ import org.springframework.web.bind.annotation.*;
*/
@Slf4j
@Validated
@SuppressWarnings({ "deprecation" })
@Api(tags = "事故点管理", description = "AccidentSpot")
@RestController
@Api(tags = "AccidentSpot(事故点管理)")
@RequestMapping("/accident/spot")
public class AccidentSpotController {
......
......@@ -16,6 +16,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.validation.Valid;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
......@@ -23,7 +24,10 @@ import org.springframework.web.bind.annotation.*;
* @version 1.0
* @date 2022/5/9 10:19
*/
@Api(tags = "EvacuationZone(撤离区)")
@Validated
@SuppressWarnings({ "deprecation" })
@Api(tags = "撤离区", description = "EvacuationZone")
@RestController
@RequestMapping("/evacuation/zone")
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;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
......@@ -31,7 +32,8 @@ import org.springframework.web.multipart.MultipartFile;
@Slf4j
@Validated
@Api(tags = "人员管理")
@SuppressWarnings({ "deprecation" })
@Api(tags = "人员管理", description = "user")
@RestController
@RequestMapping("/user/app/")
public class UserAppController {
......@@ -69,7 +71,7 @@ public class UserAppController {
return userService.deleteUser(idsParam);
}
@ApiOperation("用户导出")
@ApiOperation(value = "用户导出", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@GetMapping("exportUser")
public void exportUser(@Valid UserFindParam userFindParam, HttpServletResponse response) {
userService.exportUser(userFindParam, response);
......
......@@ -35,7 +35,8 @@ import org.springframework.web.multipart.MultipartFile;
*/
@Slf4j
@Validated
@Api(tags = "Video(监控设备)")
@SuppressWarnings({ "deprecation" })
@Api(tags = "监控设备", description = "Video")
@RestController
@RequestMapping("/video/")
public class VideoController {
......
......@@ -30,10 +30,11 @@ import org.springframework.web.bind.annotation.RestController;
* 2022/4/11 17:02
*/
@Slf4j
@Api(tags = "Car(车辆)")
@Validated
@RestController
@SuppressWarnings({ "deprecation" })
@Api(tags = "车辆", description = "Car")
@RequestMapping("/Car/")
@RestController
public class CarController {
@Resource
......
......@@ -28,7 +28,8 @@ import org.springframework.web.bind.annotation.RestController;
*/
@Slf4j
@Validated
@Api(tags = "Visitor(访客)")
@SuppressWarnings({ "deprecation" })
@Api(tags = "访客", description = "Visitor")
@RestController
@RequestMapping("/visitor/")
public class VisitorController {
......
......@@ -83,21 +83,21 @@ xxl:
logging:
level:
# sql bind parameter
# org.hibernate.type.descriptor.sql.BasicBinder: trace
org.hibernate.type.descriptor.sql.BasicBinder: error
org.hibernate.type.descriptor.sql.BasicBinder: trace
# org.hibernate.type.descriptor.sql.BasicBinder: error
# 真源定位系统相关配置
zy-config:
host: project.yz-online.com
# RabbitMQ 订阅配置
rabbitmq:
enabled: true
enabled: false
host: ${zy-config.host}
port: 672
username: admin
password: admin
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:
api: http://${zy-config.host}:789/positionApi
......
......@@ -9,8 +9,8 @@ dependencies {
// 本地依赖
implementation fileTree(dir: project.rootDir.getPath() + '\\libs', includes: ['*jar'])
// swagger annotations
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}"
// swagger(knife4j)
implementation "com.github.xiaoymin:knife4j-spring-boot-starter:${knife4jVersion}"
// sa-token
implementation "cn.dev33:sa-token-spring-boot-starter:${saTokenVersion}"
......
......@@ -5,6 +5,7 @@ import com.yiring.auth.param.user.UserFindParam;
import com.yiring.auth.param.user.UserSaveParam;
import com.yiring.auth.vo.user.UserVo;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
......@@ -29,4 +30,11 @@ public interface UserService {
* @return Result<PageVo<UserVo>>
*/
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;
import com.yiring.auth.service.user.UserService;
import com.yiring.auth.vo.user.UserVo;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.domain.BasicEntity;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.persistence.criteria.CriteriaBuilder;
......@@ -87,4 +90,18 @@ public class UserServiceImpl implements UserService {
PageVo<UserVo> pageVo = PageVo.build(userVos, users.getTotalElements());
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;
import cn.dev33.satoken.secure.SaSecureUtil;
import cn.dev33.satoken.stp.StpUtil;
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.UserRepository;
import com.yiring.auth.param.auth.LoginParam;
......@@ -36,7 +37,9 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Validated
@Api(tags = "Auth")
@SuppressWarnings({ "deprecation" })
@ApiSupport(order = -99)
@Api(tags = "身份认证", description = "Auth")
@RestController
@RequestMapping("/auth/")
public class AuthController {
......
/* (C) 2022 YiRing, Inc. */
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.PermissionRepository;
import com.yiring.auth.param.permission.PermissionParam;
......@@ -38,7 +39,9 @@ import org.springframework.web.bind.annotation.*;
@Slf4j
@Validated
@Api(tags = "Permission")
@SuppressWarnings({ "deprecation" })
@ApiSupport(order = -97)
@Api(tags = "权限管理", description = "Permission")
@RestController
@RequestMapping("/manage/permission/")
public class PermissionController {
......
/* (C) 2022 YiRing, Inc. */
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.PermissionRepository;
import com.yiring.auth.domain.role.Role;
......@@ -40,7 +41,9 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Validated
@Api(tags = "Role")
@SuppressWarnings({ "deprecation" })
@ApiSupport(order = -96)
@Api(tags = "角色管理", description = "Role")
@RestController
@RequestMapping("/manage/role/")
public class RoleController {
......
/* (C) 2022 YiRing, Inc. */
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.role.Role;
import com.yiring.auth.domain.role.RoleRepository;
......@@ -46,7 +47,9 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Validated
@Api(tags = "User")
@SuppressWarnings({ "deprecation" })
@ApiSupport(order = -95)
@Api(tags = "用户管理", description = "User")
@RestController
@RequestMapping("/user/")
public class UserController {
......@@ -145,4 +148,10 @@ public class UserController {
public Result<String> add(@Valid UserSaveParam param) {
return userService.add(param);
}
@ApiOperation("重置密码")
@PostMapping("reset")
public Result<String> reset(@Valid IdParam idParam) {
return userService.reset(idParam);
}
}
......@@ -3,8 +3,8 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
// swagger
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}"
// swagger(knife4j)
implementation "com.github.xiaoymin:knife4j-spring-boot-starter:${knife4jVersion}"
// minio
implementation "io.minio:minio:${minioVersion}"
......
......@@ -3,6 +3,7 @@ package com.yiring.common.web;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.common.core.Minio;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
......@@ -15,10 +16,7 @@ import java.time.format.DateTimeFormatter;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
/**
......@@ -27,7 +25,9 @@ import org.springframework.web.multipart.MultipartFile;
@Slf4j
@Validated
@Api(tags = "Minio")
@SuppressWarnings({ "deprecation" })
@ApiSupport(order = -98)
@Api(tags = "文件管理", description = "file")
@RestController
@RequestMapping("/common/minio/")
public class MinioController {
......
......@@ -25,9 +25,9 @@ import org.springframework.stereotype.Component;
public class TimesAspect {
@Pointcut("@annotation(com.yiring.common.annotation.Times)")
public void pointCut() {}
public void times() {}
@Around("pointCut()")
@Around("times()")
public Object around(ProceedingJoinPoint point) throws Throwable {
long start = System.currentTimeMillis();
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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论