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.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 customerUsers = customerUserMapper.selectList(Wrappers.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.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.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 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.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 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.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.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.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.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.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 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.lambdaQuery() .eq(Customer::getYqgUserId, dto.getUserId())); CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.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.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.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.lambdaQuery() .eq(Customer::getYqgUserId, dto.getUserId())); CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.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.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 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.lambdaUpdate() .set(YqgRepayOrder::getStatus, YqgRepayOrder.STATUS_WAIT) .set(YqgRepayOrder::getLastUpdatedDate, new Date()) .eq(YqgRepayOrder::getId, yqgRepayOrder.getId())); List termList = repayVos.stream().map(RepayVo::getRepayTerm).collect(Collectors.toList()); yqgRepayOrderService.createRepayOrderDetail(yqgRepayOrder, termList); if (CapitalResultStatusEnum.LOAN.getCode().equals(capitalResult.getStatus())) { customerCapitalResultMapper.update(null, Wrappers.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.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.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.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 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.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.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 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 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.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.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 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.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.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.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 repayVos = calculateLvDiRepayVos(dto.getPeriodNos(), log, logNumber, capitalResult); //判断系统内是否已经存在正在还款或已经还款完成的期数 List repayOrderDetails = yqgRepayOrderDetailMapper.selectList(Wrappers.lambdaQuery() .ne(YqgRepayOrderDetail::getStatus, YqgRepayOrderDetail.STATUS_FAIL) .eq(YqgRepayOrderDetail::getCapitalResultId, capitalResult.getId()) .eq(YqgRepayOrderDetail::getOrderNo, dto.getOrderNo())); List termList = repayVos.stream().map(RepayVo::getRepayTerm).collect(Collectors.toList()); if (repayOrderDetails != null && repayOrderDetails.size() > 0) { List 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.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 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 calculateLvDiRepayVos(String periodNos, Logger log, String logNumber, CustomerCapitalResult capitalResult) { List 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.lambdaQuery() .eq(YqgRepayOrder::getOrderNo, dto.getOrderNo()) .eq(YqgRepayOrder::getRepayNo, dto.getRepayNo())); CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.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.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 getRightsCard(RightsCardDto dto, String hostUrl) throws Exception { String logNumber = IdUtil.randomUUID(); log.info("日志编号:" + logNumber + "洋钱罐-获取用户的权益卡信息查询开始,原始参数:" + dto.toString()); CustomerUser customerUser = customerUserMapper.selectOne(Wrappers.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.lambdaQuery() .eq(ChannelInfo::getCode, SourceTypeEnum.YangQianGuan.getCode())); VipCard vipCard = vipCardMapper.selectOne(Wrappers.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); } }