package com.nova.sankuai.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.nova.sankuai.domain.api.doudouqian.*; import com.nova.sankuai.domain.dto.DdqBindCardDto; import com.nova.sankuai.domain.entity.CapitalInfo; import com.nova.sankuai.domain.entity.Customer; import com.nova.sankuai.domain.entity.CustomerCapitalResult; import com.nova.sankuai.domain.entity.CustomerUser; import com.nova.sankuai.domain.enums.capitalInfo.CapitalApprovalResultEnum; import com.nova.sankuai.domain.enums.capitalInfo.CapitalInfoTypeCodeEnum; import com.nova.sankuai.domain.vo.DdqBindCardVo; import com.nova.sankuai.domain.vo.DdqPopupVo; import com.nova.sankuai.domain.vo.DdqSupportBankVo; import com.nova.sankuai.infra.config.CommonException; import com.nova.sankuai.infra.mapper.CapitalInfoMapper; import com.nova.sankuai.infra.mapper.CustomerCapitalResultMapper; import com.nova.sankuai.infra.mapper.CustomerMapper; import com.nova.sankuai.infra.mapper.CustomerUserMapper; import com.nova.sankuai.infra.utils.MessageSendUtil; import com.nova.sankuai.service.ICapitalResultCommonService; import com.nova.sankuai.service.IDouDouQianService; import lombok.AllArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; /** * @author weikangdi * @create 2022/7/28 */ @Service @AllArgsConstructor public class DouDouQianServiceImpl implements IDouDouQianService { private final DdqUtil ddqUtil; private final CustomerMapper customerMapper; private final ICapitalResultCommonService capitalResultCommonService; private final CustomerCapitalResultMapper capitalResultMapper; private final CustomerUserMapper customerUserMapper; private final CapitalInfoMapper capitalInfoMapper; private final MessageSendUtil messageSendUtil; private static final Logger log = LoggerFactory.getLogger("capitalLogger"); @Override public List getSupportBankList(HttpServletRequest request) { List result = new ArrayList<>(); CustomerUser customerUser = capitalResultCommonService.checkUser(request); BankListVo bankList = ddqUtil.getBankList(customerUser.getPhone()); if (bankList != null) { for (BankListVo.BackVo bank : bankList.getBanks()) { DdqSupportBankVo supportBankVo = new DdqSupportBankVo(); supportBankVo.setBankCode(bank.getBankAbbr()); supportBankVo.setBankName(bank.getBankName()); result.add(supportBankVo); } return result; } throw new CommonException("获取支持银行卡列表失败"); } @Override public DdqBindCardVo bindCardByDDQ(DdqBindCardDto bindCardDto, HttpServletRequest request) { Customer customer = customerMapper.getLatestCustomerRecord(bindCardDto.getPhone()); if (customer == null) { throw new CommonException("申请记录不存在"); } BankCardCheckVo checkVo = ddqUtil.bankCardCheck(bindCardDto); if (checkVo != null) { customerMapper.update(null, Wrappers.lambdaUpdate() .set(Customer::getCardNo, bindCardDto.getCardNo()) .set(Customer::getBankName, bindCardDto.getBankName()) .set(Customer::getBankCode, bindCardDto.getBankCode()) .set(Customer::getBankPhoneNo, bindCardDto.getBankPhoneNo()) .set(Customer::getBankCardName, bindCardDto.getBankCardName()) .eq(Customer::getId, customer.getId())); DdqBindCardVo bindCardVo = new DdqBindCardVo(); if (BankCardCheckVo.NEED_VERIFY_CODE.equals(checkVo.getNeedVerify())) { bindCardVo.setNeedVerify(true); return bindCardVo; } else if (BankCardCheckVo.NOT_NEED_VERIFY_CODE.equals(checkVo.getNeedVerify())) { CustomerUser customerUser = capitalResultCommonService.checkUser(request); capitalResultMapper.update(null, Wrappers.lambdaUpdate() .set(CustomerCapitalResult::getHasBindCard, 1) .set(CustomerCapitalResult::getBankName, bindCardDto.getBankName()) .set(CustomerCapitalResult::getBankCardNo, bindCardDto.getCardNo()) .set(CustomerCapitalResult::getBankCode, bindCardDto.getBankCode()) .set(CustomerCapitalResult::getBankPhoneNo, bindCardDto.getBankPhoneNo()) .set(CustomerCapitalResult::getBankCardName, bindCardDto.getBankCardName()) .eq(CustomerCapitalResult::getCustomerUserId, customerUser.getId()) .eq(CustomerCapitalResult::getCustomerRecordId, customer.getId()) .eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.DOU_DOU_QIAN.getCode())); bindCardVo.setNeedVerify(false); return bindCardVo; } } throw new CommonException("银行卡绑定异常"); } @Override public boolean bindCardConfirmByDDQ(DdqBindCardDto bindCardDto, HttpServletRequest request) { Customer customer = customerMapper.getLatestCustomerRecord(bindCardDto.getPhone()); if (customer == null) { throw new CommonException("申请记录不存在"); } BindCardVo bindCardVo = ddqUtil.bindCard(bindCardDto); if (bindCardVo != null) { CustomerUser customerUser = capitalResultCommonService.checkUser(request); capitalResultMapper.update(null, Wrappers.lambdaUpdate() .set(CustomerCapitalResult::getHasBindCard, 1) .set(CustomerCapitalResult::getBankName, bindCardDto.getBankName()) .set(CustomerCapitalResult::getBankCardNo, bindCardDto.getCardNo()) .set(CustomerCapitalResult::getBankCode, bindCardDto.getBankCode()) .set(CustomerCapitalResult::getBankPhoneNo, bindCardDto.getBankPhoneNo()) .set(CustomerCapitalResult::getBankCardName, bindCardDto.getBankCardName()) .eq(CustomerCapitalResult::getCustomerUserId, customerUser.getId()) .eq(CustomerCapitalResult::getCustomerRecordId, customer.getId()) .eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.DOU_DOU_QIAN.getCode())); return true; } return false; } @Override public boolean bindCard(DdqBindCardDto bindCardDto, HttpServletRequest request) { Customer customer = customerMapper.getLatestCustomerRecord(bindCardDto.getPhone()); if (customer == null) { throw new CommonException("申请记录不存在"); } CustomerUser customerUser = capitalResultCommonService.checkUser(request); capitalResultMapper.update(null, Wrappers.lambdaUpdate() .set(CustomerCapitalResult::getHasBindCard, 1) .set(CustomerCapitalResult::getBankName, bindCardDto.getBankName()) .set(CustomerCapitalResult::getBankCardNo, bindCardDto.getCardNo()) .set(CustomerCapitalResult::getBankCode, bindCardDto.getBankCode()) .set(CustomerCapitalResult::getBankPhoneNo, bindCardDto.getBankPhoneNo()) .set(CustomerCapitalResult::getBankCardName, bindCardDto.getBankCardName()) .eq(CustomerCapitalResult::getCustomerUserId, customerUser.getId()) .eq(CustomerCapitalResult::getCustomerRecordId, customer.getId()) .eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.DOU_DOU_QIAN.getCode())); return true; } @Override public String pushAuditResult(String param, String logNumber) { JSONObject response = new JSONObject(); try { String request = ddqUtil.parseRequest(param); log.info("日志编号:" + logNumber + "豆豆钱授信结果回调解密参数 -> {}", request); AuditResultVo auditResultVo = JSON.parseObject(request, AuditResultVo.class); if (auditResultVo != null) { AuditResultDetailVo auditResultDetailVo = JSON.parseObject(auditResultVo.getData(), AuditResultDetailVo.class); CustomerUser customerUser = customerUserMapper.selectOne(Wrappers.lambdaQuery() .eq(CustomerUser::getPhone, auditResultVo.getMobile())); if (customerUser == null) { throw new CommonException("用户不存在"); } Customer customer = customerMapper.getLatestCustomerRecord(auditResultVo.getMobile()); if (customer == null) { throw new CommonException("申请记录不存在"); } CustomerCapitalResult capitalResult = capitalResultMapper.selectOne(Wrappers.lambdaQuery() .eq(CustomerCapitalResult::getCustomerUserId, customerUser.getId()) .eq(CustomerCapitalResult::getCustomerRecordId, customer.getId()) .eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.DOU_DOU_QIAN.getCode())); if (capitalResult == null) { throw new CommonException("授信记录不存在"); } CapitalInfo capitalInfo = capitalInfoMapper.selectById(capitalResult.getCapitalInfoId()); if (capitalInfo == null) { throw new CommonException("对接产品不存在"); } if (CapitalApprovalResultEnum.APPROVAL_WAIT.getCode().equals(capitalResult.getApprovalResult())) { if (AuditResultDetailVo.STATUS_SUCCESS.equals(auditResultDetailVo.getStatus())) { capitalResultMapper.update(null, Wrappers.lambdaUpdate() .set(CustomerCapitalResult::getTotalCredit, auditResultDetailVo.getApprovalAmount()) .set(CustomerCapitalResult::getApprovalResult, CapitalApprovalResultEnum.APPROVAL_SUCCESS.getCode()) .set(CustomerCapitalResult::getCreditApplyTime, auditResultDetailVo.getProcessTime()) .set(CustomerCapitalResult::getLastUpdatedDate, new Date()) .set(CustomerCapitalResult::getPopupDdq, 0) .set(CustomerCapitalResult::getPeriods, auditResultDetailVo.getApprovalTerm()) .eq(CustomerCapitalResult::getId, capitalResult.getId())); //授信通过后给用户发送短信 try { String content = String.format("【%s】恭喜您,您的授信已通过,额度%s元。请尽快登录APP使用额度,避免额度过期", capitalInfo.getName(), auditResultDetailVo.getApprovalAmount()); messageSendUtil.sendMessage(auditResultVo.getMobile(), content); log.info("日志编号:" + logNumber + "手机号" + auditResultVo.getMobile() + "豆豆钱授信通知短信已发送"); } catch (Exception e) { log.error("豆豆钱授信通过后给用户发送短信异常", e); } } else if (AuditResultDetailVo.STATUS_FAIL.equals(auditResultDetailVo.getStatus())) { capitalResultMapper.update(null, Wrappers.lambdaUpdate() .set(CustomerCapitalResult::getApprovalResult, CapitalApprovalResultEnum.APPROVAL_REFUSE.getCode()) .set(CustomerCapitalResult::getCreditApplyTime, auditResultDetailVo.getProcessTime()) .eq(CustomerCapitalResult::getId, capitalResult.getId())); } } response.put("status", DdqResponse.STATUS_SUCCESS); return response.toJSONString(); } } catch (CommonException e) { log.error("豆豆钱授信结果回调失败:" + e.getCode()); response.put("msg", e.getCode()); } catch (Exception e) { log.error("豆豆钱授信结果回调失败:", e); response.put("msg", "解密失败"); } response.put("status", DdqResponse.STATUS_REQUEST_EXCEPTION); return response.toJSONString(); } @Override public DdqPopupVo getPopupByDdq(HttpServletRequest request) { DdqPopupVo ddqPopupVo = new DdqPopupVo(); ddqPopupVo.setIsPopUp(0); CustomerUser customerUser = capitalResultCommonService.checkUser(request); if (customerUser == null) { throw new CommonException("用户不存在"); } Customer customer = customerMapper.getLatestCustomerRecord(customerUser.getPhone()); if (customer != null) { /*CustomerCapitalResult capitalResult = capitalResultMapper.selectOne(Wrappers.lambdaQuery() .eq(CustomerCapitalResult::getCustomerUserId, customerUser.getId()) .eq(CustomerCapitalResult::getCustomerRecordId, customer.getId()) .eq(CustomerCapitalResult::getApprovalResult, CapitalApprovalResultEnum.APPROVAL_SUCCESS.getCode()) .eq(CustomerCapitalResult::getPopupDdq, 0) .eq(CustomerCapitalResult::getCapitalInfoCode, CapitalInfoTypeCodeEnum.DOU_DOU_QIAN.getCode()));*/ CustomerCapitalResult capitalResult = null; List popupDdq = new ArrayList<>(); popupDdq.add(0); popupDdq.add(1); List list = capitalResultMapper.selectList(Wrappers.lambdaQuery() .eq(CustomerCapitalResult::getCustomerUserId, customerUser.getId()) .eq(CustomerCapitalResult::getCustomerRecordId, customer.getId()) .in(CustomerCapitalResult::getPopupDdq, popupDdq)); // 根据获取到的capitalId来排序 if (list != null) { // 若是只有一个,则不进行排序等操作 if (list.size() == 1) { capitalResult = list.get(0); // 判断popupDdq是否为1,为1的话,遇把capitalResult赋值为空 if (1 == capitalResult.getPopupDdq()) { capitalResult = null; } } else { List crList = new ArrayList(); // 判断是否已弹出两个 int limitCheck = 0; for (CustomerCapitalResult cr : list) { Integer pd = cr.getPopupDdq(); if (Objects.isNull(pd)) { continue; } if (pd == 1) { limitCheck++; } } if (limitCheck >= 2) { return ddqPopupVo; } for (CustomerCapitalResult cr : list) { Long capitalInfoId = cr.getCapitalInfoId(); if (!Objects.isNull(capitalInfoId) && 0 == cr.getPopupDdq().intValue()) { crList.add(capitalInfoId); } } if (crList != null && crList.size() > 0) { List capitalInfos = capitalInfoMapper.selectList(Wrappers.lambdaQuery() .in(CapitalInfo::getId, crList) .orderByAsc(CapitalInfo::getSeq) ); if (capitalInfos != null && capitalInfos.size() > 0) { List result = new ArrayList(); for (CapitalInfo ci : capitalInfos) { if (result != null && result.size() >= 2) { break; } for (CustomerCapitalResult ccr : list) { Long infoId = ccr.getCapitalInfoId(); if (Objects.isNull(infoId)) { continue; } if (ci.getId().intValue() == infoId.intValue()) { result.add(ccr); break; } } } if (result != null && result.size() > 0) { capitalResult = result.get(0); } } } } } if (capitalResult != null) { ddqPopupVo.setIsPopUp(1); ddqPopupVo.setCapitalResultId(capitalResult.getId()); ddqPopupVo.setId(capitalResult.getCapitalInfoId()); ddqPopupVo.setUrl(capitalResult.getNotificationUrl()); capitalResultMapper.update(null, Wrappers.lambdaUpdate() .set(CustomerCapitalResult::getPopupDdq, 1) .eq(CustomerCapitalResult::getId, capitalResult.getId())); } } return ddqPopupVo; } }