用户、项目、机组和部件新增和编辑时增加校验逻辑

This commit is contained in:
高雄 2025-05-19 18:41:06 +08:00
parent a84bbf6928
commit fbddea1c30
32 changed files with 303 additions and 100 deletions

View File

@ -15,7 +15,12 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Sa-Token 权限认证在线文档https://sa-token.cc -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.43.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>

View File

@ -1,25 +1,33 @@
package com.dite.znpt.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Value(value = "${upload.temp-path.image}")
private String uploadTempPath;
@Value(value = "${upload.perm-path.image}")
private String uploadPermPath;
/**
* MVC 加载Swagger静态资源
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/static/");
registry.addResourceHandler("doc.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
registry.addResourceHandler("/swagger-ui/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
registry.addResourceHandler("/image/temp/**").addResourceLocations("file:" + uploadTempPath);
registry.addResourceHandler("/image/**").addResourceLocations("file:" + uploadPermPath);
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
registry.addResourceHandler("/swagger-ui/**").addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
super.addResourceHandlers(registry);
}
}

View File

@ -1,4 +1,4 @@
package com.dite.znpt.domain;
package com.dite.znpt.constant;
/**
* @description: 常量
@ -21,4 +21,14 @@ public class Constants {
* 参数异常
*/
public static final String PARAMETER_EXCEPTION = "000003";
/**
* 0:代表存在
*/
public static final String DEL_FLAG_0 = "0";
/**
* 1:代表删除
*/
public static final String DEL_FLAG_1 = "1";
}

View File

@ -20,5 +20,5 @@ public class Message implements Serializable {
public static final String TURBINE_ID_IS_NOT_EXIST = "机组id不存在";
public static final String PART_ID_IS_NOT_EXIST = "部件id不存在";
public static final String IMAGE_SOURCE_ID_NOT_EXIST_OR_ILLEGAL = "部件id不存在";
public static final String USER_ID_NOT_EXIST = "部件id不存在";
public static final String USER_ID_NOT_EXIST = "用户id不存在";
}

View File

@ -1,5 +1,6 @@
package com.dite.znpt.domain;
import com.dite.znpt.constant.Constants;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;

View File

@ -45,6 +45,11 @@ public class UserEntity extends AuditableEntity implements Serializable {
@TableField("password")
private String password;
@ExcelProperty("是否默认密码")
@ApiModelProperty("是否默认密码")
@TableField("is_default_password")
private Boolean isDefaultPassword;
@ExcelProperty("加密盐")
@ApiModelProperty("加密盐")
@TableField("salt")

View File

@ -1,9 +1,12 @@
package com.dite.znpt.domain.vo;
import com.dite.znpt.util.ValidationGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serial;
import java.io.Serializable;
@ -19,24 +22,31 @@ public class PartReq implements Serializable {
@Serial
private static final long serialVersionUID = -585044340118904985L;
@NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "机组id不能为空")
@ApiModelProperty("机组id")
private String turbineId;
@ApiModelProperty("名称")
@NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "部件名称不能为空")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "部件名称长度不能超过50字符")
@ApiModelProperty("部件名称")
private String partName;
@ApiModelProperty("编号")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "部件编号长度不能超过20字符")
@ApiModelProperty("部件编号")
private String partCode;
@ApiModelProperty("类型枚举PartTypeEnum")
@ApiModelProperty("部件类型枚举PartTypeEnum")
private String partType;
@ApiModelProperty("描述")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 200, message = "部件描述长度不能超过200字符")
@ApiModelProperty("部件描述")
private String partDesc;
@ApiModelProperty("厂商")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "部件厂商长度不能超过20字符")
@ApiModelProperty("部件厂商")
private String PartManufacturer;
@ApiModelProperty("型号")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "部件型号长度不能超过20字符")
@ApiModelProperty("部件型号")
private String PartModel;
}

View File

@ -34,7 +34,7 @@ public class ProjectListResp implements Serializable {
private String farmName;
@ApiModelProperty("项目状态枚举ProjectStatusEnum")
private String status;
private int status;
@ApiModelProperty("项目状态枚举ProjectStatusEnum")
private String statusLabel;

View File

@ -1,10 +1,12 @@
package com.dite.znpt.domain.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.dite.znpt.util.ValidationGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serial;
import java.io.Serializable;
@ -20,48 +22,57 @@ public class ProjectReq implements Serializable {
@Serial
private static final long serialVersionUID = 740685592879189406L;
@ExcelProperty("项目名称")
@NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目名称不能为空")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "项目名称长度不能超过50字符")
@ApiModelProperty("项目名称")
private String projectName;
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "项目封面述长度不能超过100字符")
@ApiModelProperty("项目封面")
private String coverUrl;
@ExcelProperty("风场名称")
@NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "风场名称不能为空")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "风场名称长度不能超过50字符")
@ApiModelProperty("风场名称")
private String farmName;
@ExcelProperty("风场地址")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "风场名称长度不能超过100字符")
@ApiModelProperty("风场地址")
private String farmAddress;
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "委托单位长度不能超过50字符")
@ApiModelProperty("委托单位")
private String client;
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "委托单位联系人长度不能超过20字符")
@ApiModelProperty("委托单位联系人")
private String clientContact;
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "委托单位联系电话长度不能超过20字符")
@ApiModelProperty("委托单位联系电话")
private String clientPhone;
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "检查单位联系电话长度不能超过20字符")
@ApiModelProperty("检查单位")
private String inspectionUnit;
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "检查单位联系人长度不能超过20字符")
@ApiModelProperty("检查单位联系人")
private String inspectionContact;
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "检查单位联系电话长度不能超过20字符")
@ApiModelProperty("检查单位联系电话")
private String inspectionPhone;
@ExcelProperty("项目规模")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "项目规模长度不能超过20字符")
@ApiModelProperty("项目规模")
private String scale;
@ExcelProperty("风机型号")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "风机型号不能超过20字符")
@ApiModelProperty("风机型号")
private String turbineModel;
@ApiModelProperty("施工人员id")
@ApiModelProperty(value = "施工人员id", notes = "多个用英文逗号隔开")
private String constructorIds;
@ApiModelProperty("安全员id")
@ -70,19 +81,20 @@ public class ProjectReq implements Serializable {
@ApiModelProperty("质量员id")
private String qualityOfficerId;
@NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目经理id不能为空")
@ApiModelProperty("项目经理id")
private String projectManagerId;
@ApiModelProperty("施工组长id")
private String constructionTeamLeaderId;
@ApiModelProperty("技术方案图片,多个用逗号隔开")
@ApiModelProperty(value = "技术方案图片", notes = "多项英文逗号隔开")
private String technicalImage;
@ApiModelProperty("技术方案内容")
private String technicalContent;
@ApiModelProperty("安全措施图片,多个用逗号隔开")
@ApiModelProperty(value = "安全措施图片", notes = "多项英文逗号隔开")
private String safetyImage;
@ApiModelProperty("安全措施内容")
@ -92,14 +104,14 @@ public class ProjectReq implements Serializable {
private String discloseContent;
@ApiModelProperty("状态0待施工1施工中2已完工3已审核4已验收")
private String status;
private int status;
@ApiModelProperty("项目工作类型 可能有多项,逗号分隔")
@ApiModelProperty(value = "项目工作类型", notes = "多项英文逗号隔开")
private String workType;
@ApiModelProperty("项目工作岗位 可能有多项json对象保存")
@ApiModelProperty(value = "项目工作岗位", notes = "多项英文逗号隔开json对象保存")
private String job;
@ApiModelProperty(value = "项目安全风险点", example = "1", notes = "项目安全风险点 可能有多项,逗号分隔")
@ApiModelProperty(value = "项目安全风险点", notes = "多项英文逗号隔开")
private String safetyRiskPoint;
}

View File

@ -2,10 +2,13 @@ package com.dite.znpt.domain.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import com.dite.znpt.util.ValidationGroup;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.io.Serial;
import java.io.Serializable;
@ -21,25 +24,33 @@ public class TurbineReq implements Serializable {
@Serial
private static final long serialVersionUID = 115092978850852080L;
@NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "项目id不能为空")
@ApiModelProperty("项目id")
private String projectId;
@NotBlank(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "机组名称不能为空")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "机组名称长度不能超过50字符")
@ApiModelProperty("机组名称")
private String turbineName;
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "机组编码长度不能超过20字符")
@ApiModelProperty("机组编码")
private String turbineCode;
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 200, message = "机组描述长度不能超过200字符")
@ApiModelProperty("机组描述")
private String turbineDesc;
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "机组厂商长度不能超过20字符")
@ApiModelProperty("机组厂商")
private String turbineManufacturer;
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "机组型号长度不能超过20字符")
@ApiModelProperty("机组型号")
private String turbineModel;
@ApiModelProperty("封面图")
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "机组封面图长度不能超过100字符")
@ApiModelProperty("机组封面图")
private String turbineCoverUrl;
}

View File

@ -1,10 +1,12 @@
package com.dite.znpt.domain.vo;
import com.dite.znpt.util.ValidationGroup;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.*;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
@ -21,31 +23,43 @@ public class UserReq implements Serializable {
@Serial
private static final long serialVersionUID = -5491849652107338027L;
@Pattern(groups = {ValidationGroup.Insert.class},regexp = "^[a-zA-Z0-9_]{4,20}$", message = "只能包含字母、数字或下划线长度4-20")
@ApiModelProperty("账号")
private String account;
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 100, message = "头像地址长度不能超过100字符")
@ApiModelProperty("头像地址")
private String avatar;
@ApiModelProperty("1正常0禁用")
private Integer status;
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "姓名长度不能超过20字符")
@ApiModelProperty("姓名")
private String name;
@Pattern(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, regexp = "^$|\\d(?:\\d{15}|\\d{17})$", message = "身份证号码格式不正确")
@ApiModelProperty("身份证")
private String identityCard;
@ApiModelProperty("性别")
private String gender;
@Pattern(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, regexp ="^$|1\\d{10}$", message = "手机号码格式不正确")
@ApiModelProperty("手机号码")
private String mobile;
@Email(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class})
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 50, message = "邮箱长度不能超过50字符")
@ApiModelProperty("邮箱")
private String email;
@Past(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "入职日期必须是过去的日期")
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty("入职日期")
private LocalDate hiredate;
@Past(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, message = "出生日期必须是过去的日期")
@JsonFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty("出生日期")
private LocalDate birthdate;
@ -53,9 +67,11 @@ public class UserReq implements Serializable {
@ApiModelProperty("学历")
private String education;
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "专业长度不能超过20字符")
@ApiModelProperty("专业")
private String majorField;
@Size(groups = {ValidationGroup.Insert.class, ValidationGroup.Update.class}, max = 20, message = "工作方向长度不能超过20字符")
@ApiModelProperty("工作方向")
private String workField;
}

View File

