From da92479da0fcb0384c4cf7c33306faa4c6768993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=9B=84?= Date: Wed, 4 Jun 2025 17:40:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BA=BA=E5=91=98=E8=B5=84=E8=B4=A8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E6=A8=A1=E5=9D=97=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dite/znpt/constant/Message.java | 4 + .../java/com/dite/znpt/converts/Converts.java | 6 + .../domain/entity/CertificationEntity.java | 62 ++++++++++ .../znpt/domain/vo/CertificationListReq.java | 29 +++++ .../dite/znpt/domain/vo/CertificationReq.java | 55 +++++++++ .../znpt/domain/vo/CertificationResp.java | 54 ++++++++ .../dite/znpt/enums/CertificationEnum.java | 56 +++++++++ .../dite/znpt/mapper/CertificationMapper.java | 17 +++ .../znpt/service/CertificationService.java | 24 ++++ .../impl/CertificationServiceImpl.java | 116 ++++++++++++++++++ .../resources/mapper/CertificationMapper.xml | 21 ++++ .../controller/CertificationController.java | 68 ++++++++++ 12 files changed, 512 insertions(+) create mode 100644 core/src/main/java/com/dite/znpt/domain/entity/CertificationEntity.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/CertificationListReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/CertificationReq.java create mode 100644 core/src/main/java/com/dite/znpt/domain/vo/CertificationResp.java create mode 100644 core/src/main/java/com/dite/znpt/enums/CertificationEnum.java create mode 100644 core/src/main/java/com/dite/znpt/mapper/CertificationMapper.java create mode 100644 core/src/main/java/com/dite/znpt/service/CertificationService.java create mode 100644 core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java create mode 100644 core/src/main/resources/mapper/CertificationMapper.xml create mode 100644 web/src/main/java/com/dite/znpt/web/controller/CertificationController.java diff --git a/core/src/main/java/com/dite/znpt/constant/Message.java b/core/src/main/java/com/dite/znpt/constant/Message.java index e0ab24e..5736018 100644 --- a/core/src/main/java/com/dite/znpt/constant/Message.java +++ b/core/src/main/java/com/dite/znpt/constant/Message.java @@ -34,4 +34,8 @@ public class Message implements Serializable { public static final String ROLE_ID_NOT_EXIST_OR_ILLEGAL = "角色id不存在或者不合法"; public static final String MENU_ID_NOT_EXIST = "菜单id不存在"; public static final String MENU_ID_NOT_EXIST_OR_ILLEGAL = "菜单id不存在或者不合法"; + public static final String USER_CERTIFICATION_EXIST = "用户{}已存在{}证书"; + public static final String CERTIFICATION_TYPE_ILLEGAL = "证书类型不合法"; + public static final String CERTIFICATION_CODE_EXIST = "证书编码已存在"; + public static final String CERTIFICATION_ID_NOT_EXIST = "证书id不存在"; } diff --git a/core/src/main/java/com/dite/znpt/converts/Converts.java b/core/src/main/java/com/dite/znpt/converts/Converts.java index e5f0d6b..e9c4a73 100644 --- a/core/src/main/java/com/dite/znpt/converts/Converts.java +++ b/core/src/main/java/com/dite/znpt/converts/Converts.java @@ -65,5 +65,11 @@ public interface Converts { MenuResp toMenuResp(MenuEntity entity); + CertificationEntity toCertificationEntity(CertificationReq req); + + CertificationResp toCertificationResp(CertificationEntity entity); + + List toCertificationResp(List list); + } diff --git a/core/src/main/java/com/dite/znpt/domain/entity/CertificationEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/CertificationEntity.java new file mode 100644 index 0000000..a8c7ce4 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/entity/CertificationEntity.java @@ -0,0 +1,62 @@ +package com.dite.znpt.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.dite.znpt.domain.AuditableEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:15 + * @description + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("certification") +@ApiModel(value="CertificationEntity对象", description="人员资质") +public class CertificationEntity extends AuditableEntity implements Serializable { + + @Serial + private static final long serialVersionUID = -5650015300122333342L; + + @ApiModelProperty("证书id") + @TableId(value = "certification_id", type = IdType.ASSIGN_UUID) + private String certificationId; + + @ApiModelProperty("用户id") + @TableField("user_id") + private String userId; + + @ApiModelProperty("证书编号") + @TableField("certification_code") + private String certificationCode; + + @ApiModelProperty("证书名称") + @TableField("certification_name") + private String certificationName; + + @ApiModelProperty("证书类型") + @TableField("certification_type") + private String certificationType; + + @ApiModelProperty("证书有效期-起") + @TableField("validity_date_begin") + private LocalDate validityDateBegin; + + @ApiModelProperty("证书有效期-讫") + @TableField("validity_date_end") + private LocalDate validityDateEnd; + + @ApiModelProperty("证书图片") + @TableField("certification_image") + private String certificationImage; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/CertificationListReq.java b/core/src/main/java/com/dite/znpt/domain/vo/CertificationListReq.java new file mode 100644 index 0000000..ef27291 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/CertificationListReq.java @@ -0,0 +1,29 @@ +package com.dite.znpt.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:25 + * @description + */ +@Data +@ApiModel("人员资质列表请求实体") +public class CertificationListReq implements Serializable { + @Serial + private static final long serialVersionUID = -2663690591627122279L; + + @ApiModelProperty("姓名") + private String userName; + + @ApiModelProperty("证书名称") + private String certificationName; + + @ApiModelProperty("证书类型") + private String certificationType; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/CertificationReq.java b/core/src/main/java/com/dite/znpt/domain/vo/CertificationReq.java new file mode 100644 index 0000000..d525c3e --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/CertificationReq.java @@ -0,0 +1,55 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.annotation.JsonFormat; +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; +import java.time.LocalDate; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:25 + * @description + */ +@Data +@ApiModel("人员资质请求实体") +public class CertificationReq implements Serializable { + @Serial + private static final long serialVersionUID = 1737569842748352413L; + + @NotBlank(message = "用户id不能为空") + @ApiModelProperty("用户id") + private String userId; + + @NotBlank(message = "证书名称不能为空") + @Size(max = 50, message = "证书名称长度不能超过50") + @ApiModelProperty("证书名称") + private String certificationName; + + @NotBlank(message = "证书编号不能为空") + @Size(max = 50, message = "证书编号长度不能超过50") + @ApiModelProperty("证书编号") + private String certificationCode; + + @NotBlank(message = "证书类型不能为空") + @ApiModelProperty("证书类型") + private String certificationType; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("证书有效期-起") + private LocalDate validityDateBegin; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("证书有效期-讫") + private LocalDate validityDateEnd; + + @NotBlank(message = "证书图片不能为空") + @ApiModelProperty("证书图片") + private String certificationImage; +} diff --git a/core/src/main/java/com/dite/znpt/domain/vo/CertificationResp.java b/core/src/main/java/com/dite/znpt/domain/vo/CertificationResp.java new file mode 100644 index 0000000..835d3fa --- /dev/null +++ b/core/src/main/java/com/dite/znpt/domain/vo/CertificationResp.java @@ -0,0 +1,54 @@ +package com.dite.znpt.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.time.LocalDate; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:25 + * @description + */ +@Data +@ApiModel("人员资质响应实体") +public class CertificationResp implements Serializable { + @Serial + private static final long serialVersionUID = 4123163394817757998L; + + @ApiModelProperty("证书id") + private String certificationId; + + @ApiModelProperty("用户id") + private String userId; + + @ApiModelProperty("用户姓名") + private String userName; + + @ApiModelProperty("证书编号") + private String certificationCode; + + @ApiModelProperty("证书名称") + private String certificationName; + + @ApiModelProperty("证书类型") + private String certificationType; + + @ApiModelProperty("证书类型描述") + private String certificationTypeLabel; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("证书有效期-起") + private LocalDate validityDateBegin; + + @JsonFormat(pattern = "yyyy-MM-dd") + @ApiModelProperty("证书有效期-讫") + private LocalDate validityDateEnd; + + @ApiModelProperty("证书图片") + private String certificationImage; +} diff --git a/core/src/main/java/com/dite/znpt/enums/CertificationEnum.java b/core/src/main/java/com/dite/znpt/enums/CertificationEnum.java new file mode 100644 index 0000000..f50cf73 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/enums/CertificationEnum.java @@ -0,0 +1,56 @@ +package com.dite.znpt.enums; + +import cn.hutool.json.JSONObject; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:33 + * @description + */ +@Getter +public enum CertificationEnum { + + HEIGHT_OPERATION("height-operation", "高处作业"), + LOW_VOLTAGE_OPERATION("low-voltage-operation", "低压电工"), + HIGH_VOLTAGE_OPERATION("high-voltage-operation", "高压电工"), + MARITIME_TRAFFIC_SAFETY("maritime-traffic-safety", "海上交通安全"), + DRIVING_LICENSE("driving-license", "驾驶证"), + LIGHTNING_PROTECTION_DETECTION("lightning-protection-detection", "防雷检测"), + DRONE_DRIVING("drone-driving", "无人机驾驶"); + + private final String code; + private final String desc; + + CertificationEnum(String code, String desc){ + this.code = code; + this.desc = desc; + } + + public static CertificationEnum getByCode(String code){ + for (CertificationEnum e : CertificationEnum.values() ) { + if(e.code.equals(code)){ + return e; + } + } + return null; + } + + public static String getDescByCode(String code){ + CertificationEnum e = getByCode(code); + return null == e ? null : e.desc; + } + + public static List listAll(){ + List list = new ArrayList<>(CertificationEnum.values().length); + for (CertificationEnum e : CertificationEnum.values() ) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set(e.code, e.desc); + list.add(jsonObject); + } + return list; + } +} diff --git a/core/src/main/java/com/dite/znpt/mapper/CertificationMapper.java b/core/src/main/java/com/dite/znpt/mapper/CertificationMapper.java new file mode 100644 index 0000000..9d48e29 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/mapper/CertificationMapper.java @@ -0,0 +1,17 @@ +package com.dite.znpt.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dite.znpt.domain.entity.CertificationEntity; +import com.dite.znpt.domain.vo.CertificationListReq; +import com.dite.znpt.domain.vo.CertificationResp; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:21 + * @description + */ +public interface CertificationMapper extends BaseMapper { + List selectCertification(CertificationListReq req); +} diff --git a/core/src/main/java/com/dite/znpt/service/CertificationService.java b/core/src/main/java/com/dite/znpt/service/CertificationService.java new file mode 100644 index 0000000..7f62b67 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/CertificationService.java @@ -0,0 +1,24 @@ +package com.dite.znpt.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dite.znpt.domain.entity.CertificationEntity; +import com.dite.znpt.domain.vo.CertificationListReq; +import com.dite.znpt.domain.vo.CertificationReq; +import com.dite.znpt.domain.vo.CertificationResp; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:22 + * @description + */ +public interface CertificationService extends IService { + + List page(CertificationListReq req); + List list(CertificationListReq req); + CertificationResp detail(String certificationId); + void save(CertificationReq req); + void update(String certificationId, CertificationReq req); + void deleteById(String certificationId); +} diff --git a/core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java new file mode 100644 index 0000000..0e99937 --- /dev/null +++ b/core/src/main/java/com/dite/znpt/service/impl/CertificationServiceImpl.java @@ -0,0 +1,116 @@ +package com.dite.znpt.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +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.CertificationEntity; +import com.dite.znpt.domain.entity.UserEntity; +import com.dite.znpt.domain.vo.CertificationListReq; +import com.dite.znpt.domain.vo.CertificationReq; +import com.dite.znpt.domain.vo.CertificationResp; +import com.dite.znpt.enums.CertificationEnum; +import com.dite.znpt.exception.ServiceException; +import com.dite.znpt.mapper.CertificationMapper; +import com.dite.znpt.service.CertificationService; +import com.dite.znpt.service.UserService; +import com.dite.znpt.util.PageUtil; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:23 + * @description + */ +@AllArgsConstructor +@Service +public class CertificationServiceImpl extends ServiceImpl implements CertificationService { + + private final UserService userService; + + @Override + public List page(CertificationListReq req) { + PageUtil.startPage(); + return this.list(req); + } + + @Override + public List list(CertificationListReq req) { + List list = this.baseMapper.selectCertification(req); + list.stream().forEach(resp -> { + resp.setCertificationTypeLabel(CertificationEnum.getDescByCode(resp.getCertificationType())); + }); + return list; + } + + @Override + public CertificationResp detail(String certificationId) { + CertificationResp resp = Converts.INSTANCE.toCertificationResp(this.getById(certificationId)); + resp.setCertificationTypeLabel(CertificationEnum.getDescByCode(resp.getCertificationType())); + resp.setUserName(userService.getById(resp.getUserId()).getName()); + return resp; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void save(CertificationReq req) { + this.save(validation(null, req)); + } + + private CertificationEntity validation(String certificationId, CertificationReq req) { + UserEntity user = userService.getById(req.getUserId()); + if(null == user || !Constants.DEL_FLAG_0.equals(user.getDelFlag()) || !Constants.STATUS_0.equals(user.getStatus())){ + throw new ServiceException(Message.USER_ID_NOT_EXIST_OR_ILLEGAL); + } + if(null == CertificationEnum.getByCode(req.getCertificationType())){ + throw new ServiceException(Message.CERTIFICATION_TYPE_ILLEGAL); + } + List userIdTypeList = this.list(Wrappers.lambdaQuery(CertificationEntity.class).eq(CertificationEntity::getCertificationType, req.getCertificationType()).eq(CertificationEntity::getUserId, req.getUserId())); + List codeList = this.list(Wrappers.lambdaQuery(CertificationEntity.class).eq(CertificationEntity::getCertificationCode, req.getCertificationCode())); + if(StrUtil.isBlank(certificationId)){ + if(CollUtil.isNotEmpty(userIdTypeList)){ + throw new ServiceException(StrUtil.format(Message.USER_CERTIFICATION_EXIST, user.getName(), CertificationEnum.getDescByCode(req.getCertificationType()))); + } + if(CollUtil.isNotEmpty(codeList)){ + throw new ServiceException(Message.CERTIFICATION_CODE_EXIST); + } + }else{ + CertificationEntity entity = this.getById(certificationId); + if(null == entity){ + throw new ServiceException(Message.CERTIFICATION_ID_NOT_EXIST); + } + if((!entity.getUserId().equals(req.getUserId()) ||!entity.getCertificationType().equals(req.getCertificationType())) && CollUtil.isNotEmpty(userIdTypeList)){ + throw new ServiceException(StrUtil.format(Message.USER_CERTIFICATION_EXIST, user.getName(), CertificationEnum.getDescByCode(req.getCertificationType()))); + } + if(!entity.getCertificationCode().equals(req.getCertificationCode()) && CollUtil.isNotEmpty(codeList)){ + throw new ServiceException(Message.CERTIFICATION_CODE_EXIST); + } + } + return Converts.INSTANCE.toCertificationEntity(req); + } + + + @Transactional(rollbackFor = Exception.class) + @Override + public void update(String certificationId, CertificationReq req) { + CertificationEntity entity = validation(certificationId, req); + entity.setCertificationId(certificationId); + this.updateById(entity); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteById(String certificationId) { + if(null == this.getById(certificationId)){ + throw new ServiceException(Message.CERTIFICATION_ID_NOT_EXIST); + } + this.removeById(certificationId); + } +} diff --git a/core/src/main/resources/mapper/CertificationMapper.xml b/core/src/main/resources/mapper/CertificationMapper.xml new file mode 100644 index 0000000..e4cc340 --- /dev/null +++ b/core/src/main/resources/mapper/CertificationMapper.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/web/src/main/java/com/dite/znpt/web/controller/CertificationController.java b/web/src/main/java/com/dite/znpt/web/controller/CertificationController.java new file mode 100644 index 0000000..a64b534 --- /dev/null +++ b/web/src/main/java/com/dite/znpt/web/controller/CertificationController.java @@ -0,0 +1,68 @@ +package com.dite.znpt.web.controller; + +import com.dite.znpt.domain.PageResult; +import com.dite.znpt.domain.Result; +import com.dite.znpt.domain.vo.CertificationListReq; +import com.dite.znpt.domain.vo.CertificationReq; +import com.dite.znpt.domain.vo.CertificationResp; +import com.dite.znpt.service.CertificationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author Bear.G + * @date 2025/5/27/周二 15:24 + * @description + */ +@Api(tags = "人员资质") +@RestController +@RequestMapping("/certification") +@AllArgsConstructor +public class CertificationController { + + private final CertificationService certificationService; + + @GetMapping("/page") + @ApiOperation(value = "分页查询人员资质信息", httpMethod = "GET") + public PageResult page(CertificationListReq req){ + return PageResult.ok(certificationService.page(req)); + } + + @GetMapping("/list") + @ApiOperation(value = "查询人员资质信息列表", httpMethod = "GET") + public Result> list(CertificationListReq req){ + return Result.ok(certificationService.list(req)); + } + + @GetMapping("/detail/{certificationId}") + @ApiOperation(value = "查询人员资质详情", httpMethod = "GET") + public Result detail(@PathVariable String certificationId){ + return Result.ok(certificationService.detail(certificationId)); + } + + @PostMapping + @ApiOperation(value = "新增人员资质", httpMethod = "POST") + public Result add(@Validated @RequestBody CertificationReq req){ + certificationService.save(req); + return Result.ok(); + } + + @PutMapping("/{certificationId}") + @ApiOperation(value = "修改人员资质信息", httpMethod = "PUT") + public Result update(@PathVariable String certificationId, @Validated @RequestBody CertificationReq req){ + certificationService.update(certificationId, req); + return Result.ok(); + } + + @DeleteMapping("/{certificationId}") + @ApiOperation(value = "删除人员资质信息", httpMethod = "DELETE") + public Result remove(@PathVariable String certificationId){ + certificationService.deleteById(certificationId); + return Result.ok(); + } +}