Commit a0a2a93f authored by suntao's avatar suntao

Merge branch 'features/mo' of http://git.quantgroup.cn/QG/cash-loan-flow-boss into features/mo

# By xiangwei.wang
# Via xiangwei.wang
* 'features/mo' of http://git.quantgroup.cn/QG/cash-loan-flow-boss:
  查询渠道信息productId为空时处理
  多订单渠道改为apollo配置
  二次风控审核bizType对乐信单独判断
  二次风控乐信bizType传9
  乐信bizType传9
  乐信bizType传9
  放款接口 返回值结果判断
  放款接口 返回值结果判断
parents 8a5eed77 e61b911b
......@@ -227,7 +227,9 @@ public class ChannelConfUtil {
channelConfBaseModel.setEnv("");
channelConfBaseModel.setFundId(0);
channelConfBaseModel.setP2pFundId(0);
channelConfBaseModel.setBizType(Integer.valueOf(channelConfiguration.getXyqbProductId()));
if(channelConfiguration.getXyqbProductId() != null){
channelConfBaseModel.setBizType(Integer.valueOf(channelConfiguration.getXyqbProductId()));
}
channelConfBaseModel.setAesKey(channelConfiguration.getAesKey());
channelConfBaseModel.setMd5Key(channelConfiguration.getMd5Key());
channelConfBaseModel.setAuthCode(channelConfiguration.getSpiderCenterMerchantChannelCode());
......
package cn.quantgroup.cashloanflowboss.api.order.service;
import cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog;
import cn.quantgroup.cashloanflowboss.api.optlog.model.OptEnumName;
import cn.quantgroup.cashloanflowboss.api.optlog.service.OptHistoryLogServiceImpl;
import cn.quantgroup.cashloanflowboss.core.annotation.opt.OperationAnno;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.core.constants.Constants;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.CallbackFailRecord;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfChannelConfiguration;
import cn.quantgroup.cashloanflowboss.spi.clf.model.KANoticeType;
import cn.quantgroup.cashloanflowboss.spi.clf.model.LoanProgress;
import cn.quantgroup.cashloanflowboss.api.channel.entity.ChannelConf;
import cn.quantgroup.cashloanflowboss.api.channel.repository.ChannelConfRepository;
import cn.quantgroup.cashloanflowboss.api.channel.util.ChannelConfUtil;
import cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog;
import cn.quantgroup.cashloanflowboss.api.optlog.model.OptEnumName;
import cn.quantgroup.cashloanflowboss.api.optlog.service.OptHistoryLogServiceImpl;
import cn.quantgroup.cashloanflowboss.api.order.entity.OrderApprove;
import cn.quantgroup.cashloanflowboss.api.order.model.*;
import cn.quantgroup.cashloanflowboss.api.order.repository.OrderApproveRepository;
import cn.quantgroup.cashloanflowboss.api.order.util.OrderUtil;
import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.annotation.opt.OperationAnno;
import cn.quantgroup.cashloanflowboss.core.base.ServiceResult;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.core.constants.Constants;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.CallbackFailRecord;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.CallbackRecord;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfChannelConfiguration;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.clf.model.CallbackRecordVoModel;
import cn.quantgroup.cashloanflowboss.spi.clf.model.KANoticeType;
import cn.quantgroup.cashloanflowboss.spi.clf.model.LoanProgress;
import cn.quantgroup.cashloanflowboss.spi.clf.repository.ClfOrderMappingRepository;
import cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenterService;
import cn.quantgroup.cashloanflowboss.spi.clotho.service.ClothoCenterService;
......@@ -38,19 +38,6 @@ import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import cn.quantgroup.user.retbean.XUser;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
import java.util.concurrent.ConcurrentMap;
import javax.persistence.criteria.Predicate;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
......@@ -63,6 +50,14 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import javax.persistence.criteria.Predicate;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* function:
* date: 2019/8/8
......@@ -72,8 +67,11 @@ import org.springframework.transaction.annotation.Transactional;
@Slf4j
@Service
public class OrderServiceImpl implements OrderService{
public class OrderServiceImpl implements OrderService {
//多订单渠道配置
@Value("${multiple.order.channels}")
private String multipleOrderChannel;
@Autowired
private OptHistoryLogServiceImpl optHistoryLogService;
......@@ -96,7 +94,6 @@ public class OrderServiceImpl implements OrderService{
private JolyneService jolyneService;
@Autowired
private ClfOrderMappingRepository clfOrderMappingRepository;
......@@ -111,6 +108,13 @@ public class OrderServiceImpl implements OrderService{
private static final int CONSCONT_STATUS = 2;
private List<Long> channels;
@PostConstruct
public void init(){
channels = Stream.of(multipleOrderChannel.split(",")).map(Long::valueOf).collect(Collectors.toList());
}
@Override
public Page<OrderVo> orderList(Long channelId, String channelOrderNo, String applyNo, Long loanId, Integer pageNumber, Integer pageSize) {
......@@ -183,7 +187,6 @@ public class OrderServiceImpl implements OrderService{
}
/**
*
* @param approveVo
* @return Tuple<Boolean 审批结果 true 审批完成 false 审批操作失败, String msg 信息>
*/
......@@ -200,7 +203,7 @@ public class OrderServiceImpl implements OrderService{
ClfOrderMapping orderMapping = clfOrderMappingRepository.findByChannelOrderNoLastOne(approveVo.getChannelOrderNumber());
if (orderMapping == null) {
log.info("approveOpt,审批失败,无订单 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return new Tuple(false, "审批失败,无订单");
return new Tuple(false, "审批失败,无订单");
}
XUser xUser = xyqbUserService.findXUserById(orderMapping.getQgUserId());
if (xUser == null) {
......@@ -223,15 +226,24 @@ public class OrderServiceImpl implements OrderService{
if (clfChannelConfiguration == null) {
return new Tuple(false, "审批失败,clfChannelConfiguration渠道配置为空");
}
QuotaProduct quotaProduct = xyqbCenterService.getXyqbProduct(clfChannelConfiguration.getXyqbProductId());
if (quotaProduct == null) {
return new Tuple(false, "审批失败,xyqb.quota_product配置为空(".concat(clfChannelConfiguration.getXyqbProductId()).concat(")"));
QuotaProduct quotaProduct = null;
Map<String, Object> data = null;
if (channels.contains(orderMapping.getRegisteredFrom())) {
data = getApproveObjectMap(approveVo, orderMapping, xUser, fundFormat, 9);
}else {
quotaProduct = xyqbCenterService.getXyqbProduct(clfChannelConfiguration.getXyqbProductId());
if (quotaProduct == null) {
return new Tuple(false, "审批失败,xyqb.quota_product配置为空(".concat(clfChannelConfiguration.getXyqbProductId()).concat(")"));
}
data = getApproveObjectMap(approveVo, orderMapping, xUser, fundFormat, quotaProduct.getProductType());
}
Map<String, Object> data = getApproveObjectMap(approveVo, orderMapping, xUser, fundFormat, quotaProduct);
// 发起审批
log.info("[approveOpt] 向clotho发起审批,data={}", JSONTools.serialize(data));
String approveStringResult = clothoCenterService.approve(data);
log.info("[approveOpt] 返回结果 result={}",approveStringResult);
log.info("[approveOpt] 返回结果 result={}", approveStringResult);
Boolean corpPolicyValidate = false;
try {
corpPolicyValidate = xyqbCenterService.validateCorpPolicy(Long.valueOf(fundId), new Date());
......@@ -256,6 +268,7 @@ public class OrderServiceImpl implements OrderService{
/**
* 二次风控
*
* @param channelOrderNumber
* @return
*/
......@@ -274,7 +287,7 @@ public class OrderServiceImpl implements OrderService{
}
// 更新合同状态
Contract conscont= xyqbCenterService.findContractByUserId(orderMapping.getQgUserId());
Contract conscont = xyqbCenterService.findContractByUserId(orderMapping.getQgUserId());
if (conscont != null) {
if (conscont.getGenerateStatus() != CONSCONT_STATUS) {
log.info("secondAudit,合同状态不对,channelOrderNumber=".concat(channelOrderNumber));
......@@ -302,13 +315,20 @@ public class OrderServiceImpl implements OrderService{
if (clfChannelConfiguration == null) {
return new Tuple(false, "二次风控失败,clfChannelConfiguration渠道配置为空");
}
QuotaProduct quotaProduct = xyqbCenterService.getXyqbProduct(clfChannelConfiguration.getXyqbProductId());
if (quotaProduct == null) {
return new Tuple(false, "二次风控失败,xyqb.quota_product配置为空(".concat(clfChannelConfiguration.getXyqbProductId()).concat(")"));
if (channels.contains(clfChannelConfiguration.getRegisteredFrom())) {//乐信渠道 bizType直接为9
result = clothoCenterService.orderAuditNotify(xUser.getUuid(), orderMapping.getLoanId(), true, 9);
} else {
QuotaProduct quotaProduct = xyqbCenterService.getXyqbProduct(clfChannelConfiguration.getXyqbProductId());
if (quotaProduct == null) {
return new Tuple(false, "二次风控失败,xyqb.quota_product配置为空(".concat(clfChannelConfiguration.getXyqbProductId()).concat(")"));
}
// 50
log.info("[secendAudit]二次风控发起,channelOrderNumber={}, bizType={}", channelOrderNumber, quotaProduct.getProductType());
result = clothoCenterService.orderAuditNotify(xUser.getUuid(), orderMapping.getLoanId(), true, quotaProduct.getProductType());
}
// 50
log.info("[secendAudit]二次风控发起,channelOrderNumber={}, bizType={}", channelOrderNumber, quotaProduct.getProductType());
result = clothoCenterService.orderAuditNotify(xUser.getUuid(), orderMapping.getLoanId(), true, quotaProduct.getProductType());
if (result) {
log.info("[secendAudit]二次风控成功,channelOrderNumber={}, result={}", channelOrderNumber, result);
} else {
......@@ -353,7 +373,7 @@ public class OrderServiceImpl implements OrderService{
// 更新合同状态
Contract conscont= xyqbCenterService.findContractByUserId(orderMapping.getQgUserId());
Contract conscont = xyqbCenterService.findContractByUserId(orderMapping.getQgUserId());
if (conscont == null) {
// 合同为空 log表记录问题,UI用户查询
optDetail = optDetail.concat("合同未生成,请注意,需要不用身份证才能自动生成合同,");
......@@ -374,7 +394,7 @@ public class OrderServiceImpl implements OrderService{
log.error("[order_lending][queryLendingRecordCount]查询待打款数量 失败,channelOrderNumber={}, data={}", lendingFormModel.getChannelOrderNumber(), data);
}
log.info("[order_lending][queryLendingRecordCount]查询待打款数量,channelOrderNumber={}, data={}", lendingFormModel.getChannelOrderNumber(), data);
if (data !=null && data.size() > 0) {
if (data != null && data.size() > 0) {
if (Objects.nonNull(data.get(Constants.TOTAL_AMOUNT)) && Objects.nonNull(data.get(Constants.TOTAL_COUNT))) {
result = this.clothoCenterService.lending(orderApprove.getFundId(), new BigDecimal(String.valueOf(data.get(Constants.TOTAL_AMOUNT))), Integer.valueOf(String.valueOf(data.get(Constants.TOTAL_COUNT))));
log.info("[order_lending]直投打款,channelOrderNumber={}, result={}", lendingFormModel.getChannelOrderNumber(), result);
......@@ -431,46 +451,46 @@ public class OrderServiceImpl implements OrderService{
*/
@OperationAnno(channelNo = "#this[0]", opt = OptEnumName.PRE_CANCEL, succSPEL = "#this.key", optDetailSPEL = "#this.value")
@Override
public Tuple<Boolean,String> cancelPreLoan(String channelOrderNumber) {
public Tuple<Boolean, String> cancelPreLoan(String channelOrderNumber) {
boolean cancel = true;
String token = null;
String result = "";
ClfOrderMapping orderMapping = clfOrderMappingRepository.findByChannelOrderNoLastOne(channelOrderNumber);
if (orderMapping == null) {
log.info("cancelPreLoan,贷前关单失败,无订单 channelOrderNumber={}", channelOrderNumber);
return new Tuple<>(false,"贷前关单失败,无订单");
return new Tuple<>(false, "贷前关单失败,无订单");
}
try{
try {
Long id = cancelPreLoanRepository.cancelPreLoan(orderMapping.getApplyNo());
String response = opCenter.getToken(auth);
JSONObject responseJ = JSONObject.parseObject(response);
if(responseJ != null && responseJ.containsKey(Constants.DATA)){
if (responseJ != null && responseJ.containsKey(Constants.DATA)) {
JSONObject data = (JSONObject) responseJ.get(Constants.DATA);
if(data != null && data.containsKey(Constants.TOKEN)){
if (data != null && data.containsKey(Constants.TOKEN)) {
token = String.valueOf(data.get(Constants.TOKEN));
}
}
HashMap<Object, Object> data = Maps.newHashMap();
Long loanId = orderMapping.getLoanId();
if(Objects.nonNull(loanId)){
data.put("loanIds",loanId);
result = clothoCenterService.cancelPreLoanHasLoanId(data,token);
}else{
data.put("data",id);
data.put("remark","贷前关单");
result = clothoCenterService.cancelPreLoan(data,token);
if (Objects.nonNull(loanId)) {
data.put("loanIds", loanId);
result = clothoCenterService.cancelPreLoanHasLoanId(data, token);
} else {
data.put("data", id);
data.put("remark", "贷前关单");
result = clothoCenterService.cancelPreLoan(data, token);
}
JSONObject resp = JSONObject.parseObject(result);
if(Objects.isNull(resp) || Objects.isNull(resp.get(Constants.SUCCESS)) || !Constants.TRUE.equals(String.valueOf(resp.get(Constants.SUCCESS)))){
if (Objects.isNull(resp) || Objects.isNull(resp.get(Constants.SUCCESS)) || !Constants.TRUE.equals(String.valueOf(resp.get(Constants.SUCCESS)))) {
cancel = false;
}
}catch (Exception e){
} catch (Exception e) {
cancel = false;
log.error(e.getMessage(),e);
log.error(e.getMessage(), e);
}
return new Tuple<>(cancel,cancel?"贷前关单成功":"贷前关单失败");
return new Tuple<>(cancel, cancel ? "贷前关单成功" : "贷前关单失败");
}
/**
......@@ -481,37 +501,39 @@ public class OrderServiceImpl implements OrderService{
*/
@OperationAnno(channelNo = "#this[0]", opt = OptEnumName.LOAN_CANCEL, succSPEL = "#this.key", optDetailSPEL = "#this.value")
@Override
public Tuple<Boolean,String> cancelAfterLoan(String channelOrderNumber) {
public Tuple<Boolean, String> cancelAfterLoan(String channelOrderNumber) {
return huijinsuoCloseOrder72(channelOrderNumber);
}
/**
* 惠金所 72 小时提现超时
*
* @param channelOrderNumber
* @return
*/
private Tuple<Boolean,String> huijinsuoCloseOrder72(String channelOrderNumber) {
private Tuple<Boolean, String> huijinsuoCloseOrder72(String channelOrderNumber) {
ClfOrderMapping orderMapping = this.clfOrderMappingRepository.findByChannelOrderNoLastOne(channelOrderNumber);
if (orderMapping == null) {
log.info("cancelAfterLoan,贷后关单失败,无订单 ={}", channelOrderNumber);
return new Tuple<>(false,"贷后关单失败,无订单");
return new Tuple<>(false, "贷后关单失败,无订单");
}
if (orderMapping.getLoanId() == null) {
log.info("cancelAfterLoan,贷后关单失败,loanId为空,channelOrderNumber={}", channelOrderNumber);
return new Tuple<>(false,"贷后关单失败,loanId为空");
return new Tuple<>(false, "贷后关单失败,loanId为空");
}
ConcurrentMap<Object, Object> data = Maps.newConcurrentMap();
data.put("loanId",orderMapping.getLoanId());
data.put("userId",orderMapping.getQgUserId());
data.put("loanId", orderMapping.getLoanId());
data.put("userId", orderMapping.getQgUserId());
data.put("flowNo", UUID.randomUUID());
String id = clothoCenterService.cancelAfterLoan(data);
return new Tuple<>(true,"贷后关单成功");
return new Tuple<>(true, "贷后关单成功");
}
/**
* 查询订单历史推送记录
*
* @param channelOrderNumber
* @return
*/
......@@ -576,6 +598,7 @@ public class OrderServiceImpl implements OrderService{
/**
* 查询还款计划
*
* @param channelOrderNumber
* @param loanId
* @return
......@@ -613,7 +636,7 @@ public class OrderServiceImpl implements OrderService{
@OperationAnno(channelNo = "#this[0]", opt = OptEnumName.ALL_REPAID, succSPEL = "#this.key", optDetailSPEL = "#this.value")
@Override
public Tuple<Boolean,String> settle(String channelOrderNumber) {
public Tuple<Boolean, String> settle(String channelOrderNumber) {
ClfOrderMapping orderMapping = clfCenterService.findOrderMappingByChannelOrderNo(channelOrderNumber);
if (orderMapping != null && StringUtils.isNotEmpty(orderMapping.getApplyNo())) {
......@@ -635,6 +658,7 @@ public class OrderServiceImpl implements OrderService{
/**
* 查询订单状态
*
* @param currentStatus
* @param orderMapping
* @return
......@@ -648,25 +672,25 @@ public class OrderServiceImpl implements OrderService{
buttonBeforeCancel.setAction(OrderVo.OptButtonAction.cancel.name());
buttonBeforeCancel.setName(OrderVo.OptButtonAction.cancel.getDesc());
switch (currentStatus.getStatus()) {
case "CREDIT_SUCC" :
case "CREDIT_SUCC":
return getCreditSuccessTuple(tuple, buttonList);
case "APPROVE_ING" :
case "APPROVE_ING":
return getApprovingTuple(orderMapping, tuple, buttonList);
case "REJECT" :
case "REJECT":
tuple.setKey("审批拒绝");
tuple.setValue(buttonList);
return tuple;
case "FUAD_ASSIFN_SUCC" :
case "FUAD_ASSIFN_SUCC":
tuple.setKey("审批通过,待提现");
buttonList.add(buttonBeforeCancel);
tuple.setValue(buttonList);
return tuple;
case "WITHDRAW_APPROVING" :
case "WITHDRAW_APPROVING":
return getWithdrawApprovingTuple(tuple, buttonList, buttonBeforeCancel);
case "WITHDRAW" :
case "PAY_ING" :
case "WITHDRAW":
case "PAY_ING":
return getWithdrawTuple(orderMapping, tuple, buttonList, buttonBeforeCancel);
case "FUND_WAITING_WITHDRAW" :
case "FUND_WAITING_WITHDRAW":
tuple.setKey("放款到存管账户,待存管提现");
OrderVo.OptButton cancelAfterButton0 = new OrderVo.OptButton();
cancelAfterButton0.setAction(OrderVo.OptButtonAction.cancel_after.name());
......@@ -674,26 +698,26 @@ public class OrderServiceImpl implements OrderService{
buttonList.add(cancelAfterButton0);
tuple.setValue(buttonList);
return tuple;
case "FUND_SUCC" :
case "FUND_SUCC":
tuple.setKey("放款成功");
return tuple;
case "FUND_WITHDRAW_SUCC" :
case "FUND_WITHDRAW_SUCC":
tuple.setKey("存管提现成功");
tuple.setValue(buttonList);
return tuple;
case "FUND_FAIL" :
case "FUND_FAIL":
tuple.setKey("放款失败");
tuple.setValue(buttonList);
return tuple;
case "ALL_REPAID" :
case "ALL_REPAID":
tuple.setKey("已结清");
tuple.setValue(buttonList);
return tuple;
case "CANCEL_LOAN" :
case "CANCEL_LOAN":
tuple.setKey("已关单");
tuple.setValue(buttonList);
return tuple;
case "CANCEL_AFTER_LOAN" :
case "CANCEL_AFTER_LOAN":
tuple.setKey("存管提现超时或贷后关单");
tuple.setValue(buttonList);
return tuple;
......@@ -789,14 +813,16 @@ public class OrderServiceImpl implements OrderService{
return calendar;
}
private Map<String, Object> getApproveObjectMap(ApproveVo approveVo, ClfOrderMapping orderMapping, XUser xUser, String fundFormat, QuotaProduct quotaProduct) {
private Map<String, Object> getApproveObjectMap(ApproveVo approveVo, ClfOrderMapping orderMapping, XUser xUser, String fundFormat, Integer bizType) {
Map<String, Object> data = new HashMap<>(16);
data.put("code", 0);
data.put("msg", "success");
data.put("bizChannel", orderMapping.getRegisteredFrom());
data.put("uuid", xUser.getUuid());
data.put("bizNo", orderMapping.getApplyNo());
data.put("bizType", quotaProduct.getProductType());
data.put("bizType", bizType);
data.put("auditResult", approveVo.getIsPass());
data.put("amount", approveVo.getAmount());
data.put("deadLine", getCalendar().getTime().getTime());
......
......@@ -20,6 +20,7 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* Created by WeiWei on 2019/8/12.
......@@ -72,8 +73,8 @@ public class KoalaCenterService {
put("peopleLimit", pepoleLimit);
}});
JsonResult jsonObject = JSONObject.parseObject(data, JsonResult.class);
return jsonObject.isSuccess();
//JsonResult jsonObject = JSONObject.parseObject(data, JsonResult.class);
return Objects.nonNull(data) && "success".equalsIgnoreCase(data);
} else {
return false;
}
......
......@@ -11,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.Objects;
/**
* @author Wang Xiangwei
......@@ -33,8 +34,9 @@ public class MoClothoServiceImpl implements MoClothoService{
paramMap.put("payStatus", expectPayResult ? 3 : 4);
String result = moClothoCenter.pushLendingResult(paramMap);
log.info("[放款结果通知]moClotho返回结果result={}", result);
JsonResult jsonResult = JSONObject.parseObject(result,JsonResult.class);
return jsonResult.isSuccess();
//JsonResult jsonResult = JSONObject.parseObject(result,JsonResult.class);
//return jsonResult.isSuccess();
return Objects.nonNull(result) && "success".equalsIgnoreCase(result);
} else {
return false;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment