Commit 47b9d15e authored by 王俊权's avatar 王俊权

Merge remote-tracking branch 'origin/v1' into v1

# Conflicts:
#	src/main/java/cn/quantgroup/cashloanflowboss/api/order/controller/OrderController.java
#	src/main/java/cn/quantgroup/cashloanflowboss/api/order/service/OrderService.java
parents 09692b06 27827bbd
......@@ -33,10 +33,10 @@ public class ChannelConfController {
* @param pageSize
* @return
*/
@Security(authorityId = "Channel.getChannelInfo")
@Security(authorityId = "Channel.getChannelList")
@ChannelIdInit
@PostMapping("/info")
public Result channelInfo(Long channelId, Integer pageNumber, Integer pageSize) {
public Result channelList(Long channelId, Integer pageNumber, Integer pageSize) {
if (pageNumber == null || pageSize == null) {
return Result.buildFial("page信息不对");
}
......@@ -49,6 +49,7 @@ public class ChannelConfController {
* @param channelId
* @return
*/
@Security(authorityId = "Channel.getChannelConfInfo")
@ChannelIdInit
@CheckChannelRole
@GetMapping("/cfg/info")
......@@ -62,6 +63,7 @@ public class ChannelConfController {
* @param channelConfVo
* @return
*/
@Security(authorityId = "Channel.editChannelConfInfo")
@CheckChannelRole(isObjParam = true, paramClazz = ChannelConfVo.class)
@PostMapping("/cfg/info")
public Result editChannelConfInfo(@RequestBody @Valid ChannelConfVo channelConfVo) {
......
package cn.quantgroup.cashloanflowboss.api.channel.service;
import java.sql.Timestamp;
import java.util.*;
import cn.quantgroup.cashloanflowboss.api.channel.entity.ChannelConf;
import cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfAddModel;
import cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfBaseModel;
import cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfVo;
import cn.quantgroup.cashloanflowboss.api.channel.model.ChannelListModel;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfCallbackConfiguration;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfChannelConfiguration;
import cn.quantgroup.cashloanflowboss.api.channel.repository.ChannelConfRepository;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderCallBack;
import cn.quantgroup.cashloanflowboss.spi.clf.repository.ClfCallbackConfigurationRepository;
import cn.quantgroup.cashloanflowboss.spi.clf.repository.ClfChannelConfigurationRepository;
import cn.quantgroup.cashloanflowboss.api.channel.util.ChannelConfUtil;
import cn.quantgroup.cashloanflowboss.spi.clf.repository.ClfOrderCallbackRepository;
import cn.quantgroup.cashloanflowboss.utils.IgnorePropertiesUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import javax.persistence.criteria.Predicate;
/**
* function:
* date: 2019/8/2
* date: 2019/9/16
*
* @author: suntao
*/
public interface ChannelConfService {
@Service
public class ChannelConfService {
@Autowired
private ChannelConfRepository channelConfRepository;
@Autowired
private ClfChannelConfigurationRepository clfChannelConfigurationRepository;
@Autowired
private ClfCallbackConfigurationRepository clfCallbackConfigurationRepository;
@Autowired
private ClfOrderCallbackRepository clfOrderCallbackRepository;
public Page<ChannelListModel> getChannelInfo(Integer pageNumber, Integer pageSize, Long channelId) {
Page<ClfChannelConfiguration> page = this.clfChannelConfigurationRepository.findAll((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
// 指定渠道号
if (Objects.nonNull(channelId)) {
predicates.add(criteriaBuilder.equal(root.get("registeredFrom"), channelId.longValue()));
}
// 设置查询条件
criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])));
// 指定排序
criteriaQuery.orderBy(criteriaBuilder.desc(root.get("id")));
return criteriaQuery.getRestriction();
}, new PageRequest(pageNumber, pageSize));
Page<ChannelListModel> channelListModelPage = page.map(it -> {
ChannelListModel channelListModel = new ChannelListModel();
channelListModel.setChannelId(it.getRegisteredFrom());
channelListModel.setChannelName(it.getChannelName());
channelListModel.setChannelCode(it.getChannelCode());
// TODO
channelListModel.setBizType(null);
channelListModel.setCreatedAt(it.getCreatedAt());
return channelListModel;
});
return channelListModelPage;
}
public ChannelConfVo getChannelConf(Long channelId) {
ChannelConf channelConf = channelConfRepository.getByChannelId(channelId);
return ChannelConfUtil.channelConfConvertVOModel(channelConf);
}
public Boolean editChannelConfInfo(ChannelConfVo confVo) {
ChannelConfBaseModel basicInfo = confVo.getBasicInfo();
ChannelConfAddModel addInfo = confVo.getAddInfo();
ChannelConf channelConf = ChannelConfUtil.voModelConfConvertChannelConf(confVo);
ChannelConf channelConfExsit = channelConfRepository.getByChannelId(basicInfo.getChannelId());
// cash-loan-flow-boss 库
if (channelConfExsit == null) {
// 新保存
channelConf.setCreateTime(new Date());
channelConfRepository.save(channelConf);
} else {
// 更新数据库 数据
BeanUtils.copyProperties(channelConf, channelConfExsit, IgnorePropertiesUtil.getNullPropertyNames(channelConf));
channelConfExsit.setUpdateTime(new Date());
channelConfRepository.save(channelConfExsit);
}
// clf 库
ClfChannelConfiguration channelConfiguration = ChannelConfUtil.convert2ClfChannelConfiguration(basicInfo);
List<ClfOrderCallBack> clfOrderCallBackList = ChannelConfUtil.convert2ClfOrderCallback(basicInfo.getChannelId(), addInfo);
ClfChannelConfiguration channelConfigurationExsit = clfChannelConfigurationRepository.findByRegisteredFrom(basicInfo.getChannelId());
if (channelConfigurationExsit == null) {
// 新保存
channelConfiguration.setCreatedAt(new Timestamp(System.currentTimeMillis()));
clfChannelConfigurationRepository.save(channelConfiguration);
ClfCallbackConfiguration clfCallbackConfiguration = ChannelConfUtil.convert2ClfCallbackConfiguration(basicInfo);
clfCallbackConfigurationRepository.save(clfCallbackConfiguration);
clfOrderCallbackRepository.save(clfOrderCallBackList);
} else {
// update
BeanUtils.copyProperties(channelConfiguration, channelConfigurationExsit, IgnorePropertiesUtil.getNullPropertyNames(channelConfiguration));
clfChannelConfigurationRepository.save(channelConfigurationExsit);
Page<ChannelListModel> getChannelInfo(Integer pageNumber, Integer pageSize, Long channelId);
clfOrderCallbackRepository.save(clfOrderCallBackList);
ChannelConfVo getChannelConf(Long channelId);
}
return true;
}
Boolean editChannelConfInfo(ChannelConfVo confVo);
}
package cn.quantgroup.cashloanflowboss.api.channel.service;
import java.sql.Timestamp;
import java.util.*;
import cn.quantgroup.cashloanflowboss.api.channel.entity.ChannelConf;
import cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfAddModel;
import cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfBaseModel;
import cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfVo;
import cn.quantgroup.cashloanflowboss.api.channel.model.ChannelListModel;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfCallbackConfiguration;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfChannelConfiguration;
import cn.quantgroup.cashloanflowboss.api.channel.repository.ChannelConfRepository;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderCallBack;
import cn.quantgroup.cashloanflowboss.spi.clf.model.KANoticeType;
import cn.quantgroup.cashloanflowboss.api.channel.util.ChannelConfUtil;
import cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenterService;
import cn.quantgroup.cashloanflowboss.utils.IgnorePropertiesUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
/**
* function:
* date: 2019/8/2
*
* @author: suntao
*/
@Service
public class ChannelConfServiceImpl implements ChannelConfService{
@Autowired
private CLFCenterService clfCenterService;
@Autowired
private ChannelConfRepository channelConfRepository;
@Override
public Page<ChannelListModel> getChannelInfo(Integer pageNumber, Integer pageSize, Long channelId) {
Page<ClfChannelConfiguration> page = clfCenterService.findChannelConfigurationByCriteriaQueryPage(pageNumber, pageSize, channelId);
Page<ChannelListModel> channelListModelPage = page.map(it -> {
ChannelListModel channelListModel = new ChannelListModel();
channelListModel.setChannelId(it.getRegisteredFrom());
channelListModel.setChannelName(it.getChannelName());
channelListModel.setChannelCode(it.getChannelCode());
channelListModel.setBizType(null);
channelListModel.setCreatedAt(it.getCreatedAt());
return channelListModel;
});
return channelListModelPage;
}
@Override
public ChannelConfVo getChannelConf(Long channelId) {
ChannelConf channelConf = channelConfRepository.getByChannelId(channelId);
if (channelConf != null) {
return ChannelConfUtil.channelConfConvertVOModel(channelConf);
} else {
// boss channel_conf 为空,从clf 查询数据
ClfChannelConfiguration channelConfiguration = clfCenterService.findChannelConfigurationByChannelId(channelId);
ClfOrderCallBack approve = clfCenterService.findOrderCallBackByByCallbackStatusAndChannelId(KANoticeType.FUAD_ASSIFN_SUCC.name(), channelId);
ClfOrderCallBack orderStatus = clfCenterService.findOrderCallBackByByCallbackStatusAndChannelId(KANoticeType.FUND_SUCC.name(), channelId);
ClfOrderCallBack repaymentPlan = clfCenterService.findOrderCallBackByByCallbackStatusAndChannelId(KANoticeType.REPAYMENT.name(), channelId);
return ChannelConfUtil.getChannelConfVoByClf(channelConfiguration, approve, orderStatus, repaymentPlan);
}
}
@Override
public Boolean editChannelConfInfo(ChannelConfVo confVo) {
ChannelConfBaseModel basicInfo = confVo.getBasicInfo();
ChannelConfAddModel addInfo = confVo.getAddInfo();
ChannelConf channelConf = ChannelConfUtil.voModelConfConvertChannelConf(confVo);
ChannelConf channelConfExsit = channelConfRepository.getByChannelId(basicInfo.getChannelId());
// cash-loan-flow-boss 库
if (channelConfExsit == null) {
// 新保存
channelConf.setCreateTime(new Date());
channelConfRepository.save(channelConf);
} else {
// 更新数据库 数据
BeanUtils.copyProperties(channelConf, channelConfExsit, IgnorePropertiesUtil.getNullPropertyNames(channelConf));
channelConfExsit.setUpdateTime(new Date());
channelConfRepository.save(channelConfExsit);
}
// clf 库
ClfChannelConfiguration channelConfiguration = ChannelConfUtil.convert2ClfChannelConfiguration(basicInfo);
List<ClfOrderCallBack> clfOrderCallBackList = ChannelConfUtil.convert2ClfOrderCallback(basicInfo.getChannelId(), addInfo);
ClfChannelConfiguration channelConfigurationExsit = clfCenterService.findChannelConfigurationByChannelId(basicInfo.getChannelId());
if (channelConfigurationExsit == null) {
// 新保存
channelConfiguration.setCreatedAt(new Timestamp(System.currentTimeMillis()));
clfCenterService.saveChannelConfiguration(channelConfiguration);
ClfCallbackConfiguration clfCallbackConfiguration = ChannelConfUtil.convert2ClfCallbackConfiguration(basicInfo);
clfCenterService.saveCallbackConfiguration(clfCallbackConfiguration);
clfCenterService.saveOrderCall(clfOrderCallBackList);
} else {
// update
BeanUtils.copyProperties(channelConfiguration, channelConfigurationExsit, IgnorePropertiesUtil.getNullPropertyNames(channelConfiguration));
clfCenterService.saveChannelConfiguration(channelConfigurationExsit);
// 更新OrderCallBack
for (ClfOrderCallBack clfOrderCallBack : clfOrderCallBackList) {
ClfOrderCallBack orderCallBackExsit = clfCenterService.findOrderCallBackByByCallbackStatusAndChannelId(clfOrderCallBack.getCallbackStatus().name(), clfOrderCallBack.getRegisteredFrom());
if (orderCallBackExsit != null) {
clfOrderCallBack.setId(orderCallBackExsit.getId());
}
}
clfCenterService.saveOrderCall(clfOrderCallBackList);
}
return true;
}
}
......@@ -208,4 +208,37 @@ public class ChannelConfUtil {
return channelConf.getP2pFundId();
}
}
public static ChannelConfVo getChannelConfVoByClf(ClfChannelConfiguration channelConfiguration, ClfOrderCallBack approve, ClfOrderCallBack orderStatus, ClfOrderCallBack repaymentPlan) {
ChannelConfVo channelConfVo = new ChannelConfVo();
ChannelConfBaseModel channelConfBaseModel = new ChannelConfBaseModel();
if (channelConfiguration != null) {
channelConfBaseModel.setChannelId(channelConfiguration.getRegisteredFrom());
channelConfBaseModel.setChannelName(channelConfiguration.getChannelName());
channelConfBaseModel.setChannelCode(channelConfiguration.getChannelCode());
channelConfBaseModel.setEnv("");
channelConfBaseModel.setFundId(0);
channelConfBaseModel.setP2pFundId(0);
channelConfBaseModel.setBizType(0);
channelConfBaseModel.setAesKey(channelConfiguration.getAesKey());
channelConfBaseModel.setMd5Key(channelConfiguration.getMd5Key());
channelConfBaseModel.setAuthCode(channelConfiguration.getSpiderCenterMerchantChannelCode());
channelConfBaseModel.setRiskCode(channelConfiguration.getSpiderCenterChannelCode());
}
ChannelConfAddModel channelConfAddModel = new ChannelConfAddModel();
channelConfAddModel.setEnvPath("");
channelConfAddModel.setChannelIp("");
channelConfAddModel.setApproveCallBackUrl(approve != null ? approve.getCallbackUrl() : "");
channelConfAddModel.setOrderStatusCallBackUrl(orderStatus != null ? orderStatus.getCallbackUrl() : "");
channelConfAddModel.setRepayResultCallBackUrl("");
channelConfAddModel.setRepaymentPlanCallBackUrl(repaymentPlan != null ? repaymentPlan.getCallbackUrl() : "");
channelConfAddModel.setMessage("");
channelConfAddModel.setExtendData("");
channelConfVo.setBasicInfo(channelConfBaseModel);
channelConfVo.setAddInfo(channelConfAddModel);
return channelConfVo;
}
}
package cn.quantgroup.cashloanflowboss.api.log.controller;
package cn.quantgroup.cashloanflowboss.api.login.controller;
import cn.quantgroup.cashloanflowboss.api.log.model.LoginFormModel;
import cn.quantgroup.cashloanflowboss.api.log.service.LogService;
import cn.quantgroup.cashloanflowboss.api.login.model.LoginFormModel;
import cn.quantgroup.cashloanflowboss.api.login.service.LogService;
import cn.quantgroup.cashloanflowboss.component.security.Authority;
import cn.quantgroup.cashloanflowboss.component.security.annotiation.Security;
import cn.quantgroup.cashloanflowboss.core.base.Result;
......
package cn.quantgroup.cashloanflowboss.api.log.model;
package cn.quantgroup.cashloanflowboss.api.login.model;
import cn.quantgroup.cashloanflowboss.component.validator.constraints.NotEmpty;
import lombok.Data;
......
package cn.quantgroup.cashloanflowboss.api.log.model;
package cn.quantgroup.cashloanflowboss.api.login.model;
import cn.quantgroup.cashloanflowboss.api.role.entity.Role;
import cn.quantgroup.cashloanflowboss.api.user.dictionary.UserRank;
......
package cn.quantgroup.cashloanflowboss.api.log.service;
package cn.quantgroup.cashloanflowboss.api.login.service;
import cn.quantgroup.cashloanflowboss.api.log.model.Principal;
import cn.quantgroup.cashloanflowboss.api.login.model.Principal;
import cn.quantgroup.cashloanflowboss.api.user.dictionary.UserStatus;
import cn.quantgroup.cashloanflowboss.api.user.entity.User;
import cn.quantgroup.cashloanflowboss.api.user.service.UserService;
......@@ -11,6 +11,7 @@ import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import cn.quantgroup.cashloanflowboss.utils.MD5Tools;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
......
package cn.quantgroup.cashloanflowboss.api.optlog.controller;
import cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog;
import cn.quantgroup.cashloanflowboss.api.optlog.service.OptHistoryLogService;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderBaseModel;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* function:
* date: 2019/9/4
*
* @author: suntao
*/
@RestController
@RequestMapping("/opt")
public class OperateController {
@Autowired
private OptHistoryLogService optHistoryLogService;
@GetMapping("/history/log/all")
public Result findAllOptHistoryLog(OrderBaseModel orderBaseModel) {
final List<OptHistoryLog> allOptHistoryLog = optHistoryLogService.getAllOptHistoryLog(orderBaseModel);
if (CollectionUtils.isNotEmpty(allOptHistoryLog)) {
return Result.buildSuccess(allOptHistoryLog);
} else {
return Result.buildSuccess("无数据");
}
}
}
package cn.quantgroup.cashloanflowboss.api.optlog.entity;
import lombok.Data;
import javax.persistence.*;
import java.util.Date;
/**
* 操作日志记录
* function:
* date: 2019/8/12
*
* @author: suntao
*/
@Data
@Entity
@Table(name = "opt_history_log")
public class OptHistoryLog {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "channel_order_number")
private String channelOrderNumber;
@Column(name = "credit_number")
private String creditNumber;
@Column(name = "loan_id")
private Long loanId;
@Column(name = "channel_id")
private Long channelId;
/**
* 操作节点名称
*/
@Column(name = "opt_name")
private String optName;
/**
* 操作节点名称
*/
@Column(name = "opt_user")
private String optUser;
/**
* 操作详细日志
*/
@Column(name = "opt_log_detail")
private String optLogDetail;
/**
* 操作详细日志
*/
@Column(name = "ext_data")
private String extData;
/** 0:失败;1:成功 */
@Column(name = "opt_result")
private Boolean optResult;
@Column(name = "create_time")
private Date createTime;
}
package cn.quantgroup.cashloanflowboss.api.optlog.repository;
import cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog;
import cn.quantgroup.cashloanflowboss.api.order.entity.OrderApprove;
import cn.quantgroup.cashloanflowboss.core.persistence.CashLoanFlowBossDataSource;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* function:
* date: 2019/8/12
*
* @author: suntao
*/
@CashLoanFlowBossDataSource
@Repository
public interface OptHistoryLogRepository extends PagingAndSortingRepository<OptHistoryLog, Long>, JpaSpecificationExecutor<OptHistoryLog> {
List<OptHistoryLog> findByChannelOrderNumber(String channelOrderNumber);
List<OptHistoryLog> findByCreditNumber(String creditOrderNumber);
}
package cn.quantgroup.cashloanflowboss.api.optlog.service;
import cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderBaseModel;
import java.util.List;
/**
* function:
* date: 2019/9/16
*
* @author: suntao
*/
public interface OptHistoryLogService {
List<OptHistoryLog> getAllOptHistoryLog(OrderBaseModel orderBaseModel);
List<OptHistoryLog> getLocalOptHisttoryLog(OrderBaseModel orderBaseModel);
void save(OptHistoryLog optHistoryLog);
}
package cn.quantgroup.cashloanflowboss.api.optlog.service;
import cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog;
import cn.quantgroup.cashloanflowboss.api.optlog.repository.OptHistoryLogRepository;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderBaseModel;
import cn.quantgroup.cashloanflowboss.api.order.util.OrderUtil;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ApplyRequestHistory;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.WithdrawRecord;
import cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenterService;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* function:
* date: 2019/9/4
*
* @author: suntao
*/
@Service
public class OptHistoryLogServiceImpl implements OptHistoryLogService {
@Autowired
private CLFCenterService clfCenterService;
@Autowired
private OptHistoryLogRepository optHistoryLogRepository;
@Override
public List<OptHistoryLog> getAllOptHistoryLog(OrderBaseModel orderBaseModel) {
ClfOrderMapping orderMapping = clfCenterService.findOrderMappingByChannelOrderNo(orderBaseModel.getChannelOrderNumber());
if (orderMapping == null) {
return null;
}
// 用户操作日志 进件。。。
List<ApplyRequestHistory> applyRequestHistoryList = clfCenterService.findApplyRequestHistoryBySpecification(orderBaseModel);
// 管理员操作日志 审批。。。
List<OptHistoryLog> optHistoryLogList = getLocalOptHisttoryLog(orderBaseModel);
// 提现记录
List<WithdrawRecord> withdrawRecordList = clfCenterService.findWithdrawRecordList(orderBaseModel.getChannelOrderNumber(), orderMapping.getRegisteredFrom());
List<OptHistoryLog> withdrawOptHistoryLogList = OrderUtil.convertWithdrawRecordList2UserOptHistoryLogList(withdrawRecordList);
// 转换
List<OptHistoryLog> userOptHistoryLogList = OrderUtil.convertApplyRequestHistoryList2OptHistoryLogList(applyRequestHistoryList, orderMapping);
if (CollectionUtils.isNotEmpty(optHistoryLogList)) {
userOptHistoryLogList.addAll(optHistoryLogList);
}
if (CollectionUtils.isNotEmpty(withdrawOptHistoryLogList)) {
userOptHistoryLogList.addAll(withdrawOptHistoryLogList);
}
userOptHistoryLogList.sort((o1, o2)->{
if (o1.getCreateTime().getTime() < o2.getCreateTime().getTime()) {
return -1;
} else {
return 1;
}
});
return userOptHistoryLogList;
}
/**
* 只获取操作日志,boss库数据
* @param orderBaseModel
* @return
*/
@Override
public List<OptHistoryLog> getLocalOptHisttoryLog(OrderBaseModel orderBaseModel) {
List<OptHistoryLog> page = this.optHistoryLogRepository.findAll((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
// 指定渠道号
if (Objects.nonNull(orderBaseModel.getChannelId())) {
predicates.add(criteriaBuilder.equal(root.get("channelId"), orderBaseModel.getChannelId().longValue()));
}
if (StringUtils.isNotEmpty(orderBaseModel.getChannelOrderNumber())) {
predicates.add(criteriaBuilder.equal(root.get("channelOrderNumber"), orderBaseModel.getChannelOrderNumber()));
}
if (StringUtils.isNotEmpty(orderBaseModel.getApplyNo())) {
predicates.add(criteriaBuilder.equal(root.get("applyNo"), orderBaseModel.getApplyNo()));
}
if (orderBaseModel.getLoanId() != null && orderBaseModel.getLoanId() > 0) {
predicates.add(criteriaBuilder.equal(root.get("loanId"), orderBaseModel.getLoanId()));
}
// 设置查询条件
criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])));
// 指定排序
criteriaQuery.orderBy(criteriaBuilder.desc(root.get("id")));
return criteriaQuery.getRestriction();
});
return page;
}
@Override
public void save(OptHistoryLog optHistoryLog) {
optHistoryLogRepository.save(optHistoryLog);
}
}
package cn.quantgroup.cashloanflowboss.api.order.controller;
import cn.quantgroup.cashloanflowboss.api.order.model.ApproveVo;
import cn.quantgroup.cashloanflowboss.api.order.model.LendingFormModel;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderVo;
import cn.quantgroup.cashloanflowboss.api.order.service.OrderService;
import cn.quantgroup.cashloanflowboss.component.security.annotiation.Security;
import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.annotation.ChannelIdInit;
import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRole;
import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRoleByChannelOrderNumber;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -29,6 +29,7 @@ public class OrderController {
@Autowired
private OrderService orderService;
/**
* 订单查询列表接口
*
......@@ -42,11 +43,11 @@ public class OrderController {
@ChannelIdInit
@CheckChannelRole
@GetMapping("/list")
public Result getOrders(Long channelId, String channelOrderNumber, Integer pageNumber, Integer pageSize) {
public Result orderList(Long channelId, String channelOrderNumber, String applyNo, Long loanId, Integer pageNumber, Integer pageSize) {
if (pageNumber == null || pageSize == null) {
return Result.buildFial("page信息不对");
}
return Result.buildSuccess(orderService.getOrders(channelId, channelOrderNumber, pageNumber, pageSize));
return Result.buildSuccess(orderService.orderList(channelId, channelOrderNumber, applyNo, loanId, pageNumber, pageSize));
}
......@@ -56,10 +57,22 @@ public class OrderController {
* @param approveVo
* @return
*/
@Security(authorityId = "Order.approveOpt")
@ChannelIdInit
@PostMapping("/approve")
public Result approveOpt(@RequestBody @Valid ApproveVo approveVo) {
return Result.buildSuccess(orderService.approveOpt(approveVo));
if (Application.isDebug()) {
Tuple<Boolean, Boolean> approveOptBooleanAndFundSettingBooleanTuple = orderService.approveOpt(approveVo);
Boolean approveResult = approveOptBooleanAndFundSettingBooleanTuple.getKey();
if (approveResult) {
return Result.buildSuccess(approveResult, approveOptBooleanAndFundSettingBooleanTuple.getValue() ? "审批操作成功" : "请检查资产计划配置,审批操作成功");
} else {
return Result.buildSuccess(false,"审批操作失败");
}
} else {
return Result.buildSuccess(false,"无此操作");
}
}
/**
......@@ -67,9 +80,31 @@ public class OrderController {
*
* @return
*/
@Security(authorityId = "Order.lending")
@PostMapping("/lending")
public Result<Boolean> lending(@RequestBody @Valid LendingFormModel lendingFormModel) {
return Result.buildSuccess(this.orderService.lending(lendingFormModel));
if (Application.isDebug()) {
boolean lendingResult = this.orderService.lending(lendingFormModel);
return Result.buildSuccess(lendingResult, lendingResult ? "放款操作成功" : "放款操作失败");
} else {
return Result.buildSuccess(false,"无此操作");
}
}
/**
* 二次风控审批
*
* @return
*/
@Security(authorityId = "Order.secondAudit")
@GetMapping("/secondAudit")
public Result<Boolean> secondAudit(String channelOrderNumber) {
if (Application.isDebug()) {
boolean secondAudit = this.orderService.secondAudit(channelOrderNumber);
return Result.buildSuccess(secondAudit, secondAudit ? "操作成功" : "操作失败");
} else {
return Result.buildSuccess(false,"无此操作");
}
}
/**
......@@ -77,9 +112,14 @@ public class OrderController {
*
* @return
*/
@Security(authorityId = "Order.cancelPreLoan")
@PostMapping("/cancel/loan")
public Result<Boolean> cancelPreLoan(@RequestParam @Valid String channelOrderNumber) {
return Result.buildSuccess(this.orderService.cancelPreLoan(channelOrderNumber));
public Result<Boolean> cancelPreLoan(@RequestBody @Valid String channelOrderNumber) {
if (Application.isDebug()) {
return Result.buildSuccess(this.orderService.cancelPreLoan(channelOrderNumber));
} else {
return Result.buildSuccess(false,"无此操作");
}
}
/**
......@@ -87,9 +127,14 @@ public class OrderController {
*
* @return
*/
@Security(authorityId = "Order.cancelAfterLoan")
@PostMapping("/cancel/after/loan")
public Result<Boolean> cancelAfterLoan(@RequestParam @Valid String channelOrderNumber) {
return Result.buildSuccess(this.orderService.cancelAfterLoan(channelOrderNumber));
if (Application.isDebug()) {
return Result.buildSuccess(this.orderService.cancelAfterLoan(channelOrderNumber));
} else {
return Result.buildSuccess(false,"无此操作");
}
}
/**
......@@ -98,6 +143,7 @@ public class OrderController {
* @param channelOrderNumber
* @return
*/
@Security(authorityId = "Order.getOrderHistoryStatus")
@ChannelIdInit
@CheckChannelRoleByChannelOrderNumber
@GetMapping("/history/status")
......@@ -105,5 +151,37 @@ public class OrderController {
return Result.buildSuccess(orderService.getOrderHistoryStatus(channelOrderNumber));
}
/**
* 订单状态推送历史记录
*
* @param channelOrderNumber
* @return
*/
@Security(authorityId = "Order.orderCallbackRecordList")
@ChannelIdInit
@CheckChannelRoleByChannelOrderNumber
@GetMapping("/orderCallbackRecordList")
public Result orderCallbackRecordList(String channelOrderNumber) {
return Result.buildSuccess(orderService.getOrderCallbackRecordList(channelOrderNumber));
}
/**
* 订单还款计划
*
* @param channelOrderNumber
* @return
*/
@Security(authorityId = "Order.repaymentPlan")
@ChannelIdInit
@CheckChannelRoleByChannelOrderNumber
@GetMapping("/repaymentPlan")
public Result repaymentPlan(String channelOrderNumber, Long loanId) {
return Result.buildSuccess(orderService.findRepaymentPlan(channelOrderNumber, loanId));
}
}
......@@ -16,9 +16,7 @@ public class ApproveVo {
@NotNull(message = "审批,订单号不能为空")
private String channelOrderNumber;
@NotNull(message = "审批,金额不能为空")
private String amount;
@NotNull(message = "审批,期数不能为空")
private Integer period;
@NotNull(message = "审批,资金类型不能为空")
private Integer fundType;
......
package cn.quantgroup.cashloanflowboss.api.order.model;
import lombok.Data;
import java.util.List;
/**
* function:
* date: 2019/8/15
*
* @author: suntao
*/
@Data
public class HistoryOrderStatusVoModel {
private List<VoOrderStatus> historyStatus;
}
package cn.quantgroup.cashloanflowboss.api.order.model;
import lombok.Data;
/**
* function:
* date: 2019/9/4
*
* @author: suntao
*/
@Data
public class OrderBaseModel {
private String channelOrderNumber;
private String applyNo;
private Long loanId;
private Long channelId;
}
......@@ -2,6 +2,7 @@ package cn.quantgroup.cashloanflowboss.api.order.model;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
......@@ -16,7 +17,9 @@ public class OrderVo {
private Long id;
private Long channelId;
private String channelOrderNumber;
private Long createdAt;
private Long loanId;
private String applyNo;
private Date createdAt;
private String status;
/**
* [ {action:"audit",name:"审核"},{},{}... ]
......@@ -34,6 +37,7 @@ public class OrderVo {
public enum OptButtonAction {
audit("审批"),
cancel("贷前关单"),
second_audit("二次风控审批"),
pay_succ("放款成功"),
pay_fail("放款失败"),
withdraw_second("存管提现"),
......
package cn.quantgroup.cashloanflowboss.api.order.model;
import lombok.Data;
import java.util.Date;
/**
* function:
* date: 2019/8/16
*
* @author: suntao
*/
@Data
public class VoOrderStatus {
private String status;
private Date updateTime;
}
......@@ -16,6 +16,7 @@ import org.springframework.stereotype.Repository;
public interface OrderApproveRepository extends JpaRepository<OrderApprove, Long> {
OrderApprove findByChannelOrderNumber(String channelOrderNumber);
OrderApprove findByCreditNumber(String creditOrderNumber);
}
package cn.quantgroup.cashloanflowboss.api.order.service;
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.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.base.Result;
import cn.quantgroup.cashloanflowboss.core.base.ServiceResult;
import cn.quantgroup.cashloanflowboss.api.order.model.ApproveVo;
import cn.quantgroup.cashloanflowboss.api.order.model.HistoryOrderStatusVoModel;
import cn.quantgroup.cashloanflowboss.api.order.model.LendingFormModel;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderVo;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.clf.repository.ClfOrderMappingRepository;
import cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenter;
import cn.quantgroup.cashloanflowboss.spi.clotho.client.ClothoCenter;
import cn.quantgroup.cashloanflowboss.spi.clotho.service.ClothoCenterService;
import cn.quantgroup.cashloanflowboss.spi.jolyne.JolyneCenter;
import cn.quantgroup.cashloanflowboss.spi.opapi.OPCenter;
import cn.quantgroup.cashloanflowboss.spi.user.service.XyqbUserService;
import cn.quantgroup.cashloanflowboss.spi.xyqb.repository.CancelPreLoanRepository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.service.XYQBCenterService;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import cn.quantgroup.user.retbean.XUser;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
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.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import cn.quantgroup.cashloanflowboss.spi.clf.model.CallbackRecordVoModel;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* function:
* date: 2019/8/8
* date: 2019/9/16
*
* @author: suntao
*/
public interface OrderService {
Page<OrderVo> orderList(Long channelId, String channelOrderNo, String applyNo, Long loanId, Integer pageNumber, Integer pageSize);
@Slf4j
@Service
public class OrderService {
@Autowired
private ChannelConfRepository channelConfRepository;
@Autowired
private OrderApproveRepository orderApproveRepository;
@Autowired
private XyqbUserService xyqbUserService;
@Autowired
private ClothoCenter clothoCenter;
@Autowired
private JolyneCenter jolyneCenter;
@Autowired
private CLFCenter clfCenter;
@Autowired
private ClothoCenterService clothoCenterService;
@Autowired
private XYQBCenterService xyqbCenterService;
@Autowired
private ClfOrderMappingRepository clfOrderMappingRepository;
@Autowired
private CancelPreLoanRepository cancelPreLoanRepository;
@Autowired
private RestTemplate restTemplate;
@Autowired
private OPCenter opCenter;
private static final String auth = "dXNlcj14dWV6aiZwYXNzd29yZD0xMjMxMjNxd2Vxd2U%3D";
public Page<OrderVo> getOrders(Long channelId, String channelOrderNo, Integer pageNumber, Integer pageSize) {
Page<ClfOrderMapping> page = this.clfOrderMappingRepository.findAll((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
// 指定渠道号
if (Objects.nonNull(channelId)) {
predicates.add(criteriaBuilder.equal(root.get("registeredFrom"), channelId.longValue()));
}
if (StringUtils.isNotEmpty(channelOrderNo)) {
predicates.add(criteriaBuilder.equal(root.get("channelOrderNo"), channelOrderNo));
}
// 设置查询条件
criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])));
// 指定排序
criteriaQuery.orderBy(criteriaBuilder.desc(root.get("id")));
return criteriaQuery.getRestriction();
}, new PageRequest(pageNumber, pageSize));
return page.map(it -> {
OrderVo orderVo = new OrderVo();
orderVo.setId(it.getId());
orderVo.setChannelId(it.getRegisteredFrom());
orderVo.setChannelOrderNumber(it.getChannelOrderNo());
orderVo.setCreatedAt(it.getCreatedAt().getTime());
if (StringUtils.isNotEmpty(it.getApplyNo())) {
OrderApprove orderApprove = orderApproveRepository.findByCreditNumber(it.getApplyNo());
ServiceResult<XyqbCurrentOrderStatusServiceResultModel> xyqbCenterServiceXyqbOrderStatus = xyqbCenterService.getXyqbOrderStatus(it.getApplyNo(), it.getLoanId());
log.info("[xyqbCenterService.getXyqbOrderStatus]xyqbOrderStatus={}", JSONTools.serialize(xyqbCenterServiceXyqbOrderStatus));
if (xyqbCenterServiceXyqbOrderStatus.isSuccess()) {
QueryXyqbOrderStatus currentStatus = xyqbCenterServiceXyqbOrderStatus.getData().getCurrentStatus();
Tuple<String, List<OrderVo.OptButton>> currentStatusAndButtons = OrderUtil.getCurrentStatusAndButtons(currentStatus, orderApprove);
orderVo.setStatus(currentStatusAndButtons.getKey());
orderVo.setOpt(currentStatusAndButtons.getValue());
orderVo.setMessage("");
} else {
orderVo.setMessage("订单查询错误");
}
} else {
orderVo.setStatus("授信中");
orderVo.setOpt(new ArrayList<>());
orderVo.setMessage("");
}
return orderVo;
});
}
public Boolean approveOpt(ApproveVo approveVo) {
ClfOrderMapping orderMapping = clfOrderMappingRepository.findByChannelOrderNoLastOne(approveVo.getChannelOrderNumber());
if (orderMapping == null) {
log.info("approveOpt,审批失败,无订单 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return false;
}
if (Application.getPrincipal().isChannel() && !Application.getPrincipal().isSameChannel(orderMapping.getRegisteredFrom())) {
log.info("approveOpt,审批失败,不是该渠道订单无法审批 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return false;
}
XUser xUser = xyqbUserService.findXUserById(orderMapping.getQgUserId());
if (xUser == null) {
log.info("approveOpt,审批失败,未找到用户 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return false;
}
ChannelConf channelConf = channelConfRepository.getByChannelId(orderMapping.getRegisteredFrom());
if (channelConf == null) {
log.info("approveOpt,审批失败,boss渠道配置为空 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return false;
}
// 额度有效期
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_YEAR, 7);
Integer fundId = ChannelConfUtil.getFundIdByType(approveVo.getFundType(), channelConf);
// 资方 及 期数额度规则
String fundFormat = String.format(OrderUtil.financeProductsFormat, approveVo.getAmount(), approveVo.getAmount(),
approveVo.getPeriod(), fundId);
OrderApprove orderApprove = new OrderApprove();
orderApprove.setChannelOrderNumber(approveVo.getChannelOrderNumber());
orderApprove.setCreditNumber(orderMapping.getApplyNo());
orderApprove.setChannelId(orderMapping.getRegisteredFrom());
orderApprove.setFundId(fundId);
orderApprove.setFundType(approveVo.getFundType());
orderApprove.setCreateTime(new Date());
orderApprove.setUpdateTime(new Date());
orderApproveRepository.save(orderApprove);
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", channelConf.getBizType());
data.put("auditResult", approveVo.getIsPass());
data.put("amount", approveVo.getAmount());
data.put("deadLine", calendar.getTime().getTime());
data.put("financeProducts", fundFormat);
// 发起审批
String approveResult = clothoCenter.approve(data);
if ("success".equals(approveResult)) {
log.info("审批申请成功,channelOrderNumber={}", orderMapping.getChannelOrderNo());
return true;
} else {
log.info("审批申请失败,channelOrderNumber={},requestParam={}", orderMapping.getChannelOrderNo(), JSONTools.serialize(data));
return false;
}
}
/**
* 放款
*
* @param lendingFormModel
* @return
*/
public boolean lending(LendingFormModel lendingFormModel) {
boolean result;
OrderApprove orderApprove = this.orderApproveRepository.findByChannelOrderNumber(lendingFormModel.getChannelOrderNumber());
ClfOrderMapping orderMapping = this.clfOrderMappingRepository.findByChannelOrderNoAndRegisteredFromLastOne(lendingFormModel.getChannelOrderNumber(), lendingFormModel.getChannelId());
// 更新合同状态
this.xyqbCenterService.updateContractStatus(orderMapping.getQgUserId(), 2);
// 更新待放款时间
this.xyqbCenterService.updateFundLendingTime(orderMapping.getLoanId());
Map data = this.xyqbCenterService.queryLendingRecordCount(orderApprove.getFundId(), 0);
result = this.clothoCenterService.lending(orderApprove.getFundId(), new BigDecimal(String.valueOf(data.get("totalAmount"))), Integer.valueOf(String.valueOf(data.get("totalCount"))));
// 如果是非存管,创建放款MQ
if (orderApprove.getFundType() == 0) {
this.xyqbCenterService.pushLendingResult(orderMapping.getLoanId(), lendingFormModel.getResult() ? 3 : 4);
}
return result;
}
public boolean cancel(OrderVo orderVo) {
ClfOrderMapping orderMapping = clfOrderMappingRepository.findByChannelOrderNoLastOne(orderVo.getChannelOrderNumber());
if (orderMapping == null) {
log.info("cancel,关单失败,无订单 channelOrderNumber={}", orderVo.getChannelOrderNumber());
return false;
}
Tuple<Boolean, Boolean> approveOpt(ApproveVo approveVo);
XUser xUser = xyqbUserService.findXUserById(orderMapping.getQgUserId());
if (xUser == null) {
log.info("cancel,关单失败,未找到用户 channelOrderNumber={}", orderVo.getChannelOrderNumber());
return false;
}
Long userId = xUser.getId();
ConcurrentMap<Object, Object> data = Maps.newConcurrentMap();
ArrayList<Object> cancel_list = Lists.newArrayList();
cancel_list.add("update xyqb.quota_credit set is_active=0 where user_id=" + userId);
cancel_list.add("update xyqb.quota_account set is_active=0 where user_id=" + userId);
cancel_list.add("update xyqb.loan_application_history set progress=16 where user_id=" + userId);
cancel_list.add("update xyqb.loan_application_history set is_active=0 where user_id=" + userId);
cancel_list.add("delete from apply_quota_record where user_id=" + userId);
cancel_list.add("delete from user_operation_history where user_id=" + userId);
data.put("sql", cancel_list);
String cancel_result = jolyneCenter.cancel(JSONTools.serialize(data));
return "success".equals(cancel_result);
}
@Transactional
boolean secondAudit(String channelOrderNumber);
public XyqbHistoryOrderStatusServiceResultModel getOrderHistoryStatus(String channelOrderNumber) {
ClfOrderMapping orderMapping = clfOrderMappingRepository.findByChannelOrderNoLastOne(channelOrderNumber);
if (orderMapping == null) {
return new XyqbHistoryOrderStatusServiceResultModel();
}
ServiceResult<XyqbHistoryOrderStatusServiceResultModel> xyqbOrderHistoryStatusResult = xyqbCenterService.getXyqbOrderHistoryStatus(orderMapping.getApplyNo(), orderMapping.getLoanId());
if (xyqbOrderHistoryStatusResult.isSuccess()) {
log.info("[getOrderHistoryStatus]查询成功channelOrderNumber={}, xyqbOrderHistoryStatusResult={}", channelOrderNumber, JSONTools.serialize(xyqbOrderHistoryStatusResult));
return xyqbOrderHistoryStatusResult.getData();
} else {
log.info("[getOrderHistoryStatus]查询失败channelOrderNumber={}, xyqbOrderHistoryStatusResult={}", channelOrderNumber, JSONTools.serialize(xyqbOrderHistoryStatusResult));
return new XyqbHistoryOrderStatusServiceResultModel();
}
}
@Transactional
boolean lending(LendingFormModel lendingFormModel);
/**
* 贷前关单
*
* @param
* @return
*/
public boolean cancelPreLoan(String channelOrderNumber) {
boolean cancel = true;
String token = null;
ClfOrderMapping orderMapping = clfOrderMappingRepository.findByChannelOrderNoLastOne(channelOrderNumber);
if (orderMapping == null) {
log.info("cancelPreLoan,贷前关单失败,无订单 channelOrderNumber={}", channelOrderNumber);
return false;
}
try{
Long id = cancelPreLoanRepository.cancelPreLoan(orderMapping.getApplyNo());
String response = opCenter.getToken(auth);
JSONObject responseJ = JSONObject.parseObject(response);
if(responseJ != null && responseJ.containsKey("data")){
JSONObject data = (JSONObject) responseJ.get("data");
if(data != null && data.containsKey("token")){
token = String.valueOf(data.get("token"));
}
}
boolean cancel(OrderVo orderVo);
ConcurrentMap<Object, Object> data = Maps.newConcurrentMap();
data.put("data",id);
data.put("remark","贷前关单");
String result = clothoCenter.cancelPreLoan(data,token);
}catch (Exception e){
cancel = false;
log.error(e.getMessage(),e);
}
return cancel;
}
HistoryOrderStatusVoModel getOrderHistoryStatus(String channelOrderNumber);
/**
* 贷后关单
*
* @param
* @return
*/
public boolean cancelAfterLoan(String channelOrderNumber) {
boolean cancelPreLoan(String channelOrderNumber);
ClfOrderMapping orderMapping = this.clfOrderMappingRepository.findByChannelOrderNoLastOne(channelOrderNumber);
boolean cancelAfterLoan(String channelOrderNumber);
if (orderMapping == null) {
log.info("cancelAfterLoan,贷后关单失败,无订单 ={}", channelOrderNumber);
return false;
}
if (orderMapping.getLoanId() == null) {
log.info("cancelAfterLoan,贷后关单失败,loanId为空,channelOrderNumber={}", channelOrderNumber);
return false;
}
ConcurrentMap<Object, Object> data = Maps.newConcurrentMap();
data.put("loanId",orderMapping.getLoanId());
data.put("userId",orderMapping.getQgUserId());
data.put("flowNo", UUID.randomUUID());
String id = clothoCenter.cancelAfterLoan(data);
List<CallbackRecordVoModel> getOrderCallbackRecordList(String channelOrderNumber);
return true;
}
Object findRepaymentPlan(String channelOrderNumber, Long loanId);
}
package cn.quantgroup.cashloanflowboss.api.order.service;
import cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog;
import cn.quantgroup.cashloanflowboss.api.optlog.service.OptHistoryLogServiceImpl;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.CallbackFailRecord;
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.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.base.ServiceResult;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.CallbackRecord;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.clf.model.CallbackRecordVoModel;
import cn.quantgroup.cashloanflowboss.spi.clf.repository.ClfOrderMappingRepository;
import cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenterService;
import cn.quantgroup.cashloanflowboss.spi.clotho.service.ClothoCenterService;
import cn.quantgroup.cashloanflowboss.spi.jolyne.JolyneCenter;
import cn.quantgroup.cashloanflowboss.spi.jolyne.JolyneUtil;
import cn.quantgroup.cashloanflowboss.spi.user.service.XyqbUserService;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.Contract;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.LoanApplicationHistory;
import cn.quantgroup.cashloanflowboss.spi.xyqb.service.XYQBCenterService;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import cn.quantgroup.user.retbean.XUser;
import com.google.common.collect.Lists;
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.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* function:
* date: 2019/8/8
*
* @author: suntao
*/
@Slf4j
@Service
public class OrderServiceImpl implements OrderService{
@Autowired
private OptHistoryLogServiceImpl optHistoryLogService;
@Autowired
private ChannelConfRepository channelConfRepository;
@Autowired
private OrderApproveRepository orderApproveRepository;
@Autowired
private XyqbUserService xyqbUserService;
@Autowired
private XYQBCenterService xyqbCenterService;
@Autowired
private ClothoCenterService clothoCenterService;
@Autowired
private CLFCenterService clfCenterService;
@Autowired
private JolyneCenter jolyneCenter;
@Autowired
private ClfOrderMappingRepository clfOrderMappingRepository;
@Override
public Page<OrderVo> orderList(Long channelId, String channelOrderNo, String applyNo, Long loanId, Integer pageNumber, Integer pageSize) {
Page<ClfOrderMapping> page = this.clfOrderMappingRepository.findAll((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
// 指定渠道号
if (Objects.nonNull(channelId)) {
predicates.add(criteriaBuilder.equal(root.get("registeredFrom"), channelId.longValue()));
}
if (StringUtils.isNotEmpty(channelOrderNo)) {
predicates.add(criteriaBuilder.equal(root.get("channelOrderNo"), channelOrderNo));
}
if (StringUtils.isNotEmpty(applyNo)) {
predicates.add(criteriaBuilder.equal(root.get("applyNo"), applyNo));
}
if (loanId != null && loanId > 0) {
predicates.add(criteriaBuilder.equal(root.get("loanId"), loanId));
}
// 设置查询条件
criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])));
// 指定排序
criteriaQuery.orderBy(criteriaBuilder.desc(root.get("id")));
return criteriaQuery.getRestriction();
}, new PageRequest(pageNumber, pageSize));
return page.map(it -> {
OrderVo orderVo = new OrderVo();
orderVo.setId(it.getId());
orderVo.setChannelId(it.getRegisteredFrom());
orderVo.setChannelOrderNumber(it.getChannelOrderNo());
if (!Application.getPrincipal().isChannel()) {
orderVo.setLoanId(it.getLoanId());
// 授信申请号,非渠道权限登陆显示admin及以上权限用户
orderVo.setApplyNo(it.getApplyNo());
}
orderVo.setCreatedAt(it.getCreatedAt());
if (StringUtils.isNotEmpty(it.getApplyNo())) {
ServiceResult<XyqbCurrentOrderStatusServiceResultModel> xyqbCenterServiceXyqbOrderStatus = xyqbCenterService.getXyqbOrderStatus(it.getApplyNo(), it.getLoanId());
log.info("[xyqbCenterService.getXyqbOrderStatus]xyqbOrderStatus={}", JSONTools.serialize(xyqbCenterServiceXyqbOrderStatus));
if (xyqbCenterServiceXyqbOrderStatus.isSuccess()) {
QueryXyqbOrderStatus currentStatus = xyqbCenterServiceXyqbOrderStatus.getData().getCurrentStatus();
Tuple<String, List<OrderVo.OptButton>> currentStatusAndButtons = this.getCurrentStatusAndButtons(currentStatus, it);
orderVo.setStatus(currentStatusAndButtons.getKey());
if (Application.isDebug()) {
// 只有测试环境才需要订单操作
orderVo.setOpt(currentStatusAndButtons.getValue());
}
orderVo.setMessage("");
} else {
orderVo.setStatus("未知,稍后查询");
orderVo.setMessage("订单查询错误");
}
} else {
orderVo.setStatus("授信中");
orderVo.setOpt(new ArrayList<>());
orderVo.setMessage("");
}
return orderVo;
});
}
/**
*
* @param approveVo
* @return Tuple<Boolean 审批结果 true 审批完成 false 审批操作失败, Boolean 资产计划配置 true 配置没问题 false 配置需要检查>
*/
@Override
public Tuple<Boolean, Boolean> approveOpt(ApproveVo approveVo) {
log.info("approveOpt,审批操作入参,approveVo={}", JSONTools.serialize(approveVo));
if (StringUtils.isEmpty(approveVo.getAmount())) {
// 如果UI 金额为空 默认4000
approveVo.setAmount("4000");
}
if (approveVo.getPeriod() == null) {
// 如果UI 期数为空 3期
approveVo.setPeriod(3);
}
ClfOrderMapping orderMapping = clfOrderMappingRepository.findByChannelOrderNoLastOne(approveVo.getChannelOrderNumber());
if (orderMapping == null) {
log.info("approveOpt,审批失败,无订单 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return new Tuple<>(false, false);
}
if (Application.getPrincipal().isChannel() && !Application.getPrincipal().isSameChannel(orderMapping.getRegisteredFrom())) {
log.info("approveOpt,审批失败,不是该渠道订单无法审批 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return new Tuple<>(false, false);
}
XUser xUser = xyqbUserService.findXUserById(orderMapping.getQgUserId());
if (xUser == null) {
log.info("approveOpt,审批失败,未找到用户 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return new Tuple<>(false, false);
}
ChannelConf channelConf = channelConfRepository.getByChannelId(orderMapping.getRegisteredFrom());
if (channelConf == null) {
log.info("approveOpt,审批失败,boss渠道配置为空 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return new Tuple<>(false, false);
}
// 额度有效期
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_YEAR, 7);
Integer fundId = ChannelConfUtil.getFundIdByType(approveVo.getFundType(), channelConf);
// 资方 及 期数额度规则
String fundFormat = String.format(OrderUtil.financeProductsFormat, approveVo.getAmount(), approveVo.getAmount(),
approveVo.getPeriod(), fundId);
OrderApprove orderApproveExsit = orderApproveRepository.findByChannelOrderNumber(approveVo.getChannelOrderNumber());
if (orderApproveExsit != null) {
orderApproveExsit.setFundId(fundId);
orderApproveExsit.setFundType(approveVo.getFundType());
orderApproveExsit.setUpdateTime(new Date());
orderApproveRepository.save(orderApproveExsit);
} else {
OrderApprove orderApprove = new OrderApprove();
orderApprove.setChannelOrderNumber(approveVo.getChannelOrderNumber());
orderApprove.setCreditNumber(orderMapping.getApplyNo());
orderApprove.setChannelId(orderMapping.getRegisteredFrom());
orderApprove.setFundId(fundId);
orderApprove.setFundType(approveVo.getFundType());
orderApprove.setCreateTime(new Date());
orderApprove.setUpdateTime(new Date());
orderApproveRepository.save(orderApprove);
}
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", channelConf.getBizType());
data.put("auditResult", approveVo.getIsPass());
data.put("amount", approveVo.getAmount());
data.put("deadLine", calendar.getTime().getTime());
data.put("financeProducts", fundFormat);
// 发起审批
log.info("[approveOpt] 向clotho发起审批,data={}", JSONTools.serialize(data));
String approveStringResult = clothoCenterService.approve(data);
Boolean corpPolicyValidate = false;
try {
corpPolicyValidate = xyqbCenterService.validateCorpPolicy(Long.valueOf(fundId), new Date());
} catch (Exception e) {
log.error("审批,资方校验异常,channelOrderNumber={},fundId={}, e={}", orderMapping.getChannelOrderNo(), fundId, ExceptionUtils.getStackTrace(e));
}
// 操作记录
OptHistoryLog optHistoryLog = new OptHistoryLog();
optHistoryLog.setChannelOrderNumber(approveVo.getChannelOrderNumber());
optHistoryLog.setCreditNumber(orderMapping.getApplyNo());
optHistoryLog.setLoanId(orderMapping.getLoanId());
optHistoryLog.setChannelId(orderMapping.getRegisteredFrom());
optHistoryLog.setOptName("审批操作");
optHistoryLog.setCreateTime(new Date());
Boolean optResult;
if ("success".equals(approveStringResult)) {
optHistoryLog.setOptLogDetail(corpPolicyValidate ? "" : "资产计划未配置,请联系管理员配置");
optHistoryLog.setOptResult(true);
optResult = true;
log.info("审批申请成功,channelOrderNumber={}", orderMapping.getChannelOrderNo());
} else {
optHistoryLog.setOptResult(false);
optHistoryLog.setOptLogDetail("审批失败");
log.info("审批申请失败,channelOrderNumber={},requestParam={}", orderMapping.getChannelOrderNo(), JSONTools.serialize(data));
optResult = false;
}
optHistoryLogService.save(optHistoryLog);
return new Tuple<>(optResult, corpPolicyValidate);
}
/**
* 已经自动,无须调用
* 二次风控
*
* @param channelOrderNumber
* @return
*/
@Transactional
@Override
public boolean secondAudit(String channelOrderNumber) {
boolean result = true;
// 操作记录
OptHistoryLog optHistoryLog = new OptHistoryLog();
optHistoryLog.setChannelOrderNumber(channelOrderNumber);
ClfOrderMapping orderMapping = this.clfOrderMappingRepository.findByChannelOrderNoLastOne(channelOrderNumber);
if (orderMapping == null || orderMapping.getLoanId() == null) {
log.info("secondAudit,orderMapping为空或者loanId为空,channelOrderNumber=".concat(channelOrderNumber));
optHistoryLog.setOptName("二次审批操作");
optHistoryLog.setOptLogDetail("orderMapping为空或者loanId为空,操作失败");
optHistoryLog.setOptResult(false);
optHistoryLog.setCreateTime(new Date());
optHistoryLogService.save(optHistoryLog);
return false;
}
optHistoryLog.setCreditNumber(orderMapping.getApplyNo());
optHistoryLog.setLoanId(orderMapping.getLoanId());
optHistoryLog.setChannelId(orderMapping.getRegisteredFrom());
optHistoryLog.setOptName("二次审批操作");
optHistoryLog.setCreateTime(new Date());
// 更新合同状态
Contract conscont= xyqbCenterService.findContractByUserId(orderMapping.getQgUserId());
if (conscont != null) {
if (conscont.getGenerateStatus() != 2) {
log.info("secondAudit,合同为空,channelOrderNumber=".concat(channelOrderNumber));
optHistoryLog.setOptName("二次审批操作");
optHistoryLog.setOptLogDetail("合同未生成,请更换新的身份证尝试");
optHistoryLog.setOptResult(false);
optHistoryLog.setCreateTime(new Date());
optHistoryLogService.save(optHistoryLog);
// conscont.setGenerateStatus(2);
// xyqbCenterService.saveContract(conscont);
}
} else {
// 合同为空 log表记录问题,UI用户查询
log.info("secondAudit,合同为空,channelOrderNumber=".concat(channelOrderNumber));
optHistoryLog.setOptName("二次审批操作");
optHistoryLog.setOptLogDetail("合同为空,请更换新的身份证尝试");
optHistoryLog.setOptResult(false);
optHistoryLog.setCreateTime(new Date());
optHistoryLogService.save(optHistoryLog);
// 不需要return
}
// 二次风控回调
XUser xUser = xyqbUserService.findXUserById(orderMapping.getQgUserId());
if (xUser == null) {
log.info("[secendAudit]二次风控失败,未找到user channelOrderNumber={}", channelOrderNumber);
optHistoryLog.setOptLogDetail("二次风控失败,未找到user");
optHistoryLog.setOptResult(false);
optHistoryLogService.save(optHistoryLog);
return false;
}
ChannelConf channelConf = channelConfRepository.getByChannelId(orderMapping.getRegisteredFrom());
if (channelConf == null) {
log.info("[secendAudit]二次风控失败,未找到channelConf配置 channelOrderNumber={}", channelOrderNumber);
optHistoryLog.setOptLogDetail("二次风控失败,未找到channelConf配置");
optHistoryLog.setOptResult(false);
optHistoryLogService.save(optHistoryLog);
return false;
}
LoanApplicationHistory loanApplicationHistory = xyqbCenterService.findLoanApplicationHistoryById(orderMapping.getLoanId());
if (LoanProgress.START_ORDER.equals(loanApplicationHistory.getProgress())) {
// 50
log.info("[secendAudit]二次风控发起,channelOrderNumber={}, bizType={}", channelOrderNumber, channelConf.getBizType());
result = clothoCenterService.orderAuditNotify(xUser.getUuid(), orderMapping.getLoanId(), true, channelConf.getBizType());
if (result) {
log.info("[secendAudit]二次风控成功,channelOrderNumber={}, result={}", channelOrderNumber, result);
} else {
log.info("[secendAudit]二次风控失败,clotho返回失败 channelOrderNumber={}", channelOrderNumber);
optHistoryLog.setOptLogDetail("二次风控失败,clotho返回失败");
optHistoryLog.setOptResult(false);
optHistoryLogService.save(optHistoryLog);
return false;
}
} else if (LoanProgress.WAITING_FUND.equals(loanApplicationHistory.getProgress())) {
// 20 已经回调过
result = true;
}
// 更新待放款时间(5分钟之前)
ArrayList<String> updateWaitingFundingCorpOperatePeople = Lists.newArrayList();
updateWaitingFundingCorpOperatePeople.add("update waiting_funding_corp_operate_people set created_at = DATE_SUB(created_at, interval 5 minute) where loan_application_history_id = " + orderMapping.getLoanId());
jolyneCenter.sqlXyqb(JolyneUtil.getJolneSql(updateWaitingFundingCorpOperatePeople));
optHistoryLog.setOptLogDetail("二次风控操作成功");
optHistoryLog.setOptResult(true);
optHistoryLogService.save(optHistoryLog);
log.info("[secendAudit]二次风控操作 最后结果,channelOrderNumber={}, result={}", channelOrderNumber, result);
return result;
}
/**
* 放款
*
* @param lendingFormModel
* @return
*/
@Transactional
@Override
public boolean lending(LendingFormModel lendingFormModel) {
boolean result = false;
OrderApprove orderApprove = this.orderApproveRepository.findByChannelOrderNumber(lendingFormModel.getChannelOrderNumber());
ClfOrderMapping orderMapping = this.clfOrderMappingRepository.findByChannelOrderNoAndRegisteredFromLastOne(lendingFormModel.getChannelOrderNumber(), lendingFormModel.getChannelId());
String optDetail = "";
// 操作记录
OptHistoryLog optHistoryLog = new OptHistoryLog();
optHistoryLog.setChannelOrderNumber(lendingFormModel.getChannelOrderNumber());
optHistoryLog.setCreditNumber(orderMapping.getApplyNo());
optHistoryLog.setLoanId(orderMapping.getLoanId());
optHistoryLog.setChannelId(orderMapping.getRegisteredFrom());
optHistoryLog.setOptName("放款操作");
optHistoryLog.setCreateTime(new Date());
// 更新合同状态
Contract conscont= xyqbCenterService.findContractByUserId(orderMapping.getQgUserId());
if (conscont == null) {
// 合同为空 log表记录问题,UI用户查询
optDetail = optDetail.concat("合同未生成,请注意,需要不用身份证才能自动生成合同,");
}
if (orderApprove.getFundType() == 0) {
// 如果是非存管
result = this.xyqbCenterService.payResultNotify(orderMapping.getLoanId(), lendingFormModel.getResult());
log.info("[order_lending]非存管,放款结果通知,channelOrderNumber={}, result={}", lendingFormModel.getChannelOrderNumber(), result);
} else {
// p2p
Map data = this.xyqbCenterService.queryLendingRecordCount(Long.valueOf(orderApprove.getFundId()));
log.info("[order_lending][queryLendingRecordCount]查询待打款数量,channelOrderNumber={}, data={}", lendingFormModel.getChannelOrderNumber(), data);
if (data.size() > 0) {
if (Objects.nonNull(data.get("totalAmount")) && Objects.nonNull(data.get("totalCount"))) {
result = this.clothoCenterService.lending(orderApprove.getFundId(), new BigDecimal(String.valueOf(data.get("totalAmount"))), Integer.valueOf(String.valueOf(data.get("totalCount"))));
log.info("[order_lending]直投打款,channelOrderNumber={}, result={}", lendingFormModel.getChannelOrderNumber(), result);
}
}
}
if (result) {
optDetail = optDetail.concat("放款操作成功");
optHistoryLog.setOptResult(true);
} else {
optDetail = optDetail.concat("放款操作失败");
optHistoryLog.setOptResult(false);
}
log.info("[order_lending]放款操作 最后结果,channelOrderNumber={}, result={}", lendingFormModel.getChannelOrderNumber(), result);
optHistoryLog.setOptLogDetail(optDetail);
optHistoryLogService.save(optHistoryLog);
return result;
}
@Override
public boolean cancel(OrderVo orderVo) {
ClfOrderMapping orderMapping = clfOrderMappingRepository.findByChannelOrderNoLastOne(orderVo.getChannelOrderNumber());
if (orderMapping == null) {
log.info("sqlXyqb,关单失败,无订单 channelOrderNumber={}", orderVo.getChannelOrderNumber());
return false;
}
XUser xUser = xyqbUserService.findXUserById(orderMapping.getQgUserId());
if (xUser == null) {
log.info("sqlXyqb,关单失败,未找到用户 channelOrderNumber={}", orderVo.getChannelOrderNumber());
return false;
}
Long userId = xUser.getId();
ConcurrentMap<Object, Object> data = Maps.newConcurrentMap();
ArrayList<Object> cancel_list = Lists.newArrayList();
cancel_list.add("update xyqb.quota_credit set is_active=0 where user_id=" + userId);
cancel_list.add("update xyqb.quota_account set is_active=0 where user_id=" + userId);
cancel_list.add("update xyqb.loan_application_history set progress=16 where user_id=" + userId);
cancel_list.add("update xyqb.loan_application_history set is_active=0 where user_id=" + userId);
cancel_list.add("delete from apply_quota_record where user_id=" + userId);
cancel_list.add("delete from user_operation_history where user_id=" + userId);
data.put("sql", cancel_list);
String cancel_result = jolyneCenter.sqlXyqb(JSONTools.serialize(data));
return "success".equals(cancel_result);
}
@Override
public HistoryOrderStatusVoModel getOrderHistoryStatus(String channelOrderNumber) {
ClfOrderMapping orderMapping = clfOrderMappingRepository.findByChannelOrderNoLastOne(channelOrderNumber);
HistoryOrderStatusVoModel historyOrderStatusVoModel = new HistoryOrderStatusVoModel();
if (orderMapping == null) {
return historyOrderStatusVoModel;
}
OrderApprove orderApprove = orderApproveRepository.findByCreditNumber(orderMapping.getApplyNo());
ServiceResult<XyqbHistoryOrderStatusServiceResultModel> xyqbOrderHistoryStatusResult = xyqbCenterService.getXyqbOrderHistoryStatus(orderMapping.getApplyNo(), orderMapping.getLoanId());
if (xyqbOrderHistoryStatusResult.isSuccess()) {
log.info("[getOrderHistoryStatus]查询成功channelOrderNumber={}, xyqbOrderHistoryStatusResult={}", channelOrderNumber, JSONTools.serialize(xyqbOrderHistoryStatusResult));
XyqbHistoryOrderStatusServiceResultModel data = xyqbOrderHistoryStatusResult.getData();
List<VoOrderStatus> historyStatusList = new ArrayList<>();
for (QueryXyqbOrderStatus queryXyqbOrderStatus : data.getHistoryStatus()) {
VoOrderStatus voOrderStatus = new VoOrderStatus();
Tuple<String, String> stautsName = OrderUtil.KaNoticeTypeNameConvertChnName(queryXyqbOrderStatus.getStatus(), orderApprove);
voOrderStatus.setStatus(stautsName.getValue());
voOrderStatus.setUpdateTime(new Date(queryXyqbOrderStatus.getUpdateTime()));
historyStatusList.add(voOrderStatus);
}
historyOrderStatusVoModel.setHistoryStatus(historyStatusList);
return historyOrderStatusVoModel;
} else {
log.info("[getOrderHistoryStatus]查询失败channelOrderNumber={}, xyqbOrderHistoryStatusResult={}", channelOrderNumber, JSONTools.serialize(xyqbOrderHistoryStatusResult));
return historyOrderStatusVoModel;
}
}
/**
* 贷前关单
*
* @param
* @return
*/
@Override
public boolean cancelPreLoan(String channelOrderNumber) {
/*Order order = this.orderRepository.findOrderByChannelOrderNumber(channelOrderNumber);
ClfOrderMapping orderMapping = this.clfOrderMappingRepository.findByChannelOrderNoLastOne(channelOrderNumber);
if (orderMapping == null) {
login.info("cancelPreLoan,贷前关单失败,无订单 channelOrderNumber={}", channelOrderNumber);
return false;
}*/
Long id = xyqbCenterService.cancelPreLoan(channelOrderNumber);
ConcurrentMap<Object, Object> data = Maps.newConcurrentMap();
data.put("data", id);
data.put("remark", "系统关单");
String result = clothoCenterService.cancelPreLoan(data);
return true;
}
/**
* 贷后关单
*
* @param
* @return
*/
@Override
public boolean cancelAfterLoan(String channelOrderNumber) {
ClfOrderMapping orderMapping = this.clfOrderMappingRepository.findByChannelOrderNoLastOne(channelOrderNumber);
if (orderMapping == null) {
log.info("cancelAfterLoan,贷后关单失败,无订单 channelOrderNumber={}", channelOrderNumber);
return false;
}
if (orderMapping.getLoanId() == null) {
log.info("cancelAfterLoan,贷后关单失败,loanId为空,channelOrderNumber={}", channelOrderNumber);
return false;
}
ConcurrentMap<Object, Object> data = Maps.newConcurrentMap();
data.put("loanId", orderMapping.getLoanId());
data.put("userId", orderMapping.getQgUserId());
data.put("flowNo", UUID.randomUUID());
String id = clothoCenterService.cancelAfterLoan(data);
return true;
}
/**
* 查询订单历史推送记录
* @param channelOrderNumber
* @return
*/
@Override
public List<CallbackRecordVoModel> getOrderCallbackRecordList(String channelOrderNumber) {
List<CallbackRecordVoModel> callbackRecordVoModelList = new ArrayList<>();
ClfOrderMapping orderMapping = clfOrderMappingRepository.findByChannelOrderNoLastOne(channelOrderNumber);
if (orderMapping == null) {
return null;
}
List<CallbackRecord> callbackRecordList = clfCenterService.findCallbackRecordByApplyNo(orderMapping.getApplyNo());
if (CollectionUtils.isNotEmpty(callbackRecordList)) {
for (CallbackRecord callbackRecord : callbackRecordList) {
CallbackRecordVoModel callbackRecordVoModel = new CallbackRecordVoModel();
callbackRecordVoModel.setChannelOrderNo(orderMapping.getChannelOrderNo());
callbackRecordVoModel.setApplyNo(orderMapping.getApplyNo());
callbackRecordVoModel.setLoanId(orderMapping.getLoanId());
callbackRecordVoModel.setTermNo(callbackRecord.getTermNo());
callbackRecordVoModel.setNoticeType(callbackRecord.getNoticeType());
callbackRecordVoModel.setCallbackStatus(callbackRecord.getCallbackStatus());
callbackRecordVoModel.setChannelId(callbackRecord.getChannelId());
callbackRecordVoModel.setCreatedAt(callbackRecord.getCreatedAt());
callbackRecordVoModel.setUpdatedAt(callbackRecord.getUpdatedAt());
callbackRecordVoModel.setTableName("Success");
callbackRecordVoModelList.add(callbackRecordVoModel);
}
}
List<CallbackFailRecord> callbackFailRecordList = clfCenterService.findCallbackFailRecordByApplyNo(orderMapping.getApplyNo());
if (CollectionUtils.isNotEmpty(callbackFailRecordList)) {
for (CallbackFailRecord callbackFailRecord : callbackFailRecordList) {
CallbackRecordVoModel callbackFailRecordVoModel = new CallbackRecordVoModel();
callbackFailRecordVoModel.setChannelOrderNo(orderMapping.getChannelOrderNo());
callbackFailRecordVoModel.setApplyNo(orderMapping.getApplyNo());
callbackFailRecordVoModel.setLoanId(orderMapping.getLoanId());
callbackFailRecordVoModel.setTermNo(callbackFailRecord.getTermNo());
callbackFailRecordVoModel.setNoticeType(callbackFailRecord.getNoticeType());
callbackFailRecordVoModel.setCallbackStatus(callbackFailRecord.getCallbackStatus());
callbackFailRecordVoModel.setChannelId(callbackFailRecord.getChannelId());
callbackFailRecordVoModel.setRetryTimes(callbackFailRecord.getRetryTimes());
callbackFailRecordVoModel.setFailCode(callbackFailRecord.getFailCode());
callbackFailRecordVoModel.setCallbackRouter(callbackFailRecord.getCallbackRouter());
callbackFailRecordVoModel.setIsActive(callbackFailRecord.getIsActive());
callbackFailRecordVoModel.setExdata(callbackFailRecord.getExdata());
callbackFailRecordVoModel.setCreatedAt(callbackFailRecord.getCreatedAt());
callbackFailRecordVoModel.setUpdatedAt(callbackFailRecord.getUpdatedAt());
callbackFailRecordVoModel.setTableName("Fail");
callbackRecordVoModelList.add(callbackFailRecordVoModel);
}
}
return callbackRecordVoModelList;
}
/**
* 查询还款计划
* @param channelOrderNumber
* @param loanId
* @return
*/
@Override
public Object findRepaymentPlan(String channelOrderNumber, Long loanId) {
if (loanId == null || loanId < 1) {
ClfOrderMapping orderMapping = clfCenterService.findOrderMappingByChannelOrderNo(channelOrderNumber);
if (orderMapping == null || orderMapping.getLoanId() == null) {
return null;
}
loanId = orderMapping.getLoanId();
}
// xyqbCenterService.findRepaymentPlan(loanId);
return null;
}
/**
* 查询订单状态
* @param currentStatus
* @param orderMapping
* @return
*/
private Tuple<String, List<OrderVo.OptButton>> getCurrentStatusAndButtons(QueryXyqbOrderStatus currentStatus, ClfOrderMapping orderMapping) {
Tuple tuple = new Tuple();
List<OrderVo.OptButton> buttonList = new ArrayList<>();
if (currentStatus != null) {
if (StringUtils.isNotEmpty(currentStatus.getStatus())) {
OrderVo.OptButton buttonBeforeCancel = new OrderVo.OptButton();
buttonBeforeCancel.setAction(OrderVo.OptButtonAction.cancel.name());
buttonBeforeCancel.setName(OrderVo.OptButtonAction.cancel.getDesc());
switch (currentStatus.getStatus()) {
case "CREDIT_SUCC" :
// 授信成功 需要 审批
OrderVo.OptButton buttonApprove = new OrderVo.OptButton();
buttonApprove.setAction(OrderVo.OptButtonAction.audit.name());
buttonApprove.setName(OrderVo.OptButtonAction.audit.getDesc());
buttonList.add(buttonApprove);
buttonList.add(buttonBeforeCancel);
tuple.setKey("授信成功");
tuple.setValue(buttonList);
return tuple;
case "APPROVE_ING" :
OrderApprove orderApprove = orderApproveRepository.findByCreditNumber(orderMapping.getApplyNo());
if (orderApprove == null) {
OrderVo.OptButton buttonApprove2 = new OrderVo.OptButton();
buttonApprove2.setAction(OrderVo.OptButtonAction.audit.name());
buttonApprove2.setName(OrderVo.OptButtonAction.audit.getDesc());
buttonList.add(buttonApprove2);
buttonList.add(buttonBeforeCancel);
tuple.setKey("授信成功,待审批");
tuple.setValue(buttonList);
} else {
tuple.setKey("审批中(等待几分钟)");
buttonList.add(buttonBeforeCancel);
tuple.setValue(buttonList);
}
return tuple;
case "REJECT" :
tuple.setKey("审批拒绝");
tuple.setValue(buttonList);
return tuple;
case "FUAD_ASSIFN_SUCC" :
tuple.setKey("审批通过,待提现");
buttonList.add(buttonBeforeCancel);
tuple.setValue(buttonList);
return tuple;
case "WITHDRAW" :
// 提现申请成功 需要放款
tuple.setKey("申请提现成功");
LoanApplicationHistory loanApplicationHistory = xyqbCenterService.findLoanApplicationHistoryById(orderMapping.getLoanId());
if (loanApplicationHistory != null) {
if (LoanProgress.WAITING_FUND.equals(loanApplicationHistory.getProgress())) {
// 更改放款时间,二次风控回调
OrderVo.OptButton secondAudit = new OrderVo.OptButton();
secondAudit.setAction(OrderVo.OptButtonAction.second_audit.name());
secondAudit.setName(OrderVo.OptButtonAction.second_audit.getDesc());
buttonList.add(secondAudit);
} else if (LoanProgress.FINAL_SENDED_TO_FUNDING_CORP.equals(loanApplicationHistory.getProgress())) {
OrderVo.OptButton buttonPaySucc = new OrderVo.OptButton();
buttonPaySucc.setAction(OrderVo.OptButtonAction.pay_succ.name());
buttonPaySucc.setName(OrderVo.OptButtonAction.pay_succ.getDesc());
buttonList.add(buttonPaySucc);
OrderVo.OptButton buttonPayFail = new OrderVo.OptButton();
buttonPayFail.setAction(OrderVo.OptButtonAction.pay_fail.name());
buttonPayFail.setName(OrderVo.OptButtonAction.pay_fail.getDesc());
buttonList.add(buttonPayFail);
buttonList.add(buttonBeforeCancel);
}
tuple.setValue(buttonList);
}
return tuple;
case "PAY_ING" :
tuple.setKey("放款中(等待几分钟)");
buttonList.add(buttonBeforeCancel);
tuple.setValue(buttonList);
return tuple;
case "FUND_WAITING_WITHDRAW" :
tuple.setKey("放款到存管账户,待二次提现");
OrderVo.OptButton cancelAfterButton0 = new OrderVo.OptButton();
cancelAfterButton0.setAction(OrderVo.OptButtonAction.cancel_after.name());
cancelAfterButton0.setName(OrderVo.OptButtonAction.cancel_after.getDesc());
buttonList.add(cancelAfterButton0);
tuple.setValue(buttonList);
return tuple;
case "FUND_SUCC" :
OrderApprove orderApprove2 = orderApproveRepository.findByCreditNumber(orderMapping.getApplyNo());
if (orderApprove2 != null && orderApprove2.getFundType() != 0) {
// 是存管
tuple.setKey("放款到存管,待二次提现");
OrderVo.OptButton cancelAfterButton = new OrderVo.OptButton();
cancelAfterButton.setAction(OrderVo.OptButtonAction.cancel_after.name());
cancelAfterButton.setName(OrderVo.OptButtonAction.cancel_after.getDesc());
buttonList.add(cancelAfterButton);
OrderVo.OptButton withdrawSecondButton = new OrderVo.OptButton();
withdrawSecondButton.setAction(OrderVo.OptButtonAction.withdraw_second.name());
withdrawSecondButton.setName(OrderVo.OptButtonAction.withdraw_second.getDesc());
buttonList.add(withdrawSecondButton);
} else {
tuple.setKey("放款成功");
}
tuple.setValue(buttonList);
return tuple;
case "FUND_WITHDRAW_SUCC" :
tuple.setKey("存管提现成功");
tuple.setValue(buttonList);
return tuple;
case "FUND_FAIL" :
tuple.setKey("放款失败");
tuple.setValue(buttonList);
return tuple;
case "ALL_REPAID" :
tuple.setKey("已结清");
tuple.setValue(buttonList);
return tuple;
case "CANCEL_LOAN" :
tuple.setKey("已关单");
tuple.setValue(buttonList);
return tuple;
case "CANCEL_AFTER_LOAN" :
tuple.setKey("存管提现超时或贷后关单");
tuple.setValue(buttonList);
return tuple;
default:
tuple.setKey("未知状态");
tuple.setValue(buttonList);
return tuple;
}
}
} else {
tuple.setKey("未知状态");
tuple.setValue(buttonList);
return tuple;
}
tuple.setKey("未知状态");
tuple.setValue(buttonList);
return tuple;
}
}
package cn.quantgroup.cashloanflowboss.api.order.util;
import java.util.Date;
import cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog;
import cn.quantgroup.cashloanflowboss.api.order.entity.OrderApprove;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderVo;
import cn.quantgroup.cashloanflowboss.api.order.model.QueryXyqbOrderStatus;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ApplyRequestHistory;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.WithdrawRecord;
import cn.quantgroup.cashloanflowboss.spi.clf.model.KANoticeType;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
......@@ -18,111 +25,147 @@ import java.util.List;
public class OrderUtil {
public static final String financeProductsFormat = "[{\"min\":%s,\"max\":%s,\"terms\":[{\"term\":%s,\"fundInfo\":[{\"fundId\":%s,\"rate\":\"0\",\"rateType\":1,\"priority\":\"1\",\"feeType\":\"1\"}]}]}]";
/**
*
* @param kaNoticeType
* @return 状态英文,状态中文
*/
public static Tuple<String, String> KaNoticeTypeConvertChnName(KANoticeType kaNoticeType, OrderApprove orderApprove) {
public static Tuple<String, List<OrderVo.OptButton>> getCurrentStatusAndButtons(QueryXyqbOrderStatus currentStatus, OrderApprove orderApprove) {
Tuple tuple = new Tuple();
List<OrderVo.OptButton> buttonList = new ArrayList<>();
if (kaNoticeType != null) {
switch (kaNoticeType.name()) {
case "CREDIT_SUCC" :
// 授信成功 需要 审批
return new Tuple("CREDIT_SUCC", "授信成功");
case "APPROVE_ING" :
if (orderApprove == null) {
return new Tuple("APPROVE_ING", "授信成功,待审批");
} else {
return new Tuple("APPROVE_ING", "审批中");
}
case "REJECT" :
return new Tuple(kaNoticeType.name(), "审批拒绝");
case "FUAD_ASSIFN_SUCC" :
return new Tuple(kaNoticeType.name(), "审批通过,待提现");
case "WITHDRAW" :
// 提现申请成功 需要放款
return new Tuple(kaNoticeType.name(), "申请提现成功");
case "PAY_ING" :
return new Tuple("PAY_ING", "放款中");
case "FUND_SUCC" :
if (orderApprove != null && orderApprove.getFundType() != 0) {
// 是存管
return new Tuple(kaNoticeType.name(), "放款到存管,待提现");
} else {
return new Tuple(kaNoticeType.name(), "放款成功");
}
case "FUND_WITHDRAW_SUCC" :
return new Tuple(kaNoticeType.name(), "存管提现成功");
case "FUND_FAIL" :
return new Tuple(kaNoticeType.name(), "放款失败");
case "ALL_REPAID" :
return new Tuple(kaNoticeType.name(), "已结清");
case "CANCEL_LOAN" :
return new Tuple(kaNoticeType.name(), "已关单");
case "CANCEL_AFTER_LOAN" :
return new Tuple(kaNoticeType.name(), "存管提现超时或贷后关单");
default:
return new Tuple(kaNoticeType.name(), "未知状态");
}
}
return new Tuple(kaNoticeType.name(), "未知状态");
}
if (currentStatus != null) {
if (StringUtils.isNotEmpty(currentStatus.getStatus())) {
OrderVo.OptButton buttonBeforeCancel = new OrderVo.OptButton();
buttonBeforeCancel.setAction(OrderVo.OptButtonAction.cancel.name());
buttonBeforeCancel.setName(OrderVo.OptButtonAction.cancel.getDesc());
switch (currentStatus.getStatus()) {
case "CREDIT_SUCC" :
// 授信成功 需要 审批
OrderVo.OptButton buttonApprove = new OrderVo.OptButton();
buttonApprove.setAction(OrderVo.OptButtonAction.audit.name());
buttonApprove.setName(OrderVo.OptButtonAction.audit.getDesc());
buttonList.add(buttonApprove);
buttonList.add(buttonBeforeCancel);
tuple.setKey("授信成功");
tuple.setValue(buttonList);
return tuple;
case "APPROVE_ING" :
tuple.setKey("审批中");
buttonList.add(buttonBeforeCancel);
tuple.setValue(buttonList);
return tuple;
case "REJECT" :
tuple.setKey("审批拒绝");
tuple.setValue(buttonList);
return tuple;
case "FUAD_ASSIFN_SUCC" :
tuple.setKey("审批通过,待提现");
buttonList.add(buttonBeforeCancel);
tuple.setValue(buttonList);
return tuple;
case "WITHDRAW" :
// 提现申请成功 需要放款
tuple.setKey("申请提现成功");
OrderVo.OptButton buttonPaySucc = new OrderVo.OptButton();
buttonPaySucc.setAction(OrderVo.OptButtonAction.pay_succ.name());
buttonPaySucc.setName(OrderVo.OptButtonAction.pay_succ.getDesc());
buttonList.add(buttonPaySucc);
OrderVo.OptButton buttonPayFail = new OrderVo.OptButton();
buttonPayFail.setAction(OrderVo.OptButtonAction.pay_fail.name());
buttonPayFail.setName(OrderVo.OptButtonAction.pay_fail.getDesc());
buttonList.add(buttonPayFail);
buttonList.add(buttonBeforeCancel);
tuple.setValue(buttonList);
return tuple;
case "PAY_ING" :
tuple.setKey("放款中");
buttonList.add(buttonBeforeCancel);
tuple.setValue(buttonList);
return tuple;
case "FUND_SUCC" :
if (orderApprove != null && orderApprove.getFundType() != 0) {
// 是存管
tuple.setKey("放款到存管,待提现");
OrderVo.OptButton cancelAfterButton = new OrderVo.OptButton();
cancelAfterButton.setAction(OrderVo.OptButtonAction.cancel_after.name());
cancelAfterButton.setName(OrderVo.OptButtonAction.cancel_after.getDesc());
buttonList.add(cancelAfterButton);
OrderVo.OptButton withdrawSecondButton = new OrderVo.OptButton();
withdrawSecondButton.setAction(OrderVo.OptButtonAction.withdraw_second.name());
withdrawSecondButton.setName(OrderVo.OptButtonAction.withdraw_second.getDesc());
buttonList.add(withdrawSecondButton);
} else {
tuple.setKey("放款成功");
}
tuple.setValue(buttonList);
return tuple;
case "FUND_WITHDRAW_SUCC" :
tuple.setKey("存管提现成功");
tuple.setValue(buttonList);
return tuple;
case "FUND_FAIL" :
tuple.setKey("放款失败");
tuple.setValue(buttonList);
return tuple;
case "ALL_REPAID" :
tuple.setKey("已结清");
tuple.setValue(buttonList);
return tuple;
case "CANCEL_LOAN" :
tuple.setKey("已关单");
tuple.setValue(buttonList);
return tuple;
case "CANCEL_AFTER_LOAN" :
tuple.setKey("存管提现超时或贷后关单");
tuple.setValue(buttonList);
return tuple;
default:
tuple.setKey("未知状态");
tuple.setValue(buttonList);
return tuple;
}
/**
*
* @param kaNoticeType
* @return 状态英文,状态中文
*/
public static Tuple<String, String> KaNoticeTypeNameConvertChnName(String kaNoticeType, OrderApprove orderApprove) {
if (StringUtils.isNotEmpty(kaNoticeType)) {
switch (kaNoticeType) {
case "CREDIT_SUCC" :
// 授信成功 需要 审批
return new Tuple("CREDIT_SUCC", "授信成功");
case "APPROVE_ING" :
if (orderApprove == null) {
return new Tuple("APPROVE_ING", "授信成功");
} else {
return new Tuple("APPROVE_ING", "审批中");
}
case "REJECT" :
return new Tuple(kaNoticeType, "审批拒绝");
case "FUAD_ASSIFN_SUCC" :
return new Tuple(kaNoticeType, "审批通过");
case "WITHDRAW" :
// 提现申请成功 需要放款
return new Tuple(kaNoticeType, "申请提现成功");
case "PAY_ING" :
return new Tuple("PAY_ING", "放款中");
case "FUND_WAITING_WITHDRAW" :
return new Tuple("FUND_WAITING_WITHDRAW", "放款到存管账户,待二次提现");
case "FUND_SUCC" :
if (orderApprove != null && orderApprove.getFundType() != 0) {
// 是存管
return new Tuple(kaNoticeType, "放款到存管");
} else {
return new Tuple(kaNoticeType, "放款成功");
}
case "FUND_WITHDRAW_SUCC" :
return new Tuple(kaNoticeType, "存管提现成功");
case "FUND_FAIL" :
return new Tuple(kaNoticeType, "放款失败");
case "ALL_REPAID" :
return new Tuple(kaNoticeType, "已结清");
case "CANCEL_LOAN" :
return new Tuple(kaNoticeType, "已关单");
case "CANCEL_AFTER_LOAN" :
return new Tuple(kaNoticeType, "存管提现超时或贷后关单");
default:
return new Tuple(kaNoticeType, "未知状态");
}
}
return new Tuple(kaNoticeType, "未知状态");
}
} else {
tuple.setKey("未知状态");
tuple.setValue(buttonList);
return tuple;
public static List<OptHistoryLog> convertApplyRequestHistoryList2OptHistoryLogList(List<ApplyRequestHistory> applyRequestHistoryList, ClfOrderMapping orderMapping) {
List<OptHistoryLog> optHistoryLogs = new ArrayList<>();
for (ApplyRequestHistory applyRequestHistory : applyRequestHistoryList) {
OptHistoryLog optHistoryLog = new OptHistoryLog();
optHistoryLog.setId(0L);
optHistoryLog.setChannelOrderNumber(applyRequestHistory.getChannelOrderNo());
optHistoryLog.setCreditNumber(orderMapping.getApplyNo());
optHistoryLog.setLoanId(orderMapping.getLoanId());
optHistoryLog.setChannelId(applyRequestHistory.getChannelId());
optHistoryLog.setOptName(applyRequestHistory.getApplyType().getDesc());
optHistoryLog.setOptUser("用户发起:".concat(applyRequestHistory.getUserName()));
optHistoryLog.setOptLogDetail(applyRequestHistory.getDescriptionDetail());
optHistoryLog.setExtData(applyRequestHistory.getExtData());
optHistoryLog.setOptResult(applyRequestHistory.getIsSuccess());
optHistoryLog.setCreateTime(applyRequestHistory.getCreatedAt());
optHistoryLogs.add(optHistoryLog);
}
return optHistoryLogs;
}
public static List<OptHistoryLog> convertWithdrawRecordList2UserOptHistoryLogList(List<WithdrawRecord> withdrawRecordList) {
if (CollectionUtils.isEmpty(withdrawRecordList)) {
return null;
}
List<OptHistoryLog> optHistoryLogList = new ArrayList<>();
for (WithdrawRecord withdrawRecord : withdrawRecordList) {
OptHistoryLog optHistoryLog = new OptHistoryLog();
optHistoryLog.setChannelOrderNumber(withdrawRecord.getChannelOrderNo());
optHistoryLog.setChannelId(withdrawRecord.getChannelId());
optHistoryLog.setOptName("api提现操作");
optHistoryLog.setOptUser("");
optHistoryLog.setOptLogDetail(withdrawRecord.getDescriptionDetail());
optHistoryLog.setExtData("");
optHistoryLog.setOptResult(withdrawRecord.getIsSuccess());
optHistoryLog.setCreateTime(withdrawRecord.getCreatedAt());
optHistoryLogList.add(optHistoryLog);
}
tuple.setKey("未知状态");
tuple.setValue(buttonList);
return tuple;
return optHistoryLogList;
}
}
package cn.quantgroup.cashloanflowboss.api.user.model;
import cn.quantgroup.cashloanflowboss.api.log.model.Principal;
import cn.quantgroup.cashloanflowboss.api.login.model.Principal;
import cn.quantgroup.cashloanflowboss.api.role.entity.Role;
import cn.quantgroup.cashloanflowboss.core.asserts.Assert;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
......@@ -30,7 +30,7 @@ public class UserDetailInfo {
}
@Data
static class UserInfo {
public static class UserInfo {
private Long userId;
private String userName;
}
......
package cn.quantgroup.cashloanflowboss.api.user.service;
import cn.quantgroup.cashloanflowboss.api.log.model.Principal;
import cn.quantgroup.cashloanflowboss.api.login.model.Principal;
import cn.quantgroup.cashloanflowboss.api.user.dictionary.UserStatus;
import cn.quantgroup.cashloanflowboss.api.user.entity.User;
import cn.quantgroup.cashloanflowboss.api.user.model.UserDetailInfo;
......
package cn.quantgroup.cashloanflowboss.core;
import cn.quantgroup.cashloanflowboss.api.log.model.Principal;
import cn.quantgroup.cashloanflowboss.api.login.model.Principal;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationDictionary;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
......@@ -28,6 +29,7 @@ public class Application implements ApplicationContextAware, ServletContextAware
private static ServletContext servletContext;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
......@@ -73,6 +75,15 @@ public class Application implements ApplicationContextAware, ServletContextAware
return Application.getValue("${server.port}");
}
/**
* 是否是测试环境
*
* @return
*/
public static Boolean isDebug() {
return "true".equals(Application.getValue("${debug.model}"));
}
/**
* 获取配置属性值
*
......
......@@ -2,7 +2,7 @@ package cn.quantgroup.cashloanflowboss.core.aspect;
import cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfVo;
import cn.quantgroup.cashloanflowboss.api.channel.util.ChannelConfUtil;
import cn.quantgroup.cashloanflowboss.api.log.model.Principal;
import cn.quantgroup.cashloanflowboss.api.login.model.Principal;
import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.annotation.ChannelIdInit;
import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRole;
......
package cn.quantgroup.cashloanflowboss.core.base;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import java.util.Iterator;
import java.util.List;
/**
* function:
* date: 2019/8/6
*
* @author: suntao
*/
public class BossPageImpl<T> implements Page {
@Override
public int getTotalPages() {
return 0;
}
@Override
public long getTotalElements() {
return 0;
}
@Override
public Page map(Converter converter) {
return null;
}
@Override
public int getNumber() {
return 0;
}
@Override
public int getSize() {
return 0;
}
@Override
public int getNumberOfElements() {
return 0;
}
@Override
public List getContent() {
return null;
}
@Override
public boolean hasContent() {
return false;
}
@Override
public Sort getSort() {
return null;
}
@Override
public boolean isFirst() {
return false;
}
@Override
public boolean isLast() {
return false;
}
@Override
public boolean hasNext() {
return false;
}
@Override
public boolean hasPrevious() {
return false;
}
@Override
public Pageable nextPageable() {
return null;
}
@Override
public Pageable previousPageable() {
return null;
}
@Override
public Iterator iterator() {
return null;
}
}
package cn.quantgroup.cashloanflowboss.core.configuration;
import cn.quantgroup.cashloanflowboss.api.log.model.Principal;
import cn.quantgroup.cashloanflowboss.api.login.model.Principal;
import cn.quantgroup.cashloanflowboss.api.role.entity.Role;
import cn.quantgroup.cashloanflowboss.component.security.Authority;
import cn.quantgroup.cashloanflowboss.component.security.SecurityHandler;
......
......@@ -11,9 +11,9 @@ import lombok.Getter;
@Getter
public enum ApplicationStatus implements Status<ApplicationStatus> {
SUCCESS(200000, "Service request processing successful"),
SUCCESS(200000, "请求处理成功"),
FAILURE(500000, "Service request processing failure"),
FAILURE(500000, "请求处理失败"),
INTERNAL_SERVICE_ERROR(500001, "内部服务错误"),
......
package cn.quantgroup.cashloanflowboss.spi.clf.entity;
import cn.quantgroup.cashloanflowboss.spi.clf.model.ApplyRequestApplyTypeEnum;
import lombok.Data;
import lombok.Getter;
import javax.persistence.*;
import java.sql.Timestamp;
/**
* Created with suntao on 2018/5/24
*/
@Data
@Entity
@Table(name = "apply_request_history", catalog = "cash_loan_flow")
public class ApplyRequestHistory {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "request_id")
private String requestId;
@Column(name = "phone_no")
private String phoneNo;
@Column(name = "user_id")
private Long userId;
@Column(name = "user_name")
private String userName;
@Column(name = "uuid")
private String uuid;
@Column(name = "id_no")
private String idNo;
@Column(name = "channel_id")
private Long channelId;
@Column(name = "product_id")
private String productId;
@Column(name = "is_success")
private Boolean isSuccess;
@Column(name = "description_value")
private String descriptionValue;
@Column(name = "description_detail")
private String descriptionDetail;
@Column(name = "id_type")
private int idType = 0;
@Column(name = "apply_type")
private ApplyRequestApplyTypeEnum applyType;
@Column(name = "request_type")
private int requestType;
@Column(name = "md5")
private String md5;
@Column(name = "channel_order_no")
private String channelOrderNo;
@Column(name = "order_mapping_id")
private Long orderMappingId;
@Column(name = "ext_data")
private String extData;
@Column(name = "created_at")
private Timestamp createdAt = new Timestamp(System.currentTimeMillis());
public enum ApplyRequestTypeEnum {
IN,
FAIL,
SUCC
}
@Getter
public enum DescriptionValueEnum {
phone_idNo_mismatching("0002"),// 手机号 对应身份证与库存不匹配
credit_30_day_refuse("1003"),// 30/35天内被拒绝过
has_credit_apply("0004"),//, msg:"已有授信订单"
crediting("0006"),//, msg:"授信处理中"
approving("0007"),//, msg:"系统审核中"
account_exsit("0008");//, msg:"已有额度"
private String value;
private DescriptionValueEnum(String value) {
this.value = value;
}
}
}
package cn.quantgroup.cashloanflowboss.spi.clf.entity;
import cn.quantgroup.cashloanflowboss.spi.clf.model.CallbackRouter;
import cn.quantgroup.cashloanflowboss.spi.clf.model.KANoticeType;
import cn.quantgroup.cashloanflowboss.spi.clf.model.LoanProgress;
import lombok.Data;
import javax.persistence.*;
import java.sql.Timestamp;
/**
* @author zhangbin
* @date 2018/4/10.
*/
@Data
@Entity
@Table(name = "callback_fail_record",catalog = "cash_loan_flow")
public class CallbackFailRecord {
private static final long serialVersionUID = -1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "apply_no")
private String applyNo;
@Column(name = "loan_id")
private Long loanId;
@Column(name = "progress")
private LoanProgress progress;
@Column(name = "term_no")
private Long termNo;
@Column(name = "notice_type")
private KANoticeType noticeType;
@Column(name = "callback_status")
private Integer callbackStatus;
@Column(name = "channel_id")
private Long channelId;
@Column(name = "retry_times")
private Integer retryTimes;
@Column(name = "fail_code")
private Integer failCode;
@Column(name = "loan_type")
private CallbackRouter callbackRouter;
/**
* 默认有效
*/
@Column(name = "is_active")
private Boolean isActive = Boolean.TRUE;
/**
* mq 数据不能保存在fail 表字段中的数据,每个渠道结构不一样,每种mq-notifyType 不一样
*/
@Column(name = "exdata")
private String exdata;
@Column(name = "created_at")
private Timestamp createdAt = new Timestamp(System.currentTimeMillis());
@Column(name = "updated_at")
private Timestamp updatedAt = new Timestamp(System.currentTimeMillis());
}
package cn.quantgroup.cashloanflowboss.spi.clf.entity;
import cn.quantgroup.cashloanflowboss.spi.clf.model.KANoticeType;
import lombok.Data;
import javax.persistence.*;
import java.sql.Timestamp;
import java.time.Instant;
/**
* @author zhangbin
* @date 2018/4/10.
*/
@Data
@Entity
@Table(name = "callback_record", catalog = "cash_loan_flow")
public class CallbackRecord {
private static final long serialVersionUID = -1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 量化派授信订单号,申请订单号
*/
@Column(name = "apply_no")
private String applyNo;
/**
* xyqb.loan_application_history.id
*/
@Column(name = "loan_id")
private Long loanId;
/**
* 还款计划期数
*/
@Column(name = "term_no")
private Long termNo;
/**
* 渠道订单标识
*/
@Column(name = "channel_id")
private Long channelId;
/**
* 映射成渠道推送状态
*/
@Column(name = "callback_status")
private Integer callbackStatus;
/**
* 事件
*/
@Column(name = "notice_type")
private KANoticeType noticeType;
/**
* 成功次数
*/
@Column(name = "success_times")
private Long successTimes;
@Column(name = "is_active")
private Boolean isActive;
@Column(name = "created_at")
private Timestamp createdAt = Timestamp.from(Instant.now());
@Column(name = "updated_at")
private Timestamp updatedAt = Timestamp.from(Instant.now());
}
package cn.quantgroup.cashloanflowboss.spi.clf.entity;
import lombok.Data;
import javax.persistence.*;
import java.sql.Timestamp;
/**
* Created with suntao on 2018/5/24
*/
@Data
@Entity
@Table(name = "withdraw_record", catalog = "cash_loan_flow")
public class WithdrawRecord {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "request_id")
private String requestId;
@Column(name = "user_id")
private Long userId;
@Column(name = "channel_id")
private Long channelId;
@Column(name = "channel_order_no")
private String channelOrderNo;
@Column(name = "is_success")
private Boolean isSuccess;
@Column(name = "description_value")
private String descriptionValue;
@Column(name = "description_detail")
private String descriptionDetail;
@Column(name = "param_info")
private String paramInfo;
@Column(name = "ext_data")
private String extData;
@Column(name = "created_at")
private Timestamp createdAt = new Timestamp(System.currentTimeMillis());
}
package cn.quantgroup.cashloanflowboss.spi.clf.model;
/**
* function:
* date: 2019/9/4
*
* @author: suntao
*/
public enum ApplyRequestApplyTypeEnum {
APPLY_PRETRIAL("预审"),
APPLY("进件"),
ADD_INFO("补充信息"),
BIND_CARD("绑卡"),
WITHDRAW("绑卡提现");
private ApplyRequestApplyTypeEnum(String desc) {
this.desc = desc;
}
private String desc;
public String getDesc() {
return this.desc;
}
public ApplyRequestApplyTypeEnum getByOrdinal(int ordinal) {
return ApplyRequestApplyTypeEnum.values()[ordinal];
}
}
package cn.quantgroup.cashloanflowboss.spi.clf.model;
import lombok.Data;
import java.util.Date;
/**
* @author zhangbin
* @date 2018/4/10.
*/
@Data
public class CallbackRecordVoModel {
private static final long serialVersionUID = -1L;
private Long id;
private String channelOrderNo;
private String applyNo;
private Long loanId;
private LoanProgress progress;
private Long termNo;
private KANoticeType noticeType;
private Integer callbackStatus;
private Long channelId;
private Integer retryTimes;
private Integer failCode;
private CallbackRouter callbackRouter;
/**
* 默认有效
*/
private Boolean isActive = Boolean.TRUE;
/**
* mq 数据不能保存在fail 表字段中的数据,每个渠道结构不一样,每种mq-notifyType 不一样
*/
private String exdata;
private Date createdAt;
private Date updatedAt;
private String tableName;
}
......@@ -14,9 +14,8 @@ public enum LoanProgress {
*/
USERINFO_INCOMPLETE("用户未填写个人信息"),//0
USER_INFORMATION_INCOMPLETE("用户未填写贷款信息"),//1
USER_AUTHENTICATION_INCOMPLETE("用户授权信息未全部完成"),//2
USER_AUTHENTICATION_COMPLETE("授权状态完成"),//3
USER_AUTHENTICATION_COMPLETE("授权信息完成"),//3
FURTHER_INFORMATION_INCOMPLETE("用户补充资料未完成"),//4
PRE_SCREENING("初审中"),//5
PRE_SCREENING_REJECT("初审拒绝"),//6
......@@ -33,10 +32,11 @@ public enum LoanProgress {
FILTERED_BY_BLACKLIST("黑名单过滤"),//17
FINAL_SCREENING_PASSED("后台终审通过"),//18
FILTERING_DECLINED("未通过初筛"),//19
WAITING_FUND("等待资金方放款"),// 20
FINAL_SEND_TO_MASHANG_BEFORE_APPROVAL("已发送给马上金融, 等待放款"),//21, 发邮件后更新使用
FINAL_MASHANG_APPROVAL_SUCCESS("马上金融放款成功"),//22
FINAL_FUNDED_APPROVAL_FAIL("马上金融放款失败"),//23,
/* 资金方相关 */
WAITING_FUND("等待马上金融放款"),// 20
FINAL_SENDED_TO_FUNDING_CORP("已发送给马上金融, 等待放款"),//21
FINAL_FUNDED_APPROVAL_SUCCESS("马上金融放款成功"),//22
FINAL_FUNDED_APPROVAL_FAIL("马上金融放款失败"),//23
ADDRESS_COMPLETE("地址填写完毕,去绑卡"), // 24
BEIYIN_USERINFO_INCOMPLETE("北银消费-用户未填写个人信息"),//25
......@@ -55,55 +55,48 @@ public enum LoanProgress {
BAITIAO_BIND_CARD("白条-绑卡"),//37
BAITIAO_BIND_CARD_ING("白条-绑卡中"),//38
BAITIAO_ACTIVATE_SUCC("白条-激活成功"),//39
/**
* 修改时间 20160104 资金方解耦
*/
// category 4x
/* 易联校验/代收订单 异步通知重构 */
BIND_BANKCARD_IN_PROGRESS("绑卡处理中"),//40
/*REPAY_ORDER_IN_PROGRESS("还款处理中")*/
USER_RELATION_INCOMPLETE("与用户相关联系人信息未完成"),//41,
PLACE_HOLDER_42("占位"),PLACE_HOLDER_43("占位"),PLACE_HOLDER_44("占位"),
PLACE_HOLDER_45("占位"),PLACE_HOLDER_46("占位"),PING_AN_PAGE("跳转平安填写信息页面"),// 47
DROP_SUCC("取消借款"),//48
SUBMITED_TO_FUND_CORP_PRE_ASSIGN("提交资金方预审"), // 40
USER_RELATION_INCOMPLETE("与用户相关联系人信息未完成"),//41
FUND_ERROR("资金方事故,多次放款,汇聚到1渠道去还款"), //42
XIAOYING_BIND_CARD("小赢需要绑卡一下"), // 43
XIAOYING_VERIFY_CARD("小赢需要验证卡"), // 44
XIAOYING_BIND_CARD_POLL_RECHARGE_RESULT("小赢绑卡轮询结果"), // 45
// 46
BUY_ACCELERATE_CARD("需购买加速卡"), PING_AN_PAGE("跳转平安填写信息页面"), DROP_SUCC("取消借款"),//48
PLACE_HOLDER_49("占位"),
// category 5x
PLACE_HOLDER_50("占位"),PLACE_HOLDER_51("占位"),PLACE_HOLDER_52("占位"),PLACE_HOLDER_53("占位"),PLACE_HOLDER_54("占位"),
PLACE_HOLDER_55("占位"),PLACE_HOLDER_56("占位"),PLACE_HOLDER_57("占位"),PLACE_HOLDER_58("占位"),PLACE_HOLDER_59("占位"),
START_ORDER("发起提现,等待二次风控审核"), PLACE_HOLDER_51("占位"), SPEED_EXIST("极速APP存在订单"), PLACE_HOLDER_53("占位"), PLACE_HOLDER_54("占位"),
PLACE_HOLDER_55("占位"), PLACE_HOLDER_56("占位"), PLACE_HOLDER_57("占位"), PLACE_HOLDER_58("占位"), PLACE_HOLDER_59("占位"),
// category 6x
PLACE_HOLDER_60("占位"),PLACE_HOLDER_61("占位"),PLACE_HOLDER_62("占位"),PLACE_HOLDER_63("占位"),PLACE_HOLDER_64("占位"),
WAITING_WITHDRAW("待存管提现"),// 65
PLACE_HOLDER_66("占位"),PLACE_HOLDER_67("占位"),PLACE_HOLDER_68("占位"),PLACE_HOLDER_69("占位"),
WAITING_USE("等待提现"), WAITING_USE_2("等待提现,直接跳转到提现页"), WAITING_USE_BY_SPEED("极速APP提现页面"), PLACE_HOLDER_63("占位"), PLACE_HOLDER_64("占位"),
WAITING_WITHDRAW("等待二次(存管)提现"), PLACE_HOLDER_66("占位"), PLACE_HOLDER_67("占位"), PLACE_HOLDER_68("占位"), PLACE_HOLDER_69("占位"),
// category 7x
PLACE_HOLDER_70("占位"),PLACE_HOLDER_71("占位"),PLACE_HOLDER_72("占位"),PLACE_HOLDER_73("占位"),PLACE_HOLDER_74("占位"),
PLACE_HOLDER_75("占位"),PLACE_HOLDER_76("占位"),PLACE_HOLDER_77("占位"),PLACE_HOLDER_78("占位"),PLACE_HOLDER_79("占位"),
PLACE_HOLDER_70("占位"), PLACE_HOLDER_71("占位"), PLACE_HOLDER_72("占位"), PLACE_HOLDER_73("占位"), PLACE_HOLDER_74("占位"),
PLACE_HOLDER_75("占位"), PLACE_HOLDER_76("占位"), PLACE_HOLDER_77("占位"), PLACE_HOLDER_78("占位"), PLACE_HOLDER_79("占位"),
// category 8x
PLACE_HOLDER_80("占位"),PLACE_HOLDER_81("占位"),PLACE_HOLDER_82("占位"),PLACE_HOLDER_83("占位"),PLACE_HOLDER_84("占位"),
PLACE_HOLDER_85("占位"),PLACE_HOLDER_86("占位"),PLACE_HOLDER_87("占位"),PLACE_HOLDER_88("占位"),PLACE_HOLDER_89("占位"),
PLACE_HOLDER_80("占位"), PLACE_HOLDER_81("占位"), PLACE_HOLDER_82("占位"), PLACE_HOLDER_83("占位"), PLACE_HOLDER_84("占位"),
PLACE_HOLDER_85("占位"), PLACE_HOLDER_86("占位"), PLACE_HOLDER_87("占位"), PLACE_HOLDER_88("占位"), PLACE_HOLDER_89("占位"),
// category 9x
PLACE_HOLDER_90("占位"),PLACE_HOLDER_91("占位"),PLACE_HOLDER_92("占位"),PLACE_HOLDER_93("占位"),PLACE_HOLDER_94("占位"),
PLACE_HOLDER_95("占位"),PLACE_HOLDER_96("占位"),PLACE_HOLDER_97("占位"),PLACE_HOLDER_98("占位"),PLACE_HOLDER_99("占位"),
PLACE_HOLDER_90("占位"), PLACE_HOLDER_91("占位"), PLACE_HOLDER_92("占位"), PLACE_HOLDER_93("占位"), PLACE_HOLDER_94("占位"),
PLACE_HOLDER_95("占位"), PLACE_HOLDER_96("占位"), PLACE_HOLDER_97("占位"), PLACE_HOLDER_98("占位"), PLACE_HOLDER_99("占位"),
/**
* 资金方相关
*/
// 等待资金方放款 : 100
WAITING_MASHANG_FUND("等待马上金融放款"),// 100, 发邮件前查询使用
// 已提交给资金方等待放款 : 101
SENDED_TO_FUND_CORP("已提交给资金方"),
// category 10x
PLACE_HOLDER_102("占位"),PLACE_HOLDER_103("占位"),PLACE_HOLDER_104("占位"),PLACE_HOLDER_105("占位"),PLACE_HOLDER_106("占位"),
PLACE_HOLDER_107("占位"),PLACE_HOLDER_108("占位"),PLACE_HOLDER_109("占位"),
PLACE_HOLDER_100("占位"), PLACE_HOLDER_101("占位"), PLACE_HOLDER_102("占位"), PLACE_HOLDER_103("占位"), PLACE_HOLDER_104("占位"),
PLACE_HOLDER_105("占位"), PLACE_HOLDER_106("占位"), PLACE_HOLDER_107("占位"), PLACE_HOLDER_108("占位"), PLACE_HOLDER_109("占位"),
JD_BANDCARD_FAIL("京东绑卡失败")//110 京东绑卡失败状态
;
// category 11x
JD_BANDCARD_FAIL("京东绑卡失败"), PLACE_HOLDER_111("占位"), PLACE_HOLDER_112("占位"), PLACE_HOLDER_113("占位"), PLACE_HOLDER_114("占位"),
PLACE_HOLDER_115("占位"), PLACE_HOLDER_116("占位"), PLACE_HOLDER_117("占位"), PLACE_HOLDER_118("占位"), PLACE_HOLDER_119("占位"),
// cash_loan_flow生成的订单禁止进入xyqb操作状态 12x
REFUSE_JD("拒绝京东订单进入xyqb"), PLACE_HOLDER_121("占位"), PLACE_HOLDER_122("占位"), PLACE_HOLDER_123("占位"), PLACE_HOLDER_124("占位"),
PLACE_HOLDER_125("占位"), PLACE_HOLDER_126("占位"), PLACE_HOLDER_127("占位"), PLACE_HOLDER_128("占位"), PLACE_HOLDER_129("占位");
private String description;
......@@ -126,19 +119,17 @@ public enum LoanProgress {
/**
* 获取审核拒绝状态
* @return
*/
public static Set<LoanProgress> getCheckReject(){
public static Set<LoanProgress> getCheckReject() {
return Sets.newHashSet(LoanProgress.FILTERING_DECLINED, LoanProgress.PRE_SCREENING_REJECT,
LoanProgress.FINAL_SCREENING_REJECT, LoanProgress.FILTERED_BY_BLACKLIST);
}
/**
* 获取推送订单状态
* @return
*/
public static Set<LoanProgress> getFeedBackOrderStatus(){
return Sets.newHashSet(LoanProgress.WAITING_FUND, LoanProgress.FINAL_SEND_TO_MASHANG_BEFORE_APPROVAL,
LoanProgress.FINAL_FUNDED_APPROVAL_FAIL, LoanProgress.CHECK_REPAYMENT_PLAN, LoanProgress.LOAN_COMPLETE);
public static LoanProgress valueOfByOrdinal(int ordinal) {
try {
return LoanProgress.values()[ordinal];
} catch (Exception e) {
return null;
}
}
}
package cn.quantgroup.cashloanflowboss.spi.clf.repository;
import cn.quantgroup.cashloanflowboss.core.persistence.CashLoanFlowDataSource;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ApplyRequestHistory;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
@CashLoanFlowDataSource
@Repository
public interface ApplyRequestHistoryRepository extends PagingAndSortingRepository<ApplyRequestHistory, Long>, JpaSpecificationExecutor<ApplyRequestHistory> {
}
\ No newline at end of file
package cn.quantgroup.cashloanflowboss.spi.clf.repository;
import cn.quantgroup.cashloanflowboss.core.persistence.CashLoanFlowDataSource;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.CallbackFailRecord;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.CallbackRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* function:
* date: 2019/9/3
*
* @author: suntao
*/
@CashLoanFlowDataSource
@Repository
public interface CallbackFailRecordRepository extends JpaRepository<CallbackFailRecord, Long> {
List<CallbackFailRecord> findByApplyNo(String applyNo);
}
package cn.quantgroup.cashloanflowboss.spi.clf.repository;
import cn.quantgroup.cashloanflowboss.core.persistence.CashLoanFlowDataSource;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.CallbackRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* function:
* date: 2019/9/3
*
* @author: suntao
*/
@CashLoanFlowDataSource
@Repository
public interface CallbackRecordRepository extends JpaRepository<CallbackRecord, Long> {
List<CallbackRecord> findByApplyNo(String applyNo);
}
......@@ -3,6 +3,7 @@ package cn.quantgroup.cashloanflowboss.spi.clf.repository;
import cn.quantgroup.cashloanflowboss.core.persistence.CashLoanFlowDataSource;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderCallBack;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
/**
......@@ -14,4 +15,8 @@ import org.springframework.stereotype.Repository;
@CashLoanFlowDataSource
@Repository
public interface ClfOrderCallbackRepository extends JpaRepository<ClfOrderCallBack, Long> {
@Query(value = "select * from order_callback where callback_status = ?1 and registered_from = ?2", nativeQuery = true)
ClfOrderCallBack findByCallbackStatusAndRegisteredFrom(String callbackState, Long channelId);
}
package cn.quantgroup.cashloanflowboss.spi.clf.repository;
import cn.quantgroup.cashloanflowboss.core.persistence.CashLoanFlowDataSource;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.WithdrawRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
/**
* Created with suntao on 2018/6/4
*/
@CashLoanFlowDataSource
public interface WithdrawRecordRepository extends JpaRepository<WithdrawRecord, Long> {
@Query(value = "select * from withdraw_record where channel_order_no=?1 and channel_id=?2", nativeQuery = true)
List<WithdrawRecord> findByChannelOrderNoAndChannelId(String channelOrderNo, Long channelId);
}
......@@ -20,4 +20,6 @@ public interface CLFCenter {
return ;
}
}
}
package cn.quantgroup.cashloanflowboss.spi.clf.service;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderBaseModel;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.*;
import org.springframework.data.domain.Page;
import java.util.List;
/**
* function:
* date: 2019/9/16
*
* @author: suntao
*/
public interface CLFCenterService {
List<CallbackFailRecord> findCallbackFailRecordByApplyNo(String applyNo);
List<CallbackRecord> findCallbackRecordByApplyNo(String applyNo);
ClfOrderMapping findOrderMappingByChannelOrderNo(String channelOrderNumber);
List<WithdrawRecord> findWithdrawRecordList(String channelOrderNumber, Long channelId);
List<ApplyRequestHistory> findApplyRequestHistoryBySpecification(OrderBaseModel orderBaseModel);
Page<ClfChannelConfiguration> findChannelConfigurationByCriteriaQueryPage(Integer pageNumber, Integer pageSize, Long channelId);
ClfChannelConfiguration findChannelConfigurationByChannelId(Long channelId);
void saveChannelConfiguration(ClfChannelConfiguration channelConfiguration);
void saveCallbackConfiguration(ClfCallbackConfiguration clfCallbackConfiguration);
void saveOrderCall(List<ClfOrderCallBack> clfOrderCallBackList);
ClfOrderCallBack findOrderCallBackByByCallbackStatusAndChannelId(String name, Long channelId);
}
package cn.quantgroup.cashloanflowboss.spi.clf.service;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderBaseModel;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.*;
import cn.quantgroup.cashloanflowboss.spi.clf.model.KANoticeType;
import cn.quantgroup.cashloanflowboss.spi.clf.repository.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import javax.persistence.criteria.Predicate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* function:
* date: 2019/9/3
*
* @author: suntao
*/
@Service
public class CLFCenterServiceImpl implements CLFCenterService{
@Autowired
private CallbackFailRecordRepository callbackFailRecordRepository;
@Autowired
private CallbackRecordRepository callbackRecordRepository;
@Autowired
private ClfOrderMappingRepository orderMappingRepository;
@Autowired
private ClfChannelConfigurationRepository clfChannelConfigurationRepository;
@Autowired
private ClfCallbackConfigurationRepository clfCallbackConfigurationRepository;
@Autowired
private ApplyRequestHistoryRepository applyRequestHistoryRepository;
@Autowired
private WithdrawRecordRepository withdrawRecordRepository;
@Autowired
private ClfOrderCallbackRepository clfOrderCallbackRepository;
@Override
public List<CallbackFailRecord> findCallbackFailRecordByApplyNo(String applyNo) {
return callbackFailRecordRepository.findByApplyNo(applyNo);
}
@Override
public List<CallbackRecord> findCallbackRecordByApplyNo(String applyNo) {
return callbackRecordRepository.findByApplyNo(applyNo);
}
@Override
public ClfOrderMapping findOrderMappingByChannelOrderNo(String channelOrderNumber) {
return orderMappingRepository.findByChannelOrderNoLastOne(channelOrderNumber);
}
@Override
public List<WithdrawRecord> findWithdrawRecordList(String channelOrderNumber, Long channelId) {
return withdrawRecordRepository.findByChannelOrderNoAndChannelId(channelOrderNumber, channelId);
}
@Override
public List<ApplyRequestHistory> findApplyRequestHistoryBySpecification(OrderBaseModel orderBaseModel) {
List<ApplyRequestHistory> all = applyRequestHistoryRepository.findAll(((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
// 指定渠道号
if (Objects.nonNull(orderBaseModel.getChannelId())) {
predicates.add(criteriaBuilder.equal(root.get("channelId"), orderBaseModel.getChannelId().longValue()));
}
if (StringUtils.isNotEmpty(orderBaseModel.getChannelOrderNumber())) {
predicates.add(criteriaBuilder.equal(root.get("channelOrderNo"), orderBaseModel.getChannelOrderNumber()));
}
// 设置查询条件
criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])));
// 指定排序
criteriaQuery.orderBy(criteriaBuilder.desc(root.get("id")));
return criteriaQuery.getRestriction();
}));
return all;
}
@Override
public Page<ClfChannelConfiguration> findChannelConfigurationByCriteriaQueryPage(Integer pageNumber, Integer pageSize, Long channelId) {
return clfChannelConfigurationRepository.findAll((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
// 指定渠道号
if (Objects.nonNull(channelId)) {
predicates.add(criteriaBuilder.equal(root.get("registeredFrom"), channelId.longValue()));
}
// 设置查询条件
criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])));
// 指定排序
criteriaQuery.orderBy(criteriaBuilder.desc(root.get("id")));
return criteriaQuery.getRestriction();
}, new PageRequest(pageNumber, pageSize));
}
@Override
public ClfChannelConfiguration findChannelConfigurationByChannelId(Long channelId) {
return clfChannelConfigurationRepository.findByRegisteredFrom(channelId);
}
@Override
public void saveChannelConfiguration(ClfChannelConfiguration channelConfiguration) {
clfChannelConfigurationRepository.save(channelConfiguration);
}
@Override
public void saveCallbackConfiguration(ClfCallbackConfiguration clfCallbackConfiguration) {
clfCallbackConfigurationRepository.save(clfCallbackConfiguration);
}
@Override
public void saveOrderCall(List<ClfOrderCallBack> clfOrderCallBackList) {
clfOrderCallbackRepository.save(clfOrderCallBackList);
}
@Override
public ClfOrderCallBack findOrderCallBackByByCallbackStatusAndChannelId(String kaNoticeName, Long channelId) {
return clfOrderCallbackRepository.findByCallbackStatusAndRegisteredFrom(kaNoticeName, channelId);
}
}
......@@ -24,6 +24,9 @@ public interface ClothoCenter {
@PostMapping(value = "/external/quota/auth_amount_audit/notify", consumes = "application/x-www-form-urlencoded")
String approve(@RequestParam Map approveData);
@PostMapping(value = "/external/quota/order_audit/notify", consumes = "application/x-www-form-urlencoded")
String orderAuditNotify(@RequestParam Map notify);
/**
* 生成放款MQ消息
*
......@@ -68,6 +71,11 @@ public interface ClothoCenter {
return "error1";
}
@Override
public String orderAuditNotify(Map notify) {
return null;
}
@Override
public String generatorLendingMessage(Map data) {
throw new ClothoCenterException();
......
package cn.quantgroup.cashloanflowboss.spi.clotho.service;
import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.spi.clotho.client.ClothoCenter;
import cn.quantgroup.cashloanflowboss.spi.clotho.model.LendingServiceModel;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
* Created by WeiWei on 2019/8/12.
......@@ -20,6 +24,20 @@ public class ClothoCenterService {
@Autowired
private ClothoCenter clothoCenter;
public Boolean orderAuditNotify(String uuid, Long loanId, boolean auditResult, int bizType) {
Map notify = new HashMap();
notify.put("code", 0);
notify.put("msg", "success");
notify.put("bizChannel", 1);
notify.put("uuid", uuid);
notify.put("bizNo", loanId);
notify.put("bizType", bizType);
notify.put("auditResult", auditResult);
return "success".equals(clothoCenter.orderAuditNotify(notify));
}
/**
* 生成放款MQ消息
*
......@@ -36,16 +54,48 @@ public class ClothoCenterService {
*/
public boolean lending(Integer fundId, BigDecimal amountLimit, Integer pepoleLimit) {
// TODO WEIWEI 根据返回的数据结构补充判断逻辑
if (Application.isDebug()) {
String data = this.clothoCenter.lending(new HashMap(4) {{
put("fundingCorpId", fundId);
put("amountLimit", amountLimit);
put("peopleLimit", pepoleLimit);
}});
return "success".equals(data);
} else {
return false;
}
}
String data = this.clothoCenter.lending(new HashMap() {{
put("fundingCorpId", fundId);
put("amountLimit", amountLimit);
put("peopleLimit", pepoleLimit);
}});
/**
* 审批
* @param approveData
* @return
*/
public String approve(Map<String, Object> approveData) {
if (Application.isDebug()) {
return clothoCenter.approve(approveData);
} else {
return "error";
}
}
public String cancelPreLoan(Map<Object, Object> data) {
if (Application.isDebug()) {
return clothoCenter.cancelPreLoan(data);
} else {
return "error";
}
}
return false;
public String cancelAfterLoan(Map<Object, Object> data) {
if (Application.isDebug()) {
return clothoCenter.cancelAfterLoan(data);
} else {
return "error";
}
}
}
......@@ -8,15 +8,17 @@ import org.springframework.web.bind.annotation.RequestParam;
@Component
@FeignClient(name = "JolyneServiceCenter", url = "http://192.168.4.156:9001/executeSQL/{{NAMESPACE}}", fallback = JolyneCenter.Fallback.class)
public interface JolyneCenter {
@PostMapping(value = "/xyqb", consumes = "application/json")
String cancel(@RequestParam("json") String cancelData);
@Component
class Fallback implements JolyneCenter {
@Override
public String cancel(String cancelData) {
return null;
@PostMapping(value = "/xyqb", consumes = "application/json")
String sqlXyqb(@RequestParam("json") String cancelData);
@Component
class Fallback implements JolyneCenter {
@Override
public String sqlXyqb(String cancelData) {
return null;
}
}
}
}
package cn.quantgroup.cashloanflowboss.spi.jolyne;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import com.google.common.collect.Maps;
import java.util.List;
import java.util.concurrent.ConcurrentMap;
/**
* function:
* date: 2019/9/12
*
* @author: suntao
*/
public class JolyneUtil {
public static String getJolneSql(List<String> slqList) {
ConcurrentMap<String, Object> data = Maps.newConcurrentMap();
data.put("sql", slqList);
return JSONTools.serialize(data);
}
}
package cn.quantgroup.cashloanflowboss.spi.paycenter.client;
import cn.quantgroup.cashloanflowboss.spi.xyqb.client.XYQBCenter;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
/**
* function:
* date: 2019/9/2
*
* @author: suntao
*/
//@Component
//@FeignClient(name = "PayCenter", url = "${api.https}", fallback = XYQBCenter.Fallback.class)
public class PayCenter {
}
package cn.quantgroup.cashloanflowboss.spi.paycenter.service;
import org.springframework.stereotype.Service;
/**
* function:
* date: 2019/9/2
*
* @author: suntao
*/
@Service
public class PayCenterService {
}
package cn.quantgroup.cashloanflowboss.spi.user.service;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderVo;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.jolyne.JolyneCenter;
import cn.quantgroup.cashloanflowboss.spi.user.repository.UserDetailRepository;
import cn.quantgroup.cashloanflowboss.spi.user.repository.UserExtInfoRepository;
......@@ -19,7 +17,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import java.util.concurrent.ConcurrentMap;
import lombok.extern.log4j.Log4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -181,7 +179,7 @@ public class XyqbUserServiceImpl implements XyqbUserService {
cancel_list.add("delete from apply_quota_record where user_id="+userId);
cancel_list.add("delete from user_operation_history where user_id="+userId);
data.put("sql",cancel_list);
String cancel_result = jolyneCenter.cancel(JSONTools.serialize(data));
String cancel_result = jolyneCenter.sqlXyqb(JSONTools.serialize(data));
return "success".equals(cancel_result);
}
......
......@@ -26,6 +26,6 @@ public class Contract {
* 状态
*/
@Column(name = "generate_status")
private Integer generate_status;
private Integer generateStatus;
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.entity;
import lombok.Data;
import javax.persistence.*;
import java.math.BigDecimal;
import java.util.Date;
/**
* Created by WeiWei on 2019/8/12.
*/
@Data
@Entity
@Table(name = "waiting_funding_corp_operate_people")
public class FundLending {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
/**
* 借款订单号
*/
@Column(name = "loan_application_history_id")
private String loanId;
/**
* 放款金额
*/
@Column(name = "fund_amount")
private BigDecimal amount;
/**
* 资方ID
*/
@Column(name = "funding_corp_id")
private Integer fundId;
/**
* 进度
*/
@Column(name = "funding_corp_progress")
private Integer progress;
/**
* 创建时间
*/
@Column(name = "created_at")
private Date createTime;
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.entity;
import lombok.Data;
import javax.persistence.*;
import java.util.Date;
/**
* 资产分配记录表
*/
@Data
@Entity
@Table(name = "funding_asset_allocations_programs")
public class FundingAssetAllocationsPrograms {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 资金方ID
*/
@Column(name = "fund_corp_id")
private Long fundCorpId;
/**
* 计划日期
*/
@Column(name = "plan_date")
private Date planDate;
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.entity;
import lombok.Data;
import javax.persistence.*;
/**
* 资产分配记录表
*/
@Data
@Entity
@Table(name = "funding_corp_policy")
public class FundingCorpPolicy {
/**
* 资方id
*/
@Id
@Column(name = "funding_corp_id")
private Long fundingCorpId;
/**
* 是否启用自动分配
*/
@Column(name = "is_auto_assign")
private Boolean isAutoAssign;
/**
* 是否启动自动拉取分配结果
*/
@Column(name = "is_auto_fetch")
private Boolean isAutoFetch;
/**
* 是否启用自动推送放款
*/
@Column(name = "is_auto_loan")
private Boolean isAutoLoan;
/**
* 是否启动自动拉取放款结果
*/
@Column(name = "is_auto_loan_fetch")
private Boolean isAutoLoanFetch;
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.entity;
import cn.quantgroup.cashloanflowboss.spi.clf.model.LoanProgress;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
import java.util.Objects;
/**
* Created by FrankChow on 15/7/8.
* 贷款记录表
*/
@Entity
@Table(name = "loan_application_history")
@Getter
@Setter
@ToString
public class LoanApplicationHistory implements Serializable {
private static final long serialVersionUID = -1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "channel_id")
private Long channelId;
// false表示借款申请是无效的或者已完成
@Column(name = "is_active")
private Boolean isActive = true;
// 贷款进度 默认是02
@Column(name = "progress")
private LoanProgress progress = LoanProgress.USER_AUTHENTICATION_INCOMPLETE;
@Column(name = "bank_card_id")
private Long bankCardId;
// 从哪个渠道注册过来
@Column(name = "created_from")
private Long createdFrom;
@Column(name = "baitiao_merchant_id")
private Long baitiaoMerchantId = -1L;
// 上一次修改时间
@Column(name = "updated_at")
private Timestamp updatedAt;
// 上一次修改时间
@Column(name = "created_at")
private Timestamp createdAt;
@PrePersist
public void prePersist() {
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
createdAt = timestamp;
updatedAt = timestamp;
}
@PreUpdate
public void preUpdate() {
updatedAt = new Timestamp(System.currentTimeMillis());
}
public long parseChannelId() {
return !Objects.equals(createdFrom, -1L) ? this.createdFrom : this.channelId;
}
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.entity;
import cn.quantgroup.cashloanflowboss.spi.xyqb.model.FundingCorpProgress;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Timestamp;
/**
* Created by Miraculous on 16/4/11.
*/
@Entity
@Getter
@Setter
@ToString
@Table(name = "waiting_funding_corp_operate_people")
public class WaitingFundingCorpOperatePeople implements Serializable {
private static final long serialVersionUID = -1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column (name = "loan_application_history_id")
private Long loanApplicationHistoryId;
@Column(name = "channel_id")
private Long channelId;
@Column(name = "fund_amount")
private BigDecimal fundAmount;
@Column(name = "funding_corp_progress")
private FundingCorpProgress fundingCorpProgress = FundingCorpProgress.WAITING_FUNDING_CORP_REVIEW;
@Column(name = "is_enable")
private Boolean isEnable;
@Column(name = "funding_corp_id")
private Long fundingCorpId;
@Column(name = "corp_loan_id")
private String corpLoanId;
@Column(name = "request_id")
private String requestId;
@Column(name = "created_at")
private Timestamp createdAt;
public enum FundStatus{
SUCC("SUCC","放款成功"),
FAIL("FAIL","放款失败"),
HANDING("HANDING","处理中"),
DEPOSITORY_SUCC("DEPOSITORY_SUCC","存管提现成功"),
DEPOSITORY_FAIL("DEPOSITORY_FAIL","存管提现失败"),
DEPOSITORY_HANDING("DEPOSITORY_HANDING","存管提现中");
private String status;
private String desc;
FundStatus(String status, String desc) {
this.status = status;
this.desc = desc;
}
public String getStatus() {
return status;
}
public String getDesc() {
return desc;
}
}
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.model;
/**
* Created by Miraculous on 16/4/11.
*/
public enum FundingCorpProgress {
WAITING_FUNDING_CORP_REVIEW("等待资金方审核"),
FUNDING_CORP_RESPONSE_ERROR("资金方审核通信失败"),
FUNDING_CORP_EMPTY_RESPONSE("资金方审核返回空结果"),
FUNDING_CORP_REVIEW_REJECT("资金方审核失败"),
FUNDING_CORP_AGREE("资金方同意放款"),
FUNDING_CORP_FUNDED("资金方已放款"),
FUNDING_CORP_FUNDED_FAIL("资金方放款失败"),
FUNDING_CORP_REVIEW_ERROR("资金方审核异常"),
FUNDING_CORP_REVIEW_8("888"),
FUNDING_CORP_REVIEW_FETCHING("正在获取资金方放款结果"),//已经使用
IN_LOAN_QUEUE("在放款队列中");//已经使用
String description;
FundingCorpProgress(String descrption) {
this.description = descrption;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("FundingCorpProgress{");
sb.append("description='").append(description).append('\'');
sb.append('}');
return sb.toString();
}
}
\ No newline at end of file
package cn.quantgroup.cashloanflowboss.spi.xyqb.model;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 查询订单状态 model
* Created with suntao on 2018/12/26
*/
@Data
@NoArgsConstructor
public class OrderStatusQueryModel {
/** APPROVE 时 非空,元 */
private String drawTryAmount;
/** APPROVE 时 非空,元 */
private String drawTryTerm;
private ClfOrderMapping orderMapping;
/** 可以为空 */
private QueryType queryType;
public OrderStatusQueryModel(ClfOrderMapping orderMapping) {
this.orderMapping = orderMapping;
}
public enum QueryType {
APPROVE("审批状态查询"),
WITHDRAW("提现状态查询,贷前提现"),
CANCEL_LOAN("取消借款"),
CANCEL_AFTER_LOAN("取消借款,贷后,退款"),
PAY("放款状态查询"),
ALL_REPAID("结清状态查询");
private String desc;
public String getDesc(){
return this.desc;
}
QueryType(String desc) {
this.desc = desc;
}
}
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.model;
import cn.quantgroup.cashloanflowboss.spi.clf.model.KANoticeType;
import lombok.Data;
import java.util.Date;
/**
* Created with suntao on 2018/12/26
*/
@Data
public class OrderStatusQueryResultOnlyStatus {
private String applyNo;
private Long loanId;
private KANoticeType kaNoticeType;
private Date updateTime;
}
......@@ -2,8 +2,9 @@ package cn.quantgroup.cashloanflowboss.spi.xyqb.repository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.Contract;
import cn.quantgroup.cashloanflowboss.spi.xyqb.source.XYQBDataSource;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
/**
......@@ -11,7 +12,7 @@ import org.springframework.stereotype.Repository;
*/
@XYQBDataSource
@Repository
public interface ContractRepository extends CrudRepository<Contract, Long> {
public interface ContractRepository extends JpaRepository<Contract, Long> {
/**
* 更新合同状态
......@@ -20,7 +21,11 @@ public interface ContractRepository extends CrudRepository<Contract, Long> {
* @param status
* @return
*/
@Query("update Contract set generate_status = :status where userId = :userId")
boolean updateContractStatus(Long userId, Integer status);
@Deprecated
@Modifying
@Query(value = "update contract set generate_status = ?2 where user_id = ?1", nativeQuery = true)
int updateContractStatus(Long userId, Integer status);
@Query(value = "select * from contract where user_id = ?1 order by id desc limit 1", nativeQuery = true)
Contract findByUserIdLastOne(Long qgUserId);
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.repository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.FundingAssetAllocationsPrograms;
import cn.quantgroup.cashloanflowboss.spi.xyqb.source.XYQBDataSource;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import java.sql.Timestamp;
import java.util.Date;
/**
* 资产计划开关表
* Created by suntao 20190902
*/
@XYQBDataSource
@Repository
public interface FundingAssetAllocationsProgramsRepository extends CrudRepository<FundingAssetAllocationsPrograms, Integer> {
@Query(value = "select * from funding_asset_allocations_programs where fund_corp_id=?1 and plan_date = ?2 limit 1", nativeQuery = true)
FundingAssetAllocationsPrograms findByFundCorpIdAndPlanDate(Long fundCorpId, String planDate);
}
\ No newline at end of file
package cn.quantgroup.cashloanflowboss.spi.xyqb.repository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.FundingCorpPolicy;
import cn.quantgroup.cashloanflowboss.spi.xyqb.source.XYQBDataSource;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
/**
* 资产计划开关表
* Created by suntao 20190902
*/
@XYQBDataSource
@Repository
public interface FundingCorpPolicyRepository extends CrudRepository<FundingCorpPolicy, Integer> {
FundingCorpPolicy findByFundingCorpId(Long fundingCorpId);
}
\ No newline at end of file
package cn.quantgroup.cashloanflowboss.spi.xyqb.repository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.LoanApplicationHistory;
import cn.quantgroup.cashloanflowboss.spi.xyqb.source.XYQBDataSource;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
/**
* Created by WeiWei on 2019/8/12.
*/
@XYQBDataSource
@Repository
public interface LoanApplicationHistoryRepository extends CrudRepository<LoanApplicationHistory, Integer> {
LoanApplicationHistory findById(Long id);
}
\ No newline at end of file
package cn.quantgroup.cashloanflowboss.spi.xyqb.repository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.FundLending;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.WaitingFundingCorpOperatePeople;
import cn.quantgroup.cashloanflowboss.spi.xyqb.source.XYQBDataSource;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.Map;
/**
......@@ -15,26 +15,18 @@ import java.util.Map;
*/
@XYQBDataSource
@Repository
public interface FundLendingRepository extends CrudRepository<FundLending, Integer> {
public interface WaitingFundingCorpOperatePeopleRepository extends CrudRepository<WaitingFundingCorpOperatePeople, Long>, JpaRepository<WaitingFundingCorpOperatePeople, Long> {
/**
* 更新资方待放款创建时间
*
* @param loanId
* @param time
* @return
*/
@Query("update FundLending set createTime = :createTime where loanId = :loanId")
boolean updateCreateTime(@Param("loanId") Long loanId, @Param("createTime") Date time);
/**
* 查询待放款记录
*
* @param fundId
* @param progress
* @return
*/
@Query("select sum(amount) as totalAmount ,count(fundId) as totalCount from FundLending where progress = :progress and fundId = :fundId")
Map queryLendingRecordCount(Integer fundId, Integer progress);
@Query(value = "select sum(fund_amount) ,count(*) from xyqb.waiting_funding_corp_operate_people where funding_corp_progress=0 and funding_corp_id= ?1", nativeQuery = true)
Map queryLendingRecordCount(Long fundId);
WaitingFundingCorpOperatePeople findByLoanApplicationHistoryId(Long loanId);
}
\ No newline at end of file
package cn.quantgroup.cashloanflowboss.spi.xyqb.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* Created with suntao on 2018/12/26
*/
@Slf4j
@Service
public class OrderStatusQueryService {
//
// @Autowired
// private XyqbService xyqbService;
// @Autowired
// private IRepaymentPlanService repaymentPlanService;
// @Autowired
// private ILoanApplicationManifestHistoryService loanApplicationManifestHistoryService;
// @Autowired
// private IRepaymentPlanService xyqbRepaymentPlanService;
//
//
// /**
// * 只查询订单状态,不查询每个状态对应的数据,推荐使用
// * @param queryModel
// * @return
// */
// public OrderStatusQueryResultOnlyStatus queryOrderStatusKaNoticeType(OrderStatusQueryModel queryModel) {
// LoanOrderMapping orderMapping = queryModel.getOrderMapping();
// if (orderMapping == null) {
// log.info("[orderStatusQueryServiceImpl_queryOrderStatusKaNoticeType]参数异常,orderMapping空");
// return null;
// }
// final Long channelId = orderMapping.getRegisteredFrom();
// final String channelOrderNo = orderMapping.getChannelOrderNo();
// final String channelPaymentNo = orderMapping.getChannelPaymentNo();
// final String applyNo = orderMapping.getApplyNo();
// final Long loanId = orderMapping.getLoanId();
// final OrderStatusQueryModel.QueryType queryType = queryModel.getQueryType();
//
// if (StringUtils.isEmpty(channelOrderNo) && StringUtils.isEmpty(channelPaymentNo) && StringUtils.isEmpty(applyNo) && loanId == null) {
// log.info("[orderStatusQueryServiceImpl_queryOrderStatusKaNoticeType]参数异常,channelOrderNo={},channelPaymentNo={},applyNo={},loanId={}", channelOrderNo, channelPaymentNo, applyNo, loanId);
// return null;
// }
// if (channelId == null) {
// log.info("[orderStatusQueryServiceImpl_queryOrderStatusKaNoticeType]参数异常,channelId 为空");
// return null;
// }
// OrderStatusQueryResultOnlyStatus queryResult = new OrderStatusQueryResultOnlyStatus();
// if (queryType != null) {
// // 查询条件不为空 按照查询条件查询
// switch (queryType) {
// case APPROVE:
// return loadApproveOnlyStatus(queryResult, orderMapping);
// case WITHDRAW:
// return loadDrawOnlyStatus(queryResult, orderMapping);
// case PAY:
// return loadPayOnlyStatus(queryResult, orderMapping);
// case ALL_REPAID:
// case CANCEL_LOAN:
// case CANCEL_AFTER_LOAN:
// return loadFinalStatusOnlyStatus(queryResult, orderMapping);
// default:
// return queryResult;
// }
// }
//
// OrderStatusQueryResultOnlyStatus loadFinalStatus = loadFinalStatusOnlyStatus(queryResult, orderMapping);
// if (loadFinalStatus == null) {
// // 加载前面的状态
// return loadPayOnlyStatus(queryResult, orderMapping);
// } else {
// return loadFinalStatus;
// }
// }
//
// @Override
// public Boolean finalStatusQuery(String applyNo, Long loanId) {
// LoanOrderMapping orderMapping = new LoanOrderMapping();
// orderMapping.setApplyNo(applyNo);
// orderMapping.setLoanId(loanId);
// final Boolean isFinalStatus = loadFinalStatus(new OrderStatusQueryResult(), orderMapping);
// if (isFinalStatus) {
// // 状态
// log.error("[finalStatusQuery]订单终态查询,结果:终态。applyNo={},loanId={}", applyNo, loanId);
// } else {
// // 非终态
// log.info("[finalStatusQuery]订单终态查询,结果:非终态。applyNo={},loanId={}", applyNo, loanId);
// }
// return isFinalStatus;
// }
//
//
// /**
// * 授信结果查询
// * @param queryModel
// * @return true 授信成功;false:授信失败,null:授信中
// */
// @Override
// public OrderStatusQueryResult.CreditStatus queryCreditStatus(OrderStatusQueryModel queryModel) {
// LoanOrderMapping orderMapping = queryModel.getOrderMapping();
// if (orderMapping == null) {
// log.info("[orderStatusQueryServiceImpl_queryOrderStatus]参数异常,orderMapping空");
// return null;
// }
// final Long channelId = orderMapping.getRegisteredFrom();
// final String channelOrderNo = orderMapping.getChannelOrderNo();
// final String applyNo = orderMapping.getApplyNo();
//
// if (StringUtils.isEmpty(channelOrderNo) && StringUtils.isEmpty(applyNo)) {
// log.info("[orderStatusQueryServiceImpl_queryOrderStatus]参数异常,channelOrderNo={},,applyNo={}", channelOrderNo, applyNo);
// return null;
// }
// if (channelId == null) {
// log.info("[orderStatusQueryServiceImpl_queryOrderStatus]参数异常,channelId 为空");
// return null;
// }
// Optional<QuotaCreditInfo> quotaCreditInfoOptional = xyqbService.queryQuotaCreditInfo(applyNo);
// if (!quotaCreditInfoOptional.isPresent()) {
// return null;
// }
// final QuotaCreditInfo quotaCreditInfo = quotaCreditInfoOptional.get();
// // '0:发起授信;1:授信成功;2:授信失败;3:授信处理中',
// if (1 == quotaCreditInfo.getCreditStatus()) {
// return OrderStatusQueryResult.CreditStatus.SUCCESS;
// } else if (2 == quotaCreditInfo.getCreditStatus()) {
// return OrderStatusQueryResult.CreditStatus.FAIL;
// } else {
// return OrderStatusQueryResult.CreditStatus.PROGRESSING;
// }
// }
//
//
// /**
// * 查询订单状态 并查询每个状态对应的数据 不推荐使用
// * @param queryModel
// * @return
// */
// @Override
// public OrderStatusQueryResult queryOrderStatus(OrderStatusQueryModel queryModel) {
// LoanOrderMapping orderMapping = queryModel.getOrderMapping();
// if (orderMapping == null) {
// log.info("[orderStatusQueryServiceImpl_queryOrderStatus]参数异常,orderMapping空");
// return null;
// }
// final Long channelId = orderMapping.getRegisteredFrom();
// final String channelOrderNo = orderMapping.getChannelOrderNo();
// final String channelPaymentNo = orderMapping.getChannelPaymentNo();
// final String applyNo = orderMapping.getApplyNo();
// final Long loanId = orderMapping.getLoanId();
// final OrderStatusQueryModel.QueryType queryType = queryModel.getQueryType();
//
// if (StringUtils.isEmpty(channelOrderNo) && StringUtils.isEmpty(channelPaymentNo) && StringUtils.isEmpty(applyNo) && loanId == null) {
// log.info("[orderStatusQueryServiceImpl_queryOrderStatus]参数异常,channelOrderNo={},channelPaymentNo={},applyNo={},loanId={}", channelOrderNo, channelPaymentNo, applyNo, loanId);
// return null;
// }
// if (channelId == null) {
// log.info("[orderStatusQueryServiceImpl_queryOrderStatus]参数异常,channelId 为空");
// return null;
// }
// OrderStatusQueryResult queryResult = new OrderStatusQueryResult();
// if (queryType != null) {
// // 查询条件不为空 按照查询条件查询
// switch (queryType) {
// case APPROVE:
// loadApprove(queryResult, orderMapping);
// return queryResult;
// case WITHDRAW:
// loadDraw(queryResult, orderMapping);
// return queryResult;
// case PAY:
// loadPay(queryResult, orderMapping);
// return queryResult;
// case ALL_REPAID:
// case CANCEL_LOAN:
// case CANCEL_AFTER_LOAN:
// loadFinalStatus(queryResult, orderMapping);
// return queryResult;
// default:
// return queryResult;
// }
// }
//
// Boolean loadFinalStatus = loadFinalStatus(queryResult, orderMapping);
// if (!loadFinalStatus) {
// // 说明目前还不是终态
// loadPay(queryResult, orderMapping);
// }
// return queryResult;
// }
//
// /**
// * 审批状态加载
// * @param queryResult
// * @param orderMapping
// * @return true:订单终态,false:订单还可以继续流转
// */
// private Boolean loadApprove(OrderStatusQueryResult queryResult, LoanOrderMapping orderMapping) {
// if(StringUtils.isEmpty(orderMapping.getApplyNo())){
// return false;
// }
// JsonResult jsonResultApprove = exService.queryApproveStatus(orderMapping.getApplyNo());
// queryResult.setApplyNo(orderMapping.getApplyNo());
// queryResult.setCurrentOrderStatus(OrderStatusQueryResult.CurrentOrderStatus.APPROVE);
// // 格式:"2018-04-21 13:54:02"
// String updateAt = String.valueOf(jsonResultApprove.getData());
// Date date = DateUtil.dateStr2Date(updateAt, DateUtil.DATE_FORMAT_1);
//
// if (jsonResultApprove.isSuccess()) {
// Optional<QuotaInfo> quotaInfo = xyqbService.queryQuotaInfo(orderMapping.getQgUserId(), orderMapping.getRegisteredFrom());
// if (!quotaInfo.isPresent()) {
// queryResult.setUpdateTime(date);
// queryResult.setApproveStatus(OrderStatusQueryResult.ApproveStatus.PROGRESSING);
// log.info("[orderStatusQuery][loadApprove]审批状态查询加载,结果:审批状态成功,但是额度查询失败,视为审批中,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return false;
// }
// // 审批通过
// queryResult.setApproveStatus(OrderStatusQueryResult.ApproveStatus.PASS);
// BigDecimal maxAmount = quotaInfo.get().getRule().getMaxAmount();
// int maxTerm = quotaInfo.get().getRule().getMaxAmountAndTerm().getMaxTerm();
// OrderStatusQueryResult.LoanDetail loanDetail = new OrderStatusQueryResult.LoanDetail();
// loanDetail.setApproveAmount(maxAmount);
// loanDetail.setLoanTerm(maxTerm);
// List<QuotaRepaymentPreview> quotaRepaymentPreviews = repaymentPlanService.trialRepaymentPlan(String.valueOf(orderMapping.getQgUserId()), ProductUtil.getProductId(orderMapping.getRegisteredFrom()),
// Constants.DECIMAL_FORMAT2.format(maxAmount), String.valueOf(maxTerm), orderMapping.getApplyNo(), orderMapping.getLoanId());
// loanDetail.setQuotaRepaymentPreview(quotaRepaymentPreviews);
// queryResult.setLoanDetail(loanDetail);
// queryResult.setUpdateTime(DateUtil.dateStr2Date(String.valueOf(jsonResultApprove.getData()), DateUtil.DATE_FORMAT_1));
// log.info("[orderStatusQuery][loadApprove]审批状态查询加载,结果:审批状态成功,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return false;
// } else if (Constants.APPROVE_FUND_ING_B_CODE.getKey().equals(jsonResultApprove.getBusinessCode())) {
// // 待审批
// queryResult.setUpdateTime(date);
// queryResult.setApproveStatus(OrderStatusQueryResult.ApproveStatus.PROGRESSING);
// log.info("[orderStatusQuery][loadApprove]审批状态查询加载,结果:审批状态审批中,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return false;
// } else if (Constants.APPROVE_FUND_FAIL_B_CODE.getKey().equals(jsonResultApprove.getBusinessCode())) {
// // 未通过
// queryResult.setApproveStatus(OrderStatusQueryResult.ApproveStatus.REFUSE);
// queryResult.setUpdateTime(date);
// log.info("[orderStatusQuery][loadApprove]审批状态查询加载,结果:审批未通过,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return true;
// } else if (Constants.LOAN_CANCEL_B_CODE.getKey().equals(jsonResultApprove.getBusinessCode())) {
// // 借款取消
// queryResult.setCurrentOrderStatus(OrderStatusQueryResult.CurrentOrderStatus.CANCEL_LOAN);
// queryResult.setUpdateTime(date);
// queryResult.setApplyNo(orderMapping.getApplyNo());
// log.info("[orderStatusQuery][loadApprove]审批状态查询加载,结果:借款取消,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return true;
// }
// queryResult.setCurrentOrderStatus(OrderStatusQueryResult.CurrentOrderStatus.UNKOWN);
// log.info("[orderStatusQuery][loadApprove]审批状态查询加载,结果:未知,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return false;
// }
//
// /**
// * 加载提现状态,不管当前状态是什么,都需要加载审批状态
// * 方法必须 保证 1、是确定当前状态结束 或者 2、加载前置状态
// * @return true:当前状态结束;false:当前状态加载前置状态
// */
// private void loadDraw(OrderStatusQueryResult queryResult, LoanOrderMapping orderMapping) {
//
// // 先加载审批状态,填充OrderStatusQueryResult.LoanDetail(当状态是提现成功状态,OrderStatusQueryResult.LoanDetail也是有效的)
// // 必须 先加载审批方法,否则状态会覆盖
// loadApprove(queryResult, orderMapping);
//
// final Long loanId = orderMapping.getLoanId();
// if (loanId != null) {
// queryResult.setLoanId(loanId);
// XyqbLoanApplicationManifestHistory manifestHistory = loanApplicationManifestHistoryService.findByLoanApplicationHistoryId(loanId);
// if (manifestHistory != null) {
// // 提现成功状态
// queryResult.setCurrentOrderStatus(OrderStatusQueryResult.CurrentOrderStatus.DRAW);
// queryResult.setDrawStatus(OrderStatusQueryResult.DrawStatus.SUCCESS);
// OrderStatusQueryResult.DrawDetail drawDetail = new OrderStatusQueryResult.DrawDetail();
// drawDetail.setXyqbLoanApplicationManifestHistory(manifestHistory);
// queryResult.setDrawDetail(drawDetail);
// queryResult.setUpdateTime(manifestHistory.getCreatedAt());
// log.info("[orderStatusQuery][loadDraw]加载提现状态,结果:提现状态成功,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// } else {
// log.info("[orderStatusQuery][loadDraw]加载提现状态,结果:提现状态成功,但是借款清单不存在,该状态异常,视为当前状态为审批状态,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// }
// }
// }
//
// /**
// * 方法必须 保证 1、是确定当前状态结束 或者 2、加载前置状态
// * @return true:当前状态结束;false:当前状态加载前置状态
// */
// private Boolean loadPay(OrderStatusQueryResult queryResult, LoanOrderMapping orderMapping) {
//
// final Long loanId = orderMapping.getLoanId();
// if (loanId == null) {
// // loanId=null, 调用 提现状态加载(前置状态)
// log.info("[orderStatusQuery][loadPay]放款状态加载,结果:loanId=null,加载前置状态,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// loadDraw(queryResult, orderMapping);
// return false;
// }
// queryResult.setLoanId(loanId);
// Optional<QueryXyqbFundStatusResponse> queryXyqbFundStatusResponseOptional = xyqbRepaymentPlanService.queryFundStatus(orderMapping.getApplyNo(), loanId);
// if (!queryXyqbFundStatusResponseOptional.isPresent()) {
// log.info("[orderStatusQuery][loadPay]放款状态加载,结果:放款中,加载前置状态(提现状态),applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// loadDraw(queryResult, orderMapping);
// return false;
// }
//
// QueryXyqbFundStatusResponse queryXyqbFundStatusResponse = queryXyqbFundStatusResponseOptional.get();
// FundStatusEnum fundStatusEnum = queryXyqbFundStatusResponse.getStatus();
// // 2018-09-26 08:47:13
// queryResult.setUpdateTime(DateUtil.dateStr2Date(queryXyqbFundStatusResponse.getUpdatedAt(), DateUtil.DATE_FORMAT_1));
//
// if (fundStatusEnum == null) {
// log.info("[orderStatusQuery][loadPay]放款状态加载,结果:放款中,加载前置状态(提现状态),applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// loadDraw(queryResult, orderMapping);
// return false;
// }
// switch (fundStatusEnum) {
// case SUCC:
// queryResult.setCurrentOrderStatus(OrderStatusQueryResult.CurrentOrderStatus.PAY);
// initPayDetail(queryResult, orderMapping);
// return false;
// case DEPOSITORY_SUCC:
// queryResult.setCurrentOrderStatus(OrderStatusQueryResult.CurrentOrderStatus.DEPOSITORY);
// queryResult.setDepositoryStatus(OrderStatusQueryResult.DepositoryStatus.DEPOSITORY_SUCC);
// initPayDetail(queryResult, orderMapping);
// return false;
// case FAIL:
// // 失败
// queryResult.setCurrentOrderStatus(OrderStatusQueryResult.CurrentOrderStatus.PAY);
// queryResult.setPayStatus(OrderStatusQueryResult.PayStatus.FAIL);
// // 结束 当前状态 放款失败
// log.info("[orderStatusQuery][loadPay]放款状态加载,结果:放款失败,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return true;
// case DEPOSITORY_FAIL:
// queryResult.setCurrentOrderStatus(OrderStatusQueryResult.CurrentOrderStatus.DEPOSITORY);
// queryResult.setDepositoryStatus(OrderStatusQueryResult.DepositoryStatus.DEPOSITORY_FAIL);
// initPayDetail(queryResult, orderMapping);
// return true;
// case DEPOSITORY_HANDING:
// // 视为放款成功
// queryResult.setCurrentOrderStatus(OrderStatusQueryResult.CurrentOrderStatus.PAY);
// queryResult.setPayStatus(OrderStatusQueryResult.PayStatus.SUCCESS);
// initPayDetail(queryResult, orderMapping);
// return false;
// case HANDING:
// queryResult.setCurrentOrderStatus(OrderStatusQueryResult.CurrentOrderStatus.PAY);
// queryResult.setPayStatus(OrderStatusQueryResult.PayStatus.PROGRESSING);
// // 待放款 调用 提现状态加载(前置状态)
// log.info("[orderStatusQuery][loadPay]放款状态加载,结果:放款中,加载前置状态(提现状态),applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// // 不能去查还款计划预览,xyqb报错
// //loadDraw(queryResult, orderMapping);
// return false;
// default:
// queryResult.setCurrentOrderStatus(OrderStatusQueryResult.CurrentOrderStatus.PAY);
// queryResult.setPayStatus(OrderStatusQueryResult.PayStatus.PROGRESSING);
// // 待放款 调用 提现状态加载(前置状态)
// log.info("[orderStatusQuery][loadPay]放款状态加载,结果:放款中,加载前置状态(提现状态),applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// //loadDraw(queryResult, orderMapping);
// return false;
// }
//
// }
//
// private void initPayDetail(OrderStatusQueryResult queryResult, LoanOrderMapping orderMapping) {
//
// XyqbLoanApplicationManifestHistory manifestHistory = loanApplicationManifestHistoryService.findByLoanApplicationHistoryId(orderMapping.getLoanId());
// if (manifestHistory != null) {
// queryResult.setPayStatus(OrderStatusQueryResult.PayStatus.SUCCESS);
//
// OrderStatusQueryResult.PayDetail payDetail = new OrderStatusQueryResult.PayDetail();
// payDetail.setPayAmount(manifestHistory.getContractLoanAmount());
// payDetail.setTerm(manifestHistory.getContractTerm());
// payDetail.setRepayAmount(manifestHistory.getTotalRepaymentAmount());
// payDetail.setMouthlyAmount(manifestHistory.getMonthlyRepayment());
// payDetail.setYearRate(manifestHistory.getAnnualInterestRate());
// payDetail.setMouthlyRate(manifestHistory.getMonthlyInterestRate());
//
// Optional<DepositoryBusiness> depositoryBusinessOptional = xyqbService.queryDepositoryBusiness(orderMapping.getApplyNo(), orderMapping.getLoanId());
// if (depositoryBusinessOptional.isPresent()) {
// Boolean withdrawType = depositoryBusinessOptional.get().getWithdrawType();
// payDetail.setIsDepository(withdrawType == null ? false : withdrawType);
// } else {
// payDetail.setIsDepository(false);
// }
// queryResult.setPayDetail(payDetail);
// queryResult.setRepaymentPlanViews(repaymentPlanService.queryRepaymentPlanFromXyqb(manifestHistory.getLoanApplicationHistoryId()));
//
// // 结束 当前状态 放款成功
// log.info("[orderStatusQuery][loadPay]放款状态加载,结果:放款成功,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// } else {
// queryResult.setPayStatus(OrderStatusQueryResult.PayStatus.PROGRESSING);
// // 数据有误,试做前置状态对待,待放款 调用 提现状态加载(前置状态)
// log.info("[orderStatusQuery][loadPay]放款状态加载,已经查出是放款成功,但是借款清单无记录,数据异常,加载前置状态(提现状态),applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// loadDraw(queryResult, orderMapping);
// }
// }
//
// /**
// * @return true:订单终态,false:订单还可以继续流转
// */
// private Boolean loadFinalStatus(OrderStatusQueryResult queryResult, LoanOrderMapping orderMapping) {
// FinalStatusResponse finalStatusResponse = xyqbService.queryFinalStatus(orderMapping.getApplyNo(), orderMapping.getLoanId());
// if (finalStatusResponse != null) {
// if (FinalStatusEnum.LOAN_COMPLETE.equals(finalStatusResponse.getStatus())) {
// // 结清终态
// queryResult.setCurrentOrderStatus(OrderStatusQueryResult.CurrentOrderStatus.ALL_REPAID);
// queryResult.setUpdateTime(finalStatusResponse.getUpdatedAt());
// queryResult.setApplyNo(orderMapping.getApplyNo());
// log.info("[orderStatusQuery][loadFinalStatus]订单终态查询,结果:终态结清,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return true;
// } else if (finalStatusResponse.getStatus().isCancelLoan()) {
// // 借款取消
// queryResult.setCurrentOrderStatus(OrderStatusQueryResult.CurrentOrderStatus.CANCEL_LOAN);
// queryResult.setUpdateTime(finalStatusResponse.getUpdatedAt());
// queryResult.setApplyNo(orderMapping.getApplyNo());
// log.info("[orderStatusQuery][loadFinalStatus]订单终态查询,结果:终态取消,status={},applyNo={},loanId={}", finalStatusResponse.getStatus().name(), orderMapping.getApplyNo(), orderMapping.getLoanId());
// return true;
// } else if (FinalStatusEnum.CANCEL_AFTER_LOAN.equals(finalStatusResponse.getStatus())) {
// // 借款取消 贷后超时 取消
// queryResult.setCurrentOrderStatus(OrderStatusQueryResult.CurrentOrderStatus.CANCEL_AFTER_LOAN);
// queryResult.setUpdateTime(finalStatusResponse.getUpdatedAt());
// queryResult.setApplyNo(orderMapping.getApplyNo());
// log.info("[orderStatusQuery][loadFinalStatus]订单终态查询,结果:终态存管提现取消关闭,status={},applyNo={},loanId={}", finalStatusResponse.getStatus().name(), orderMapping.getApplyNo(), orderMapping.getLoanId());
// return true;
// }else {
// log.info("[orderStatusQuery][loadFinalStatus]订单终态查询,结果:未知,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return false;
// }
// }
// log.info("[orderStatusQuery][loadFinalStatus]订单终态查询,结果:未知,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return false;
// }
//
//
// // =======================================only status begin ====================================
//
//
// private OrderStatusQueryResultOnlyStatus loadFinalStatusOnlyStatus(OrderStatusQueryResultOnlyStatus queryResult, LoanOrderMapping orderMapping) {
// if (orderMapping.getLoanId() == null) {
// log.info("[orderStatusQuery][OnlyStatus][loadFinalStatus]订单终态查询loanId为空,结果未知");
// return null;
// }
// FinalStatusResponse finalStatusResponse = xyqbService.queryFinalStatus(orderMapping.getApplyNo(), orderMapping.getLoanId());
// if (finalStatusResponse != null) {
// if (FinalStatusEnum.LOAN_COMPLETE.equals(finalStatusResponse.getStatus())) {
// // 结清终态
// log.info("[orderStatusQuery][OnlyStatus][loadFinalStatus]订单终态查询,结果:终态结清,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// queryResult.setKaNoticeType(KANoticeType.ALL_REPAID);
// return queryResult;
// } else if (finalStatusResponse.getStatus().isCancelLoan()) {
// // 借款取消
// queryResult.setKaNoticeType(KANoticeType.CANCEL_LOAN);
// log.info("[orderStatusQuery][OnlyStatus][loadFinalStatus]订单终态查询,结果:终态取消,status={},applyNo={},loanId={}", finalStatusResponse.getStatus().name(), orderMapping.getApplyNo(), orderMapping.getLoanId());
// return queryResult;
// } else if (FinalStatusEnum.CANCEL_AFTER_LOAN.equals(finalStatusResponse.getStatus())) {
// // 借款取消 贷后超时 取消
// log.info("[orderStatusQuery][loadFinalStatus]订单终态查询,结果:终态存管提现取消关闭,status={},applyNo={},loanId={}", finalStatusResponse.getStatus().name(), orderMapping.getApplyNo(), orderMapping.getLoanId());
// queryResult.setKaNoticeType(KANoticeType.CANCEL_AFTER_LOAN);
// return queryResult;
// }else {
// log.info("[orderStatusQuery][OnlyStatus][loadFinalStatus]订单终态查询,结果:未知,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return null;
// }
// }
// log.info("[orderStatusQuery][OnlyStatus][loadFinalStatus]订单终态查询,结果:未知,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return null;
// }
//
// private OrderStatusQueryResultOnlyStatus loadPayOnlyStatus(OrderStatusQueryResultOnlyStatus queryResult, LoanOrderMapping orderMapping) {
// final Long loanId = orderMapping.getLoanId();
// if (loanId == null) {
// // loanId=null, 调用 提现状态加载(前置状态)
// log.info("[orderStatusQuery][OnlyStatus][loadPay]放款状态加载,结果:loanId=null,加载前置状态,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return loadDrawOnlyStatus(queryResult, orderMapping);
// }
// queryResult.setLoanId(loanId);
// Optional<QueryXyqbFundStatusResponse> queryXyqbFundStatusResponseOptional = xyqbRepaymentPlanService.queryFundStatus(orderMapping.getApplyNo(), loanId);
// if (!queryXyqbFundStatusResponseOptional.isPresent()) {
// log.info("[orderStatusQuery][OnlyStatus][loadPay]放款状态加载,结果:放款中,加载前置状态(提现状态),applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return loadDrawOnlyStatus(queryResult, orderMapping);
// }
//
// QueryXyqbFundStatusResponse queryXyqbFundStatusResponse = queryXyqbFundStatusResponseOptional.get();
// FundStatusEnum fundStatusEnum = queryXyqbFundStatusResponse.getStatus();
// // 2018-09-26 08:47:13
// queryResult.setUpdateTime(DateUtil.dateStr2Date(queryXyqbFundStatusResponse.getUpdatedAt(), DateUtil.DATE_FORMAT_1));
//
// if (fundStatusEnum == null) {
// log.info("[orderStatusQuery][OnlyStatus][loadPay]放款状态加载,结果:放款中,加载前置状态(提现状态),applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return loadDrawOnlyStatus(queryResult, orderMapping);
// }
// switch (fundStatusEnum) {
// case SUCC:
// queryResult.setKaNoticeType(KANoticeType.FUND_SUCC);
// return queryResult;
// case DEPOSITORY_SUCC:
// queryResult.setKaNoticeType(KANoticeType.FUND_WITHDRAW_SUCC);
// return queryResult;
// case FAIL:
// // 失败
// queryResult.setKaNoticeType(KANoticeType.FUND_FAIL);
// log.info("[orderStatusQuery][loadPay]放款状态加载,结果:放款失败,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return queryResult;
// case DEPOSITORY_FAIL:
// queryResult.setKaNoticeType(KANoticeType.CANCEL_AFTER_LOAN);
// return queryResult;
// case DEPOSITORY_HANDING:
// // 视为放款成功
// queryResult.setKaNoticeType(KANoticeType.FUND_SUCC);
// return queryResult;
// case HANDING:
// queryResult.setKaNoticeType(KANoticeType.PAY_ING);
// return queryResult;
// default:
// log.info("[orderStatusQuery][loadPay]放款状态加载,结果:放款中,加载前置状态(提现状态),applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// return loadDrawOnlyStatus(queryResult, orderMapping);
// }
// }
//
// /**
// *
// * @param queryResult
// * @param orderMapping
// * @return
// */
// private OrderStatusQueryResultOnlyStatus loadDrawOnlyStatus(OrderStatusQueryResultOnlyStatus queryResult, LoanOrderMapping orderMapping) {
// final Long loanId = orderMapping.getLoanId();
// if (loanId != null) {
// queryResult.setKaNoticeType(KANoticeType.WITHDRAW);
// return queryResult;
// } else {
// return loadApproveOnlyStatus(queryResult, orderMapping);
// }
// }
//
// /**
// *
// * @param queryResult
// * @param orderMapping
// * @return
// */
// private OrderStatusQueryResultOnlyStatus loadApproveOnlyStatus(OrderStatusQueryResultOnlyStatus queryResult, LoanOrderMapping orderMapping) {
// JsonResult jsonResultApprove = exService.queryApproveStatus(orderMapping.getApplyNo());
// queryResult.setApplyNo(orderMapping.getApplyNo());
// // 格式:"2018-04-21 13:54:02"
// final String updateAt = String.valueOf(jsonResultApprove.getData());
// queryResult.setUpdateTime(DateUtil.dateStr2Date(updateAt, DateUtil.DATE_FORMAT_1));
//
// if (jsonResultApprove.isSuccess()) {
// queryResult.setKaNoticeType(KANoticeType.FUAD_ASSIFN_SUCC);
// log.info("[orderStatusQuery][OnlyStatus][loadApprove]审批状态查询加载,结果:审批状态成功,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// } else if (Constants.APPROVE_FUND_ING_B_CODE.getKey().equals(jsonResultApprove.getBusinessCode())) {
// // 待审批
// queryResult.setKaNoticeType(KANoticeType.CREDIT_SUCC);
// log.info("[orderStatusQuery][OnlyStatus][loadApprove]审批状态查询加载,结果:审批状态审批中,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// } else if (Constants.APPROVE_FUND_FAIL_B_CODE.getKey().equals(jsonResultApprove.getBusinessCode())) {
// // 未通过
// queryResult.setKaNoticeType(KANoticeType.REJECT);
// log.info("[orderStatusQuery][OnlyStatus][loadApprove]审批状态查询加载,结果:审批未通过,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// } else if (Constants.LOAN_CANCEL_B_CODE.getKey().equals(jsonResultApprove.getBusinessCode())) {
// // 借款取消
// queryResult.setKaNoticeType(KANoticeType.CANCEL_LOAN);
// log.info("[orderStatusQuery][OnlyStatus][loadApprove]审批状态查询加载,结果:借款取消,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// } else {
// queryResult.setKaNoticeType(KANoticeType.CREDIT_SUCC);
// log.info("[orderStatusQuery][OnlyStatus][loadApprove]审批状态查询加载,结果:未知,applyNo={}, loanId={}", orderMapping.getApplyNo(), orderMapping.getLoanId());
// }
// return queryResult;
// }
//
// // =======================================only status end ====================================
//
//
// /**
// * 审批状态查询
// * @param applyNo
// * @return
// */
// public JsonResult queryApproveStatus(String applyNo) {
// Optional<QueryCheckResultResponse> queryApproveStatusOptional = xyqbService.queryCheckResultStatus(applyNo);
//
// if (!queryApproveStatusOptional.isPresent()) {
// return JsonResult.buildErrorStateResult("请求失败", "", Constants.APPROVE_FUND_ING_B_CODE.getValue());
// }
// if (QueryCheckResultResponse.ProductTypeEnum.CASH.equals(queryApproveStatusOptional.get().getProductType())) {
// if (queryApproveStatusOptional.get().getStatus() != null) {
// switch (queryApproveStatusOptional.get().getStatus()) {
// case WAITING_RISKCONTROL:
// case ASSIGN_INIT:
// case ASSIGN_QUEUE:
// case ON_ASSIGNING:
// case ASSIGN_HANG:
// case UN_KNOWN:
// // RISKCONTROL_PASS : 风控审批通过,还没分配资金方,不能查询额度
// case RISKCONTROL_PASS:
// return JsonResult.buildErrorStateResult("审批中", queryApproveStatusOptional.get().getUpdatedAt(), Constants.APPROVE_FUND_ING_B_CODE.getValue());
// case FUND_REFUSE://add 风控通过,资金分配失败
// case RISKCONTROL_REFUSE:
// return JsonResult.buildErrorStateResult("审批未通过", queryApproveStatusOptional.get().getUpdatedAt(), Constants.APPROVE_FUND_FAIL_B_CODE.getValue());
// case ASSIGN_FAIL:
// case USER_CANCEL:
// return JsonResult.buildErrorStateResult("订单取消", queryApproveStatusOptional.get().getUpdatedAt(), Constants.LOAN_CANCEL_B_CODE.getValue());
// case ASSIGN_SUCC:
// return JsonResult.buildSuccessResult("审批通过", queryApproveStatusOptional.get().getUpdatedAt());
// default:return JsonResult.buildErrorStateResult("审批未通过", queryApproveStatusOptional.get().getUpdatedAt(), Constants.APPROVE_FUND_FAIL_B_CODE.getValue());
// }
// }
// } else if (QueryCheckResultResponse.ProductTypeEnum.UN_KNOWN.equals(queryApproveStatusOptional.get().getProductType())) {
// return JsonResult.buildErrorStateResult("审批中", queryApproveStatusOptional.get().getUpdatedAt(), Constants.APPROVE_FUND_ING_B_CODE.getValue());
// }
// return JsonResult.buildErrorStateResult("审批中", queryApproveStatusOptional.get().getUpdatedAt(), Constants.APPROVE_FUND_ING_B_CODE.getValue());
// }
}
......@@ -2,43 +2,48 @@ package cn.quantgroup.cashloanflowboss.spi.xyqb.service;
import cn.quantgroup.cashloanflowboss.api.order.model.XyqbCurrentOrderStatusServiceResultModel;
import cn.quantgroup.cashloanflowboss.api.order.model.XyqbHistoryOrderStatusServiceResultModel;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.base.ServiceResult;
import cn.quantgroup.cashloanflowboss.spi.xyqb.client.XYQBCenter;
import cn.quantgroup.cashloanflowboss.spi.xyqb.repository.ContractRepository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.repository.FundLendingRepository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.*;
import cn.quantgroup.cashloanflowboss.spi.xyqb.repository.*;
import cn.quantgroup.cashloanflowboss.spi.xyqb.util.SignUtil;
import cn.quantgroup.cashloanflowboss.utils.DateUtil;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* Created by WeiWei on 2019/8/12.
*/
@Slf4j
@Service
public class XYQBCenterService {
@Autowired
private FundLendingRepository fundLendingRepository;
private WaitingFundingCorpOperatePeopleRepository waitingFundingCorpOperatePeopleRepository;
@Autowired
private ContractRepository contractRepository;
@Autowired
private CancelPreLoanRepository cancelPreLoanRepository;
@Autowired
private FundingCorpPolicyRepository fundingCorpPolicyRepository;
@Autowired
private FundingAssetAllocationsProgramsRepository fundingAssetAllocationsProgramsRepository;
@Autowired
private LoanApplicationHistoryRepository loanApplicationHistoryRepository;
@Autowired
private XYQBCenter xyqbCenter;
/**
* 更新资方待放款创建时间
*
* @return
*/
public boolean updateFundLendingTime(Long loanId) {
return this.fundLendingRepository.updateCreateTime(loanId, new Date());
}
/**
* 更新合同状态
......@@ -46,7 +51,7 @@ public class XYQBCenterService {
* @param userId
* @return
*/
public boolean updateContractStatus(Long userId, Integer status) {
public int updateContractStatus(Long userId, Integer status) {
return this.contractRepository.updateContractStatus(userId, status);
}
......@@ -54,35 +59,96 @@ public class XYQBCenterService {
* 查询放款记录
*
* @param fundId
* @param progress
* @return
*/
public Map queryLendingRecordCount(Integer fundId, Integer progress) {
return this.fundLendingRepository.queryLendingRecordCount(fundId, progress);
public Map queryLendingRecordCount(Long fundId) {
return this.waitingFundingCorpOperatePeopleRepository.queryLendingRecordCount(fundId);
}
/**
* 生成放款结果MQ
*
* @param loanId
* @param status
* 贷前取消借款
* @param channelOrderNumber
* @return
*/
public Long cancelPreLoan(String channelOrderNumber) {
if (Application.isDebug()) {
return cancelPreLoanRepository.cancelPreLoan(channelOrderNumber);
} else {
return -1L;
}
}
/**
* 通过userId获取合同
* @param userId
* @return
*/
public boolean pushLendingResult(Long loanId, Integer status) {
public Contract findContractByUserId(Long userId) {
return contractRepository.findByUserIdLastOne(userId);
}
/**
* 保存合同
* @param contract
*/
public void saveContract(Contract contract) {
if (Application.isDebug()) {
contractRepository.save(contract);
}
}
public WaitingFundingCorpOperatePeople findWaitingFundingCorpOperatePeopleByLoanId(Long loanId) {
return waitingFundingCorpOperatePeopleRepository.findByLoanApplicationHistoryId(loanId);
}
// TODO WEIWEI 查看返回的数据结构,补充判断逻辑
@Transactional
public void saveWaitingFundingCorpOperatePeople(WaitingFundingCorpOperatePeople waitingFundingCorpOperatePeople) {
if (Application.isDebug()) {
waitingFundingCorpOperatePeopleRepository.saveAndFlush(waitingFundingCorpOperatePeople);
}
}
String data = this.xyqbCenter.pushLendingResult(new HashMap() {{
put("orderNo", loanId);
put("payOrderNo", loanId);
put("payTime", new Date().getTime());
put("payStatus", status);
}});
return false;
/**
* 通过资方id 查找资产计划开关
* @param corpPolicyId
* @return
*/
public FundingCorpPolicy findFundingCorpPolicyByCorpPolicyId(Long corpPolicyId) {
return fundingCorpPolicyRepository.findByFundingCorpId(corpPolicyId);
}
/**
*
* @param corpPolicyId 资方id
* @param planDate 资产计划日期 精确到天
* @return
*/
public FundingAssetAllocationsPrograms findFundingAssetAllocationsProgramsByCorpPolicyIdAndPlanDate(Long corpPolicyId, String planDate) {
return fundingAssetAllocationsProgramsRepository.findByFundCorpIdAndPlanDate(corpPolicyId, planDate);
}
public LoanApplicationHistory findLoanApplicationHistoryById(Long loanId) {
return loanApplicationHistoryRepository.findById(loanId);
}
/**
* 验证资产计划 是否有效
* @param corpPolicyId
* @param planDate 日期 只能要天
* @return
*/
public Boolean validateCorpPolicy(Long corpPolicyId, Date planDate) {
Boolean isValidate = true;
FundingCorpPolicy fundingCorpPolicy = findFundingCorpPolicyByCorpPolicyId(corpPolicyId);
isValidate = isValidate & fundingCorpPolicy.getIsAutoAssign() & fundingCorpPolicy.getIsAutoLoan();
FundingAssetAllocationsPrograms fundingAssetAllocationsPrograms = findFundingAssetAllocationsProgramsByCorpPolicyIdAndPlanDate(corpPolicyId, DateUtil.format(planDate, DateUtil.YYYY_MM_DD));
return isValidate & (fundingAssetAllocationsPrograms != null);
}
/**
* 查询订单当前状态
......@@ -94,12 +160,13 @@ public class XYQBCenterService {
Map paramMap = Maps.newHashMap();
paramMap.put("orderNo", creditOrderNumber);
if (loanId != null) {
if (loanId != null && loanId > 1) {
paramMap.put("loanId", loanId);
}
paramMap = SignUtil.sign(SignUtil.KA_API_KEY, paramMap);
return xyqbCenter.getOrderStatus(paramMap);
final ServiceResult<XyqbCurrentOrderStatusServiceResultModel> orderStatus = xyqbCenter.getOrderStatus(paramMap);
log.info("[getXyqbOrderStatus]xyqb订单状态查询,creditOrderNumber={},result={}", creditOrderNumber, JSONTools.serialize(orderStatus));
return orderStatus;
}
/**
......@@ -120,4 +187,29 @@ public class XYQBCenterService {
return xyqbCenter.getXyqbOrderHistoryStatus(paramMap);
}
/**
* 放款 放款结果通知
* @param loanId 订单loanId
* @param expectPayResult 期望放款结果 true 放款成功 false 放款失败
* @return
*/
public boolean payResultNotify(Long loanId, Boolean expectPayResult) {
if (Application.isDebug()) {
Map paramMap = Maps.newHashMap();
paramMap.put("orderNo", loanId);
paramMap.put("payOrderNo", loanId);
paramMap.put("payTime", "");
paramMap.put("payStatus", expectPayResult ? 3 : 4);
String result = xyqbCenter.pushLendingResult(paramMap);
log.info("[放款结果通知]xyqb返回结果result={}", result);
return "success".equals(result) || "SUCCESS".equals(result);
} else {
return false;
}
}
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.service;
import cn.quantgroup.cashloanflowboss.spi.model.JsonResult;
import cn.quantgroup.cashloanflowboss.spi.util.HttpService;
import cn.quantgroup.cashloanflowboss.spi.xyqb.model.ProductUtil;
import cn.quantgroup.cashloanflowboss.spi.xyqb.model.QuotaCreditInfo;
import cn.quantgroup.cashloanflowboss.spi.xyqb.model.QuotaInfo;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.type.TypeReference;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.google.common.reflect.TypeToken;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.*;
/**
*
* @author abe
* @Date 20180105
*/
@Service
public class XyqbService {
// private static final Logger LOGGER = LoggerFactory.getLogger(XyqbService.class);
//
// @Value("${api.http}")
// private String xyqbUrl;
//
// @Autowired
// private HttpService httpService;
//
//// @Override
//// public String queryXyqbForData(String interfaceUrl , Map<String, String> param){
//// try{
//// LOGGER.info("[KA_INVOKE_XYQB][queryXyqbForData]开始调用查询xyqb库接口,路径是={},参数是={}", interfaceUrl, param);
//// return httpService.get(xyqbUrl+interfaceUrl,param);
//// }catch(Exception e){
//// LOGGER.error("[exception][KA_INVOKE_XYQB][queryXyqbForData]调用xyqb接口查询出现异常,接口路径={},参数是={}", interfaceUrl, param, e);
//// return null;
//// }
//// }
////
//// @Override
//// public String postXyqbSaveData(String interfaceUrl , Map<String, String> param){
//// try{
//// LOGGER.info("[postXyqbSaveData]开始调用查询xyqb库接口,路径是={},参数是={}", interfaceUrl, param);
//// return httpService.post(xyqbUrl+interfaceUrl,param);
//// }catch(Exception e){
//// LOGGER.error("[exception][KA_INVOKE_XYQB][postXyqbSaveData]调用xyqb接口查询出现异常,接口路径={},参数是={}", interfaceUrl, param, e);
//// return null;
//// }
//// }
//
//
// /** 关闭授信订单 */
// public boolean closeCreditLoan(Long userId, String applyNo) {
// String url = String.valueOf(xyqbUrl + "/ex/ka/quota/credit/close");
// Map<String, String> param = new HashMap<>(4);
// param.put("userId", String.valueOf(userId));
// param.put("orderNo", applyNo);
// String result = httpService.post(url, param);
// JsonResult jsonResult = JSONTools.deserialize(result, JsonResult.class);
// if (jsonResult != null && jsonResult.isSuccess()) {
// return true;
// } else {
// LOGGER.error("[closeCreditLoan][closeCreditLoan_fail]授信订单关闭失败,userId={},applyNo={}", userId, applyNo);
// return false;
// }
// }
//
// /**
// * 查询额度创建之后的详细信息
// * @param userId
// * @param registeredFrom
// * @return
// */
// public Optional<QuotaInfo> queryQuotaInfo(Long userId, Long registeredFrom) {
// final String url = String.valueOf(xyqbUrl + "/ex/ka/quota/info");
// final Map<String, String> param = new HashMap<>(4);
// param.put("userId", String.valueOf(userId));
// param.put("productId", ProductUtil.getProductId(registeredFrom));
//
// final String result = httpService.get(url, param);
// TypeReference<JsonResult<QuotaInfo>> typeReference = new TypeReference<JsonResult<QuotaInfo>>() {};
// JsonResult<QuotaInfo> jsonResult = JSONTools.deserialize(result, typeReference);
// if (jsonResult != null && jsonResult.isSuccess()) {
// QuotaInfo quotaInfo = jsonResult.getData();
// if (QuotaInfo.validationQuotaInfo(quotaInfo)) {
// return Optional.ofNullable(quotaInfo);
// } else {
// LOGGER.error("[queryQuotaInfo_{}][queryQuotaInfo_fail]授信订单查询结果未通过验证,userId={},result={}",registeredFrom, userId, result);
// return Optional.empty();
// }
// }
// LOGGER.error("[queryQuotaInfo_{}][queryQuotaInfo_fail]授信订单结果查询失败,userId={},result={}",registeredFrom, userId, result);
// return Optional.empty();
// }
//
// public Optional<QuotaCreditInfo> queryQuotaCreditInfo(String orderNo) {
// final String url = String.valueOf(xyqbUrl + "/ex/ka/quota/credit-info");
// final Map<String, String> param = new HashMap<>(2);
// param.put("orderNo", orderNo);
//
// final String result = httpService.get(url, param);
//
// TypeReference<JsonResult<QuotaCreditInfo>> typeReference = new TypeReference<JsonResult<QuotaCreditInfo>>() {};
// JsonResult<QuotaCreditInfo> jsonResult = JSONTools.deserialize(result, typeReference);
// if (jsonResult != null && jsonResult.isSuccess()) {
// return Optional.ofNullable(jsonResult.getData());
// } else {
// LOGGER.error("[queryQuotaCreditInfo_{}][queryQuotaCreditInfo_fail]授信订单结果查询失败,orderNo={},result={}", orderNo, result);
// return Optional.empty();
// }
// }
////
//// public Optional<QuotaCreditInfo> queryQuotaCreditInfo(Long loanId) {
//// final String url = String.valueOf(xyqbUrl + "/ex/ka/quota/loan/credit");
//// final Map<String, String> param = new HashMap<>(2);
//// param.put("loanId", String.valueOf(loanId));
////
//// final String result = httpService.get(url, param);
//// final Type type = new TypeToken<JsonResultGenericData<QuotaCreditInfo>>() {}.getType();
//// Optional<JsonResultGenericData<QuotaCreditInfo>> jsonResultOptional = JsonUtil.fromGsonByParamType(result, type);
//// if (jsonResultOptional.isPresent() && jsonResultOptional.get().isSuccess()) {
//// return Optional.ofNullable(jsonResultOptional.get().getData());
//// } else {
//// LOGGER.error("[queryQuotaCreditInfo_{}][queryQuotaCreditInfo_fail]授信订单结果查询失败,loanId={},result={}", loanId, result);
//// return Optional.empty();
//// }
//// }
//
//
//
// /**
// * 查询订单终态
// * @param applyNo
// * @param loanId
// * @return
// */
// @Override
// public FinalStatusResponse queryFinalStatus(String applyNo, Long loanId) {
// FinalStatusResponse finalStatusResponse = new FinalStatusResponse();
//
//
// if (LoanUtil.isQuotaLoanId(loanId)) {
// final String url = String.valueOf(xyqbUrl + "/ex/ka/quota/loan/final/status");
// final Map<String, String> param = new HashMap<>(2);
// param.put("loanId", String.valueOf(loanId));
//
// final String result = httpService.get(url, param);
// LOGGER.info("[queryFinalStatus_{}][queryFinalStatus]订单终态查询,loanId={},result={}", loanId, result);
// final Type type = new TypeToken<JsonResultGenericData<FinalStatusResponse.QueryXyqbFinalStatusResponse>>() {}.getType();
// Optional<JsonResultGenericData<FinalStatusResponse.QueryXyqbFinalStatusResponse>> jsonResultOptional = JsonUtil.fromGsonByParamType(result, type);
// if (jsonResultOptional.isPresent() && jsonResultOptional.get().isSuccess()) {
// final FinalStatusResponse.QueryXyqbFinalStatusResponse data = jsonResultOptional.get().getData();
// if (data != null) {
// finalStatusResponse.setStatus(FinalStatusEnum.getFinalStatusEnum(data.getStatus()));
// finalStatusResponse.setUpdatedAt(DateUtil.dateStr2Date(data.getUpdatedAt(), DateUtil.DATE_FORMAT_1));
// return finalStatusResponse;
// }
// }
// } else {
// if (StringUtils.isNotEmpty(applyNo)) {
// Optional<QueryCheckResultResponse> queryCheckResultResponseOptional = queryCheckResultStatus(applyNo);
// if (queryCheckResultResponseOptional.isPresent()) {
// QueryCheckResultResponse queryCheckResultResponse = queryCheckResultResponseOptional.get();
// finalStatusResponse.setStatus(FinalStatusEnum.getFinalStatusEnum(queryCheckResultResponse.getStatus()));
// finalStatusResponse.setUpdatedAt(DateUtil.dateStr2Date(queryCheckResultResponse.getUpdatedAt(), DateUtil.DATE_FORMAT_1));
// return finalStatusResponse;
// }
// }
// }
// LOGGER.error("[queryFinalStatus][queryFinalStatus_default]订单终态查询,未查询到终态,loanId={},applyNo={}", loanId, applyNo);
// finalStatusResponse.setStatus(FinalStatusEnum.UNKNOWN);
// finalStatusResponse.setUpdatedAt(new Date());
// return finalStatusResponse;
// }
//
// @Override
// public Optional<QueryXyqbFundStatusResponse> queryFundStatus(Long loanId) {
// final String url = String.valueOf(xyqbUrl + "/ex/ka/quota/fund/status");
// final Map<String, String> param = new HashMap<>(2);
// param.put("loanId", String.valueOf(loanId));
//
// final String result = httpService.get(url, param);
// LOGGER.info("[queryFundStatus_{}][queryFundStatus]放款状态查询,loanId={},result={}", loanId, result);
// final Type type = new TypeToken<JsonResultGenericData<QueryXyqbFundStatusResponse>>() {}.getType();
// Optional<JsonResultGenericData<QueryXyqbFundStatusResponse>> jsonResultOptional = JsonUtil.fromGsonByParamType(result, type);
// if (jsonResultOptional.isPresent() && jsonResultOptional.get().isSuccess()) {
// return Optional.ofNullable(jsonResultOptional.get().getData());
// } else {
// LOGGER.error("[queryFundStatus_{}][queryFundStatus_fail]放款状态查询失败,loanId={},result={}", loanId, result);
// return Optional.empty();
// }
// }
//
// /**
// * 查询该笔授信订单 目前状态
// * @param applyNo
// * @return
// */
// @Override
// public Optional<QueryCheckResultResponse> queryCheckResultStatus(String applyNo) {
// final String url = String.valueOf(xyqbUrl + "/ex/ka/quota/current/status");
// final Map<String, String> param = new HashMap<>(2);
// param.put("orderNo", applyNo);
//
// final String result = httpService.get(url, param);
// LOGGER.info("[queryCheckResultStatus_{}][queryCheckResultStatus]查询审批状态,applyNo={},result={}", applyNo, result);
// final Type type = new TypeToken<JsonResultGenericData<QueryCheckResultResponse>>() {}.getType();
// Optional<JsonResultGenericData<QueryCheckResultResponse>> jsonResultOptional = JsonUtil.fromGsonByParamType(result, type);
// if (jsonResultOptional.isPresent() && jsonResultOptional.get().isSuccess()) {
// return Optional.ofNullable(jsonResultOptional.get().getData());
// } else {
// LOGGER.error("[queryCheckResultStatus_{}][queryCheckResultStatus_fail]查询审批状态失败,applyNo={},result={}", applyNo, result);
// return Optional.empty();
// }
// }
//
// @Override
// public Optional<QuotaRepaymentPreview> queryQuotaPreviewByFirstTerm(Long userId, Long productId, BigDecimal totalAmount, Integer term){
// List<QuotaRepaymentPreview> quotaRepaymentPreviews = trialRepaymentPlan(String.valueOf(userId), String.valueOf(productId), Constants.DECIMAL_FORMAT0.format(totalAmount), String.valueOf(term));
// if (CollectionUtils.isNotEmpty(quotaRepaymentPreviews)) {
// return Optional.ofNullable(quotaRepaymentPreviews.get(0));
// } else {
// return Optional.empty();
// }
// }
//
// @Override
// public Optional<PaymentBusinessInfo> queryPaymentBusinessInfo(Long loanId, Long channelId) {
// String url = String.valueOf(xyqbUrl + "/ex/ka/xiaoniu/card");
// Map<String, String> param = new HashMap<>(4);
// param.put("loanId", String.valueOf(loanId));
// param.put("channel", String.valueOf(channelId));
// String result = httpService.get(url, param);
// Optional<JsonResult> jsonResultOptional = JsonUtil.fromJson(result, JsonResult.class);
// if (jsonResultOptional.isPresent() && jsonResultOptional.get().isSuccess()) {
// LOGGER.info("[queryPaymentBusinessInfo]查询放款信息,loanId={},result={}",loanId, result);
// PaymentBusinessInfo paymentBusinessInfo = new PaymentBusinessInfo();
// paymentBusinessInfo.setPaymentAccount(String.valueOf(jsonResultOptional.get().getData()));
// return Optional.ofNullable(paymentBusinessInfo);
// } else {
// LOGGER.error("[queryPaymentBusinessInfo][queryPaymentBusinessInfo_fail]查询放款卡信息,loanId={},result={}",loanId, result);
// return Optional.empty();
// }
// }
//
// @Override
// public JsonResult applyQuitCourse(String applyNo, Long loanId, Long channelId) {
// String url = String.valueOf(xyqbUrl + "/ex/ka/xiaoniu/drop_course");
// Map<String, String> param = new HashMap<>(4);
// param.put("loanId", String.valueOf(loanId));
// param.put("channel", Objects.toString(channelId));
// param.put("orderNo", applyNo);
// String result = httpService.post(url, param);
// Optional<JsonResult> jsonResultOptional = JsonUtil.fromJson(result, JsonResult.class);
// if (jsonResultOptional.isPresent()) {
// LOGGER.info("[xiaoniu_applyQuitCourse]小牛在xyqb 申请退课,loanId={},applyNo={},result={}",loanId, applyNo, result);
// return jsonResultOptional.get();
// } else {
// LOGGER.error("[xiaoniu_applyQuitCourse][xiaoniu_applyQuitCourse_fail]小牛在xyqb 申请退课请求异常,loanId={},applyNo={},result={}",loanId, applyNo, result);
// return JsonResult.buildEmptyStateResult("系统异常");
// }
// }
//
// @Override
// public Optional<DepositoryBusiness> queryDepositoryBusiness(String applyNo, Long loanId) {
// String url = String.valueOf(xyqbUrl + "/ex/ka/fund/withdraw");
// Map<String, String> param = new HashMap<>(2);
// param.put("loanId", String.valueOf(loanId));
// String result = httpService.get(url, param);
// Type type = new TypeToken<JsonResultGenericData<DepositoryBusiness>>() {}.getType();
// Optional<JsonResultGenericData<DepositoryBusiness>> jsonResultOptional = JsonUtil.fromGsonByParamType(result, type);
// if (jsonResultOptional.isPresent() && jsonResultOptional.get().isSuccess()) {
// LOGGER.info("[queryDepositoryBusiness]查询存管状态,loanId={},result={}",loanId, result);
// return Optional.ofNullable(jsonResultOptional.get().getData());
// } else {
// LOGGER.error("[queryDepositoryBusiness][paymentAndBindCard_fail]查询存管状态,loanId={},result={}",loanId, result);
// return Optional.empty();
// }
// }
//
// @Override
// public List<QuotaRepaymentPreview> trialRepaymentPlan(String userId, String productId, String amount, String term) {
// final String url = String.valueOf(xyqbUrl + "/ex/ka/quota/preview/plans");
// final Map<String, String> param = new HashMap<>(8);
// param.put("userId", userId);
// param.put("amount", amount);
// // term=1 查第一期,term=9 查1-9期
// param.put("term", term);
// param.put("productId", productId);
//
// final String result = httpService.get(url, param);
// final Type type = new TypeToken<JsonResultGenericData<List<QuotaRepaymentPreview>>>() {}.getType();
// final Optional<JsonResultGenericData<List<QuotaRepaymentPreview>>> jsonResultOptional = JsonUtil.fromGsonByParamType(result, type);
// if (jsonResultOptional.isPresent() && jsonResultOptional.get().isSuccess()) {
// return jsonResultOptional.get().getData();
// } else {
// LOGGER.error("[queryQueryQuotaPreview_{}][queryQueryQuotaPreview_fail]预览还款计划失败,userId={},productId={},amount={},term={},result={}", userId, amount, term, result);
// return null;
// }
// }
//
}
package cn.quantgroup.cashloanflowboss.utils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
/**
* Created by conglin.liu on 2017/8/3.
*/
@Slf4j
public class DateUtil {
private static Logger logger = LoggerFactory.getLogger(DateUtil.class);
public final static String DATE_FORMAT_1 = "yyyy-MM-dd HH:mm:ss";
public final static String yyyyMMdd_HHmm = "yyyyMMdd_HHmm";
public final static String YYYYMMDD = "yyyyMMdd";
public final static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public final static String YYYYMMDD_HHMMSS = "yyyyMMdd HHmmss";
public final static String YYYY_MM_DD = "yyyy-MM-dd";
public final static DateTimeFormatter dateTimeFormatter_yyyy_MM_dd = DateTimeFormatter.ofPattern("yyyy-MM-dd");
public final static DateTimeFormatter dateTimeFormatter_yyyyMMdd = DateTimeFormatter.ofPattern("yyyyMMdd");
public final static String date_suffix = "235959";
/**
* 获得时间戳(10位,精确到秒)
* @return
*/
public static String getTenTimestamp() {
return String.valueOf(new Timestamp(System.currentTimeMillis()).getTime() / 1000);
}
/**
* 字符串(秒) 转为 Timestamp(10位)
* @param tsStr 2017-06-06 12:00:00 -> 1496721600
* @return
*/
public static Timestamp stringToTimestamp(String tsStr) {
Timestamp ts = new Timestamp(System.currentTimeMillis());
try {
ts = Timestamp.valueOf(tsStr);
} catch (Exception e) {
e.printStackTrace();
}
return ts;
}
/**
* 字符串(秒) 转为 Timestamp(10位)
* @param tsStr 2017-06-06 12:00:00 -> 1496721600
* @return
*/
public static Date stringToDate(String tsStr) {
Date date = new Date();
try {
date = new Date(Long.valueOf(tsStr));
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
/**
* 数值 毫秒值 转时间
* @param times 时间的毫秒值
* @return
*/
public static Date getByLongTimes(Long times) {
Date date = null;
try {
date = new Date(times);
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
/**
* 使用参数Format格式化Date成字符串
*/
public static String format(Date date, String pattern) {
try {
return date == null ? "" : new SimpleDateFormat(pattern).format(date);
} catch (Exception e) {
log.error("[exception]date transfer error,date={},pattern={}",date,pattern);
return "";
}
}
/**
* 将yyyy-MM-dd 转成 yyyyMMdd+时分秒
* @param deadline
* @return yyyyMMddHHmmss
*/
public static String getDeadline(String deadline) {
try {
if (StringUtils.isNotBlank(deadline)) {
String date = deadline.replaceAll("-", "").replaceAll("/", "").substring(0, 8);
return date + date_suffix;
} else {
return LocalDateTime.now().format(dateTimeFormatter_yyyyMMdd) + date_suffix;
}
} catch (Exception e) {
return LocalDateTime.now().format(dateTimeFormatter_yyyyMMdd) + date_suffix;
}
}
/**
* 将yyyy-MM-dd 转成 yyyyMMdd+时分秒
* @param deadline
* @return yyyyMMddHHmmss
*/
public static String getDeadline(Date deadline) {
try {
if (deadline != null) {
String date = format(deadline, YYYYMMDD);
return date + date_suffix;
} else {
return LocalDateTime.now().format(dateTimeFormatter_yyyyMMdd) + date_suffix;
}
} catch (Exception e) {
return LocalDateTime.now().format(dateTimeFormatter_yyyyMMdd) + date_suffix;
}
}
/**
* 时间字符串 转换成时间
* @param dateStr 时间字符串
* @param parsePatterns 时间字符串 格式
* @return
*/
public static Date dateStr2Date(String dateStr, String parsePatterns) {
try {
return DateUtils.parseDate(dateStr, parsePatterns);
} catch (ParseException e) {
logger.error("时间转换出错,deadline={},parsePatterns={}", dateStr, parsePatterns, e);
return new Date();
}
}
/**
* 获取当前时间
* @return Timestamp
*/
public static Timestamp getCurrentTimestamp(){
return new Timestamp(System.currentTimeMillis());
}
/**
* 把时间字符串,源格式转换为 目标格式输出
* @param dateStr 时间字符串
* @param dateFormatSource : (source)格式
* @param dateFormatTarget (target)格式
* @return
*/
public static String parse(String dateStr, String dateFormatSource, String dateFormatTarget) {
String dateFormat;
try {
dateFormat = format(dateStr2Date(dateStr, dateFormatSource), dateFormatTarget);
if (StringUtils.isEmpty(dateFormat)) {
logger.error("时间为空,dateStr={},parsePatterns={}", dateStr, dateFormatSource + "2" + dateFormatTarget);
dateFormat = format(new Date(), dateFormatTarget);
}
} catch (Exception e) {
logger.error("时间转换出错,dateStr={},parsePatterns={}", dateStr, dateFormatSource + "2" + dateFormatTarget, e);
dateFormat = format(new Date(), dateFormatTarget);
}
return dateFormat;
}
public static Date monthLater() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.MONTH, 1);
return new Date(calendar.getTime().getTime());
}
public static Date dayLater() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_MONTH, 1);
return new Date(calendar.getTime().getTime());
}
/**
* 根据时间 获取10位 时间戳
* @param updated
* @return
*/
public static Long get10LongTimeFromDate(Date updated) {
if (updated == null) {
return System.currentTimeMillis() / 1000;
} else {
return updated.getTime() / 1000;
}
}
/**
* 判断当前时间是否在[startTime, endTime]区间,注意时间格式要一致
*
* @param nowTime 当前时间
* @param startTime 开始时间
* @param endTime 结束时间
* @return true 在区间,false:不在区间
* @author suntao
*/
public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
if (nowTime.getTime() == startTime.getTime()
|| nowTime.getTime() == endTime.getTime()) {
return true;
}
Calendar date = Calendar.getInstance();
date.setTime(nowTime);
Calendar begin = Calendar.getInstance();
begin.setTime(startTime);
Calendar end = Calendar.getInstance();
end.setTime(endTime);
if (date.after(begin) && date.before(end)) {
return true;
} 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