package com.nova.sankuai.service.impl;
|
|
import cn.hutool.core.date.DateTime;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.IdUtil;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.nova.sankuai.domain.api.yangqianguan.MoneyPotResultJson;
|
import com.nova.sankuai.domain.api.yangqianguan.YqgResultCode;
|
import com.nova.sankuai.domain.api.yangqianguan.YqgUtil;
|
import com.nova.sankuai.domain.api.yangqianguan.dto.*;
|
import com.nova.sankuai.domain.api.yangqianguan.response.*;
|
import com.nova.sankuai.domain.api.yangqianguan.vo.ContractVo;
|
import com.nova.sankuai.domain.api.yangqianguan.vo.*;
|
import com.nova.sankuai.domain.api.yixin.YXUtil;
|
import com.nova.sankuai.domain.api.yixin.dto.*;
|
import com.nova.sankuai.domain.api.yixin.response.*;
|
import com.nova.sankuai.domain.api.yixin.vo.RepayVo;
|
import com.nova.sankuai.domain.api.yixin.vo.YxpkgListVo;
|
import com.nova.sankuai.domain.entity.*;
|
import com.nova.sankuai.domain.enums.SourceTypeEnum;
|
import com.nova.sankuai.domain.enums.capitalInfo.*;
|
import com.nova.sankuai.domain.enums.vipservice.PayTypeEnum;
|
import com.nova.sankuai.domain.enums.vipservice.VipCardOrderEnum;
|
import com.nova.sankuai.domain.vo.sysuser.MechanismVo;
|
import com.nova.sankuai.infra.config.AlipayConfigProperties;
|
import com.nova.sankuai.infra.config.CommonException;
|
import com.nova.sankuai.infra.mapper.*;
|
import com.nova.sankuai.infra.utils.ConstantsUtil;
|
import com.nova.sankuai.infra.utils.RsaSecretUtils;
|
import com.nova.sankuai.service.*;
|
import io.swagger.annotations.ApiModelProperty;
|
import lombok.AllArgsConstructor;
|
import org.apache.commons.lang.StringUtils;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.util.DigestUtils;
|
|
import java.net.URLEncoder;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* @Description 洋钱罐Service
|
* @Author CWR
|
* @Date 2022/4/23 11:59
|
*/
|
@Service
|
@AllArgsConstructor
|
public class MoneyPotServiceImpl implements IMoneyPotService {
|
|
private YXUtil yxUtil;
|
|
private CustomerUserMapper customerUserMapper;
|
|
private YqgUtil yqgUtil;
|
|
private SysUserMapper sysUserMapper;
|
|
private ICityService cityService;
|
|
private CustomerMapper customerMapper;
|
|
private ICapitalInfoService capitalInfoService;
|
|
private CustomerCapitalResultMapper customerCapitalResultMapper;
|
|
private YqgRepayOrderMapper yqgRepayOrderMapper;
|
|
private YqgRepayOrderDetailMapper yqgRepayOrderDetailMapper;
|
|
private IYiXinService yiXinService;
|
|
private static final Logger log = LoggerFactory.getLogger("yqgLogger");
|
|
@ApiModelProperty(value = "资方机构-金钱天下,目前仅洋钱罐对接")
|
private static final String funding = "JQTX";
|
|
private final IYqgRepayOrderService yqgRepayOrderService;
|
|
private final ChannelInfoMapper channelInfoMapper;
|
|
private final VipCardMapper vipCardMapper;
|
|
private final AlipayConfigProperties alipayConf;
|
|
private final RsaSecretUtils rsaSecretUtils;
|
|
private final VipCardOrderMapper vipCardOrderMapper;
|
|
@Override
|
public MoneyPotResultJson userQualificationCheck(UserCheckDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地授信初筛开始,原始参数:" + dto.toString());
|
UserCheckResponse response = new UserCheckResponse();
|
CustomerUser customerUser = customerUserMapper.selectOne(Wrappers.<CustomerUser>lambdaQuery()
|
.eq(CustomerUser::getPhoneMd5, dto.getPhoneMd5()));
|
if (customerUser == null) {
|
UUID uuid = UUID.randomUUID();
|
String creditNo = uuid.toString().replace("-", "");
|
String userId = "" + IdUtil.getSnowflake().nextId();
|
YxApplyCheckResponse yxCheckResponse = yxUtil.yxApplyCheckMd5(creditNo, dto.getIdentityNumberMd5(), dto.getPhoneMd5(), userId, funding, log, logNumber);
|
if (yxCheckResponse != null) {
|
// 请求成功并且准入
|
if (yxCheckResponse.isSuccess() && "01".equals(yxCheckResponse.getApprovalResult())) {
|
response.setCanLoan(UserCheckResponse.CAN_SUCCESS);
|
} else {
|
response.setCanLoan(UserCheckResponse.CAN_FAIL);
|
response.setRejectReason(UserCheckResponse.REASON_1);
|
}
|
}
|
} else {
|
response.setCanLoan(UserCheckResponse.CAN_FAIL);
|
response.setRejectReason(UserCheckResponse.REASON_4);
|
}
|
return MoneyPotResultJson.success(response);
|
}
|
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public MoneyPotResultJson creditApply(CreditApplyDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
List<CustomerUser> customerUsers = customerUserMapper.selectList(Wrappers.<CustomerUser>lambdaQuery()
|
.eq(CustomerUser::getPhone, dto.getBasicInfo().getMobile()));
|
if (customerUsers != null && customerUsers.size() > 0) {
|
log.error("日志编号:" + logNumber + "洋钱罐-绿地授信申请失败,该用户已存在:" + dto.toString());
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "该用户已存在,禁止授信进件");
|
}
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地授信申请开始,原始参数:" + dto.toString());
|
//客户申请记录字段映射
|
Customer customer;
|
try {
|
customer = dto.parseCustomer();
|
//图片URL转换
|
String idCardFrontPath = yqgUtil.getImageUrl(customer.getCreditNo(), dto.getIdInfo().getFrontImage(), log, logNumber);
|
String idCardBackPath = yqgUtil.getImageUrl(customer.getCreditNo(), dto.getIdInfo().getBackImage(), log, logNumber);
|
String facePhotoPath = yqgUtil.getImageUrl(customer.getCreditNo(), dto.getLivingInfo().getImageBest(), log, logNumber);
|
|
if (idCardFrontPath == null || idCardBackPath == null || facePhotoPath == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "授信图片无效,转换出错");
|
}
|
customer.setIdCardFrontPath(idCardFrontPath);
|
customer.setIdCardBackPath(idCardBackPath);
|
customer.setFacePhotoPath(facePhotoPath);
|
//机构及城市字段赋值
|
MechanismVo mechanismVo = sysUserMapper.selectDefaultMechanism();
|
customer.setMechanismId(mechanismVo.getId());
|
City city = cityService.lambdaQuery().eq(City::getName, customer.getLiveProvince()).one();
|
if (city != null) {
|
customer.setCity(city.getCityId());
|
customer.setCityName(city.getName());
|
} else {
|
customer.setCity("110100000000");
|
customer.setCityName("北京市");
|
}
|
} catch (Exception e) {
|
log.error("日志编号:" + logNumber + "洋钱罐-绿地授信申请参数转换失败", e);
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "授信申请参数缺失");
|
}
|
|
//注册用户信息-基本资料
|
CustomerUser customerUser = new CustomerUser();
|
customerUser.setName(customer.getName());
|
customerUser.setPhone(customer.getPhone());
|
customerUser.setCreationDate(customer.getApplyDate());
|
customerUser.setSourceChannel(customer.getSourceChannel());
|
customerUser.setPhoneMd5(DigestUtils.md5DigestAsHex(customer.getPhone().getBytes()));
|
customerUser.setNameMd5(DigestUtils.md5DigestAsHex(customer.getName().getBytes()));
|
customerUser.setIdCardMd5(DigestUtils.md5DigestAsHex(customer.getIdCard().getBytes()));
|
//注册用户信息-更新用户审核时间
|
DateTime approvalTime = DateUtil.offsetMinute(new Date(), 300);
|
DateTime nextApplyTime = DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), Customer.VALID_DAY));
|
customerUser.setApprovalTime(approvalTime);
|
customerUser.setNextApplyTime(nextApplyTime);
|
customerUser.setFirstQuota(VipCardOrderServiceImpl.randomQuota());
|
customerUser.setVipQuota(VipCardOrderServiceImpl.randomVipQuota(customerUser.getFirstQuota()));
|
customerUser.setShowActivationPage(true);
|
customerUser.setCreditNo(customer.getCreditNo());
|
customerUser.setThirdUserId(customer.getYqgUserId());
|
//注册用户信息-保存用户
|
customerUserMapper.insert(customerUser);
|
|
customer.setCustomerUserId(customerUser.getId());
|
//保存申请记录
|
customerMapper.insert(customer);
|
|
//保存资方对接信息
|
CustomerCapitalResult capitalResult = new CustomerCapitalResult();
|
capitalResult.setCustomerUserId(customerUser.getId());
|
capitalResult.setCustomerRecordId(customer.getId());
|
capitalResult.setStatus(CapitalInfoStatusEnum.APPLY_WAIT.getCode());
|
capitalResult.setCheckResult(CustomerCapitalResult.CHECK_SUCCESS);
|
CapitalInfo capitalInfo = capitalInfoService.lambdaQuery()
|
.eq(CapitalInfo::getCode, CapitalInfoTypeCodeEnum.JIN_QIAN_TIAN_XIA.getCode()).one();
|
capitalResult.setCapitalInfoId(capitalInfo.getId());
|
capitalResult.setCapitalInfoCode(capitalInfo.getCode());
|
capitalResult.setCreationDate(new Date());
|
capitalResult.setYqgUserId(customer.getYqgUserId());
|
capitalResult.setLastUpdatedDate(new Date());
|
capitalResult.setCreditNo(customer.getCreditNo());
|
capitalResult.setStatus(CapitalResultStatusEnum.APPLY.getCode());
|
capitalResult.setCapitalResultSourceCode(CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode());
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地授信申请,授信申请推送开始");
|
YXResponse yxResponse = yxUtil.yxCreditApply(customer, customerUser.getId().toString(), funding, log, logNumber);
|
if (yxResponse != null) {
|
if (yxResponse.isSuccess()) {
|
capitalResult.setApprovalResult(CapitalApprovalResultEnum.APPROVAL_WAIT.getCode());
|
} else {
|
capitalResult.setApprovalResult(CapitalApprovalResultEnum.APPROVAL_REQUEST_FAIL.getCode());
|
}
|
} else {
|
log.error("日志编号:" + logNumber + "洋钱罐-绿地对接,绿地授信申请返回结果为空");
|
throw new CommonException("系统异常");
|
}
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地授信申请,授信申请推送结束");
|
customerCapitalResultMapper.insert(capitalResult);
|
if (CapitalApprovalResultEnum.APPROVAL_WAIT.getCode().equals(capitalResult.getApprovalResult())) {
|
CreditApplyResponse response = new CreditApplyResponse();
|
response.setAgencyCreditNo(customer.getCreditNo());
|
return MoneyPotResultJson.success(response);
|
} else {
|
return MoneyPotResultJson.error(YqgResultCode.PUSH_ORDER_FAIL, "推单失败,审批拒绝");
|
}
|
}
|
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public MoneyPotResultJson creditResult(CreditDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地授信结果查询开始,原始参数:" + dto.toString());
|
CreditResultResponse creditResultResponse = new CreditResultResponse();
|
creditResultResponse.setCreditNo(dto.getCreditNo());
|
creditResultResponse.setRemark("");
|
CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.<CustomerCapitalResult>lambdaQuery()
|
.eq(CustomerCapitalResult::getCreditNo, dto.getCreditNo())
|
.eq(CustomerCapitalResult::getCapitalResultSourceCode, CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode())
|
.eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.JIN_QIAN_TIAN_XIA.getCode()));
|
if (capitalResult == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "授信编号不存在");
|
}
|
if (CapitalResultStatusEnum.APPLY.getCode().equals(capitalResult.getStatus())
|
&& CapitalApprovalResultEnum.APPROVAL_WAIT.getCode().equals(capitalResult.getApprovalResult())) {
|
//当数据处于授信状态且授信申请结果为等待中时,主动查询绿地授信审批结果
|
YXAuditResponse yxAuditResponse = yxUtil.yxGetCreditAudit(capitalResult.getCustomerUserId().toString(), capitalResult.getCreditNo(), funding, log, logNumber);
|
if (yxAuditResponse != null) {
|
if (yxAuditResponse.isSuccess()) {
|
if (capitalResult != null) {
|
capitalResult = yiXinService.updateByApprovalReturn(capitalResult, yxAuditResponse);
|
}
|
} else {
|
log.error("日志编号:" + logNumber + "洋钱罐-绿地授信结果查询失败,错误原因:请求失败" + yxAuditResponse);
|
throw new CommonException("系统异常");
|
}
|
} else {
|
log.error("日志编号:" + logNumber + "洋钱罐-绿地授信结果查询失败,错误原因:请求返回为空");
|
throw new CommonException("系统异常");
|
}
|
}
|
CreditResultResponse response = CreditResultResponse.parse(capitalResult);
|
return MoneyPotResultJson.success(response);
|
}
|
|
|
@Override
|
public MoneyPotResultJson creditLimit(CreditDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地授信额度查询开始,原始参数:" + dto.toString());
|
CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.<CustomerCapitalResult>lambdaQuery()
|
.eq(CustomerCapitalResult::getCreditNo, dto.getCreditNo())
|
.eq(CustomerCapitalResult::getCapitalResultSourceCode, CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode())
|
.eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.JIN_QIAN_TIAN_XIA.getCode()));
|
if (capitalResult == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "授信编号不存在");
|
}
|
if (CapitalApprovalResultEnum.APPROVAL_SUCCESS.getCode().equals(capitalResult.getApprovalResult())) {
|
CreditLimitSuccessResponse successResponse = new CreditLimitSuccessResponse();
|
successResponse.setCreditNo(dto.getCreditNo());
|
successResponse.setStatus(CreditLimitResponse.STATUS_SUCCESS);
|
successResponse.setRemark("");
|
TermVo termVo = new TermVo();
|
termVo.setMinLoanAmount(Double.valueOf(capitalResult.getMinAmount()));
|
termVo.setMaxLoanAmount(Double.valueOf(capitalResult.getMaxAmount()));
|
termVo.setRangeAmount(Integer.valueOf(capitalResult.getStepAmount()));
|
if (StringUtils.isNotEmpty(capitalResult.getPeriods())) {
|
String periods = capitalResult.getPeriods();
|
periods = periods.replace("[", "");
|
periods = periods.replace("]", "");
|
String[] split = periods.split(",");
|
List<Integer> list = new ArrayList<>();
|
for (String s : split) {
|
if (StringUtils.isNotEmpty(s)) {
|
list.add(Integer.valueOf(s));
|
}
|
}
|
termVo.setLoanTermOption(list);
|
}
|
successResponse.setTerms(Collections.singletonList(termVo));
|
return MoneyPotResultJson.success(successResponse);
|
}
|
CreditLimitFailResponse failResponse = new CreditLimitFailResponse();
|
failResponse.setCreditNo(dto.getCreditNo());
|
failResponse.setStatus(CreditLimitResponse.STATUS_FAIL);
|
failResponse.setReason("暂不可借");
|
return MoneyPotResultJson.success(failResponse);
|
}
|
|
|
@Override
|
public MoneyPotResultJson loanTrial(LoanTrialDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地借款试算开始,原始参数:" + dto.toString());
|
CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.<CustomerCapitalResult>lambdaQuery()
|
.eq(CustomerCapitalResult::getCreditNo, dto.getCreditNo())
|
.eq(CustomerCapitalResult::getCapitalResultSourceCode, CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode())
|
.eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.JIN_QIAN_TIAN_XIA.getCode()));
|
if (capitalResult == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "授信编号不存在");
|
}
|
if (!CapitalApprovalResultEnum.APPROVAL_SUCCESS.getCode().equals(capitalResult.getApprovalResult())) {
|
return MoneyPotResultJson.error(YqgResultCode.ORDER_STATUS_ERROR, "未通过授信申请");
|
}
|
YxTrialDto yxTrialDto = new YxTrialDto(capitalResult.getCreditNo(), dto.getAmount().toString(), dto.getPeriod(), capitalResult.getApprovalTermUnit(), capitalResult.getCustomerUserId());
|
YxTrialResponse yxTrialResponse = yxUtil.yxTrial(yxTrialDto, funding, log, logNumber);
|
if (yxTrialResponse != null) {
|
if (yxTrialResponse.isSuccess()) {
|
LoanTrialResponse loanTrialResponse = new LoanTrialResponse();
|
List<TrialDetailPlanVo> detailPlans = new ArrayList<>();
|
Double serviceFee = 0d;
|
Double otherFee = 0d;
|
Double amount = 0d;
|
Double principal = 0d;
|
Double interest = 0d;
|
for (YxTrialResponse.YxRepayPlanVo repayPlan : yxTrialResponse.getRepayPlanLists()) {
|
TrialDetailPlanVo trialDetailPlanVo = new TrialDetailPlanVo();
|
trialDetailPlanVo.setPeriodNo(Integer.valueOf(repayPlan.getRepayterm()));
|
trialDetailPlanVo.setCanRepayTime(DateUtil.parse(repayPlan.getRepayDate()).getTime());
|
trialDetailPlanVo.setDueTime(DateUtil.parse(repayPlan.getRepayDate()).getTime());
|
trialDetailPlanVo.setPrincipal(ConstantsUtil.formatPrice(repayPlan.getNoretamt()));
|
trialDetailPlanVo.setInterest(ConstantsUtil.formatPrice(repayPlan.getNoretint()));
|
trialDetailPlanVo.setAmount(ConstantsUtil.formatPrice(repayPlan.getSumamt()));
|
trialDetailPlanVo.setServiceFee(ConstantsUtil.formatPrice(repayPlan.getServiceFee()));
|
trialDetailPlanVo.setOtherFee(ConstantsUtil.formatPrice(repayPlan.getSpeaccount()) + ConstantsUtil.formatPrice(repayPlan.getGuarantee()));
|
trialDetailPlanVo.setRemark("");
|
serviceFee = serviceFee + trialDetailPlanVo.getServiceFee();
|
otherFee = otherFee + trialDetailPlanVo.getOtherFee();
|
amount = amount + trialDetailPlanVo.getAmount();
|
principal = principal + trialDetailPlanVo.getPrincipal();
|
interest = interest + trialDetailPlanVo.getInterest();
|
detailPlans.add(trialDetailPlanVo);
|
}
|
loanTrialResponse.setServiceFee(ConstantsUtil.formatPrice(serviceFee.toString()));
|
loanTrialResponse.setOtherFee(ConstantsUtil.formatPrice(otherFee.toString()));
|
loanTrialResponse.setActualAmount(ConstantsUtil.formatPrice(yxTrialResponse.getPrinAmt()));
|
loanTrialResponse.setPrincipal(ConstantsUtil.formatPrice(principal.toString()));
|
loanTrialResponse.setAmount(ConstantsUtil.formatPrice(amount.toString()));
|
loanTrialResponse.setInterest(ConstantsUtil.formatPrice(interest.toString()));
|
loanTrialResponse.setDetailPlans(detailPlans);
|
loanTrialResponse.setCanPrepay(1);
|
Double total = loanTrialResponse.getPrincipal() + loanTrialResponse.getInterest() + loanTrialResponse.getServiceFee() + loanTrialResponse.getOtherFee();
|
loanTrialResponse.setAmount(ConstantsUtil.formatPrice(total.toString()));
|
loanTrialResponse.setRemark("本金" + loanTrialResponse.getPrincipal() + "元,利息" + loanTrialResponse.getInterest()
|
+ "元,服务费" + loanTrialResponse.getServiceFee() + "元,其他费" + loanTrialResponse.getOtherFee() + "元");
|
return MoneyPotResultJson.success(loanTrialResponse);
|
} else {
|
return MoneyPotResultJson.error(YqgResultCode.LOAN_ERROR, "试算异常");
|
}
|
} else {
|
log.error("日志编号:" + logNumber + "洋钱罐-绿地借款试算失败,错误原因:请求返回值为空");
|
throw new CommonException("请求返回值为空");
|
}
|
}
|
|
/**
|
* 借款确认
|
*
|
* @param dto
|
* @return
|
*/
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public MoneyPotResultJson loanConfirm(LoanConfirmDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地借款确认开始,原始参数:" + dto.toString());
|
CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.<CustomerCapitalResult>lambdaQuery()
|
.eq(CustomerCapitalResult::getCreditNo, dto.getCreditNo())
|
.eq(CustomerCapitalResult::getCapitalResultSourceCode, CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode())
|
.eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.JIN_QIAN_TIAN_XIA.getCode()));
|
//判断资方结果是否处于正确的状态
|
if (capitalResult == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "授信结果不存在");
|
}
|
Customer customer = customerMapper.selectOne(Wrappers.<Customer>lambdaQuery()
|
.eq(Customer::getId, capitalResult.getCustomerRecordId()));
|
if (!CapitalApprovalResultEnum.APPROVAL_SUCCESS.getCode().equals(capitalResult.getApprovalResult())) {
|
return MoneyPotResultJson.error(YqgResultCode.ORDER_STATUS_ERROR, "未通过授信申请");
|
}
|
if (!CapitalResultStatusEnum.APPLY.getCode().equals(capitalResult.getStatus())) {
|
return MoneyPotResultJson.error(YqgResultCode.ORDER_STATUS_ERROR, "订单状态有误,不是授信阶段的订单");
|
}
|
if (!Objects.equals(1, capitalResult.getHasBindCard())) {
|
return MoneyPotResultJson.error(YqgResultCode.LOAN_ERROR, "未绑定银行卡");
|
}
|
YxLoanApplyDto yxLoanApplyDto = new YxLoanApplyDto();
|
yxLoanApplyDto.setLoanNo(dto.getOrderNo());
|
yxLoanApplyDto.setCreditNo(capitalResult.getCreditNo());
|
yxLoanApplyDto.setApplyAmount(dto.getAmount().toString());
|
yxLoanApplyDto.setApplyTerm(dto.getPeriod().toString());
|
yxLoanApplyDto.setTermType(capitalResult.getApprovalTermUnit());
|
yxLoanApplyDto.setPayWay(YxLoanApplyDto.DEFAULT_PAY_WAY);
|
yxLoanApplyDto.setUserId(capitalResult.getCustomerUserId().toString());
|
if (customer != null) {
|
yxLoanApplyDto.setPurpose(customer.getUseOfLoan());
|
}
|
YxLoanApplyResponse response = yxUtil.yxLoanApply(yxLoanApplyDto, funding, log, logNumber);
|
if (response != null) {
|
LoanConfirmResponse confirmResponse = new LoanConfirmResponse();
|
if (response.isSuccess()) {
|
confirmResponse.setAgencyOrderNo(capitalResult.getCreditNo());
|
if (YxLoanApplyResponse.NEED_SEND.equals(response.getNeedVerifyCode())) {
|
log.error("日志编号:" + logNumber + "洋钱罐-绿地借款确认需要发送验证码" + response.toString());
|
return MoneyPotResultJson.error(YqgResultCode.LOAN_ERROR, "借款确认异常");
|
} else {
|
Date updateTime = new Date();
|
customerCapitalResultMapper.update(null, Wrappers.<CustomerCapitalResult>lambdaUpdate()
|
.set(CustomerCapitalResult::getLoanApplyResult, CapitalLoanApplyResultEnum.WAIT.getCode())
|
.set(CustomerCapitalResult::getStatus, CapitalResultStatusEnum.LOAN.getCode())
|
.set(CustomerCapitalResult::getLoanNo, dto.getOrderNo())
|
.set(CustomerCapitalResult::getYqgAmount, dto.getAmount())
|
.set(CustomerCapitalResult::getYqgPeriod, dto.getPeriod())
|
.set(CustomerCapitalResult::getLastUpdatedDate, updateTime)
|
.eq(CustomerCapitalResult::getId, capitalResult.getId()));
|
}
|
return MoneyPotResultJson.success(confirmResponse);
|
} else {
|
Date updateTime = new Date();
|
customerCapitalResultMapper.update(null, Wrappers.<CustomerCapitalResult>lambdaUpdate()
|
.set(CustomerCapitalResult::getLoanApplyResult, CapitalLoanApplyResultEnum.LOAN_FAIL.getCode())
|
.set(CustomerCapitalResult::getLastUpdatedDate, updateTime)
|
.set(CustomerCapitalResult::getStatus, CapitalResultStatusEnum.LOAN.getCode())
|
.set(CustomerCapitalResult::getLoanNo, dto.getOrderNo())
|
.set(CustomerCapitalResult::getYqgAmount, dto.getAmount())
|
.set(CustomerCapitalResult::getYqgPeriod, dto.getPeriod())
|
.eq(CustomerCapitalResult::getId, capitalResult.getId()));
|
return MoneyPotResultJson.error(YqgResultCode.LOAN_ERROR, "确认借款被拒绝");
|
}
|
}
|
throw new CommonException("借款确认接口出错");
|
}
|
|
|
@Override
|
public MoneyPotResultJson bankSupport(BankSupportDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地获取支持的银行卡列表开始,原始参数:" + dto.toString());
|
CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.<CustomerCapitalResult>lambdaQuery()
|
.eq(CustomerCapitalResult::getCreditNo, dto.getCreditNo())
|
.eq(CustomerCapitalResult::getCapitalResultSourceCode, CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode())
|
.eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.JIN_QIAN_TIAN_XIA.getCode()));
|
if (capitalResult == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "授信数据不存在");
|
}
|
YxGetUsableBankListResponse response = yxUtil.yxGetUsableBankList(capitalResult.getCustomerUserId(), funding, log, logNumber);
|
if (response != null) {
|
if (response.isSuccess()) {
|
BankSupportResponse supportResponse = new BankSupportResponse();
|
List<SupportBankCard> bankCards = new ArrayList<>();
|
for (YxGetUsableBankListResponse.BankListItem bankListItem : response.getBankLists()) {
|
SupportBankCard supportBankCard = new SupportBankCard();
|
supportBankCard.setBankCode(bankListItem.getBankCode());
|
supportBankCard.setBankName(bankListItem.getBankName());
|
supportBankCard.setRemark("");
|
bankCards.add(supportBankCard);
|
}
|
supportResponse.setDepositBankCardList(bankCards);
|
return MoneyPotResultJson.success(supportResponse);
|
} else {
|
log.error("日志编号:" + logNumber + "洋钱罐-绿地获取支持的银行卡列表失败,错误原因:请求失败" + response.toString());
|
}
|
} else {
|
log.error("日志编号:" + logNumber + "洋钱罐-绿地获取支持的银行卡列表失败,错误原因:请求返回为空");
|
}
|
throw new CommonException("支持银行列表查询接口异常");
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public MoneyPotResultJson bankBind(BankBindDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地绑定银行卡开始,原始参数:" + dto.toString());
|
Customer customer = customerMapper.selectOne(Wrappers.<Customer>lambdaQuery()
|
.eq(Customer::getYqgUserId, dto.getUserId()));
|
CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.<CustomerCapitalResult>lambdaQuery()
|
.eq(CustomerCapitalResult::getYqgUserId, dto.getUserId())
|
.eq(CustomerCapitalResult::getCapitalResultSourceCode, CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode())
|
.eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.JIN_QIAN_TIAN_XIA.getCode()));
|
if (customer == null || capitalResult == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "用户不存在");
|
}
|
customerMapper.update(null, Wrappers.<Customer>lambdaUpdate()
|
.set(Customer::getCardNo, dto.getCardNumber())
|
.set(Customer::getBankCode, dto.getBankCode())
|
.set(Customer::getBankName, dto.getBankName())
|
.set(Customer::getBankPhoneNo, dto.getMobileNumber())
|
.set(Customer::getBankCardName, dto.getName())
|
.eq(Customer::getId, customer.getId()));
|
YxBindBankSmsDto yxBindBankSmsDTO = new YxBindBankSmsDto();
|
yxBindBankSmsDTO.setSerialNo(yxUtil.getSerialNo());
|
yxBindBankSmsDTO.setScene(dto.formatScene());
|
if (StringUtils.isNotEmpty(capitalResult.getLoanNo())) {
|
yxBindBankSmsDTO.setLoanNo(capitalResult.getLoanNo());
|
} else {
|
yxBindBankSmsDTO.setLoanNo(capitalResult.getCreditNo());
|
}
|
yxBindBankSmsDTO.setCreditNo(capitalResult.getCreditNo());
|
yxBindBankSmsDTO.setIdNo(dto.getIdentityNumber());
|
yxBindBankSmsDTO.setCustName(dto.getName());
|
yxBindBankSmsDTO.setPhoneNo(dto.getMobileNumber());
|
yxBindBankSmsDTO.setUserId(capitalResult.getCustomerUserId().toString());
|
yxBindBankSmsDTO.setBankCardNum(dto.getCardNumber());
|
yxBindBankSmsDTO.setBankCode(dto.getBankCode());
|
YxBindBankSmsResponse yxBindBankSmsResponse = yxUtil.yxBindBankSms(yxBindBankSmsDTO, funding, log, logNumber);
|
if (yxBindBankSmsResponse != null) {
|
if (yxBindBankSmsResponse.isSuccess()) {
|
if ("1".equals(yxBindBankSmsResponse.getBindStatus())) {
|
customerCapitalResultMapper.update(null, Wrappers.<CustomerCapitalResult>lambdaUpdate()
|
.set(CustomerCapitalResult::getHasBindCard, 1)
|
.set(CustomerCapitalResult::getBankCardNo, dto.getCardNumber())
|
.set(CustomerCapitalResult::getBankName, dto.getBankName())
|
.eq(CustomerCapitalResult::getId, capitalResult.getId()));
|
return MoneyPotResultJson.success();
|
} else if ("0".equals(yxBindBankSmsResponse.getBindStatus())) {
|
CodeSendResponse codeSendResponse = new CodeSendResponse();
|
codeSendResponse.setCodeVerifyNo(yxBindBankSmsResponse.getMessageNo());
|
return MoneyPotResultJson.success(codeSendResponse);
|
}
|
}
|
}
|
throw new CommonException("绑定银行卡失败");
|
}
|
|
/**
|
* 目前支持两种情况:绑卡和还清申请
|
* 绑卡:短信校验失败的话,返回短信校验失败,等待用户重新发起绑卡申请
|
* 还款申请:短信校验失败的话,返回短信校验失败,同时还款结果需改为还款失败
|
*
|
* @param dto
|
* @return
|
*/
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public MoneyPotResultJson codeVerify(CodeVerifyDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地短信验证码校验开始,原始参数:" + dto.toString());
|
Customer customer = customerMapper.selectOne(Wrappers.<Customer>lambdaQuery()
|
.eq(Customer::getYqgUserId, dto.getUserId()));
|
CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.<CustomerCapitalResult>lambdaQuery()
|
.eq(CustomerCapitalResult::getYqgUserId, dto.getUserId())
|
.eq(CustomerCapitalResult::getCapitalResultSourceCode, CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode())
|
.eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.JIN_QIAN_TIAN_XIA.getCode()));
|
if (customer == null || capitalResult == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "用户记录不存在");
|
}
|
YqgRepayOrder yqgRepayOrder = yqgRepayOrderMapper.selectOne(Wrappers.<YqgRepayOrder>lambdaQuery()
|
.eq(YqgRepayOrder::getCapitalResultId, capitalResult.getId())
|
.eq(YqgRepayOrder::getRepayMessageNo, dto.getCodeVerifyNo()));
|
if (yqgRepayOrder != null && YqgRepayOrder.STATUS_INIT.equals(yqgRepayOrder.getStatus())) {
|
//还款申请短信校验
|
CodeVerifyResponse verifyResponse = new CodeVerifyResponse();
|
YxRepaymentApplyDto applyDto = new YxRepaymentApplyDto();
|
applyDto.setRepayApplyNo(yqgRepayOrder.getRepayApplyNo());
|
applyDto.setUserId(capitalResult.getCustomerUserId().toString());
|
applyDto.setLoanNo(capitalResult.getLoanNo());
|
List<RepayVo> repayVos = calculateLvDiRepayVos(yqgRepayOrder.getPeriodNos(), log, logNumber, capitalResult);
|
applyDto.setBankCardNo(customer.getCardNo());
|
applyDto.setRepayList(repayVos);
|
applyDto.setVerifyCode(dto.getCode());
|
applyDto.setRepayType(YxRepaymentApplyDto.CURRENT);
|
if (YqgRepayOrder.TYPE_CLEAN.equals(yqgRepayOrder.getType())) {
|
applyDto.setRepayType(YxRepaymentApplyDto.CLEAN);
|
}
|
YxRepaymentApplyResponse response = yxUtil.yxRepaymentConfirm(applyDto, funding, log, logNumber);
|
if (response != null) {
|
if (response.isSuccess()) {
|
yqgRepayOrderMapper.update(null, Wrappers.<YqgRepayOrder>lambdaUpdate()
|
.set(YqgRepayOrder::getStatus, YqgRepayOrder.STATUS_WAIT)
|
.set(YqgRepayOrder::getLastUpdatedDate, new Date())
|
.eq(YqgRepayOrder::getId, yqgRepayOrder.getId()));
|
List<String> termList = repayVos.stream().map(RepayVo::getRepayTerm).collect(Collectors.toList());
|
yqgRepayOrderService.createRepayOrderDetail(yqgRepayOrder, termList);
|
if (CapitalResultStatusEnum.LOAN.getCode().equals(capitalResult.getStatus())) {
|
customerCapitalResultMapper.update(null, Wrappers.<CustomerCapitalResult>lambdaUpdate()
|
.set(CustomerCapitalResult::getStatus, CapitalResultStatusEnum.REPAY.getCode())
|
.eq(CustomerCapitalResult::getId, capitalResult.getId()));
|
}
|
verifyResponse.setStatus(CodeVerifyResponse.STATUS_SUCCESS);
|
} else {
|
verifyResponse.setStatus(CodeVerifyResponse.STATUS_FAIL);
|
verifyResponse.setMessage(response.getResponseMsg());
|
yqgRepayOrder.setStatus(YqgRepayOrder.STATUS_FAIL);
|
yqgRepayOrder.setLastUpdatedDate(new Date());
|
yqgRepayOrderMapper.update(null, Wrappers.<YqgRepayOrder>lambdaUpdate()
|
.set(YqgRepayOrder::getStatus, yqgRepayOrder.getStatus())
|
.set(YqgRepayOrder::getLastUpdatedDate, yqgRepayOrder.getLastUpdatedDate())
|
.set(YqgRepayOrder::getRemark, response.getResponseMsg())
|
.eq(YqgRepayOrder::getId, yqgRepayOrder.getId()));
|
RepayResultReturnDto feedBackDto = RepayResultReturnDto.parseDto(yqgRepayOrder, null);
|
yqgUtil.repayResultFeedBack(feedBackDto, log, logNumber);
|
}
|
return MoneyPotResultJson.success(verifyResponse);
|
}
|
throw new CommonException("还款申请短信校验失败");
|
} else {
|
//绑卡时短信验证
|
YxBindBankSubmitDto yxBindBankSubmitDTO = new YxBindBankSubmitDto();
|
yxBindBankSubmitDTO.setSerialNo(yxUtil.getSerialNo());
|
yxBindBankSubmitDTO.setCreditNo(dto.getCreditNo());
|
if (StringUtils.isNotEmpty(dto.getOrderNo())) {
|
yxBindBankSubmitDTO.setScene("03");
|
} else {
|
yxBindBankSubmitDTO.setScene("02");
|
}
|
if (StringUtils.isNotEmpty(capitalResult.getLoanNo())) {
|
yxBindBankSubmitDTO.setLoanNo(capitalResult.getLoanNo());
|
} else {
|
yxBindBankSubmitDTO.setLoanNo(capitalResult.getCreditNo());
|
}
|
yxBindBankSubmitDTO.setCreditNo(capitalResult.getCreditNo());
|
yxBindBankSubmitDTO.setMessageNo(dto.getCodeVerifyNo());
|
yxBindBankSubmitDTO.setBankCardNum(customer.getCardNo());
|
yxBindBankSubmitDTO.setVerifyCode(dto.getCode());
|
YxBindBankSubmitResponse response = yxUtil.yxVerifyBindBankSMS(yxBindBankSubmitDTO, funding, log, logNumber);
|
if (response != null) {
|
CodeVerifyResponse verifyResponse = new CodeVerifyResponse();
|
if (response.isSuccess()) {
|
if (StringUtils.isNotEmpty(response.getNeedVerify())) {
|
if ("1".equals(response.getNeedVerify())) {
|
verifyResponse.setStatus(CodeVerifyResponse.STATUS_MULTIPLE);
|
return MoneyPotResultJson.success(verifyResponse);
|
} else if ("0".equals(response.getNeedVerify())) {
|
verifyResponse.setStatus(CodeVerifyResponse.STATUS_SUCCESS);
|
customerCapitalResultMapper.update(null, Wrappers.<CustomerCapitalResult>lambdaUpdate()
|
.set(CustomerCapitalResult::getHasBindCard, 1)
|
.set(CustomerCapitalResult::getBankCardNo, customer.getCardNo())
|
.set(CustomerCapitalResult::getBankName, customer.getBankName())
|
.eq(CustomerCapitalResult::getId, capitalResult.getId()));
|
return MoneyPotResultJson.success(verifyResponse);
|
}
|
}
|
} else {
|
verifyResponse.setStatus(CodeVerifyResponse.STATUS_FAIL);
|
verifyResponse.setMessage("绑卡失败");
|
return MoneyPotResultJson.success(verifyResponse);
|
}
|
}
|
throw new CommonException("验证码校验接口出错");
|
}
|
}
|
|
|
@Override
|
public MoneyPotResultJson getUserBankCardList(BankCardListDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地获取用户已绑银行卡列表开始,原始参数:" + dto.toString());
|
CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.<CustomerCapitalResult>lambdaQuery()
|
.eq(CustomerCapitalResult::getYqgUserId, dto.getUserId())
|
.eq(CustomerCapitalResult::getCapitalResultSourceCode, CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode())
|
.eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.JIN_QIAN_TIAN_XIA.getCode()));
|
if (capitalResult == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "用户不存在");
|
}
|
YxQueryUserBankListDto yxQueryUserBankListDto = new YxQueryUserBankListDto();
|
yxQueryUserBankListDto.setUserId(capitalResult.getCustomerUserId().toString());
|
if (StringUtils.isNotEmpty(capitalResult.getLoanNo())) {
|
yxQueryUserBankListDto.setLoanNo(capitalResult.getLoanNo());
|
} else {
|
yxQueryUserBankListDto.setLoanNo(capitalResult.getCreditNo());
|
}
|
YxQueryUserBankListResponse response = yxUtil.yxQueryUserBankList(yxQueryUserBankListDto, funding, log, logNumber);
|
if (response != null) {
|
if (response.isSuccess()) {
|
List<BankCardInfo> bankCardInfos = new ArrayList<>();
|
BankCardListResponse cardListResponse = new BankCardListResponse();
|
for (YxQueryUserBankListResponse.BankListItem bankListItem : response.getBankCardLists()) {
|
BankCardInfo bankCardInfo = new BankCardInfo();
|
bankCardInfo.setBankCode(bankListItem.getBankCode());
|
bankCardInfo.setBankName(bankListItem.getBankName());
|
bankCardInfo.setBankCard(bankListItem.getBankCardNum());
|
bankCardInfos.add(bankCardInfo);
|
}
|
cardListResponse.setBankCardList(bankCardInfos);
|
return MoneyPotResultJson.success(cardListResponse);
|
}
|
}
|
throw new CommonException("获取用户已绑银行卡列表接口出错");
|
}
|
|
@Override
|
public MoneyPotResultJson queryBankCardBind(BankBindRequireDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地是否需要绑定银行卡查询开始,原始参数:" + dto.toString());
|
CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.<CustomerCapitalResult>lambdaQuery()
|
.eq(CustomerCapitalResult::getYqgUserId, dto.getUserId())
|
.eq(CustomerCapitalResult::getCreditNo, dto.getCreditNo())
|
.eq(CustomerCapitalResult::getCapitalResultSourceCode, CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode())
|
.eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.JIN_QIAN_TIAN_XIA.getCode()));
|
if (capitalResult == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "用户信息不存在");
|
}
|
if (!CapitalApprovalResultEnum.APPROVAL_SUCCESS.getCode().equals(capitalResult.getApprovalResult())) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "授信未通过");
|
}
|
BankBindRequireResponse response = new BankBindRequireResponse();
|
if (Objects.equals(capitalResult.getHasBindCard(), 1)) {
|
response.setStatus(1);
|
} else {
|
response.setStatus(2);
|
}
|
return MoneyPotResultJson.success(response);
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public MoneyPotResultJson getRepayPlan(RepayPlanDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地还款计划查询开始,原始参数:" + dto.toString());
|
CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.<CustomerCapitalResult>lambdaQuery()
|
.eq(CustomerCapitalResult::getLoanNo, dto.getOrderNo())
|
.eq(CustomerCapitalResult::getCapitalResultSourceCode, CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode())
|
.eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.JIN_QIAN_TIAN_XIA.getCode()));
|
if (capitalResult == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "查询数据失败");
|
}
|
//查询还款中的期数
|
List<String> periodNoList = yqgRepayOrderDetailMapper.getRepayPeriodNoList(capitalResult.getLoanNo());
|
YxRepaymentPlanQueryDto queryDto = new YxRepaymentPlanQueryDto();
|
queryDto.setLoanNo(capitalResult.getLoanNo());
|
queryDto.setUserId(capitalResult.getCustomerUserId());
|
YxRepaymentPlanQueryResponse response = yxUtil.yxRepaymentPlanQuery(queryDto, funding, log, logNumber);
|
if (response != null) {
|
if (response.isSuccess()) {
|
RepayPlanResponse repayPlanResponse = new RepayPlanResponse();
|
List<RepayDetailPlanVo> detailPlans = new ArrayList<>();
|
repayPlanResponse.setOrderNo(dto.getOrderNo());
|
repayPlanResponse.setCanPrepay(Integer.valueOf(response.getCanPrepay()));
|
boolean isClean = true;
|
for (YxpkgListVo yxpkgListVo : response.getPkgList()) {
|
RepayDetailPlanVo repayDetailPlanVo = RepayDetailPlanVo.parseVo(yxpkgListVo, periodNoList);
|
if (!RepayDetailPlanVo.STATUS_REPAID.equals(repayDetailPlanVo.getBillStatus())) {
|
isClean = false;
|
}
|
detailPlans.add(repayDetailPlanVo);
|
}
|
if (capitalResult.getRepayResult() == null && isClean) {
|
customerCapitalResultMapper.update(null, Wrappers.<CustomerCapitalResult>lambdaUpdate()
|
.set(CustomerCapitalResult::getRepayResult, 1)
|
.set(CustomerCapitalResult::getLastUpdatedDate, new Date())
|
.eq(CustomerCapitalResult::getId, capitalResult.getId()));
|
OrderUpdateStatusDto orderUpdateStatusDto = OrderUpdateStatusDto.parseDto(capitalResult);
|
if (orderUpdateStatusDto != null) {
|
yqgUtil.orderUpdateStatus(orderUpdateStatusDto, log, logNumber);
|
}
|
}
|
repayPlanResponse.setDetailPlans(detailPlans);
|
return MoneyPotResultJson.success(repayPlanResponse);
|
}
|
}
|
throw new CommonException("查询还款计划异常");
|
}
|
|
@Override
|
public MoneyPotResultJson getContractList(ContractDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地协议查询开始,原始参数:" + dto.toString());
|
String loanNo = null;
|
String userId = "" + IdUtil.getSnowflake().nextId();
|
String scene = dto.formatScene();
|
if (scene == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "合同借款场景参数不正确");
|
}
|
if (StringUtils.isNotEmpty(dto.getCreditNo())) {
|
CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.<CustomerCapitalResult>lambdaQuery()
|
.eq(CustomerCapitalResult::getCreditNo, dto.getCreditNo())
|
.eq(CustomerCapitalResult::getCapitalResultSourceCode, CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode())
|
.eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.JIN_QIAN_TIAN_XIA.getCode()));
|
if (capitalResult != null) {
|
if (StringUtils.isNotEmpty(capitalResult.getLoanNo())) {
|
loanNo = capitalResult.getLoanNo();
|
}
|
userId = capitalResult.getCustomerUserId().toString();
|
}
|
}
|
YxContractResponse response = yxUtil.yxContractListQuery(userId, scene, loanNo, funding, log, logNumber);
|
if (response != null) {
|
if (response.isSuccess()) {
|
ContractResponse contractResponse = new ContractResponse();
|
List<ContractVo> contractVos = new ArrayList<>();
|
for (YxContractResponse.YxContractLists contractItem : response.getContractLists()) {
|
ContractVo contractVo = new ContractVo();
|
contractVo.setName(contractItem.getContractName());
|
contractVo.setUrl(contractItem.getContractUrl());
|
contractVo.setForceRead(1);
|
contractVo.setForceReadTime(10);
|
contractVos.add(contractVo);
|
}
|
contractResponse.setContractList(contractVos);
|
return MoneyPotResultJson.success(contractResponse);
|
}
|
}
|
throw new CommonException("协议查询异常");
|
}
|
|
@Override
|
public MoneyPotResultJson getRepayDetail(RepayDetailDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地还款试算开始,原始参数:" + dto.toString());
|
CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.<CustomerCapitalResult>lambdaQuery()
|
.eq(CustomerCapitalResult::getLoanNo, dto.getOrderNo())
|
.eq(CustomerCapitalResult::getCapitalResultSourceCode, CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode())
|
.eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.JIN_QIAN_TIAN_XIA.getCode()));
|
if (capitalResult == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "查询数据失败");
|
}
|
YxPreRepayApplyDto applyDto = new YxPreRepayApplyDto();
|
applyDto.setLoanNo(capitalResult.getLoanNo());
|
applyDto.setUserId(capitalResult.getCustomerUserId());
|
String periodNos = calculateLvDiPeriodNos(dto.getPeriodNos(), log, logNumber, capitalResult);
|
applyDto.setTerm(periodNos);
|
if ("all".equals(dto.getPeriodNos())) {
|
applyDto.setPrePayType(YxPreRepayApplyDto.TYPE_CLEAN);
|
} else {
|
applyDto.setPrePayType(YxPreRepayApplyDto.TYPE_NORMAL);
|
}
|
YxPreRepayApplyResponse response = yxUtil.yxPreRepayApply(applyDto, funding, log, logNumber);
|
if (response != null) {
|
if (response.isSuccess()) {
|
RepayDetailResponse repayDetailResponse = new RepayDetailResponse();
|
repayDetailResponse.setAmount(ConstantsUtil.formatPrice(response.getPayTotalAmt()));
|
repayDetailResponse.setPrincipal(ConstantsUtil.formatPrice(response.getPayNormAmt()));
|
repayDetailResponse.setInterest(ConstantsUtil.formatPrice(response.getPayInteAmt()));
|
repayDetailResponse.setServiceFee(ConstantsUtil.formatPrice(response.getServiceFee()));
|
repayDetailResponse.setOverdueInterest(ConstantsUtil.formatPrice(response.getPayEnteAmt()));
|
repayDetailResponse.setOtherFee(ConstantsUtil.formatPrice(response.getGuarantorAmt()) + ConstantsUtil.formatPrice(response.getSpeaccount()));
|
if (StringUtils.isEmpty(response.getBankName()) || StringUtils.isEmpty(response.getBankCardNum())) {
|
repayDetailResponse.setBankName(capitalResult.getBankName());
|
repayDetailResponse.setBankCard(capitalResult.getBankCardNo());
|
} else {
|
repayDetailResponse.setBankName(response.getBankName());
|
repayDetailResponse.setBankCard(response.getBankCardNum());
|
}
|
repayDetailResponse.setCanChangeCard(Integer.valueOf(response.getCanChangeCard()));
|
repayDetailResponse.setRemark(repayDetailResponse.parseRemark());
|
return MoneyPotResultJson.success(repayDetailResponse);
|
} else {
|
return MoneyPotResultJson.error(YqgResultCode.REPAY_ERROR, "还款试算失败");
|
}
|
}
|
throw new CommonException("还款试算异常");
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public MoneyPotResultJson userRepay(UserRepayDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
//洋钱罐订单状态判断
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地用户主动还款开始,原始参数:" + dto.toString());
|
if (StringUtils.isEmpty(dto.getPeriodNos())) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "还款期数不能为空");
|
}
|
CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.<CustomerCapitalResult>lambdaQuery()
|
.eq(CustomerCapitalResult::getLoanNo, dto.getOrderNo())
|
.eq(CustomerCapitalResult::getCapitalResultSourceCode, CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode())
|
.eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.JIN_QIAN_TIAN_XIA.getCode()));
|
if (capitalResult == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "查询数据失败");
|
}
|
if (!CapitalLoanApplyResultEnum.LOAN_SUCCESS.getCode().equals(capitalResult.getLoanApplyResult())) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "未查询到有效订单");
|
}
|
//判断系统内是否已经存在该还款编号
|
YqgRepayOrder localOrder = yqgRepayOrderMapper.selectOne(Wrappers.<YqgRepayOrder>lambdaQuery()
|
.eq(YqgRepayOrder::getCapitalResultId, capitalResult.getId())
|
.eq(YqgRepayOrder::getOrderNo, dto.getOrderNo())
|
.eq(YqgRepayOrder::getRepayNo, dto.getRepayNo()));
|
if (localOrder != null) {
|
return MoneyPotResultJson.error(YqgResultCode.REPAY_ERROR, "该还款编号已存在");
|
}
|
String[] split = dto.getPeriodNos().split(",");
|
if (split.length > 1) {
|
return MoneyPotResultJson.error(YqgResultCode.REPAY_ERROR, "仅支持单期还款");
|
}
|
//计算还款使用的期数和每一期的金额
|
List<RepayVo> repayVos = calculateLvDiRepayVos(dto.getPeriodNos(), log, logNumber, capitalResult);
|
//判断系统内是否已经存在正在还款或已经还款完成的期数
|
List<YqgRepayOrderDetail> repayOrderDetails = yqgRepayOrderDetailMapper.selectList(Wrappers.<YqgRepayOrderDetail>lambdaQuery()
|
.ne(YqgRepayOrderDetail::getStatus, YqgRepayOrderDetail.STATUS_FAIL)
|
.eq(YqgRepayOrderDetail::getCapitalResultId, capitalResult.getId())
|
.eq(YqgRepayOrderDetail::getOrderNo, dto.getOrderNo()));
|
List<String> termList = repayVos.stream().map(RepayVo::getRepayTerm).collect(Collectors.toList());
|
if (repayOrderDetails != null && repayOrderDetails.size() > 0) {
|
List<YqgRepayOrderDetail> detailList = repayOrderDetails.stream().filter(i -> termList.contains(i.getPeriodNo())).collect(Collectors.toList());
|
if (detailList.size() > 0) {
|
return MoneyPotResultJson.error(YqgResultCode.REPAY_ERROR, "存在还款中的期数");
|
}
|
}
|
//构建主动还款的绿地参数信息
|
YxRepaymentApplyDto applyDto = new YxRepaymentApplyDto();
|
applyDto.setRepayApplyNo(yxUtil.createRepayApplyNo());
|
applyDto.setUserId(capitalResult.getCustomerUserId().toString());
|
applyDto.setLoanNo(capitalResult.getLoanNo());
|
Customer customer = customerMapper.selectById(capitalResult.getCustomerRecordId());
|
applyDto.setBankCardNo(customer.getCardNo());
|
applyDto.setRepayList(repayVos);
|
YqgRepayOrder yqgRepayOrder = new YqgRepayOrder();
|
applyDto.setRepayType(YxRepaymentApplyDto.CURRENT);
|
if ("all".equals(dto.getPeriodNos())) {
|
applyDto.setRepayType(YxRepaymentApplyDto.CLEAN);
|
yqgRepayOrder.setType(YqgRepayOrder.TYPE_CLEAN);
|
} else if (termList.size() > 1) {
|
yqgRepayOrder.setType(YqgRepayOrder.TYPE_MULTI_PERIOD);
|
} else {
|
yqgRepayOrder.setType(YqgRepayOrder.TYPE_SINGLE_PERIOD);
|
}
|
YxRepaymentApplyResponse response = yxUtil.yxRepaymentApply(applyDto, funding, log, logNumber);
|
if (response != null) {
|
if (response.isSuccess()) {
|
yqgRepayOrder.setCapitalResultId(capitalResult.getId());
|
yqgRepayOrder.setOrderNo(dto.getOrderNo());
|
yqgRepayOrder.setRepayNo(dto.getRepayNo());
|
String periodNoStr = StringUtils.join(termList, ",");
|
yqgRepayOrder.setPeriodNos(periodNoStr);
|
yqgRepayOrder.setRepayApplyNo(response.getRepayApplyNo());
|
yqgRepayOrder.setBankCard(capitalResult.getBankCardNo());
|
yqgRepayOrder.setCreationDate(new Date());
|
yqgRepayOrder.setLastUpdatedDate(new Date());
|
UserRepayResponse repayResponse = new UserRepayResponse();
|
if ("0".equals(response.getNeedVerify())) {
|
//不需要发送验证码的情况
|
yqgRepayOrder.setStatus(YqgRepayOrder.STATUS_WAIT);
|
yqgRepayOrderMapper.insert(yqgRepayOrder);
|
//保存洋钱罐还款详情
|
yqgRepayOrderService.createRepayOrderDetail(yqgRepayOrder, termList);
|
if (CapitalResultStatusEnum.LOAN.getCode().equals(capitalResult.getStatus())) {
|
Date updateTime = new Date();
|
customerCapitalResultMapper.update(null, Wrappers.<CustomerCapitalResult>lambdaUpdate()
|
.set(CustomerCapitalResult::getStatus, CapitalResultStatusEnum.REPAY.getCode())
|
.set(CustomerCapitalResult::getLastUpdatedDate, updateTime)
|
.eq(CustomerCapitalResult::getId, capitalResult.getId()));
|
}
|
repayResponse.setAgencyRepayNo(yqgRepayOrder.getRepayApplyNo());
|
return MoneyPotResultJson.success(repayResponse);
|
} else if ("1".equals(response.getNeedVerify())) {
|
//需要发送验证码的情况
|
String serialNo = yxUtil.getSerialNo();
|
yqgRepayOrder.setRepayMessageNo(serialNo);
|
yqgRepayOrder.setStatus(YqgRepayOrder.STATUS_INIT);
|
yqgRepayOrderMapper.insert(yqgRepayOrder);
|
repayResponse.setCodeVerifyNo(serialNo);
|
repayResponse.setAgencyRepayNo(yqgRepayOrder.getRepayApplyNo());
|
return MoneyPotResultJson.success(repayResponse);
|
}
|
} else {
|
return MoneyPotResultJson.error(YqgResultCode.REPAY_ERROR, response.getResponseMsg());
|
}
|
}
|
throw new CommonException("用户主动还款失败");
|
}
|
|
private String calculateLvDiPeriodNos(String periodNos, Logger log, String logNumber, CustomerCapitalResult capitalResult) {
|
if ("all".equals(periodNos)) {
|
YxRepaymentPlanQueryDto yxRepaymentPlanQueryDto = new YxRepaymentPlanQueryDto(capitalResult);
|
YxRepaymentPlanQueryResponse planQuery = yxUtil.yxRepaymentPlanQuery(yxRepaymentPlanQueryDto, funding, log, logNumber);
|
if (planQuery != null && planQuery.isSuccess()) {
|
List<YxpkgListVo> pkgList = planQuery.getPkgList();
|
periodNos = pkgList.stream().filter(i -> !YxpkgListVo.FLAG_CLEAN.equals(i.getSettleFlag()))
|
.map(YxpkgListVo::getRepayTerm).collect(Collectors.joining(","));
|
} else {
|
throw new CommonException("查询还款期数失败");
|
}
|
}
|
return periodNos;
|
}
|
|
private List<RepayVo> calculateLvDiRepayVos(String periodNos, Logger log, String logNumber, CustomerCapitalResult capitalResult) {
|
List<RepayVo> repayVos = new ArrayList<>();
|
periodNos = calculateLvDiPeriodNos(periodNos, log, logNumber, capitalResult);
|
String[] split = periodNos.split(",");
|
for (String period : split) {
|
RepayVo repayVo = new RepayVo(period);
|
repayVos.add(repayVo);
|
}
|
return repayVos;
|
}
|
|
@Override
|
public MoneyPotResultJson queryRepayResult(RepayResultDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地还款结果查询开始,原始参数:" + dto.toString());
|
YqgRepayOrder yqgRepayOrder = yqgRepayOrderMapper.selectOne(Wrappers.<YqgRepayOrder>lambdaQuery()
|
.eq(YqgRepayOrder::getOrderNo, dto.getOrderNo())
|
.eq(YqgRepayOrder::getRepayNo, dto.getRepayNo()));
|
CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.<CustomerCapitalResult>lambdaQuery()
|
.eq(CustomerCapitalResult::getLoanNo, dto.getOrderNo()));
|
RepayResultReturnDto response = new RepayResultReturnDto();
|
response.setRemark("");
|
if (yqgRepayOrder == null || capitalResult == null) {
|
response.setOrderNo(dto.getOrderNo());
|
response.setRepayNo(dto.getRepayNo());
|
response.setStatus(YqgRepayOrder.STATUS_NOT_FIND);
|
return MoneyPotResultJson.success(response);
|
} else if (YqgRepayOrder.STATUS_INIT.equals(yqgRepayOrder.getStatus())) {
|
response.setOrderNo(dto.getOrderNo());
|
response.setRepayNo(dto.getRepayNo());
|
response.setStatus(YqgRepayOrder.STATUS_WAIT);
|
response.setAgencyRepayNo(yqgRepayOrder.getRepayApplyNo());
|
response.setType(yqgRepayOrder.getType());
|
return MoneyPotResultJson.success(response);
|
}
|
response.setAgencyRepayNo(yqgRepayOrder.getRepayApplyNo());
|
response.setType(yqgRepayOrder.getType());
|
if (YqgRepayOrder.STATUS_WAIT.equals(yqgRepayOrder.getStatus())) {
|
YxRepaymentResultDto repaymentResultDto = new YxRepaymentResultDto(capitalResult.getCustomerUserId().toString(), yqgRepayOrder.getRepayApplyNo());
|
YxRepaymentResultResponse resultResponse = yxUtil.yxRepaymentResult(repaymentResultDto, funding, log, logNumber);
|
if (resultResponse != null) {
|
if (resultResponse.isSuccess()) {
|
yqgRepayOrder = yiXinService.updateByRepayResultReturn(yqgRepayOrder, resultResponse);
|
} else {
|
log.error("日志编号:" + logNumber + "洋钱罐-绿地还款结果查询失败:" + resultResponse.toString());
|
}
|
}
|
}
|
if (YqgRepayOrder.STATUS_SUCCESS.equals(yqgRepayOrder.getStatus())) {
|
YxRepaymentPlanQueryDto yxRepaymentPlanQueryDto = new YxRepaymentPlanQueryDto(capitalResult);
|
YxRepaymentPlanQueryResponse planQuery = yxUtil.yxRepaymentPlanQuery(yxRepaymentPlanQueryDto, yxUtil.getFunding(capitalResult.getCapitalInfoCode()), log, logNumber);
|
response = RepayResultReturnDto.parseDto(yqgRepayOrder, planQuery);
|
} else {
|
response = RepayResultReturnDto.parseDto(yqgRepayOrder, null);
|
}
|
if (response != null) {
|
return MoneyPotResultJson.success(response);
|
}
|
throw new CommonException("还款结果查询失败");
|
}
|
|
@Override
|
public MoneyPotResultJson getOrderStatus(OrderStatusDto dto) {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-绿地订单状态查询开始,原始参数:" + dto.toString());
|
CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.<CustomerCapitalResult>lambdaQuery()
|
.eq(CustomerCapitalResult::getLoanNo, dto.getOrderNo())
|
.eq(CustomerCapitalResult::getCapitalResultSourceCode, CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode())
|
.eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.JIN_QIAN_TIAN_XIA.getCode()));
|
if (capitalResult == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "订单编号不存在");
|
}
|
OrderStatusResponse response = new OrderStatusResponse();
|
if (CapitalResultStatusEnum.LOAN.getCode().equals(capitalResult.getStatus())) {
|
if (CapitalLoanApplyResultEnum.WAIT.getCode().equals(capitalResult.getLoanApplyResult())) {
|
YxLoanResultQueryResponse yxLoanResultQueryResponse = yxUtil.yxLoanStatusQuery(new YxLoanStatusQueryDto(capitalResult.getLoanNo()), funding, log, logNumber);
|
capitalResult = yiXinService.updateByLoanReturn(capitalResult, yxLoanResultQueryResponse);
|
}
|
}
|
Integer status = response.parseStatus(capitalResult);
|
response.setStatus(status);
|
response.setOrderNo(dto.getOrderNo());
|
response.setUpdateTime(capitalResult.getLastUpdatedDate().getTime());
|
return MoneyPotResultJson.success(response);
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public MoneyPotResultJson<RightsCardResponse> getRightsCard(RightsCardDto dto, String hostUrl) throws Exception {
|
String logNumber = IdUtil.randomUUID();
|
log.info("日志编号:" + logNumber + "洋钱罐-获取用户的权益卡信息查询开始,原始参数:" + dto.toString());
|
CustomerUser customerUser = customerUserMapper.selectOne(Wrappers.<CustomerUser>lambdaQuery()
|
.eq(CustomerUser::getThirdUserId, dto.getUserId())
|
.eq(CustomerUser::getSourceChannel, SourceTypeEnum.YangQianGuan.getCode()));
|
if (customerUser == null) {
|
return MoneyPotResultJson.error(YqgResultCode.BAD_REQUEST, "用户不存在");
|
}
|
RightsCardResponse response = new RightsCardResponse();
|
if (customerUser.getVipEndDate() != null) {
|
int compare = DateUtil.compare(new Date(), customerUser.getVipEndDate());
|
if (compare < 0) {
|
response.setStatus(RightsCardResponse.STATUS_BUY);
|
} else {
|
response.setStatus(RightsCardResponse.STATUS_EXPIRED);
|
}
|
} else {
|
response.setStatus(RightsCardResponse.STATUS_NO_BUY);
|
ChannelInfo channelInfo = channelInfoMapper.selectOne(Wrappers.<ChannelInfo>lambdaQuery()
|
.eq(ChannelInfo::getCode, SourceTypeEnum.YangQianGuan.getCode()));
|
VipCard vipCard = vipCardMapper.selectOne(Wrappers.<VipCard>lambdaQuery()
|
.eq(VipCard::getCardId, channelInfo.getDefaultCardId()));
|
JSONObject params = new JSONObject();
|
Double prise = Double.valueOf(vipCard.getPrice()) / 100;
|
String orderId = IdUtil.fastSimpleUUID().substring(0, 24);
|
params.put("appId", channelInfo.getAppId());
|
params.put("orderId", orderId);
|
params.put("orderSubject", vipCard.getCardName());
|
params.put("totalAmount", prise);
|
params.put("returnUrl", dto.getReturnUrl());
|
params.put("notifyUrl", alipayConf.getPlatformVipNotifyUrl());
|
params.put("phone", customerUser.getPhone());
|
String base64 = rsaSecretUtils.alipayPublicEncrypt(params.toJSONString());
|
String encode = URLEncoder.encode(base64, "utf-8");
|
response.setAmount(prise);
|
response.setUrl(hostUrl + "/pages/pay/alipay?appId=" + channelInfo.getAppId() + "¶ms=" + encode);
|
VipCardOrder vipCardOrder = new VipCardOrder();
|
String thirdOrderId = channelInfo.getAppId() + "_" + orderId;
|
vipCardOrder.setOrderId(orderId);
|
vipCardOrder.setPartnerThirdOrderId(thirdOrderId);
|
vipCardOrder.setUserId(customerUser.getId());
|
vipCardOrder.setStatus(VipCardOrderEnum.STATUS_INIT.getCode());
|
vipCardOrder.setCreationDate(new Date());
|
vipCardOrder.setPayType(PayTypeEnum.ALIPAY_SDK.getCode());
|
vipCardOrder.setPrice(vipCard.getPrice());
|
vipCardOrder.setCardId(vipCard.getCardId());
|
vipCardOrder.setVipType(vipCard.getVipType());
|
vipCardOrderMapper.insert(vipCardOrder);
|
}
|
log.info("日志编号:" + logNumber + "洋钱罐-获取用户的权益卡信息查询结束,返回参数:" + response.toString());
|
return MoneyPotResultJson.success(response);
|
}
|
}
|