提交 ef5d4dcc 作者: 涂茂林

feat:新增区域信息的增删改

上级 32d1861f
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PersistenceUnitSettings">
<persistence-units>
<persistence-unit name="Default">
<packages>
<package value="com.yiring.common.config" />
</packages>
</persistence-unit>
</persistence-units>
</component>
</project>
\ No newline at end of file
...@@ -6,6 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; ...@@ -6,6 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters; import org.springframework.data.jpa.convert.threeten.Jsr310JpaConverters;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@EnableJpaRepositories(basePackages = Application.BASE_PACKAGES) @EnableJpaRepositories(basePackages = Application.BASE_PACKAGES)
...@@ -14,6 +15,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories; ...@@ -14,6 +15,7 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
basePackages = Application.BASE_PACKAGES basePackages = Application.BASE_PACKAGES
) )
@EnableFeignClients @EnableFeignClients
@EnableJpaAuditing
@SpringBootApplication(scanBasePackages = Application.BASE_PACKAGES) @SpringBootApplication(scanBasePackages = Application.BASE_PACKAGES)
public class Application { public class Application {
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.constant.district;
import com.yiring.app.vo.KeyValueVo;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
/**
* 区域信息风险等级枚举
* @author tml
* @version 1.0
* @date 2022/4/26 10:57
*/
public enum RiskGradeEnum {
/**
* 蓝色(安全)
*/
BLUE(1, "蓝"),
/**
* 黄色(预警)
*/
yellow(2, "黄"),
/**
* 红色(异常)
*/
RED(3, "红");
public static final int MIN = 1;
public static final int MAX = 3;
private static final List<KeyValueVo> LIST;
static {
LIST = new ArrayList<>();
for (RiskGradeEnum item : values()) {
LIST.add(KeyValueVo.builder().key(item.key).value(item.value).build());
}
}
@Getter
private final Integer key;
@Getter
private final String value;
RiskGradeEnum(Integer key, String value) {
this.key = key;
this.value = value;
}
/**
* 根据key获取value
* @param key 等级key
* @return 等级
*/
public static String getByKey(Integer key) {
if (key != null) {
for (RiskGradeEnum item : values()) {
if (item.key.equals(key)) {
return item.value;
}
}
}
return "未知等级";
}
/**
* 获取所有等级
* @return 所有等级集合
*/
public static List<KeyValueVo> getAll() {
return LIST;
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.district;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import javax.persistence.*;
import lombok.*;
import lombok.experimental.FieldNameConstants;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.Where;
import org.hibernate.snowflake.SnowflakeId;
import org.locationtech.jts.geom.Geometry;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
/**
* @author tml
* @version 1.0
* @date 2022/4/26 11:44
*/
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldNameConstants
@Entity
@Where(clause = "deleted = false")
@Table(name = "BS_District")
@Comment("区域信息")
@EntityListeners(AuditingEntityListener.class)
public class District implements Serializable {
@Serial
private static final long serialVersionUID = -1469002957843445743L;
@Id
@Comment("主键id")
@GeneratedValue(generator = SnowflakeId.GENERATOR)
@GenericGenerator(name = SnowflakeId.GENERATOR, strategy = SnowflakeId.Strategy.LONG)
private Long id;
@Comment("区域信息名称")
private String name;
@Comment("风险等级")
private String riskGrade;
@Comment("消抖时间(秒)")
private Integer debouncingDuration;
@Comment("超时时间(秒)")
private Integer timeoutDuration;
@Comment("区域信息")
@Type(type = "jts_geometry")
@Column(columnDefinition = "geometry")
private Geometry geometry;
@Comment("创建时间")
@CreatedDate
@Column(nullable = false)
private LocalDateTime createTime;
@Comment("最后修改时间")
@LastModifiedDate
@Column(nullable = false)
private LocalDateTime lastUpdateTime;
@Comment(value = "是否删除")
@Column(nullable = false)
Boolean deleted;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.domain.district;
import java.io.Serializable;
import java.util.List;
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/4/26 13:59
*/
@Repository
public interface DistrictRepository extends JpaRepository<District, Serializable>, JpaSpecificationExecutor<District> {
/**
* 查询名称是否存在
* @param name 区域名称
* @return true:存在 false:不存在
*/
Boolean existsByName(String name);
/**
* 根据名称查询区域信息列表
* @param name 区域名称
* @return 区域列表
*/
List<District> findAllByName(String name);
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.district;
import com.yiring.app.domain.district.District;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.*;
import org.hibernate.validator.constraints.Length;
import org.locationtech.jts.geom.Geometry;
/**
*
* @author tml
* @version 1.0
* @date 2022/4/26 10:40
*/
@ApiModel("DistrictAddParam(添加区域param)")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DistrictAddParam implements Serializable {
@Serial
private static final long serialVersionUID = 2936786907836076236L;
@ApiModelProperty(value = "区域名称", example = "工作区域", required = true)
@NotEmpty(message = "区域名称不能为空")
@Length(max = 10, message = "区域名称不能超过10个字符")
private String name;
@ApiModelProperty(value = "风险等级", example = "1", required = true)
@NotEmpty(message = "风险等级不能为空")
@Length(min = 6, max = 7, message = "请选择正确的颜色")
private String riskGrade;
@ApiModelProperty(value = "消抖时间(秒)", example = "10", required = true)
@NotNull(message = "消抖时间不能为空")
private Integer debouncingDuration;
@ApiModelProperty(value = "超时时间(秒)", example = "100", required = true)
@NotNull(message = "超时时间不能为空")
private Integer timeoutDuration;
@ApiModelProperty(value = "区域信息", example = "100", required = true)
@NotNull(message = "区域信息不能为空")
private Geometry geometry;
public District transform() {
return District
.builder()
.name(name)
.deleted(false)
.riskGrade(riskGrade)
.debouncingDuration(debouncingDuration)
.timeoutDuration(timeoutDuration)
.geometry(geometry)
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.param.district;
import com.yiring.app.domain.district.District;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import org.locationtech.jts.geom.Geometry;
/**
*
* @author tml
* @version 1.0
* @date 2022/4/26 10:40
*/
@ApiModel("DistrictAddParam(添加区域param)")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DistrictModifyParam implements Serializable {
@Serial
private static final long serialVersionUID = 2936786907836076236L;
@ApiModelProperty(value = "id", example = "1", required = true)
@NotNull(message = "id不能为空")
private Long id;
@ApiModelProperty(value = "区域名称", example = "工作区域", required = true)
@Length(max = 10, message = "区域名称不能超过10个字符")
private String name;
@ApiModelProperty(value = "风险等级", example = "1", required = true)
@Length(min = 6, max = 7, message = "请选择正确的颜色")
private String riskGrade;
@ApiModelProperty(value = "消抖时间(秒)", example = "10", required = true)
private Integer debouncingDuration;
@ApiModelProperty(value = "超时时间(秒)", example = "100", required = true)
private Integer timeoutDuration;
@ApiModelProperty(value = "区域信息", example = "100", required = true)
private Geometry geometry;
public District transform() {
return District
.builder()
.id(id)
.name(name)
.riskGrade(riskGrade)
.debouncingDuration(debouncingDuration)
.timeoutDuration(timeoutDuration)
.geometry(geometry)
.build();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.district;
import com.yiring.app.param.district.DistrictAddParam;
import com.yiring.app.param.district.DistrictModifyParam;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
/**
* 区域信息service
* @author tml
* @version 1.0
* @date 2022/4/26 13:42
*/
public interface DistrictService {
/**
* 添加一个区域信息
* @param param 区域信息
* @return 是否成功
*/
Result<String> addDistrict(DistrictAddParam param);
/**
* 修改一条区域信息
* @param param 区域信息
* @return 是否成功
*/
Result<String> modifyDistrict(DistrictModifyParam param);
/**
* 删除一条区域信息
* @param idParam 区域id
* @return 是否成功
*/
Result<String> removeDistrict(IdParam idParam);
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.service.district.impl;
import com.yiring.app.domain.district.District;
import com.yiring.app.domain.district.DistrictRepository;
import com.yiring.app.param.district.DistrictAddParam;
import com.yiring.app.param.district.DistrictModifyParam;
import com.yiring.app.service.district.DistrictService;
import com.yiring.app.util.JpaUtil;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam;
import java.util.List;
import java.util.Optional;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author tml
* @version 1.0
* @date 2022/4/26 13:53
*/
@Slf4j
@Service
@Transactional(rollbackFor = Exception.class)
public class DistrictServiceImpl implements DistrictService {
@Resource
private DistrictRepository districtRepository;
@Override
public Result<String> addDistrict(DistrictAddParam param) {
Boolean exists = districtRepository.existsByName(param.getName());
if (exists) {
return Result.no(Status.EXPECTATION_FAILED, "区域名称已存在");
}
District district = param.transform();
districtRepository.save(district);
return Result.ok();
}
@Override
public Result<String> modifyDistrict(DistrictModifyParam param) {
List<District> list = districtRepository.findAllByName(param.getName());
District district = null;
//校验名称是否重复
for (District item : list) {
if (item.getId().equals(param.getId())) {
district = item;
} else {
return Result.no(Status.EXPECTATION_FAILED, "区域名称已存在");
}
}
//如果上面查出来的数据没有这条要修改的数据,则根据id查询出来
if (district == null) {
Optional<District> optional = districtRepository.findById(param.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "修改的区域信息不存在");
}
district = optional.get();
}
//只修改要修改的值
JpaUtil.copyNotNullProperties(param, district);
return Result.ok();
}
@Override
public Result<String> removeDistrict(IdParam idParam) {
Optional<District> optional = districtRepository.findById(idParam.getId());
if (optional.isEmpty()) {
return Result.no(Status.EXPECTATION_FAILED, "删除的区域信息不存在");
}
District district = optional.get();
district.setDeleted(true);
return Result.ok();
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.util;
import java.util.HashSet;
import java.util.Set;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
/**
* 复制非空属性值的工具类
*
* @author tml
* @version 0.1
* @date 2022/4/21 15:08
*/
public class JpaUtil {
public static void copyNotNullProperties(Object source, Object target) {
BeanUtils.copyProperties(source, target, getNullPropertyNames(source));
}
public static String[] getNullPropertyNames(Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<>();
for (java.beans.PropertyDescriptor pd : pds) {
Object srcValue = src.getPropertyValue(pd.getName());
if (srcValue == null) {
emptyNames.add(pd.getName());
}
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.vo;
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;
/**
* key-value格式数据Vo
* @author tml
* @version 1.0
* @date 2022/4/26 11:02
*/
@ApiModel("KeyValueVo")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class KeyValueVo implements Serializable {
@Serial
private static final long serialVersionUID = -7565315836652536620L;
@ApiModelProperty(value = "key", example = "1", required = true)
private Integer key;
@ApiModelProperty(value = "value", example = "值", required = true)
private String value;
}
/* (C) 2022 YiRing, Inc. */
package com.yiring.app.web.district;
import com.yiring.app.param.district.DistrictAddParam;
import com.yiring.app.param.district.DistrictModifyParam;
import com.yiring.app.service.district.DistrictService;
import com.yiring.common.core.Result;
import com.yiring.common.param.IdParam;
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;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 区域管理控制器
* @author tml
* @version 1.0
* @date 2022/4/26 10:15
*/
@Slf4j
@Validated
@Api(tags = "District(区域管理)")
@RestController
@RequestMapping("/district/")
public class DistrictController {
@Resource
private DistrictService districtService;
@ApiOperation(value = "新增区域信息")
@PostMapping("/addDistrict")
public Result<String> addDistrict(@Valid @RequestBody DistrictAddParam param) {
return districtService.addDistrict(param);
}
@ApiOperation(value = "修改区域信息")
@PostMapping("/modifyDistrict")
public Result<String> modifyDistrict(@Valid @RequestBody DistrictModifyParam param) {
return districtService.modifyDistrict(param);
}
@ApiOperation(value = "删除区域信息")
@PostMapping("/removeDistrict")
public Result<String> removeDistrict(@Valid IdParam idParam) {
return districtService.removeDistrict(idParam);
}
}
...@@ -54,8 +54,8 @@ allprojects { ...@@ -54,8 +54,8 @@ allprojects {
mavenCentral() mavenCentral()
} }
sourceCompatibility = JavaVersion.VERSION_17 sourceCompatibility = JavaVersion.VERSION_16
targetCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_16
} }
subprojects { subprojects {
......
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论