feat(customer):新增认证相关功能

1. 服务端认证并查看拒绝原因
    2. 机构端认证并查看拒绝原因
    3. 管理端查询服务人员/机构认证记录
This commit is contained in:
JIAN 2024-08-31 00:03:52 +08:00
parent 83451f4b12
commit fe18fade77
11 changed files with 510 additions and 14 deletions

View File

@ -0,0 +1,36 @@
package com.jzo2o.customer.controller.agency;
import com.jzo2o.customer.model.dto.request.AgencyCertificationAuditAddReqDTO;
import com.jzo2o.customer.model.dto.response.RejectReasonResDTO;
import com.jzo2o.customer.service.ICertificationAuditService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author JIAN
*/
@RestController("agencyCertificationAuditController")
@RequestMapping("/agency/agency-certification-audit")
@Api(tags = "机构端 - 认证相关接口")
public class CertificationAuditController {
@Resource
private ICertificationAuditService certificationAuditService;
/**
* 提交认证信息
*/
@PostMapping
public void addCertificationInfo(@RequestBody AgencyCertificationAuditAddReqDTO agencyCertificationAuditAddReqDTO) {
certificationAuditService.addCertificationInfoForAgency(agencyCertificationAuditAddReqDTO);
}
/**
* 查询当前用户最新的拒绝原因
*/
@GetMapping("/rejectReason")
public RejectReasonResDTO getLatestRejectReason() {
return certificationAuditService.getLatestRejectReason();
}
}

View File

@ -0,0 +1,28 @@
package com.jzo2o.customer.controller.operation;
import com.jzo2o.common.model.PageResult;
import com.jzo2o.customer.model.dto.request.AgencyCertificationAuditPageQueryReqDTO;
import com.jzo2o.customer.model.dto.response.AgencyCertificationAuditResDTO;
import com.jzo2o.customer.service.ICertificationAuditService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author JIAN
*/
@RestController("operationAgencyCertificationAuditController")
@RequestMapping("/operation/agency-certification-audit")
@Api(tags = "运营端 - 机构认证相关接口")
public class AgencyCertificationAuditController {
@Resource
private ICertificationAuditService certificationAuditService;
@GetMapping("/page")
public PageResult<AgencyCertificationAuditResDTO> page(AgencyCertificationAuditPageQueryReqDTO agencyCertificationAuditPageQueryReqDTO) {
return certificationAuditService.getAgencyCertificationInfo(agencyCertificationAuditPageQueryReqDTO);
}
}

View File

@ -0,0 +1,28 @@
package com.jzo2o.customer.controller.operation;
import com.jzo2o.common.model.PageResult;
import com.jzo2o.customer.model.dto.request.WorkerCertificationAuditPageQueryReqDTO;
import com.jzo2o.customer.model.dto.response.WorkerCertificationAuditResDTO;
import com.jzo2o.customer.service.ICertificationAuditService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author JIAN
*/
@RestController("operationWorkerCertificationAudit")
@RequestMapping("/operation/worker-certification-audit")
@Api(tags = "运营端 - 服务人员认证相关接口")
public class WorkerCertificationAuditController {
@Resource
private ICertificationAuditService certificationAuditService;
@GetMapping("/page")
public PageResult<WorkerCertificationAuditResDTO> page(WorkerCertificationAuditPageQueryReqDTO workerCertificationAuditPageQueryReqDTO) {
return certificationAuditService.getWorkerCertificationInfo(workerCertificationAuditPageQueryReqDTO);
}
}

View File

@ -0,0 +1,36 @@
package com.jzo2o.customer.controller.worker;
import com.jzo2o.customer.model.dto.request.WorkerCertificationAuditAddReqDTO;
import com.jzo2o.customer.model.dto.response.RejectReasonResDTO;
import com.jzo2o.customer.service.ICertificationAuditService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author JIAN
*/
@RestController("workerCertificationAuditController")
@RequestMapping("/worker/worker-certification-audit")
@Api(tags = "服务端 - 认证相关接口")
public class CertificationAuditController {
@Resource
private ICertificationAuditService certificationAuditService;
/**
* 提交认证信息
*/
@PostMapping
public void addCertificationInfo(@RequestBody WorkerCertificationAuditAddReqDTO workerCertificationAuditAddReqDTO) {
certificationAuditService.addCertificationInfoForWorker(workerCertificationAuditAddReqDTO);
}
/**
* 查询当前用户最新的拒绝原因
*/
@GetMapping("/rejectReason")
public RejectReasonResDTO getLatestRejectReason() {
return certificationAuditService.getLatestRejectReason();
}
}

View File

@ -0,0 +1,16 @@
package com.jzo2o.customer.mapper;
import com.jzo2o.customer.model.domain.CertificationAudit;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 服务人员/机构认证流水表 Mapper 接口
* </p>
*
* @author JIAN
* @since 2024-08-30
*/
public interface CertificationAuditMapper extends BaseMapper<CertificationAudit> {
}

View File

@ -1,14 +1,16 @@
package com.jzo2o.customer.model.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 机构认证信息表
@ -18,6 +20,7 @@ import lombok.experimental.Accessors;
* @since 2023-09-06
*/
@Data
@Builder
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("agency_certification")
@ -28,7 +31,7 @@ public class AgencyCertification implements Serializable {
/**
* 机构id
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
@TableId(value = "id", type = IdType.NONE)
private Long id;
/**
@ -75,6 +78,4 @@ public class AgencyCertification implements Serializable {
* 更新时间
*/
private LocalDateTime updateTime;
}
}

View File

@ -0,0 +1,125 @@
package com.jzo2o.customer.model.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 服务人员/机构认证流水表
* </p>
* @author JIAN
* @since 2024-08-30
*/
@Data
@Builder
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("certification_audit")
public class CertificationAudit implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 流水表主键
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
/**
* 服务人员/机构id
*/
private Long serveProviderId;
/**
* 类型2服务人员3服务机构
*/
private Integer serveProviderType;
/**
* 服务人员/机构法人姓名
*/
private String name;
/**
* 服务人员/机构法人身份证号
*/
private String idCardNo;
/**
* 服务人员身份证正面
*/
private String frontImg;
/**
* 服务人员身份证反面
*/
private String backImg;
/**
* 服务人员认证材料
*/
private String certificationMaterial;
/**
* 机构名称
*/
private String institutionName;
/**
* 机构统一社会信用代码
*/
private String idNumber;
/**
* 机构营业执照
*/
private String businessLicense;
/**
* 审核状态0未审核1已审核
*/
private Integer auditStatus;
/**
* 审核时间
*/
private LocalDateTime auditTime;
/**
* 审核人员id(运营端)
*/
private Long auditorId;
/**
* 审核人员姓名(运营端)
*/
private String auditorName;
/**
* 认证状态1认证中2认证成功3: 认证失败
*/
private Integer certificationStatus;
/**
* 认证拒绝原因
*/
private String rejectReason;
/**
* 创建时间
*/
private LocalDateTime createTime;
/**
* 更新时间
*/
private LocalDateTime updateTime;
}

View File

@ -1,14 +1,16 @@
package com.jzo2o.customer.model.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 服务人员认证信息表
@ -18,6 +20,7 @@ import lombok.experimental.Accessors;
* @since 2023-09-06
*/
@Data
@Builder
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("worker_certification")
@ -28,7 +31,7 @@ public class WorkerCertification implements Serializable {
/**
* 服务人员id
*/
@TableId(value = "id", type = IdType.ASSIGN_ID)
@TableId(value = "id", type = IdType.NONE)
private Long id;
/**
@ -75,6 +78,4 @@ public class WorkerCertification implements Serializable {
* 更新时间
*/
private LocalDateTime updateTime;
}
}

View File

@ -0,0 +1,47 @@
package com.jzo2o.customer.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jzo2o.common.model.PageResult;
import com.jzo2o.customer.model.domain.CertificationAudit;
import com.jzo2o.customer.model.dto.request.AgencyCertificationAuditAddReqDTO;
import com.jzo2o.customer.model.dto.request.AgencyCertificationAuditPageQueryReqDTO;
import com.jzo2o.customer.model.dto.request.WorkerCertificationAuditAddReqDTO;
import com.jzo2o.customer.model.dto.request.WorkerCertificationAuditPageQueryReqDTO;
import com.jzo2o.customer.model.dto.response.AgencyCertificationAuditResDTO;
import com.jzo2o.customer.model.dto.response.RejectReasonResDTO;
import com.jzo2o.customer.model.dto.response.WorkerCertificationAuditResDTO;
/**
* <p>
* 服务人员/机构认证流水表 服务类
* </p>
*
* @author JIAN
* @since 2024-08-30
*/
public interface ICertificationAuditService extends IService<CertificationAudit> {
/**
* 服务端提交认证信息
*/
void addCertificationInfoForWorker(WorkerCertificationAuditAddReqDTO workerCertificationAuditAddReqDTO);
/**
* 机构端提交认证信息
*/
void addCertificationInfoForAgency(AgencyCertificationAuditAddReqDTO agencyCertificationAuditAddReqDTO);
/**
* 获取当前用户最新的拒绝原因
*/
RejectReasonResDTO getLatestRejectReason();
/**
* 获取服务端认证信息
*/
PageResult<WorkerCertificationAuditResDTO> getWorkerCertificationInfo(WorkerCertificationAuditPageQueryReqDTO pageQueryReqDTO);
/**
* 获取机构端认证消息
*/
PageResult<AgencyCertificationAuditResDTO> getAgencyCertificationInfo(AgencyCertificationAuditPageQueryReqDTO pageQueryReqDTO);
}

