Commit 5a775628 authored by 杨锐's avatar 杨锐

后台客服处理功能 - 查询列表。人工审核。反馈跟进。API DONE。

parent 2448ea7f
......@@ -2,19 +2,20 @@ package cn.quantgroup.xyqb.controller.modifyphoneno;
import cn.quantgroup.xyqb.controller.IBaseController;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.AuditReq;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.ModifyPhoneNoQueryReq;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.Step1Req;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.Step2Req;
import cn.quantgroup.xyqb.controller.modifyphoneno.resp.ModifyPhoneNoResp;
import cn.quantgroup.xyqb.entity.ModifyPhoneNo;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.service.user.IModifyPhoneNoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
/**
* 用户手机号修改相关api
......@@ -79,16 +80,17 @@ public class ModifyPhoneNoController implements IBaseController {
*/
@ApiOperation("后台客服处理功能 - 查询列表")
@GetMapping
public JsonResult<List<ModifyPhoneNoResp>> list() {
return JsonResult.buildSuccessResult();
public JsonResult<Page<ModifyPhoneNo>> list(@Valid ModifyPhoneNoQueryReq modifyPhoneNoQueryReq) {
return JsonResult.buildSuccessResult(modifyPhoneNoService.list(modifyPhoneNoQueryReq));
}
/**
* 后台客服处理功能 - 人工审核
*/
@ApiOperation("后台客服处理功能 - 人工审核")
@PutMapping("/audit")
public JsonResult audit(AuditReq auditReq) {
@PostMapping("/audit")
public JsonResult audit(@Valid @RequestBody AuditReq auditReq) {
modifyPhoneNoService.audit(auditReq);
return JsonResult.buildSuccessResult();
}
......@@ -96,8 +98,9 @@ public class ModifyPhoneNoController implements IBaseController {
* 后台客服处理功能 - 反馈跟进
*/
@ApiOperation("后台客服处理功能 - 反馈跟进")
@PutMapping("/{id}/feedback")
@PostMapping("/{id}/feedback")
public JsonResult feedback(@PathVariable Long id) {
modifyPhoneNoService.feedback(id);
return JsonResult.buildSuccessResult();
}
......
......@@ -2,6 +2,9 @@ package cn.quantgroup.xyqb.controller.modifyphoneno.req;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotNull;
/**
* Date: 2019/11/4
......@@ -11,8 +14,11 @@ import lombok.Data;
*/
@Data
public class AuditReq {
@NotNull(message = "id不能为空")
private Long id;
@ApiModelProperty("审核状态")
@ApiModelProperty("申请状态 0处理中; 1修改完成; 2不允许修改;")
@NotNull(message = "申请状态不能为空")
@Range(min = 0, max = 2, message = "申请状态不合法。")
private Integer applyStatus;
@ApiModelProperty("申请状态补充原因")
private String applyStatusReason;
......
package cn.quantgroup.xyqb.controller.modifyphoneno.req;
import cn.quantgroup.xyqb.controller.req.Page;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
/**
* Date: 2019/11/5
* Time: 下午4:02
*
* @author: yangrui
*/
@Data
public class ModifyPhoneNoQueryReq extends Page {
/**
* 申请人旧手机号
*/
@ApiModelProperty("申请人旧手机号")
private String phoneNo;
/**
* 开始时间
*/
@ApiModelProperty("开始时间")
private String startAt;
/**
* 结束时间
*/
@ApiModelProperty("结束时间")
private String endAt;
/**
* 申请状态 0处理中; 1修改完成; 2不允许修改;
*/
@ApiModelProperty("申请状态 0处理中; 1修改完成; 2不允许修改;")
@Range(min = 0, max = 2, message = "申请状态不合法。")
private Integer applyStatus;
/**
* 处理状态 0待人工处理 1待用户反馈结果 2已反馈
*/
@ApiModelProperty("处理状态 0待人工处理; 1待用户反馈结果; 2已反馈")
@Range(min = 0, max = 2, message = "处理状态不合法。")
private Integer processingStatus;
}
package cn.quantgroup.xyqb.controller.req;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* common page
* <p>
* Date: 2019/11/5
* Time: 下午4:06
*
* @author: yangrui
*/
@Data
public class Page {
/**
* page
*/
@ApiModelProperty("zero-based page index")
@NotNull(message = "page不能为空")
private Integer page;
/**
* size
*/
@ApiModelProperty("the size of the page to be returned")
@NotNull(message = "size不能为空")
private Integer size;
}
......@@ -2,14 +2,15 @@ package cn.quantgroup.xyqb.repository;
import cn.quantgroup.xyqb.entity.ModifyPhoneNo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
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>, JpaSpecificationExecutor<ModifyPhoneNo> {
@Query(nativeQuery = true, value = "select * from user_modify_phone_no " +
"where user_id = :userId and (processing_status is null or processing_status <> :processingStatus)" +
"where user_id = :userId and (apply_status is null or apply_status = :applyStatus)" +
"limit 1")
ModifyPhoneNo findFirstByUserIdAndProcessingStatusNot(@Param("userId") Long userId,
@Param("processingStatus") Integer processingStatus);
ModifyPhoneNo findFirstByUserIdAndApplyStatus(@Param("userId") Long userId,
@Param("applyStatus") Integer applyStatus);
}
package cn.quantgroup.xyqb.service.user;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.AuditReq;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.ModifyPhoneNoQueryReq;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.Step1Req;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.Step2Req;
import cn.quantgroup.xyqb.entity.ModifyPhoneNo;
import org.springframework.data.domain.Page;
/**
* Date: 2019/11/4
......@@ -22,4 +26,10 @@ public interface IModifyPhoneNoService {
void saveStep2(Step2Req step2Req);
Integer progress(Long id);
Page<ModifyPhoneNo> list(ModifyPhoneNoQueryReq modifyPhoneNoQueryReq);
void feedback(Long id);
void audit(AuditReq auditReq);
}
......@@ -2,6 +2,8 @@ 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.AuditReq;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.ModifyPhoneNoQueryReq;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.Step1Req;
import cn.quantgroup.xyqb.controller.modifyphoneno.req.Step2Req;
import cn.quantgroup.xyqb.controller.modifyphoneno.resp.UserLoanStatusResp;
......@@ -11,14 +13,24 @@ 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.IUserService;
import cn.quantgroup.xyqb.util.DateUtilsV1;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import javax.persistence.criteria.*;
import java.util.List;
/**
* Date: 2019/11/4
......@@ -38,6 +50,8 @@ public class ModifyPhoneNoServiceImpl implements IModifyPhoneNoService {
private ISmsService smsService;
@Resource
private RestTemplate restTemplate;
@Resource
private IUserService userService;
@Value("${api.https}")
public String apiHttps;
......@@ -84,7 +98,7 @@ public class ModifyPhoneNoServiceImpl implements IModifyPhoneNoService {
*/
@Override
public Integer progress(Long id) {
ModifyPhoneNo modifyPhoneNo = modifyPhoneNoRepository.findFirstByUserIdAndProcessingStatusNot(id, ModifyPhoneNoProcessingStatusEnum.DONE.getType());
ModifyPhoneNo modifyPhoneNo = modifyPhoneNoRepository.findFirstByUserIdAndApplyStatus(id, ModifyPhoneNoApplyStatusEnum.INIT.getType());
if (modifyPhoneNo == null) {
return 0;
}
......@@ -97,6 +111,70 @@ public class ModifyPhoneNoServiceImpl implements IModifyPhoneNoService {
return -1;
}
@Override
public Page<ModifyPhoneNo> list(ModifyPhoneNoQueryReq modifyPhoneNoQueryReq) {
Sort.Order order = new Sort.Order(Sort.Direction.DESC, "id");
Sort sort = new Sort(order);
Pageable pageable = new PageRequest(modifyPhoneNoQueryReq.getPage() - 1, modifyPhoneNoQueryReq.getSize(), sort);
Specification<ModifyPhoneNo> specification = new Specification<ModifyPhoneNo>() {
@Override
public Predicate toPredicate(Root<ModifyPhoneNo> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> list = Lists.newArrayList();
if (StringUtils.isNotBlank(modifyPhoneNoQueryReq.getPhoneNo())) {
list.add(criteriaBuilder.equal(root.get("prevPhoneNo"), modifyPhoneNoQueryReq.getPhoneNo()));
}
if (StringUtils.isNotBlank(modifyPhoneNoQueryReq.getStartAt())) {
list.add(criteriaBuilder.greaterThanOrEqualTo(root.get("createAt"), DateUtilsV1.strToDate(modifyPhoneNoQueryReq.getStartAt(), DateUtilsV1.YMD_FORMAT)));
}
if (StringUtils.isNotBlank(modifyPhoneNoQueryReq.getEndAt())) {
list.add(criteriaBuilder.lessThanOrEqualTo(root.get("createAt"), DateUtilsV1.strToDate(modifyPhoneNoQueryReq.getEndAt(), DateUtilsV1.YMD_FORMAT)));
}
if (modifyPhoneNoQueryReq.getApplyStatus() != null) {
list.add(criteriaBuilder.equal(root.get("applyStatus"), modifyPhoneNoQueryReq.getApplyStatus()));
}
if (modifyPhoneNoQueryReq.getProcessingStatus() != null) {
list.add(criteriaBuilder.equal(root.get("processingStatus"), modifyPhoneNoQueryReq.getProcessingStatus()));
}
Predicate[] arr = new Predicate[list.size()];
return criteriaBuilder.and(list.toArray(arr));
}
};
return modifyPhoneNoRepository.findAll(specification, pageable);
}
/**
* @param id user_modify_phone_no.id
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void feedback(Long id) {
ModifyPhoneNo modifyPhoneNo = modifyPhoneNoRepository.findOne(id);
if (modifyPhoneNo == null) {
throw new DataException("数据不存在。");
}
modifyPhoneNo.setProcessingStatus(ModifyPhoneNoProcessingStatusEnum.DONE.getType());
}
@Override
@Transactional(rollbackFor = Exception.class)
public void audit(AuditReq auditReq) {
ModifyPhoneNo modifyPhoneNo = modifyPhoneNoRepository.findOne(auditReq.getId());
if (modifyPhoneNo == null) {
throw new DataException("数据不存在。");
}
if (ModifyPhoneNoApplyStatusEnum.NO_ALLOW.getType() == auditReq.getApplyStatus()) {
modifyPhoneNo.setApplyStatus(ModifyPhoneNoApplyStatusEnum.NO_ALLOW.getType());
modifyPhoneNo.setApplyStatusReason(auditReq.getApplyStatusReason());
}
if (ModifyPhoneNoApplyStatusEnum.DONE.getType() == auditReq.getApplyStatus()) {
allowModifyHttp(modifyPhoneNo.getUserId());
userService.modifyPhoneNo(modifyPhoneNo.getPrevPhoneNo(), modifyPhoneNo.getCurPhoneNo());
modifyPhoneNo.setApplyStatus(ModifyPhoneNoApplyStatusEnum.DONE.getType());
}
}
/**
* 验证用户是否允许修改手机号
* <p>
......@@ -115,7 +193,7 @@ public class ModifyPhoneNoServiceImpl implements IModifyPhoneNoService {
* @return
*/
public void allowModify(Long id, String name, String idCard, String prevPhoneNo, String curPhoneNo, String smsCode) {
if (modifyPhoneNoRepository.findFirstByUserIdAndProcessingStatusNot(id, ModifyPhoneNoProcessingStatusEnum.DONE.getType()) != null) {
if (modifyPhoneNoRepository.findFirstByUserIdAndApplyStatus(id, ModifyPhoneNoProcessingStatusEnum.INIT.getType()) != null) {
throw new DataException("已存在处理中的申请单,不支持再次更换。");
}
if (userDetailRepository.findByUserIdAndPhoneNoAndNameAndIdNo(id, prevPhoneNo, name, idCard) == null) {
......@@ -127,6 +205,10 @@ public class ModifyPhoneNoServiceImpl implements IModifyPhoneNoService {
if (!smsService.verifyPhoneAndCode(curPhoneNo, smsCode)) {
throw new DataException("验证码不正确。");
}
allowModifyHttp(id);
}
public void allowModifyHttp(Long id) {
log.info("allowModify userId = 【{}】", id);
UserLoanStatusResp userLoanStatusResp = restTemplate.getForObject(apiHttps + "?userId=" + id, UserLoanStatusResp.class);
log.info("allowModify userLoanStatusResp = 【{}】", userLoanStatusResp);
......
......@@ -5,6 +5,7 @@ import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserDetail;
import cn.quantgroup.xyqb.entity.UserHashMapping;
import cn.quantgroup.xyqb.event.PhoneNoUpdateEvent;
import cn.quantgroup.xyqb.exception.DataException;
import cn.quantgroup.xyqb.model.UserInfo;
import cn.quantgroup.xyqb.repository.IUserHashMappingRepository;
import cn.quantgroup.xyqb.repository.IUserRepository;
......@@ -214,12 +215,12 @@ public class UserServiceImpl implements IUserService {
User newPhoneUser = userRepository.findByPhoneNo(newPhoneNo);
if (Objects.nonNull(newPhoneUser)) {
//新手机号已存在
return null;
throw new DataException("新手机号已存在。");
}
User oldPhoneUser = userRepository.findByPhoneNo(oldPhoneNo);
if (Objects.isNull(oldPhoneUser)) {
//这不是扯了.旧手机号不存在.
return null;
throw new DataException("旧手机号不存在。");
}
//2. 执行修改
//2.1 修改 user 表
......
package cn.quantgroup.xyqb.util;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.util.Date;
/**
*
*
* Date: 2019/11/5
* Time: 下午5:07
*
* @author: yangrui
*/
public class DateUtilsV1 {
public static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String YMD_FORMAT = "yyyy-MM-dd";
public static Date strToDate(String dateTimeStr, String formatStr) {
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(formatStr);
DateTime dateTime = dateTimeFormatter.parseDateTime(dateTimeStr);
return dateTime.toDate();
}
public static String dateToStr(Date date, String formatStr) {
if (date == null) {
return StringUtils.EMPTY;
}
DateTime dateTime = new DateTime(date);
return dateTime.toString(formatStr);
}
public static int daysBetween(DateTime fromDate, DateTime toDate) {
return Days.daysBetween(fromDate, toDate).getDays();
}
public static void main(String[] args) {
}
}
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