This commit is contained in:
ran.shang
2025-12-23 17:40:32 +08:00
parent 083eb8bfe2
commit be2e15b68a
421 changed files with 69 additions and 30627 deletions

13
pom.xml
View File

@@ -10,12 +10,14 @@
<relativePath />
</parent>
<groupId>com.newyetai</groupId>
<artifactId>alita-bjy-uygur</artifactId>
<artifactId>demo</artifactId>
<version>0.0.1</version>
<packaging>jar</packaging>
<properties>
<org.mapstruct.version>1.2.0.Final</org.mapstruct.version>
<org.mapstruct.version>1.5.5.Final</org.mapstruct.version>
<maven.compiler.source>8</maven.compiler.source> <!-- 匹配你的 JDK 版本 -->
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
@@ -79,7 +81,7 @@
<version>4.2</version>
</dependency>
<dependency>
<!--<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>${org.mapstruct.version}</version>
@@ -90,6 +92,11 @@
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
<scope>provided</scope>
</dependency>-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<!-- 使用org.springframework.data.annotation下的注解 -->

View File

@@ -12,10 +12,10 @@ import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication(scanBasePackages = {"com.newyetai"})
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
@EnableScheduling
public class AlitaBjyUygurApplication {
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(AlitaBjyUygurApplication.class, args);
SpringApplication.run(DemoApplication.class, args);
}

View File

@@ -1,41 +0,0 @@
package com.newyetai.ai.controller;
import com.newyetai.common.AlitaResult;
import com.newyetai.sdk.ai.util.AIUtils;
import com.newyetai.sdk.xf.dto.RtasrReqDTO;
import com.newyetai.sdk.xf.model.ChatReq;
import com.newyetai.sdk.xf.model.TranslateReq;
import com.newyetai.sdk.xf.util.XfUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
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;
@Api(tags = "ai")
@RestController
@RequestMapping("anon/ai")
public class AiController {
@PostMapping("chat")
@ApiOperation("ai对话")
public AlitaResult<String> chat(@Validated @RequestBody ChatReq req) {
return AlitaResult.success(AIUtils.chat(req));
}
@PostMapping("translate")
@ApiOperation("ai翻译")
public AlitaResult<String> translate(@Validated @RequestBody TranslateReq req) {
return AlitaResult.success(XfUtils.translate(req));
}
@PostMapping("rtasr")
@ApiOperation("ai实时语音转写")
public AlitaResult<String> rtasr(@Validated @RequestBody RtasrReqDTO req) {
return AlitaResult.success(XfUtils.rtasr(req));
}
}

View File

@@ -1,67 +0,0 @@
package com.newyetai.ai.interview.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.util.JsonUtils;
import com.newyetai.common.validation.Create;
import com.newyetai.common.validation.Update;
import com.newyetai.tkmybatis.pojo.Page;
import com.newyetai.ai.interview.dto.*;
import com.newyetai.ai.interview.service.InterviewRecordService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
* ai面试记录
*
* @author guixinman
* @since 1.0.0 2024-12-11
*/
@Api(tags = "ai面试记录")
@RestController
@RequestMapping("/ai/interviewRecord")
public class InterviewRecordController {
@Autowired
private InterviewRecordService interviewRecordService;
@PostMapping("/create")
@ApiOperation("ai面试记录-创建")
public AlitaResult<InterviewRecordDTO> create(@RequestBody @Validated(value = Create.class) InterviewRecordOperatorDTO operatorDTO) {
return AlitaResult.success(interviewRecordService.create(operatorDTO));
}
@PutMapping("/modify")
@ApiOperation("ai面试记录-修改")
public AlitaResult<InterviewRecordDTO> modify(@RequestBody @Validated(value = Update.class) InterviewRecordOperatorDTO operatorDTO) {
return AlitaResult.success(interviewRecordService.modify(operatorDTO));
}
@DeleteMapping("{id}")
@ApiOperation("ai面试记录-删除")
public AlitaResult<InterviewRecordDTO> delete(@PathVariable("id") Long id) {
return AlitaResult.success(interviewRecordService.delete(id));
}
@GetMapping("{id}")
@ApiOperation("ai面试记录-查询单个")
public AlitaResult<InterviewRecordDTO> findById(@PathVariable("id") Long id) {
return AlitaResult.success(interviewRecordService.findById(id));
}
@GetMapping("list")
@ApiOperation("ai面试记录-列表查询")
public AlitaResult<List<InterviewRecordDTO>> list(InterviewRecordQueryDTO queryDTO) {
return AlitaResult.success(interviewRecordService.list(queryDTO));
}
@GetMapping("page")
@ApiOperation("ai面试记录-分页查询")
public AlitaResult<Page<InterviewRecordDTO>> page(InterviewRecordPageQueryDTO queryDTO) {
interviewRecordService.page(queryDTO);
return AlitaResult.success(queryDTO.getPageResult());
}
}

View File

@@ -1,28 +0,0 @@
package com.newyetai.ai.interview.convert;
import com.newyetai.ai.interview.entity.InterviewRecord;
import com.newyetai.ai.interview.dto.InterviewRecordDTO;
import com.newyetai.ai.interview.dto.InterviewRecordOperatorDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* ai面试记录
*
* @author guixinman
* @since 1.0.0 2024-12-11
*/
@Mapper
public interface InterviewRecordConvert {
InterviewRecordConvert INSTANCE = Mappers.getMapper(InterviewRecordConvert.class);
InterviewRecord convert(InterviewRecordDTO dto);
InterviewRecordDTO convert(InterviewRecord entity);
InterviewRecord convert(InterviewRecordOperatorDTO dto);
}

View File

@@ -1,26 +0,0 @@
package com.newyetai.ai.interview.dao;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import com.newyetai.ai.interview.entity.InterviewRecord;
import com.newyetai.ai.interview.dto.InterviewRecordDTO;
import com.newyetai.ai.interview.dto.InterviewRecordQueryDTO;
import com.newyetai.ai.interview.dto.InterviewRecordPageQueryDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* ai面试记录
*
* @author guixinman
* @since 1.0.0 2024-12-11
*/
@Mapper
public interface InterviewRecordMapper extends MyMapper<InterviewRecord> {
List<InterviewRecordDTO> page(@Param("param") InterviewRecordPageQueryDTO queryDTO);
List<InterviewRecordDTO> list(@Param("param") InterviewRecordQueryDTO queryDTO);
}

View File

@@ -1,45 +0,0 @@
package com.newyetai.ai.interview.dto;
import com.newyetai.common.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.SuperBuilder;
import java.util.Date;
/**
* ai面试记录
*
* @author guixinman
* @since 1.0.0 2024-12-11
*/
@ApiModel("ai面试记录")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class InterviewRecordDTO extends BaseDTO {
private static final long serialVersionUID = 1L;
@ApiModelProperty("用户ID(xs_user)")
private Long userId;
@ApiModelProperty("模拟岗位名称")
private String positionName;
@ApiModelProperty("面试状态(1.待开始、2.待继续、3.已完成)")
private Integer state;
@ApiModelProperty("报告出具状态(1.未出具 2.已出具)")
private Integer reportStatus;
private String jsonData;
@ApiModelProperty("节点")
private Integer node;
}

View File

@@ -1,69 +0,0 @@
package com.newyetai.ai.interview.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.newyetai.common.validation.Create;
import com.newyetai.common.validation.Update;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* ai面试记录
*
* @author guixinman
* @since 1.0.0 2024-12-11
*/
@ApiModel("ai面试记录")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class InterviewRecordOperatorDTO implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "id不能为空",groups = Update.class)
private Long id;
@ApiModelProperty("用户ID(xs_user)")
private Long userId;
@Length(max = 32,message = "模拟岗位名称超长")
@NotBlank(message = "模拟岗位名称不能为空",groups = {Create.class})
@ApiModelProperty("模拟岗位名称")
private String positionName;
@ApiModelProperty("面试状态(1.待开始、2.待继续、3.已完成)")
private Integer state;
@ApiModelProperty("报告出具状态(1.未出具 2.已出具)")
private Integer reportStatus;
@NotNull(message = "数据不能为空",groups = {Update.class})
private String jsonData;
@NotNull(message = "节点不能为空",groups = {Update.class})
@ApiModelProperty("节点")
private Integer node;
//是否评分
@Builder.Default
private Boolean gradeInterview = Boolean.FALSE;
}

View File