View File

@ -0,0 +1,173 @@
package com.jzo2o.customer.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jzo2o.common.constants.UserType;
import com.jzo2o.common.expcetions.ForbiddenOperationException;
import com.jzo2o.common.model.PageResult;
import com.jzo2o.common.utils.CollUtils;
import com.jzo2o.common.utils.ObjectUtils;
import com.jzo2o.customer.enums.CertificationStatusEnum;
import com.jzo2o.customer.mapper.AgencyCertificationMapper;
import com.jzo2o.customer.mapper.CertificationAuditMapper;
import com.jzo2o.customer.mapper.ServeProviderMapper;
import com.jzo2o.customer.mapper.WorkerCertificationMapper;
import com.jzo2o.customer.model.domain.AgencyCertification;
import com.jzo2o.customer.model.domain.CertificationAudit;
import com.jzo2o.customer.model.domain.ServeProvider;
import com.jzo2o.customer.model.domain.WorkerCertification;
import com.jzo2o.customer.model.dto.request.AgencyCertificationAuditAddReqDTO;
import com.jzo2o.customer.model.dto.request.AgencyCertificationAuditPageQueryReqDTO;
import com.jzo2o.customer.model.dto.request.WorkerCertificationAuditAddReqDTO;
import com.jzo2o.customer.model.dto.request.WorkerCertificationAuditPageQueryReqDTO;
import com.jzo2o.customer.model.dto.response.AgencyCertificationAuditResDTO;
import com.jzo2o.customer.model.dto.response.RejectReasonResDTO;
import com.jzo2o.customer.model.dto.response.WorkerCertificationAuditResDTO;
import com.jzo2o.customer.service.ICertificationAuditService;
import com.jzo2o.mvc.utils.UserContext;
import com.jzo2o.mysql.utils.PageUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
* <p>
* 服务人员/机构认证流水表 服务实现类
* </p>
* @author JIAN
* @since 2024-08-30
*/
@Service
public class CertificationAuditServiceImpl extends ServiceImpl<CertificationAuditMapper, CertificationAudit> implements ICertificationAuditService {
@Resource
private ServeProviderMapper serveProviderMapper;
@Resource
private WorkerCertificationMapper workerCertificationMapper;
@Resource
private AgencyCertificationMapper agencyCertificationMapper;
@Override
@Transactional
public void addCertificationInfoForWorker(WorkerCertificationAuditAddReqDTO workerCertificationAuditAddReqDTO) {
Long userId = UserContext.currentUserId();
ServeProvider worker = serveProviderMapper.selectById(userId);
if (ObjectUtils.isEmpty(userId) || ObjectUtils.isEmpty(worker)) {
throw new ForbiddenOperationException("用户不存在无法认证");
}
if (worker.getType() != UserType.WORKER) {
throw new ForbiddenOperationException("提交认证资料不符合用户身份");
}
// 更新流水表
baseMapper.insert(CertificationAudit.builder()
.serveProviderId(userId)
.serveProviderType(UserType.WORKER)
.name(workerCertificationAuditAddReqDTO.getName())
.idCardNo(workerCertificationAuditAddReqDTO.getIdCardNo())
.frontImg(workerCertificationAuditAddReqDTO.getFrontImg())
.backImg(workerCertificationAuditAddReqDTO.getBackImg())
.certificationMaterial(workerCertificationAuditAddReqDTO.getCertificationMaterial())
.build());
// 更新最终信息表
workerCertificationMapper.insert(WorkerCertification.builder()
.id(userId)
.certificationStatus(CertificationStatusEnum.PROGRESSING.getStatus())
.build());
}
@Override
@Transactional
public void addCertificationInfoForAgency(AgencyCertificationAuditAddReqDTO agencyCertificationAuditAddReqDTO) {
Long userId = UserContext.currentUserId();
ServeProvider worker = serveProviderMapper.selectById(userId);
if (ObjectUtils.isEmpty(userId) || ObjectUtils.isEmpty(worker)) {
throw new ForbiddenOperationException("用户不存在无法认证");
}
if (worker.getType() != UserType.INSTITUTION) {
throw new ForbiddenOperationException("提交认证资料不符合用户身份");
}
// 更新流水表
baseMapper.insert(CertificationAudit.builder()
.serveProviderId(userId)
.serveProviderType(UserType.INSTITUTION)
.name(agencyCertificationAuditAddReqDTO.getLegalPersonName())
.idCardNo(agencyCertificationAuditAddReqDTO.getLegalPersonIdCardNo())
.institutionName(agencyCertificationAuditAddReqDTO.getName())
.idNumber(agencyCertificationAuditAddReqDTO.getIdNumber())
.businessLicense(agencyCertificationAuditAddReqDTO.getBusinessLicense())
.build());
// 更新最终信息表
agencyCertificationMapper.insert(AgencyCertification.builder()
.id(userId)
.certificationStatus(CertificationStatusEnum.PROGRESSING.getStatus())
.build());
}
@Override
@SuppressWarnings("unchecked")
public RejectReasonResDTO getLatestRejectReason() {
List<CertificationAudit> certificationAudits = lambdaQuery()
.eq(CertificationAudit::getCertificationStatus, CertificationStatusEnum.FAIL.getStatus())
.eq(CertificationAudit::getServeProviderId, UserContext.currentUserId())
.orderByDesc(CertificationAudit::getCreateTime)
.list();
return CollUtils.isEmpty(certificationAudits)
? new RejectReasonResDTO()
: new RejectReasonResDTO(certificationAudits.get(0).getRejectReason());
}
@Override
public PageResult<WorkerCertificationAuditResDTO> getWorkerCertificationInfo(WorkerCertificationAuditPageQueryReqDTO pageQueryReqDTO) {
Page<CertificationAudit> pageQuery = PageUtils.parsePageQuery(pageQueryReqDTO, CertificationAudit.class);
String name = pageQueryReqDTO.getName();
String idCardNo = pageQueryReqDTO.getIdCardNo();
Integer auditStatus = pageQueryReqDTO.getAuditStatus();
Integer certificationStatus = pageQueryReqDTO.getCertificationStatus();
LambdaQueryWrapper<CertificationAudit> queryWrapper = Wrappers.<CertificationAudit>lambdaQuery()
.eq(CertificationAudit::getServeProviderType, UserType.WORKER)
.like(ObjectUtils.isNotEmpty(name), CertificationAudit::getName, name)
.like(ObjectUtils.isNotEmpty(idCardNo), CertificationAudit::getIdCardNo, idCardNo)
.eq(ObjectUtils.isNotEmpty(auditStatus), CertificationAudit::getAuditStatus, auditStatus)
.eq(ObjectUtils.isNotEmpty(certificationStatus), CertificationAudit::getCertificationStatus, certificationStatus);
return PageUtils.toPage(
baseMapper.selectPage(pageQuery, queryWrapper),
WorkerCertificationAuditResDTO.class);
}
@Override
public PageResult<AgencyCertificationAuditResDTO> getAgencyCertificationInfo(AgencyCertificationAuditPageQueryReqDTO pageQueryReqDTO) {
Page<CertificationAudit> pageQuery = PageUtils.parsePageQuery(pageQueryReqDTO, CertificationAudit.class);
String name = pageQueryReqDTO.getName();
String legalPersonName = pageQueryReqDTO.getLegalPersonName();
Integer auditStatus = pageQueryReqDTO.getAuditStatus();
Integer certificationStatus = pageQueryReqDTO.getCertificationStatus();
LambdaQueryWrapper<CertificationAudit> queryWrapper = Wrappers.<CertificationAudit>lambdaQuery()
.eq(CertificationAudit::getServeProviderType, UserType.INSTITUTION)
.like(ObjectUtils.isNotEmpty(name), CertificationAudit::getInstitutionName, name)
.like(ObjectUtils.isNotEmpty(legalPersonName), CertificationAudit::getName, legalPersonName)
.eq(ObjectUtils.isNotEmpty(auditStatus), CertificationAudit::getAuditStatus, auditStatus)
.eq(ObjectUtils.isNotEmpty(certificationStatus), CertificationAudit::getCertificationStatus, certificationStatus);
return PageUtils.toPage(
baseMapper.selectPage(pageQuery, queryWrapper),
AgencyCertificationAuditResDTO.class,
(origin, target) -> {
target.setName(origin.getInstitutionName());
target.setLegalPersonName(origin.getName());
target.setLegalPersonIdCardNo(origin.getIdCardNo());
});
}
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jzo2o.customer.mapper.CertificationAuditMapper">
</mapper>