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 { ...@@ -151,4 +151,11 @@ public class ExceptionHandlingController implements IBaseController {
} }
return null; 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 { ...@@ -50,6 +50,9 @@ public class ModifyPhoneNoController implements IBaseController {
/** /**
* step_2 * step_2
*
* @param step2Req
* @return
*/ */
@ApiOperation("step_2") @ApiOperation("step_2")
@PostMapping("/step_2") @PostMapping("/step_2")
......
...@@ -25,7 +25,7 @@ public class ModifyPhoneNoResp { ...@@ -25,7 +25,7 @@ public class ModifyPhoneNoResp {
@ApiModelProperty("申请人现手机号") @ApiModelProperty("申请人现手机号")
private String curPhoneNo; private String curPhoneNo;
@ApiModelProperty("申请时间") @ApiModelProperty("申请时间")
private Date createAt; private Date createdAt;
@ApiModelProperty("申请结果") @ApiModelProperty("申请结果")
private Integer applyStatus; private Integer applyStatus;
@ApiModelProperty("拒绝原因") @ApiModelProperty("拒绝原因")
...@@ -33,5 +33,11 @@ public class ModifyPhoneNoResp { ...@@ -33,5 +33,11 @@ public class ModifyPhoneNoResp {
@ApiModelProperty("处理状态") @ApiModelProperty("处理状态")
private Integer processStatus; private Integer processStatus;
@ApiModelProperty("最近更新时间") @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; ...@@ -2,7 +2,14 @@ package cn.quantgroup.xyqb.repository;
import cn.quantgroup.xyqb.entity.ModifyPhoneNo; import cn.quantgroup.xyqb.entity.ModifyPhoneNo;
import org.springframework.data.jpa.repository.JpaRepository; 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> { 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; ...@@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
...@@ -52,6 +53,7 @@ public interface IUserDetailRepository extends JpaRepository<UserDetail, Long>, ...@@ -52,6 +53,7 @@ public interface IUserDetailRepository extends JpaRepository<UserDetail, Long>,
/** /**
* 按照身份证号和手机号 - 模糊查询 * 按照身份证号和手机号 - 模糊查询
*
* @param phoneNo - 手机号 * @param phoneNo - 手机号
* @param idNo - 身份证号 * @param idNo - 身份证号
* @return List<UserDetail> * @return List<UserDetail>
...@@ -65,4 +67,10 @@ public interface IUserDetailRepository extends JpaRepository<UserDetail, Long>, ...@@ -65,4 +67,10 @@ public interface IUserDetailRepository extends JpaRepository<UserDetail, Long>,
List<UserDetail> findByIdBetween(Long id, Long endId); 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; 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.Step1Req;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.Step2Req; 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.entity.ModifyPhoneNo;
import cn.quantgroup.xyqb.exception.DataException;
import cn.quantgroup.xyqb.repository.IModifyPhoneNoRepository; 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 cn.quantgroup.xyqb.service.user.IModifyPhoneNoService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource; import javax.annotation.Resource;
...@@ -23,14 +31,28 @@ public class ModifyPhoneNoServiceImpl implements IModifyPhoneNoService { ...@@ -23,14 +31,28 @@ public class ModifyPhoneNoServiceImpl implements IModifyPhoneNoService {
@Resource @Resource
private IModifyPhoneNoRepository modifyPhoneNoRepository; 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 * @param step1Req
* @return
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long saveStep1(Long id, Step1Req step1Req) { 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 modifyPhoneNo = Step1Req.adapt(step1Req);
modifyPhoneNo.setUserId(id); modifyPhoneNo.setUserId(id);
modifyPhoneNoRepository.saveAndFlush(modifyPhoneNo); modifyPhoneNoRepository.saveAndFlush(modifyPhoneNo);
...@@ -43,10 +65,49 @@ public class ModifyPhoneNoServiceImpl implements IModifyPhoneNoService { ...@@ -43,10 +65,49 @@ public class ModifyPhoneNoServiceImpl implements IModifyPhoneNoService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void saveStep2(Step2Req step2Req) { public void saveStep2(Step2Req step2Req) {
// TODO: 2019/11/4 申请状态、处理状态修改
ModifyPhoneNo modifyPhoneNo = modifyPhoneNoRepository.findOne(step2Req.getId()); ModifyPhoneNo modifyPhoneNo = modifyPhoneNoRepository.findOne(step2Req.getId());
modifyPhoneNo.setIdCardFaceUrl(step2Req.getIdCardFaceUrl()); modifyPhoneNo.setIdCardFaceUrl(step2Req.getIdCardFaceUrl());
modifyPhoneNo.setIdCardRearUrl(step2Req.getIdCardRearUrl()); modifyPhoneNo.setIdCardRearUrl(step2Req.getIdCardRearUrl());
modifyPhoneNo.setIdCardHoldUrl(step2Req.getIdCardHoldUrl()); 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