@@ -1,74 +0,0 @@
package com.newyetai.ai.interview.dto;
import com.newyetai.common.dto.PageQueryDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* ai面试记录
*
* @author guixinman
* @since 1.0.0 2024-12-11
*/
@ApiModel("ai面试记录")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class InterviewRecordPageQueryDTO extends PageQueryDTO<InterviewRecordDTO> {
private static final long serialVersionUID = 1L;
private Long id;
@ApiModelProperty("用户ID(xs_user)")
private Long userId;
@ApiModelProperty("模拟岗位名称 (模糊匹配)")
private String positionNameLike;
@ApiModelProperty("面试状态(1.待开始、2.待继续、3.已完成)")
private Integer state;
@ApiModelProperty("报告出具状态(1.未出具 2.已出具)")
private Integer reportStatus;
private String jsonData;
@ApiModelProperty("节点")
private Integer node;
@ApiModelProperty("创建时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeStart;
@ApiModelProperty("创建时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeEnd;
@ApiModelProperty("修改时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeStart;
@ApiModelProperty("修改时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeEnd;
}

View File

@@ -1,74 +0,0 @@
package com.newyetai.ai.interview.dto;
import com.newyetai.common.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* ai面试记录
*
* @author guixinman
* @since 1.0.0 2024-12-11
*/
@ApiModel("ai面试记录")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class InterviewRecordQueryDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
@ApiModelProperty("用户ID(xs_user)")
private Long userId;
@ApiModelProperty("模拟岗位名称 (模糊匹配)")
private String positionNameLike;
@ApiModelProperty("面试状态(1.待开始、2.待继续、3.已完成)")
private Integer state;
@ApiModelProperty("报告出具状态(1.未出具 2.已出具)")
private Integer reportStatus;
private String jsonData;
@ApiModelProperty("节点")
private Integer node;
@ApiModelProperty("创建时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeStart;
@ApiModelProperty("创建时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeEnd;
@ApiModelProperty("修改时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeStart;
@ApiModelProperty("修改时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeEnd;
}

View File

@@ -1,53 +0,0 @@
package com.newyetai.ai.interview.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.newyetai.common.entity.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* ai面试记录
*
* @author guixinman
* @since 1.0.0 2024-12-11
*/
@TableName(value = "ai_interview_record")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class InterviewRecord extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 用户ID(xs_user)
*/
private Long userId;
/**
* 模拟岗位名称
*/
private String positionName;
/**
* 面试状态(1.待开始、2.待继续、3.已完成)
*/
private Integer state;
/**
* 报告出具状态(1.未出具 2.已出具)
*/
private Integer reportStatus;
/**
*
*/
private String jsonData;
/**
* 节点
*/
private Integer node;
}

View File

@@ -1,33 +0,0 @@
package com.newyetai.ai.interview.enums;
/**
* @description: 面试状态
* @return:
* @author: guixinman
* @param:
*/
public enum InterviewRecordEnum {
INIT(1,"待开始"),
TO_BE_CONTINUED(2,"待继续"),
SUCCESS(3,"已完成"),
;
private Integer status;
/**
* 类型描述
*/
private String desc;
InterviewRecordEnum(Integer status, String desc) {
this.status = status;
this.desc = desc;
}
public Integer getStatus() {
return status;
}
public String getDesc() {
return desc;
}
}

View File

@@ -1,33 +0,0 @@
package com.newyetai.ai.interview.enums;
/**
* @description: 报告出具状态
* @return:
* @author: guixinman
* @param:
*/
public enum InterviewRecordReportStatusEnum {
INIT(1,"未出具"),
SUCCESS(2,"已出具"),
;
private Integer status;
/**
* 类型描述
*/
private String desc;
InterviewRecordReportStatusEnum(Integer status, String desc) {
this.status = status;
this.desc = desc;
}
public Integer getStatus() {
return status;
}
public String getDesc() {
return desc;
}
}

View File

@@ -1,57 +0,0 @@
<?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.newyetai.ai.interview.dao.InterviewRecordMapper">
<select id="list" resultType="com.newyetai.ai.interview.dto.InterviewRecordDTO">
SELECT t.*
<include refid="queryFromSql"></include>
</select>
<select id="page" resultType="com.newyetai.ai.interview.dto.InterviewRecordDTO">
SELECT t.*
<include refid="queryFromSql"></include>
</select>
<sql id="queryFromSql">
FROM
ai_interview_record t
WHERE t.deleted = 0
<if test='param.id != null'>
AND t.id = #{param.id}
</if>
<if test='param.userId != null'>
AND t.user_id = #{param.userId}
</if>
<if test='param.positionNameLike != null and param.positionNameLike.trim() != ""'>
<bind name="positionNameLike" value="'%' + param.positionNameLike + '%'"/>
AND t.position_name like #{positionNameLike}
</if>
<if test='param.state != null'>
AND t.state = #{param.state}
</if>
<if test='param.reportStatus != null'>
AND t.report_status = #{param.reportStatus}
</if>
<if test='param.jsonData != null and param.jsonData.trim() != ""'>
AND t.json_data = #{param.jsonData}
</if>
<if test='param.node != null'>
AND t.node = #{param.node}
</if>
<if test='param.createTimeStart != null'>
AND t.create_time &gt;= #{param.createTimeStart}
</if>
<if test='param.createTimeEnd != null'>
AND t.create_time &lt;= #{param.createTimeEnd}
</if>
<if test='param.updateTimeStart != null'>
AND t.update_time &gt;= #{param.updateTimeStart}
</if>
<if test='param.updateTimeEnd != null'>
AND t.update_time &lt;= #{param.updateTimeEnd}
</if>
ORDER BY t.id DESC
</sql>
</mapper>

View File

@@ -1,68 +0,0 @@
package com.newyetai.ai.interview.service;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import javax.validation.groups.Default;
import java.util.List;
import com.newyetai.ai.interview.dto.*;
/**
* ai面试记录
*
* @author guixinman
* @since 1.0.0 2024-12-11
*/
@Validated(Default.class)
public interface InterviewRecordService {
/**
* ai面试记录 - 创建
*
* @param operatorDto 操作dto
* @return {@link InterviewRecordDTO}
*/
InterviewRecordDTO create(@Valid InterviewRecordOperatorDTO operatorDto);
/**
* ai面试记录 - 修改
*
* @param operatorDto 操作dto
* @return {@link InterviewRecordDTO}
*/
InterviewRecordDTO modify(@Valid InterviewRecordOperatorDTO operatorDto);
/**
* ai面试记录 - 删除
*
* @param id id
* @return {@link InterviewRecordDTO}
*/
InterviewRecordDTO delete(Long id);
/**
* ai面试记录 - 根据ID查询单个
*
* @param id id
* @return {@link InterviewRecordDTO}
*/
InterviewRecordDTO findById(Long id);
/**
* ai面试记录 - 列表查询
*
* @param queryDTO 列表查询dto
* @return {@link List}<{@link InterviewRecordDTO}>
*/
List<InterviewRecordDTO> list(InterviewRecordQueryDTO queryDTO);
/**
* ai面试记录 - 分页查询
*
* @param queryDTO 分页查询dto
* @return {@link InterviewRecordDTO}
*/
List<InterviewRecordDTO> page(InterviewRecordPageQueryDTO queryDTO);
}

View File

@@ -1,108 +0,0 @@
package com.newyetai.ai.interview.service.impl;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import com.newyetai.ai.interview.convert.InterviewRecordConvert;
import com.newyetai.ai.interview.entity.InterviewRecord;
import com.newyetai.ai.interview.dto.*;
import com.newyetai.ai.interview.dao.InterviewRecordMapper;
import com.newyetai.ai.interview.enums.InterviewRecordEnum;
import com.newyetai.ai.interview.enums.InterviewRecordReportStatusEnum;
import com.newyetai.ai.interview.service.InterviewRecordService;
import org.springframework.stereotype.Service;
import com.newyetai.common.exception.BusinessException;
import com.newyetai.common.util.JsonUtils;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.sdk.xf.dto.InterviewContentDTO;
import com.newyetai.sdk.xf.util.XfUtils;
import javax.annotation.Resource;
import java.util.*;
/**
* ai面试记录
*
* @author guixinman
* @since 1.0.0 2024-12-11
*/
@Slf4j
@Service
public class InterviewRecordServiceImpl implements InterviewRecordService {
@Resource
private InterviewRecordMapper interviewRecordMapper;
@Override
public InterviewRecordDTO create(InterviewRecordOperatorDTO operatorDto) {
InterviewRecord interviewRecord = InterviewRecordConvert.INSTANCE.convert(operatorDto);
interviewRecord.setUserId(UserContextHolder.getExistLoginUserId());
interviewRecord.setNode(1);
interviewRecord.setState(InterviewRecordEnum.INIT.getStatus());
interviewRecord.setReportStatus(InterviewRecordReportStatusEnum.INIT.getStatus());
String data = XfUtils.generateInterviewQuestion(InterviewContentDTO.builder().positionName(operatorDto.getPositionName()).build());
interviewRecord.setJsonData(data);
interviewRecordMapper.saveEntity(interviewRecord);
return InterviewRecordConvert.INSTANCE.convert(interviewRecord);
}
@Override
public InterviewRecordDTO modify(InterviewRecordOperatorDTO operatorDto) {
InterviewRecordDTO interviewRecordDto = this.findById(operatorDto.getId());
if (Objects.isNull(interviewRecordDto)) {
return null;
}
InterviewRecord interviewRecord = InterviewRecordConvert.INSTANCE.convert(operatorDto);
String jsonData = interviewRecord.getJsonData();
InterviewContentDTO interviewContentDTO = JsonUtils.toObject(jsonData, InterviewContentDTO.class);
if (Boolean.TRUE.equals(operatorDto.getGradeInterview())) {
String jsonDataNew = XfUtils.gradeInterview(interviewContentDTO);
interviewRecord.setReportStatus(InterviewRecordReportStatusEnum.SUCCESS.getStatus());
interviewRecord.setJsonData(jsonDataNew);
interviewRecord.setState(InterviewRecordEnum.SUCCESS.getStatus());
}else {
interviewRecord.setState(InterviewRecordEnum.TO_BE_CONTINUED.getStatus());
}
interviewRecordMapper.updateEntitySelective(interviewRecord);
return this.findById(operatorDto.getId());
}
@Override
public InterviewRecordDTO delete(Long id) {
InterviewRecordDTO interviewRecordDto = this.findById(id);
if (Objects.isNull(interviewRecordDto)) {
return null;
}
InterviewRecord interviewRecord = InterviewRecord.builder().build();
interviewRecord.setId(id);
interviewRecordMapper.deleteEntity(interviewRecord, UserContextHolder.getLoginUserId());
return interviewRecordDto;
}
@Override
public InterviewRecordDTO findById(Long id) {
InterviewRecord interviewRecord = interviewRecordMapper.getById(id);
if (Objects.isNull(interviewRecord)) {
return null;
}
return InterviewRecordConvert.INSTANCE.convert(interviewRecord);
}
@Override
public List<InterviewRecordDTO> list(InterviewRecordQueryDTO queryDTO) {
return interviewRecordMapper.list(queryDTO);
}
@Override
public List<InterviewRecordDTO> page(InterviewRecordPageQueryDTO queryDTO) {
queryDTO.setUserId(UserContextHolder.getExistLoginUserId());
return interviewRecordMapper.page(queryDTO);
}
}

View File

@@ -1,76 +0,0 @@
package com.newyetai.ai.mbti.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.validation.Create;
import com.newyetai.common.validation.Update;
import com.newyetai.tkmybatis.pojo.Page;
import com.newyetai.ai.mbti.dto.*;
import com.newyetai.ai.mbti.service.MbtiRecordService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
* AI测评记录
*
* @author guixinman
* @since 1.0.0 2024-12-20
*/
@Api(tags = "AI测评记录")
@RestController
@RequestMapping("/ai/mbtiRecord")
public class MbtiRecordController {
@Autowired
private MbtiRecordService mbtiRecordService;
@PostMapping("/create")
@ApiOperation("AI测评记录-创建")
public AlitaResult<MbtiRecordDTO> create(@RequestBody @Validated(value = Create.class) MbtiRecordOperatorDTO operatorDTO) {
return AlitaResult.success(mbtiRecordService.create(operatorDTO));
}
@PutMapping("/modify")
@ApiOperation("AI测评记录-修改")
public AlitaResult<MbtiRecordDTO> modify(@RequestBody @Validated(value = Update.class) MbtiRecordOperatorDTO operatorDTO) {
return AlitaResult.success(mbtiRecordService.modify(operatorDTO));
}
@ApiOperation("AI测评记录-出具报告")
@PostMapping("/report")
public AlitaResult<Void> report(@RequestParam("id") Long id){
mbtiRecordService.report(id);
return AlitaResult.success();
}
@DeleteMapping("{id}")
@ApiOperation("AI测评记录-删除")
public AlitaResult<MbtiRecordDTO> delete(@PathVariable("id") Long id) {
return AlitaResult.success(mbtiRecordService.delete(id));
}
@GetMapping("{id}")
@ApiOperation("AI测评记录-查询单个")
public AlitaResult<MbtiRecordDTO> findById(@PathVariable("id") Long id) {
return AlitaResult.success(mbtiRecordService.findById(id));
}
@GetMapping("list")
@ApiOperation("AI测评记录-列表查询")
public AlitaResult<List<MbtiRecordDTO>> list(MbtiRecordQueryDTO queryDTO) {
return AlitaResult.success(mbtiRecordService.list(queryDTO));
}
@GetMapping("page")
@ApiOperation("AI测评记录-分页查询")
public AlitaResult<Page<MbtiRecordDTO>> page(MbtiRecordPageQueryDTO queryDTO) {
mbtiRecordService.page(queryDTO);
return AlitaResult.success(queryDTO.getPageResult());
}
}

View File

@@ -1,28 +0,0 @@
package com.newyetai.ai.mbti.convert;
import com.newyetai.ai.mbti.entity.MbtiRecord;
import com.newyetai.ai.mbti.dto.MbtiRecordDTO;
import com.newyetai.ai.mbti.dto.MbtiRecordOperatorDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* AI测评记录
*
* @author guixinman
* @since 1.0.0 2024-12-20
*/
@Mapper
public interface MbtiRecordConvert {
MbtiRecordConvert INSTANCE = Mappers.getMapper(MbtiRecordConvert.class);
MbtiRecord convert(MbtiRecordDTO dto);
MbtiRecordDTO convert(MbtiRecord entity);
MbtiRecord convert(MbtiRecordOperatorDTO dto);
}

View File

@@ -1,26 +0,0 @@
package com.newyetai.ai.mbti.dao;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import com.newyetai.ai.mbti.entity.MbtiRecord;
import com.newyetai.ai.mbti.dto.MbtiRecordDTO;
import com.newyetai.ai.mbti.dto.MbtiRecordQueryDTO;
import com.newyetai.ai.mbti.dto.MbtiRecordPageQueryDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* AI测评记录
*
* @author guixinman
* @since 1.0.0 2024-12-20
*/
@Mapper
public interface MbtiRecordMapper extends MyMapper<MbtiRecord> {
List<MbtiRecordDTO> page(@Param("param") MbtiRecordPageQueryDTO queryDTO);
List<MbtiRecordDTO> list(@Param("param") MbtiRecordQueryDTO queryDTO);
}

View File

@@ -1,51 +0,0 @@
package com.newyetai.ai.mbti.dto;
import com.newyetai.common.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.SuperBuilder;
import java.util.Date;
/**
* AI测评记录
*
* @author guixinman
* @since 1.0.0 2024-12-20
*/
@ApiModel("AI测评记录")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class MbtiRecordDTO extends BaseDTO {
private static final long serialVersionUID = 1L;
private Long userId;
private String liangBiaoId;
@ApiModelProperty("节点")
private Integer node;
private String jsonData;
private String orderId;
@ApiModelProperty("状态(1.待开始、2.待继续、3.已完成)")
private Integer state;
@ApiModelProperty("报告出具状态(1.未出具 2.已出具)")
private Integer reportStatus;
private String content;
private String reportId;
private String name;
private String phone;
}

View File

@@ -1,76 +0,0 @@
package com.newyetai.ai.mbti.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.newyetai.common.validation.Create;
import com.newyetai.common.validation.Update;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.Map;
/**
* AI测评记录
*
* @author guixinman
* @since 1.0.0 2024-12-20
*/
@ApiModel("AI测评记录")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MbtiRecordOperatorDTO implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull(message = "id不能为空",groups = Update.class)
private Long id;
private Long userId;
@NotBlank(message = "liangBiaoId不能为空",groups = {Create.class, Update.class})
private String liangBiaoId;
@NotNull(message = "节点不能为空",groups = {Update.class})
@ApiModelProperty("节点")
private Integer node;
@NotNull(message = "数据不能为空",groups = {Update.class})
private Map<String, String> answers;
private String orderId;
@ApiModelProperty("状态(2.待继续、3.已完成)")
private Integer state;
@ApiModelProperty("报告出具状态(1.未出具 2.已出具)")
private Integer reportStatus;
@Builder.Default
private Boolean submit = Boolean.FALSE;
private String content;
private String reportId;
@NotBlank(message = "name不能为空",groups = {Create.class, Update.class})
private String name;
@NotBlank(message = "phone不能为空",groups = {Create.class, Update.class})
private String phone;
}

View File

@@ -1,74 +0,0 @@
package com.newyetai.ai.mbti.dto;
import com.newyetai.common.dto.PageQueryDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* AI测评记录
*
* @author guixinman
* @since 1.0.0 2024-12-20
*/
@ApiModel("AI测评记录")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class MbtiRecordPageQueryDTO extends PageQueryDTO<MbtiRecordDTO> {
private static final long serialVersionUID = 1L;
private Long id;
private Long userId;
private String liangBiaoId;
@ApiModelProperty("节点")
private Integer node;
private String jsonData;
private String orderId;
@ApiModelProperty("状态(1.待开始、2.待继续、3.已完成)")
private Integer state;
@ApiModelProperty("报告出具状态(1.未出具 2.已出具)")
private Integer reportStatus;
@ApiModelProperty("创建时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeStart;
@ApiModelProperty("创建时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeEnd;
@ApiModelProperty("更新时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeStart;
@ApiModelProperty("更新时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeEnd;
}

View File

@@ -1,74 +0,0 @@
package com.newyetai.ai.mbti.dto;
import com.newyetai.common.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* AI测评记录
*
* @author guixinman
* @since 1.0.0 2024-12-20
*/
@ApiModel("AI测评记录")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class MbtiRecordQueryDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Long userId;
private String liangBiaoId;
@ApiModelProperty("节点")
private Integer node;
private String jsonData;
private String orderId;
@ApiModelProperty("状态(1.待开始、2.待继续、3.已完成)")
private Integer state;
@ApiModelProperty("报告出具状态(1.未出具 2.已出具)")
private Integer reportStatus;
@ApiModelProperty("创建时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeStart;
@ApiModelProperty("创建时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeEnd;
@ApiModelProperty("更新时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeStart;
@ApiModelProperty("更新时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeEnd;
}

View File

@@ -1,63 +0,0 @@
package com.newyetai.ai.mbti.entity;
import lombok.*;
import lombok.experimental.SuperBuilder;
import com.baomidou.mybatisplus.annotation.*;
import com.newyetai.common.entity.BaseEntity;
/**
* AI测评记录
*
* @author guixinman
* @since 1.0.0 2024-12-20
*/
@TableName(value = "ai_mbti_record")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class MbtiRecord extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
*
*/
private Long userId;
/**
*
*/
private String liangBiaoId;
/**
* 节点
*/
private Integer node;
/**
*
*/
private String jsonData;
/**
*
*/
private String orderId;
/**
* 状态(1.待开始、2.待继续、3.已完成)
*/
private Integer state;
/**
* 报告出具状态(1.未出具 2.已出具)
*/
private Integer reportStatus;
private String content;
private String reportId;
private String name;
private String phone;
}

View File

@@ -1,32 +0,0 @@
package com.newyetai.ai.mbti.enums;
/**
* @description: 状态
* @return:
* @author: guixinman
* @param:
*/
public enum MbtiRecordEnum {
TO_BE_CONTINUED(2,"待继续"),
SUCCESS(3,"已完成"),
;
private Integer status;
/**
* 类型描述
*/
private String desc;
MbtiRecordEnum(Integer status, String desc) {
this.status = status;
this.desc = desc;
}
public Integer getStatus() {
return status;
}
public String getDesc() {
return desc;
}
}

View File

@@ -1,33 +0,0 @@
package com.newyetai.ai.mbti.enums;
/**
* @description: 报告出具状态
* @return:
* @author: guixinman
* @param:
*/
public enum MbtiRecordReportStatusEnum {
INIT(1,"未出具"),
SUCCESS(2,"已出具"),
;
private Integer status;
/**
* 类型描述
*/
private String desc;
MbtiRecordReportStatusEnum(Integer status, String desc) {
this.status = status;
this.desc = desc;
}
public Integer getStatus() {
return status;
}
public String getDesc() {
return desc;
}
}

View File

@@ -1,59 +0,0 @@
<?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.newyetai.ai.mbti.dao.MbtiRecordMapper">
<select id="list" resultType="com.newyetai.ai.mbti.dto.MbtiRecordDTO">
SELECT t.*
<include refid="queryFromSql"></include>
</select>
<select id="page" resultType="com.newyetai.ai.mbti.dto.MbtiRecordDTO">
SELECT t.*
<include refid="queryFromSql"></include>
</select>
<sql id="queryFromSql">
FROM
ai_mbti_record t
WHERE t.deleted = 0
<if test='param.id != null'>
AND t.id = #{param.id}
</if>
<if test='param.userId != null'>
AND t.user_id = #{param.userId}
</if>
<if test='param.liangBiaoId != null and param.liangBiaoId.trim() != ""'>
AND t.liang_biao_id = #{param.liangBiaoId}
</if>
<if test='param.node != null'>
AND t.node = #{param.node}
</if>
<if test='param.jsonData != null and param.jsonData.trim() != ""'>
AND t.json_data = #{param.jsonData}
</if>
<if test='param.orderId != null'>
AND t.order_id = #{param.orderId}
</if>
<if test='param.state != null'>
AND t.state = #{param.state}
</if>
<if test='param.reportStatus != null'>
AND t.report_status = #{param.reportStatus}
</if>
<if test='param.createTimeStart != null'>
AND t.create_time &gt;= #{param.createTimeStart}
</if>
<if test='param.createTimeEnd != null'>
AND t.create_time &lt;= #{param.createTimeEnd}
</if>
<if test='param.updateTimeStart != null'>
AND t.update_time &gt;= #{param.updateTimeStart}
</if>
<if test='param.updateTimeEnd != null'>
AND t.update_time &lt;= #{param.updateTimeEnd}
</if>
ORDER BY t.id DESC
</sql>
</mapper>

View File

@@ -1,76 +0,0 @@
package com.newyetai.ai.mbti.service;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import javax.validation.groups.Default;
import java.util.List;
import com.newyetai.ai.mbti.dto.*;
/**
* AI测评记录
*
* @author guixinman
* @since 1.0.0 2024-12-20
*/
@Validated(Default.class)
public interface MbtiRecordService {
/**
* AI测评记录 - 创建
*
* @param operatorDto 操作dto
* @return {@link MbtiRecordDTO}
*/
MbtiRecordDTO create(@Valid MbtiRecordOperatorDTO operatorDto);
/**
* AI测评记录 - 修改
*
* @param operatorDto 操作dto
* @return {@link MbtiRecordDTO}
*/
MbtiRecordDTO modify(@Valid MbtiRecordOperatorDTO operatorDto);
/**
* @description: 出具报告
* @return:
* @author: guixinman
* @param:
*/
void report(Long id);
/**
* AI测评记录 - 删除
*
* @param id id
* @return {@link MbtiRecordDTO}
*/
MbtiRecordDTO delete(Long id);
/**
* AI测评记录 - 根据ID查询单个
*
* @param id id
* @return {@link MbtiRecordDTO}
*/
MbtiRecordDTO findById(Long id);
/**
* AI测评记录 - 列表查询
*
* @param queryDTO 列表查询dto
* @return {@link List}<{@link MbtiRecordDTO}>
*/
List<MbtiRecordDTO> list(MbtiRecordQueryDTO queryDTO);
/**
* AI测评记录 - 分页查询
*
* @param queryDTO 分页查询dto
* @return {@link MbtiRecordDTO}
*/
List<MbtiRecordDTO> page(MbtiRecordPageQueryDTO queryDTO);
}

View File

@@ -1,166 +0,0 @@
package com.newyetai.ai.mbti.service.impl;
import lombok.extern.slf4j.Slf4j;
import com.newyetai.ai.interview.enums.InterviewRecordEnum;
import com.newyetai.ai.interview.enums.InterviewRecordReportStatusEnum;
import com.newyetai.ai.mbti.convert.MbtiRecordConvert;
import com.newyetai.ai.mbti.entity.MbtiRecord;
import com.newyetai.ai.mbti.dto.*;
import com.newyetai.ai.mbti.dao.MbtiRecordMapper;
import com.newyetai.ai.mbti.enums.MbtiRecordEnum;
import com.newyetai.ai.mbti.enums.MbtiRecordReportStatusEnum;
import com.newyetai.ai.mbti.service.MbtiRecordService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.exception.BusinessException;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.sensitive.SensitiveInfoUtils;
import com.newyetai.common.util.JsonUtils;
import com.newyetai.common.util.RandomUtils;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.sdk.mbti.mobel.AnswerReq;
import com.newyetai.sdk.mbti.mobel.AnswerReqDTO;
import com.newyetai.sdk.mbti.mobel.AnswerRes;
import com.newyetai.sdk.mbti.mobel.OrderQueryReq;
import com.newyetai.sdk.mbti.mobel.OrderQueryRes;
import com.newyetai.sdk.mbti.mobel.ReportReq;
import com.newyetai.sdk.mbti.mobel.ReportRes;
import com.newyetai.sdk.mbti.service.MbtiProvider;
import javax.annotation.Resource;
import java.util.*;
/**
* AI测评记录
*
* @author guixinman
* @since 1.0.0 2024-12-20
*/
@Slf4j
@Service
public class MbtiRecordServiceImpl implements MbtiRecordService {
@Resource
private MbtiRecordMapper mbtiRecordMapper;
@Autowired
private MbtiProvider mbtiProvider;
@Override
public MbtiRecordDTO create(MbtiRecordOperatorDTO operatorDto) {
MbtiRecord mbtiRecord = MbtiRecordConvert.INSTANCE.convert(operatorDto);
mbtiRecord.setUserId(UserContextHolder.getExistLoginUserId());
mbtiRecord.setState(MbtiRecordEnum.TO_BE_CONTINUED.getStatus());
mbtiRecord.setReportStatus(MbtiRecordReportStatusEnum.INIT.getStatus());
mbtiRecord.setJsonData(JsonUtils.toJsonString(operatorDto.getAnswers()));
mbtiRecord.setName(operatorDto.getName());
mbtiRecord.setPhone(operatorDto.getPhone());
if (operatorDto.getSubmit()) {
if (Objects.isNull(operatorDto.getAnswers())) {
throw new BusinessException("answers不能为空");
}
AnswerReq answerReq = new AnswerReq();
AnswerReqDTO answerData = AnswerReqDTO.builder()
.Answers(operatorDto.getAnswers())
.test_name(SensitiveInfoUtils.mobilePhone2(operatorDto.getPhone()) + RandomUtils.getRandomString(5))
.test_email(RandomUtils.getRandomString(5))
.build();
answerReq.setLiangbiaoId(operatorDto.getLiangBiaoId());
answerReq.setAnswerData(answerData);
AlitaResult<AnswerRes> answerResAlitaResult = mbtiProvider.http(answerReq);
Assert.isTrue(answerResAlitaResult.getSuccess(),answerResAlitaResult.getMsg());
AnswerRes answerRes = answerResAlitaResult.getData();
mbtiRecord.setOrderId(answerRes.getOrderId());
mbtiRecord.setState(MbtiRecordEnum.SUCCESS.getStatus());
}
mbtiRecordMapper.saveEntity(mbtiRecord);
return MbtiRecordConvert.INSTANCE.convert(mbtiRecord);
}
@Override
public MbtiRecordDTO modify(MbtiRecordOperatorDTO operatorDto) {
MbtiRecordDTO mbtiRecordDto = this.findById(operatorDto.getId());
if (Objects.isNull(mbtiRecordDto)) {
return null;
}
MbtiRecord mbtiRecord = MbtiRecordConvert.INSTANCE.convert(operatorDto);
mbtiRecord.setJsonData(JsonUtils.toJsonString(operatorDto.getAnswers()));
mbtiRecord.setName(operatorDto.getName());
mbtiRecord.setPhone(operatorDto.getPhone());
if (operatorDto.getSubmit()) {
AnswerReq answerReq = new AnswerReq();
answerReq.setLiangbiaoId(operatorDto.getLiangBiaoId());
answerReq.setAnswerData(AnswerReqDTO.builder()
.Answers(operatorDto.getAnswers())
.test_name(SensitiveInfoUtils.mobilePhone2(operatorDto.getPhone()) + RandomUtils.getRandomString(5))
.test_email(RandomUtils.getRandomString(5))
.build());
AlitaResult<AnswerRes> answerResAlitaResult = mbtiProvider.http(answerReq);
Assert.isTrue(answerResAlitaResult.getSuccess(),answerResAlitaResult.getMsg());
AnswerRes answerRes = answerResAlitaResult.getData();
mbtiRecord.setOrderId(answerRes.getOrderId());
mbtiRecord.setState(MbtiRecordEnum.SUCCESS.getStatus());
}
mbtiRecordMapper.updateEntitySelective(mbtiRecord);
return this.findById(operatorDto.getId());
}
@Override
public void report(Long id) {
MbtiRecordDTO mbtiRecordDto = this.findById(id);
if (Objects.isNull(mbtiRecordDto)) {
return;
}
AlitaResult<OrderQueryRes> queryRes = mbtiProvider.http(OrderQueryReq.builder().liangbiaoId(mbtiRecordDto.getLiangBiaoId()).orderId(mbtiRecordDto.getOrderId()).build());
Assert.isTrue(queryRes.getSuccess(),queryRes.getMsg());
AlitaResult<ReportRes> reportRes = mbtiProvider.http(ReportReq.builder().liangbiaoId(mbtiRecordDto.getLiangBiaoId()).reportId(queryRes.getData().getReportId()).build());
Assert.isTrue(reportRes.getSuccess(),reportRes.getMsg());
MbtiRecord mbtiRecord = MbtiRecordConvert.INSTANCE.convert(mbtiRecordDto);
mbtiRecord.setReportId(queryRes.getData().getReportId());
mbtiRecord.setReportStatus(MbtiRecordReportStatusEnum.SUCCESS.getStatus());
mbtiRecord.setContent(reportRes.getData().getContent());
mbtiRecordMapper.updateEntitySelective(mbtiRecord);
}
@Override
public MbtiRecordDTO delete(Long id) {
MbtiRecordDTO mbtiRecordDto = this.findById(id);
if (Objects.isNull(mbtiRecordDto)) {
return null;
}
MbtiRecord mbtiRecord = MbtiRecord.builder().build();
mbtiRecord.setId(id);
mbtiRecordMapper.deleteEntity(mbtiRecord, UserContextHolder.getLoginUserId());
return mbtiRecordDto;
}
@Override
public MbtiRecordDTO findById(Long id) {
MbtiRecord mbtiRecord = mbtiRecordMapper.getById(id);
if (Objects.isNull(mbtiRecord)) {
return null;
}
return MbtiRecordConvert.INSTANCE.convert(mbtiRecord);
}
@Override
public List<MbtiRecordDTO> list(MbtiRecordQueryDTO queryDTO) {
return mbtiRecordMapper.list(queryDTO);
}
@Override
public List<MbtiRecordDTO> page(MbtiRecordPageQueryDTO queryDTO) {
queryDTO.setUserId(UserContextHolder.getExistLoginUserId());
return mbtiRecordMapper.page(queryDTO);
}
}

View File

@@ -1,74 +0,0 @@
package com.newyetai.ai.resume.controller;
import com.newyetai.ai.resume.dto.AiResumeReqDTO;
import com.newyetai.ai.resume.service.AiResumeService;
import com.newyetai.common.AlitaResult;
import com.newyetai.sdk.xf.dto.TtsReqDTO;
import com.newyetai.sdk.xf.util.XfUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
import cn.hutool.json.JSONUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* @description:
* @author: guixinman
* @create: 2024-12-12 10:03
**/
@Api(tags = "AI简历")
@RestController
@RequestMapping("/ai/resume")
public class AiResumeController {
@Autowired
private AiResumeService aiResumeService;
@PostMapping("/create")
@ApiOperation("ai简历-创建")
public AlitaResult<Long> create(@RequestBody @Validated AiResumeReqDTO reqDto) {
aiResumeService.create(reqDto);
return AlitaResult.success();
}
@PostMapping("/iat")
@ApiOperation("ai简历-语音听写")
public AlitaResult<String> iat(@RequestParam("fileCode") String fileCode) {
return AlitaResult.success(XfUtils.iat(fileCode));
}
@PostMapping("/tts")
@ApiOperation("ai简历-语音合成")
public AlitaResult<String> tts(@RequestBody @Validated TtsReqDTO ttsReq) {
return AlitaResult.success(XfUtils.tts(ttsReq));
}
@PostMapping("/analyseResume")
@ApiOperation("分析简历")
public AlitaResult<String> analyseResume(@RequestParam("text") String text) {
return AlitaResult.success(XfUtils.analyseResume(text));
}
@PostMapping("/generateSelfEvaluate")
@ApiOperation("生成自我评价")
public AlitaResult<String> generateSelfEvaluate(@RequestBody Map<String,Object> map) {
return AlitaResult.success(XfUtils.generateSelfEvaluate(JSONUtil.toJsonStr(map)));
}
@PostMapping("/generateWorkExperience")
@ApiOperation("生成工作经历")
public AlitaResult<String> generateWorkExperience(@RequestBody Map<String,Object> map) {
return AlitaResult.success(XfUtils.generateWorkExperience(JSONUtil.toJsonStr(map)));
}
}

View File

@@ -1,43 +0,0 @@
package com.newyetai.ai.resume.dto;
import com.newyetai.common.validation.Create;
import com.newyetai.common.validation.Update;
import java.io.Serializable;
import java.math.BigDecimal;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @description:
* @author: guixinman
* @create: 2024-12-12 10:07
**/
@ApiModel("ai面试记录")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AiResumeReqDTO implements Serializable {
private static final long serialVersionUID = 1L;
@NotBlank(message = "请输入内容")
private String content;
@ApiModelProperty("岗位类型")
private String typeCode;
@ApiModelProperty("期望城市")
private String expectCity;
@ApiModelProperty("期望月薪")
private BigDecimal expectSalary;
}

View File

@@ -1,44 +0,0 @@
package com.newyetai.ai.resume.model;
import java.io.Serializable;
import java.util.List;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @description: Ai生成简历返回model
* @author: guixinman
* @create: 2024-12-12 11:31
**/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AiResumeModel implements Serializable {
private String name;
private String birthday;
@ApiModelProperty("期望工作地")
private String desiredWorkLocation;
@ApiModelProperty("期望最低薪资")
private String desiredSalaryMin;
@ApiModelProperty("期望最高薪资")
private String desiredSalaryMax;
@ApiModelProperty("期望岗位性质")
private String desiredPositionNature;
@ApiModelProperty("期望岗位")
private String desiredPosition;
@ApiModelProperty("最高学历")
private String highestDegree;
@ApiModelProperty("到岗状态")
private String reportStatus;
@ApiModelProperty("自我介绍")
private String selfIntroduction;
// @ApiModelProperty("简历标签")
// private String tags;
}

View File

@@ -1,14 +0,0 @@
package com.newyetai.ai.resume.service;
import com.newyetai.ai.resume.dto.AiResumeReqDTO;
/**
* @description:
* @author: guixinman
* @create: 2024-12-12 10:57
**/
public interface AiResumeService {
void create(AiResumeReqDTO reqDto);
}

View File

@@ -1,99 +0,0 @@
package com.newyetai.ai.resume.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.newyetai.ai.resume.dto.AiResumeReqDTO;
import com.newyetai.ai.resume.model.AiResumeModel;
import com.newyetai.ai.resume.service.AiResumeService;
import com.newyetai.common.constant.CommonConstants;
import com.newyetai.common.exception.BusinessException;
import com.newyetai.common.util.JsonUtils;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.component.dict.util.DictUtils;
import com.newyetai.config.service.ConfigService;
import com.newyetai.recruit.position.dao.PositionTypeMapper;
import com.newyetai.recruit.position.entity.PositionType;
import com.newyetai.recruit.user.dao.JobExpectMapper;
import com.newyetai.recruit.user.dao.ResumeMapper;
import com.newyetai.recruit.user.dto.JobExpectOperateDTO;
import com.newyetai.recruit.user.dto.ResumeDTO;
import com.newyetai.recruit.user.dto.ResumeOperatorDTO;
import com.newyetai.recruit.user.entity.Resume;
import com.newyetai.recruit.user.enums.InductionCycleEnum;
import com.newyetai.recruit.user.service.JobExpectService;
import com.newyetai.recruit.user.service.ResumeService;
import com.newyetai.sdk.xf.util.XfUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;
import java.util.Objects;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
/**
* @description:
* @author: guixinman
* @create: 2024-12-12 10:57
**/
@Slf4j
@Service
public class AiResumeServiceImpl implements AiResumeService {
@Autowired
private ConfigService configService;
@Autowired
private ResumeService resumeService;
@Resource
private ResumeMapper resumeMapper;
@Autowired
private JobExpectService jobExpectService;
@Autowired
private PositionTypeMapper positionTypeMapper;
@Transactional(rollbackFor = Exception.class)
@Override
public void create(AiResumeReqDTO reqDto) {
String errMsg = "抱歉,我无法回答,请告诉我你想找什么样的工作";
try {
String jsonData = XfUtils.generateResume(reqDto.getContent());
if (StringUtils.equalsAny(jsonData, errMsg)) {
throw new BusinessException(jsonData);
}
AiResumeModel aiResumeModel = JsonUtils.toObject(jsonData, AiResumeModel.class);
if (StringUtils.isBlank(aiResumeModel.getDesiredPosition())) {
throw new BusinessException(errMsg);
}
//学历
String education = DictUtils.getNameCodeMap("education").get(StringUtils.isNotBlank(aiResumeModel.getHighestDegree()) ? aiResumeModel.getHighestDegree() : "");
jobExpectService.removeByUserId();
jobExpectService.create(
JobExpectOperateDTO.builder()
.userId(UserContextHolder.getExistLoginUserId())
.typeCode(reqDto.getTypeCode())
.expectCity(reqDto.getExpectCity())
.expectSalary(reqDto.getExpectSalary())
.onDuty(false)
.inductionCycle(InductionCycleEnum.findTypeByDesc(aiResumeModel.getReportStatus()))
.positionName(aiResumeModel.getDesiredPosition())
.build());
} catch (Exception e) {
log.error(e.getMessage());
throw new BusinessException(errMsg);
}
}
}

View File

@@ -1,15 +0,0 @@
package com.newyetai.alitaforward.common.mq.constant;
import com.newyetai.common.constant.CommonConstants;
import com.newyetai.common.constant.SystemCodeEnum;
/**
* mq常量类(routingkey)
* @author sr on 2021-08-09
*/
public interface ForwardMqConstants {
/** 用户中心系统mq前缀 **/
String MQ_PREFIX = SystemCodeEnum.ALITA_FORWARD.getName() + CommonConstants.POINT;
}

View File

@@ -1,31 +0,0 @@
package com.newyetai.alitaforward.verification.constants;
/**
* @author czy
* @date 2021-06-21
*/
public enum FactorVerificationSourceTypeEnum {
FXQ("放心签", 1),
CL("创蓝", 2),
SYS("系统", 3),
ALI("阿里", 4),
;
private final String desc;
private final Integer type;
FactorVerificationSourceTypeEnum(String desc, Integer type) {
this.desc = desc;
this.type = type;
}
public String getDesc() {
return desc;
}
public Integer getType() {
return type;
}
}

View File

@@ -1,33 +0,0 @@
package com.newyetai.alitaforward.verification.constants;
import com.newyetai.alitaforward.common.mq.constant.ForwardMqConstants;
public enum VerificationTypeEnum {
/** 二要素认证 */
TWO("real_name_two_verification"),
/** 银行卡三要素认证 */
THREE("three_verification"),
/** 手机三要素认证 **/
PHONE_THREE("phone_three_verification"),
/** 银行卡四要素认证 **/
FOUR("four_verification");
private String fullname;
VerificationTypeEnum(String fullname){
this.fullname = fullname;
}
public String getFullName() {
return this.fullname;
}
public String getAsyncKey() {
return ForwardMqConstants.MQ_PREFIX + this.fullname ;
}
public String getStatusChangeKey() {
return getAsyncKey() + "_status_update";
}
}

View File

@@ -1,64 +0,0 @@
package com.newyetai.alitaforward.verification.consumer.providers;
import cn.hutool.json.JSONUtil;
import com.newyetai.alitaforward.verification.dto.FourFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.PhoneThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.ThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.factor.PhoneThreeVerify;
import com.newyetai.alitaforward.verification.factor.ThreeVerify;
import com.newyetai.alitaforward.verification.service.FourFactorVerificationProvider;
import com.newyetai.common.constant.AuthStatusEnum;
import com.newyetai.mq.dto.TopicMqMessage;
import com.newyetai.usercenter.user.consumer.FourFactorVerifyStatusUpdateHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class SystemFourFactorVerificationProvider implements FourFactorVerificationProvider {
@Autowired
private FourFactorVerifyStatusUpdateHandler fourFactorVerifyStatusUpdateHandler;
@Override
public void onMessage(TopicMqMessage<FourFactorVerificationDTO> message) {
log.info("系统手机号四要素处理->生成三要素数据 开始,参数:{}", JSONUtil.toJsonStr(message));
FourFactorVerificationDTO verificationDTO = message.getData();
Integer status = verificationDTO.getStatus();
if (!AuthStatusEnum.AUTH_SUCCESS.getType().equals(status)) {
return;
}
fourFactorVerifyStatusUpdateHandler.onMessage(verificationDTO);
try {
ThreeFactorVerificationDTO threeFactorVerificationDTO = ThreeFactorVerificationDTO.builder()
.realName(verificationDTO.getRealName())
.cardNo(verificationDTO.getCardNo())
.bankAccountNo(verificationDTO.getBankAccountNo())
.build();
threeFactorVerificationDTO.setStatus(verificationDTO.getStatus());
threeVerify.autoVerify(threeFactorVerificationDTO);
} catch (Exception e) {
log.info("系统手机号四要素处理->生成三要素数据 异常,", e);
}
try {
PhoneThreeFactorVerificationDTO phoneThreeFactorVerificationDTO = PhoneThreeFactorVerificationDTO.builder()
.realName(verificationDTO.getRealName())
.cardNo(verificationDTO.getCardNo())
.phone(verificationDTO.getPhone())
.build();
phoneThreeFactorVerificationDTO.setStatus(verificationDTO.getStatus());
phoneThreeVerify.autoVerify(phoneThreeFactorVerificationDTO);
} catch (Exception e) {
log.info("系统手机号四要素处理->生成手机三要素数据 异常,", e);
}
}
@Autowired
private PhoneThreeVerify phoneThreeVerify;
@Autowired
private ThreeVerify threeVerify;
}

View File

@@ -1,46 +0,0 @@
package com.newyetai.alitaforward.verification.consumer.providers;
import cn.hutool.json.JSONUtil;
import com.newyetai.alitaforward.verification.dto.PhoneThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.RealNameTwoFactorVerificationDTO;
import com.newyetai.alitaforward.verification.factor.RealNameTwoVerify;
import com.newyetai.alitaforward.verification.service.PhoneThreeFactorVerificationProvider;
import com.newyetai.common.constant.AuthStatusEnum;
import com.newyetai.mq.dto.TopicMqMessage;
import com.newyetai.usercenter.user.consumer.PhoneThreeFactorVerifyStatusUpdateHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class SystemPhoneThreeFactorVerificationProvider implements PhoneThreeFactorVerificationProvider {
@Autowired
private RealNameTwoVerify realNameTwoVerify;
@Autowired
private PhoneThreeFactorVerifyStatusUpdateHandler phoneThreeFactorVerifyStatusUpdateHandler;
@Override
public void onMessage(TopicMqMessage<PhoneThreeFactorVerificationDTO> message) {
log.info("系统手机号三要素成功处理->生成二要素数据 开始,参数:{}", JSONUtil.toJsonStr(message));
PhoneThreeFactorVerificationDTO verificationDTO = message.getData();
Integer status = verificationDTO.getStatus();
if (!AuthStatusEnum.AUTH_SUCCESS.getType().equals(status)) {
return;
}
phoneThreeFactorVerifyStatusUpdateHandler.onMessage(verificationDTO);
try {
RealNameTwoFactorVerificationDTO realNameTwoFactorVerificationDTO = RealNameTwoFactorVerificationDTO.builder()
.realName(verificationDTO.getRealName())
.cardNo(verificationDTO.getCardNo())
.build();
realNameTwoFactorVerificationDTO.setStatus(status);
realNameTwoVerify.autoVerify(realNameTwoFactorVerificationDTO);
} catch (Exception e) {
log.info("系统手机号三要素处理->生成二要素数据 异常,", e);
}
}
}

View File

@@ -1,46 +0,0 @@
package com.newyetai.alitaforward.verification.consumer.providers;
import cn.hutool.json.JSONUtil;
import com.newyetai.alitaforward.verification.dto.RealNameTwoFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.ThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.factor.RealNameTwoVerify;
import com.newyetai.alitaforward.verification.service.ThreeFactorVerificationProvider;
import com.newyetai.common.constant.AuthStatusEnum;
import com.newyetai.mq.dto.TopicMqMessage;
import com.newyetai.usercenter.user.consumer.ThreeFactorVerifyStatusUpdateHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class SystemThreeFactorVerificationProvider implements ThreeFactorVerificationProvider {
@Autowired
private RealNameTwoVerify realNameTwoVerify;
@Autowired
private ThreeFactorVerifyStatusUpdateHandler threeFactorVerifyStatusUpdateHandler;
@Override
public void onMessage(TopicMqMessage<ThreeFactorVerificationDTO> message) {
log.info("系统三要素成功处理->生成二要素数据 开始,参数:{}", JSONUtil.toJsonStr(message));
ThreeFactorVerificationDTO verificationDTO = message.getData();
Integer status = verificationDTO.getStatus();
if (!AuthStatusEnum.AUTH_SUCCESS.getType().equals(status)) {
return;
}
threeFactorVerifyStatusUpdateHandler.onMessage(verificationDTO);
try {
RealNameTwoFactorVerificationDTO realNameTwoFactorVerificationDTO = RealNameTwoFactorVerificationDTO.builder()
.realName(verificationDTO.getRealName())
.cardNo(verificationDTO.getCardNo())
.build();
realNameTwoFactorVerificationDTO.setStatus(verificationDTO.getStatus());
realNameTwoVerify.autoVerify(realNameTwoFactorVerificationDTO);
} catch (Exception e) {
log.info("系统三要素处理->生成二要素数据 异常,", e);
}
}
}

View File

@@ -1,214 +0,0 @@
package com.newyetai.alitaforward.verification.controller;
import com.newyetai.alitaforward.verification.dto.*;
import com.newyetai.alitaforward.verification.factor.FourVerify;
import com.newyetai.alitaforward.verification.factor.PhoneThreeVerify;
import com.newyetai.alitaforward.verification.factor.RealNameTwoVerify;
import com.newyetai.alitaforward.verification.factor.ThreeVerify;
import com.newyetai.alitaforward.verification.service.BankCardVerificationService;
import com.newyetai.common.AlitaResult;
import com.newyetai.tkmybatis.pojo.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @author czy
* @date 2021-06-21
*/
@Api("要素认证")
@RestController
@RequestMapping("factor_verify")
public class FactorVerificationContorller {
@Autowired
private FourVerify fourVerify;
@Autowired
private BankCardVerificationService bankCardVerificationService;
@Autowired
private RealNameTwoVerify realNameTwoVerify;
@Autowired
private ThreeVerify threeVerify;
@Autowired
private PhoneThreeVerify phoneThreeVerify;
@ApiOperation("二要素认证(同步)")
@PostMapping("/real_name/two/sync")
public AlitaResult<RealNameTwoFactorVerificationDTO> syncRealNameTwoAuthenticate(
@Validated @RequestBody RealNameTwoFactorVerificationDTO verificationInfo) {
return AlitaResult.success(realNameTwoVerify.sync(verificationInfo));
}
@ApiOperation("二要素认证(批量、同步)")
@PostMapping("/real_name/two/sync/batch")
public AlitaResult<List<RealNameTwoFactorVerificationDTO>> syncRealNameTwoAuthenticate(
@Validated @RequestBody List<RealNameTwoFactorVerificationDTO> verificationInfoList) {
return AlitaResult.success(realNameTwoVerify.sync(verificationInfoList));
}
@ApiOperation("二要素认证(异步)")
@PostMapping("/real_name/two/async")
public AlitaResult<RealNameTwoFactorVerificationDTO> asyncRealNameTwoAuthenticate(
@Validated @RequestBody RealNameTwoFactorVerificationDTO verificationInfo) {
return AlitaResult.success(realNameTwoVerify.async(verificationInfo));
}
@ApiOperation("二要素认证(批量、异步)")
@PostMapping("/real_name/two/async/batch")
public AlitaResult<List<RealNameTwoFactorVerificationDTO>> asyncRealNameTwoAuthenticate(
@Validated @RequestBody List<RealNameTwoFactorVerificationDTO> verificationInfoList) {
return AlitaResult.success(realNameTwoVerify.async(verificationInfoList));
}
@ApiOperation("手机三要素认证(同步)")
@PostMapping("/phone/three/sync")
public AlitaResult<PhoneThreeFactorVerificationDTO> syncPhoneThreeAuthenticate(
@Validated @RequestBody PhoneThreeFactorVerificationDTO verificationInfo) {
return AlitaResult.success(phoneThreeVerify.sync(verificationInfo));
}
@ApiOperation("手机三要素认证(批量、同步)")
@PostMapping("/phone/three/sync/batch")
public AlitaResult<List<PhoneThreeFactorVerificationDTO>> syncPhoneThreeAuthenticate(
@Validated @RequestBody List<PhoneThreeFactorVerificationDTO> verificationInfoList) {
return AlitaResult.success(phoneThreeVerify.sync(verificationInfoList));
}
@ApiOperation("手机三要素认证(异步)")
@PostMapping("/phone/three/async")
public AlitaResult<PhoneThreeFactorVerificationDTO> asyncPhoneThreeAuthenticate(
@Validated @RequestBody PhoneThreeFactorVerificationDTO verificationInfo) {
return AlitaResult.success(phoneThreeVerify.async(verificationInfo));
}
@ApiOperation("手机三要素认证(批量、异步)")
@PostMapping("/phone/three/async/batch")
public AlitaResult<List<PhoneThreeFactorVerificationDTO>> asyncPhoneThreeAuthenticate(
@Validated @RequestBody List<PhoneThreeFactorVerificationDTO> verificationInfoList) {
return AlitaResult.success(phoneThreeVerify.async(verificationInfoList));
}
@ApiOperation("三要素认证(同步)")
@PostMapping("/three/sync")
public AlitaResult<ThreeFactorVerificationDTO> syncThreeAuthenticate(
@Validated @RequestBody ThreeFactorVerificationDTO verificationInfo) {
return AlitaResult.success(threeVerify.sync(verificationInfo));
}
@ApiOperation("三要素认证(批量、同步)")
@PostMapping("/three/sync/batch")
public AlitaResult<List<ThreeFactorVerificationDTO>> syncThreeAuthenticate(
@Validated @RequestBody List<ThreeFactorVerificationDTO> verificationInfoList) {
return AlitaResult.success(threeVerify.sync(verificationInfoList));
}
@ApiOperation("三要素认证(异步)")
@PostMapping("/three/async")
public AlitaResult<ThreeFactorVerificationDTO> asyncThreeAuthenticate(
@Validated @RequestBody ThreeFactorVerificationDTO verificationInfo) {
return AlitaResult.success(threeVerify.async(verificationInfo));
}
@ApiOperation("三要素认证(批量、异步)")
@PostMapping("/three/async/batch")
public AlitaResult<List<ThreeFactorVerificationDTO>> asyncThreeAuthenticate(
@Validated @RequestBody List<ThreeFactorVerificationDTO> verificationInfoList) {
return AlitaResult.success(threeVerify.async(verificationInfoList));
}
@ApiOperation("获取匹配请求内容的三要素认证数据")
@PostMapping("/match_three/list")
public AlitaResult<List<ThreeFactorVerificationDTO>> queryMatchThreeList(@RequestBody List<FactorVerificationQueryDTO> queryDtoList){
return AlitaResult.success(threeVerify.queryListByData(queryDtoList));
};
@ApiOperation("三要素认证根据id获取")
@PostMapping("/three/find/id")
public AlitaResult<ThreeFactorVerificationDTO> threeFindById(@RequestParam("id") Long id){
return AlitaResult.success(threeVerify.findById(id));
};
@ApiOperation("三要素认证根据查询条件获取列表")
@PostMapping("/three/list")
public AlitaResult<List<ThreeFactorVerificationDTO>> threeList(@RequestBody FactorVerificationQueryDTO query){
query.setNeedPage(Boolean.FALSE);
return AlitaResult.success(threeVerify.list(query));
};
@ApiOperation("三要素认证根据查询条件获取列表(分页)")
@PostMapping("/three/page")
public AlitaResult<Page<ThreeFactorVerificationDTO>> threePage(@RequestBody FactorVerificationQueryDTO query){
threeVerify.list(query);
return AlitaResult.success(query.getPageResult());
};
@ApiOperation("四要素认证(同步)")
@PostMapping("/four/sync")
public AlitaResult<FourFactorVerificationDTO> syncFourAuthenticate(
@Validated @RequestBody FourFactorVerificationDTO verificationInfoList) {
return AlitaResult.success(fourVerify.sync(verificationInfoList));
}
@ApiOperation("四要素认证(批量、同步)")
@PostMapping("/four/sync/batch")
public AlitaResult<List<FourFactorVerificationDTO>> syncFourAuthenticate(
@Validated @RequestBody List<FourFactorVerificationDTO> verificationInfoList) {
return AlitaResult.success(fourVerify.sync(verificationInfoList));
}
@ApiOperation("四要素认证(异步)")
@PostMapping("/four/async")
public AlitaResult<FourFactorVerificationDTO> asyncFourAuthenticate(
@Validated @RequestBody FourFactorVerificationDTO verificationInfoList) {
return AlitaResult.success(fourVerify.async(verificationInfoList));
}
@ApiOperation("四要素认证(批量、异步)")
@PostMapping("/four/async/batch")
public AlitaResult<List<FourFactorVerificationDTO>> asyncFourAuthenticate(
@Validated @RequestBody List<FourFactorVerificationDTO> verificationInfoList) {
return AlitaResult.success(fourVerify.async(verificationInfoList));
}
@ApiOperation("四要素认证根据id获取")
@PostMapping("/four/find/id")
public AlitaResult<FourFactorVerificationDTO> fourFindById(@RequestParam("id") Long id){
return AlitaResult.success(fourVerify.findById(id));
};
@ApiOperation("获取匹配请求内容的四要素认证数据")
@PostMapping("/match_four/list")
public AlitaResult<List<FourFactorVerificationDTO>> queryMatchFourList(@RequestBody List<FactorVerificationQueryDTO> queryDtoList){
return AlitaResult.success(fourVerify.queryListByData(queryDtoList));
};
@ApiOperation("四要素认证根据查询条件获取列表")
@PostMapping("/four/list")
public AlitaResult<List<FourFactorVerificationDTO>> fourList(@RequestBody FactorVerificationQueryDTO query){
query.setNeedPage(Boolean.FALSE);
return AlitaResult.success(fourVerify.list(query));
};
@ApiOperation("四要素认证根据查询条件获取列表(分页)")
@PostMapping("/four/page")
public AlitaResult<Page<FourFactorVerificationDTO>> fourPage(@RequestBody FactorVerificationQueryDTO query){
fourVerify.list(query);
return AlitaResult.success(query.getPageResult());
};
@ApiOperation("白名单管理-->三、四要素查询合并为银行卡查询")
@PostMapping("/bank_card/page")
AlitaResult<List<BankCordVerificationResDTO>> bankCardPage(String cardNo,Integer status){
return AlitaResult.success(bankCardVerificationService.list(cardNo, status));
}
}

View File

@@ -1,36 +0,0 @@
package com.newyetai.alitaforward.verification.dao;
import com.newyetai.alitaforward.verification.dto.BankCordVerificationResDTO;
import com.newyetai.alitaforward.verification.factor.four.entity.BankCardFourVerification;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author fzp
* @date 2021年9月6日13:42:17
*/
public interface BankCardVerificationMapper{
/**
* 白名单管理-->三、四要素查询合并为银行卡查询
* @param cardNo
*/
@Select("select "
+ " t.id,t.card_no,t.real_name,t.bank_account_no,'' as phone,'三要素' as `type`, "
+ " (case t.authentication_source when '1' then '放心签' when '2' then '创蓝' when '3' then '系统' else '' end) as source, "
+ " t.status,t.fail_reason,t.deleted "
+ "from bank_card_three_verification t "
+ "where t.deleted = 0 and t.card_no = #{cardNo} "
+ "union all "
+ "select "
+ " f.id,f.card_no,f.real_name,f.bank_account_no,f.phone,'四要素' as `type`, "
+ " (case f.authentication_source when '1' then '放心签' when '2' then '创蓝' when '3' then '系统' else '' end) as source, "
+ " f.status,f.fail_reason,f.deleted "
+ "from bank_card_four_verification f "
+ "where f.deleted = 0 and f.card_no = #{cardNo} ")
List<BankCordVerificationResDTO> list(@Param("cardNo") String cardNo);
}

View File

@@ -1,47 +0,0 @@
package com.newyetai.alitaforward.verification.dto;
import com.newyetai.common.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @author fzp
* @date 三、四要素合并银行卡查询
*/
@ApiModel("三、四要素合并银行卡查询")
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class BankCordVerificationResDTO extends BaseDTO {
private static final long serialVersionUID = 4820612112161649806L;
@ApiModelProperty("姓名")
private String realName;
@ApiModelProperty("证件号")
private String cardNo;
@ApiModelProperty("银行卡号")
private String bankAccountNo;
@ApiModelProperty("手机号")
private String phone;
@ApiModelProperty("要素类型")
private String type;
@ApiModelProperty("认证来源 1系统,2放心签,3创蓝")
private String source;
@ApiModelProperty("认证状态(1-未认证 2-认证中 3-认证成功 4-认证失败)")
private Integer status;
@ApiModelProperty("失败原因")
private String failReason;
}

View File

@@ -1,37 +0,0 @@
package com.newyetai.alitaforward.verification.dto;
import com.newyetai.common.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* @author czy
* @date 2021-06-17
*/
@ApiModel("要素认证DTO")
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
public class FactorVerificationDTO extends BaseDTO {
private static final long serialVersionUID = 2838128328843902963L;
@ApiModelProperty("认证状态(1-未认证 2-认证中 3-认证成功 4-认证失败)")
private Integer status;
@ApiModelProperty("认证来源")
private Integer authenticationSource;
@ApiModelProperty("调用数据")
private String invokeData;
@ApiModelProperty("失败原因")
private String failReason;
}

View File

@@ -1,47 +0,0 @@
package com.newyetai.alitaforward.verification.dto;
import com.newyetai.common.annotation.trimAndUpper.TrimAndUpper;
import com.newyetai.common.dto.PageQueryDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import java.util.Set;
/**
* @author czy
* @date 2021-07-01
*/
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class FactorVerificationQueryDTO extends PageQueryDTO {
private static final long serialVersionUID = -2357416347060650749L;
private Long id;
private Set<Long> ids;
@ApiModelProperty("姓名")
@TrimAndUpper
private String realName;
@ApiModelProperty("证件号")
@TrimAndUpper
private String cardNo;
@ApiModelProperty("银行卡号")
@TrimAndUpper
private String bankAccountNo;
@ApiModelProperty("手机号")
@TrimAndUpper
private String phone;
@ApiModelProperty("认证状态(1-未认证 2-认证中 3-认证成功 4-认证失败)")
private Integer status;
}

View File

@@ -1,45 +0,0 @@
package com.newyetai.alitaforward.verification.dto;
import com.newyetai.common.annotation.trimAndUpper.TrimAndUpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
/**
* @author czy
* @date 2021-06-17
*/
@ApiModel("四要素认证DTO")
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class FourFactorVerificationDTO extends FactorVerificationDTO {
private static final long serialVersionUID = -5514764157174505641L;
@ApiModelProperty("姓名")
@NotBlank(message = "姓名不能为空")
@TrimAndUpper
private String realName;
@ApiModelProperty("证件号")
@NotBlank(message = "证件号不能为空")
@TrimAndUpper
private String cardNo;
@ApiModelProperty("银行卡号")
@NotBlank(message = "银行卡号不能为空")
@TrimAndUpper
private String bankAccountNo;
@ApiModelProperty("手机号")
@NotBlank(message = "手机号不能为空")
@TrimAndUpper
private String phone;
}

View File

@@ -1,40 +0,0 @@
package com.newyetai.alitaforward.verification.dto;
import com.newyetai.common.annotation.trimAndUpper.TrimAndUpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.SuperBuilder;
import javax.validation.constraints.NotBlank;
/**
* @author czy
* @date 2021-06-17
*/
@EqualsAndHashCode(callSuper = true)
@ApiModel("手机号三要素认证DTO")
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
public class PhoneThreeFactorVerificationDTO extends FactorVerificationDTO {
private static final long serialVersionUID = 1594482919800883278L;
@ApiModelProperty("姓名")
@NotBlank(message = "姓名不能为空")
@TrimAndUpper
private String realName;
@ApiModelProperty("证件号")
@NotBlank(message = "证件号不能为空")
@TrimAndUpper
private String cardNo;
@ApiModelProperty("手机号")
@NotBlank(message = "手机号不能为空")
@TrimAndUpper
private String phone;
}

View File

@@ -1,35 +0,0 @@
package com.newyetai.alitaforward.verification.dto;
import com.newyetai.common.annotation.trimAndUpper.TrimAndUpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.SuperBuilder;
import javax.validation.constraints.NotBlank;
/**
* 二要素认证DTO
*
* @author Administrator
* @date 2022/07/22
*/
@ApiModel("二要素认证DTO")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class RealNameTwoFactorVerificationDTO extends FactorVerificationDTO {
private static final long serialVersionUID = -2114148883543603016L;
@ApiModelProperty("姓名")
@NotBlank(message = "姓名不能为空")
@TrimAndUpper
private String realName;
@ApiModelProperty("证件号")
@NotBlank(message = "证件号不能为空")
@TrimAndUpper
private String cardNo;
}

View File

@@ -1,39 +0,0 @@
package com.newyetai.alitaforward.verification.dto;
import com.newyetai.common.annotation.trimAndUpper.TrimAndUpper;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.SuperBuilder;
import javax.validation.constraints.NotBlank;
/**
* @author czy
* @date 2021-06-17
*/
@ApiModel("三要素认证DTO")
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
@EqualsAndHashCode(callSuper = true)
public class ThreeFactorVerificationDTO extends FactorVerificationDTO {
private static final long serialVersionUID = 656164023756231640L;
@ApiModelProperty("姓名")
@NotBlank(message = "姓名不能为空")
@TrimAndUpper
private String realName;
@ApiModelProperty("证件号")
@NotBlank(message = "证件号不能为空")
@TrimAndUpper
private String cardNo;
@ApiModelProperty("银行卡号")
@NotBlank(message = "银行卡号不能为空")
@TrimAndUpper
private String bankAccountNo;
}

View File

@@ -1,233 +0,0 @@
package com.newyetai.alitaforward.verification.factor;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.aop.framework.AopContext;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.newyetai.alitaforward.verification.constants.FactorVerificationSourceTypeEnum;
import com.newyetai.alitaforward.verification.dto.FactorVerificationDTO;
import com.newyetai.alitaforward.verification.source.FactorVerificationSourceService;
import com.newyetai.common.constant.AuthStatusEnum;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.EnvironmentUtils;
import com.newyetai.common.util.JsonUtils;
import com.newyetai.frame.redis.dto.LockDTO;
import com.newyetai.frame.redis.redisson.RedissonUtils;
import com.newyetai.mq.consumer.handler.ITopicMqHandler;
import com.newyetai.mq.dto.TopicMqMessage;
import com.newyetai.mq.util.MqSendUtils;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
/**
* 要素校验顶层接口
*
* @author cheny
* @date 2022/08/11
*/
@Slf4j
@Component
@SuppressWarnings("rawtypes,unchecked")
public abstract class AbstractVerify<T extends FactorVerificationDTO> implements IVerify<T>, ITopicMqHandler<T>{
static final Map<Integer, FactorVerificationSourceService> SOURCE_SERVICE_MAP = Maps.newConcurrentMap();
/**
* 终态通知key
* @return
* @author sr on 2023-11-27
*/
final String statusChangeRoutingKey() {
return getType().getStatusChangeKey();
}
@Override
public final String getRoutingKey() {
return getType().getAsyncKey();
}
@Override
public final void onMessage(TopicMqMessage<T> message) {
T verificationDTO = message.getData();
log.info("【MQ】异步处理认证开始,参数:{}", JsonUtils.toJsonString(verificationDTO));
if (verificationDTO == null) {
return;
}
try {
T sync = this.sync(verificationDTO);
log.info("【MQ】异步处理认证结束,参数:{}", JsonUtils.toJsonString(sync));
} catch (Exception e) {
log.info("【MQ】异步处理认证异常", e);
}
}
// 幂等创建
abstract T createAndGet(T t);
/**
* 得到锁
*
* @param t t
* @return {@link LockDTO}
*/
abstract LockDTO getLock(T t);
// 上一级认证创建
abstract void autoVerify(T t);
/**
* 同步校验前置hook
*
* @param t t
* @return {@link T}
*/
protected T syncBeforeVerify(T t) {
// 认证源根据配置文件不同调用不同SDK 1放心签、2创蓝
String source = EnvironmentUtils.getProperty("alita.authenticationSource");
int authenticationSource = FactorVerificationSourceTypeEnum.CL.getType();
try {
authenticationSource = Integer.parseInt(source);
} catch (NumberFormatException e) {
//doNothing
}
t.setAuthenticationSource(authenticationSource);
return t;
}
/**
* 真正执行校验逻辑的方法
*
* @param verifyDto 验证dto
* @return {@link T}
*/
@Transactional(propagation = Propagation.REQUIRES_NEW)
public T doSyncVerify(T verifyDto) {
String failReason = verifyDto.getFailReason();
//如果校验失败了 直接返回
if (StringUtils.isNotEmpty(failReason)) {
return verifyDto;
}
//拿锁
LockDTO lockDTO = getLock(verifyDto);
try {
Assert.isTrue(RedissonUtils.tryLock(lockDTO), "要素认证正在处理中,请稍后再试");
T preVerifyDto = createAndGet(verifyDto);
//如果不是待认证的数直接返回
if (!AuthStatusEnum.NOT_AUTH.getType().equals(preVerifyDto.getStatus())) {
return preVerifyDto;
}
return realVerification(preVerifyDto);
} finally {
RedissonUtils.unlock(lockDTO);
}
}
abstract T realVerification(T verificationDTO);
T syncVerifyWrapper(T t) {
T beforeVerify = syncBeforeVerify(t);
T doVerify = (T) ((AbstractVerify) AopContext.currentProxy()).doSyncVerify(beforeVerify);
Integer status = doVerify.getStatus();
//如果执行到了终态 发送消息通知
if (AuthStatusEnum.AUTH_FAIL.getType().equals(status)
|| AuthStatusEnum.AUTH_SUCCESS.getType().equals(status)) {
log.info("【MQ】通知认证状态变更,参数:{}", JSONUtil.toJsonStr(doVerify));
MqSendUtils.send(statusChangeRoutingKey(), doVerify);
}
return doVerify;
}
/**
* 同步校验
*
* @param list 列表
* @return {@link List}<{@link T}>
*/
@Override
public List<T> sync(List<T> list) {
if (CollectionUtils.isEmpty(list)) {
return Lists.newArrayList();
}
return list.stream().map(this::syncVerifyWrapper).collect(Collectors.toList());
}
// -------------------------------------------------------- async -------------------------------------------------------
/**
* 异步校验前置hook
*
* @param t t
* @return {@link T}
*/
protected T asyncBeforeVerify(T t) {
return syncBeforeVerify(t);
}
/**
* 真正执行校验逻辑的方法
*
* @param verifyDto 验证dto
* @return {@link T}
*/
protected T doAsyncVerify(T verifyDto) {
String failReason = verifyDto.getFailReason();
//如果校验失败了 直接返回
if (StringUtils.isNotEmpty(failReason)) {
return verifyDto;
}
//拿锁
LockDTO lockDTO = getLock(verifyDto);
try {
Assert.isTrue(RedissonUtils.tryLock(lockDTO), "要素认证正在处理中,请稍后再试");
T preVerifyDto = createAndGet(verifyDto);
//如果不是待认证的数直接返回
if (AuthStatusEnum.NOT_AUTH.getType().equals(preVerifyDto.getStatus())) {
//mq异步处理认证
log.info("async【MQ】要素认证异步处理,参数:{}", JSONUtil.toJsonStr(preVerifyDto));
MqSendUtils.send(getRoutingKey(), preVerifyDto);
}
return preVerifyDto;
} finally {
RedissonUtils.unlock(lockDTO);
}
}
T asyncVerifyWrapper(T t) {
T beforeVerify = asyncBeforeVerify(t);
T doVerify = doAsyncVerify(beforeVerify);
Integer status = doVerify.getStatus();
//如果执行到了终态 发送消息通知
if (AuthStatusEnum.AUTH_FAIL.getType().equals(status)
|| AuthStatusEnum.AUTH_SUCCESS.getType().equals(status)) {
log.info("【MQ】通知认证状态变更,参数:{}", JSONUtil.toJsonStr(doVerify));
MqSendUtils.send(statusChangeRoutingKey(), doVerify);
}
return doVerify;
}
@Override
public List<T> async(List<T> list) {
if (CollectionUtils.isEmpty(list)) {
return Lists.newArrayList();
}
return list.stream().map(this::asyncVerifyWrapper).collect(Collectors.toList());
}
}

View File

@@ -1,176 +0,0 @@
package com.newyetai.alitaforward.verification.factor;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.StringJoiner;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import com.google.common.collect.Lists;
import com.newyetai.alitaforward.verification.constants.FactorVerificationSourceTypeEnum;
import com.newyetai.alitaforward.verification.constants.VerificationTypeEnum;
import com.newyetai.alitaforward.verification.dto.FactorVerificationQueryDTO;
import com.newyetai.alitaforward.verification.dto.FourFactorVerificationDTO;
import com.newyetai.alitaforward.verification.factor.four.dao.FourVerificationMapper;
import com.newyetai.alitaforward.verification.factor.four.entity.BankCardFourVerification;
import com.newyetai.alitaforward.verification.factor.four.mapstruct.FourVerificationMapMapper;
import com.newyetai.common.constant.AuthStatusEnum;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.common.validation.util.ValidateUtils;
import com.newyetai.frame.redis.aop.annotation.AutoUnLock;
import com.newyetai.frame.redis.dto.LockDTO;
import com.newyetai.frame.redis.redisson.RedissonUtils;
import com.newyetai.mq.util.MqSendUtils;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
public class FourVerify extends AbstractVerify<FourFactorVerificationDTO> implements IQueryVerify<FourFactorVerificationDTO> {
@Resource
private FourVerificationMapper fourVerificationMapper;
@Override
protected FourFactorVerificationDTO syncBeforeVerify(FourFactorVerificationDTO verificationDTO) {
StringJoiner stringJoiner = new StringJoiner("、");
if (!ValidateUtils.checkRealName(verificationDTO.getRealName())) {
stringJoiner.add("姓名格式有误");
}
if (!ValidateUtils.isIdCard(verificationDTO.getCardNo())) {
stringJoiner.add("证件号格式有误");
}
if (StringUtils.isBlank(verificationDTO.getBankAccountNo())) {
stringJoiner.add("银行卡号为空");
}
if (StringUtils.isBlank(verificationDTO.getPhone())) {
stringJoiner.add("手机号为空");
}
String failReason = stringJoiner.toString();
if (StringUtils.isNotBlank(failReason)) {
verificationDTO.setFailReason(failReason);
} else {
//校验成功调用
super.syncBeforeVerify(verificationDTO);
}
return verificationDTO;
}
@Override
FourFactorVerificationDTO createAndGet(FourFactorVerificationDTO verificationDTO) {
BankCardFourVerification bankCardFourVerification = fourVerificationMapper.selectInfo(verificationDTO);
if (bankCardFourVerification == null) {
//认证库不存在,以默认状态入库——"未认证"
verificationDTO.setStatus(AuthStatusEnum.NOT_AUTH.getType());
bankCardFourVerification = FourVerificationMapMapper.INSTANCE.toEntity(verificationDTO);
fourVerificationMapper.saveEntity(bankCardFourVerification);
}
return FourVerificationMapMapper.INSTANCE.toDto(bankCardFourVerification);
}
@Override
LockDTO getLock(FourFactorVerificationDTO verificationDTO) {
return LockDTO.builder().methodName("verify:four").tryLockWaitTime(0L)
.arg(verificationDTO.getRealName())
.arg(verificationDTO.getCardNo())
.arg(verificationDTO.getBankAccountNo())
.arg(verificationDTO.getPhone())
.build();
}
@Override
@AutoUnLock
public void autoVerify(FourFactorVerificationDTO verificationDTO) {
//拿锁
LockDTO lockDTO = getLock(verificationDTO);
Assert.isTrue(RedissonUtils.tryLockAutomatically(lockDTO), "请勿重复校验四要素");
BankCardFourVerification verificationEntity = fourVerificationMapper.selectInfo(verificationDTO);
if (Objects.nonNull(verificationEntity)) {
if (AuthStatusEnum.AUTH_SUCCESS.getType().equals(verificationEntity.getStatus())) {
return;
}
verificationEntity.setAuthenticationSource(FactorVerificationSourceTypeEnum.SYS.getType());
verificationEntity.setStatus(AuthStatusEnum.AUTH_SUCCESS.getType());
fourVerificationMapper.updateEntitySelective(verificationEntity,
UserContextHolder.getLoginUserId());
} else {
verificationEntity =
BankCardFourVerification.builder()
.realName(verificationDTO.getRealName())
.cardNo(verificationDTO.getCardNo())
.phone(verificationDTO.getPhone())
.bankAccountNo(verificationDTO.getBankAccountNo())
.authenticationSource(FactorVerificationSourceTypeEnum.SYS.getType())
.status(AuthStatusEnum.AUTH_SUCCESS.getType())
.build();
fourVerificationMapper.saveEntity(verificationEntity);
}
log.info("【MQ】通知认证状态变更,参数:{}", JSONUtil.toJsonStr(verificationDTO));
MqSendUtils.send(statusChangeRoutingKey(), verificationDTO);
}
@Override
public List<FourFactorVerificationDTO> list(FactorVerificationQueryDTO queryDTO) {
return fourVerificationMapper.list(queryDTO);
}
@Override
public List<FourFactorVerificationDTO> queryListByData(List<FactorVerificationQueryDTO> queryDTOList) {
List<FourFactorVerificationDTO> resultList = Lists
.newArrayListWithCapacity(queryDTOList.size());
if (CollectionUtils.isEmpty(queryDTOList)) {
return resultList;
}
List<FourFactorVerificationDTO> bankCardThreeVerifications = fourVerificationMapper
.findFinishStatusData();
Map<String, FourFactorVerificationDTO> threeVerificationMap = bankCardThreeVerifications
.stream().collect(
Collectors.toMap(k -> k.getRealName() + k.getCardNo() + k.getBankAccountNo() + k.getPhone(), v -> v, (v1, v2) -> v1));
for (FactorVerificationQueryDTO queryDTO : queryDTOList) {
FourFactorVerificationDTO FourFactorVerificationDTO = threeVerificationMap
.get(queryDTO.getRealName() + queryDTO.getCardNo() + queryDTO.getBankAccountNo() + queryDTO
.getPhone());
if (FourFactorVerificationDTO != null) {
resultList.add(FourFactorVerificationDTO);
}
}
return resultList;
}
@Override
public FourFactorVerificationDTO findById(Long id) {
FourFactorVerificationDTO fourFactorVerificationDTO = null;
BankCardFourVerification entity = fourVerificationMapper.getById(id);
if (entity != null) {
fourFactorVerificationDTO = FourVerificationMapMapper.INSTANCE.toDto(entity);
}
return fourFactorVerificationDTO;
}
@Override
FourFactorVerificationDTO realVerification(FourFactorVerificationDTO verificationDTO) {
Integer authenticationSource = verificationDTO.getAuthenticationSource();
SOURCE_SERVICE_MAP.get(authenticationSource).fourVerify(verificationDTO);
//更新状态
BankCardFourVerification entity = FourVerificationMapMapper.INSTANCE
.toEntity(verificationDTO);
fourVerificationMapper.updateEntitySelective(entity, UserContextHolder.getLoginUserId());
return verificationDTO;
}
@Override
public VerificationTypeEnum getType() {
return VerificationTypeEnum.FOUR;
}
}

View File

@@ -1,42 +0,0 @@
package com.newyetai.alitaforward.verification.factor;
import com.newyetai.alitaforward.verification.dto.FactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.FactorVerificationQueryDTO;
import java.util.List;
/**
* 要素查询顶层接口
*
* @author cheny
* @date 2022/08/11
*/
public interface IQueryVerify<T extends FactorVerificationDTO> {
/**
* 根据参数查list
*
* @param queryDTO 查询DTO
* @return {@link List}<{@link T}>
*/
List<T> list(FactorVerificationQueryDTO queryDTO);
/**
* 根据传来的数据,查出认证库中存在的数据
*
* @param queryDTOList 查询DTO集合
* @return {@link List}<{@link T}>
*/
List<T> queryListByData(List<FactorVerificationQueryDTO> queryDTOList);
/**
* 根据id获取
*
* @param id id
* @return {@link T}
*/
T findById(Long id);
}

View File

@@ -1,48 +0,0 @@
package com.newyetai.alitaforward.verification.factor;
import java.util.ArrayList;
import java.util.List;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.newyetai.alitaforward.verification.constants.VerificationTypeEnum;
/**
* 要素校验顶层接口
*
* @author cheny
* @date 2022/08/11
*/
public interface IVerify<T> {
/**
* 同步校验
*
* @param list 列表
* @return {@link List}<{@link T}>
*/
List<T> sync(List<T> list);
/**
* 异步校验
*
* @param list 列表
* @return {@link List}<{@link T}>
*/
List<T> async(List<T> list);
default T sync(T t) {
List<T> syncSingle = new ArrayList<>(1);
syncSingle.add(t);
return sync(syncSingle).get(0);
}
default T async(T t) {
List<T> asyncSingle = new ArrayList<>(1);
asyncSingle.add(t);
return async(asyncSingle).get(0);
}
VerificationTypeEnum getType();
}

View File

@@ -1,170 +0,0 @@
package com.newyetai.alitaforward.verification.factor;
import cn.hutool.json.JSONUtil;
import com.google.common.collect.Lists;
import com.newyetai.alitaforward.common.mq.constant.ForwardMqConstants;
import com.newyetai.alitaforward.verification.constants.FactorVerificationSourceTypeEnum;
import com.newyetai.alitaforward.verification.constants.VerificationTypeEnum;
import com.newyetai.alitaforward.verification.dto.FactorVerificationQueryDTO;
import com.newyetai.alitaforward.verification.dto.PhoneThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.factor.phoneThree.dao.PhoneThreeVerificationMapper;
import com.newyetai.alitaforward.verification.factor.phoneThree.entity.PhoneThreeVerification;
import com.newyetai.alitaforward.verification.factor.phoneThree.mapstruct.PhoneThreeVerificationMapMapper;
import com.newyetai.common.constant.AuthStatusEnum;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.common.validation.util.ValidateUtils;
import com.newyetai.frame.redis.aop.annotation.AutoUnLock;
import com.newyetai.frame.redis.dto.LockDTO;
import com.newyetai.frame.redis.redisson.RedissonUtils;
import com.newyetai.mq.util.MqSendUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.StringJoiner;
import java.util.stream.Collectors;
@Slf4j
@Component
public class PhoneThreeVerify extends AbstractVerify<PhoneThreeFactorVerificationDTO> implements IQueryVerify<PhoneThreeFactorVerificationDTO> {
@Resource
private PhoneThreeVerificationMapper phoneThreeVerificationMapper;
@Override
protected PhoneThreeFactorVerificationDTO syncBeforeVerify(PhoneThreeFactorVerificationDTO verificationDTO) {
StringJoiner stringJoiner = new StringJoiner("、");
if (!ValidateUtils.checkRealName(verificationDTO.getRealName())) {
stringJoiner.add("姓名格式有误");
}
if (!ValidateUtils.isIdCard(verificationDTO.getCardNo())) {
stringJoiner.add("证件号格式有误");
}
if (StringUtils.isBlank(verificationDTO.getPhone())) {
stringJoiner.add("手机号为空");
}
String failReason = stringJoiner.toString();
if (StringUtils.isNotBlank(failReason)) {
verificationDTO.setFailReason(failReason);
} else {
//校验成功调用
super.syncBeforeVerify(verificationDTO);
}
return verificationDTO;
}
@Override
PhoneThreeFactorVerificationDTO createAndGet(PhoneThreeFactorVerificationDTO verificationDTO) {
PhoneThreeVerification entity = phoneThreeVerificationMapper.find(verificationDTO);
if (entity == null) {
//认证库不存在,以默认状态入库——"未认证"
verificationDTO.setStatus(AuthStatusEnum.NOT_AUTH.getType());
entity = PhoneThreeVerificationMapMapper.INSTANCE.exchange(verificationDTO);
phoneThreeVerificationMapper.saveEntity(entity);
}
return PhoneThreeVerificationMapMapper.INSTANCE.exchange(entity);
}
@Override
LockDTO getLock(PhoneThreeFactorVerificationDTO verificationDTO) {
return LockDTO.builder()
.methodName("verify:three:phone")
.tryLockWaitTime(0L)
.arg(verificationDTO.getRealName())
.arg(verificationDTO.getCardNo())
.arg(verificationDTO.getPhone())
.build();
}
@Override
@AutoUnLock
public void autoVerify(PhoneThreeFactorVerificationDTO verificationDTO) {
//拿锁
LockDTO lockDTO = getLock(verificationDTO);
Assert.isTrue(RedissonUtils.tryLockAutomatically(lockDTO), "请勿重复校验手机三要素");
PhoneThreeVerification verificationEntity = phoneThreeVerificationMapper.find(verificationDTO);
if (Objects.nonNull(verificationEntity)) {
if (!AuthStatusEnum.NOT_AUTH.getType().equals(verificationEntity.getStatus())) {
return;
}
verificationEntity.setAuthenticationSource(FactorVerificationSourceTypeEnum.SYS.getType());
verificationEntity.setStatus(verificationDTO.getStatus());
phoneThreeVerificationMapper.updateEntitySelective(verificationEntity,
UserContextHolder.getLoginUserId());
} else {
verificationEntity =
PhoneThreeVerification.builder()
.realName(verificationDTO.getRealName())
.cardNo(verificationDTO.getCardNo())
.phone(verificationDTO.getPhone())
.authenticationSource(FactorVerificationSourceTypeEnum.SYS.getType())
.status(verificationDTO.getStatus())
.build();
phoneThreeVerificationMapper.saveEntity(verificationEntity);
}
log.info("【MQ】通知认证状态变更,参数:{}", JSONUtil.toJsonStr(verificationDTO));
MqSendUtils.send(statusChangeRoutingKey(), verificationDTO);
}
@Override
public List<PhoneThreeFactorVerificationDTO> list(FactorVerificationQueryDTO queryDTO) {
return phoneThreeVerificationMapper.list(queryDTO);
}
@Override
public List<PhoneThreeFactorVerificationDTO> queryListByData(List<FactorVerificationQueryDTO> queryDTOList) {
List<PhoneThreeFactorVerificationDTO> resultList = Lists
.newArrayListWithCapacity(queryDTOList.size());
if (CollectionUtils.isEmpty(queryDTOList)) {
return resultList;
}
List<PhoneThreeFactorVerificationDTO> bankCardThreeVerifications = phoneThreeVerificationMapper
.findFinishStatusData();
Map<String, PhoneThreeFactorVerificationDTO> threeVerificationMap = bankCardThreeVerifications
.stream().collect(
Collectors.toMap(k -> k.getRealName() + k.getCardNo() + k.getPhone(), v -> v, (v1, v2) -> v1));
for (FactorVerificationQueryDTO queryDTO : queryDTOList) {
PhoneThreeFactorVerificationDTO PhoneThreeFactorVerificationDTO = threeVerificationMap
.get(queryDTO.getRealName() + queryDTO.getCardNo() + queryDTO.getPhone());
if (PhoneThreeFactorVerificationDTO != null) {
resultList.add(PhoneThreeFactorVerificationDTO);
}
}
return resultList;
}
@Override
public PhoneThreeFactorVerificationDTO findById(Long id) {
PhoneThreeFactorVerificationDTO threeFactorVerificationDTO = null;
PhoneThreeVerification entity = phoneThreeVerificationMapper.getById(id);
if (entity != null) {
threeFactorVerificationDTO = PhoneThreeVerificationMapMapper.INSTANCE.exchange(entity);
}
return threeFactorVerificationDTO;
}
@Override
PhoneThreeFactorVerificationDTO realVerification(
PhoneThreeFactorVerificationDTO verificationDTO) {
Integer authenticationSource = verificationDTO.getAuthenticationSource();
SOURCE_SERVICE_MAP.get(authenticationSource).phoneThreeVerify(verificationDTO);
//更新状态
PhoneThreeVerification entity = PhoneThreeVerificationMapMapper.INSTANCE.exchange(verificationDTO);
phoneThreeVerificationMapper.updateEntitySelective(entity, UserContextHolder.getLoginUserId());
return verificationDTO;
}
@Override
public VerificationTypeEnum getType() {
return VerificationTypeEnum.PHONE_THREE;
}
}

View File

@@ -1,165 +0,0 @@
package com.newyetai.alitaforward.verification.factor;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.StringJoiner;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import com.google.common.collect.Lists;
import com.newyetai.alitaforward.verification.constants.FactorVerificationSourceTypeEnum;
import com.newyetai.alitaforward.verification.constants.VerificationTypeEnum;
import com.newyetai.alitaforward.verification.dto.FactorVerificationQueryDTO;
import com.newyetai.alitaforward.verification.dto.RealNameTwoFactorVerificationDTO;
import com.newyetai.alitaforward.verification.factor.two.convert.RealNameTwoVerificationConvert;
import com.newyetai.alitaforward.verification.factor.two.dao.RealNameTwoVerificationMapper;
import com.newyetai.alitaforward.verification.factor.two.entity.RealNameTwoVerification;
import com.newyetai.common.constant.AuthStatusEnum;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.common.validation.util.ValidateUtils;
import com.newyetai.frame.redis.aop.annotation.AutoUnLock;
import com.newyetai.frame.redis.dto.LockDTO;
import com.newyetai.frame.redis.redisson.RedissonUtils;
import com.newyetai.mq.util.MqSendUtils;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
public class RealNameTwoVerify extends AbstractVerify<RealNameTwoFactorVerificationDTO> implements IQueryVerify<RealNameTwoFactorVerificationDTO> {
@Resource
private RealNameTwoVerificationMapper realNameTwoVerificationMapper;
@Override
protected RealNameTwoFactorVerificationDTO syncBeforeVerify(RealNameTwoFactorVerificationDTO verificationDTO) {
StringJoiner stringJoiner = new StringJoiner("、");
if (!ValidateUtils.checkRealName(verificationDTO.getRealName())) {
stringJoiner.add("姓名格式有误");
}
if (!ValidateUtils.isIdCard(verificationDTO.getCardNo())) {
stringJoiner.add("证件号格式有误");
}
String failReason = stringJoiner.toString();
if (StringUtils.isNotBlank(failReason)) {
verificationDTO.setFailReason(failReason);
} else {
//校验成功调用
super.syncBeforeVerify(verificationDTO);
}
return verificationDTO;
}
@Override
RealNameTwoFactorVerificationDTO createAndGet(RealNameTwoFactorVerificationDTO verificationDTO) {
RealNameTwoVerification entity = realNameTwoVerificationMapper.selectInfo(verificationDTO);
if (entity == null) {
//认证库不存在,以默认状态入库——"未认证"
verificationDTO.setStatus(AuthStatusEnum.NOT_AUTH.getType());
entity = RealNameTwoVerificationConvert.INSTANCE.convert(verificationDTO);
realNameTwoVerificationMapper.saveEntity(entity);
}
return RealNameTwoVerificationConvert.INSTANCE.convertDTO(entity);
}
@Override
LockDTO getLock(RealNameTwoFactorVerificationDTO verificationDTO) {
return LockDTO.builder()
.methodName("verify:real_name:two")
.tryLockWaitTime(0L)
.arg(verificationDTO.getRealName())
.arg(verificationDTO.getCardNo())
.build();
}
@Override
@AutoUnLock
public void autoVerify(RealNameTwoFactorVerificationDTO verificationDTO) {
//拿锁
LockDTO lockDTO = getLock(verificationDTO);
Assert.isTrue(RedissonUtils.tryLockAutomatically(lockDTO), "请勿重复校验二要素");
RealNameTwoVerification realNameTwoVerification = realNameTwoVerificationMapper.selectInfo(verificationDTO);
if (Objects.nonNull(realNameTwoVerification)) {
if (!AuthStatusEnum.NOT_AUTH.getType().equals(realNameTwoVerification.getStatus())) {
return;
}
realNameTwoVerification.setAuthenticationSource(FactorVerificationSourceTypeEnum.SYS.getType());
realNameTwoVerification.setStatus(verificationDTO.getStatus());
realNameTwoVerificationMapper.updateEntitySelective(realNameTwoVerification,
UserContextHolder.getLoginUserId());
} else {
realNameTwoVerification =
RealNameTwoVerification.builder()
.realName(verificationDTO.getRealName())
.cardNo(verificationDTO.getCardNo())
.authenticationSource(FactorVerificationSourceTypeEnum.SYS.getType())
.status(verificationDTO.getStatus())
.build();
realNameTwoVerificationMapper.saveEntity(realNameTwoVerification);
}
log.info("【MQ】通知认证状态变更,参数:{}", JSONUtil.toJsonStr(verificationDTO));
MqSendUtils.send(statusChangeRoutingKey(), verificationDTO);
}
@Override
public List<RealNameTwoFactorVerificationDTO> list(FactorVerificationQueryDTO queryDTO) {
return realNameTwoVerificationMapper.list(queryDTO);
}
@Override
public List<RealNameTwoFactorVerificationDTO> queryListByData(List<FactorVerificationQueryDTO> queryDTOList) {
List<RealNameTwoFactorVerificationDTO> resultList = Lists
.newArrayListWithCapacity(queryDTOList.size());
if (CollectionUtils.isEmpty(queryDTOList)) {
return resultList;
}
List<RealNameTwoFactorVerificationDTO> bankCardThreeVerifications = realNameTwoVerificationMapper
.findFinishStatusData();
Map<String, RealNameTwoFactorVerificationDTO> threeVerificationMap = bankCardThreeVerifications
.stream().collect(
Collectors.toMap(k -> k.getRealName() + k.getCardNo(), v -> v, (v1, v2) -> v1));
for (FactorVerificationQueryDTO queryDTO : queryDTOList) {
RealNameTwoFactorVerificationDTO RealNameTwoFactorVerificationDTO = threeVerificationMap
.get(queryDTO.getRealName() + queryDTO.getCardNo());
if (RealNameTwoFactorVerificationDTO != null) {
resultList.add(RealNameTwoFactorVerificationDTO);
}
}
return resultList;
}
@Override
public RealNameTwoFactorVerificationDTO findById(Long id) {
RealNameTwoFactorVerificationDTO threeFactorVerificationDTO = null;
RealNameTwoVerification entity = realNameTwoVerificationMapper.getById(id);
if (entity != null) {
threeFactorVerificationDTO = RealNameTwoVerificationConvert.INSTANCE.convertDTO(entity);
}
return threeFactorVerificationDTO;
}
@Override
RealNameTwoFactorVerificationDTO realVerification(RealNameTwoFactorVerificationDTO verificationDTO) {
Integer authenticationSource = verificationDTO.getAuthenticationSource();
SOURCE_SERVICE_MAP.get(authenticationSource).twoVerify(verificationDTO);
RealNameTwoVerification entity = RealNameTwoVerificationConvert.INSTANCE.convert(verificationDTO);
realNameTwoVerificationMapper.updateEntitySelective(entity, UserContextHolder.getLoginUserId());
return verificationDTO;
}
@Override
public VerificationTypeEnum getType() {
return VerificationTypeEnum.TWO;
}
}

View File

@@ -1,171 +0,0 @@
package com.newyetai.alitaforward.verification.factor;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.StringJoiner;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import com.google.common.collect.Lists;
import com.newyetai.alitaforward.verification.constants.FactorVerificationSourceTypeEnum;
import com.newyetai.alitaforward.verification.constants.VerificationTypeEnum;
import com.newyetai.alitaforward.verification.dto.FactorVerificationQueryDTO;
import com.newyetai.alitaforward.verification.dto.ThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.factor.three.dao.ThreeVerificationMapper;
import com.newyetai.alitaforward.verification.factor.three.entity.BankCardThreeVerification;
import com.newyetai.alitaforward.verification.factor.three.mapstruct.ThreeVerificationMapMapper;
import com.newyetai.common.constant.AuthStatusEnum;
import com.newyetai.common.exception.util.Assert;
import com.newyetai.common.util.UserContextHolder;
import com.newyetai.common.validation.util.ValidateUtils;
import com.newyetai.frame.redis.aop.annotation.AutoUnLock;
import com.newyetai.frame.redis.dto.LockDTO;
import com.newyetai.frame.redis.redisson.RedissonUtils;
import com.newyetai.mq.util.MqSendUtils;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
public class ThreeVerify extends AbstractVerify<ThreeFactorVerificationDTO> implements IQueryVerify<ThreeFactorVerificationDTO> {
@Resource
private ThreeVerificationMapper threeVerificationMapper;
@Override
protected ThreeFactorVerificationDTO syncBeforeVerify(ThreeFactorVerificationDTO verificationDTO) {
StringJoiner stringJoiner = new StringJoiner("、");
if (!ValidateUtils.checkRealName(verificationDTO.getRealName())) {
stringJoiner.add("姓名格式有误");
}
if (!ValidateUtils.isIdCard(verificationDTO.getCardNo())) {
stringJoiner.add("证件号格式有误");
}
if (StringUtils.isBlank(verificationDTO.getBankAccountNo())) {
stringJoiner.add("银行卡号为空");
}
String failReason = stringJoiner.toString();
if (StringUtils.isNotBlank(failReason)) {
verificationDTO.setFailReason(failReason);
} else {
//校验成功调用
super.syncBeforeVerify(verificationDTO);
}
return verificationDTO;
}
@Override
ThreeFactorVerificationDTO createAndGet(ThreeFactorVerificationDTO verificationDTO) {
BankCardThreeVerification entity = threeVerificationMapper.find(verificationDTO);
if (entity == null) {
//认证库不存在,以默认状态入库——"未认证"
verificationDTO.setStatus(AuthStatusEnum.NOT_AUTH.getType());
entity = ThreeVerificationMapMapper.INSTANCE.toEntity(verificationDTO);
threeVerificationMapper.saveEntity(entity);
}
return ThreeVerificationMapMapper.INSTANCE.toDto(entity);
}
@Override
@AutoUnLock
public void autoVerify(ThreeFactorVerificationDTO verificationDTO) {
//拿锁
LockDTO lockDTO = getLock(verificationDTO);
Assert.isTrue(RedissonUtils.tryLockAutomatically(lockDTO), "请勿重复校验三要素");
BankCardThreeVerification verificationEntity = threeVerificationMapper.find(verificationDTO);
if (Objects.nonNull(verificationEntity)) {
if (!AuthStatusEnum.NOT_AUTH.getType().equals(verificationEntity.getStatus())) {
return;
}
verificationEntity.setAuthenticationSource(FactorVerificationSourceTypeEnum.SYS.getType());
verificationEntity.setStatus(verificationDTO.getStatus());
threeVerificationMapper.updateEntitySelective(verificationEntity,
UserContextHolder.getLoginUserId());
} else {
verificationEntity =
BankCardThreeVerification.builder()
.realName(verificationDTO.getRealName())
.cardNo(verificationDTO.getCardNo())
.bankAccountNo(verificationDTO.getBankAccountNo())
.authenticationSource(FactorVerificationSourceTypeEnum.SYS.getType())
.status(verificationDTO.getStatus())
.build();
threeVerificationMapper.saveEntity(verificationEntity);
}
log.info("【MQ】通知认证状态变更,参数:{}", JSONUtil.toJsonStr(verificationDTO));
MqSendUtils.send(statusChangeRoutingKey(), verificationDTO);
}
@Override
LockDTO getLock(ThreeFactorVerificationDTO verificationDTO) {
return LockDTO.builder()
.methodName("verify:three")
.tryLockWaitTime(0L)
.arg(verificationDTO.getRealName())
.arg(verificationDTO.getCardNo())
.arg(verificationDTO.getBankAccountNo())
.build();
}
@Override
public List<ThreeFactorVerificationDTO> list(FactorVerificationQueryDTO queryDTO) {
return threeVerificationMapper.list(queryDTO);
}
@Override
public List<ThreeFactorVerificationDTO> queryListByData(List<FactorVerificationQueryDTO> queryDTOList) {
List<ThreeFactorVerificationDTO> resultList = Lists
.newArrayListWithCapacity(queryDTOList.size());
if (CollectionUtils.isEmpty(queryDTOList)) {
return resultList;
}
List<ThreeFactorVerificationDTO> bankCardThreeVerifications = threeVerificationMapper
.findFinishStatusData();
Map<String, ThreeFactorVerificationDTO> threeVerificationMap = bankCardThreeVerifications
.stream().collect(
Collectors.toMap(k -> k.getRealName() + k.getCardNo() + k.getBankAccountNo(), v -> v, (v1, v2) -> v1));
for (FactorVerificationQueryDTO queryDTO : queryDTOList) {
ThreeFactorVerificationDTO threeFactorVerificationDTO = threeVerificationMap
.get(queryDTO.getRealName() + queryDTO.getCardNo() + queryDTO.getBankAccountNo());
if (threeFactorVerificationDTO != null) {
resultList.add(threeFactorVerificationDTO);
}
}
return resultList;
}
@Override
public ThreeFactorVerificationDTO findById(Long id) {
ThreeFactorVerificationDTO threeFactorVerificationDTO = null;
BankCardThreeVerification entity = threeVerificationMapper.getById(id);
if (entity != null) {
threeFactorVerificationDTO = ThreeVerificationMapMapper.INSTANCE.toDto(entity);
}
return threeFactorVerificationDTO;
}
@Override
ThreeFactorVerificationDTO realVerification(ThreeFactorVerificationDTO verificationDTO) {
Integer authenticationSource = verificationDTO.getAuthenticationSource();
SOURCE_SERVICE_MAP.get(authenticationSource).threeVerify(verificationDTO);
//更新状态
BankCardThreeVerification entity = ThreeVerificationMapMapper.INSTANCE
.toEntity(verificationDTO);
threeVerificationMapper.updateEntitySelective(entity, UserContextHolder.getLoginUserId());
return verificationDTO;
}
@Override
public VerificationTypeEnum getType() {
return VerificationTypeEnum.THREE;
}
}

View File

@@ -1,18 +0,0 @@
package com.newyetai.alitaforward.verification.factor;
import com.newyetai.alitaforward.verification.source.FactorVerificationSourceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Configuration
public class VerifyConfig {
@Autowired
private void autowiredFactorVerificationSourceService(List<FactorVerificationSourceService> sourceServices) {
for (FactorVerificationSourceService sourceService : sourceServices) {
AbstractVerify.SOURCE_SERVICE_MAP.put(sourceService.getSourceType().getType(), sourceService);
}
}
}

View File

@@ -1,30 +0,0 @@
package com.newyetai.alitaforward.verification.factor.four.dao;
import com.newyetai.alitaforward.verification.dto.FactorVerificationQueryDTO;
import com.newyetai.alitaforward.verification.dto.FourFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.ThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.factor.four.entity.BankCardFourVerification;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* @author czy
* @date 2021-06-17
*/
public interface FourVerificationMapper extends MyMapper<BankCardFourVerification> {
/**
* 根据四要素查询数据
* @param params
* @return
*/
BankCardFourVerification selectInfo(@Param("params") FourFactorVerificationDTO params);
@Select("select * from bank_card_four_verification where deleted = false and status in (2,3)")
List<FourFactorVerificationDTO> findFinishStatusData();
List<FourFactorVerificationDTO> list(@Param("params") FactorVerificationQueryDTO factorVerificationQueryDTO);
}

View File

@@ -1,51 +0,0 @@
package com.newyetai.alitaforward.verification.factor.four.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.newyetai.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* @author czy
* @date 2021-06-17
*/
@ApiModel("四要素认证库")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = true)
@TableName("bank_card_four_verification")
public class BankCardFourVerification extends BaseEntity {
@ApiModelProperty("姓名")
private String realName;
@ApiModelProperty("证件号")
private String cardNo;
@ApiModelProperty("银行卡号")
private String bankAccountNo;
@ApiModelProperty("手机号")
private String phone;
@ApiModelProperty("认证状态(1-未认证 2-认证中 3-认证成功 4-认证失败)")
private Integer status;
@ApiModelProperty("认证来源")
private Integer authenticationSource;
@ApiModelProperty("调用数据")
private String invokeData;
@ApiModelProperty("失败原因")
private String failReason;
}

View File

@@ -1,44 +0,0 @@
<?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.newyetai.alitaforward.verification.factor.four.dao.FourVerificationMapper">
<select id="selectInfo" resultType="com.newyetai.alitaforward.verification.factor.four.entity.BankCardFourVerification">
select
*
from
bank_card_four_verification
where
deleted = 0
and real_name = #{params.realName}
and card_no = #{params.cardNo}
and bank_account_no = #{params.bankAccountNo}
and phone = #{params.phone}
</select>
<select id="list" resultType="com.newyetai.alitaforward.verification.dto.FourFactorVerificationDTO">
select
*
from
bank_card_four_verification
<where>
AND deleted = 0
<if test="params.id != null">
and id = #{params.id}
</if>
<if test='params.realName != null and params.realName != ""'>
and real_name = #{params.realName}
</if>
<if test='params.cardNo != null and params.cardNo != ""'>
and card_no = #{params.cardNo}
</if>
<if test='params.bankAccountNo != null and params.bankAccountNo != ""'>
and bank_account_no = #{params.bankAccountNo}
</if>
<if test='params.phone != null and params.phone != ""'>
and phone = #{params.phone}
</if>
</where>
</select>
</mapper>

View File

@@ -1,62 +0,0 @@
package com.newyetai.alitaforward.verification.factor.four.mapstruct;
import com.newyetai.alitaforward.verification.dto.FourFactorVerificationDTO;
import com.newyetai.alitaforward.verification.factor.four.entity.BankCardFourVerification;
import com.newyetai.sdk.fangxinqian.dto.BankCardFourRequestDTO;
import com.newyetai.sdk.fangxinqian.dto.BankCardThreeRequestDTO;
import java.util.List;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
/**
* @author czy
* @date 2021-06-17
*/
@Mapper
public interface FourVerificationMapMapper {
FourVerificationMapMapper INSTANCE = Mappers.getMapper(
FourVerificationMapMapper.class);
/**
* dto to entity
*
* @param fourVerificationDTO
* @return
* @author czy on 2021-06-17
*/
BankCardFourVerification toEntity(
FourFactorVerificationDTO fourVerificationDTO);
/**
* dtoList to entityList
*
* @param threeVerificationDTOList
* @return
* @author czy on 2021-06-17
*/
List<BankCardFourVerification> toEntityList(
List<FourFactorVerificationDTO> threeVerificationDTOList);
/**
* entity to dto
*
* @param threeVerification
* @return
* @author czy on 2021-06-17
*/
FourFactorVerificationDTO toDto(
BankCardFourVerification threeVerification);
/**
* entityList to dtoList
*
* @param fourVerificationEntityList
* @return
* @author czy on 2021-06-17
*/
List<FourFactorVerificationDTO> toDtoList(
List<BankCardFourVerification> fourVerificationEntityList);
}

View File

@@ -1,30 +0,0 @@
package com.newyetai.alitaforward.verification.factor.phoneThree.dao;
import com.newyetai.alitaforward.verification.dto.FactorVerificationQueryDTO;
import com.newyetai.alitaforward.verification.dto.PhoneThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.factor.phoneThree.entity.PhoneThreeVerification;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author czy
* @date 2021-06-17
*/
public interface PhoneThreeVerificationMapper extends MyMapper<PhoneThreeVerification> {
/**
* 根据三要素查询数据
* @param params
* @return
*/
PhoneThreeVerification find(@Param("params") PhoneThreeFactorVerificationDTO params);
@Select("select * from phone_three_verification where deleted = false")
List<PhoneThreeFactorVerificationDTO> findFinishStatusData();
List<PhoneThreeFactorVerificationDTO> list(@Param("params") FactorVerificationQueryDTO factorVerificationQueryDTO);
}

View File

@@ -1,42 +0,0 @@
package com.newyetai.alitaforward.verification.factor.phoneThree.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.newyetai.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
/**
* @author czy
* @date 2021-06-17
*/
@ApiModel("手机号三要素认证库")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = true)
@TableName("phone_three_verification")
public class PhoneThreeVerification extends BaseEntity {
private static final long serialVersionUID = 1033289792676234200L;
@ApiModelProperty("姓名")
private String realName;
@ApiModelProperty("证件号")
private String cardNo;
@ApiModelProperty("银行卡号")
private String phone;
@ApiModelProperty("认证状态(1-未认证 2-认证中 3-认证成功 4-认证失败)")
private Integer status;
@ApiModelProperty("认证来源")
private Integer authenticationSource;
@ApiModelProperty("失败原因")
private String failReason;
}

View File

@@ -1,44 +0,0 @@
<?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.newyetai.alitaforward.verification.factor.phoneThree.dao.PhoneThreeVerificationMapper">
<select id="find" resultType="com.newyetai.alitaforward.verification.factor.phoneThree.entity.PhoneThreeVerification">
select
*
from
phone_three_verification
where
deleted = 0
and real_name = #{params.realName}
and card_no = #{params.cardNo}
and phone = #{params.phone}
</select>
<select id="list" resultType="com.newyetai.alitaforward.verification.dto.PhoneThreeFactorVerificationDTO">
select
*
from
phone_three_verification
<where>
AND deleted = 0
<if test="params.id != null">
and id = #{params.id}
</if>
<if test='params.realName != null and params.realName != ""'>
and real_name = #{params.realName}
</if>
<if test='params.cardNo != null and params.cardNo != ""'>
and card_no = #{params.cardNo}
</if>
<if test='params.phone != null and params.phone != ""'>
and phone = #{params.phone}
</if>
<if test='params.status != null and params.status != ""'>
and status = #{params.status}
</if>
</where>
</select>
</mapper>

View File

@@ -1,21 +0,0 @@
package com.newyetai.alitaforward.verification.factor.phoneThree.mapstruct;
import com.newyetai.alitaforward.verification.dto.PhoneThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.factor.phoneThree.entity.PhoneThreeVerification;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* @author czy
* @date 2021-06-17
*/
@Mapper
public interface PhoneThreeVerificationMapMapper {
PhoneThreeVerificationMapMapper INSTANCE = Mappers.getMapper(
PhoneThreeVerificationMapMapper.class);
PhoneThreeFactorVerificationDTO exchange(PhoneThreeVerification verification);
PhoneThreeVerification exchange(PhoneThreeFactorVerificationDTO verificationDTO);
}

View File

@@ -1,29 +0,0 @@
package com.newyetai.alitaforward.verification.factor.three.dao;
import com.newyetai.alitaforward.verification.dto.FactorVerificationQueryDTO;
import com.newyetai.alitaforward.verification.dto.ThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.factor.three.entity.BankCardThreeVerification;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* @author czy
* @date 2021-06-17
*/
public interface ThreeVerificationMapper extends MyMapper<BankCardThreeVerification> {
/**
* 根据三要素查询数据
* @param params
* @return
*/
BankCardThreeVerification find(@Param("params") ThreeFactorVerificationDTO params);
@Select("select * from bank_card_three_verification where deleted = false")
List<ThreeFactorVerificationDTO> findFinishStatusData();
List<ThreeFactorVerificationDTO> list(@Param("params") FactorVerificationQueryDTO factorVerificationQueryDTO);
}

View File

@@ -1,45 +0,0 @@
package com.newyetai.alitaforward.verification.factor.three.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.newyetai.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
/**
* @author czy
* @date 2021-06-17
*/
@ApiModel("三要素认证库")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@EqualsAndHashCode(callSuper = true)
@TableName("bank_card_three_verification")
public class BankCardThreeVerification extends BaseEntity {
private static final long serialVersionUID = 1178897458908696195L;
@ApiModelProperty("姓名")
private String realName;
@ApiModelProperty("证件号")
private String cardNo;
@ApiModelProperty("银行卡号")
private String bankAccountNo;
@ApiModelProperty("认证状态(1-未认证 2-认证中 3-认证成功 4-认证失败)")
private Integer status;
@ApiModelProperty("认证来源")
private Integer authenticationSource;
@ApiModelProperty("调用数据")
private String invokeData;
@ApiModelProperty("失败原因")
private String failReason;
}

View File

@@ -1,50 +0,0 @@
<?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.newyetai.alitaforward.verification.factor.three.dao.ThreeVerificationMapper">
<select id="find" resultType="com.newyetai.alitaforward.verification.factor.three.entity.BankCardThreeVerification">
select
*
from
bank_card_three_verification
where
deleted = 0
and real_name = #{params.realName}
and card_no = #{params.cardNo}
and bank_account_no = #{params.bankAccountNo}
</select>
<select id="list" resultType="com.newyetai.alitaforward.verification.dto.ThreeFactorVerificationDTO">
select
*
from
bank_card_three_verification
<where>
AND deleted = 0
<if test="params.id != null">
and id = #{params.id}
</if>
<if test="params.ids != null and params.ids.size() != 0">
and id IN
<foreach collection="params.ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</if>
<if test='params.realName != null and params.realName != ""'>
and real_name = #{params.realName}
</if>
<if test='params.cardNo != null and params.cardNo != ""'>
and card_no = #{params.cardNo}
</if>
<if test='params.bankAccountNo != null and params.bankAccountNo != ""'>
and bank_account_no = #{params.bankAccountNo}
</if>
<if test='params.status != null and params.status != ""'>
and status = #{params.status}
</if>
</where>
</select>
</mapper>

View File

@@ -1,60 +0,0 @@
package com.newyetai.alitaforward.verification.factor.three.mapstruct;
import com.newyetai.alitaforward.verification.dto.ThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.factor.three.entity.BankCardThreeVerification;
import java.util.List;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* @author czy
* @date 2021-06-17
*/
@Mapper
public interface ThreeVerificationMapMapper {
ThreeVerificationMapMapper INSTANCE = Mappers.getMapper(
ThreeVerificationMapMapper.class);
/**
* dto to entity
*
* @param threeVerificationDTO
* @return
* @author czy on 2021-06-17
*/
BankCardThreeVerification toEntity(
ThreeFactorVerificationDTO threeVerificationDTO);
/**
* dtoList to entityList
*
* @param threeVerificationDTOList
* @return
* @author czy on 2021-06-17
*/
List<BankCardThreeVerification> toEntityList(
List<ThreeFactorVerificationDTO> threeVerificationDTOList);
/**
* entity to dto
*
* @param threeVerification
* @return
* @author czy on 2021-06-17
*/
ThreeFactorVerificationDTO toDto(
BankCardThreeVerification threeVerification);
/**
* entityList to dtoList
*
* @param threeVerificationEntityList
* @return
* @author czy on 2021-06-17
*/
List<ThreeFactorVerificationDTO> toDtoList(
List<BankCardThreeVerification> threeVerificationEntityList);
}

View File

@@ -1,28 +0,0 @@
package com.newyetai.alitaforward.verification.factor.two.convert;
import com.newyetai.alitaforward.verification.dto.RealNameTwoFactorVerificationDTO;
import com.newyetai.alitaforward.verification.factor.two.dto.RealNameTwoVerificationDTO;
import com.newyetai.alitaforward.verification.factor.two.dto.RealNameTwoVerificationOperatorDTO;
import com.newyetai.alitaforward.verification.factor.two.entity.RealNameTwoVerification;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 二要素认证表
*
* @author chenyun chenyun.home@outlook.com
* @since 1.0.0 2022-07-22
*/
@Mapper
public interface RealNameTwoVerificationConvert {
RealNameTwoVerificationConvert INSTANCE = Mappers.getMapper(RealNameTwoVerificationConvert.class);
RealNameTwoVerification convert(RealNameTwoVerificationDTO dto);
RealNameTwoVerificationDTO convert(RealNameTwoVerification entity);
RealNameTwoFactorVerificationDTO convertDTO(RealNameTwoVerification entity);
RealNameTwoVerification convert(RealNameTwoVerificationOperatorDTO dto);
RealNameTwoVerification convert(RealNameTwoFactorVerificationDTO dto);
}

View File

@@ -1,39 +0,0 @@
package com.newyetai.alitaforward.verification.factor.two.dao;
import com.newyetai.alitaforward.verification.dto.FactorVerificationQueryDTO;
import com.newyetai.alitaforward.verification.dto.RealNameTwoFactorVerificationDTO;
import com.newyetai.alitaforward.verification.factor.two.dto.RealNameTwoVerificationDTO;
import com.newyetai.alitaforward.verification.factor.two.dto.RealNameTwoVerificationPageQueryDTO;
import com.newyetai.alitaforward.verification.factor.two.entity.RealNameTwoVerification;
import com.newyetai.tkmybatis.mybatis.MyMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 二要素认证表
*
* @author chenyun chenyun.home@outlook.com
* @since 1.0.0 2022-07-22
*/
@Mapper
public interface RealNameTwoVerificationMapper extends MyMapper<RealNameTwoVerification> {
/**
* 根据二要素查询数据
*
* @param params
* @return
*/
RealNameTwoVerification selectInfo(@Param("param") RealNameTwoFactorVerificationDTO params);
List<RealNameTwoVerificationDTO> page(
@Param("param") RealNameTwoVerificationPageQueryDTO queryDTO);
List<RealNameTwoFactorVerificationDTO> list(@Param("param") FactorVerificationQueryDTO queryDTO);
@Select("select * from real_name_two_verification where deleted = false")
List<RealNameTwoFactorVerificationDTO> findFinishStatusData();
}

View File

@@ -1,41 +0,0 @@
package com.newyetai.alitaforward.verification.factor.two.dto;
import com.newyetai.common.dto.BaseDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.SuperBuilder;
/**
* 二要素认证表
*
* @author chenyun chenyun.home@outlook.com
* @since 1.0.0 2022-07-22
*/
@ApiModel("二要素认证表")
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class RealNameTwoVerificationDTO extends BaseDTO {
private static final long serialVersionUID = 1L;
@ApiModelProperty("姓名")
private String realName;
@ApiModelProperty("证件号")
private String cardNo;
@ApiModelProperty("状态(1待认证 2认证中 3认证成功 4认证失败)")
private Integer status;
@ApiModelProperty("认证来源(1放心签、2创蓝 3系统)")
private Integer authenticationSource;
@ApiModelProperty("调用数据")
private String invokeData;
@ApiModelProperty("失败原因")
private String failReason;
}

View File

@@ -1,45 +0,0 @@
package com.newyetai.alitaforward.verification.factor.two.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* 二要素认证表
*
* @author chenyun chenyun.home@outlook.com
* @since 1.0.0 2022-07-22
*/
@ApiModel("二要素认证表")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RealNameTwoVerificationOperatorDTO implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
@ApiModelProperty("姓名")
private String realName;
@ApiModelProperty("证件号")
private String cardNo;
@ApiModelProperty("状态(1待认证 2认证中 3认证成功 4认证失败)")
private Integer status;
@ApiModelProperty("认证来源(1放心签、2创蓝 3系统)")
private Integer authenticationSource;
@ApiModelProperty("调用数据")
private String invokeData;
@ApiModelProperty("失败原因")
private String failReason;
}

View File

@@ -1,67 +0,0 @@
package com.newyetai.alitaforward.verification.factor.two.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.newyetai.common.dto.PageQueryDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 二要素认证表
*
* @author chenyun chenyun.home@outlook.com
* @since 1.0.0 2022-07-22
*/
@ApiModel("二要素认证表")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class RealNameTwoVerificationPageQueryDTO extends PageQueryDTO<RealNameTwoVerificationDTO> {
private static final long serialVersionUID = 1L;
@ApiModelProperty("ID")
private Long id;
@ApiModelProperty("姓名 (模糊匹配)")
private String realNameLike;
@ApiModelProperty("证件号")
private String cardNo;
@ApiModelProperty("状态(1待认证 2认证中 3认证成功 4认证失败)")
private Integer status;
@ApiModelProperty("认证来源(1放心签、2创蓝 3系统)")
private Integer authenticationSource;
@ApiModelProperty("调用数据")
private String invokeData;
@ApiModelProperty("失败原因")
private String failReason;
@ApiModelProperty("创建时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeStart;
@ApiModelProperty("创建时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeEnd;
@ApiModelProperty("更新时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeStart;
@ApiModelProperty("更新时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeEnd;
}

View File

@@ -1,69 +0,0 @@
package com.newyetai.alitaforward.verification.factor.two.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* 二要素认证表
*
* @author chenyun chenyun.home@outlook.com
* @since 1.0.0 2022-07-22
*/
@ApiModel("二要素认证表")
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RealNameTwoVerificationQueryDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("ID")
private Long id;
@ApiModelProperty("姓名 (模糊匹配)")
private String realNameLike;
@ApiModelProperty("证件号")
private String cardNo;
@ApiModelProperty("状态(1待认证 2认证中 3认证成功 4认证失败)")
private Integer status;
@ApiModelProperty("认证来源(1放心签、2创蓝 3系统)")
private Integer authenticationSource;
@ApiModelProperty("调用数据")
private String invokeData;
@ApiModelProperty("失败原因")
private String failReason;
@ApiModelProperty("创建时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeStart;
@ApiModelProperty("创建时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTimeEnd;
@ApiModelProperty("更新时间起,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeStart;
@ApiModelProperty("更新时间止,格式 (yyyy-MM-dd HH:mm:ss)")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTimeEnd;
}

View File

@@ -1,40 +0,0 @@
package com.newyetai.alitaforward.verification.factor.two.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.newyetai.common.entity.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
/**
* 二要素认证表
*
* @author chenyun chenyun.home@outlook.com
* @since 1.0.0 2022-07-22
*/
@TableName("real_name_two_verification")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class RealNameTwoVerification extends BaseEntity {
private static final long serialVersionUID = 1L;
/** 姓名 */
private String realName;
/** 证件号 */
private String cardNo;
/** 状态(1待认证 2认证中 3认证成功 4认证失败) */
private Integer status;
/** 认证来源(1放心签、2创蓝 3系统) */
private Integer authenticationSource;
/** 调用数据 */
private String invokeData;
/** 失败原因 */
private String failReason;
}

View File

@@ -1,81 +0,0 @@
<?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.newyetai.alitaforward.verification.factor.two.dao.RealNameTwoVerificationMapper">
<select id="list" resultType="com.newyetai.alitaforward.verification.dto.RealNameTwoFactorVerificationDTO">
select
*
from
real_name_two_verification
<where>
AND deleted = 0
<if test="params.id != null">
and id = #{params.id}
</if>
<if test='params.realName != null and params.realName != ""'>
and real_name = #{params.realName}
</if>
<if test='params.cardNo != null and params.cardNo != ""'>
and card_no = #{params.cardNo}
</if>
<if test='params.status != null and params.status != ""'>
and status = #{params.status}
</if>
</where>
</select>
<select id="page" resultType="com.newyetai.alitaforward.verification.factor.two.dto.RealNameTwoVerificationDTO">
SELECT t.*
<include refid="queryFromSql"></include>
</select>
<select id="selectInfo"
resultType="com.newyetai.alitaforward.verification.factor.two.entity.RealNameTwoVerification">
SELECT t.*
FROM real_name_two_verification t
WHERE t.deleted = 0
AND t.real_name = #{param.realName}
AND t.card_no = #{param.cardNo}
</select>
<sql id="queryFromSql">
FROM
real_name_two_verification t
WHERE t.deleted = 0
<if test='param.id != null'>
AND t.id = #{param.id}
</if>
<if test='param.realNameLike != null and param.realNameLike.trim() != ""'>
<bind name="realNameLike" value="'%' + param.realNameLike + '%'"/>
AND t.real_name like #{realNameLike}
</if>
<if test='param.cardNo != null and param.cardNo.trim() != ""'>
AND t.card_no = #{param.cardNo}
</if>
<if test='param.status != null'>
AND t.status = #{param.status}
</if>
<if test='param.authenticationSource != null'>
AND t.authentication_source = #{param.authenticationSource}
</if>
<if test='param.invokeData != null and param.invokeData.trim() != ""'>
AND t.invoke_data = #{param.invokeData}
</if>
<if test='param.failReason != null and param.failReason.trim() != ""'>
AND t.fail_reason = #{param.failReason}
</if>
<if test='param.createTimeStart != null'>
AND t.create_time &gt;= #{param.createTimeStart}
</if>
<if test='param.createTimeEnd != null'>
AND t.create_time &lt;= #{param.createTimeEnd}
</if>
<if test='param.updateTimeStart != null'>
AND t.update_time &gt;= #{param.updateTimeStart}
</if>
<if test='param.updateTimeEnd != null'>
AND t.update_time &lt;= #{param.updateTimeEnd}
</if>
ORDER BY t.id DESC
</sql>
</mapper>

View File

@@ -1,14 +0,0 @@
package com.newyetai.alitaforward.verification.service;
import com.newyetai.alitaforward.verification.dto.BankCordVerificationResDTO;
import java.util.List;
public interface BankCardVerificationService {
/**
* 白名单管理-->三、四要素查询合并为银行卡查询
* @param cardNo
*/
List<BankCordVerificationResDTO> list(String cardNo,Integer status);
}

View File

@@ -1,17 +0,0 @@
package com.newyetai.alitaforward.verification.service;
import com.newyetai.alitaforward.verification.constants.VerificationTypeEnum;
import com.newyetai.alitaforward.verification.dto.FourFactorVerificationDTO;
import com.newyetai.mq.consumer.handler.ITopicMqHandler;
/**
* @author czy
* @date 2021-06-22
*/
public interface FourFactorVerificationProvider extends ITopicMqHandler<FourFactorVerificationDTO> {
default String getRoutingKey(){
return VerificationTypeEnum.FOUR.getStatusChangeKey();
}
}

View File

@@ -1,17 +0,0 @@
package com.newyetai.alitaforward.verification.service;
import com.newyetai.alitaforward.verification.constants.VerificationTypeEnum;
import com.newyetai.alitaforward.verification.dto.PhoneThreeFactorVerificationDTO;
import com.newyetai.mq.consumer.handler.ITopicMqHandler;
/**
* @author czy
* @date 2021-06-22
*/
public interface PhoneThreeFactorVerificationProvider extends ITopicMqHandler<PhoneThreeFactorVerificationDTO> {
default String getRoutingKey(){
return VerificationTypeEnum.PHONE_THREE.getStatusChangeKey();
}
}

View File

@@ -1,17 +0,0 @@
package com.newyetai.alitaforward.verification.service;
import com.newyetai.alitaforward.verification.constants.VerificationTypeEnum;
import com.newyetai.alitaforward.verification.dto.RealNameTwoFactorVerificationDTO;
import com.newyetai.mq.consumer.handler.ITopicMqHandler;
/**
* @author czy
* @date 2021-06-22
*/
public interface RealNameTwoFactorVerificationProvider extends ITopicMqHandler<RealNameTwoFactorVerificationDTO> {
default String getRoutingKey(){
return VerificationTypeEnum.TWO.getStatusChangeKey();
}
}

View File

@@ -1,17 +0,0 @@
package com.newyetai.alitaforward.verification.service;
import com.newyetai.alitaforward.verification.constants.VerificationTypeEnum;
import com.newyetai.alitaforward.verification.dto.ThreeFactorVerificationDTO;
import com.newyetai.mq.consumer.handler.ITopicMqHandler;
/**
* @author czy
* @date 2021-06-22
*/
public interface ThreeFactorVerificationProvider extends ITopicMqHandler<ThreeFactorVerificationDTO> {
default String getRoutingKey(){
return VerificationTypeEnum.THREE.getStatusChangeKey();
}
}

View File

@@ -1,35 +0,0 @@
package com.newyetai.alitaforward.verification.service.impl;
import com.newyetai.alitaforward.verification.dao.BankCardVerificationMapper;
import com.newyetai.alitaforward.verification.dto.BankCordVerificationResDTO;
import com.newyetai.alitaforward.verification.service.BankCardVerificationService;
import com.newyetai.common.exception.BusinessException;
import com.newyetai.common.exception.util.Assert;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class BankCardVerificationServiceImpl implements BankCardVerificationService {
@Autowired
BankCardVerificationMapper bankCardVerificationMapper;
/**
* 白名单管理-->三、四要素查询合并为银行卡查询
* @param cardNo
*/
public List<BankCordVerificationResDTO> list(String cardNo,Integer status){
if(StringUtils.isBlank(cardNo)){
throw new BusinessException("身份证号不能为空");
}
List<BankCordVerificationResDTO> bankCordVerificationResDTOList = bankCardVerificationMapper.list(cardNo);
if(status != null){
return bankCordVerificationResDTOList.stream().
filter(f -> f.getStatus() != null && f.getStatus() == status).collect(Collectors.toList());
}
return bankCordVerificationResDTOList;
}
}

View File

@@ -1,34 +0,0 @@
package com.newyetai.alitaforward.verification.source;
import com.newyetai.alitaforward.verification.constants.FactorVerificationSourceTypeEnum;
import com.newyetai.alitaforward.verification.dto.FourFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.PhoneThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.RealNameTwoFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.ThreeFactorVerificationDTO;
import com.newyetai.common.exception.BusinessException;
/**
* 要素认证源 - 顶层接口
*
* @author cheny
* @date 2022/08/11
*/
public interface FactorVerificationSourceService {
FactorVerificationSourceTypeEnum getSourceType();
default RealNameTwoFactorVerificationDTO twoVerify(RealNameTwoFactorVerificationDTO verificationDTO) {
throw new BusinessException("二要素不支持的该认证源:" + getSourceType());
}
default ThreeFactorVerificationDTO threeVerify(ThreeFactorVerificationDTO verificationDTO){
throw new BusinessException("银行卡三要素不支持的该认证源:" + getSourceType());
}
default PhoneThreeFactorVerificationDTO phoneThreeVerify(PhoneThreeFactorVerificationDTO verificationDTO){
throw new BusinessException("手机号三要素不支持的该认证源:" + getSourceType());
}
default FourFactorVerificationDTO fourVerify(FourFactorVerificationDTO verificationDTO){
throw new BusinessException("银行卡四要素不支持的该认证源:" + getSourceType());
}
}

View File

@@ -1,66 +0,0 @@
package com.newyetai.alitaforward.verification.source.ali;
import cn.hutool.json.JSONUtil;
import com.newyetai.alitaforward.verification.constants.FactorVerificationSourceTypeEnum;
import com.newyetai.alitaforward.verification.dto.FactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.RealNameTwoFactorVerificationDTO;
import com.newyetai.alitaforward.verification.source.FactorVerificationSourceService;
import com.newyetai.alitaforward.verification.source.ali.mapstruct.AliVerifyMapMapper;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.constant.AuthStatusEnum;
import com.newyetai.common.util.JsonUtils;
import com.newyetai.sdk.ali.dto.IdCardReq;
import com.newyetai.sdk.ali.dto.IdCardRes;
import com.newyetai.sdk.ali.service.AliVerifyService;
import com.newyetai.sdk.common.constant.SdkConstants;
import java.util.Objects;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
@SuppressWarnings("unchecked")
public class ALiVerifySourceServiceImpl implements FactorVerificationSourceService {
@Resource(name = AliVerifyService.BEAN_ID)
private AliVerifyService aliVerifyService;
@Override
public RealNameTwoFactorVerificationDTO twoVerify(RealNameTwoFactorVerificationDTO verificationDTO) {
IdCardReq requestDTO = AliVerifyMapMapper.INSTANCE.toDTO(verificationDTO);
AlitaResult<IdCardRes> result = aliVerifyService.verify(requestDTO);
handlerResult(result, verificationDTO);
return verificationDTO;
}
private void handlerResult(AlitaResult<?> result, FactorVerificationDTO verificationDTO) {
verificationDTO.setInvokeData(JsonUtils.toNoEmptyJson(result));
AuthStatusEnum targetStatus = null;
if (SdkConstants.SDK_INVOKE_NOT_REACH_CODE.equals(result.getCode())) {
// 接口调起失败,未拿到返回结果,视为未调起
verificationDTO.setFailReason("调用异常,未调起第三方");
} else {
if (Boolean.TRUE.equals(result.getSuccess())) {
targetStatus = AuthStatusEnum.AUTH_SUCCESS;
} else {
targetStatus = AuthStatusEnum.AUTH_FAIL;
verificationDTO.setFailReason(result.getMsg());
}
}
if (Objects.nonNull(targetStatus)) {
verificationDTO.setStatus(targetStatus.getType());
}
}
@Override
public FactorVerificationSourceTypeEnum getSourceType() {
return FactorVerificationSourceTypeEnum.ALI;
}
}

View File

@@ -1,24 +0,0 @@
package com.newyetai.alitaforward.verification.source.ali.mapstruct;
import com.newyetai.alitaforward.verification.dto.RealNameTwoFactorVerificationDTO;
import com.newyetai.sdk.ali.dto.IdCardReq;
import com.newyetai.sdk.chuanglan.dto.RealNameTwoBaseRequestDTO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
@Mapper
public interface AliVerifyMapMapper {
AliVerifyMapMapper INSTANCE = Mappers.getMapper(AliVerifyMapMapper.class);
@Mappings(value = {
@Mapping(target = "name", source = "dto.realName"),
@Mapping(target = "idcard", source = "dto.cardNo")
})
IdCardReq toDTO(RealNameTwoFactorVerificationDTO dto);
}

View File

@@ -1,119 +0,0 @@
package com.newyetai.alitaforward.verification.source.cl;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.newyetai.alitaforward.verification.constants.FactorVerificationSourceTypeEnum;
import com.newyetai.alitaforward.verification.dto.FactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.FourFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.PhoneThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.RealNameTwoFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.ThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.source.FactorVerificationSourceService;
import com.newyetai.alitaforward.verification.source.cl.mapstruct.ClMapMapper;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.constant.AuthStatusEnum;
import com.newyetai.sdk.chuanglan.dto.BankCardFourRequestDTO;
import com.newyetai.sdk.chuanglan.dto.BankCardThreeRequestDTO;
import com.newyetai.sdk.chuanglan.dto.ChuangLanResultDTO;
import com.newyetai.sdk.chuanglan.dto.PhoneThreeRequestDTO;
import com.newyetai.sdk.chuanglan.dto.RealNameTwoBaseRequestDTO;
import com.newyetai.sdk.chuanglan.service.ChuangLanService;
import com.newyetai.sdk.common.constant.SdkConstants;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
/**
* 创蓝认证源
*
* @author cheny
* @date 2022/08/11
*/
@Slf4j
@Service
@SuppressWarnings("unchecked")
public class ClAuthenticateSourceServiceImpl implements FactorVerificationSourceService {
@Override
public RealNameTwoFactorVerificationDTO twoVerify(RealNameTwoFactorVerificationDTO verificationDTO) {
RealNameTwoBaseRequestDTO requestDTO = ClMapMapper.INSTANCE.toTwoRequestDTO(verificationDTO);
log.info("执行创蓝运营商二要素认证:{}", JSONUtil.toJsonStr(requestDTO));
AlitaResult<ChuangLanResultDTO> result = chuangLanService.checkRealNameTwoBase(requestDTO);
handlerResult(result, verificationDTO);
return verificationDTO;
}
@Override
public PhoneThreeFactorVerificationDTO phoneThreeVerify(PhoneThreeFactorVerificationDTO verificationDTO) {
PhoneThreeRequestDTO phoneThreeRequestDTO = ClMapMapper.INSTANCE
.toPhoneThreeRequestDTO(verificationDTO);
log.info("执行创蓝运营商三要素认证:{}", JSONUtil.toJsonStr(phoneThreeRequestDTO));
AlitaResult<ChuangLanResultDTO> result = chuangLanService.checkPhoneThree(phoneThreeRequestDTO);
handlerResult(result, verificationDTO);
return verificationDTO;
}
@Override
public ThreeFactorVerificationDTO threeVerify(
ThreeFactorVerificationDTO verificationDTO) {
BankCardThreeRequestDTO bankCardThreeRequestDTO = ClMapMapper.INSTANCE
.toThreeRequestDTO(verificationDTO);
log.info("执行创蓝三要素认证:{}", JSONUtil.toJsonStr(bankCardThreeRequestDTO));
AlitaResult<ChuangLanResultDTO> result = chuangLanService.checkBankCardThree(bankCardThreeRequestDTO);
handlerResult(result, verificationDTO);
return verificationDTO;
}
@Override
public FourFactorVerificationDTO fourVerify(
FourFactorVerificationDTO verificationDTO) {
//调用放心签
BankCardFourRequestDTO bankCardFourRequestDTO = ClMapMapper.INSTANCE
.toFourRequestDTO(verificationDTO);
log.info("执行创蓝四要素认证:{}", JSONUtil.toJsonStr(bankCardFourRequestDTO));
AlitaResult<ChuangLanResultDTO> result = chuangLanService.checkBankCardFour(bankCardFourRequestDTO);
handlerResult(result, verificationDTO);
return verificationDTO;
}
/**
* 处理结果
*
* @param result 结果
* @param verificationDTO 验证dto
*/
private void handlerResult(AlitaResult<ChuangLanResultDTO> result, FactorVerificationDTO verificationDTO) {
verificationDTO.setInvokeData(Optional.ofNullable(result.getData()).map(ChuangLanResultDTO::getJsonData).orElse(""));
AuthStatusEnum targetStatus = null;
if (SdkConstants.SDK_INVOKE_NOT_REACH_CODE.equals(result.getCode())) {
// 接口调起失败,未拿到返回结果,视为未调起
verificationDTO.setFailReason("调用异常,未调起第三方");
} else {
if (Boolean.TRUE.equals(result.getSuccess()) && Boolean.TRUE.equals(result.getData().getStatus())) {
targetStatus = AuthStatusEnum.AUTH_SUCCESS;
} else {
targetStatus = AuthStatusEnum.AUTH_FAIL;
verificationDTO.setFailReason(result.getMsg());
}
}
if (Objects.nonNull(targetStatus)) {
verificationDTO.setStatus(targetStatus.getType());
}
}
@Resource(name = ChuangLanService.BEAN_ID)
private ChuangLanService chuangLanService;
@Override
public FactorVerificationSourceTypeEnum getSourceType() {
return FactorVerificationSourceTypeEnum.CL;
}
}

View File

@@ -1,76 +0,0 @@
package com.newyetai.alitaforward.verification.source.cl.mapstruct;
import com.newyetai.alitaforward.verification.dto.FourFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.PhoneThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.RealNameTwoFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.ThreeFactorVerificationDTO;
import com.newyetai.sdk.chuanglan.dto.BankCardFourRequestDTO;
import com.newyetai.sdk.chuanglan.dto.BankCardThreeRequestDTO;
import com.newyetai.sdk.chuanglan.dto.PhoneThreeRequestDTO;
import com.newyetai.sdk.chuanglan.dto.RealNameTwoBaseRequestDTO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
/**
* @author czy
* @date 2021-06-23
*/
@Mapper
public interface ClMapMapper {
ClMapMapper INSTANCE = Mappers.getMapper(ClMapMapper.class);
/**
* dto转创蓝三要素认证请求对象
*
* @param dto 验证dto
* @return {@link RealNameTwoBaseRequestDTO}
*/
@Mappings(value = {
@Mapping(target = "name", source = "dto.realName"),
@Mapping(target = "idNum", source = "dto.cardNo")
})
RealNameTwoBaseRequestDTO toTwoRequestDTO(RealNameTwoFactorVerificationDTO dto);
/**
* dto转创蓝三要素认证请求对象
*
* @param dto
* @return {@link BankCardThreeRequestDTO}
*/
@Mappings(value = {
@Mapping(target = "name", source = "dto.realName"),
@Mapping(target = "idNum", source = "dto.cardNo"),
@Mapping(target = "cardNo", source = "dto.bankAccountNo")
})
BankCardThreeRequestDTO toThreeRequestDTO(ThreeFactorVerificationDTO dto);
/**
* dto转创蓝三要素认证请求对象
*
* @param dto dto
* @return {@link PhoneThreeRequestDTO}
*/
@Mappings(value = {
@Mapping(target = "name", source = "dto.realName"),
@Mapping(target = "idNum", source = "dto.cardNo"),
@Mapping(target = "mobile", source = "dto.phone")
})
PhoneThreeRequestDTO toPhoneThreeRequestDTO(PhoneThreeFactorVerificationDTO dto);
/**
* dto转创蓝四要素认证请求对象
*
* @param dto
* @return {@link BankCardFourRequestDTO}
*/
@Mappings(value = {
@Mapping(target = "name", source = "dto.realName"),
@Mapping(target = "idNum", source = "dto.cardNo"),
@Mapping(target = "cardNo", source = "dto.bankAccountNo"),
@Mapping(target = "mobile", source = "dto.phone")
})
BankCardFourRequestDTO toFourRequestDTO(FourFactorVerificationDTO dto);
}

View File

@@ -1,88 +0,0 @@
package com.newyetai.alitaforward.verification.source.fxq;
import java.util.Objects;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.newyetai.alitaforward.verification.constants.FactorVerificationSourceTypeEnum;
import com.newyetai.alitaforward.verification.dto.FactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.FourFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.ThreeFactorVerificationDTO;
import com.newyetai.alitaforward.verification.source.FactorVerificationSourceService;
import com.newyetai.alitaforward.verification.source.fxq.mapstruct.FxqMapMapper;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.constant.AuthStatusEnum;
import com.newyetai.sdk.common.constant.SdkConstants;
import com.newyetai.sdk.fangxinqian.dto.BankCardFourRequestDTO;
import com.newyetai.sdk.fangxinqian.dto.BankCardThreeRequestDTO;
import com.newyetai.sdk.fangxinqian.service.FangXinQianService;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
/**
* @author czy
* @date 2021-06-21
*/
@Slf4j
@Service
public class FxqAuthenticateSourceServiceImpl implements FactorVerificationSourceService {
@Override
public ThreeFactorVerificationDTO threeVerify(
ThreeFactorVerificationDTO threeFactorVerificationDTO) {
BankCardThreeRequestDTO bankCardThreeRequestDto =
FxqMapMapper.INSTANCE.toThreeRequestDTO(threeFactorVerificationDTO);
log.info("执行放心签三要素认证:{}", JSONUtil.toJsonStr(bankCardThreeRequestDto));
AlitaResult<Boolean> result = fangXinQianService.checkBankCardThree(bankCardThreeRequestDto);
handlerResult(result, threeFactorVerificationDTO);
return threeFactorVerificationDTO;
}
@Override
public FourFactorVerificationDTO fourVerify(
FourFactorVerificationDTO fourFactorVerificationDTO) {
//调用放心签
BankCardFourRequestDTO bankCardFourRequestDTO = FxqMapMapper.INSTANCE
.toFourRequestDTO(fourFactorVerificationDTO);
log.info("执行放心签四要素认证:{}", JSONUtil.toJsonStr(bankCardFourRequestDTO));
AlitaResult<Boolean> result = fangXinQianService.checkBankCardFour(bankCardFourRequestDTO);
handlerResult(result, fourFactorVerificationDTO);
return fourFactorVerificationDTO;
}
/**
* 处理结果
*
* @param result 结果
* @param verificationDTO 验证dto
*/
private void handlerResult(AlitaResult<Boolean> result, FactorVerificationDTO verificationDTO) {
AuthStatusEnum targetStatus = null;
if (SdkConstants.SDK_INVOKE_NOT_REACH_CODE.equals(result.getCode())) {
// 接口调起失败,未拿到返回结果,视为未调起
verificationDTO.setFailReason("调用异常,未调起第三方");
} else {
if (Boolean.TRUE.equals(result.getSuccess()) && Boolean.TRUE.equals(result.getData())) {
targetStatus = AuthStatusEnum.AUTH_SUCCESS;
} else {
targetStatus = AuthStatusEnum.AUTH_FAIL;
verificationDTO.setFailReason(result.getMsg());
}
}
if (Objects.nonNull(targetStatus)) {
verificationDTO.setStatus(targetStatus.getType());
}
}
@Resource(name = FangXinQianService.BEAN_ID)
private FangXinQianService fangXinQianService;
@Override
public FactorVerificationSourceTypeEnum getSourceType() {
return FactorVerificationSourceTypeEnum.FXQ;
}
}

View File

@@ -1,49 +0,0 @@
package com.newyetai.alitaforward.verification.source.fxq.mapstruct;
import com.newyetai.alitaforward.verification.dto.FourFactorVerificationDTO;
import com.newyetai.alitaforward.verification.dto.ThreeFactorVerificationDTO;
import com.newyetai.sdk.fangxinqian.dto.BankCardFourRequestDTO;
import com.newyetai.sdk.fangxinqian.dto.BankCardThreeRequestDTO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
/**
* @author czy
* @date 2021-06-23
*/
@Mapper
public interface FxqMapMapper {
FxqMapMapper INSTANCE = Mappers.getMapper(
FxqMapMapper.class);
/**
* dto转放心签三要素认证请求对象
*
* @param dto
* @return {@link BankCardThreeRequestDTO}
*/
@Mappings(value = {
@Mapping(target = "name", source = "dto.realName"),
@Mapping(target = "identityCode", source = "dto.cardNo"),
@Mapping(target = "bankcardNumber", source = "dto.bankAccountNo")
})
BankCardThreeRequestDTO toThreeRequestDTO(ThreeFactorVerificationDTO dto);
/**
* dto转放心签四要素认证请求对象
*
* @param dto
* @return {@link BankCardFourRequestDTO}
*/
@Mappings(value = {
@Mapping(target = "name", source = "dto.realName"),
@Mapping(target = "identityCode", source = "dto.cardNo"),
@Mapping(target = "bankcardNumber", source = "dto.bankAccountNo"),
@Mapping(target = "phoneNumber", source = "dto.phone")
})
BankCardFourRequestDTO toFourRequestDTO(FourFactorVerificationDTO dto);
}

View File

@@ -1,67 +0,0 @@
package com.newyetai.business.ability.enums;
/**
* 产品类型
*
* @author sr on 2021-03-29
*/
public enum ProdTypeEnum {
/**
* 新业态-灵活就业
**/
XYT(10, "新业态产品"),
/**
* 其他
**/
OTHER(11, "其他"),
/**
* 短信
**/
SMS_COUNT(12, "短信计次"),
/**
* 三要素
**/
BANK_CARD_THREE_COUNT(13, "三要素计次"),
/**
* 电子合同
**/
ELECTRONIC_CONTRACT_COUNT(14, "合同计次"),
/**
* 发票
**/
INVOICE(15, "开票余额"),
/**
* 工商信息
**/
COMPANY_INFO(16, "工商信息"),
/**
* 积分
**/
POINT(17, "积分"),
/**
* 通用支付
*/
OPEN_PAY(18, "通用支付"),
/**
* 无卡发薪
*/
UPAY(19, "无卡发薪"),
/**
* 平台认证
*/
PLATFORM_VERIFICATION(20, "平台认证");
ProdTypeEnum(Integer type, String desc) {
this.type = type;
this.desc = desc;
}
private Integer type;
private String desc;
public Integer getType() {
return type;
}
}

View File

@@ -42,6 +42,7 @@ public interface CommonConstants {
String PROFILE_KEY = "spring.profiles.active";
/** 项目名称 **/
String APPLICATION_NAME_KEY = "spring.application.name";
String SYSTEM_CODE_KEY = "system.code";
/** security是否使用本地方法 **/
String USELOCAL_KEY = "security.useLocal";

View File

@@ -2,17 +2,5 @@ package com.newyetai.common.constant;
public interface CommonMqConstants {
/** 用户中心系统mq前缀 **/
String FORWARD_MQ_PREFIX = SystemCodeEnum.ALITA_FORWARD.getName() + CommonConstants.POINT;
/**
* 保存异常和发送叮
*/
String SAVE_EXCEPTION_AND_SEND_DING = CommonMqConstants.FORWARD_MQ_PREFIX + "save_exception_and_send_ding";
/** 操作记录 **/
String ACTION_LOG = SystemCodeEnum.ALITA_TASK_NAME + CommonConstants.POINT + "action_log";
}

View File

@@ -1,154 +0,0 @@
package com.newyetai.common.constant;
import com.google.common.collect.Maps;
import javax.validation.constraints.NotNull;
import java.util.Map;
/**
* 系统枚举
*
* @author sr on 2020-06-02
*/
public enum SystemCodeEnum {
/**
* 业务系统,纽业态灵活就业平台
**/
ALITA_TASK(1, SystemCodeEnum.ALITA_TASK_NAME),
/**
* 结算系统,运营中台
**/
ALITA_SETTLEMENT(2, SystemCodeEnum.ALITA_SETTLEMENT_NAME),
/**
* 用户中心
**/
ALITA_USER_CENTER(3, SystemCodeEnum.ALITA_USER_CENTER_NAME),
/**
* 支付系统
**/
ALITA_PAY(4, SystemCodeEnum.ALITA_PAY_NAME),
/**
* 在线培训
**/
ALITA_CLASS(5, SystemCodeEnum.ALITA_CLASS_NAME),
/**
* 转发器
**/
ALITA_FORWARD(6, SystemCodeEnum.ALITA_FORWARD_NAME),
/**
* 风控
**/
ALITA_RISK_CONTROL(7, SystemCodeEnum.ALITA_RISK_CONTROL_NAME),
/**
* 网关
**/
ALITA_GATEWAY(8, SystemCodeEnum.ALITA_GATEWAY_NAME),
/**
* 发号器
**/
ALITA_LEAF(9, SystemCodeEnum.ALITA_LEAF_NAME),
/**
* 基础框架
**/
ALITA_FRAMEWORK(10, SystemCodeEnum.ALITA_FRAMEWORK_NAME),
/**
* CMS
**/
ALITA_CMS(11, SystemCodeEnum.ALITA_CMS_NAME),
/**
* 监管者
**/
ALITA_REGULATOR(12, SystemCodeEnum.ALITA_REGULATOR_NAME),
/**
* 招聘系统
**/
ALITA_RECRUIT(13, SystemCodeEnum.ALITA_RECRUIT_NAME),
/**
* 招聘系统小程序
*/
ALITA_RECRUIT_MINI_PROGRAM(14, SystemCodeEnum.ALITA_RECRUIT_MINI_PROGRAM_NAME),
/**
* 无卡发薪系统
*/
ALITA_UPAY_PROGRAM(15, SystemCodeEnum.ALITA_UPAY_NAME),
/** 长三角招聘 **/
ALITA_JOB(16, SystemCodeEnum.ALITA_JOB_NAME),
/** **/
ALITA_BJY(17, SystemCodeEnum.ALITA_BJY_NAME),
ALITA_BJY_UYGUR(18, SystemCodeEnum.ALITA_BJY_UYGUR_NAME),
;
public static final String ALITA_TASK_NAME = "alita-task";
public static final String ALITA_SETTLEMENT_NAME = "alita-settlement";
public static final String ALITA_USER_CENTER_NAME = "alita-user-center";
public static final String ALITA_PAY_NAME = "alita-pay";
public static final String ALITA_CLASS_NAME = "alita-class";
public static final String ALITA_FORWARD_NAME = "alita-forward";
public static final String ALITA_RISK_CONTROL_NAME = "alita-risk-control";
public static final String ALITA_GATEWAY_NAME = "alita-gateway";
public static final String ALITA_LEAF_NAME = "alita-leaf";
public static final String ALITA_FRAMEWORK_NAME = "alita-framework";
public static final String ALITA_CMS_NAME = "alita-cms";
public static final String ALITA_REGULATOR_NAME = "alita-regulator";
public static final String ALITA_RECRUIT_NAME = "alita-recruit";
public static final String ALITA_UPAY_NAME = "alita-upay";
public static final String ALITA_JOB_NAME = "alita-job";
public static final String ALITA_BJY_NAME = "alita-bjy";
public static final String ALITA_BJY_UYGUR_NAME = "alita-bjy-uygur";
public static final String ALITA_RECRUIT_MINI_PROGRAM_NAME = "alita-recruit-mini-program";
/**
* 系统名称map
**/
private static Map<String, SystemCodeEnum> systemNameMap;
static {
SystemCodeEnum[] systemCodeEnums = SystemCodeEnum.values();
systemNameMap = Maps.newHashMapWithExpectedSize(systemCodeEnums.length);
for (SystemCodeEnum systemCodeEnum : systemCodeEnums) {
systemNameMap.put(systemCodeEnum.getName(), systemCodeEnum);
}
}
/**
* 应用编号
*/
private Integer code;
/**
* 应用名称
*/
private String name;
SystemCodeEnum(Integer code, String name) {
this.code = code;
this.name = name;
}
public Integer getCode() {
return code;
}
public String getName() {
return name;
}
/**
* 根据应用名称获取应用编码
*
* @param name
* @return
*/
public static Integer getCodeByName(@NotNull String name) {
SystemCodeEnum systemCodeEnum = systemNameMap.get(name);
if (systemCodeEnum == null) {
return null;
}
return systemCodeEnum.getCode();
}
}

View File

@@ -1,22 +1,15 @@
package com.newyetai.common.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.google.common.collect.Lists;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.util.JsonUtils;
import com.newyetai.common.util.RequestUtils;
import com.newyetai.commonexport.dto.CommonExportPropertiesDTO;
import com.newyetai.commonexport.service.ExportService;
import com.newyetai.component.file.entity.FileRecord;
import com.newyetai.recruit.talent.dto.TalentDTO;
import com.newyetai.recruit.talent.dto.TalentExportDTO;
import com.newyetai.usercenter.user.dto.UserDTO;
@RestController
@@ -42,14 +35,7 @@ public class TestController {
}
@GetMapping("anon/download")
public AlitaResult<FileRecord> export() {
List<TalentExportDTO> talentExportDTOs = Lists.newArrayList(TalentExportDTO.builder()
.realName("张三").age(12).companyName("上海有限公司").cardNo("23223232").build());
return AlitaResult
.success(exportService.export(CommonExportPropertiesDTO.<TalentExportDTO>builder()
.fileName("人才信息清单").sheetName("人才信息清单").datas(talentExportDTOs).build()));
}
}

View File

@@ -1,5 +1,6 @@
package com.newyetai.common.exception.handle;
import com.newyetai.common.util.EnvironmentUtils;
import java.util.List;
import java.util.Set;
import java.util.StringJoiner;
@@ -27,7 +28,6 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
import com.newyetai.common.AlitaResult;
import com.newyetai.common.constant.CommonConstants;
import com.newyetai.common.constant.SystemCodeEnum;
import com.newyetai.common.exception.BusinessException;
import com.newyetai.common.exception.NoneLoginException;
import com.newyetai.common.exception.WithResultException;
@@ -169,7 +169,7 @@ public class GlobalControllerExceptionHandler {
.msg(ExceptionUtils.getStackTrace(ex)).build();
LogUtils.log(exceptionLogDTO);
msg = String.format("系统异常[%s#%s],请稍后重试.",
SystemCodeEnum.getCodeByName(applicationName), exceptionLogDTO.getErrNo()
EnvironmentUtils.getSystemCode(), exceptionLogDTO.getErrNo()
);
LOGGER.error("系统异常,错误号:{}", exceptionLogDTO.getErrNo());
}

View File

@@ -1,6 +1,5 @@
package com.newyetai.common.util;
import com.newyetai.common.constant.SystemCodeEnum;
import com.newyetai.common.functions.SFunction;
import java.lang.invoke.SerializedLambda;

View File

@@ -3,7 +3,6 @@ package com.newyetai.common.util;
import org.springframework.core.env.Environment;
import com.newyetai.common.constant.CommonConstants;
import com.newyetai.common.constant.SystemCodeEnum;
import com.newyetai.common.exception.util.Assert;
/**
@@ -55,7 +54,7 @@ public class EnvironmentUtils{
*/
public static Integer getSystemCode() {
if (systemCode == null) {
systemCode = SystemCodeEnum.getCodeByName(getApplicationName());
systemCode = Integer.valueOf(ENVIRONMENT.getProperty(CommonConstants.SYSTEM_CODE_KEY));
}
Assert.notNull(systemCode, "系统标识不能为空");
return systemCode;

View File

@@ -1,5 +1,6 @@
package com.newyetai.component.action.service.impl;
import com.newyetai.component.action.util.ActionUtils;
import java.util.List;
import java.util.stream.Collectors;
@@ -83,7 +84,7 @@ public class ActionServiceImpl implements ActionService , ITopicMqHandler<Action
@Override
public String getRoutingKey() {
return CommonMqConstants.ACTION_LOG;
return ActionUtils.ACTION_LOG;
}

View File

@@ -1,5 +1,6 @@
package com.newyetai.component.action.util;
import com.newyetai.common.constant.CommonConstants;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
@@ -27,6 +28,10 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ActionUtils {
/** 操作记录 **/
public static final String ACTION_LOG = "action_log";
public static void diff(Long objId, Object oldObj, Object newObj) {
if (oldObj == null || newObj == null) {
log.info("记录对象不能为空");
@@ -96,7 +101,7 @@ public class ActionUtils {
ActionCreateDTO actionCreateDTO =
ActionCreateDTO.builder().unionType(unionType).unionId(objId).detailDtos(detailCreateDTOs)
.build();
MqSendUtils.send(CommonMqConstants.ACTION_LOG, actionCreateDTO);
MqSendUtils.send(ACTION_LOG, actionCreateDTO);
} catch (Exception e) {
log.info("记录操作失败", e);
}

Some files were not shown because too many files have changed in this diff Show More