@ -13,6 +13,7 @@ import java.util.List;
*/
@Getter
public enum EducationEnum {
UNKNOWN("unknown","小学"),
PRIMARY_SCHOOL("primary_school","小学"),
MIDDLE_SCHOOL("middle_school","初中"),
HIGH_SCHOOL(" high_school","高中"),

View File

@ -15,25 +15,25 @@ import java.util.List;
@Getter
@AllArgsConstructor
public enum ProjectStatusEnum {
PENDING("PENDING","待施工", 0),
IN_PROGRESS("IN_PROGRESS","施工中", 1),
COMPLETED("COMPLETED","已完工", 2),
AUDITED("AUDITED","已审核", 3),
ACCEPTED("ACCEPTED","已验收", 4);
private final String code;
private final String desc;
private final int intValue;
PENDING(0, "待施工"),
IN_PROGRESS(1, "施工中"),
COMPLETED(2, "已完工"),
AUDITED(3, "已审核"),
ACCEPTED(4, "已验收");
public static ProjectStatusEnum getByCode(String code){
private final int code;
private final String desc;
public static ProjectStatusEnum getByCode(int code){
for (ProjectStatusEnum e : ProjectStatusEnum.values() ) {
if(e.code.equals(code)){
if(e.code == code){
return e;
}
}
return null;
}
public static String getDescByCode(String code){
public static String getDescByCode(int code){
ProjectStatusEnum e = getByCode(code);
return null == e ? null : e.desc;
}
@ -42,7 +42,7 @@ public enum ProjectStatusEnum {
List<JSONObject> list = new ArrayList<>(ProjectStatusEnum.values().length);
for (ProjectStatusEnum e : ProjectStatusEnum.values() ) {
JSONObject jsonObject = new JSONObject();
jsonObject.set(e.code, e.desc);
jsonObject.set(String.valueOf(e.code), e.desc);
list.add(jsonObject);
}
return list;

View File

@ -1,6 +1,6 @@
package com.dite.znpt.exception;
import com.dite.znpt.domain.Constants;
import com.dite.znpt.constant.Constants;
import com.dite.znpt.domain.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

View File

@ -51,7 +51,7 @@ public interface UserService extends IService<UserEntity> {
* @author huise23
* @date 2025/04/11 23:17
**/
void save(UserReq req);
String save(UserReq req);
/**
* 功能描述更新用户信息

View File

@ -31,7 +31,7 @@ import java.util.List;
@Service
public class ImageCollectServiceImpl extends ServiceImpl<ImageCollectMapper, ImageCollectEntity> implements ImageCollectService {
@Value("${upload.perm-path}")
@Value("${upload.perm-path.image}")
private String permPath;
@Resource
@ -52,7 +52,7 @@ public class ImageCollectServiceImpl extends ServiceImpl<ImageCollectMapper, Ima
ImageCollectEntity imageCollect = Converts.INSTANCE.toImageCollectEntity(req);
this.save(imageCollect);
List<ImageEntity> imageList = Converts.INSTANCE.toImageEntity(req.getImageList());
String path_prefix = permPath.concat(StrUtil.BACKSLASH).concat(ImageSourceEnum.COLLECT.getCode()).concat(StrUtil.BACKSLASH).concat(partId).concat(StrUtil.BACKSLASH);
String path_prefix = permPath.concat(FileUtil.FILE_SEPARATOR).concat(ImageSourceEnum.COLLECT.getCode()).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR);
imageList.stream().forEach(image -> {
image.setPartId(partId);
image.setCollectId(imageCollect.getCollectId());

View File

@ -10,7 +10,10 @@ import com.dite.znpt.constant.Message;
import com.dite.znpt.domain.entity.ImageEntity;
import com.dite.znpt.domain.entity.PartEntity;
import com.dite.znpt.domain.vo.*;
import com.dite.znpt.enums.*;
import com.dite.znpt.enums.ImageSourceEnum;
import com.dite.znpt.enums.ImageTypeEnum;
import com.dite.znpt.enums.ShootingMethodEnum;
import com.dite.znpt.enums.WeatherEnum;
import com.dite.znpt.exception.ServiceException;
import com.dite.znpt.mapper.ImageMapper;
import com.dite.znpt.service.ImageCollectService;
@ -54,10 +57,10 @@ public class ImageServiceImpl extends ServiceImpl<ImageMapper, ImageEntity> impl
@Resource
private PartService partService;
@Value("${upload.temp-path}")
@Value("${upload.temp-path.image}")
private String tempPath;
@Value("${upload.perm-path}")
@Value("${upload.perm-path.image}")
private String permPath;
@Override
public List<ImageListResp> list(ImageListReq req) {
@ -83,8 +86,8 @@ public class ImageServiceImpl extends ServiceImpl<ImageMapper, ImageEntity> impl
Map<String, PartEntity> partIdMap= partService.listByIds(partIds).stream().collect(Collectors.toMap(PartEntity::getPartId, Function.identity()));
list.stream().forEach(req -> {
if(partIdMap.containsKey(req.getPartId())){
String path_prefix = permPath.concat(FileUtil.FILE_SEPARATOR).concat(req.getImageSource()).concat(FileUtil.FILE_SEPARATOR).concat(req.getPartId()).concat(FileUtil.FILE_SEPARATOR);
String temp_path_prefix = tempPath.concat(FileUtil.FILE_SEPARATOR).concat(req.getImageSource()).concat(FileUtil.FILE_SEPARATOR).concat(req.getPartId()).concat(FileUtil.FILE_SEPARATOR);
String path_prefix = permPath.concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH);
String temp_path_prefix = tempPath.concat(StrUtil.BACKSLASH).concat(req.getImageSource()).concat(StrUtil.BACKSLASH).concat(req.getPartId()).concat(StrUtil.BACKSLASH);
File file = new File(req.getImagePath());
if(file.exists() && req.getImagePath().contains(temp_path_prefix)){
ImageEntity entity = new ImageEntity();
@ -123,7 +126,12 @@ public class ImageServiceImpl extends ServiceImpl<ImageMapper, ImageEntity> impl
throw new ServiceException(Message.IMAGE_IS_EMPTY);
}
List<ImageReq> list = new ArrayList<>(files.length);
String path_prefix = tempPath.concat(FileUtil.FILE_SEPARATOR).concat(imageSource).concat(FileUtil.FILE_SEPARATOR).concat(partId).concat(FileUtil.FILE_SEPARATOR);
File temCategory = new File(tempPath);
if (!temCategory.exists()) {
// 创建完整的目录
temCategory.mkdirs();
}
String path_prefix = tempPath.concat(StrUtil.BACKSLASH).concat(imageSource).concat(StrUtil.BACKSLASH).concat(partId).concat(StrUtil.BACKSLASH);
for (MultipartFile file : files) {
if (!file.isEmpty()) {
try {
@ -189,7 +197,7 @@ public class ImageServiceImpl extends ServiceImpl<ImageMapper, ImageEntity> impl
req.setCameraManufacturer(obj.getStr("Make"));
req.setCameraModel(obj.getStr("Model"));
req.setImageName(obj.getStr("File Name"));
req.setImagePath(path);
req.setImagePath(StrUtil.removePrefix(path, tempPath));
BigDecimal imageSize = new BigDecimal(extractDigit(obj.getStr("File Size"))).divide(new BigDecimal(1024*1024), 4, RoundingMode.HALF_UP);
req.setImageSize(imageSize.toString().concat("M"));
req.setImageWidth(extractDigit(obj.getStr("Image Width")));
@ -200,15 +208,19 @@ public class ImageServiceImpl extends ServiceImpl<ImageMapper, ImageEntity> impl
req.setYResolution(extractDigit(obj.getStr("Y Resolution")));
req.setResolutionUnits(obj.getStr("Resolution Units"));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss");
if(StrUtil.isNotBlank(obj.getStr("Date/Time Original"))){
req.setShootingTime(LocalDateTime.parse(obj.getStr("Date/Time Original"), formatter));
}
req.setFocalDistance(extractDigit(obj.getStr("Focal Length")));
req.setLatitude(obj.getStr("GPS Latitude"));
req.setLongitude(obj.getStr("GPS Longitude"));
req.setAltitude(extractDigit(obj.getStr("GPS Altitude")));
if(StrUtil.isNotBlank(req.getLatitude()) && StrUtil.isNotBlank(req.getLongitude()) && StrUtil.isNotBlank(req.getAltitude())){
String gps = req.getLatitude().concat("°").concat(directionTranslator(obj.getStr("GPS Latitude Ref"))).concat(StrUtil.COMMA)
.concat(req.getLongitude()).concat("°").concat(directionTranslator(obj.getStr("GPS Longitude Ref"))).concat(StrUtil.COMMA)
.concat("海拔").concat(req.getAltitude()).concat("m");
req.setGPS(gps);
}
return req;
}
@ -227,6 +239,9 @@ public class ImageServiceImpl extends ServiceImpl<ImageMapper, ImageEntity> impl
}
private static String extractDigit(String str) {
if(StrUtil.isEmpty(str)){
return null;
}
Pattern pattern = Pattern.compile("\\d+(\\.\\d+)?");
Matcher matcher = pattern.matcher(str);
if (matcher.find()) {

View File

@ -201,7 +201,7 @@ public class TurbineServiceImpl extends ServiceImpl<TurbineMapper, TurbineEntity
if (turbine == null) {
return;
}
if (turbine.getStatus() == ProjectStatusEnum.AUDITED.getIntValue()) {
if (turbine.getStatus() == ProjectStatusEnum.AUDITED.getCode()) {
return;
}
List<TurbineStatusResp> turbineStatusList = jobService.calCrewStatus(ListUtil.of(turbineId));
@ -223,19 +223,19 @@ public class TurbineServiceImpl extends ServiceImpl<TurbineMapper, TurbineEntity
&& status3.contains(turbineStatusVo.getAntiThunderWorkStatus())
&& status3.contains(turbineStatusVo.getSummaryWorkStatus())) {
// 全部提交已完工
turbine.setStatus(ProjectStatusEnum.COMPLETED.getIntValue());
turbine.setStatus(ProjectStatusEnum.COMPLETED.getCode());
} else if (status4.contains(turbineStatusVo.getInWorkStatus())
&& status4.contains(turbineStatusVo.getOutWorkStatus())
&& status4.contains(turbineStatusVo.getAntiThunderWorkStatus())
&& status4.contains(turbineStatusVo.getSummaryWorkStatus())) {
// 全部审批已审批
turbine.setStatus(ProjectStatusEnum.AUDITED.getIntValue());
turbine.setStatus(ProjectStatusEnum.AUDITED.getCode());
} else if (status2.contains(turbineStatusVo.getInWorkStatus())
|| status2.contains(turbineStatusVo.getOutWorkStatus())
|| status2.contains(turbineStatusVo.getAntiThunderWorkStatus())
|| status2.contains(turbineStatusVo.getSummaryWorkStatus())) {
// 有一个开始则开始
turbine.setStatus(ProjectStatusEnum.IN_PROGRESS.getIntValue());
turbine.setStatus(ProjectStatusEnum.IN_PROGRESS.getCode());
}
this.updateById(turbine);
// 更新项目状态
@ -255,19 +255,19 @@ public class TurbineServiceImpl extends ServiceImpl<TurbineMapper, TurbineEntity
List<Integer> statusList = this.lambdaQuery().eq(TurbineEntity::getProjectId, projectId).list()
.stream().map(TurbineEntity::getStatus).toList();
// 有施工中则是施工中
if (statusList.contains(ProjectStatusEnum.IN_PROGRESS.getIntValue())) {
status = ProjectStatusEnum.IN_PROGRESS.getIntValue();
if (statusList.contains(ProjectStatusEnum.IN_PROGRESS.getCode())) {
status = ProjectStatusEnum.IN_PROGRESS.getCode();
}
// 如果机组列表没有状态为 待施工施工中 的则项目 完工
if (!statusList.contains(ProjectStatusEnum.PENDING.getIntValue()) &&
!statusList.contains(ProjectStatusEnum.IN_PROGRESS.getIntValue())) {
status = ProjectStatusEnum.COMPLETED.getIntValue();
if (!statusList.contains(ProjectStatusEnum.PENDING.getCode()) &&
!statusList.contains(ProjectStatusEnum.IN_PROGRESS.getCode())) {
status = ProjectStatusEnum.COMPLETED.getCode();
// 如果机组列表没有状态为 待施工施工中已完工 的则项目 已审核
if (!statusList.contains(ProjectStatusEnum.COMPLETED.getIntValue())) {
status = ProjectStatusEnum.AUDITED.getIntValue();
if (!statusList.contains(ProjectStatusEnum.COMPLETED.getCode())) {
status = ProjectStatusEnum.AUDITED.getCode();
// 如果机组列表没有状态为 待施工施工中已完工已审核 的则项目 已验收
if (!statusList.contains(ProjectStatusEnum.AUDITED.getIntValue())) {
status = ProjectStatusEnum.ACCEPTED.getIntValue();
if (!statusList.contains(ProjectStatusEnum.AUDITED.getCode())) {
status = ProjectStatusEnum.ACCEPTED.getCode();
}
}
}

View File

@ -1,6 +1,11 @@
package com.dite.znpt.service.impl;
import cn.dev33.satoken.secure.SaBase64Util;
import cn.dev33.satoken.secure.SaSecureUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dite.znpt.constant.Constants;
import com.dite.znpt.constant.Message;
import com.dite.znpt.converts.Converts;
import com.dite.znpt.domain.entity.UserEntity;
@ -11,6 +16,8 @@ import com.dite.znpt.enums.EducationEnum;
import com.dite.znpt.exception.ServiceException;
import com.dite.znpt.service.UserService;
import com.dite.znpt.mapper.UserMapper;
import com.dite.znpt.util.PasswordUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import com.dite.znpt.util.PageUtil;
@ -27,6 +34,12 @@ import java.util.List;
@RequiredArgsConstructor
public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> implements UserService {
@Value("${password.default-value:Ai3m@123}")
private String defaultPassword;
@Value("${password.enable-default:true}")
private Boolean enableDefaultPassword;
/**
* 功能描述分页查询用户信息列表
*
@ -82,9 +95,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> impleme
**/
@Transactional(rollbackFor = Exception.class)
@Override
public void save(UserReq req) {
public String save(UserReq req) {
UserEntity entity = Converts.INSTANCE.toUserEntity(req);
String salt = RandomUtil.randomString(req.getAccount(), 4);
entity.setSalt(salt);
String password = enableDefaultPassword ? defaultPassword : PasswordUtil.generatePassword();
entity.setPassword(SaSecureUtil.md5(req.getAccount().concat(password).concat(salt)));
this.save(entity);
return SaBase64Util.encode(password);
}
/**
@ -103,6 +121,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> impleme
}
UserEntity entity = Converts.INSTANCE.toUserEntity(req);
entity.setUserId(userId);
entity.setAccount(null);
this.updateById(entity);
}
@ -116,10 +135,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, UserEntity> impleme
@Transactional(rollbackFor = Exception.class)
@Override
public void deleteById(String userId) {
if(null == this.getById(userId)){
UserEntity entity = this.getById(userId);
if(null == entity){
throw new ServiceException(Message.USER_ID_NOT_EXIST);
}
this.removeById(userId);
entity.setDelFlag(Constants.DEL_FLAG_1);
this.updateById(entity);
}

View File

@ -3,6 +3,12 @@ package com.dite.znpt.util;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class PasswordUtil {
private static final PasswordEncoder encoder = new BCryptPasswordEncoder();
@ -13,4 +19,48 @@ public class PasswordUtil {
public static boolean matches(String rawPassword, String encodedPassword) {
return encoder.matches(rawPassword, encodedPassword);
}
// 字符集定义
private static final String UPPER_CASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String LOWER_CASE = "abcdefghijklmnopqrstuvwxyz";
private static final String SPECIAL_CHARACTERS = "!@#$%^&*()-_=+[]{}|;:'\",.<>/?";
private static final String DIGITS = "0123456789";
// 安全随机数生成器
private static final Random RANDOM = new SecureRandom();
/**
* 生成随机密码
* @return 符合要求的随机密码
*/
public static String generatePassword() {
// 确保密码包含至少一个大写字母一个小写字母和一个特殊字符
List<Character> passwordChars = new ArrayList<>();
// 1. 添加至少一个大写字母
passwordChars.add(UPPER_CASE.charAt(RANDOM.nextInt(UPPER_CASE.length())));
// 2. 添加至少一个小写字母
passwordChars.add(LOWER_CASE.charAt(RANDOM.nextInt(LOWER_CASE.length())));
// 3. 添加至少一个特殊字符
passwordChars.add(SPECIAL_CHARACTERS.charAt(RANDOM.nextInt(SPECIAL_CHARACTERS.length())));
// 4. 生成剩余字符8位密码已添加3位还需5位
String allChars = UPPER_CASE + LOWER_CASE + SPECIAL_CHARACTERS + DIGITS;
for (int i = 0; i < 5; i++) {
passwordChars.add(allChars.charAt(RANDOM.nextInt(allChars.length())));
}
// 5. 打乱字符顺序
Collections.shuffle(passwordChars, RANDOM);
// 6. 转换为字符串
StringBuilder password = new StringBuilder();
for (Character c : passwordChars) {
password.append(c);
}
return password.toString();
}
}

View File

@ -0,0 +1,14 @@
package com.dite.znpt.util;
import lombok.Data;
/**
* @author Bear.G
* @date 2025/5/19/周一 15:09
* @description
*/
public interface ValidationGroup {
interface Insert {} //
interface Update {} //
}

View File

@ -1,7 +1,7 @@
package com.dite.znpt.web.controller;
import com.dite.znpt.domain.Constants;
import com.dite.znpt.constant.Constants;
import com.dite.znpt.domain.vo.CombinedDictListReq;
import com.dite.znpt.domain.vo.CombinedDictResp;
import com.dite.znpt.domain.entity.CombinedDictEntity;

View File

@ -1,7 +1,7 @@
package com.dite.znpt.web.controller;
import com.dite.znpt.domain.Constants;
import com.dite.znpt.constant.Constants;
import com.dite.znpt.domain.vo.DefectListReq;
import com.dite.znpt.domain.vo.DefectReq;
import com.dite.znpt.domain.vo.DefectResp;

View File

@ -1,7 +1,7 @@
package com.dite.znpt.web.controller;
import com.dite.znpt.domain.Constants;
import com.dite.znpt.constant.Constants;
import com.dite.znpt.domain.vo.FileInfoListReq;
import com.dite.znpt.domain.vo.FileInfoResp;
import com.dite.znpt.domain.entity.FileInfoEntity;

View File

@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
/**

View File

@ -0,0 +1,15 @@
package com.dite.znpt.web.controller;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Bear.G
* @date 2025/5/19/周一 14:32
* @description
*/
@Api(tags = "登录")
@RestController
public class LoginController {
}

View File

@ -1,7 +1,7 @@
package com.dite.znpt.web.controller;
import com.dite.znpt.domain.Constants;
import com.dite.znpt.constant.Constants;
import com.dite.znpt.domain.vo.PartListReq;
import com.dite.znpt.domain.vo.PartListResp;
import com.dite.znpt.domain.vo.PartReq;
@ -10,12 +10,14 @@ import com.dite.znpt.domain.entity.PartEntity;
import com.dite.znpt.service.PartService;
import com.dite.znpt.domain.Result;
import com.dite.znpt.domain.PageResult;
import com.dite.znpt.util.ValidationGroup;
import com.pig4cloud.plugin.excel.annotation.RequestExcel;
import com.pig4cloud.plugin.excel.annotation.ResponseExcel;
import com.pig4cloud.plugin.excel.vo.ErrorMessage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@ -32,39 +34,39 @@ public class PartController {
@Resource
private PartService partService;
@ApiOperation(value = "分页获取部件列表", httpMethod = "GET")
@ApiOperation(value = "分页查询部件信息列表", httpMethod = "GET")
@GetMapping("/page")
public PageResult<PartListResp> page(PartListReq partReq) {
return PageResult.ok(partService.page(partReq));
}
@ApiOperation(value = "获取部件列表", httpMethod = "GET")
@ApiOperation(value = "查询部件信息列表", httpMethod = "GET")
@GetMapping("/list")
public Result<List<PartListResp>> list(PartListReq partReq) {
return Result.ok(partService.list(partReq));
}
@ApiOperation(value = "根据Id获取详细信息", httpMethod = "GET")
@ApiOperation(value = "查询部件信息详情", httpMethod = "GET")
@GetMapping("/detail/{partId}")
public Result<PartResp> detail(@PathVariable String partId) {
return Result.ok(partService.detail(partId));
}
@ApiOperation(value = "新增", httpMethod = "POST")
@ApiOperation(value = "新增部件信息", httpMethod = "POST")
@PostMapping
public Result<Object> add(@RequestBody PartReq req) {
public Result<Object> add(@Validated(ValidationGroup.Insert.class) @RequestBody PartReq req) {
partService.save(req);
return Result.ok();
}
@ApiOperation(value = "修改", httpMethod = "PUT")
@ApiOperation(value = "修改部件信息", httpMethod = "PUT")
@PutMapping("/{partId}")
public Result<Object> edit(@PathVariable String partId, @RequestBody PartReq req) {
public Result<Object> edit(@Validated(ValidationGroup.Update.class) @PathVariable String partId, @RequestBody PartReq req) {
partService.update(partId, req);
return Result.ok();
}
@ApiOperation(value = "删除", httpMethod = "DELETE")
@ApiOperation(value = "删除部件信息", httpMethod = "DELETE")
@DeleteMapping("/{partId}")
public Result<Object> remove(@PathVariable String partId) {
partService.deleteById(partId);

View File

@ -1,7 +1,7 @@
package com.dite.znpt.web.controller;
import com.dite.znpt.domain.Constants;
import com.dite.znpt.constant.Constants;
import com.dite.znpt.domain.vo.ProjectListReq;
import com.dite.znpt.domain.vo.ProjectListResp;
import com.dite.znpt.domain.vo.ProjectReq;
@ -10,12 +10,14 @@ import com.dite.znpt.domain.entity.ProjectEntity;
import com.dite.znpt.service.ProjectService;
import com.dite.znpt.domain.Result;
import com.dite.znpt.domain.PageResult;
import com.dite.znpt.util.ValidationGroup;
import com.pig4cloud.plugin.excel.annotation.RequestExcel;
import com.pig4cloud.plugin.excel.annotation.ResponseExcel;
import com.pig4cloud.plugin.excel.vo.ErrorMessage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@ -52,14 +54,14 @@ public class ProjectController {
@ApiOperation(value = "新增项目信息", httpMethod = "POST")
@PostMapping
public Result add(@RequestBody ProjectReq req) {
public Result add(@Validated(ValidationGroup.Insert.class) @RequestBody ProjectReq req) {
projectService.save(req);
return Result.ok();
}
@ApiOperation(value = "修改项目信息", httpMethod = "PUT")
@PutMapping("/{projectId}")
public Result<Object> edit(@PathVariable String projectId, @RequestBody ProjectReq req) {
public Result<Object> edit(@PathVariable String projectId, @Validated(ValidationGroup.Update.class) @RequestBody ProjectReq req) {
projectService.update(projectId, req);
return Result.ok();
}

View File

@ -1,7 +1,7 @@
package com.dite.znpt.web.controller;
import com.dite.znpt.domain.Constants;
import com.dite.znpt.constant.Constants;
import com.dite.znpt.domain.vo.TConstructionListReq;
import com.dite.znpt.domain.vo.TConstructionResp;
import com.dite.znpt.domain.entity.TConstructionEntity;

View File

@ -1,18 +1,20 @@
package com.dite.znpt.web.controller;
import com.dite.znpt.domain.Constants;
import com.dite.znpt.constant.Constants;
import com.dite.znpt.domain.vo.*;
import com.dite.znpt.domain.entity.TurbineEntity;
import com.dite.znpt.service.TurbineService;
import com.dite.znpt.domain.Result;
import com.dite.znpt.domain.PageResult;
import com.dite.znpt.util.ValidationGroup;
import com.pig4cloud.plugin.excel.annotation.RequestExcel;
import com.pig4cloud.plugin.excel.annotation.ResponseExcel;
import com.pig4cloud.plugin.excel.vo.ErrorMessage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@ -61,14 +63,14 @@ public class TurbineController {
@ApiOperation(value = "新增机组", httpMethod = "POST")
@PostMapping
public Result<Object> add(@RequestBody TurbineReq req) {
public Result<Object> add(@Validated(ValidationGroup.Insert.class) @RequestBody TurbineReq req) {
turbineService.save(req);
return Result.ok();
}
@ApiOperation(value = "修改机组", httpMethod = "PUT")
@PutMapping("/{turbineId}")
public Result edit(@PathVariable String turbineId, @RequestBody TurbineReq req) {
public Result edit(@PathVariable String turbineId, @Validated(ValidationGroup.Insert.class) @RequestBody TurbineReq req) {
turbineService.update(turbineId, req);
return Result.ok();
}

View File

@ -8,15 +8,18 @@ import com.dite.znpt.domain.entity.UserEntity;
import com.dite.znpt.service.UserService;
import com.dite.znpt.domain.Result;
import com.dite.znpt.domain.PageResult;
import com.dite.znpt.util.ValidationGroup;
import com.pig4cloud.plugin.excel.annotation.RequestExcel;
import com.pig4cloud.plugin.excel.annotation.ResponseExcel;
import com.pig4cloud.plugin.excel.vo.ErrorMessage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
/**
@ -50,14 +53,13 @@ public class UserController {
@ApiOperation(value = "新增用户信息", httpMethod = "POST")
@PostMapping
public Result<Object> add(@RequestBody UserReq req) {
userService.save(req);
return Result.ok();
public Result<Object> add(@Validated(ValidationGroup.Insert.class) @RequestBody UserReq req) {
return Result.ok(userService.save(req));
}
@ApiOperation(value = "修改用户信息", httpMethod = "PUT")
@PutMapping("/{userId}")
public Result<Object> edit(@PathVariable String userId, @RequestBody UserReq req) {
public Result<Object> edit(@PathVariable String userId, @Validated(ValidationGroup.Update.class) @RequestBody UserReq req) {
userService.update(userId, req);
return Result.ok();
}

View File

@ -1,7 +1,7 @@
package com.dite.znpt.web.controller;
import com.dite.znpt.domain.Constants;
import com.dite.znpt.constant.Constants;
import com.dite.znpt.domain.vo.WeatherTypeListReq;
import com.dite.znpt.domain.vo.WeatherTypeResp;
import com.dite.znpt.domain.entity.WeatherTypeEntity;