Commit 56d0da8a authored by WeiWei's avatar WeiWei

Merge remote-tracking branch 'cash-loan-flow-boss/v1' into v1

# Conflicts:
#	src/main/java/cn/quantgroup/cashloanflowboss/api/channel/controller/ChannelConfController.java
#	src/main/java/cn/quantgroup/cashloanflowboss/api/log/service/LogService.java
#	src/main/java/cn/quantgroup/cashloanflowboss/api/role/entity/boss/RoleUser.java
#	src/main/java/cn/quantgroup/cashloanflowboss/api/role/service/RoleService.java
parents 678218ce 59c85911
......@@ -79,6 +79,67 @@
<artifactId>commons-core</artifactId>
</dependency>
<!-- user sdk -->
<dependency>
<groupId>cn.quantgroup</groupId>
<artifactId>quantgroup-user-sdk</artifactId>
<version>1.1.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<!-- <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-core</artifactId>
<version>1.4.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-commons</artifactId>
<version>1.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
</dependencies>
......
......@@ -3,6 +3,7 @@ package cn.quantgroup.cashloanflowboss;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.transaction.annotation.EnableTransactionManagement;
......@@ -12,6 +13,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
@SpringBootApplication(scanBasePackages = {"cn.quantgroup.cashloanflowboss"})
@Configuration
@EnableAutoConfiguration
@EnableFeignClients
public class Bootstrap {
public static void main(String[] args) {
......
package cn.quantgroup.cashloanflowboss.api.channel.controller;
import cn.quantgroup.cashloanflowboss.api.channel.entity.clf.ChannelConfiguration;
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.core.annotation.ChannelIdInit;
import cn.quantgroup.cashloanflowboss.api.channel.service.ChannelConfService;
import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRole;
import cn.quantgroup.cashloanflowboss.api.user.model.Pagination;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
......@@ -26,15 +28,31 @@ public class ChannelConfController {
private ChannelConfService channelConfService;
@GetMapping("/info")
public Page<ChannelConfiguration> channelInfo(@RequestParam @Valid Pagination pagination, Integer channelId) {
return channelConfService.getChannelInfo(pagination, channelId);
/**
* 查询渠道列表
* @param channelId 在接受参数时,必须放到第一个参数位置
* @param pageNumber
* @param pageSize
* @return
*/
@ChannelIdInit
@PostMapping("/info")
public Result channelInfo(Long channelId, Integer pageNumber, Integer pageSize) {
return Result.buildSuccess(channelConfService.getChannelInfo(pageNumber, pageSize, channelId));
}
@CheckChannelRole
@GetMapping("/cfg/info")
public Result channelConfInfo(Integer channelId) {
return channelConfService.getChannelConf(channelId);
public Result getChannelConfInfo(Long channelId) {
return Result.buildSuccess(channelConfService.getChannelConf(channelId), "success");
}
@CheckChannelRole(isObjParam = true ,paramClazz = ChannelConfVo.class)
@PostMapping("/cfg/info")
public Result editChannelConfInfo(@RequestBody @Valid ChannelConfVo channelConfVo) {
return Result.buildSuccess(channelConfService.editChannelConfInfo(channelConfVo));
}
......
......@@ -18,7 +18,7 @@ public class ChannelConf extends Primary {
* 渠道id
*/
@Column(name = "channel_id")
private Integer channelId;
private Long channelId;
/**
* 渠道code
......@@ -69,10 +69,22 @@ public class ChannelConf extends Primary {
private String md5Key;
/**
* env_url
* env_path
*/
@Column(name = "env_url")
private String envUrl;
@Column(name = "env_path")
private String envPath;
/**
* authCode
*/
@Column(name = "auth_code")
private String authCode;
/**
* riskCode
*/
@Column(name = "risk_code")
private String riskCode;
/**
* channel_ip
......
package cn.quantgroup.cashloanflowboss.api.channel.model.boss;
package cn.quantgroup.cashloanflowboss.api.channel.model;
import lombok.Data;
......@@ -10,7 +10,7 @@ import lombok.Data;
*/
@Data
public class ChannelConfAddModel {
private String envUrl;
private String envPath;
private String channelIp;
private String approveCallBackUrl;
private String orderStatusCallBackUrl;
......
package cn.quantgroup.cashloanflowboss.api.channel.model.boss;
package cn.quantgroup.cashloanflowboss.api.channel.model;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* Created with suntao on 2019/8/2
*/
@Data
public class ChannelConfBaseModel {
private Integer channelId;
@NotNull(message = "渠道id不能为空")
private Long channelId;
private String channelName;
private String channelCode;
private String env;
private String fundId;
private String p2pFundId;
private String bizType;
private Integer fundId;
private Integer p2pFundId;
private Integer bizType;
private String aesKey;
private String md5Key;
private String authCode;
private String riskCode;
}
package cn.quantgroup.cashloanflowboss.api.channel.model;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* function:
* date: 2019/8/7
*
* @author: suntao
*/
@Data
public class ChannelConfVo {
@NotNull(message = "基础配置信息不能为空")
private ChannelConfBaseModel basicInfo;
@NotNull(message = "回调地址配置信息不能为空")
private ChannelConfAddModel addInfo;
}
package cn.quantgroup.cashloanflowboss.api.channel.model;
import lombok.Data;
import java.util.Date;
/**
* function:
* date: 2019/8/6
*
* @author: suntao
*/
@Data
public class ChannelListModel {
private Long channelId;
private String channelName;
private String channelCode;
private Integer bizType;
private Date createdAt;
}
package cn.quantgroup.cashloanflowboss.api.channel.model.clf;
/**
* function:
* date: 2019/8/6
*
* @author: suntao
*/
public class ChannelConfigurationPage {
}
......@@ -18,7 +18,7 @@ public interface ChannelConfRepository extends JpaRepository<ChannelConf, Long>
* @param channelId 用户名
* @return
*/
ChannelConf getByChannelId(Integer channelId);
ChannelConf getByChannelId(Long channelId);
}
package cn.quantgroup.cashloanflowboss.api.channel.service;
import java.sql.Timestamp;
import java.util.*;
import cn.quantgroup.cashloanflowboss.api.channel.entity.boss.ChannelConf;
import cn.quantgroup.cashloanflowboss.api.channel.entity.clf.ChannelConfiguration;
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.boss.ChannelConfRepository;
import cn.quantgroup.cashloanflowboss.api.channel.repository.clf.ChannelConfigurationRepository;
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.api.user.model.Pagination;
import cn.quantgroup.cashloanflowboss.core.base.Result;
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;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* function:
......@@ -29,39 +36,97 @@ public class ChannelConfService {
@Autowired
private ChannelConfRepository channelConfRepository;
@Autowired
private ChannelConfigurationRepository clfChannelConfigurationRepository;
private ClfChannelConfigurationRepository clfChannelConfigurationRepository;
@Autowired
private ClfCallbackConfigurationRepository clfCallbackConfigurationRepository;
@Autowired
private ClfOrderCallbackRepository clfOrderCallbackRepository;
public Page<ChannelConfiguration> getChannelInfo(Pagination pagination, Integer channelId) {
public Page<ChannelListModel> getChannelInfo(Integer pageNumber, Integer pageSize, Long channelId) {
Page<ChannelConfiguration> page = this.clfChannelConfigurationRepository.findAll((root, criteriaQuery, criteriaBuilder) -> {
Page<ClfChannelConfiguration> page = this.clfChannelConfigurationRepository.findAll((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
// 指定渠道号
if (Objects.nonNull(channelId)) {
predicates.add(criteriaBuilder.equal(root.get("channelId"), 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(pagination.getPageNumber(), pagination.getPageSize()));
}, new PageRequest(pageNumber, pageSize));
return page;
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 Result getChannelConf(Integer channelId) {
public ChannelConfVo getChannelConf(Long channelId) {
ChannelConf channelConf = channelConfRepository.getByChannelId(channelId);
return Result.buildSuccess(ChannelConfUtil.channelConfConvertVOModel(channelConf), "success");
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);
clfOrderCallbackRepository.save(clfOrderCallBackList);
}
return true;
}
}
package cn.quantgroup.cashloanflowboss.api.channel.util;
import java.sql.Timestamp;
import cn.quantgroup.cashloanflowboss.spi.clf.model.KANoticeType;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderCallBack;
import cn.quantgroup.cashloanflowboss.spi.clf.model.CallbackRouter;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfCallbackConfiguration;
import cn.quantgroup.cashloanflowboss.spi.clf.model.EncType;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import cn.quantgroup.cashloanflowboss.api.channel.entity.boss.ChannelConf;
import cn.quantgroup.cashloanflowboss.api.channel.model.boss.ChannelConfAddModel;
import cn.quantgroup.cashloanflowboss.api.channel.model.boss.ChannelConfBaseModel;
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.spi.clf.entity.ClfChannelConfiguration;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import java.util.HashMap;
import java.util.Map;
/**
* function:
* date: 2019/8/2
......@@ -18,35 +27,175 @@ import java.util.Map;
public class ChannelConfUtil {
public static Map<String, Object> channelConfConvertVOModel(ChannelConf channelConf) {
Map<String, Object> vo = new HashMap<>(4);
public static final String channelRoleName = "channel_role";
public static final String channelIdParamName = "channelId";
public static ChannelConfVo channelConfConvertVOModel(ChannelConf channelConf) {
ChannelConfBaseModel channelConfBaseModel = new ChannelConfBaseModel();
BeanUtils.copyProperties(channelConf, channelConfBaseModel);
ChannelConfAddModel channelConfAddModel = new ChannelConfAddModel();
BeanUtils.copyProperties(channelConf, channelConfAddModel);
vo.put("basicInfo", channelConfBaseModel);
vo.put("addInfo", channelConfAddModel);
return vo;
ChannelConfVo channelConfVo = new ChannelConfVo();
channelConfVo.setBasicInfo(channelConfBaseModel);
channelConfVo.setAddInfo(channelConfAddModel);
return channelConfVo;
}
public static ChannelConf voModelConfConvertChannelConf(ChannelConfBaseModel channelConfBaseModel, ChannelConfAddModel channelConfAddModel) {
Map<String, Object> vo = new HashMap<>(4);
public static ChannelConf voModelConfConvertChannelConf(ChannelConfVo channelConfVo) {
ChannelConf channelConf = new ChannelConf();
ChannelConfBaseModel channelConfBaseModel = channelConfVo.getBasicInfo();
ChannelConfAddModel channelConfAddModel = channelConfVo.getAddInfo();
ChannelConf channelConf = new ChannelConf();
BeanUtils.copyProperties(channelConfBaseModel, channelConf);
channelConf.setChannelIp(channelConfAddModel.getChannelIp());
channelConf.setEnvPath(String.format("http://qapi-%s.liangkebang.net/", channelConfBaseModel.getEnv()));
channelConf.setApproveCallBackUrl(channelConfAddModel.getApproveCallBackUrl());
channelConf.setOrderStatusCallBackUrl(channelConfAddModel.getOrderStatusCallBackUrl());
channelConf.setRepayResultCallBackUrl(channelConfAddModel.getRepayResultCallBackUrl());
channelConf.setRepaymentPlanCallBackUrl(channelConfAddModel.getRepaymentPlanCallBackUrl());
channelConf.setCreateTime(new Date());
channelConf.setUpdateTime(new Date());
return channelConf;
}
public static ClfChannelConfiguration convert2ClfChannelConfiguration(ChannelConfBaseModel basicInfo) {
ClfChannelConfiguration channelConfiguration = new ClfChannelConfiguration();
channelConfiguration.setChannelName(basicInfo.getChannelName());
channelConfiguration.setChannelCode(basicInfo.getChannelCode());
channelConfiguration.setRegisteredFrom(basicInfo.getChannelId());
channelConfiguration.setIsActive(true);
channelConfiguration.setIsRequestStandard(true);
channelConfiguration.setEncType(EncType.AES);
channelConfiguration.setAesKey(basicInfo.getAesKey());
channelConfiguration.setMd5Key(basicInfo.getMd5Key());
channelConfiguration.setSpiderCenterChannelCode(basicInfo.getRiskCode());
channelConfiguration.setSpiderCenterMerchantChannelCode(basicInfo.getAuthCode());
return channelConfiguration;
}
public static ClfCallbackConfiguration convert2ClfCallbackConfiguration(ChannelConfBaseModel basicInfo) {
ClfCallbackConfiguration clfCallbackConfiguration = new ClfCallbackConfiguration();
clfCallbackConfiguration.setChannelId(basicInfo.getChannelId());
clfCallbackConfiguration.setIsLoanMakeup(false);
clfCallbackConfiguration.setIsRepayMakeup(false);
clfCallbackConfiguration.setLoanMakeupStrategy("");
clfCallbackConfiguration.setRepayMakeupStrategy("");
clfCallbackConfiguration.setIsActive(true);
clfCallbackConfiguration.setOnlyNewUser(false);
clfCallbackConfiguration.setCallbackServiceName(basicInfo.getChannelCode());
clfCallbackConfiguration.setCallbackNoPushProgress("");
clfCallbackConfiguration.setPreProgress("");
clfCallbackConfiguration.setRetryMaxTimes(5L);
clfCallbackConfiguration.setCallbackRouter(CallbackRouter.API);
return clfCallbackConfiguration;
}
public static List<ClfOrderCallBack> convert2ClfOrderCallback(Long channelId, ChannelConfAddModel addModel) {
List<ClfOrderCallBack> list = new ArrayList<>();
if (StringUtils.isNotEmpty(addModel.getApproveCallBackUrl())) {
//审批
ClfOrderCallBack clfOrderCallBack1 = new ClfOrderCallBack();
clfOrderCallBack1.setCallbackStatus(KANoticeType.FUAD_ASSIFN_SUCC);
clfOrderCallBack1.setRegisteredFrom(channelId);
clfOrderCallBack1.setCallbackUrl(addModel.getApproveCallBackUrl());
clfOrderCallBack1.setIsActive(true);
clfOrderCallBack1.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack1);
ClfOrderCallBack clfOrderCallBack2 = new ClfOrderCallBack();
clfOrderCallBack2.setCallbackStatus(KANoticeType.REJECT);
clfOrderCallBack2.setRegisteredFrom(channelId);
clfOrderCallBack2.setCallbackUrl(addModel.getApproveCallBackUrl());
clfOrderCallBack2.setIsActive(true);
clfOrderCallBack2.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack2);
}
if (StringUtils.isNotEmpty(addModel.getOrderStatusCallBackUrl())) {
// 状态
ClfOrderCallBack clfOrderCallBack0 = new ClfOrderCallBack();
clfOrderCallBack0.setCallbackStatus(KANoticeType.CREDIT_SUCC);
clfOrderCallBack0.setRegisteredFrom(channelId);
clfOrderCallBack0.setCallbackUrl(addModel.getOrderStatusCallBackUrl());
clfOrderCallBack0.setIsActive(true);
clfOrderCallBack0.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack0);
ClfOrderCallBack clfOrderCallBack3 = new ClfOrderCallBack();
clfOrderCallBack3.setCallbackStatus(KANoticeType.WITHDRAW);
clfOrderCallBack3.setRegisteredFrom(channelId);
clfOrderCallBack3.setCallbackUrl(addModel.getOrderStatusCallBackUrl());
clfOrderCallBack3.setIsActive(true);
clfOrderCallBack3.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack3);
ClfOrderCallBack clfOrderCallBack4 = new ClfOrderCallBack();
clfOrderCallBack4.setCallbackStatus(KANoticeType.FUND_SUCC);
clfOrderCallBack4.setRegisteredFrom(channelId);
clfOrderCallBack4.setCallbackUrl(addModel.getOrderStatusCallBackUrl());
clfOrderCallBack4.setIsActive(true);
clfOrderCallBack4.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack4);
ClfOrderCallBack clfOrderCallBack5 = new ClfOrderCallBack();
clfOrderCallBack5.setCallbackStatus(KANoticeType.FUND_FAIL);
clfOrderCallBack5.setRegisteredFrom(channelId);
clfOrderCallBack5.setCallbackUrl(addModel.getOrderStatusCallBackUrl());
clfOrderCallBack5.setIsActive(true);
clfOrderCallBack5.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack5);
ClfOrderCallBack clfOrderCallBack6 = new ClfOrderCallBack();
clfOrderCallBack6.setCallbackStatus(KANoticeType.FUND_WITHDRAW_SUCC);
clfOrderCallBack6.setRegisteredFrom(channelId);
clfOrderCallBack6.setCallbackUrl(addModel.getOrderStatusCallBackUrl());
clfOrderCallBack6.setIsActive(true);
clfOrderCallBack6.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack6);
ClfOrderCallBack clfOrderCallBack7 = new ClfOrderCallBack();
clfOrderCallBack7.setCallbackStatus(KANoticeType.CANCEL_LOAN);
clfOrderCallBack7.setRegisteredFrom(channelId);
clfOrderCallBack7.setCallbackUrl(addModel.getOrderStatusCallBackUrl());
clfOrderCallBack7.setIsActive(true);
clfOrderCallBack7.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack7);
ClfOrderCallBack clfOrderCallBack8 = new ClfOrderCallBack();
clfOrderCallBack8.setCallbackStatus(KANoticeType.CANCEL_AFTER_LOAN);
clfOrderCallBack8.setRegisteredFrom(channelId);
clfOrderCallBack8.setCallbackUrl(addModel.getOrderStatusCallBackUrl());
clfOrderCallBack8.setIsActive(true);
clfOrderCallBack8.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack8);
ClfOrderCallBack clfOrderCallBack9 = new ClfOrderCallBack();
clfOrderCallBack9.setCallbackStatus(KANoticeType.ALL_REPAID);
clfOrderCallBack9.setRegisteredFrom(channelId);
clfOrderCallBack9.setCallbackUrl(addModel.getOrderStatusCallBackUrl());
clfOrderCallBack9.setIsActive(true);
clfOrderCallBack9.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack9);
}
if (StringUtils.isNotEmpty(addModel.getRepaymentPlanCallBackUrl())) {
ClfOrderCallBack clfOrderCallBack10 = new ClfOrderCallBack();
clfOrderCallBack10.setCallbackStatus(KANoticeType.REPAYMENT);
clfOrderCallBack10.setRegisteredFrom(channelId);
clfOrderCallBack10.setCallbackUrl(addModel.getRepaymentPlanCallBackUrl());
clfOrderCallBack10.setIsActive(true);
clfOrderCallBack10.setCreatedAt(new Timestamp(System.currentTimeMillis()));
list.add(clfOrderCallBack10);
}
return list;
}
}
package cn.quantgroup.cashloanflowboss.api.order.controller;
import cn.quantgroup.cashloanflowboss.api.order.model.ApproveVo;
import cn.quantgroup.cashloanflowboss.api.order.service.OrderService;
import cn.quantgroup.cashloanflowboss.core.annotation.ChannelIdInit;
import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRole;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
* function:
* date: 2019/8/8
* @author: suntao
*/
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@ChannelIdInit
@CheckChannelRole
@GetMapping("/info")
public Result getOrders(Long channelId, String channelOrderNumber, Integer pageNumber, Integer pageSize) {
return Result.buildSuccess(orderService.getOrders(channelId, channelOrderNumber, pageNumber, pageSize));
}
@ChannelIdInit
@CheckChannelRole
@PostMapping("/approve")
public Result approveOpt(@RequestBody @Valid ApproveVo approveVo) {
return Result.buildSuccess(orderService.approveOpt(approveVo));
}
}
package cn.quantgroup.cashloanflowboss.api.order.model;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* function:
* date: 2019/8/8
*
* @author: suntao
*/
@Data
public class ApproveVo {
@NotNull(message = "审批,订单号不能为空")
private String channelOrderNumber;
@NotNull(message = "审批,金额不能为空")
private String amount;
@NotNull(message = "审批,期数不能为空")
private Integer period;
@NotNull(message = "审批,资金类型不能为空")
private Integer fundType;
@NotNull(message = "审批,期望mock结果不能为空")
private Boolean isPass;
}
package cn.quantgroup.cashloanflowboss.api.order.model;
import lombok.Data;
/**
* function:
* date: 2019/8/8
*
* @author: suntao
*/
@Data
public class OrderVo {
private Long id;
private Long channelId;
private String channelOrderNumber;
private Long createdAt;
private String status;
/**
* [ {action:"audit",name:"审核"},{},{}... ]
*/
private String opt;
private String message;
@Data
public static class OptButton {
private String action;
private String name;
}
public enum OptButtonAction {
audit("审批"),
cancel("贷前关单"),
pay_succ("放款成功"),
pay_fail("放款失败"),
withdraw2_succ("二次提现成功"),
cancel_after("贷后关单");
OptButtonAction(String desc) {
this.desc = desc;
}
private String desc;
public String getDesc(){
return this.desc;
}
}
}
package cn.quantgroup.cashloanflowboss.api.order.service;
import cn.quantgroup.cashloanflowboss.api.channel.entity.boss.ChannelConf;
import cn.quantgroup.cashloanflowboss.api.channel.repository.boss.ChannelConfRepository;
import cn.quantgroup.cashloanflowboss.api.order.model.ApproveVo;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderVo;
import cn.quantgroup.cashloanflowboss.api.order.util.OrderUtil;
import cn.quantgroup.cashloanflowboss.api.user.model.UserSessionInfo;
import cn.quantgroup.cashloanflowboss.api.user.service.UserSessionService;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.clf.repository.ClfOrderMappingRepository;
import cn.quantgroup.cashloanflowboss.spi.clotho.service.ClothoCenter;
import cn.quantgroup.cashloanflowboss.spi.user.service.XyqbUserService;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import cn.quantgroup.user.retbean.XUser;
import lombok.extern.slf4j.Slf4j;
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.*;
/**
* function:
* date: 2019/8/8
*
* @author: suntao
*/
@Slf4j
@Service
public class OrderService {
@Autowired
private UserSessionService userSessionService;
@Autowired
private ChannelConfRepository channelConfRepository;
@Autowired
private ClfOrderMappingRepository clfOrderMappingRepository;
@Autowired
private XyqbUserService xyqbUserService;
@Autowired
private ClothoCenter clothoCenter;
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());
OrderVo.OptButton button = new OrderVo.OptButton();
button.setAction(OrderVo.OptButtonAction.audit.name());
button.setName(OrderVo.OptButtonAction.audit.getDesc());
orderVo.setStatus(OrderVo.OptButtonAction.audit.getDesc());
orderVo.setOpt(JSONTools.serialize(button));
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;
}
UserSessionInfo userSessionInfo = userSessionService.findUserSessionInfo();
if (!userSessionInfo.getChannelId().equals(orderMapping.getRegisteredFrom())) {
}
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 fundType = approveVo.getFundType();
Integer fundId;
if (fundType == 0) {
fundId = channelConf.getFundId();
} else {
fundId = channelConf.getP2pFundId();
}
String fundFormat = String.format(OrderUtil.financeProductsFormat, approveVo.getAmount(), approveVo.getAmount(),
approveVo.getPeriod(), fundId);
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.getChannelOrderNo());
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)) {
return true;
} else {
return false;
}
}
}
package cn.quantgroup.cashloanflowboss.api.order.util;
/**
* function:
* date: 2019/8/8
*
* @author: suntao
*/
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\"}]}]}]";
}
package cn.quantgroup.cashloanflowboss.api.test.controller;
import cn.quantgroup.cashloanflowboss.api.user.entity.boss.User;
import cn.quantgroup.cashloanflowboss.api.user.service.UserService;
import cn.quantgroup.cashloanflowboss.api.user.model.UserSessionInfo;
import cn.quantgroup.cashloanflowboss.api.user.service.UserSessionService;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -14,11 +14,11 @@ import org.springframework.web.bind.annotation.RestController;
public class TestController {
@Autowired
private UserService userService;
private UserSessionService userSessionService;
@GetMapping("/user/info")
public Result findUserFromSession() {
User currentUser = userService.findCurrentUser();
return new Result<>(ApplicationStatus.SUCCESS, currentUser);
UserSessionInfo userSessionInfo = userSessionService.findUserSessionInfo();
return new Result<>(ApplicationStatus.SUCCESS, userSessionInfo);
}
}
package cn.quantgroup.cashloanflowboss.api.user.entity.boss;
import cn.quantgroup.cashloanflowboss.core.persistence.Primary;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
@Data
@Entity
@Table(name = "channel_user")
public class ChannelUser extends Primary {
@Column(name = "channel_id")
private Long channelId;
@Column(name = "user_id")
private Long userId;
}
package cn.quantgroup.cashloanflowboss.api.user.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
@AllArgsConstructor
public class RoleInfo {
private Long roleId;
private String roleName;
}
package cn.quantgroup.cashloanflowboss.api.user.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
@AllArgsConstructor
public class UserInfo {
private Long userId;
private String userName;
}
package cn.quantgroup.cashloanflowboss.api.user.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
@AllArgsConstructor
public class UserSessionInfo {
private String userName;
private String roleName;
private UserInfo userInfo;
private RoleInfo roleInfo;
private Long channelId;
}
package cn.quantgroup.cashloanflowboss.api.user.repository.boss;
import cn.quantgroup.cashloanflowboss.api.user.entity.boss.ChannelUser;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
/**
* Created by WeiWei on 2019/7/22.
*/
@Repository
public interface ChannelUserRepository extends PagingAndSortingRepository<ChannelUser, String> {
ChannelUser findByUserId(Long userId);
}
package cn.quantgroup.cashloanflowboss.api.user.service;
import cn.quantgroup.cashloanflowboss.api.user.entity.boss.ChannelUser;
import cn.quantgroup.cashloanflowboss.api.user.repository.boss.ChannelUserRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class ChannelUserService {
@Autowired
private ChannelUserRepository channelUserRepository;
public ChannelUser findChannelUserByUserId(Long userId) {
return channelUserRepository.findByUserId(userId);
}
}
......@@ -2,6 +2,7 @@ package cn.quantgroup.cashloanflowboss.api.user.service;
import cn.quantgroup.cashloanflowboss.api.user.dictionary.UserStatus;
import cn.quantgroup.cashloanflowboss.api.user.entity.boss.User;
import cn.quantgroup.cashloanflowboss.api.user.model.UserSessionInfo;
import cn.quantgroup.cashloanflowboss.api.user.repository.boss.UserRepository;
import cn.quantgroup.cashloanflowboss.core.asserts.Assert;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationDictionary;
......@@ -137,12 +138,4 @@ public class UserService {
}
public User findCurrentUser() {
HttpSession session = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getSession();
Assert.isNull(session.getAttribute(ApplicationDictionary.USER_KEY), ApplicationStatus.INVALID_USER);
User user = JSONTools.deserialize(String.valueOf(session.getAttribute(ApplicationDictionary.USER_KEY)), new TypeReference<User>() {
});
return user;
}
}
package cn.quantgroup.cashloanflowboss.api.user.service;
import cn.quantgroup.cashloanflowboss.api.role.entity.boss.Permission;
import cn.quantgroup.cashloanflowboss.api.role.entity.boss.Role;
import cn.quantgroup.cashloanflowboss.api.role.service.RoleService;
import cn.quantgroup.cashloanflowboss.api.user.entity.boss.ChannelUser;
import cn.quantgroup.cashloanflowboss.api.user.entity.boss.User;
import cn.quantgroup.cashloanflowboss.api.user.model.RoleInfo;
import cn.quantgroup.cashloanflowboss.api.user.model.UserInfo;
import cn.quantgroup.cashloanflowboss.api.user.model.UserSessionInfo;
import cn.quantgroup.cashloanflowboss.component.security.Authority;
import cn.quantgroup.cashloanflowboss.core.asserts.Assert;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationDictionary;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import com.fasterxml.jackson.core.type.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpSession;
import java.util.Arrays;
@Slf4j
@Service
public class UserSessionService {
@Autowired
private RoleService roleService;
@Autowired
private ChannelUserService channelUserService;
public void setUserSessionInfo(User user) {
//set user,role,channel or permission info
Role role = roleService.findRoleByUserId(user.getId());
String roleName = null, userName = user.getUsername();
Long roleId = null, channelId = null, userId = user.getId();
if (null != role) {
roleName = role.getName();
roleId = role.getId();
}
ChannelUser channelUser = channelUserService.findChannelUserByUserId(userId);
if (null != channelUser) {
channelId = channelUser.getChannelId();
}
UserSessionInfo userSessionInfo = UserSessionInfo.builder()
.roleInfo(RoleInfo.builder().roleId(roleId).roleName(roleName).build())
.userInfo(UserInfo.builder().userId(userId).userName(userName).build())
.channelId(channelId)
.build();
HttpSession session = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getSession();
session.setAttribute(ApplicationDictionary.USER_KEY, JSONTools.serialize(user));
//query user role info
session.setAttribute(ApplicationDictionary.USER_KEY, JSONTools.serialize(userSessionInfo));
//UserSessionInfo.builder()
// .userName(user.getUsername())
// .roleName()
Permission permission = new Permission();
permission.setId("Log.logout");
permission.setAuthorities(Arrays.asList(Authority.READ));
session.setAttribute(ApplicationDictionary.SECURITY_KEY, JSONTools.serialize(Arrays.asList(permission)));
}
public UserSessionInfo findUserSessionInfo() {
HttpSession session = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getSession();
Assert.isNull(session.getAttribute(ApplicationDictionary.USER_KEY), ApplicationStatus.INVALID_USER);
UserSessionInfo userSessionInfo = JSONTools.deserialize(String.valueOf(session.getAttribute(ApplicationDictionary.USER_KEY)), new TypeReference<UserSessionInfo>() {
});
return userSessionInfo;
}
......
......@@ -37,6 +37,6 @@ public @interface EnableSecurity {
*
* @return
*/
int order() default Ordered.LOWEST_PRECEDENCE;
int order() default Ordered.HIGHEST_PRECEDENCE;
}
package cn.quantgroup.cashloanflowboss.core.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* function:
* date: 2019/8/6
*
* @author: suntao
*/
@Target({METHOD})
@Retention(RUNTIME)
public @interface ChannelIdInit {
}
package cn.quantgroup.cashloanflowboss.core.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
* function:
* date: 2019/8/6
*
* @author: suntao
*/
@Target({METHOD})
@Retention(RUNTIME)
public @interface CheckChannelRole {
boolean isObjParam() default false;
Class paramClazz() default Object.class;
}
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.user.model.UserSessionInfo;
import cn.quantgroup.cashloanflowboss.api.user.service.UserSessionService;
import cn.quantgroup.cashloanflowboss.core.annotation.ChannelIdInit;
import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRole;
import cn.quantgroup.cashloanflowboss.core.base.BossPageImpl;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.CodeSignature;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* function:
* date: 2019/8/6
*
* @author: suntao
*/
@Slf4j
@Component
@Aspect
@Order(Ordered.LOWEST_PRECEDENCE)
public class RoleLoadAspect {
@Autowired
private UserSessionService userSessionService;
@Pointcut("execution(* cn.quantgroup.cashloanflowboss.api.channel.controller.*.*(..))")
private void channelController() {}
@Pointcut("execution(* cn.quantgroup.cashloanflowboss.api.order.controller.*.*(..))")
private void orderController() {}
@Pointcut("channelController() || orderController() ")
private void doSomeRole() {}
@Around(value = "doSomeRole()")
public Object around(ProceedingJoinPoint pjp) {
Object[] args = pjp.getArgs();
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
Method method = methodSignature.getMethod();
// if ("login".equals(method.getName())) {
// try {
// return pjp.proceed(args);
// } catch (Throwable throwable) {
// log.error("请求失败,e={}", ExceptionUtils.getStackTrace(throwable));
// return Result.buildFial();
// }
// }
// 如果是渠道用户登陆 默认加载channelId
ChannelIdInit annotation = method.getAnnotation(ChannelIdInit.class);
UserSessionInfo userSessionInfo = userSessionService.findUserSessionInfo();
final Long channelIdInSession = userSessionInfo.getChannelId();
if (annotation != null && ChannelConfUtil.channelRoleName.equals(userSessionInfo.getRoleInfo().getRoleName())) {
String[] paramNames = ((CodeSignature)pjp.getSignature()).getParameterNames();
for (int i = 0; i < paramNames.length; i++) {
if (ChannelConfUtil.channelIdParamName.equals(paramNames[i])) {
args[i] = channelIdInSession;
}
}
}
// 如果是渠道用户登陆,参数中channelId 不是登陆用户channelId,返回 拒绝请求
CheckChannelRole checkChannelRole = method.getAnnotation(CheckChannelRole.class);
if (checkChannelRole != null && ChannelConfUtil.channelRoleName.equals(userSessionInfo.getRoleInfo().getRoleName())) {
Integer requestChannelId = -1;
if (!checkChannelRole.isObjParam()) {
String[] paramNames = ((CodeSignature)pjp.getSignature()).getParameterNames();
for (int i = 0; i < paramNames.length; i++) {
// 是简单类型,多个参数 直接参数channelId
if (ChannelConfUtil.channelIdParamName.equals(paramNames[i])) {
// 找到channelId是第几个参数 i
Object requestChannelIdObj = args[i];
if (requestChannelIdObj == null) {
log.info("[CheckChannelRole]无channelId数据");
return Result.buildFial(ApplicationStatus.ARGUMENT_VALID_EXCEPTION);
}
requestChannelId = Integer.valueOf(String.valueOf(requestChannelIdObj));
if (requestChannelId != channelIdInSession.intValue()) {
log.info("[CheckChannelRole]渠道用户,登陆channelId与查询channelId不是同一个");
return Result.buildFial(ApplicationStatus.INVALID_AUTHORITY);
}
}
}
} else {
Class paramClazz = checkChannelRole.paramClazz();
if (paramClazz == ChannelConfVo.class) {
ChannelConfVo confVo = (ChannelConfVo) args[0];
final Long channelIdTemp = confVo.getBasicInfo().getChannelId();
if (channelIdTemp == null) {
log.info("[CheckChannelRole]无channelId数据");
return Result.buildFial(ApplicationStatus.ARGUMENT_VALID_EXCEPTION);
}
requestChannelId = channelIdTemp.intValue();
}
}
if (requestChannelId != channelIdInSession.intValue()) {
log.info("[CheckChannelRole]渠道用户,登陆channelId与查询channelId不是同一个");
return Result.buildFial(ApplicationStatus.INVALID_AUTHORITY);
}
}
// ======================================== CheckChannelRole end ==========================================
try {
return pjp.proceed(args);
} catch (Throwable throwable) {
log.error("请求失败,e={}", ExceptionUtils.getStackTrace(throwable));
return Result.buildFial();
}
}
}
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;
}
}
......@@ -68,6 +68,21 @@ public class Result<T> {
return new Result(ApplicationStatus.FAILURE, data);
}
@SuppressWarnings("unchecked")
public static<T> Result buildFial(String message) {
return new Result(ApplicationStatus.FAILURE, null, message);
}
@SuppressWarnings("unchecked")
public static<T> Result buildFial() {
return new Result(ApplicationStatus.FAILURE, null, null);
}
@SuppressWarnings("unchecked")
public static<T> Result buildFial(ApplicationStatus applicationStatus) {
return new Result(applicationStatus, null, null);
}
@SuppressWarnings("unchecked")
public static<T> Result buildFial(T data, String message) {
return new Result(ApplicationStatus.FAILURE, data, message);
......
......@@ -20,29 +20,28 @@ import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
@Configuration
@EntityScan(basePackages = {"cn.quantgroup.cashloanflowboss.api.*.entity.clf"})
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"cn.quantgroup.cashloanflowboss.api.*.repository.clf"},
@EnableJpaRepositories(basePackages = {"cn.quantgroup.cashloanflowboss.spi.clf.repository"},
entityManagerFactoryRef = "clfEntityManager",
transactionManagerRef = "clfTransactionManager")
public class ClfDSConfig {
@Value("${data.boss.url}")
@Value("${data.clf.url}")
private String jdbcUrl;
@Value("${data.boss.password}")
@Value("${data.clf.password}")
private String password;
@Value("${data.boss.username}")
@Value("${data.clf.username}")
private String user;
private String uniquename = "bossDS";
private String uniquename = "clfDS";
@Value("${data.boss.pool-size}")
@Value("${data.clf.pool-size}")
private Integer poolSize;
@Bean(name = "clfDataSource")
@ConfigurationProperties(prefix = "data.boss")
@ConfigurationProperties(prefix = "data.clf")
public DataSource createDataSource() {
DruidDataSource source = DruidDataSourceBuilder.create().build();
source.setMaxActive(200);
......@@ -63,7 +62,7 @@ public class ClfDSConfig {
public LocalContainerEntityManagerFactoryBean entityManager(EntityManagerFactoryBuilder builder) {
return builder.dataSource(createDataSource())
.packages("cn.quantgroup.cashloanflowboss.api.*.entity.clf")
.packages("cn.quantgroup.cashloanflowboss.spi.clf.entity")
.persistenceUnit(uniquename)
.build();
}
......
package cn.quantgroup.cashloanflowboss.spi.clf.entity;
import cn.quantgroup.cashloanflowboss.spi.clf.model.CallbackRouter;
import lombok.*;
import javax.persistence.*;
import java.io.Serializable;
/**
* Created by liqing on 2017/5/5 0005.
*/
@Setter
@Getter
@Entity
@Table(name = "callback_configuration",catalog = "cash_loan_flow")
public class ClfCallbackConfiguration implements Serializable {
private static final long serialVersionUID = -1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "channel_id")
private Long channelId;
@Column(name = "is_loan_makeup")
private Boolean isLoanMakeup;
@Column(name = "is_repay_makeup")
private Boolean isRepayMakeup;
@Column(name = "loan_makeup_strategy")
private String loanMakeupStrategy;
@Column(name = "repay_makeup_strategy")
private String repayMakeupStrategy;
@Column(name = "is_active")
private Boolean isActive;
@Column(name = "only_new_user")
private Boolean onlyNewUser;
@Column(name = "callback_service_name")
private String callbackServiceName;
@Column(name = "callback_no_push_progress")
private String callbackNoPushProgress;
@Column(name = "pre_progress")
private String preProgress;
@Column(name = "retry_max_times")
private Long retryMaxTimes;
@Enumerated(EnumType.ORDINAL)
@Column(name = "callback_router")
private CallbackRouter callbackRouter;
}
package cn.quantgroup.cashloanflowboss.api.channel.entity.clf;
package cn.quantgroup.cashloanflowboss.spi.clf.entity;
import cn.quantgroup.cashloanflowboss.api.channel.model.clf.EncType;
import cn.quantgroup.cashloanflowboss.spi.clf.model.EncType;
import lombok.Data;
import javax.persistence.*;
......@@ -13,7 +13,7 @@ import java.sql.Timestamp;
@Data
@Entity
@Table(name = "channel_configuration", catalog = "cash_loan_flow")
public class ChannelConfiguration implements Serializable {
public class ClfChannelConfiguration implements Serializable {
private static final long serialVersionUID = -1L;
@Id
......
package cn.quantgroup.cashloanflowboss.spi.clf.entity;
import cn.quantgroup.cashloanflowboss.spi.clf.model.KANoticeType;
import cn.quantgroup.cashloanflowboss.spi.clf.model.LoanProgress;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* Created by 11 on 2016/11/29.
*/
@Data
@Entity
@Table(name = "order_callback")
public class ClfOrderCallBack implements Serializable{
private static final long serialVersionUID = -1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "loan_id")
private Long loanId;
@Column(name = "progress")
private LoanProgress progress;
@Column(name = "callback_status")
@Enumerated(EnumType.STRING)//保存字面值到数据库
private KANoticeType callbackStatus;
@Column(name = "registered_from")
private Long registeredFrom;
@Column(name = "callback_url")
private String callbackUrl;
@Column(name = "is_active")
private Boolean isActive = Boolean.TRUE;
@Column(name = "created_at")
private Timestamp createdAt = new Timestamp(System.currentTimeMillis());
}
\ No newline at end of file
package cn.quantgroup.cashloanflowboss.spi.clf.entity;
import lombok.Data;
import javax.persistence.*;
import java.sql.Timestamp;
/**
*
*/
@Data
@Entity
@Table(name = "order_mapping",catalog = "cash_loan_flow" )
public class ClfOrderMapping {
private static final long serialVersionUID = -1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "channel_order_no")
private String channelOrderNo;
@Column(name = "channel_payment_no")
private String channelPaymentNo;
@Column(name = "apply_no")
private String applyNo;
@Column(name = "loan_id")
private Long loanId;
@Column(name = "registered_from")
private Long registeredFrom;
@Column(name = "order_extend")
private String orderExtend;
@Column(name = "qg_user_id")
private Long qgUserId;
@Column(name = "payment_at")
private Timestamp paymentAt;
@Column(name = "created_at")
private Timestamp createdAt;
@Column(name = "updated_at")
private Timestamp updatedAt;
}
package cn.quantgroup.cashloanflowboss.spi.clf.model;
/**
* Created with suntao on 2018/11/14
*/
public enum CallbackRouter {
API,
COMMON
}
package cn.quantgroup.cashloanflowboss.api.channel.model.clf;
package cn.quantgroup.cashloanflowboss.spi.clf.model;
/**
* Created by liqing on 2017/4/26 0026.
......
package cn.quantgroup.cashloanflowboss.spi.clf.model;
/**
* 对应 MQ 消息通知类型 的枚举类,在数据库中保存,和QuotaNoticeType 独立,保证xyqb改动的灵活性
* Created with suntao on 2018/4/15
*/
public enum KANoticeType {
CREDIT_SUCC("CREDIT_SUCC", "授信成功"),//0
CREDIT_FAIL("CREDIT_FAIL", "授信失败"),//1
FUAD_ASSIFN_SUCC("FUAD_ASSIFN_SUCC", "分配资金方成功"),//2
FUAD_ASSIFN_FAIL("FUAD_ASSIFN_FAIL", "分配资金方失败"),//3
BIND_SUCC("BIND_SUCC", "绑卡成功"),//4
BIND_FAIL("BIND_FAIL", "绑卡失败"),//5
WAITING_FUND("WAITING_FUND", "进件给资金方成功,等待放款"),//6
FUND_SUCC("FUND_SUCC", "放款成功"),//7
FUND_WITHDRAW_SUCC("FUND_WITHDRAW_SUCC", "放款提现成功,存管提现成功"),//8
FUND_FAIL("FUND_FAIL", "放款失败"),//9
REPAYMENT("REPAYMENT", "还款成功"),//10
ALL_REPAID("ALL_REPAID", "结清"),//11
QUOTA_INCREASE("QUOTA_INCREASE", "额度提升"),//12
QUOTA_DECREASE("QUOTA_DECREASE", "额度下降"),//13
QUOTA_FREEZE("QUOTA_FREEZE", "风控额度冻结"),//14
WITHDRAW("WITHDRAW", "用户提现额度冻结"),//WITHDRAW,创建loanId,//15(BIND_SUCC 同时发送)
REJECT("REJECT", "风控审核不通过"),//16
RISK_PASS("RISK_PASS", "风控审核通过"),//17
INCREASE_CHANGE("INCREASE_CHANGE", "利率调整"),//18
CANCEL_LOAN("CANCEL_LOAN", "关闭订单"),//19
COMPENSATORY("COMPENSATORY", "代偿"),//20
DROP_COURSE("DROP_COURSE", "退课代偿"),//21
CANCEL_AFTER_LOAN("CANCEL_AFTER_LOAN", "贷后关闭订单"),//22
ADD_CARD_SUCCESS("ADD_CARD_SUCCESS", "添加银行卡成功,非提现页面绑卡"), //23
REPAY_FAIL("REPAY_FAIL", "还款失败"), //24
UNKNOWN("UNKNOWN", "没有逻辑意义的数据库兼容的值"),
RP_INIT_F_SUCC("REPAYMENT_INIT_FUND_SUCC", "放款成功推送还款计划"),
APPROVE_ING("APPROVE_ING", "审批中"),
PAY_ING("PAY_ING", "放款中"),
TEST("TEST", "test");
private String type;
private String desc;
KANoticeType(String type, String desc) {
this.type = type;
this.desc = desc;
}
public static KANoticeType getOrdinalValue(Integer ordinal) {
KANoticeType[] values = values();
for (int i = 0; i < values.length; i++) {
if (values[i].ordinal() == ordinal) {
return values[i];
}
}
return null;
}
public String getType() {
return this.type;
}
public String getDesc() {
return this.desc;
}
}
package cn.quantgroup.cashloanflowboss.spi.clf.model;
import com.google.common.collect.Sets;
import java.util.Set;
/**
* Created by Miraculous on 15/7/12.
*/
public enum LoanProgress {
/**
* 不会被持久化到数据库
*/
USERINFO_INCOMPLETE("用户未填写个人信息"),//0
USER_INFORMATION_INCOMPLETE("用户未填写贷款信息"),//1
USER_AUTHENTICATION_INCOMPLETE("用户授权信息未全部完成"),//2
USER_AUTHENTICATION_COMPLETE("授权状态完成"),//3
FURTHER_INFORMATION_INCOMPLETE("用户补充资料未完成"),//4
PRE_SCREENING("初审中"),//5
PRE_SCREENING_REJECT("初审拒绝"),//6
FINAL_SCREENING("终审中"),//7
FINAL_SCREENING_REJECT("终审拒绝"),//8
LOAN_APPLICATION_MANIFEST_COMPLETE("借款清单生成完成"),//9
BIND_BANKCARD("确认借款并且去绑卡"),//10
BIND_BANKCARD_SUCCESS("绑卡成功"),//11
QUIT_AND_SHOW_REASON("放弃借款"),//12
SIGN_CONTRACT("签订协议"),//13
FUND_TRANSFER("打款"),//14
CHECK_REPAYMENT_PLAN("查看还款计划"),//15
LOAN_COMPLETE("借款完成"),//16
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,
ADDRESS_COMPLETE("地址填写完毕,去绑卡"), // 24
BEIYIN_USERINFO_INCOMPLETE("北银消费-用户未填写个人信息"),//25
BEIYIN_USER_FILE_INCOMPLETE("北银消费-用户未上传文件"),//26
BEIYIN_SCREENING("北银消费-审批中"),//27
BEIYIN_SCREENING_FAILED("北银消费-审批失败"),//28
BEIYIN_SCREENING_PASSED("北银消费-审批通过"),//29
BEIYIN_LOAN_COMPLETE("北银消费-借款完成"),//30
BAITIAO_AUTHENTICATION_TAOBAO("白条-淘宝授权"),//31
BAITIAO_AUTHENTICATION_MOBILE("白条-手机运营商授权"),//32
BAITIAO_SCREENING("白条-审核中"),//33
BAITIAO_FILTER_PASSED("白条-初筛通过"),//34
BAITIAO_SCREENING_FAILED("白条-审核拒绝"),//35
BAITIAO_SCREENING_PASSED("白条-审核通过"),//36
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
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("占位"),
// 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("占位"),
// 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("占位"),
// 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("占位"),
// 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("占位"),
/**
* 资金方相关
*/
// 等待资金方放款 : 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("占位"),
JD_BANDCARD_FAIL("京东绑卡失败")//110 京东绑卡失败状态
;
private String description;
LoanProgress(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return description;
}
/**
* 获取审核拒绝状态
* @return
*/
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);
}
}
package cn.quantgroup.cashloanflowboss.spi.clf.repository;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfCallbackConfiguration;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* function:
* date: 2019/8/7
*
* @author: suntao
*/
public interface ClfCallbackConfigurationRepository extends JpaRepository<ClfCallbackConfiguration, Long> {
}
package cn.quantgroup.cashloanflowboss.api.channel.repository.clf;
package cn.quantgroup.cashloanflowboss.spi.clf.repository;
import cn.quantgroup.cashloanflowboss.api.channel.entity.clf.ChannelConfiguration;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfChannelConfiguration;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface ChannelConfigurationRepository extends PagingAndSortingRepository<ChannelConfiguration, Long>, JpaSpecificationExecutor<ChannelConfiguration> {
public interface ClfChannelConfigurationRepository extends PagingAndSortingRepository<ClfChannelConfiguration, Long>, JpaSpecificationExecutor<ClfChannelConfiguration> {
ClfChannelConfiguration findByRegisteredFrom(Long channelId);
}
package cn.quantgroup.cashloanflowboss.spi.clf.repository;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderCallBack;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* function:
* date: 2019/8/7
*
* @author: suntao
*/
public interface ClfOrderCallbackRepository extends JpaRepository<ClfOrderCallBack, Long> {
}
package cn.quantgroup.cashloanflowboss.spi.clf.repository;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.sql.Timestamp;
import java.util.List;
public interface ClfOrderMappingRepository extends PagingAndSortingRepository<ClfOrderMapping, Long>, JpaSpecificationExecutor<ClfOrderMapping> {
List<ClfOrderMapping> findByChannelOrderNoAndRegisteredFrom(String channelOrderNo, Long registeredFrom);
ClfOrderMapping findByChannelPaymentNoAndRegisteredFrom(String channelOrderNo, Long registeredFrom);
List<ClfOrderMapping> findByApplyNo(String applyNo);
@Query(value = "select * from order_mapping where apply_no =?1 ORDER BY id DESC limit 1", nativeQuery = true)
ClfOrderMapping findByApplyNoLastOne(String applyNo);
ClfOrderMapping findByLoanId(long loanApplicationHistoryId);
ClfOrderMapping findByChannelOrderNoAndChannelPaymentNo(String channelOrderNo, String paymentNo);
@Query(value = "select * from order_mapping where channel_order_no =?1 AND order_extend like ?2 limit 1", nativeQuery = true)
ClfOrderMapping findByChannelOrderNoAndChannelPaymentNoInOrderExtend(String channelOrderNo, String channelPaymentNo);
@Query(value = "select * from order_mapping where loan_id IN ?1 AND registered_from = ?2", nativeQuery = true)
List<ClfOrderMapping> findChannelOrderNoByLoanIdList(List<String> loanIdList, Long registeredFrom);
@Query(value = "select * from order_mapping where channel_order_no = ?1 AND registered_from = ?2 ORDER BY id DESC limit 1", nativeQuery = true)
ClfOrderMapping findByChannelOrderNoAndRegisteredFromLastOne(String channelApplyNo, Long registeredfrom);
@Query(value = "select * from order_mapping where channel_order_no = ?1 ORDER BY id DESC limit 1", nativeQuery = true)
ClfOrderMapping findByChannelOrderNoLastOne(String channelApplyNo);
@Query(value = "select * from order_mapping where loan_id is NULL AND apply_no = ?1", nativeQuery = true)
ClfOrderMapping findByApplyNoAndLoanIdIsNull(String applyNo);
@Query(value = "select * from order_mapping where created_at >?1 and created_at <=?2 and registered_from =?3 and order_extend is null", nativeQuery = true)
List<ClfOrderMapping> findByCreatedAtBeginAndEndAndRegisteredFrom(Timestamp begin, Timestamp end, Long registeredFrom);
@Query(value = "select * from order_mapping where qg_user_id =?1 and registered_from =?2 ORDER BY id DESC limit 1", nativeQuery = true)
ClfOrderMapping findByUserIdAndRegisteredFromLastOne(Long qgUserId, Long registeredFrom);
@Query(value = "select * from order_mapping where apply_no =?1 and registered_from = ?2 ORDER BY id DESC limit 1", nativeQuery = true)
ClfOrderMapping findByApplyNoAndRegisteredFromLastOne(String applyNo, Long registeredFrom);
@Query(value = "select * from order_mapping where qg_user_id =?1 and registered_from = ?2 ORDER BY created_at ASC", nativeQuery = true)
List<ClfOrderMapping> findByQgUserId(Long qgUserId, Long registeredFrom);
// 监控 begin
@Query(value = "select om.registered_from,count(1) from order_mapping om where om.created_at > ?1 AND om.created_at <= ?2 group by om.registered_from", nativeQuery = true)
List<Object[]> findBetweenCreatedAtGroupByRegisteredFrom(Timestamp begin, Timestamp end);
@Query(value = "select count(1) from order_mapping om where om.created_at > ?1 AND om.created_at <= ?2", nativeQuery = true)
Integer findBetweenCreatedAt(Timestamp begin, Timestamp end);
// 监控 end
}
\ No newline at end of file
package cn.quantgroup.cashloanflowboss.spi.clotho.service;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
/**
* function:
* date: 2019/8/9
*
* @author: suntao
*/
@Component
@FeignClient(name = "ClothoServiceCenter", url = "${fund.pay.api-host}", fallback = ClothoCenter.Fallback.class)
public interface ClothoCenter {
@PostMapping(value = "/external/quota/auth_amount_audit/notify", consumes = "application/x-www-form-urlencoded")
String approve(@RequestParam Map approveData);
@Component
class Fallback implements ClothoCenter {
@Override
public String approve(Map approveData) {
return "error";
}
}
}
package cn.quantgroup.cashloanflowboss.spi.model;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
/**
* Created by suntao on 18/01/15.
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class JsonResult<T> implements Serializable {
String ZERO_FILL_TEMPLATE = "%04d";
String SUCCESS_BUSINESS_CODE = "0000";
String SUCCESS_STRING_CODE = "0000";
public static final Long SUCCESS_CODE = 0L;
private String msg = "";
private String code = "0000";
// 业务错误码
private String businessCode = "0000";
private T data = null;
public JsonResult(String msg, Long code, T data) {
this.msg = msg;
this.code = String.format(ZERO_FILL_TEMPLATE, code);
this.data = data;
}
public JsonResult(String msg, Long code, T data, Long businessCode) {
this.msg = msg;
this.code = String.format(ZERO_FILL_TEMPLATE, code);
this.data = data;
this.businessCode = String.format(ZERO_FILL_TEMPLATE, businessCode);
}
/**
* 构造成功的JsonResult
* @param msg String
* @param data Object
* @return JsonResult
*/
@SuppressWarnings("unchecked")
public static<T> JsonResult buildSuccess(String msg, T data) {
return new JsonResult(msg, SUCCESS_CODE, data, 0L);
}
/**
* 构造状态不正确的JsonResult
* @param msg String
* @return JsonResult
*/
@SuppressWarnings("unchecked")
public static JsonResult buildError(String msg) {
return new JsonResult(msg, SUCCESS_CODE, null, 1L);
}
/**
* 构造状态不正确的JsonResult
* @param msg String
* @return JsonResult
*/
@SuppressWarnings("unchecked")
public static<T> JsonResult buildError(String msg, T data) {
return new JsonResult(msg, SUCCESS_CODE, data, 1L);
}
@SuppressWarnings("unchecked")
public static JsonResult buildError(String msg, Long busniessId) {
return new JsonResult(msg, SUCCESS_CODE, null, busniessId);
}
@SuppressWarnings("unchecked")
public static<T> JsonResult buildError(String msg, Long busniessId, T data) {
return new JsonResult(msg, SUCCESS_CODE, data, busniessId);
}
/**
* 是否成功状态
* @return
*/
public boolean isSuccess(){
return SUCCESS_STRING_CODE.equals(this.getCode()) && SUCCESS_BUSINESS_CODE.equals(this.getBusinessCode());
}
public String getMessage() {
return this.msg;
}
@Override
public String toString() {
return JSONTools.serialize(this);
}
}
package cn.quantgroup.cashloanflowboss.spi.user.service;
import cn.quantgroup.user.IUserSdkService;
/**
* Created by Miraculous on 2017/2/15.
*/
public interface UserSysService {
/**
* 获取http调用service
* @return
*/
IUserSdkService getService();
/**
* 获取motan调用service
* @return
*/
IUserSdkService getMotanService();
}
package cn.quantgroup.cashloanflowboss.spi.user.service;
import cn.quantgroup.cashloanflowboss.spi.user.service.UserSysService;
import cn.quantgroup.user.IUserSdkService;
import cn.quantgroup.user.UserSdkServiceFactory;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.impl.client.CloseableHttpClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
/**
* Created by Miraculous on 2017/2/15.
*/
@Service
@Slf4j
public class UserSysServiceImpl implements UserSysService {
@Autowired
@Qualifier("httpClient")
private CloseableHttpClient httpClient;
@Value("${passportapi.http}")
private String passportapiHttp;
private IUserSdkService userSdkService; // http调用sdk
@PostConstruct
private void init() {
userSdkService = UserSdkServiceFactory.generateSDKService(passportapiHttp, httpClient);
}
@Override
public IUserSdkService getService() {
return userSdkService;
}
@Override
public IUserSdkService getMotanService() {
return userSdkService;
}
}
package cn.quantgroup.cashloanflowboss.spi.user.service;
import cn.quantgroup.user.bean.UserInfo;
import cn.quantgroup.user.retbean.XUser;
import cn.quantgroup.user.retbean.XUserDetail;
/**
* Created by Rocky on 2016/6/23.
*/
public interface XyqbUserService {
/**
* 查询用户
*/
XUser findXUserById(Long userId);
/**
* 查询用户detail
*/
XUserDetail findUserDetailByUserId(Long userId);
/**
* get uuid
* @param phoneNo 手机号
* @return String token
*/
String getUuid(String phoneNo);
/**
* 通过手机号码 查询xyqb-user
* @param phoneNo
* @return
*/
XUser findUserByPhoneNo(String phoneNo);
/**
* 判断是否老用户
* @param phoneNo 手机号
* @return 老用户 true;新用户 false
*/
boolean isOldUser(String phoneNo);
/**
* 用户detail信息
* @param uuid
* @return
*/
UserInfo findUserByUuid(String uuid);
}
package cn.quantgroup.cashloanflowboss.spi.user.service;
import cn.quantgroup.cashloanflowboss.spi.util.HttpService;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import cn.quantgroup.cashloanflowboss.utils.MD5Tools;
import cn.quantgroup.user.bean.UserInfo;
import cn.quantgroup.user.retbean.XUser;
import cn.quantgroup.user.retbean.XUserDetail;
import cn.quantgroup.user.vo.UserSysResult;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.*;
/**
* Created by Rocky on 2016/6/23.
*/
@Service
public class XyqbUserServiceImpl implements XyqbUserService {
private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(XyqbUserServiceImpl.class);
@Autowired
private UserSysService userSysService;
@Autowired
private HttpService httpService;
@Value("${passportapi.http}")
private String passportapiHttp;
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* 查询用户
*
* @param userId
* @return XyqbUser
*/
@Override
public XUser findXUserById(Long userId) {
UserSysResult<XUser> userSysResult = userSysService.getService().findUserByUserId(userId);
if (!userSysResult.isSuccess() || userSysResult.getData() == null) {
LOGGER.error("用户不存在,userId=[{}]", userId);
return null;
}
return userSysResult.getData();
}
@Override
public XUserDetail findUserDetailByUserId(Long userId) {
UserSysResult<XUserDetail> userDetailResult = userSysService.getService().findUserDetailByUserId(userId);
if (!userDetailResult.isSuccess() || userDetailResult.getData() == null) {
LOGGER.error("[findUserDetailByUserId_{}]向用户中心查询用户详情失败,userId={},result={}", userId, JSONTools.serialize(userDetailResult));
return null;
}
return userDetailResult.getData();
}
@Override
public String getUuid(String phoneNo) {
if (StringUtils.isEmpty(phoneNo)) {
return null;
}
UserSysResult<XUser> user = userSysService.getService().findUserByPhoneNo(phoneNo);
if (Objects.isNull(user) || Objects.isNull(user.getData())) {
return null;
}
return user.getData().getUuid();
}
@Override
public XUser findUserByPhoneNo(String phoneNo) {
UserSysResult<XUser> xuserResult = userSysService.getService().findUserByPhoneNo(phoneNo);
if (xuserResult == null || xuserResult.getData() == null || !xuserResult.isSuccess()) {
LOGGER.info("[findUserByPhoneNo]用户中心无用户信息,phoneNo={},phoneDd5={}", phoneNo, MD5Tools.md5(phoneNo));
return null;
}
return xuserResult.getData();
}
/**
* 判断是否老用户
*
* @param phoneNo 手机号
* @return 老用户 true;新用户 false
*/
@Override
public boolean isOldUser(String phoneNo) {
UserSysResult<XUser> userData = userSysService.getService().findUserByPhoneNo(phoneNo);
if (userData == null) {
LOGGER.error("[user_isOldUser]查询用户失败, phoneNo={}", phoneNo);
return false;
}
if (userData.getData() == null) {
LOGGER.info("[user_isOldUser]没有查询到用户, phoneNo={}", phoneNo);
return false;
} else {
return true;
}
}
/**
* 用户detail信息
*/
@Override
public UserInfo findUserByUuid(String uuid) {
UserSysResult<UserInfo> userInfo = userSysService.getService().findUserInfoByUuid(uuid);
if (!userInfo.isSuccess() || userInfo.getData() == null) {
return null;
}
return userInfo.getData();
}
}
package cn.quantgroup.cashloanflowboss.spi.util;
import cn.quantgroup.cashloanflowboss.utils.JSONTools;
import com.google.common.base.Charsets;
import com.google.common.base.Predicates;
import com.google.common.collect.Maps;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.ConnectionKeepAliveStrategy;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.AllowAllHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.cookie.Cookie;
import org.apache.http.cookie.CookieOrigin;
import org.apache.http.cookie.CookieSpecProvider;
import org.apache.http.cookie.MalformedCookieException;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.client.StandardHttpRequestRetryHandler;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.impl.cookie.BestMatchSpecFactory;
import org.apache.http.impl.cookie.BrowserCompatSpec;
import org.apache.http.impl.cookie.BrowserCompatSpecFactory;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author suntao
* @time 2019-08
*/
@Service
public class HttpService {
private static final Logger LOGGER = LoggerFactory.getLogger(HttpService.class);
private static final int DEFAULT_TIME_OUT = 60 * 1000; // 超时时间
public String get(String uri) {
return get(uri, null, null);
}
public String get(String uri, Map<String, String> parameters) {
return get(uri, null, parameters);
}
public String get(String uri, Map<String, String> headers, Map<String, String> parameters) {
return doHttp(RequestBuilder.get(), uri, headers, parameters, 0);
}
public String get(String uri, Map<String, String> headers, Map<String, String> parameters, int timeOut) {
return doHttp(RequestBuilder.get(), uri, headers, parameters, timeOut);
}
public String post(String uri) {
return post(uri, null, null);
}
public String post(String uri, Map<String, String> parameters) {
return post(uri, null, parameters);
}
public String post(String uri, Map<String, String> headers, Map<String, String> parameters) {
return post(uri, headers, parameters, 0);
}
public String post(String uri, Map<String, String> headers, Map<String, String> parameters, int timeOut) {
return doHttp(RequestBuilder.post(), uri, headers, parameters, timeOut);
}
public String postJSON(String uri, String jsonParam) {
return postJSON(uri, jsonParam, 0);
}
public String postJSON(String uri, String jsonParam, int timeOut) {
return postJSON(uri, null, jsonParam, timeOut);
}
public String postJSON(String uri, Map<String, String> headers, String jsonParam, int timeOut) {
return doHttp(RequestBuilder.post(), uri, headers, jsonParam, timeOut);
}
/**
* 发送http请求,参数为json串,Content-Type为application/json
* @param requestBuilder
* @param uri
* @param headers
* @param jsonParam
* @param timeOut
* @return
*/
private String doHttp(RequestBuilder requestBuilder, String uri, Map<String, String> headers, String jsonParam, int timeOut) {
if (StringUtils.isEmpty(uri)) {
LOGGER.info("uri cannot be empty, uri:{}", uri);
return null;
}
if (StringUtils.isBlank(jsonParam)){
LOGGER.info("param cannot be empty, param:{}", jsonParam);
return null;
}
String method = requestBuilder.getMethod();
LOGGER.info("{}, uri:[{}], headers:{}, parameters:{}", method, uri, headers, StringUtils.substring(jsonParam, 0, 5000));
HttpEntity httpEntity = null;
CloseableHttpResponse httpResponse = null;
try {
/************** 设置URI **************/
requestBuilder.setUri(uri);
/************** 公共配置 **************/
this.setConfig(requestBuilder, timeOut);
/************** 设置Header **************/
this.setHeader(requestBuilder, headers);
/************** 设置Parameter **************/
requestBuilder.setEntity(new StringEntity(jsonParam, ContentType.APPLICATION_JSON));
/************** 发送请求 **************/
httpResponse = httpClient().execute(requestBuilder.build());
httpEntity = httpResponse.getEntity();
String response = EntityUtils.toString(httpEntity, Charsets.UTF_8);
LOGGER.info("{}, uri:[{}], response:{}", method, uri, StringUtils.substring(response, 0, 200));
return response;
} catch (Exception e) {
LOGGER.error("{}, uri:[{}], headers:{}, parameters:{}, error={}", method, uri, headers, jsonParam, e);
return null;
} finally {
EntityUtils.consumeQuietly(httpEntity);
try {
if(httpResponse != null){
httpResponse.close();
}
} catch (Exception e) {
LOGGER.error("{}, httpResponse.close error", method, e);
}
}
}
/**
* 发送普通http/https请求,参数为map
* @param requestBuilder
* @param uri
* @param headers
* @param parameters
* @param timeOut
* @return
*/
private String doHttp(RequestBuilder requestBuilder, String uri, Map<String, String> headers, Map<String, String> parameters, int timeOut) {
if (StringUtils.isEmpty(uri)) {
LOGGER.info("uri cannot be empty, uri:{}", uri);
return null;
}
String method = requestBuilder.getMethod();
LOGGER.info("{}, uri:[{}], headers:{}, parameters:{}", method, uri, headers, StringUtils.substring(JSONTools.serialize(parameters), 0, 5000));
HttpEntity httpEntity = null;
CloseableHttpResponse httpResponse = null;
try {
/************** 设置URI **************/
requestBuilder.setUri(uri);
/************** 公共配置 **************/
this.setConfig(requestBuilder, timeOut);
/************** 设置Header **************/
this.setHeader(requestBuilder, headers);
/************** 设置Parameter **************/
this.setParameter(requestBuilder, parameters, method);
/************** 发送请求 **************/
httpResponse = httpClient().execute(requestBuilder.build());
httpEntity = httpResponse.getEntity();
String response = EntityUtils.toString(httpEntity, Charsets.UTF_8);
LOGGER.info("{}, uri:[{}], response:{}", method, uri, StringUtils.substring(response, 0, 200));
return response;
} catch (Exception e) {
LOGGER.error("[exception]{}, uri:[{}], headers:{}, parameters:{}, error={}", method, uri, headers, StringUtils.substring(JSONTools.serialize(parameters), 0, 5000), e);
return null;
} finally {
EntityUtils.consumeQuietly(httpEntity);
try {
if(httpResponse == null){
return null;
}
httpResponse.close();
} catch (Exception e) {
LOGGER.error("{}, httpResponse.close error", method, e);
}
}
}
/**
* Create HttpClient
*
* @return
* @throws KeyStoreException
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
*/
@Bean("httpClient")
public CloseableHttpClient httpClient() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
// socket factory
ConnectionSocketFactory plainSocketFactory = new PlainConnectionSocketFactory();
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(
null, (x509Certificates, authType) -> true).build();
LayeredConnectionSocketFactory sslSocketFactory =
new SSLConnectionSocketFactory(sslContext, new AllowAllHostnameVerifier());
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", plainSocketFactory)
.register("https", sslSocketFactory).build();
// cookie specification
Registry<CookieSpecProvider> cookieSpecProviderRegistry = RegistryBuilder.<CookieSpecProvider>create()
.register(CookieSpecs.BEST_MATCH, new BestMatchSpecFactory())
.register(CookieSpecs.BROWSER_COMPATIBILITY, new BrowserCompatSpecFactory())
.register("easy", httpContext -> new BrowserCompatSpec() {
@Override
public void validate(Cookie cookie, CookieOrigin origin) throws MalformedCookieException {
}
}).build();
// connection manager
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
connectionManager.setMaxTotal(10000);
connectionManager.setDefaultMaxPerRoute(1000);
// retry handler
HttpRequestRetryHandler retryHandler = new StandardHttpRequestRetryHandler(3, false);
// keep alive strategy
ConnectionKeepAliveStrategy keepAliveStrategy = new DefaultConnectionKeepAliveStrategy();
// httpclient
return HttpClients.custom()
.setConnectionManager(connectionManager)
.setRetryHandler(retryHandler)
.setKeepAliveStrategy(keepAliveStrategy)
.setDefaultCookieSpecRegistry(cookieSpecProviderRegistry).build();
}
/**
* Set Parameter
*
* @param requestBuilder
* @param parameters
* @param method
*/
private void setParameter(RequestBuilder requestBuilder, Map<String, String> parameters, String method) {
if (MapUtils.isNotEmpty(parameters)) {
parameters = Maps.filterValues(parameters, Predicates.notNull());
Set<Map.Entry<String, String>> entrys = parameters.entrySet();
/************** Get 请求 **************/
if (method.equalsIgnoreCase(HttpGet.METHOD_NAME)) {
for (Map.Entry<String, String> entry : entrys) {
requestBuilder.addParameter(entry.getKey(), entry.getValue());
}
}
/************** Post 请求 **************/
else {
List<NameValuePair> valuePairs = new ArrayList<>();
for (Map.Entry<String, String> entry : entrys) {
valuePairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
}
requestBuilder.setEntity(new UrlEncodedFormEntity(valuePairs, Charsets.UTF_8));
}
}
}
/**
* Set Header
*
* @param requestBuilder
* @param headers
*/
public void setHeader(RequestBuilder requestBuilder, Map<String, String> headers) {
requestBuilder.setHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36")
.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
.setHeader("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6")
.setHeader("Connection", "keep-alive");
if (MapUtils.isNotEmpty(headers)) {
headers = Maps.filterValues(headers, Predicates.notNull());
Set<Map.Entry<String, String>> entrys = headers.entrySet();
for (Map.Entry<String, String> entry : entrys) {
requestBuilder.addHeader(entry.getKey(), entry.getValue());
}
}
}
/**
* Request config
*
* @return
*/
private void setConfig(RequestBuilder requestBuilder, int timeOut) {
int realTimeOut = (timeOut < 3000 || timeOut > 60000)?DEFAULT_TIME_OUT : timeOut; // 设置超时时间至少3s,最多60s
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(realTimeOut)
.setSocketTimeout(realTimeOut)
.setConnectionRequestTimeout(realTimeOut)
.build();
requestBuilder.setConfig(requestConfig);
}
}
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;
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.model;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.Map;
/**
* Created with suntao on 2018/5/23
*/
public class ProductUtil {
public static String getProductId(Long registeredFrom) {
String productId = product.get(registeredFrom);
if (StringUtils.isNotEmpty(productId)) {
return productId;
} else {
return "1";
}
}
public static Integer getIntProductId(Long registeredFrom) {
String productId = product.get(registeredFrom);
if (StringUtils.isNotEmpty(productId)) {
return Integer.valueOf(productId);
} else {
return 1;
}
}
static Map<Long, String> product = new HashMap<>(4);
static {
product.put(159509L,"3");
product.put(159858L,"900");
}
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.model;
import com.google.gson.annotations.JsonAdapter;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
/**
* Created by zhaojiankun on 2018/4/10.
*/
@Data
public class QuotaCreditInfo implements Serializable {
private static final long serialVersionUID = -1L;
private Long id;
/**
* 用户ID
*/
private Long userId;
/**
* 渠道
*/
private Long channel;
/**
* 和授信中心关联字段
*/
private String orderNo;
/**
* 授信状态
*/
private int creditStatus;
/**
* 授信信息来源
*/
private int creditSource;
/**
* 产品id,关联产品表
* KA 渠道来的数据,会提前把这个值传过来,需要存下来之后用
*/
private Long productId;
/**
* 授信状态
*/
private String remark;
/**
* 接收到风控回调时间,yyyy-MM-dd HH:mm:ss
*/
private Timestamp receiveAt;
private Timestamp createdAt;
private Timestamp updatedAt;
/**
* 马甲包数据
*/
private String loanVestInfo;
/**
* app 渠道
*/
private String appChannel;
/**
* 借款用途
*/
private String purpose;
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.model;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.util.*;
/**
* Created with suntao on 2018/4/8
*/
@Data
@Slf4j
public class QuotaInfo {
private Account account;
private Rule rule;
@Data
public class Account {
private Long id;
private Long userId;
private Long productId;
/** 授信额度 */
private BigDecimal totalAmount;
/** 可用额度 */
private BigDecimal availableAmount;
/** 已使用额度 */
private BigDecimal usedAmount;
/** 冻结额度 */
private BigDecimal freezeAmount;
}
@Data
public class Rule {
private Long fundCorpId;
// /** 期数 {\"3000\":[3,6],\"6000\":[3,6,9]} */
// private String terms;
/** 期数 {\"3000\":[3,6],\"6000\":[3,6,9]} */
private Map<String, TreeSet<Integer>> inputRule;
/** 授信额度 */
private BigDecimal maxAmount;
/** 日利率 */
private BigDecimal dayRate;
/** 月利率 */
private BigDecimal monthlyInterestRate;
/** 年利率 == 综合利率 */
private BigDecimal annualInterestRate;
/** 月服务费 */
private BigDecimal serviceFeeRate;
// 外加属性,额度和期数的集合
private List<TermsDetail> termsDetailList;
// 所有期数 用逗号隔开
private String termsStr;
public TermsDetail getMaxAmountAndTerm() {
if (CollectionUtils.isEmpty(termsDetailList)) {
try {
loadTermsDetail();
} catch (Exception e) {
return null;
}
return termsDetailList.get(termsDetailList.size() - 1);
}else {
return termsDetailList.get(termsDetailList.size() - 1);
}
}
/**
* 初始化额度-提现期数关系
*/
public void loadTermsDetail() {
TreeSet<Integer> termsSetAll = new TreeSet<>();
if (CollectionUtils.isEmpty(termsDetailList)) {
termsDetailList = new ArrayList<>();
// Map<String,Integer[]> inputRule = Constants.GSON.fromJson(terms, new TypeToken<Map<String, Integer[]>>() {}.getType());
// for (Map.Entry<String,Integer[]> entry : inputRule.entrySet()) {
// TermsDetail termsDetailInner = new TermsDetail();
// termsDetailInner.setAmount(Long.valueOf(entry.getKey()));
// Integer[] termValues = entry.getValue();
// termsDetailInner.setTermDetail(termValues);
// Arrays.sort(termValues);
// termsDetailInner.setMinTerm(termValues[0]);
// termsDetailInner.setMaxTerm(termValues[termValues.length-1]);
// termsDetail.add(termsDetailInner);
// }
for (Map.Entry<String,TreeSet<Integer>> entry : inputRule.entrySet()) {
TermsDetail termsDetailInner = new TermsDetail();
termsDetailInner.setAmount(Long.valueOf(entry.getKey()));
TreeSet<Integer> termValues = entry.getValue();
termsDetailInner.setTerms(termValues);
termsSetAll.addAll(termValues);
termsDetailInner.setMinTerm(termValues.first());
termsDetailInner.setMaxTerm(termValues.last());
termsDetailList.add(termsDetailInner);
}
// 排序,按照额度升序排序
Collections.sort(termsDetailList,(TermsDetail t1,TermsDetail t2)->{
// 当compareTo的返回值大于0的时候,进行元素的移位,其他情况,不作处理
try {
if (!Objects.isNull(t1.getAmount()) && !Objects.isNull(t2.getAmount())) {
// (x < y) ? -1 : ((x == y) ? 0 : 1);
return t1.getAmount().compareTo(t2.getAmount());
}
else {
return Objects.isNull(t1.getAmount()) ? (Objects.isNull(t2.getAmount()) ? 0 : 1) : -1;
}
} catch (Exception ex) {
return 0;
}
});
}
if (StringUtils.isEmpty(termsStr)) {
if (CollectionUtils.isNotEmpty(termsSetAll)) {
// // 排序,按照额度升序排序
termsStr = StringUtils.join(termsSetAll,",");
}
}
}
}
@Data
public class TermsDetail {
private Long amount;
private TreeSet<Integer> terms;
private int maxTerm;
private int minTerm;
}
/**
* 验证 查询额度 有效性
* @param quotaInfo
* @return
*/
public static boolean validationQuotaInfo(QuotaInfo quotaInfo) {
if (quotaInfo == null) {
return false;
}
if (quotaInfo.getAccount() == null || quotaInfo.getRule() == null) {
return false;
}
if (quotaInfo.getRule().getInputRule() == null) {
return false;
}
try {
QuotaInfo.TermsDetail maxAmountAndTerm = quotaInfo.getRule().getMaxAmountAndTerm();
if (maxAmountAndTerm == null) {
return false;
}
if (StringUtils.isEmpty(quotaInfo.getRule().termsStr)) {
return false;
}
} catch (Exception e) {
log.error("[exception][validationQuotaInfo]",e);
return false;
}
return true;
}
}
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());
// }
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.service;
/**
* function:
* date: 2019/8/9
*
* @author: suntao
*/
public class XyqbCenter {
}
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 org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import java.beans.PropertyDescriptor;
import java.util.HashSet;
import java.util.Set;
/**
* function:
* date: 2019/8/7
*
* @author: suntao
*/
public class IgnorePropertiesUtil {
public static String[] getNullPropertyNames(Object source) {
BeanWrapper src = new BeanWrapperImpl(source);
PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set<String> emptyNames = new HashSet<>();
for (PropertyDescriptor pd : pds) {
Object srcValue = src.getPropertyValue(pd.getName());
if (srcValue == null) {
emptyNames.add(pd.getName());
}
}
return emptyNames.toArray(new String[emptyNames.size()]);
}
}
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