package com.nova.sankuai.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.nova.sankuai.domain.api.rongyitui.RongYiTuiResponse; import com.nova.sankuai.domain.api.rongyitui.RongYiTuiUtil; import com.nova.sankuai.domain.api.yangqianguan.YqgUtil; import com.nova.sankuai.domain.api.yangqianguan.dto.OrderUpdateStatusDto; import com.nova.sankuai.domain.api.yangqianguan.dto.RepayResultReturnDto; import com.nova.sankuai.domain.api.yangqianguan.response.CreditResultResponse; import com.nova.sankuai.domain.api.yangqianguan.response.RepayPlanResponse; import com.nova.sankuai.domain.api.yangqianguan.vo.RepayDetailPlanVo; import com.nova.sankuai.domain.api.yixin.TXOcrUtil; import com.nova.sankuai.domain.api.yixin.YXSignUtil; import com.nova.sankuai.domain.api.yixin.YXUtil; import com.nova.sankuai.domain.api.yixin.callback.YxAuditCallbackRequest; import com.nova.sankuai.domain.api.yixin.callback.YxLoanApplyCallbackResult; import com.nova.sankuai.domain.api.yixin.dto.YxRepaymentPlanQueryDto; import com.nova.sankuai.domain.api.yixin.response.*; import com.nova.sankuai.domain.api.yixin.vo.YxpkgListVo; import com.nova.sankuai.domain.entity.*; import com.nova.sankuai.domain.enums.capitalInfo.*; import com.nova.sankuai.infra.config.CommonException; import com.nova.sankuai.infra.constants.ResultCode; import com.nova.sankuai.infra.mapper.CustomerCapitalResultMapper; import com.nova.sankuai.infra.mapper.CustomerMapper; import com.nova.sankuai.infra.mapper.YqgRepayOrderDetailMapper; import com.nova.sankuai.infra.mapper.YqgRepayOrderMapper; import com.nova.sankuai.infra.utils.ImageUtil; import com.nova.sankuai.infra.utils.ResultJson; import com.nova.sankuai.security.UserDetail; import com.nova.sankuai.service.ICustomerUserService; import com.nova.sankuai.service.IYiXinService; import lombok.AllArgsConstructor; import org.apache.commons.lang.StringUtils; import org.apache.http.util.TextUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import sun.misc.BASE64Decoder; import java.text.SimpleDateFormat; import java.util.*; /** * @author weikangdi * @create 2022/3/15 */ @Service @AllArgsConstructor public class YiXinServiceImpl implements IYiXinService { private final ICustomerUserService customerUserService; private final YXUtil yxUtil; private static final Logger logger = LoggerFactory.getLogger("lvdiLogger"); private final CustomerMapper customerMapper; private final ImageUtil imageUtil; private final CustomerCapitalResultMapper customerCapitalResultMapper; private final YqgUtil yqgUtil; private final RongYiTuiUtil rongYiTuiUtil; private final YqgRepayOrderMapper yqgRepayOrderMapper; private final YqgRepayOrderDetailMapper yqgRepayOrderDetailMapper; private static final Logger systemLogger = LoggerFactory.getLogger("systemLogger"); @Override public ResultJson getTXFaceInfo(String phone, String name, String idNo, String channelInfo) { try { CustomerUser customerUser = customerUserService.getUserByPhone(phone); if (customerUser == null) { throw new CommonException("用户不存在"); } Map keyInfo = yxUtil.getTxKeyInfo(channelInfo); String appId = keyInfo.get("appId"); String secret = keyInfo.get("secret"); String accessTokenInfo = TXOcrUtil.getAccessToken(appId, secret); systemLogger.info("zbb378 accessTokenInfo:{}", accessTokenInfo); if (!TextUtils.isEmpty(accessTokenInfo)) { String access_token = JSON.parseObject(accessTokenInfo).getString("access_token"); if (!TextUtils.isEmpty(access_token)) { String signTicket = TXOcrUtil.getSignTicket(appId, access_token); systemLogger.info("zbb378 signTicket:{}", signTicket); if (!TextUtils.isEmpty(signTicket)) { Map faceInfoMap = new HashMap<>(); UUID uuid = UUID.randomUUID(); String nonce = uuid.toString().replace("-", ""); List values = new ArrayList<>(); values.add(appId); values.add(String.valueOf(customerUser.getId())); values.add("1.0.0"); values.add(nonce); String sign = TXOcrUtil.sign(values, signTicket); final String order = "sankuai" + System.currentTimeMillis(); String faceId = TXOcrUtil.getFaceId(appId, order, String.valueOf(customerUser.getId()), sign, name, idNo, nonce); String nonceTicket = TXOcrUtil.getNonceTicket(appId, access_token, String.valueOf(customerUser.getId())); systemLogger.info("zbb378 nonceTicket:{}", nonceTicket); if (!TextUtils.isEmpty(nonceTicket)) { List nonceValues = new ArrayList<>(); nonceValues.add(appId); nonceValues.add(String.valueOf(customerUser.getId())); nonceValues.add("1.0.0"); nonceValues.add(nonce); String nonceSign = TXOcrUtil.sign(nonceValues, nonceTicket); systemLogger.info("zbb378 nonceSign:{}", nonceSign); if (!TextUtils.isEmpty(faceId)) { //mode, appId, order, sign, faceId faceInfoMap.put("sign", nonceSign); faceInfoMap.put("appId", appId); faceInfoMap.put("order", order); faceInfoMap.put("faceId", faceId); faceInfoMap.put("nonce", nonce); faceInfoMap.put("userId", String.valueOf(customerUser.getId())); return ResultJson.ok(faceInfoMap); } } } } } } catch (Exception e) { e.printStackTrace(); } throw new CommonException("获取人脸核身的SIGN和NONCE信息失败"); } @Override public ResultJson getTXOcrInfo(String phone, String channelInfo) { try { CustomerUser customerUser = customerUserService.getUserByPhone(phone); if (customerUser == null) { throw new CommonException("用户不存在"); } Map keyInfo = yxUtil.getTxKeyInfo(channelInfo); String appId = keyInfo.get("appId"); String secret = keyInfo.get("secret"); String accessTokenInfo = TXOcrUtil.getAccessToken(appId, secret); systemLogger.info("zbb378 getTXOcrInfo: appId {} secret {} accessTokenInfo {} ", appId, secret, accessTokenInfo); if (!TextUtils.isEmpty(accessTokenInfo)) { String access_token = JSON.parseObject(accessTokenInfo).getString("access_token"); if (!TextUtils.isEmpty(access_token)) { String nonceTicket = TXOcrUtil.getNonceTicket(appId, access_token, String.valueOf(customerUser.getId())); if (!TextUtils.isEmpty(nonceTicket)) { Map ocrInfo = new HashMap<>(); UUID uuid = UUID.randomUUID(); String nonce = uuid.toString().replace("-", ""); List nonceValues = new ArrayList<>(); nonceValues.add(appId); nonceValues.add(String.valueOf(customerUser.getId())); nonceValues.add("1.0.0"); nonceValues.add(nonce); String nonceSign = TXOcrUtil.sign(nonceValues, nonceTicket); final String order = "sankuaiOcr" + System.currentTimeMillis(); //mode, appId, order, sign, faceId ocrInfo.put("sign", nonceSign); ocrInfo.put("appId", appId); ocrInfo.put("order", order); ocrInfo.put("nonce", nonce); ocrInfo.put("userId", String.valueOf(customerUser.getId())); return ResultJson.ok(ocrInfo); } } } } catch (Exception e) { e.printStackTrace(); } throw new CommonException("获取ocr签名信息失败"); } @Override @Transactional(rollbackFor = Exception.class) public ResultJson getYxContractListQuery(UserDetail userDetail) { CustomerUser customerUser = customerUserService.lambdaQuery().eq(CustomerUser::getPhone, userDetail.getPhone()).one(); if (customerUser == null) { throw new CommonException("用户不存在"); } String logNumber = IdUtil.randomUUID(); // logger.info("日志编号:" + logNumber + "获取绿地授信合同开始"); YxContractResponse yxContractResponse = yxUtil.yxContractListQuery(String.valueOf(customerUser.getId()), "00", null, YXUtil.FUNDING_YIXIN, logger, logNumber); if (yxContractResponse != null && yxContractResponse.isSuccess()) { return ResultJson.ok(yxContractResponse.getContractLists()); } // logger.info("日志编号:" + logNumber + "获取绿地授信合同结束"); return ResultJson.failure(ResultCode.BAD_REQUEST, yxContractResponse == null ? "" : yxContractResponse.getResponseMsg() == null ? "" : yxContractResponse.getResponseMsg()); } @Override public String yxAuditCallback(Map request) throws Exception { Map resultMap = new HashMap<>(); String logNumber = IdUtil.randomUUID(); logger.info("日志编号:" + logNumber + "授信审批结果通知参数:{}", request); if (request != null) { Map result = YXSignUtil.parseLVDiRequest(request, YXUtil.getLocalPrivateKey(), yxUtil.getLvDiPublicKey()); String params = result.get("params").toString(); if (!TextUtils.isEmpty(params)) { logger.info("params:{}", params); YxAuditCallbackRequest yxAuditCallbackRequest = JSON.parseObject(params, YxAuditCallbackRequest.class); if (yxAuditCallbackRequest != null) { String creditNo = yxAuditCallbackRequest.getCreditNo(); logger.info("creditNo:{}", creditNo); if (creditNo != null) { CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.lambdaQuery() .eq(CustomerCapitalResult::getCreditNo, creditNo)); if (capitalResult != null) { Integer approvalResult = capitalResult.getApprovalResult(); capitalResult = updateByApprovalReturn(capitalResult, yxAuditCallbackRequest); notifyYqgByAudit(capitalResult, approvalResult, logger, logNumber); rongYiTuiBack(capitalResult, yxAuditCallbackRequest); resultMap.put("responseCode", "0000"); resultMap.put("responseMsg", "成功"); logger.info("日志编号:" + logNumber + "授信审批结果成功回调:{}", resultMap); return YXSignUtil.buildResponse(resultMap, YXUtil.getLocalPrivateKey(), yxUtil.getLvDiPublicKey()); } } } } } resultMap.put("responseCode", "9999"); resultMap.put("responseMsg", "失败"); logger.info("日志编号:" + logNumber + "授信审批结果失败回调:{}", resultMap); return YXSignUtil.buildResponse(resultMap, YXUtil.getLocalPrivateKey(), yxUtil.getLvDiPublicKey()); } private void notifyYqgByAudit(CustomerCapitalResult capitalResult, Integer approvalResult, Logger logger, String logNumber) { try { if (CapitalApprovalResultEnum.APPROVAL_SUCCESS.getCode().equals(capitalResult.getApprovalResult()) && StringUtils.isEmpty(capitalResult.getSubExpDate())) { YXAuditResponse yxAuditResponse = yxUtil.yxGetCreditAudit(capitalResult.getCustomerUserId().toString(), capitalResult.getCreditNo(), YXUtil.FUNDING_JQTX, logger, logNumber); if (yxAuditResponse != null && yxAuditResponse.isSuccess() && capitalResult != null) { capitalResult = updateByApprovalReturn(capitalResult, yxAuditResponse); } } //洋钱罐授信状态更新 if (CapitalApprovalResultEnum.APPROVAL_WAIT.getCode().equals(approvalResult) && !Objects.equals(approvalResult, capitalResult.getApprovalResult()) && CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode().equals(capitalResult.getCapitalResultSourceCode())) { CreditResultResponse feedBackDto = CreditResultResponse.parse(capitalResult); if (feedBackDto != null) { logger.info("日志编号:" + logNumber + "授信审批回调通知洋钱罐开始,原始参数" + feedBackDto.toString()); yqgUtil.creditResultFeedBack(feedBackDto, logger, logNumber); } } } catch (Exception e) { logger.error("日志编号:" + logNumber + "授信审批回调通知洋钱罐异常", e); } } @Override public YXAuditResponse getYxCreditAudit(String phone) { CustomerUser customerUser = customerUserService.getUserByPhone(phone); if (customerUser == null) { throw new CommonException("该用户不存在"); } Customer customer = customerMapper.getLatestCustomerRecord(customerUser.getPhone()); if (customer == null) { throw new CommonException("没有有效的申请记录"); } CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.lambdaQuery() .eq(CustomerCapitalResult::getCustomerUserId, customerUser.getId()) .eq(CustomerCapitalResult::getCustomerRecordId, customer.getId()) .eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.YI_XIN)); if (TextUtils.isEmpty(capitalResult.getCreditNo())) { throw new CommonException("授信编号为空"); } String logNumber = IdUtil.randomUUID(); logger.info("日志编号:" + logNumber + "授信申请查询开始"); YXAuditResponse yxResponse = yxUtil.yxGetCreditAudit(customerUser.getId().toString(), capitalResult.getCreditNo(), yxUtil.getFunding(capitalResult.getCapitalInfoCode()), logger, logNumber); if (yxResponse != null) { if (yxResponse.isSuccess()) { if (capitalResult != null) { updateByApprovalReturn(capitalResult, yxResponse); } return yxResponse; } else { if (yxResponse.getResponseCode().equals("ER0128")) { logger.error("日志编号:" + logNumber + "授信审批查询失败" + yxResponse); throw new CommonException("授信审批查询失败" + yxResponse); } logger.error("日志编号:" + logNumber + "参数不合法" + yxResponse); throw new CommonException("参数不合法" + yxResponse.getResponseMsg() == null ? "" : yxResponse.getResponseMsg()); } } logger.info("日志编号:" + logNumber + "授信申请查询结束"); throw new CommonException("宜信接口调用错误,授信审批查询失败"); } @Override public CustomerCapitalResult updateByApprovalReturn(CustomerCapitalResult capitalResult, YXAuditResponse yxResponse) { String currentDate = DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"); capitalResult.setTotalCredit(yxResponse.getTotalCredit()); capitalResult.setSubExpDate(yxResponse.getSubExpDate()); capitalResult.setRateType(yxResponse.getRateType()); capitalResult.setQuotaRate(yxResponse.getQuotaRate()); capitalResult.setAvailableAmount(yxResponse.getAvailableAmount()); capitalResult.setCreditContractNo(yxResponse.getCreditContractNo()); capitalResult.setFailedReason(yxResponse.getFailedReason()); capitalResult.setStepAmount(yxResponse.getStepAmount()); capitalResult.setPeriods(yxResponse.getPeriods()); capitalResult.setMaxAmount(yxResponse.getMaxAmount()); capitalResult.setMinAmount(yxResponse.getMinAmount()); capitalResult.setApprovalTermUnit(yxResponse.getApprovalTermUnit()); capitalResult.setFreezeTime(yxResponse.getFreezeTime()); if (StringUtils.isNotEmpty(yxResponse.getCreditApplyTime())) { capitalResult.setCreditApplyTime(yxResponse.getCreditApplyTime()); } else { capitalResult.setCreditApplyTime(currentDate); } if (YxAuditCallbackRequest.SUCCESS.equals(yxResponse.getApprovalResult())) { capitalResult.setApprovalResult(CapitalApprovalResultEnum.APPROVAL_SUCCESS.getCode()); } else if (YxAuditCallbackRequest.REFUSE.equals(yxResponse.getApprovalResult())) { capitalResult.setApprovalResult(CapitalApprovalResultEnum.APPROVAL_REFUSE.getCode()); } capitalResult.setLastUpdatedDate(new Date()); customerCapitalResultMapper.update(null, Wrappers.lambdaUpdate() .set(CustomerCapitalResult::getTotalCredit, capitalResult.getTotalCredit()) .set(CustomerCapitalResult::getSubExpDate, capitalResult.getSubExpDate()) .set(CustomerCapitalResult::getRateType, capitalResult.getRateType()) .set(CustomerCapitalResult::getQuotaRate, capitalResult.getQuotaRate()) .set(CustomerCapitalResult::getAvailableAmount, capitalResult.getAvailableAmount()) .set(CustomerCapitalResult::getCreditContractNo, capitalResult.getCreditContractNo()) .set(CustomerCapitalResult::getCreditApplyTime, capitalResult.getCreditApplyTime()) .set(CustomerCapitalResult::getFailedReason, capitalResult.getFailedReason()) .set(CustomerCapitalResult::getStepAmount, capitalResult.getStepAmount()) .set(CustomerCapitalResult::getPeriods, capitalResult.getPeriods()) .set(CustomerCapitalResult::getMaxAmount, capitalResult.getMaxAmount()) .set(CustomerCapitalResult::getMinAmount, capitalResult.getMinAmount()) .set(CustomerCapitalResult::getApprovalTermUnit, capitalResult.getApprovalTermUnit()) .set(CustomerCapitalResult::getFreezeTime, capitalResult.getFreezeTime()) .set(CustomerCapitalResult::getApprovalResult, capitalResult.getApprovalResult()) .set(CustomerCapitalResult::getLastUpdatedDate, capitalResult.getLastUpdatedDate()) .eq(CustomerCapitalResult::getId, capitalResult.getId())); return capitalResult; } @Override public YXCreditLimitResponse getYxCreditLimit(UserDetail userDetail) { CustomerUser customerUser = customerUserService.getUserByPhone(userDetail.getPhone()); if (customerUser == null) { throw new CommonException("用户不存在"); } Customer customer = customerMapper.getLatestCustomerRecord(customerUser.getPhone()); if (customer == null) { throw new CommonException("没有有效的申请记录"); } CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.lambdaQuery() .eq(CustomerCapitalResult::getCustomerUserId, customerUser.getId()) .eq(CustomerCapitalResult::getCustomerRecordId, customer.getId()) .eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.YI_XIN)); if (capitalResult == null) { throw new CommonException("用户资方对接结果不存在"); } String logNumber = IdUtil.randomUUID(); logger.info("日志编号:" + logNumber + "授信额度查询开始"); YXCreditLimitResponse yxResponse = yxUtil.yxGetCreditLimit(customerUser.getId().toString(), capitalResult.getCreditNo(), yxUtil.getFunding(capitalResult.getCapitalInfoCode()), logger, logNumber); if (yxResponse != null) { if (yxResponse.isSuccess()) { return yxResponse; } else { if (yxResponse.getResponseCode().equals("ER0128")) { logger.error("日志编号:" + logNumber + "额度查询失败" + yxResponse); throw new CommonException("额度查询失败" + yxResponse); } logger.error("日志编号:" + logNumber + "参数不合法" + yxResponse); throw new CommonException("参数不合法" + yxResponse.getResponseMsg() == null ? "" : yxResponse.getResponseMsg()); } } logger.info("日志编号:" + logNumber + "授信额度查询结束"); throw new CommonException("宜信接口调用错误,额度查询失败"); } @Override public ResultJson uploadBase64File(String base64Info) { // 通过base64来转化图片 if (base64Info.contains("data:image/jpeg;base64")) { base64Info = base64Info.replaceAll("data:image/jpeg;base64,", ""); } else if (base64Info.contains("data:image/jpg;base64,")) { base64Info = base64Info.replaceAll("data:image/jpg;base64,", ""); } else if (base64Info.contains("data:image/png;base64,")) { base64Info = base64Info.replaceAll("data:image/png;base64,", ""); } BASE64Decoder decoder = new BASE64Decoder(); // Base64解码 byte[] imageByte; try { imageByte = decoder.decodeBuffer(base64Info); for (int i = 0; i < imageByte.length; ++i) { //调整异常数据 if (imageByte[i] < 0) { imageByte[i] += 256; } } String fileUrl = imageUtil.uploadBase64File(imageByte, false); systemLogger.info("base64上传图片成功:{}",fileUrl); return ResultJson.ok(fileUrl); } catch (Exception e) { e.printStackTrace(); systemLogger.error("base64上传图片失败:{}",e); } return ResultJson.failure(ResultCode.SERVER_ERROR); } @Override public String yxLoanApplyCallback(Map request) throws Exception { Map resultMap = new HashMap<>(); String logNumber = IdUtil.randomUUID(); logger.info("日志编号:" + logNumber + "用信结果通知回调接口参数:{}", request); if (request != null) { Map result = YXSignUtil.parseLVDiRequest(request, YXUtil.getLocalPrivateKey(), yxUtil.getLvDiPublicKey()); String params = result.get("params").toString(); if (!TextUtils.isEmpty(params)) { logger.info("params:{}", params); YxLoanApplyCallbackResult yxAuditCallbackRequest = JSON.parseObject(params, YxLoanApplyCallbackResult.class); if (yxAuditCallbackRequest != null) { String loanNo = yxAuditCallbackRequest.getLoanNo(); logger.info("loanNo:{}", loanNo); if (loanNo != null) { CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.lambdaQuery() .eq(CustomerCapitalResult::getLoanNo, loanNo)); if (capitalResult != null) { Integer loanApplyResult = capitalResult.getLoanApplyResult(); capitalResult = updateByLoanReturn(capitalResult, yxAuditCallbackRequest); notifyYqgByLoanApply(capitalResult, loanApplyResult, logger, logNumber); resultMap.put("responseCode", "0000"); resultMap.put("responseMsg", "成功"); logger.info("日志编号:" + logNumber + "用信结果通知接口成功回调:{}", resultMap); return YXSignUtil.buildResponse(resultMap, YXUtil.getLocalPrivateKey(), yxUtil.getLvDiPublicKey()); } } } } } resultMap.put("responseCode", "9999"); resultMap.put("responseMsg", "失败"); logger.info("日志编号:" + logNumber + "用信结果通知接口失败回调:{}", resultMap); return YXSignUtil.buildResponse(resultMap, YXUtil.getLocalPrivateKey(), yxUtil.getLvDiPublicKey()); } private void notifyYqgByLoanApply(CustomerCapitalResult capitalResult, Integer loanApplyResult, Logger logger, String logNumber) { try { //洋钱罐订单状态更新 if (CapitalLoanApplyResultEnum.WAIT.getCode().equals(loanApplyResult) && !Objects.equals(loanApplyResult, capitalResult.getLoanApplyResult()) && CapitalResultSourceCodeEnum.YANG_QIAN_GUAN.getCode().equals(capitalResult.getCapitalResultSourceCode())) { OrderUpdateStatusDto orderUpdateStatusDto = OrderUpdateStatusDto.parseDto(capitalResult); if (orderUpdateStatusDto != null) { logger.info("日志编号:" + logNumber + "借款结果回调通知洋钱罐开始,原始参数", orderUpdateStatusDto.toString()); yqgUtil.orderUpdateStatus(orderUpdateStatusDto, logger, logNumber); } } } catch (Exception e) { logger.error("日志编号:" + logNumber + "借款结果回调通知洋钱罐异常", e); } } @Override public CustomerCapitalResult updateByLoanReturn(CustomerCapitalResult capitalResult, YxLoanResultQueryResponse yxResponse) { if (CapitalResultStatusEnum.LOAN.getCode().equals(capitalResult.getStatus()) && CapitalLoanApplyResultEnum.WAIT.getCode().equals(capitalResult.getLoanApplyResult())) { capitalResult.setLoanResultDesc(yxResponse.getLoanResultDesc()); capitalResult.setLoanTime(yxResponse.getLoanTime()); capitalResult.setFreezeTime(yxResponse.getFreezeTime()); Integer result = CapitalLoanApplyResultEnum.parseLvDiLoanResult(yxResponse.getLoanResult()); capitalResult.setLoanApplyResult(result); capitalResult.setLastUpdatedDate(new Date()); customerCapitalResultMapper.update(null, Wrappers.lambdaUpdate() .set(CustomerCapitalResult::getLoanResultDesc, capitalResult.getLoanResultDesc()) .set(CustomerCapitalResult::getLoanTime, capitalResult.getLoanTime()) .set(CustomerCapitalResult::getFreezeTime, capitalResult.getFreezeTime()) .set(CustomerCapitalResult::getLoanApplyResult, capitalResult.getLoanApplyResult()) .set(CustomerCapitalResult::getLastUpdatedDate, capitalResult.getLastUpdatedDate()) .eq(CustomerCapitalResult::getId, capitalResult.getId())); } return capitalResult; } @Override public String yxRepayPlanCallback(Map request) throws Exception { Map resultMap = new HashMap<>(); String logNumber = IdUtil.randomUUID(); logger.info("日志编号:" + logNumber + "绿地还款计划变动通知回调接口参数:{}", request); if (request != null) { Map result = YXSignUtil.parseLVDiRequest(request, YXUtil.getLocalPrivateKey(), yxUtil.getLvDiPublicKey()); String params = result.get("params").toString(); if (!TextUtils.isEmpty(params)) { logger.info("params:{}", params); YxRepaymentPlanQueryResponse response = JSON.parseObject(params, YxRepaymentPlanQueryResponse.class); if (response != null) { String loanNo = response.getLoanNo(); logger.info("loanNo:{}", loanNo); if (loanNo != null) { CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.lambdaQuery() .eq(CustomerCapitalResult::getLoanNo, loanNo)); if (capitalResult != null) { List periodNoList = yqgRepayOrderDetailMapper.getRepayPeriodNoList(capitalResult.getLoanNo()); RepayPlanResponse repayPlanResponse = new RepayPlanResponse(); List detailPlans = new ArrayList<>(); repayPlanResponse.setOrderNo(capitalResult.getLoanNo()); 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) { capitalResult.setRepayResult(1); capitalResult.setLastUpdatedDate(new Date()); customerCapitalResultMapper.update(null, Wrappers.lambdaUpdate() .set(CustomerCapitalResult::getRepayResult, capitalResult.getRepayResult()) .set(CustomerCapitalResult::getLastUpdatedDate, capitalResult.getLastUpdatedDate()) .eq(CustomerCapitalResult::getId, capitalResult.getId())); OrderUpdateStatusDto orderUpdateStatusDto = OrderUpdateStatusDto.parseDto(capitalResult); if (orderUpdateStatusDto != null) { yqgUtil.orderUpdateStatus(orderUpdateStatusDto, logger, logNumber); } } repayPlanResponse.setDetailPlans(detailPlans); yqgUtil.repaymentUpdatePlan(repayPlanResponse, logger, logNumber); resultMap.put("responseCode", "0000"); resultMap.put("responseMsg", "成功"); logger.info("日志编号:" + logNumber + "绿地还款计划变动通知接口成功回调:{}", resultMap); return YXSignUtil.buildResponse(resultMap, YXUtil.getLocalPrivateKey(), yxUtil.getLvDiPublicKey()); } } } } } resultMap.put("responseCode", "9999"); resultMap.put("responseMsg", "失败"); logger.info("日志编号:" + logNumber + "绿地还款计划变动通知接口失败回调:{}", resultMap); return YXSignUtil.buildResponse(resultMap, YXUtil.getLocalPrivateKey(), yxUtil.getLvDiPublicKey()); } @Override public String yxRepayResultCallback(Map request) throws Exception { Map resultMap = new HashMap<>(); String logNumber = IdUtil.randomUUID(); logger.info("日志编号:" + logNumber + "绿地还款结果通知接口参数:{}", request); if (request != null) { Map result = YXSignUtil.parseLVDiRequest(request, YXUtil.getLocalPrivateKey(), yxUtil.getLvDiPublicKey()); String params = result.get("params").toString(); if (!TextUtils.isEmpty(params)) { logger.info("params:{}", params); YxRepaymentResultResponse yxRepaymentResult = JSON.parseObject(params, YxRepaymentResultResponse.class); if (yxRepaymentResult != null) { String repayApplyNo = yxRepaymentResult.getRepayApplyNo(); logger.info("repayApplyNo:{}", repayApplyNo); if (StringUtils.isNotEmpty(repayApplyNo)) { CustomerCapitalResult capitalResult = customerCapitalResultMapper.selectOne(Wrappers.lambdaQuery() .eq(CustomerCapitalResult::getLoanNo, yxRepaymentResult.getLoanNo())); YqgRepayOrder yqgRepayOrder = yqgRepayOrderMapper.selectOne(Wrappers.lambdaQuery() .eq(YqgRepayOrder::getRepayApplyNo, repayApplyNo)); if (capitalResult != null && yqgRepayOrder != null) { Integer status = yqgRepayOrder.getStatus(); yqgRepayOrder = updateByRepayResultReturn(yqgRepayOrder, yxRepaymentResult); notifyYqgByRepayResult(yqgRepayOrder, capitalResult, status, logger, logNumber); resultMap.put("responseCode", "0000"); resultMap.put("responseMsg", "成功"); logger.info("日志编号:" + logNumber + "绿地还款结果通知接口成功回调:{}", resultMap); return YXSignUtil.buildResponse(resultMap, YXUtil.getLocalPrivateKey(), yxUtil.getLvDiPublicKey()); } } } } } resultMap.put("responseCode", "9999"); resultMap.put("responseMsg", "失败"); logger.info("日志编号:" + logNumber + "绿地还款结果通知接口失败回调:{}", resultMap); return YXSignUtil.buildResponse(resultMap, YXUtil.getLocalPrivateKey(), yxUtil.getLvDiPublicKey()); } public void rongYiTuiBack(CustomerCapitalResult capitalResult, YxAuditCallbackRequest yxAuditCallbackRequest) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String entryDate = simpleDateFormat.format(System.currentTimeMillis()); try { CustomerUser customerUser = customerUserService.getOne(new LambdaQueryWrapper().eq(CustomerUser::getId, capitalResult.getCustomerUserId())); if (CapitalApprovalResultEnum.APPROVAL_SUCCESS.getCode().equals(capitalResult.getApprovalResult()) && CapitalResultSourceCodeEnum.RONG_YI_TUI.getCode().equals(capitalResult.getCapitalResultSourceCode()) && customerUser.getCallBackResult() == 0) { String totalCredit = yxAuditCallbackRequest.getTotalCredit(); Integer integer = null; if (StringUtils.isNotEmpty(totalCredit)) { integer = Integer.parseInt(totalCredit) * 100; } RongYiTuiResponse rongYiTuiResponse = rongYiTuiUtil.creditResult(customerUser.getPhone(), customerUser.getBusinessNo(), yxAuditCallbackRequest, integer, entryDate); if (rongYiTuiResponse != null) { logger.info("融易推授信结果通知返回:{}", rongYiTuiResponse.toString()); } else { logger.info("融易推授信结果通知返回失败"); } customerUserService.update(Wrappers.lambdaUpdate() .set(CustomerUser::getCallBackResult, 1) .eq(CustomerUser::getId, customerUser.getId())); } } catch (Exception e) { e.printStackTrace(); logger.error("融易推授信结果回调绿地接口失败,错误信息:", e); } } private void notifyYqgByRepayResult(YqgRepayOrder yqgRepayOrder, CustomerCapitalResult capitalResult, Integer status, Logger logger, String logNumber) { try { //洋钱罐订单状态更新 if (YqgRepayOrder.STATUS_WAIT.equals(status) && !Objects.equals(status, yqgRepayOrder.getStatus())) { RepayResultReturnDto feedBackDto = null; if (YqgRepayOrder.STATUS_SUCCESS.equals(yqgRepayOrder.getStatus())) { YxRepaymentPlanQueryDto yxRepaymentPlanQueryDto = new YxRepaymentPlanQueryDto(capitalResult); YxRepaymentPlanQueryResponse planQuery = yxUtil.yxRepaymentPlanQuery(yxRepaymentPlanQueryDto, yxUtil.getFunding(capitalResult.getCapitalInfoCode()), logger, logNumber); feedBackDto = RepayResultReturnDto.parseDto(yqgRepayOrder, planQuery); } else { feedBackDto = RepayResultReturnDto.parseDto(yqgRepayOrder, null); } if (feedBackDto != null) { logger.info("日志编号:" + logNumber + "还款结果回调通知洋钱罐开始,原始参数" + feedBackDto.toString()); yqgUtil.repayResultFeedBack(feedBackDto, logger, logNumber); } else { logger.error("日志编号:" + logNumber + "还款结果回调通知洋钱罐失败,构建还款成功请求参数失败:" + yqgRepayOrder.toString()); } } } catch (Exception e) { logger.error("日志编号:" + logNumber + "还款结果回调通知洋钱罐异常", e); } } public YqgRepayOrder updateByRepayResultReturn(YqgRepayOrder yqgRepayOrder, YxRepaymentResultResponse yxRepaymentResult) { if (YqgRepayOrder.STATUS_WAIT.equals(yqgRepayOrder.getStatus())) { Integer status = YqgRepayOrder.parseLvDiStatus(yxRepaymentResult.getStatus()); if (status != null) { yqgRepayOrder.setStatus(status); yqgRepayOrder.setRepayTime(yxRepaymentResult.getRepayTime()); yqgRepayOrder.setRemark(yxRepaymentResult.getResult()); yqgRepayOrder.setLastUpdatedDate(new Date()); yqgRepayOrderMapper.update(null, Wrappers.lambdaUpdate() .set(YqgRepayOrder::getStatus, yqgRepayOrder.getStatus()) .set(YqgRepayOrder::getRepayTime, yqgRepayOrder.getRepayTime()) .set(YqgRepayOrder::getRemark, yqgRepayOrder.getRemark()) .set(YqgRepayOrder::getLastUpdatedDate, yqgRepayOrder.getLastUpdatedDate()) .eq(YqgRepayOrder::getId, yqgRepayOrder.getId())); Integer detailStatus = YqgRepayOrderDetail.parseStatus(status); if (detailStatus != null) { yqgRepayOrderDetailMapper.updateStatusByRepayResult(yqgRepayOrder.getRepayNo(), detailStatus); } } } return yqgRepayOrder; } }