package com.nova.sankuai.service.impl; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONObject; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.nova.sankuai.domain.api.aliyunIP.AliyunUtil; import com.nova.sankuai.domain.api.aliyunIP.CustomerIpInfo; import com.nova.sankuai.domain.api.baidu.BaiduDto; import com.nova.sankuai.domain.api.rongyitui.RongYiTuiResponse; import com.nova.sankuai.domain.api.rongyitui.RongYiTuiUtil; import com.nova.sankuai.domain.api.yinsheng.SerialGenerator; import com.nova.sankuai.domain.api.yixin.YXUtil; import com.nova.sankuai.domain.api.zhongan.DuolaiRequest; import com.nova.sankuai.domain.api.zhongan.ZhongAnStatus; import com.nova.sankuai.domain.api.zhongan.ZhongAnUtil; import com.nova.sankuai.domain.dto.*; import com.nova.sankuai.domain.entity.*; import com.nova.sankuai.domain.enums.*; import com.nova.sankuai.domain.enums.capitalInfo.CapitalApprovalResultEnum; import com.nova.sankuai.domain.enums.capitalInfo.CapitalInfoStatusEnum; import com.nova.sankuai.domain.enums.customerinfo.*; import com.nova.sankuai.domain.enums.vipservice.QueueVipTypeEnum; import com.nova.sankuai.domain.enums.vipservice.VipCardTypeEnum; import com.nova.sankuai.domain.vo.Version4FlowPathVo; import com.nova.sankuai.domain.vo.capitalresult.CapitalInfoAppVo; import com.nova.sankuai.domain.vo.customer.CustomerCountVo; import com.nova.sankuai.domain.vo.customer.CustomerDetail; import com.nova.sankuai.domain.vo.customer.CustomerMechanismConfigVo; import com.nova.sankuai.domain.vo.customer.CustomerVo; import com.nova.sankuai.domain.vo.platform.ImportCustomerParameter; import com.nova.sankuai.domain.vo.sysuser.MechanismVo; import com.nova.sankuai.infra.config.CommonException; import com.nova.sankuai.infra.constants.Constants; import com.nova.sankuai.infra.constants.ResultCode; import com.nova.sankuai.infra.mapper.*; import com.nova.sankuai.infra.utils.*; import com.nova.sankuai.security.UserDetail; import com.nova.sankuai.service.*; import io.swagger.models.auth.In; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * @author weikangdi */ @Service @AllArgsConstructor @Slf4j public class CustomerServiceImpl extends ServiceImpl implements ICustomerService { private SysUserMapper sysUserMapper; private CustomerMapper customerMapper; private ICityService cityService; private ICustomerUserService customerUserService; private final MessageSendUtil messageSendUtil; private final IDeductionRecordService deductionRecordService; private final ICustomerPushRecordService customerPushRecordService; private final IApiCompanyService apiCompanyService; private final ChannelInfoMapper channelInfoMapper; private final ZhongAnUtil zhongAnUtil; private final IChannelLogService channelLogService; private final RechargeRecordMapper rechargeRecordMapper; private final DeductionRecordMapper deductionRecordMapper; private final ISyncConfigService syncConfigService; private final YXUtil yxUtil; private final IVipCardOrderService vipCardOrderService; private final IChannelMechanismConfigService channelMechanismConfigService; private static final Logger systemLogger = LoggerFactory.getLogger("systemLogger"); private final AliyunUtil aliyunUtil; private final ICustomerCapitalResultService customerCapitalResultService; private final RongYiTuiUtil rongYiTuiUtil; private final CapitalInfoMapper capitalInfoMapper; private final SystemParamMapper systemParamMapper; private static final String RISK_URL = "http://bj.e086.net:7070/riskAccount/addRiskCustomerUser"; private static final String SC_H5_CHECK_URL = "https://www.zhxyp.com/index/guomei/check"; private final ICustomerCapitalResultVmService capitalResultVmService; @Override @Transactional(rollbackFor = Exception.class) public String add(Customer customer, String appId) { Integer originSource = customer.getSourceChannel(); customer = initAppIdSource(customer, appId); customer = initCustomer(customer); saveOrUpdate(customer); SysUser sysUser = sysUserMapper.selectById(customer.getMechanismId()); log.info("新增客户数据:" + customer.toString() + "匹配机构信息" + sysUser.toString()); afterSaveCustomer(MechanismVo.parse(sysUser), customer); if (sysUser.getDefaultFlag() != 1) { messageSendUtil.sendNotify(customer.getPhone(), customer.getName(), sysUser.getUserName(), sysUser.getUserPhone(), originSource); } return customer.getId().toString(); } /** * 保存之前初始化客户数据 * * @param customer * @return */ private Customer initCustomer(Customer customer) { customer.setApplyDate(new Date()); if (customer.getProvidentFund() == null) { customer.setProvidentFund(ProvidentFundStatusEnum.ProvidentFund_4.getCode()); } if (customer.getSocialSecurity() == null) { customer.setSocialSecurity(SocialSecurityStatusEnum.SocialSecurity_4.getCode()); } if (customer.getLargeLoanAmount() == null && (customer.getLoanAmount() == null || customer.getLoanAmount() == 0)) { customer.setLoanAmount(Customer.DEFAULT_QUOTA); } if (customer.getLoanTerm() == null) { customer.setLoanTerm(Customer.DEFAULT_TERM); } if (StringUtils.isEmpty(customer.getCityName())) { City city = cityService.lambdaQuery().eq(City::getCityId, customer.getCity()).one(); if (city != null) { customer.setCityName(city.getName()); } } if (customer.getMonthlyIncome() != null && customer.getFamilyMonthlyIncome() == null) { String amount = MonthlyIncomeEnum.parseAmount(customer.getMonthlyIncome()); customer.setFamilyMonthlyIncome(Double.valueOf(amount)); } return customer; } private Customer initAppIdSource(Customer customer, String appId) { ChannelInfo channelInfo = getChannelInfoByAppId(appId); if (channelInfo == null) { log.error("渠道Id非法:APPid值:" + appId + "原始客户数据:" + customer.toString()); throw new CommonException("渠道id非法"); } CustomerUser customerUser = customerUserService.lambdaQuery().eq(CustomerUser::getPhone, customer.getPhone()).one(); if (customerUser != null) { customer.setSourceChannel(customerUser.getSourceChannel()); log.info("保存渠道Id客户开始:使用用户注册的渠道值,用户注册渠道Code:" + customerUser.getSourceChannel() + "本次提交使用的渠道APPId:" + appId); } else { log.info("保存渠道Id客户开始:使用链接的APPid值:" + appId + "原始客户数据:" + customer.toString()); customer.setSourceChannel(channelInfo.getCode()); } return customer; } @Override @Transactional(rollbackFor = Exception.class) public CustomerMechanismConfigVo addLargeCustomer(Customer customer, String code, String appId) { if (!Constants.SANDBOX_KEY.equals(appId)) { MessageCodeUtil.checkCode(customer.getPhone(), code); } customer = initAppIdSource(customer, appId); Customer saveCustomer = saveCustomer(customer); CustomerMechanismConfigVo configVo = sysUserMapper.selectMechanismConfig(saveCustomer.getMechanismId()); configVo.setCustomerId(saveCustomer.getId()); return configVo; } @Transactional(rollbackFor = Exception.class) public Customer saveCustomer(Customer customer) { customer = initCustomer(customer); CustomerCompareDto parse = CustomerCompareDto.parse(customer); MechanismVo sysUser = searchMatchMechanism(parse); customer.setMechanismId(sysUser.getId()); save(customer); log.info("新增客户数据:" + customer.toString() + "匹配机构信息" + sysUser.toString()); afterSaveCustomer(sysUser, customer); return customer; } /** * 标注:保存客户之后的操作,联登 * * @param sysUser * @param customer */ private void afterSaveCustomer(MechanismVo sysUser, Customer customer) { //注册客户信息 customerUserService.registerUserByCustomer(customer); //新增扣款记录和客户推送记录 // createRechargeRecordLog(sysUser, customer); // 异步进行审批分流推送和数据同步 /*ExecutorService executor = Executors.newFixedThreadPool(1); CompletableFuture.supplyAsync(() -> { // 标注:推送客户到接口公司 联登 apiCompanyService.pushCustomer(customer); //根据数据同步配置同步数据 syncConfigService.syncData(customer); return true; }, executor);*/ } /** * 新增扣款记录和客户推送记录 * * @param sysUser * @param customer */ private void createRechargeRecordLog(MechanismVo sysUser, Customer customer) { if (sysUser.getDefaultFlag() != null && sysUser.getDefaultFlag() == 0) { Long recordId = deductionRecordService.createRecord(customer.getId(), sysUser.getId(), RechargeRecord.STATUS_NORMAL, null, sysUser.getSingleCustomerPrice()); customerPushRecordService.createRecord(customer.getId(), sysUser.getId(), recordId, CustomerPushRecord.STATUS_NORMAL, null); } } @Override public Customer calculate(Customer customer) { CustomerCompareDto parse = CustomerCompareDto.parse(customer); MechanismVo sysUser = searchMatchMechanism(parse); customer.setMechanismId(sysUser.getId()); customer.setMechanismName(sysUser.getCompanyName()); return customer; } @Override public IPage page(CustomerPageDto customerPageDto, PageRequest pageRequest) { Page page = new Page<>(pageRequest.getPageNo(), pageRequest.getPageSize()); IPage result = customerMapper.pageModel(page, customerPageDto); return result; } @Override public CustomerDetail getCustomerDetail(Long id) { Customer customer = getById(id); if (customer == null) { throw new CommonException("该客户不存在"); } CustomerDetail detail = new CustomerDetail(); BeanUtils.copyProperties(customer, detail); if (StringUtils.isEmpty(customer.getCityName())) { City city = cityService.lambdaQuery().eq(City::getCityId, customer.getCity()).one(); if (city != null) { detail.setCityName(city.getName()); } } detail.setIdCard(null); detail.setIdCardBackPath(null); detail.setIdCardFrontPath(null); detail.setProfessionInfo(ProfessionInfoEnum.value(customer.getProfessionInfo())); detail.setSesame(SesameStatusEnum.value(customer.getSesame())); detail.setSocialSecurity(SocialSecurityStatusEnum.value(customer.getSocialSecurity())); detail.setProvidentFund(ProvidentFundStatusEnum.value(customer.getProvidentFund())); detail.setHouseStatus(HouseStatusEnum.value(customer.getHouseStatus())); detail.setCarStatus(CarStatusEnum.value(customer.getCarStatus())); detail.setInsurancePolicy(InsuranceStatusEnum.value(customer.getInsurancePolicy())); detail.setCreditCard(CreditCardStatusEnum.value(customer.getCreditCard())); detail.setEducation(EducationEnum.value(customer.getEducation())); detail.setUseOfLoan(UseOfLoanEnum.value(customer.getUseOfLoan())); detail.setMonthlyIncome(MonthlyIncomeEnum.value(customer.getMonthlyIncome())); detail.setLargeLoanAmount(LargeLoanAmountEnum.value(customer.getLargeLoanAmount())); detail.setEnterpriseInfo(EnterpriseInfoEnum.value(customer.getEnterpriseInfo())); detail.setMaritalStatus(MaritalStatusEnum.value(customer.getMaritalStatus())); detail.setPayrollAgency(PayrollAgencyEnum.value(customer.getPayrollAgency())); detail.setWorkStatus(WorkStatusEnum.value(customer.getWorkStatus())); detail.setSourceName(SourceTypeEnum.value(customer.getSourceChannel())); detail.setMicroLoan(MicroLoanEnum.value(customer.getMicroLoan())); if (HouseStatusEnum.House_4.getCode().equals(customer.getHouseStatus())) { String houseDetail = ""; if (customer.getHouseAttributes() != null) { houseDetail = houseDetail + HouseAttributesEnum.value(customer.getHouseAttributes()); } if (customer.getHousePayment() != null) { houseDetail = houseDetail != null ? houseDetail + "," : houseDetail; houseDetail = houseDetail + HousePaymentEnum.value(customer.getHousePayment()); } if (StringUtils.isNotBlank(houseDetail)) { detail.setHouseStatus(detail.getHouseStatus() + "(" + houseDetail + ")"); } } return detail; } @Override @Transactional(rollbackFor = Exception.class) public MechanismVo searchMatchMechanism(CustomerCompareDto parse) { List sysUsers = new ArrayList<>(); City city = cityService.lambdaQuery().eq(City::getCityId, parse.getCity()).one(); if (city != null) { parse.setProvince(city.getProvinceId()); sysUsers = sysUserMapper.selectMechanism(parse); log.info("原始机构匹配信息:" + sysUsers.toString()); } else { log.info("机构匹配逻辑警告:客户的城市信息为空"); } MechanismVo sysUserResult = null; //根据机构渠道配置进行筛选 sysUsers = filterMechanismByChannel(sysUsers, parse.getSourceChannel()); //根据机构最低贷款额度筛选 sysUsers = filterMechanismQuota(sysUsers, parse.getQuota()); //筛选还未到当日上限的机构 sysUsers = filterMechanismLimit(sysUsers); //根据机构年龄进行筛选 sysUsers = filterMechanismAge(sysUsers, parse.getAge()); //计算匹配属性最多的机构列表 sysUsers = getMaxMatchMechanismList(sysUsers, parse); if (sysUsers != null && sysUsers.size() > 0) { if (sysUsers.size() > 1) { //根据当日占客比分配机构 sysUserResult = getPercentageMechanism(sysUsers); } else { sysUserResult = sysUsers.get(0); } } if (sysUserResult == null) { sysUserResult = sysUserMapper.selectDefaultMechanism(); } return sysUserResult; } /** * 根据机构渠道配置进行筛选 * * @param sysUsers * @param sourceChannel * @return */ private List filterMechanismByChannel(List sysUsers, Integer sourceChannel) { if (sysUsers != null && sysUsers.size() > 0) { ChannelInfo channelInfo = channelInfoMapper.getChannelByCode(sourceChannel); List result = new ArrayList<>(); for (MechanismVo sysUser : sysUsers) { List channelIds = channelMechanismConfigService.getChannelsByMechanismId(sysUser.getId()); if (CollectionUtils.isEmpty(channelIds) || channelIds.contains(channelInfo.getId())) { result.add(sysUser); } } return result; } return null; } /** * 根据机构最低贷款额度筛选 * * @param sysUsers * @param quota * @return */ private List filterMechanismQuota(List sysUsers, Integer quota) { if (sysUsers != null && sysUsers.size() > 0) { List result = new ArrayList<>(); for (MechanismVo sysUser : sysUsers) { if (sysUser.getMinLoanAmount() != null && (quota == null || quota < sysUser.getMinLoanAmount())) { continue; } result.add(sysUser); } return result; } return null; } /** * 筛选还未到当日上限的机构 * * @param sysUsers */ private List filterMechanismLimit(List sysUsers) { if (sysUsers != null && sysUsers.size() > 0) { List result = new ArrayList<>(); List ids = sysUsers.stream().map(MechanismVo::getId).collect(Collectors.toList()); Date beginOfDay = DateUtil.beginOfDay(new Date()); Date endOfDay = DateUtil.endOfDay(new Date()); Map countMapOfDay = CustomerCountVo.parseMap(customerMapper.getCustomersOfDay(ids, beginOfDay, endOfDay)); for (MechanismVo sysUser : sysUsers) { Integer countDay = countMapOfDay.get(sysUser.getId()); boolean upperLimit = checkMechanismDailyUpperLimit(sysUser, countDay); boolean balance = checkMechanismBalance(sysUser); if (upperLimit && balance) { result.add(sysUser); } } return result; } return null; } /** * 根据当日占客比分配机构 * * @param userList * @return */ private MechanismVo getPercentageMechanism(List userList) { if (userList != null && userList.size() > 0) { if (userList.size() == 1) { return userList.get(0); } List list = userList.stream().map(MechanismVo::getId).collect(Collectors.toList()); Date beginOfDay = DateUtil.beginOfDay(new Date()); Date endOfDay = DateUtil.endOfDay(new Date()); List customers = customerMapper.getCustomersOfDay(list, beginOfDay, endOfDay); if (customers == null || customers.isEmpty()) { return userList.stream().max(Comparator.comparingInt(MechanismVo::getPercentageOfCustomers)).get(); } int customerSum = customers.stream().mapToInt(CustomerCountVo::getCount).sum(); int percentSum = userList.stream().mapToInt(MechanismVo::getPercentageOfCustomers).sum(); Map map = CustomerCountVo.parseMap(customers); for (MechanismVo sysUser : userList) { long count = map.get(sysUser.getId()) != null ? map.get(sysUser.getId()) : 0; double num1 = (double) count / customerSum; double num2 = (double) sysUser.getPercentageOfCustomers() / percentSum; if (num1 > num2) { } else { return sysUser; } } } return null; } /** * 获取匹配属性最多的机构列表 * * @param sysUsers * @param parse * @return */ private List getMaxMatchMechanismList(List sysUsers, CustomerCompareDto parse) { if (sysUsers != null && sysUsers.size() > 1) { Integer matchMax = 0; Double price = sysUsers.get(0).getSingleCustomerPrice(); Map> userMap = new HashMap<>(); for (MechanismVo sysUser : sysUsers) { if (!price.equals(sysUser.getSingleCustomerPrice())) { break; } else { Integer matchCount = getMatchCount(sysUser, parse); if (matchCount > matchMax) { matchMax = matchCount; userMap.put(matchCount, new ArrayList() {{ add(sysUser); }}); } else if (matchMax.equals(matchCount)) { List userList = userMap.get(matchCount); userList.add(sysUser); userMap.put(matchCount, userList); } } } return userMap.get(matchMax); } return sysUsers; } private Integer getMatchCount(MechanismVo sysUser, CustomerCompareDto parse) { Integer match = 0; if (StringUtils.isNotBlank(sysUser.getProfessionInfo()) && parse.getProfessionInfo() != null && sysUser.getProfessionInfo().contains(parse.getProfessionInfo().toString())) { match++; } if (StringUtils.isNotBlank(sysUser.getProductAttributes())) { if (parse.isSesame() && sysUser.getProductAttributes().contains(ProductAttributesEnum.SESAME.getCode().toString())) { match++; } if (parse.isSocialSecurity() && sysUser.getProductAttributes().contains(ProductAttributesEnum.SOCIAL_SECURITY.getCode().toString())) { match++; } if (parse.isProvidentFund() && sysUser.getProductAttributes().contains(ProductAttributesEnum.PROVIDENT_FUND.getCode().toString())) { match++; } if (parse.isHouseStatus() && sysUser.getProductAttributes().contains(ProductAttributesEnum.HOUSE.getCode().toString())) { match++; } if (parse.isCarStatus() && sysUser.getProductAttributes().contains(ProductAttributesEnum.CAR.getCode().toString())) { match++; } if (parse.isInsurancePolicy() && sysUser.getProductAttributes().contains(ProductAttributesEnum.BUSINESS_INSURANCE.getCode().toString())) { match++; } if (parse.isCreditCard() && sysUser.getProductAttributes().contains(ProductAttributesEnum.CREDIT_CARD.getCode().toString())) { match++; } } return match; } @Override @Transactional(rollbackFor = Exception.class) public Customer addBaiDuCustomer(BaiduDto dto) { Customer customer = new Customer(); customer.setAge(parseAge(dto.getInput())); customer.setName(dto.getName()); customer.setApplyDate(new Date()); customer.setPhone(dto.getPhone()); customer.setInsurancePolicy(dto.getCheckbox().contains("保单") ? InsuranceStatusEnum.BusinessInsurance_6.getCode() : InsuranceStatusEnum.BusinessInsurance_1.getCode()); customer.setProvidentFund(dto.getCheckbox().contains("公积金") ? ProvidentFundStatusEnum.ProvidentFund_4.getCode() : ProvidentFundStatusEnum.ProvidentFund_1.getCode()); customer.setCarStatus(dto.getCheckbox().contains("有车") ? CarStatusEnum.Car_4.getCode() : CarStatusEnum.Car_1.getCode()); customer.setEnterpriseInfo(dto.getCheckbox().contains("企业") ? EnterpriseInfoEnum.Enterprise_2.getCode() : EnterpriseInfoEnum.Enterprise_1.getCode()); customer.setPayrollAgency(dto.getCheckbox().contains("工资代发") ? PayrollAgencyEnum.PayrollAgency_2.getCode() : PayrollAgencyEnum.PayrollAgency_1.getCode()); customer.setWorkStatus(dto.getCheckbox().contains("工作") ? WorkStatusEnum.WorkStatus_2.getCode() : WorkStatusEnum.WorkStatus_1.getCode()); customer.setCreditCard(dto.getCheckbox().contains("信用卡") ? CreditCardStatusEnum.CreditCard_2.getCode() : CreditCardStatusEnum.CreditCard_1.getCode()); customer.setSocialSecurity(dto.getCheckbox().contains("社保") ? SocialSecurityStatusEnum.SocialSecurity_4.getCode() : SocialSecurityStatusEnum.SocialSecurity_1.getCode()); boolean house = dto.getCheckbox().contains("有房"); customer.setHouseStatus(house ? HouseStatusEnum.House_4.getCode() : HouseStatusEnum.House_1.getCode()); if (house) { if (dto.getCheckbox().contains("本地房")) { customer.setHouseAttributes(HouseAttributesEnum.HouseAttributes_2.getCode()); } else if (dto.getCheckbox().contains("外地房")) { customer.setHouseAttributes(HouseAttributesEnum.HouseAttributes_3.getCode()); } if (dto.getCheckbox().contains("按揭房")) { customer.setHousePayment(HousePaymentEnum.HousePayment_2.getCode()); } else if (dto.getCheckbox().contains("全款房")) { customer.setHousePayment(HousePaymentEnum.HousePayment_3.getCode()); } } String s = dto.getRadio(); customer.setLargeLoanAmount(LargeLoanAmountEnum.code(s)); customer.setMicroLoan(MicroLoanEnum.MicroLoanEnum_2.getCode()); City one = cityService.getOne(new LambdaQueryWrapper().like(City::getName, dto.getCity().split(" ")[1])); if (one != null) { customer.setCity(one.getCityId()); customer.setCityName(one.getName()); } customer.setSourceChannel(SourceTypeEnum.BaiDu.getCode()); Customer customerDb = saveCustomer(customer); return customerDb; } private Integer parseAge(String input) { String regEx = "[^0-9]"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(input); String trim = m.replaceAll("").trim(); String reg = "^120$|^[1-9]$|^(1[0-1]|[1-9])\\d$"; boolean result = Pattern.compile(reg).matcher(trim).find(); if (result) { return Integer.parseInt(trim); } else { return 30; } } @Override public void aizhudaiCustomImport(ImportCustomerParameter parameter) { String appId = parameter.getAppid(); ChannelInfo channelInfo = channelInfoMapper.getChannelByAppId(appId); if (channelInfo == null) { log.error("渠道Id非法,渠道值" + appId); throw new CommonException("渠道id非法"); } if (Constants.ENABLE != channelInfo.getStatus()) { log.error("渠道已被禁用,渠道值" + appId + "客户信息" + parameter); throw new CommonException("渠道已被禁用"); } Customer customer = new Customer(); BeanUtils.copyProperties(parameter, customer); customer.setSourceChannel(channelInfo.getCode()); initCustomer(customer); MechanismVo sysUser = sysUserMapper.selectDefaultMechanism(); customer.setMechanismId(sysUser.getId()); log.info("爱助贷模式推送数据:客户数据:" + customer.toString() + "匹配机构信息" + sysUser.toString()); //无痕推送客户到接口公司 apiCompanyService.pushCustomerNoTrace(customer); } @Override @Transactional(rollbackFor = Exception.class) public void importCustomerFromPlatform(ImportCustomerParameter parameter) { String appId = parameter.getAppid(); // 检查appId是否合法(后续引入redis,可以先从redis中查找数据,找不到再去数据库查) ChannelInfo channelInfo = channelInfoMapper.getChannelByAppId(appId); if (channelInfo == null) { log.error("渠道Id非法,渠道值" + appId); throw new CommonException("渠道id非法"); } if (Constants.ENABLE != channelInfo.getStatus()) { log.error("渠道已被禁用,渠道值" + appId + "客户信息" + parameter.toString()); throw new CommonException("渠道已被禁用"); } Customer customer = new Customer(); BeanUtils.copyProperties(parameter, customer); customer.setSourceChannel(channelInfo.getCode()); if (parameter.getBusinessType() != null && parameter.getBusinessType() == 1) { customer = initCustomer(customer); MechanismVo sysUser = sysUserMapper.selectDefaultMechanism(); customer.setMechanismId(sysUser.getId()); log.info("审批分流无痕模式:客户数据:" + customer.toString() + "匹配机构信息" + sysUser.toString()); //无痕推送客户到接口公司 apiCompanyService.pushCustomerNoTrace(customer); } else { saveCustomer(customer); } } @Override @Transactional(rollbackFor = {Exception.class}) public Map addZhonganCustomer(DuolaiRequest request) { Map resp = null; Customer customer = null; try { customer = zhongAnUtil.buildZhongAnCustomer(request); customer.setSourceChannel(SourceTypeEnum.ZhongAn.getCode()); resp = zhongAnUtil.buildZhonganResp(request, ZhongAnStatus.STATUS_3.getCode(), null, null); zhongAnUtil.callback(request, ZhongAnStatus.STATUS_3.getCode(), customer.getLoanAmount()); } catch (Exception e) { channelLogService.createImportLog(SourceTypeEnum.ZhongAn.getCode(), ChannelLog.FAIL, null, request.toString()); log.error("众安授信申请失败:{}", e.getMessage()); resp = zhongAnUtil.buildZhonganResp(request, ZhongAnStatus.STATUS_2.getCode(), ResultCode.SERVER_ERROR.getCode() + "", "用户端宏观错误"); zhongAnUtil.callback(request, ZhongAnStatus.STATUS_2.getCode(), 0.0); } if (customer != null) { Customer saveCustomer = saveCustomer(customer); channelLogService.createImportLog(SourceTypeEnum.ZhongAn.getCode(), ChannelLog.SUCCESS, saveCustomer.getId(), request.toString()); } return resp; } @Override public Map selectZhonganCustomerByCardNo(DuolaiRequest request) { try { String cardNo = zhongAnUtil.queryZhonganCustomerCardNo(request).getCertiNo(); Customer customer = this.getOne(new LambdaQueryWrapper() .eq(Customer::getIdCard, cardNo) .eq(Customer::getSourceChannel, SourceTypeEnum.ZhongAn.getCode())); return zhongAnUtil.buildAvailAmountResp(zhongAnUtil.buildAvailAmountResult(customer, request), null, null); } catch (Exception e) { log.error("众安授信用户额度查询失败:{}", e.getMessage()); return zhongAnUtil.buildAvailAmountResp(null, ResultCode.SERVER_ERROR.getCode() + "", e.getMessage()); } } private ChannelInfo getChannelInfoByAppId(String appId) { // 检查appId是否合法(后续引入redis,可以先从redis中查找数据,找不到再去数据库查) LambdaQueryWrapper channelInfoWrapper = new LambdaQueryWrapper<>(); channelInfoWrapper.eq(ChannelInfo::getAppId, appId); ChannelInfo channelInfo = channelInfoMapper.selectOne(channelInfoWrapper); return channelInfo; } @Override @Transactional(rollbackFor = {Exception.class}) public void updateMatchMechanism(Long customerId, Long mechanismId) { Customer customer = getById(customerId); if (customer == null) { throw new CommonException("客户不存在"); } SysUser sysUser = sysUserMapper.selectById(mechanismId); if (sysUser == null) { throw new CommonException("机构不存在"); } customer.setMechanismId(mechanismId); updateById(customer); if (sysUser.getDefaultFlag() != null && sysUser.getDefaultFlag() == 0) { Long recordId = deductionRecordService.createRecord(customerId, mechanismId, RechargeRecord.STATUS_NORMAL, null, sysUser.getSingleCustomerPrice()); customerPushRecordService.createRecord(customer.getId(), sysUser.getId(), recordId, CustomerPushRecord.STATUS_NORMAL, null); } } @Override @Transactional(rollbackFor = {Exception.class}) public void assignMechanism(Long customerId, Long mechanismId) { Customer customer = getById(customerId); if (customer == null) { throw new CommonException("客户不存在"); } SysUser newMechanism = sysUserMapper.selectById(mechanismId); if (newMechanism == null) { throw new CommonException("机构不存在"); } SysUser oldMechanism = sysUserMapper.selectById(customer.getMechanismId()); customer.setMechanismId(mechanismId); customer.setApplyDate(new Date()); updateById(customer); log.info("机构重新分配日志:客户信息" + customer.toString() + "分配前机构:" + oldMechanism.toString() + "分配后机构" + newMechanism.toString()); if (Objects.equals(0, oldMechanism.getDefaultFlag())) { CustomerPushRecord pushRecord = customerPushRecordService.lambdaQuery() .eq(CustomerPushRecord::getMechanismId, oldMechanism.getId()) .eq(CustomerPushRecord::getCustomerRecordId, customerId) .eq(CustomerPushRecord::getStatus, 0).one(); pushRecord.setStatus(CustomerPushRecord.STATUS_INVALID); pushRecord.setMemo("分配被收回"); customerPushRecordService.updateById(pushRecord); DeductionRecord deductionRecord = deductionRecordService.getById(pushRecord.getDeductionId()); deductionRecord.setStatus(DeductionRecord.STATUS_REFUND); deductionRecord.setMemo("分配被收回"); deductionRecordService.updateById(deductionRecord); RechargeRecord rechargeRecord = new RechargeRecord(); rechargeRecord.setMechanismId(oldMechanism.getId()); rechargeRecord.setCreationDate(new Date()); rechargeRecord.setRechargeAmount(deductionRecord.getDeductionAmount()); rechargeRecord.setUseAmount(deductionRecord.getDeductionAmount()); rechargeRecord.setStatus(RechargeRecord.STATUS_REFUND); rechargeRecord.setMemo("客户分配被收回,退费" + deductionRecord.getDeductionAmount()); rechargeRecordMapper.insert(rechargeRecord); } if (Objects.equals(0, newMechanism.getDefaultFlag())) { Long recordId = deductionRecordService.createRecord(customerId, mechanismId, RechargeRecord.STATUS_NORMAL, "分配客户", newMechanism.getSingleCustomerPrice()); customerPushRecordService.createRecord(customerId, newMechanism.getId(), recordId, CustomerPushRecord.STATUS_NORMAL, "分配获得"); } } @Override public Set checkMechanism(Long mechanismId) { Set errorList = new HashSet<>(); MechanismVo mechanism = sysUserMapper.selectMechanismById(mechanismId); if (mechanism == null) { throw new CommonException("机构不存在"); } if (Objects.equals(1, mechanism.getDefaultFlag())) { return null; } Date beginOfDay = DateUtil.beginOfDay(new Date()); Date endOfDay = DateUtil.endOfDay(new Date()); CustomerCountVo customerCountVo = customerMapper.getCustomerCount(mechanismId, beginOfDay, endOfDay); Integer countDay = customerCountVo.getCount(); boolean upperLimit = checkMechanismDailyUpperLimit(mechanism, countDay); if (!upperLimit) { errorList.add("机构推荐客户已达到每日上限,请谨慎分配"); } boolean mechanismBalance = checkMechanismBalance(mechanism); if (!mechanismBalance) { errorList.add("机构可用余额不足,请谨慎分配"); } return errorList; } /** * 检测机构每日上限是否足够 * * @return */ private boolean checkMechanismDailyUpperLimit(MechanismVo mechanism, Integer countDay) { boolean result = true; if (mechanism.getDailyUpperLimit() == null) { result = false; } else if (countDay != null && countDay >= mechanism.getDailyUpperLimit()) { result = false; } return result; } /** * 检测机构余额是否足够 * * @return */ private boolean checkMechanismBalance(MechanismVo mechanism) { boolean result = true; if (mechanism.getUseAmount() == null) { result = false; } else if (mechanism.getSingleCustomerPrice() != null) { Double expendAmount = deductionRecordMapper.getAllExpendAmount(mechanism.getId()); double availableAmount = mechanism.getUseAmount() - expendAmount; if (mechanism.getSingleCustomerPrice() > availableAmount) { result = false; } } return result; } @Override @Transactional(rollbackFor = Exception.class) public void addBlankVisitRecord(BlankCustomerVisitDto visitDto) { ChannelInfo channelInfo = channelInfoMapper.getChannelByAppId(visitDto.getAppId()); if (channelInfo == null) { throw new CommonException("该渠道不存在"); } if (StringUtils.isEmpty(visitDto.getPhone())) { throw new CommonException("用户手机号不能为空"); } Customer customer = new Customer(); CustomerUser customerUser = customerUserService.lambdaQuery().eq(CustomerUser::getPhone, visitDto.getPhone()).one(); if (customerUser != null) { customer.setSourceChannel(customerUser.getSourceChannel()); } else { customer.setSourceChannel(channelInfo.getCode()); } customer.setPhone(visitDto.getPhone()); customer.setApplyDate(new Date()); saveCustomer(customer); channelLogService.createSupermarketLog(visitDto.getLoanMarkId(), channelInfo.getCode(), customer.getId()); } /** * 标注:保存客户基本资料,撞库开始 */ @Override @Transactional(rollbackFor = Exception.class) public String appAddBasicInfo(CustomerBaseDto customerBaseDto, String appId, HttpServletRequest request) { //检验用户30天内是否已经存在有效数据 Customer customerDb = customerMapper.getLatestCustomerRecord(customerBaseDto.getPhone()); DateTime checkDate = DateUtil.offsetDay(new Date(), -Customer.VALID_DAY); if (customerDb != null && customerDb.getApplyDate().after(checkDate)) { systemLogger.error("保存客户基本资料失败,错误:已经存在有效记录,禁止重复提交, 原始数据: {},结果: {},checkDate: {}", customerBaseDto, customerDb, checkDate); throw new CommonException("已经存在有效记录,禁止重复提交"); } Customer customer = new Customer(); if ("分数为空".equals(customerBaseDto.getVerifySimilarity())) { customerBaseDto.setVerifySimilarity("0"); } BeanUtils.copyProperties(customerBaseDto, customer); if (StringUtils.isNotEmpty(customer.getIdCardBackPath()) && StringUtils.isNotEmpty(customer.getIdCardFrontPath())) { if (customer.getIdCardBackPath().length() > 1000 || customer.getIdCardFrontPath().length() > 1000) { systemLogger.error("保存客户基本资料失败,错误:上传图片路径不合法, 原始数据" + customerBaseDto); throw new CommonException("保存失败:上传图片路径不合法"); } if (StringUtils.isNotEmpty(customer.getFacePhotoPath())) { if (customer.getFacePhotoPath().length() > 1000) { systemLogger.error("保存客户基本资料失败,错误:上传图片路径不合法, 原始数据" + customerBaseDto); throw new CommonException("保存失败:上传图片路径不合法"); } } if ("长期".equals(customer.getIdValidDateEnd())) { customer.setIdLongTerm("1"); } cacuAge(customer); } else { // cacuDefaltAge(customer); cacuAge(customer); } if (StringUtils.isNotEmpty(customer.getIdCard())) { customer.setStatus(CustomerInfoStatusEnum.OCR_INFO.getCode()); } else { customer.setStatus(CustomerInfoStatusEnum.BASE_INFO.getCode()); } customer = initAppIdSource(customer, appId); CustomerIpInfo customerIpInfo = aliyunUtil.getCustomerIpInfo(request, customerBaseDto.getPhone()); if (customerIpInfo != null && StringUtils.isNotEmpty(customerIpInfo.getIp())) { customer.setIpAddres(customerIpInfo.getIp()); } if (customerIpInfo != null && StringUtils.isNotEmpty(customerIpInfo.getCityName())) { customer.setIpCityRaw(customerIpInfo.getCityName()); } if (customerIpInfo != null && StringUtils.isNotEmpty(customerIpInfo.getSysCityId())) { customer.setIpCityMapped(customerIpInfo.getSysCityId()); } // 标注:联登 customer = saveCustomer(customer); // 开始虚拟撞库 // capitalResultVmService.collisionlibrary(customer); vipCardOrderService.updateUserApprovalTime(customer.getPhone(), appId); try { if (CustomerInfoStatusEnum.OCR_INFO.getCode().equals(customer.getStatus())) { Customer customerbyId = customer; ExecutorService executor = Executors.newFixedThreadPool(2); //发送数据到风控系统 CompletableFuture.supplyAsync(() -> { SystemParam systemParam = systemParamMapper.selectById(1L); if (Objects.nonNull(systemParam) && Objects.equals(systemParam.getRisk(), 1)) { CustomerUser customerUser = customerUserService.getOne(Wrappers.lambdaQuery(CustomerUser.class).eq(CustomerUser::getPhone, customerbyId.getPhone())); customerUser.setIdCard(customerbyId.getIdCard()); customerUser.setName(customerbyId.getName()); RiskCustomerUserDto riskCustomerUserDto = new RiskCustomerUserDto(); BeanUtils.copyProperties(customerUser, riskCustomerUserDto); BeanUtils.copyProperties(customerbyId, riskCustomerUserDto); log.info("发送数据到风控系统: 参数:{}", JSON.toJSONString(riskCustomerUserDto)); OkHttpClient client = new OkHttpClient().newBuilder().build(); MediaType mediaType = MediaType.parse("application/json"); RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(riskCustomerUserDto)); Request req = new Request.Builder().url(RISK_URL).method("POST", body).addHeader("Content-Type", "application/json").build(); try { Response execute = client.newCall(req).execute(); log.info("请求风控数据:{}", execute.body().string()); } catch (IOException e) { e.printStackTrace(); log.error("请求风控雷达服务失败,错误信息:", e); } } return true; }, executor); //异步进行资方列表撞库 CompletableFuture.supplyAsync(() -> { customerCapitalResultService.checkCapitalInfo(customerbyId, 0); return true; }, executor); } } catch (Exception e) { e.printStackTrace(); log.error("异步进行资方列表撞库失败,错误信息:", e); } return customer.getId().toString(); } private final ICapitalInfoService capitalInfoService; // 资金信息服务 private static final int ENABLE_FLAG = 1; // 启用标志 private static final int DISABLE_FLAG = 0; // 禁用标志 private final ICustomerH5MatchRecordService customerH5MatchRecordService; /** * H5匹配 */ @Override public ResultJson h5Match(CustomerBaseDto customerBaseDto, HttpServletRequest request) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // 创建查询条件 wrapper.eq(CapitalInfo::getEnableFlag, ENABLE_FLAG); // 是否启用:启用 wrapper.eq(CapitalInfo::getDeleteFlag, DISABLE_FLAG); // 是否删除:不删除 wrapper.eq(CapitalInfo::getH5Match, ENABLE_FLAG); // 参与H5匹配资金方:是 wrapper.orderByAsc(CapitalInfo::getSeq); // 按序号升序排列 List lst = capitalInfoService.list(wrapper); // 返回匹配的资金信息列表 JSONObject jsonObject = new JSONObject(); jsonObject.putOpt("idcard", customerBaseDto.getIdCard()); jsonObject.putOpt("phone", customerBaseDto.getPhone()); jsonObject.putOpt("name", customerBaseDto.getName()); OkHttpClient client = new OkHttpClient().newBuilder().build(); MediaType mediaType = MediaType.parse("application/json"); RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(jsonObject)); JSONObject ret = new JSONObject(); int retCode = 0; for (CapitalInfo capitalInfo : lst) { Long capitalId = capitalInfo.getId(); String url = null; if (capitalId == 37L) { // 商城 url = SC_H5_CHECK_URL; } if (url != null) { Request req = new Request.Builder().url(url).method("POST", body).addHeader("Content-Type", "application/json").build(); try { Response execute = client.newCall(req).execute(); String responseData = execute.body().string(); log.info("请求H5匹配:{}", responseData); JSONObject jb = new JSONObject(responseData); if (retCode == 0 && jb.getInt("code") == 1) { retCode = 1; } if (ret.isEmpty()) { ret.putOpt("iosLink", capitalInfo.getIosLink()); ret.putOpt("androidLink", capitalInfo.getAndroidLink()); } // 保存推送记录 CustomerH5MatchRecord customerH5MatchRecord = new CustomerH5MatchRecord(); customerH5MatchRecord.setPhone(customerBaseDto.getPhone()); customerH5MatchRecord.setName(customerBaseDto.getName()); customerH5MatchRecord.setIdcard(customerBaseDto.getIdCard()); customerH5MatchRecord.setCapitalId(capitalId); customerH5MatchRecord.setStatus(retCode); customerH5MatchRecordService.save(customerH5MatchRecord); } catch (IOException e) { e.printStackTrace(); log.error("H5匹配失败,错误信息:", e); } } } if (retCode == 1) { return ResultJson.ok(ret); }else { return ResultJson.failure(ResultCode.SERVER_ERROR, "审核不通过"); } } /** * 标注:基本资料填写,有撞库和推送用户基本资料给资方 */ @Override @Transactional(rollbackFor = Exception.class) public String appAddCapitalInfo(HttpServletRequest request, CustomerCapitalDto customerCapitalDto, String appId, String channelInfo) { Customer customer = getById(customerCapitalDto.getId()); if (customer == null) { throw new CommonException("用户记录不存在"); } if (!CustomerInfoStatusEnum.BANKCARD_INFO.getCode().equals(customer.getStatus()) && !CustomerInfoStatusEnum.COMPANY_INFO.getCode().equals(customer.getStatus())) { systemLogger.error("保存客户资金方资料失败,错误:用户资料状态非法, 原始数据" + customerCapitalDto.toString()); throw new CommonException("用户资料状态非法"); } BeanUtils.copyProperties(customerCapitalDto, customer); if (customer.getFamilyMonthlyIncome() == null) { customer.setFamilyMonthlyIncome(customerCapitalDto.getFamilyMonthlyIncome()); } if (StringUtils.isEmpty(customer.getLivest())) { customer.setLivest(customerCapitalDto.getLivest()); } if (customer.getProfessionInfo() == null) { customer.setProfessionInfo(customerCapitalDto.getProfessionInfo()); } customer.setStatus(CustomerInfoStatusEnum.CAPITAL_INFO.getCode()); //默认腾讯云 该字段枚举值 01:腾讯云,02:阿里云 属于必填项 customer.setVerifySimilarityName("01"); customer.setNationality("中国"); customer.setClientIp(IpUtil.getIpAddr(request)); customer.setChannelInfo(channelInfo); saveOrUpdate(customer); CustomerUser customerUser = customerUserService.getOne(new LambdaQueryWrapper() .eq(CustomerUser::getPhone, customer.getPhone())); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String entryDate = simpleDateFormat.format(System.currentTimeMillis()); if (customerUser.getCallBackResult() == null && CustomerUserBusinessTypeEnum.RONG_YI_TUI.getCode().equals(customerUser.getBusinessType())) { try { //生成相应业务类型的订单号 String order = SerialGenerator.getOrder(); customerUser.setBusinessNo(order); RongYiTuiResponse rongYiTuiResponse = rongYiTuiUtil.entryNotify(customer.getPhone(), customerUser.getBusinessNo(), entryDate); if (rongYiTuiResponse != null) { log.info("融易推授信进件通知返回:{}", rongYiTuiResponse.toString()); } else { log.info("融易推授信进件通知返回失败"); } customerUserService.update(Wrappers.lambdaUpdate() .set(CustomerUser::getCallBackResult, 0) .set(CustomerUser::getBusinessNo, customerUser.getBusinessNo()) .eq(CustomerUser::getId, customerUser.getId())); } catch (Exception e) { e.printStackTrace(); log.error("融易推授信进件回调绿地接口失败,错误信息:", e); } } /*try { //异步进行资方列表撞库 ExecutorService executor = Executors.newFixedThreadPool(1); CompletableFuture.supplyAsync(() -> { customerCapitalResultService.checkCapitalInfo(customer, null); customerCapitalResultService.autoPushCapitalInfo(customer); return true; }, executor); } catch (Exception e) { e.printStackTrace(); log.error("异步进行资方列表撞库失败,错误信息:", e); }*/ return customer.getId().toString(); } /** * OCR资料录入 */ @Override public String appAddOCRInfo(CustomerOcrDto customerOcrDto, String appId) { Customer customer = getById(customerOcrDto.getId()); if (customer == null) { throw new CommonException("用户记录不存在"); } systemLogger.info("OCR原始数据:{}", customerOcrDto); if (!CustomerInfoStatusEnum.BASE_INFO.getCode().equals(customer.getStatus())) { systemLogger.error("保存客户OCR资料失败,错误:用户状态非法, 原始数据" + customerOcrDto.toString()); throw new CommonException("用户资料状态非法"); } if ("分数为空".equals(customerOcrDto.getVerifySimilarity())) { customerOcrDto.setVerifySimilarity("0"); } BeanUtils.copyProperties(customerOcrDto, customer); customer.setStatus(CustomerInfoStatusEnum.OCR_INFO.getCode()); CustomerUser customerUser = customerUserService.getUserByPhone(customer.getPhone()); if (customerUser == null) { throw new CommonException("此用户不存在"); } cacuAge(customer); saveOrUpdate(customer); // try { // //异步进行资方列表撞库 // ExecutorService executor = Executors.newFixedThreadPool(2); // CompletableFuture.supplyAsync(() -> { // customerCapitalResultService.checkCapitalInfo(customer, 0); // return true; // }, executor); // } catch (Exception e) { // e.printStackTrace(); // log.error("异步进行资方列表撞库失败,错误信息:", e); // } customerUserService.checkAndUpdateUser(customerUser, customer); systemLogger.info("OCR原始数据保存成功!"); return customer.getId().toString(); } @Override public String appAddBankCardInfo(CustomerBankCardDto customerBankCardDto, String appId) { Customer customer = getById(customerBankCardDto.getId()); if (customer == null) { throw new CommonException("用户记录不存在"); } if (!CustomerInfoStatusEnum.OCR_INFO.getCode().equals(customer.getStatus())) { systemLogger.error("保存客户银行卡资料失败,错误:用户状态非法, 原始数据" + customerBankCardDto.toString()); throw new CommonException("用户资料状态非法"); } BeanUtils.copyProperties(customerBankCardDto, customer); customer.setStatus(CustomerInfoStatusEnum.BANKCARD_INFO.getCode()); saveOrUpdate(customer); return customer.getId().toString(); } @Override public String appAddRepayInfo(CustomerRepayDto customerRepayDto, String appId) { Customer customer = getById(customerRepayDto.getId()); if (customer == null) { throw new CommonException("用户记录不存在"); } BeanUtils.copyProperties(customerRepayDto, customer); customer.setHasRepayPlan(1); customer.setRepayApplyDate(new Date()); saveOrUpdate(customer); return customer.getId().toString(); } @Override public void rongYiTuiVip(UserDetail userDetail, Integer vipCardType) { CustomerUser customerUser = customerUserService.getOne(new LambdaQueryWrapper() .eq(CustomerUser::getPhone, userDetail.getPhone())); if (VipCardTypeEnum.AUDIT_QUEUE.getCode().equals(vipCardType)) { customerUser.setQueueVipCode(QueueVipTypeEnum.VIP1.getCode()); } else if (VipCardTypeEnum.MEMBER_SERVICE.getCode().equals(vipCardType)) { Date now = new Date(); customerUser.setVipStartDate(now); LocalDateTime after = LocalDateTime.ofInstant(now.toInstant(), ZoneId.systemDefault()).plusDays(365); Date from = Date.from(after.atZone(ZoneId.systemDefault()).toInstant()); customerUser.setVipEndDate(from); } customerUserService.updateById(customerUser); } @Override public City getUserIpCity(HttpServletRequest request) { City cityInfo = aliyunUtil.getCityInfo(request, null); systemLogger.info("getUserIpCity:{}", cityInfo); return cityInfo; } @Override public Version4FlowPathVo version4FlowPath(UserDetail userDetail) { CustomerUser customerUser = customerUserService.getOne(new LambdaQueryWrapper() .eq(CustomerUser::getPhone, userDetail.getPhone()).eq(CustomerUser::getDeleteFlag, 0)); if (customerUser == null) { throw new CommonException("用户不存在"); } Customer customer = customerMapper.getLatestCustomerRecord(customerUser.getPhone()); if (customer == null) { throw new CommonException("用户申请记录不存在"); } Version4FlowPathVo version4FlowPathVo = new Version4FlowPathVo(); if (customerUser.getQueueVipCode().equals(QueueVipTypeEnum.NONE.getCode())) { version4FlowPathVo.setIsQueueVip(false); } else { version4FlowPathVo.setIsQueueVip(true); } //获取该用户的所有资方结果 List capitalResultList = customerCapitalResultService.list(new LambdaQueryWrapper() .eq(CustomerCapitalResult::getCustomerUserId, customerUser.getId()) .eq(CustomerCapitalResult::getCustomerRecordId, customer.getId())); if (capitalResultList == null || capitalResultList.isEmpty()) { throw new CommonException("用户不存在有效的资方对接结果"); } //筛选撞库通过的资方对接结果 List checkSuccessResult = capitalResultList.stream() .filter(i -> CustomerCapitalResult.CHECK_SUCCESS.equals(i.getCheckResult())).collect(Collectors.toList()); List capitalInfoAppVos = new ArrayList<>(); if (checkSuccessResult == null || checkSuccessResult.isEmpty()) { version4FlowPathVo.setCapitalInfoAppVos(capitalInfoAppVos); return version4FlowPathVo; } //从撞库通过的数据中获取对应的资方信息列表 List idList = checkSuccessResult.stream().map(CustomerCapitalResult::getCapitalInfoId).collect(Collectors.toList()); List capitalInfoList = capitalInfoMapper.selectBatchIds(idList); if (capitalInfoList == null || capitalInfoList.isEmpty()) { throw new CommonException("用户不存在有效的资方信息"); } //从撞库通过的资方中筛选审核开关开启的资方 List matchCapitalInfoList = capitalInfoList.stream() .filter(i -> Objects.equals(i.getAuditSwitch(), 1)) .collect(Collectors.toList()); if (matchCapitalInfoList == null || matchCapitalInfoList.isEmpty()) { version4FlowPathVo.setCapitalInfoAppVos(capitalInfoAppVos); return version4FlowPathVo; } // 保存零时的授权额度 List updateTempTotalCreditList = new ArrayList<>(); for (CustomerCapitalResult result : checkSuccessResult) { if (result.getTempTotalCredit() == null) { result.setTempTotalCredit(randomQuota()); updateTempTotalCreditList.add(result); } } if (updateTempTotalCreditList.size() > 0) { customerCapitalResultService.saveOrUpdateBatch(updateTempTotalCreditList); } //展示所有满足条件的资方信息 for (CapitalInfo capitalInfo : matchCapitalInfoList) { CustomerCapitalResult capitalResult = checkSuccessResult.stream() .filter(i -> capitalInfo.getId().equals(i.getCapitalInfoId())).findFirst().orElse(null); if (capitalResult == null) { throw new CommonException("用户不存在有效的资方对接结果"); } CapitalInfoAppVo capitalInfoAppVo = new CapitalInfoAppVo(); capitalInfoAppVo.setId(capitalInfo.getId()); capitalInfoAppVo.setCode(capitalInfo.getCode()); capitalInfoAppVo.setName(capitalInfo.getName()); capitalInfoAppVo.setFundType(capitalInfo.getFundType()); capitalInfoAppVo.setSeq(capitalInfo.getSeq()); capitalInfoAppVo.setIconUrl(capitalInfo.getIconUrl()); /** * NOT_APPLY(0, "未申请"), * APPLY_WAIT(1, "审批中"), * APPLY_PASS(2, "审批通过"), * APPLY_REFUSE(3, "审批不通过"), * PREPARE_APPROVAL(4, "预审通过"), * FIRST_APPROVAL(5, "一审通过"), * LOAN_FAIL(6, "借款失败") */ /** * APPROVAL_WAIT(0, "等待中"), * APPROVAL_SUCCESS(1, "审核成功"), * APPROVAL_REFUSE(2, "审核拒绝"), * APPROVAL_REQUEST_FAIL(3, "请求拒绝") */ if (CapitalApprovalResultEnum.APPROVAL_SUCCESS.getCode().equals(capitalResult.getApprovalResult())) {// APPROVAL_SUCCESS(1, "审核成功") capitalInfoAppVo.setStatus(CapitalInfoStatusEnum.APPLY_PASS.getCode()); // 2 审批通过 capitalInfoAppVo.setFlowPathNext(Version4FlowPathVo.FLOW_SUCCESS); } else if (CapitalApprovalResultEnum.APPROVAL_WAIT.getCode().equals(capitalResult.getApprovalResult())) {// 0 等待中 capitalInfoAppVo.setStatus(CapitalInfoStatusEnum.APPLY_WAIT.getCode()); // 1 审批中 capitalInfoAppVo.setFlowPathNext(Version4FlowPathVo.FLOW_WAIT); } else {// 2 审批拒绝 3 请求拒绝 capitalInfoAppVo.setStatus(CapitalInfoStatusEnum.APPLY_WAIT.getCode());// 1 审批中 capitalInfoAppVo.setFlowPathNext(Version4FlowPathVo.FLOW_FAIL); } // 于2022-11-14修改 // if (CapitalApprovalResultEnum.APPROVAL_SUCCESS.getCode().equals(capitalResult.getApprovalResult())) {// 数据库:1 审核成功 // capitalInfoAppVo.setStatus(CapitalInfoStatusEnum.APPLY_PASS.getCode()); // 前端:2 审批通过 // capitalInfoAppVo.setFlowPathNext(Version4FlowPathVo.FLOW_SUCCESS); // } else if (CapitalApprovalResultEnum.APPROVAL_REFUSE.getCode().equals(capitalResult.getApprovalResult())) {// 数据库:2 审核拒绝 // capitalInfoAppVo.setStatus(CapitalInfoStatusEnum.APPLY_REFUSE.getCode()); // 前端:3 审批不通过 // capitalInfoAppVo.setFlowPathNext(Version4FlowPathVo.FLOW_FAIL); // } else if (CapitalApprovalResultEnum.APPROVAL_REQUEST_FAIL.getCode().equals(capitalResult.getApprovalResult())) {// 数据库:3 请求拒绝 // capitalInfoAppVo.setStatus(CapitalInfoStatusEnum.REQUEST_FAIL.getCode()); // 前端:7 请求拒绝 // capitalInfoAppVo.setFlowPathNext(Version4FlowPathVo.FLOW_FAIL); // } else {// 审批中 // capitalInfoAppVo.setStatus(CapitalInfoStatusEnum.APPLY_WAIT.getCode());// 前端:1 审批中 // capitalInfoAppVo.setFlowPathNext(Version4FlowPathVo.FLOW_WAIT); // } // 完 capitalInfoAppVo.setCapitalResultId(capitalResult.getId()); if (StringUtils.isNotEmpty(capitalResult.getTotalCredit())) { capitalInfoAppVo.setQuota(Integer.valueOf(capitalResult.getTotalCredit())); } else { capitalInfoAppVo.setQuota(capitalResult.getTempTotalCredit()); } capitalInfoAppVos.add(capitalInfoAppVo); } capitalInfoAppVos = capitalInfoAppVos.stream().sorted(Comparator.comparing(CapitalInfoAppVo::getSeq)).collect(Collectors.toList()); version4FlowPathVo.setCapitalInfoAppVos(capitalInfoAppVos); return version4FlowPathVo; } @Override public String appFourAddRelationInfo(HttpServletRequest request, CustomerRelationDto customerRelationDto, String appId, String channelInfo) { Customer customer = getById(customerRelationDto.getId()); if (customer == null) { throw new CommonException("用户记录不存在"); } if (!CustomerInfoStatusEnum.BANKCARD_INFO.getCode().equals(customer.getStatus())) { systemLogger.error("保存客户资金方资料失败,错误:用户资料状态非法, 原始数据" + customerRelationDto.toString()); throw new CommonException("用户资料状态非法"); } BeanUtils.copyProperties(customerRelationDto, customer); customer.setStatus(CustomerInfoStatusEnum.COMPANY_INFO.getCode()); //默认腾讯云 该字段枚举值 01:腾讯云,02:阿里云 属于必填项 customer.setVerifySimilarityName("01"); customer.setNationality("中国"); customer.setClientIp(IpUtil.getIpAddr(request)); customer.setChannelInfo(channelInfo); saveOrUpdate(customer); return customer.getId().toString(); } @Override public String appFourAddCompanyInfo(HttpServletRequest request, CustomerCompanyDto customerCompanyDto, String appId) { Customer customer = getById(customerCompanyDto.getId()); if (customer == null) { throw new CommonException("用户记录不存在"); } if (!CustomerInfoStatusEnum.COMPANY_INFO.getCode().equals(customer.getStatus())) { systemLogger.error("保存客户资金方资料失败,错误:用户资料状态非法, 原始数据" + customerCompanyDto.toString()); throw new CommonException("用户资料状态非法"); } BeanUtils.copyProperties(customerCompanyDto, customer); customer.setStatus(CustomerInfoStatusEnum.CAPITAL_INFO.getCode()); saveOrUpdate(customer); CustomerUser customerUser = customerUserService.getOne(new LambdaQueryWrapper() .eq(CustomerUser::getPhone, customer.getPhone())); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String entryDate = simpleDateFormat.format(System.currentTimeMillis()); if (customerUser.getCallBackResult() == null && CustomerUserBusinessTypeEnum.RONG_YI_TUI.getCode().equals(customerUser.getBusinessType())) { try { //生成相应业务类型的订单号 String order = SerialGenerator.getOrder(); customerUser.setBusinessNo(order); RongYiTuiResponse rongYiTuiResponse = rongYiTuiUtil.entryNotify(customer.getPhone(), customerUser.getBusinessNo(), entryDate); if (rongYiTuiResponse != null) { log.info("融易推授信进件通知返回:{}", rongYiTuiResponse.toString()); } else { log.info("融易推授信进件通知返回失败"); } customerUserService.update(Wrappers.lambdaUpdate() .set(CustomerUser::getCallBackResult, 0) .set(CustomerUser::getBusinessNo, customerUser.getBusinessNo()) .eq(CustomerUser::getId, customerUser.getId())); } catch (Exception e) { e.printStackTrace(); log.error("融易推授信进件回调绿地接口失败,错误信息:", e); } } // 判断浏览器端是否有输入资产信息,有则需再次推送,因为不会再跳转到资产信息输入界面 /*if (customer.getAssetFromBrowser() == 1) { try { //异步进行资方列表撞库 ExecutorService executor = Executors.newFixedThreadPool(1); CompletableFuture.supplyAsync(() -> { customerCapitalResultService.checkCapitalInfo(customer, null); customerCapitalResultService.autoPushCapitalInfo(customer); return true; }, executor); } catch (Exception e) { e.printStackTrace(); log.error("异步进行资方列表撞库失败,错误信息:", e); } }*/ return customer.getId().toString(); } @Override public String appFiveAddAssetInfo(HttpServletRequest request, CustomerAssetDto customerCompanyDto, String appId) { Customer customer = getCustomer(customerCompanyDto); saveOrUpdate(customer); /*try { //异步进行资方列表撞库 ExecutorService executor = Executors.newFixedThreadPool(1); CompletableFuture.supplyAsync(() -> { customerCapitalResultService.checkCapitalInfo(customer, null); customerCapitalResultService.autoPushCapitalInfo(customer); return true; }, executor); } catch (Exception e) { e.printStackTrace(); log.error("异步进行资方列表撞库失败,错误信息:", e); }*/ return customer.getId().toString(); } /** * 从浏览器h5推送数据,不包括慧借钱包 */ @Override public void h5PushInfo(Customer customer) { try { // customerCapitalResultService.checkCapitalInfo(customer, null); customerCapitalResultService.h5AutoPushCapitalInfo(customer); } catch (Exception e) { e.printStackTrace(); log.error("异步进行资方列表撞库失败,错误信息:", e); } } /** * 从浏览器h5推送给慧借钱包 */ @Override public void h5PushInfoInclude(Customer customer) { try { customerCapitalResultService.pushHjqb(customer); } catch (Exception e) { e.printStackTrace(); log.error("异步进行资方列表撞库失败,错误信息:", e); } } /** * 根据手机号返回h5匹配信息 * @param phone 手机号 * @return */ @Override public ResultJson getH5Match(String phone) { CustomerH5MatchRecord customerH5MatchRecord = customerH5MatchRecordService.getOne(Wrappers.lambdaQuery(CustomerH5MatchRecord.class).eq(CustomerH5MatchRecord::getPhone, phone).last("limit 1")); if (customerH5MatchRecord != null) { if (customerH5MatchRecord.getStatus() == 1) { // 审核通过,则返回资方的信息 CapitalInfo capitalInfo = capitalInfoService.getById(customerH5MatchRecord.getCapitalId()); JSONObject ret = new JSONObject(); ret.putOpt("iosLink", capitalInfo.getIosLink()); ret.putOpt("androidLink", capitalInfo.getAndroidLink()); return ResultJson.ok(ret); } } return ResultJson.failure(ResultCode.SERVER_ERROR, "审核不通过"); } @Override public void appPushInfo(HttpServletRequest request) { String token = request.getHeader("Authorization"); UserDetail user = UserUtil.getUser(token); if (user == null) { log.error("appPushInfo 用户Token无效"); } Customer customer = customerMapper.getLatestCustomerRecord(user.getPhone()); // 标记用户基本资料输入完成: 2024-08-23新增 customer.setDataIsCompleted(1); customerMapper.updateById(customer); String appId = request.getParameter("appId"); ChannelInfo channelInfo = channelInfoMapper.selectOne(new LambdaQueryWrapper().eq(ChannelInfo::getAppId, appId).last(" limit 1 ")); if (channelInfo != null && 1 != channelInfo.getVersion3IsOpen()) {// 3.0开启才推送 return; } try { //异步进行资方列表撞库 // ExecutorService executor = Executors.newFixedThreadPool(1); // CompletableFuture.supplyAsync(() -> { //// customerCapitalResultService.checkCapitalInfo(customer, null); // customerCapitalResultService.autoPushCapitalInfo(customer); // return true; // }, executor); customerCapitalResultService.autoPushCapitalInfo(customer); } catch (Exception e) { e.printStackTrace(); log.error("进行资方列表撞库失败,错误信息:", e); } } /** * 从浏览器h5进行资产信息录入 */ @Override public String h5FiveAddAssetInfo(HttpServletRequest request, CustomerAssetDto customerCompanyDto, String appId) { Customer customer = getCustomer(customerCompanyDto); customer.setAssetFromBrowser(1); customer.setStatus(CustomerInfoStatusEnum.OCR_INFO.getCode()); saveOrUpdate(customer); try { customerCapitalResultService.autoPushCapitalInfo(customer); } catch (Exception e) { e.printStackTrace(); log.error("异步进行资方列表撞库失败,错误信息:", e); } /*try { //异步进行资方列表撞库 ExecutorService executor = Executors.newFixedThreadPool(1); CompletableFuture.supplyAsync(() -> { customerCapitalResultService.checkCapitalInfo(customer, null); customerCapitalResultService.autoPushCapitalInfo(customer); return true; }, executor); } catch (Exception e) { e.printStackTrace(); log.error("异步进行资方列表撞库失败,错误信息:", e); }*/ return customer.getId().toString(); } @NotNull private Customer getCustomer(CustomerAssetDto customerCompanyDto) { Customer customer = getById(customerCompanyDto.getId()); if (customer == null) { throw new CommonException("用户记录不存在"); } BeanUtils.copyProperties(customerCompanyDto, customer); customer.setStatus(CustomerInfoStatusEnum.ASSET_INFO.getCode()); return customer; } public void cacuAge(Customer customer) { if (StringUtils.isNotEmpty(customer.getBirthday())) { long yearmoi = (long) 365 * 24 * 60 * 60 * 1000; Date today = new Date(); SimpleDateFormat bDate = new SimpleDateFormat("yyyyMMdd"); try { long birthdayMi = bDate.parse(customer.getBirthday()).getTime(); long todayMi = today.getTime(); long liveMi = todayMi - birthdayMi; int age = (int) (liveMi / yearmoi); customer.setAge(age); } catch (ParseException e) { e.printStackTrace(); } } else { Random random = new Random(); int age = random.nextInt(21) + 30; customer.setAge(age); } } public void cacuDefaltAge(Customer customer) { if (customer.getAge() == null) { Random random = new Random(); int age = random.nextInt(21) + 30; customer.setAge(age); } } /** * 根据机构配置年龄区间筛选 * * @param sysUsers * @param age * @return */ private List filterMechanismAge(List sysUsers, Integer age) { if (sysUsers != null && sysUsers.size() > 0) { List result = new ArrayList<>(); for (MechanismVo sysUser : sysUsers) { if (sysUser.getAgeLowerLimit() != null) { if (age == null || age < sysUser.getAgeLowerLimit()) { continue; } } if (sysUser.getAgeUpperLimit() != null) { if (age == null || age > sysUser.getAgeUpperLimit()) { continue; } } result.add(sysUser); } return result; } return null; } public static Integer randomQuota() { Random random = new Random(); int nextInt = 5 + random.nextInt(20); Integer quota = nextInt * 1000; return quota; } @Override public Customer getUser(LoginUserDto userDto) { Customer customer = getUserByPhone(userDto.getPhone()); return customer; } private Customer getUserByPhone(String phone) { return lambdaQuery().eq(Customer::getPhone, phone).eq(Customer::getDeleteFlag, 0).last(" limit 1 ").one(); } }