Commit 097be491 authored by 杨锐's avatar 杨锐

app - 申请修改手机号Step_1,Step_2 DONE

parent bd86a057
package cn.quantgroup.user.enums;
import lombok.Getter;
/**
* 用户手机号修改申请状态
* <p>
* Date: 2019/11/5
* Time: 下午2:11
*
* @author: yangrui
*/
@Getter
public enum ModifyPhoneNoApplyStatusEnum {
/**
* 处理中
*/
INIT(0, "处理中"),
/**
* 修改完成
*/
DONE(1, "修改完成"),
/**
* 不允许修改
*/
NO_ALLOW(2, "不允许修改");
/**
* 类型
*/
private int type;
/**
* 描述
*/
private String desc;
ModifyPhoneNoApplyStatusEnum(int type, String desc) {
this.type = type;
this.desc = desc;
}
public static String getDesc(int type) {
for (ModifyPhoneNoApplyStatusEnum modifyPhoneNoApplyStatusEnum : ModifyPhoneNoApplyStatusEnum.values()) {
if (modifyPhoneNoApplyStatusEnum.type == type) {
return modifyPhoneNoApplyStatusEnum.desc;
}
}
return null;
}
}
package cn.quantgroup.user.enums;
import lombok.Getter;
/**
* 用户手机号修改处理状态
* <p>
* Date: 2019/11/5
* Time: 下午2:11
*
* @author: yangrui
*/
@Getter
public enum ModifyPhoneNoProcessingStatusEnum {
/**
* 待人工处理
*/
INIT(0, "待人工处理"),
/**
* 待用户反馈
*/
WAIT_4_USER_FEEDBACK(1, "待用户反馈"),
/**
* 已反馈
*/
DONE(2, "已反馈");
/**
* 类型
*/
private int type;
/**
* 描述
*/
private String desc;
ModifyPhoneNoProcessingStatusEnum(int type, String desc) {
this.type = type;
this.desc = desc;
}
public static String getDesc(int type) {
for (ModifyPhoneNoProcessingStatusEnum modifyPhoneNoProcessingStatusEnum : ModifyPhoneNoProcessingStatusEnum.values()) {
if (modifyPhoneNoProcessingStatusEnum.type == type) {
return modifyPhoneNoProcessingStatusEnum.desc;
}
}
return null;
}
}
package cn.quantgroup.xyqb.config.http;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
/**
* rest
* <p>
* Date: 2019/11/5
* Time: 上午11:37
*
* @author: yangrui
*/
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setConnectTimeout(60 * 1000);
requestFactory.setReadTimeout(60 * 1000);
RestTemplate restTemplate = new RestTemplate(requestFactory);
return restTemplate;
}
}
......@@ -151,4 +151,11 @@ public class ExceptionHandlingController implements IBaseController {
}
return null;
}
@ExceptionHandler(DataException.class)
@ResponseBody
@ResponseStatus(HttpStatus.OK)
public JsonResult handleDataException(DataException e) {
return JsonResult.buildErrorStateResult(e.getMessage(), null);
}
}
......@@ -50,6 +50,9 @@ public class ModifyPhoneNoController implements IBaseController {
/**
* step_2
*
* @param step2Req
* @return
*/
@ApiOperation("step_2")
@PostMapping("/step_2")
......
......@@ -25,7 +25,7 @@ public class ModifyPhoneNoResp {
@ApiModelProperty("申请人现手机号")
private String curPhoneNo;
@ApiModelProperty("申请时间")
private Date createAt;
private Date createdAt;
@ApiModelProperty("申请结果")
private Integer applyStatus;
@ApiModelProperty("拒绝原因")
......@@ -33,5 +33,11 @@ public class ModifyPhoneNoResp {
@ApiModelProperty("处理状态")
private Integer processStatus;
@ApiModelProperty("最近更新时间")
private Date updateAt;
private Date updatedAt;
@ApiModelProperty("身份证正面")
private String idCardFaceUrl;
@ApiModelProperty("身份证背面")
private String idCardRearUrl;
@ApiModelProperty("本人手持身份证照片")
private String idCardHoldUrl;
}
package cn.quantgroup.xyqb.controller.modifyphoneno.resp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* Date: 2019/11/5
* Time: 上午11:49
*
* @author: yangrui
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserLoanStatusResp {
private boolean bizSuc;
private String businessCode;
private String code;
/**
* true:没有订单; false: 存在订单
*/
private boolean data;
private String msg;
private boolean success;
}
package cn.quantgroup.xyqb.exception;
/**
* 数据异常
* <p>
* Date: 2019/11/5
* Time: 上午11:01
*
* @author: yangrui
*/
public class DataException extends RuntimeException {
public DataException(String message) {
super(message);
}
}
......@@ -2,7 +2,14 @@ package cn.quantgroup.xyqb.repository;
import cn.quantgroup.xyqb.entity.ModifyPhoneNo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
public interface IModifyPhoneNoRepository extends JpaRepository<ModifyPhoneNo, Long> {
@Query(nativeQuery = true, value = "select * from user_modify_phone_no " +
"where user_id = :userId and (processing_status is null or processing_status <> :processingStatus)" +
"limit 1")
ModifyPhoneNo findFirstByUserIdAndProcessingStatusNot(@Param("userId") Long userId,
@Param("processingStatus") Integer processingStatus);
}
......@@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
......@@ -52,8 +53,9 @@ public interface IUserDetailRepository extends JpaRepository<UserDetail, Long>,
/**
* 按照身份证号和手机号 - 模糊查询
*
* @param phoneNo - 手机号
* @param idNo - 身份证号
* @param idNo - 身份证号
* @return List<UserDetail>
*/
@Query(value = "select * from user_detail where phone_no like ?1 and id_no like ?2", nativeQuery = true)
......@@ -65,4 +67,10 @@ public interface IUserDetailRepository extends JpaRepository<UserDetail, Long>,
List<UserDetail> findByIdBetween(Long id, Long endId);
@Query(nativeQuery = true, value = "select * from user_detail where user_id = ?1 and phone_no = ?2 " +
"and name = ?3 and id_no = ?4 limit 1")
UserDetail findByUserIdAndPhoneNoAndNameAndIdNo(Long userId, String phoneNo, String name, String idNo);
@Query(nativeQuery = true, value = "select * from user_detail where phone_no =:phoneNo limit 1")
UserDetail findOneByPhoneNo(@Param("phoneNo") String phoneNo);
}
package cn.quantgroup.xyqb.service.user.impl;
import cn.quantgroup.user.enums.ModifyPhoneNoApplyStatusEnum;
import cn.quantgroup.user.enums.ModifyPhoneNoProcessingStatusEnum;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.Step1Req;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.Step2Req;
import cn.quantgroup.xyqb.controller.modifyphoneno.resp.UserLoanStatusResp;
import cn.quantgroup.xyqb.entity.ModifyPhoneNo;
import cn.quantgroup.xyqb.exception.DataException;
import cn.quantgroup.xyqb.repository.IModifyPhoneNoRepository;
import cn.quantgroup.xyqb.repository.IUserDetailRepository;
import cn.quantgroup.xyqb.service.sms.ISmsService;
import cn.quantgroup.xyqb.service.user.IModifyPhoneNoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
......@@ -23,14 +31,28 @@ public class ModifyPhoneNoServiceImpl implements IModifyPhoneNoService {
@Resource
private IModifyPhoneNoRepository modifyPhoneNoRepository;
@Resource
private IUserDetailRepository userDetailRepository;
@Resource
private ISmsService smsService;
@Resource
private RestTemplate restTemplate;
@Value("${api.https}")
public String apiHttps;
/**
* @param id user.id
* @param step1Req
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Long saveStep1(Long id, Step1Req step1Req) {
// TODO: 2019/11/4 并发访问 && 校验规则
// TODO: 2019/11/4 并发访问
allowModify(id, step1Req.getName(), step1Req.getIdCard(), step1Req.getPrevPhoneNo(), step1Req.getCurPhoneNo(),
step1Req.getSmsCode());
ModifyPhoneNo modifyPhoneNo = Step1Req.adapt(step1Req);
modifyPhoneNo.setUserId(id);
modifyPhoneNoRepository.saveAndFlush(modifyPhoneNo);
......@@ -43,10 +65,49 @@ public class ModifyPhoneNoServiceImpl implements IModifyPhoneNoService {
@Override
@Transactional(rollbackFor = Exception.class)
public void saveStep2(Step2Req step2Req) {
// TODO: 2019/11/4 申请状态、处理状态修改
ModifyPhoneNo modifyPhoneNo = modifyPhoneNoRepository.findOne(step2Req.getId());
modifyPhoneNo.setIdCardFaceUrl(step2Req.getIdCardFaceUrl());
modifyPhoneNo.setIdCardRearUrl(step2Req.getIdCardRearUrl());
modifyPhoneNo.setIdCardHoldUrl(step2Req.getIdCardHoldUrl());
modifyPhoneNo.setApplyStatus(ModifyPhoneNoApplyStatusEnum.INIT.getType());
modifyPhoneNo.setProcessingStatus(ModifyPhoneNoProcessingStatusEnum.INIT.getType());
}
/**
* 验证用户是否允许修改手机号
* <p>
* 校验用户填写的原手机号对应的用户姓名、用户身份证是否和用户中心已有信息一致。若不一致,不允许修改。
* 新手机号是否在用户中心已存在,若已存在,不允许修改。
* 用户有审核中和放款中的订单,不允许修改。
* 用户有还款中的订单,不允许修改。
* </p>
*
* @param id user.id
* @param name 注册人真实姓名
* @param idCard 注册人身份证件号
* @param prevPhoneNo 当前手机号码
* @param curPhoneNo 新手机号码
* @param smsCode 新手机号码短信验证码
* @return
*/
public void allowModify(Long id, String name, String idCard, String prevPhoneNo, String curPhoneNo, String smsCode) {
if (modifyPhoneNoRepository.findFirstByUserIdAndProcessingStatusNot(id, ModifyPhoneNoProcessingStatusEnum.DONE.getType()) != null) {
throw new DataException("已存在处理中的申请单,不支持再次更换。");
}
if (userDetailRepository.findByUserIdAndPhoneNoAndNameAndIdNo(id, prevPhoneNo, name, idCard) == null) {
throw new DataException("姓名、身份证、电话号不符。");
}
if (userDetailRepository.findOneByPhoneNo(curPhoneNo) != null) {
throw new DataException("新手机号已存在,不支持更换。");
}
if (!smsService.verifyPhoneAndCode(curPhoneNo, smsCode)) {
throw new DataException("验证码不正确。");
}
log.info("allowModify userId = 【{}】", id);
UserLoanStatusResp userLoanStatusResp = restTemplate.getForObject(apiHttps + "?userId=" + id, UserLoanStatusResp.class);
log.info("allowModify userLoanStatusResp = 【{}】", userLoanStatusResp);
if (!userLoanStatusResp.isSuccess() || !userLoanStatusResp.isData()) {
throw new DataException("用户存在订单,不支持修改。");
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment