Commit f6862ae3 authored by shangying's avatar shangying

增加了一些方法

parent 58e80715
......@@ -16,6 +16,7 @@
<properties>
<java.version>1.8</java.version>
<elastic-job.version>2.1.5</elastic-job.version>
</properties>
......@@ -196,6 +197,8 @@
<!--</exclusions>-->
<!--</dependency>-->
</dependencies>
<build>
......
......@@ -6,9 +6,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableRedisHttpSession
@EnableTransactionManagement
@SpringBootApplication(scanBasePackages = {"cn.quantgroup.cashloanflowboss"})
......@@ -16,6 +16,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableAutoConfiguration
@EnableFeignClients
@EnableAsync(proxyTargetClass = true)
@EnableScheduling
public class Bootstrap {
public static void main(String[] args) {
......
......@@ -2,17 +2,16 @@ package cn.quantgroup.cashloanflowboss.api.oneclickdata.controller;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.OneClickModel;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.OneClickReslut;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.OneClickSelectModel;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.TypeEnum;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.OneClickDataOperateService;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.OneClickDataQueueOperateService;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.utils.RandomlyGeneratedParameters;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.logging.Logger;
......@@ -27,6 +26,8 @@ public class OneClickDataController {
@Autowired
private OneClickDataOperateService oneClickDataOperateService;
@Autowired
OneClickDataQueueOperateService oneClickDataQueueOperateService;
OneClickModel oneClickModelNew;
......@@ -55,15 +56,28 @@ public class OneClickDataController {
}
@PostMapping("/v1/select")
public Result OneClickDataSelect(@RequestBody @Valid OneClickSelectModel oneClickSelectModel ){
log.info("打印一下oneClickSelectModel={}",oneClickSelectModel);
return Result.buildSuccess(oneClickDataOperateService.findOneClickSelectModelByCriteriaQueryPage(oneClickSelectModel));
}
@GetMapping("/v1/cashwith")
public Result OneClickDataMq(@RequestParam (value = "queueMsg") String queueMsg){
log.info("打印一下queueMsg={}",queueMsg);
oneClickDataQueueOperateService.getCreditNotifyIsSucess(queueMsg);
return Result.buildSuccess("ok");
}
public Result OnekeyApply(OneClickModel oneClickModel) {
return oneClickDataOperateService.OnekeyApply(oneClickModel);
}
public Result OneKeyCashWithdrawal(OneClickModel oneClickModel) {
public Result OneKeyCashWithdrawal(OneClickModel oneClickModel) throws Exception{
oneClickDataOperateService.OneKeyCashWithdrawal(oneClickModel);
return null;
return oneClickDataOperateService.OneKeyCashWithdrawal(oneClickModel);
}
public Result OneKeyCreditSuccessOrFail(OneClickModel oneClickModel) throws Exception {
......@@ -71,9 +85,8 @@ public class OneClickDataController {
return oneClickDataOperateService.OneKeyCreditSuccessOrFail(oneClickModel);
}
public Result OneKeyLoanSuccessOrFail(OneClickModel oneClickModel) {
// oneClickDataOperateService.OneKeyLoanSuccessOrFail(oneClickModel);
return null;
public Result OneKeyLoanSuccessOrFail(OneClickModel oneClickModel) throws Exception {
return oneClickDataOperateService.OneKeyLoanSuccessOrFail(oneClickModel);
}
public OneClickModel setDefaultValue(OneClickModel oneClickModel){
......
......@@ -7,6 +7,7 @@ import cn.quantgroup.cashloanflowboss.core.persistence.Primary;
import lombok.Data;
import javax.persistence.*;
import java.math.BigDecimal;
/**
* Created by shang on 2019/12/16.
......@@ -48,7 +49,7 @@ public class OneClickData extends Primary {
@Column(name = "order_no")
private String orderNo;
@Column(name = "channel_code")
private String channelcode;
private String channelCode;
@Column(name = "card_id")
private String cardId;
@Column(name = "card_bind_info_id")
......@@ -70,11 +71,15 @@ public class OneClickData extends Primary {
@Column(name = "credit_status")
private CreditStatusEnum creditStatus;
@Column(name = "loan_status")
private LoanStatusEnum loanStatus;
private Integer loanStatus;
@Column(name = "type")
private Integer type;
@Column(name = "channel_order_no")
private String channelOrderNo;
@Column(name = "biz_type")
private Integer bizType;
@Column(name = "amount")
private BigDecimal amount;
@Column(name = "term_no")
private Integer termNo;
}
//package cn.quantgroup.cashloanflowboss.api.oneclickdata.entity;
//
//import lombok.Data;
//
//import javax.persistence.*;
//import java.sql.Timestamp;
//
///**
// * Created by shang on 2019/12/12.
// */
//@Entity
//@Table(name = "one_click_job_config")
//@Data
//public class OneClickJobConfig {
// @Id
// @Column(name = "id")
// @GeneratedValue(strategy = GenerationType.IDENTITY)
// private Long id;
//
// @Column(name = "job_name")
// private String jobName;
//
// @Column(name = "cron")
// private String cron;
//
// @Column(name = "sharding_total_count")
// private Integer shardingTotalCount;
//
// @Column(name = "sharding_item_parameters")
// private String shardingItemParameters;
//
// @Column(name = "description")
// private String description;
// //private String failover;
//
// @Column(name = "job_parameter")
// private String jobParameter;
//
// @Column(name = "job_class")
// private String jobClass;
//
// @Column(name = "is_active")
// private Boolean isActive;
//
// @Column(name = "created_at")
// private Timestamp createdAt;
//}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.entity;
import lombok.Data;
import javax.persistence.*;
import java.sql.Timestamp;
/**
* Created by shang on 2019/12/12.
*/
@Entity
@Table(name = "one_click_job_config")
@Data
public class OneClickJobConfig {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "job_name")
private String jobName;
@Column(name = "cron")
private String cron;
@Column(name = "sharding_total_count")
private Integer shardingTotalCount;
@Column(name = "sharding_item_parameters")
private String shardingItemParameters;
@Column(name = "description")
private String description;
//private String failover;
@Column(name = "job_parameter")
private String jobParameter;
@Column(name = "job_class")
private String jobClass;
@Column(name = "is_active")
private Boolean isActive;
@Column(name = "created_at")
private Timestamp createdAt;
}
......@@ -12,13 +12,21 @@ public enum LoanStatusEnum {
DEFAULT(0, "未付款,未核销"),
LOAN_UNCONFIRM(1, "资金方放款状态未知(未核销)"),
LOAN_SUCC(15, "放款成功(已核销)"),
LOAN_UNCONFIRMTWO(2, "dsds)"),
LOAN_UNCONFIRMTHRE(3, "资金方放款状态未知33(未核销)"),
CHECK_REPAYMENT_PLAN(15,"查看还款计划"),//15
LOAN_COMPLETE(16,"借款完成"),//16
LOAN_FAIL(28, "放款失败(等待退款)"),
APPLY_WITHDRAWDEPOSIT(50, "已申请提现"),
WAIT_JRLOAN(20, "等待马上金融放款"),
TO_JRWAITLOAN(21, "已发送给马上金融, 等待放款"),
AREADY_REPALYMENT(16, "等待马上金融放款");
BIND_FAIL(31,"提现绑卡失败"),
SECONDARYRISKCONTROLFAILURE(32,"二次风控失败"),
NOTHAVECONTRACT(33,"修改合同失败"),
BIND_SUCC_NOTHAVEFUNDORDER(34,"提现成功,未查询到放款单"),
DIRECT_INVESTMENT_FAILURE(34,"直投打款失败"),
LOAN_REQUEST_FAILED (35,"放款请求失败"),
DIRECT_INVESTMENT_SUCCESS_STATUSNOTRIGHT (36,"直投打款成功,但状态不对");
private int code;
private String desc;
......
package cn.quantgroup.cashloanflowboss.api.oneclickdata.model;
import cn.quantgroup.cashloanflowboss.component.validator.constraints.NotEmpty;
import lombok.Data;
/**
* Created by shang on 2019/12/9.
*/
@Data
public class OneClickSelectModel {
private String phone;
private String userId;
private String loanId;
private String loanMessage;
private String loanStatus;
private String creditMessage;
private String creditStatus;
private String uuid;
private String QgOrderNo;
@NotEmpty(message="页数不能空")
private Integer pageSize;
@NotEmpty(message="当前页不能空")
private Integer pageNumber;
}
......@@ -3,25 +3,75 @@ package cn.quantgroup.cashloanflowboss.api.oneclickdata.repository;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.entity.OneClickData;
import cn.quantgroup.cashloanflowboss.core.persistence.CashLoanFlowBossDataSource;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* Created by shang on 2019/12/11.
*/
@CashLoanFlowBossDataSource
@Repository
public interface OneClickDataRespository extends JpaRepository<OneClickData, Long> {
// 通过手机号、渠道订单号、授信状态、放款状态查询
@Query(value = "select * from one_click_data where user_id=?1 and credit_status = ?2 and loan_status=?3 order by id desc limit 1", nativeQuery = true)
OneClickData findByPhoneAndCreditStatusAndLoanStatus(String userId,Integer creditStatus,Integer loanStatus);
public interface OneClickDataRespository extends JpaRepository<OneClickData, Long>, PagingAndSortingRepository<OneClickData, Long>, JpaSpecificationExecutor<OneClickData> {
// 通过userid、渠道订单号、授信状态、放款状态查询、渠道类型
@Query(value = "select * from one_click_data where user_id= ?1 and credit_status = ?2 and loan_status= ?3 and channel_code= ?4 order by id desc limit 1", nativeQuery = true)
OneClickData findByUserIdAndCreditStatusAndLoanStatusAndChannelCode(String userId,Integer creditStatus,Integer loanStatus,String channelCode);
// 通过userid、订单号查看
@Query(value = "select * from one_click_data where user_id= ?1 and order_no = ?2 order by id desc limit 1", nativeQuery = true)
OneClickData findByUserIdAndOrderNo(String userId,String OrderNo);
// 通过订单号查看
@Query(value = "select * from one_click_data where order_no = ?1 order by id desc limit 1", nativeQuery = true)
OneClickData findByOrderNo(String OrderNo);
// 通过放款号查看
@Query(value = "select * from one_click_data where loan_id = ?1 order by id desc limit 1", nativeQuery = true)
OneClickData findByLoanId(String loanId);
// 通过授信状态查询,申请类型是非1的
@Query(value = "select * from one_click_data where credit_status = ?1 and type not in ?2 order by id desc limit 1", nativeQuery = true)
List<OneClickData> findByCreditStatusNotInType(Integer creditStatus,Integer type);
// 通过id修改 放款loanid
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "update one_click_data set loan_id= ?1 where id= ?2", nativeQuery = true)
int updateById(String loanId ,Long id);
// 通过id修改 授信状态
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "update one_click_data set credit_status= ?1 where id= ?2", nativeQuery = true)
int updateCreditStatusById(Integer creditStatus ,Long id);
// 通过id修改 放款状态
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "update one_click_data set loan_status= ?1 where id= ?2", nativeQuery = true)
int updateLoanStatusById(Integer loanStatus ,Long id);
// 通过id修改 放款loanid 放款状态loan_status
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "update one_click_data set loan_id= ?1,loan_status= ?2 where id= ?3", nativeQuery = true)
int updateCreditStatusAndLoanStatusById(String loanId,Integer loanStatus ,Long id);
// 通过id修改 添加订单号 产品id token信息
// 通过id修改 添加订单号 产品id token信息
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "update one_click_data set quota_record_order_no=?1,order_no=?2,product_id=?3,token=?4 where id=?5", nativeQuery = true)
int updateById(String quotaRecordOrderNo,String orderNo,String productId,String token,Long id);
@Query(value = "update one_click_data set quota_record_order_no= ?1,order_no= ?2,product_id= ?3,token= ?4,biz_type= ?5 where id= ?6", nativeQuery = true)
int updateById(String quotaRecordOrderNo,String orderNo,String productId,String token,Integer bizType ,Long id);
}
//package cn.quantgroup.cashloanflowboss.api.oneclickdata.repository;
//
//import cn.quantgroup.cashloanflowboss.api.oneclickdata.entity.OneClickJobConfig;
//import cn.quantgroup.cashloanflowboss.core.persistence.CashLoanFlowBossDataSource;
//import org.springframework.data.jpa.repository.JpaRepository;
//import org.springframework.stereotype.Repository;
//
///**
// * Created by shang on 2019/12/12.
// */
//@CashLoanFlowBossDataSource
//@Repository
//public interface OneClickJobConfigRepository extends JpaRepository<OneClickJobConfig, Long> {
//
//// @Query(value = "select * from one_click_job_config where is_active = 1", nativeQuery = true)
//// List<OneClickJobConfig> findAllIsActive();
//}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.repository;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.entity.OneClickJobConfig;
import cn.quantgroup.cashloanflowboss.core.persistence.CashLoanFlowBossDataSource;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* Created by shang on 2019/12/12.
*/
@CashLoanFlowBossDataSource
@Repository
public interface OneClickJobConfigRepository extends JpaRepository<OneClickJobConfig, Long> {
@Query(value = "select * from one_click_job_config where is_active = 1", nativeQuery = true)
List<OneClickJobConfig> findAllActive();
}
......@@ -11,7 +11,7 @@ import com.alibaba.fastjson.JSONObject;
public interface ApplyLoanService {
public static boolean reslut=true;
Result applyLoan(OneClickModel oneClickModel);
JSONObject zhangZhongApply(OneClickModel oneClickModel);
JSONObject zhangZhongApply(OneClickModel oneClickModel,String md5Keywy,String aesKeywy);
JSONObject shiGuangFenQiApply();
JSONObject xiaoJMApply();
JSONObject guoMeiApply();
......
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.OneClickModel;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.entity.OneClickData;
import cn.quantgroup.cashloanflowboss.core.base.Result;
/**
* Created by shang on 2019/12/9.
*/
public interface CashWithdrawalService {
Result applyLoan(OneClickModel oneClickModel);
Result applyLoan(OneClickData oneClickData);
}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.entity.OneClickData;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.OneClickModel;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.QuotaCredit;
/**
* Created by shang on 2019/12/3.
......@@ -11,4 +13,9 @@ public interface CreditGrantingService {
* 风控授信回调
*/
Result authAmountAuditNotify(OneClickModel oneClickModel) throws Exception;
/**
* 风控授信回调mq
*/
Result authAmountAuditNotifyMq(OneClickData oneClickData, QuotaCredit quotaCredit) throws Exception;
}
//package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
//
///**
// * Created by shang on 2019/12/9.
// */
//public interface FundsAllocationplanService {
//}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
/**
* Created by shang on 2019/12/9.
*/
public interface FundsAllocationplanService {
boolean fundPlannedDistribution(String fundCorpId) throws Exception;
/**
* 登录 OP
*/
String loginOPToken();
/**
* 分配资产计划
*/
boolean fundingPlan(String fundCorpId) throws Exception;
/**
* 资产计划
*/
boolean FundingPolicySave(String fundCorpId) throws Exception;
}
//package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
//
///**
// * Created by shang on 2019/12/9.
// */
//public interface GDXDService {
//}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
import cn.quantgroup.cashloanflowboss.spi.gyxd.entity.LoanApplicationManifestHistory;
import com.alibaba.fastjson.JSONObject;
/**
* Created by shang on 2019/12/9.
*/
public interface GuangDaXiaoDaiService {
/**
* 查询gyxd数据
* 广源 广达走这个路径进入这个表中
* */
LoanApplicationManifestHistory selectLoanApplicationManifestHistory(String loanId);
/**
* 广源小贷修改状态为3
* */
int updateGYXDStatusOf3(String loanId,int loanProgress );
/**
* 登陆GYXD
* */
String getGyxdToken();
/**
* 广源小贷回盘
* */
JSONObject GuangYuanXiaoDaiBatchDeal(String loanID);
}
//package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
//
///**
// * Created by shang on 2019/12/3.
// */
//public interface H5BindingCardAndWithdrawDeposit {
// /**
// * 前往提现页
// */
// void accountPro();
//
// /**
// * 查询用户额度表(获取 accountId)
// */
// void getXYQBAccountId();
//
// /**
// * 进入支付绑卡
// */
// void bindCard();
//
// /**
// * 绑卡发送短信
// */
// void cardAuthSms();
//
// /**
// * 绑卡确认
// */
// void cardAuthSmsConfirm();
//
// /**
// * 查询用户可用卡列表
// */
// void bindCardList();
//
// /**
// * 查询分配资金方
// */
// void accountTrial();
//
// /**
// * 绑卡后提现
// */
// void cashAfterBindingCard();
//
// /**
// * 查询loanID
// */
// void testSelectLoanId();
//
//
//}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
/**
* Created by shang on 2019/12/3.
*/
public interface H5BindingCardAndWithdrawDeposit {
/**
* 前往提现页
*/
void accountPro();
/**
* 查询用户额度表(获取 accountId)
*/
void getXYQBAccountId();
/**
* 进入支付绑卡
*/
void bindCard();
/**
* 绑卡发送短信
*/
void cardAuthSms();
/**
* 绑卡确认
*/
void cardAuthSmsConfirm();
/**
* 查询用户可用卡列表
*/
void bindCardList();
/**
* 查询分配资金方
*/
void accountTrial();
/**
* 绑卡后提现
*/
void cashAfterBindingCard();
}
......@@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
......@@ -59,8 +60,12 @@ public class ApplyLoanServiceImpl implements ApplyLoanService {
JSONObject result;
oneClickReslut=new Result();
oneClickOV=new OneClickOV();
//获取当前的渠道秘钥
clfChannelConfiguration=clfCenterService.findChannelConfigurationByChannelId(Long.parseLong(oneClickModel.getChannel().trim()));
md5Keywy=clfChannelConfiguration.getMd5Key();
aesKeywy=clfChannelConfiguration.getAesKey();
if(oneClickModel.getChannel().equals(ChannelEnum.ZHANGHZONG.getCode())){
result= zhangZhongApply(oneClickModel);
result= zhangZhongApply(oneClickModel,md5Keywy,aesKeywy);
}else if(oneClickModel.getChannel().equals(ChannelEnum.SHIGUANGFQ.getCode())){
result= shiGuangFenQiApply();
......@@ -90,7 +95,7 @@ public class ApplyLoanServiceImpl implements ApplyLoanService {
OneClickData oneClickData=new OneClickData();
oneClickData.setPhone(oneClickModel.getPhone());
oneClickData.setChannel(GetEncryptContentAndMd5.getChannelName(oneClickModel.getChannel()));
oneClickData.setChannelcode(oneClickModel.getChannel());
oneClickData.setChannelCode(oneClickModel.getChannel());
oneClickData.setChannelOrderNo(orderNo);
//通过手机号获取用户信息
......@@ -100,8 +105,10 @@ public class ApplyLoanServiceImpl implements ApplyLoanService {
oneClickData.setType(Integer.parseInt(oneClickModel.getType()));
oneClickData.setCreditStatus(CreditStatusEnum.DEFAULT);
oneClickData.setLoanStatus(LoanStatusEnum.DEFAULT);
oneClickData.setLoanStatus(LoanStatusEnum.DEFAULT.getCode());
oneClickData.setFundCorpId(oneClickModel.getFundID());
oneClickData.setAmount(new BigDecimal(oneClickModel.getAmount()));
oneClickData.setTermNo(Integer.parseInt(oneClickModel.getTermNo()));
// 把提现的数据存放到表one_click_data中
oneClickDataRespository.save(oneClickData);
......@@ -122,17 +129,14 @@ public class ApplyLoanServiceImpl implements ApplyLoanService {
}
@Override
public JSONObject zhangZhongApply(OneClickModel oneClickModel) {
public JSONObject zhangZhongApply(OneClickModel oneClickModel,String md5Keywy,String aesKeywy) {
String url = qapiHttp+"/ex/api/v2/applyLoan/ZHANGZHONG";
//测试
// String url = "http://qapi-arch.liangkebang.net"+"/ex/api/v2/applyLoan/ZHANGZHONG";
//获取当前的渠道秘钥
clfChannelConfiguration=clfCenterService.findChannelConfigurationByChannelId(Long.parseLong(oneClickModel.getChannel().toString()));
md5Keywy=clfChannelConfiguration.getMd5Key();
aesKeywy=clfChannelConfiguration.getAesKey();
orderNo="zhangzhong_userid1_"+oneClickModel.getPhone()+"_"+System.currentTimeMillis();
orderNo="ZZ_"+oneClickModel.getPhone()+"_"+System.currentTimeMillis();
String name = "简介";
String channelUserId = "zhangzhong_userid1_"+ oneClickModel.getPhone();
String channelUserId = "ZZ_"+ oneClickModel.getPhone();
Map<String, Object> paras =new HashMap<String, Object>();
paras.put("address", "湖北省恩施州利川团堡");
......
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service.Impl;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.entity.OneClickData;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.ChannelEnum;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.CreditStatusEnum;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.LoanStatusEnum;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.OneClickModel;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.*;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.repository.OneClickDataRespository;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.CashWithdrawalService;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.LoanOperationService;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.PhoneInfoService;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfChannelConfiguration;
import cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenterServiceImpl;
import cn.quantgroup.cashloanflowboss.utils.BankCardNumberGenerator;
import cn.quantgroup.cashloanflowboss.utils.BankCardTypeEnum;
import cn.quantgroup.cashloanflowboss.utils.BankNameEnum;
import cn.quantgroup.cashloanflowboss.utils.GetEncryptContentAndMd5;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.LoanApplicationHistory;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.QuotaCredit;
import cn.quantgroup.cashloanflowboss.utils.*;
import cn.quantgroup.cashloanflowboss.utils.http.HttpRequest;
import cn.quantgroup.user.retbean.XUser;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -25,6 +22,7 @@ import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* Created by shang on 2019/12/18.
......@@ -40,66 +38,111 @@ public class CashWithdrawalServiceImpl implements CashWithdrawalService{
CLFCenterServiceImpl clfCenterService;
@Autowired
PhoneInfoService phoneInfoService;
@Autowired
LoanOperationService loanOperationService;
ClfChannelConfiguration clfChannelConfiguration;
public static String md5Keywy = "qEAxMJBv";
public static String aesKeywy = "sxD8KO79EDK0N0AJ";
/*
/**
*申请提现请求
* */
@Override
public Result applyLoan(OneClickModel oneClickModel) {
public Result applyLoan(OneClickData oneClickData) {
JSONObject result;
if(oneClickModel.getChannel().equals(ChannelEnum.ZHANGHZONG.getCode())){
result= applyZhangZhongLoan(oneClickModel);
//通过用户id获取产品信息
// QuotaCredit quotaCredit=phoneInfoService.selectUserAuditRecords(Long.valueOf(oneClickData.getUserId()), Long.parseLong(oneClickData.getChannelCode()));
// log.info("打印quotaCredit={}",quotaCredit);
//获取当前的渠道秘钥
clfChannelConfiguration=clfCenterService.findChannelConfigurationByChannelId(Long.parseLong(oneClickData.getChannelCode().trim()));
log.info("oneClickData={}",oneClickData);
md5Keywy=clfChannelConfiguration.getMd5Key();
aesKeywy=clfChannelConfiguration.getAesKey();
}else if(oneClickModel.getChannel().equals(ChannelEnum.SHIGUANGFQ.getCode())){
if(oneClickData.getChannelCode().trim().equals(ChannelEnum.ZHANGHZONG.getCode())){
result= applyZhangZhongLoan(oneClickData, md5Keywy, aesKeywy);
}else if(oneClickData.getChannel().equals(ChannelEnum.SHIGUANGFQ.getCode())){
result= null;
}else if(oneClickModel.getChannel().equals(ChannelEnum.XIAOJUMAO.getCode())){
}else if(oneClickData.getChannel().equals(ChannelEnum.XIAOJUMAO.getCode())){
result= null;
}else if(oneClickModel.getChannel().equals(ChannelEnum.GUOMEI.getCode())){
}else if(oneClickData.getChannel().equals(ChannelEnum.GUOMEI.getCode())){
result= null;
}else if(oneClickModel.getChannel().equals(ChannelEnum.WEIDIAN.getCode())){
}else if(oneClickData.getChannel().equals(ChannelEnum.WEIDIAN.getCode())){
result= null;
}else{
result= null;
}
return null;
String getDecryption = AESUtil.decryptAfterBase64Decode(result.get("context").toString(), aesKeywy);
log.info("解密的getDecryption的结果={}" + getDecryption);
JSONObject getDecryptionResult = (JSONObject) JSONObject.parse(getDecryption);
log.info("打印一下getDecryptionResult={}",getDecryptionResult.get("bizData"));
JSONObject bizData= (JSONObject) JSONObject.parse(getDecryptionResult.get("bizData").toString());
log.info("提现结果打印bizData={}",bizData);
String code=bizData.get("code").toString();
String businessCode=bizData.get("businessCode").toString();
String msg=bizData.get("msg").toString().trim();
log.info("msg={}",msg);
if((code.equals("0") && businessCode.equals("0000"))|| msg.equals("订单已经提现签约过")||(code.equals("0") && businessCode.equals("0200"))){
// 通过userid查看当前的提现记录是否生成放款loanid
LoanApplicationHistory applicationHistory=new LoanApplicationHistory();
// log.info("oneClickData.getUserId()={},quotaCredit.getProductType()={}",oneClickData.getUserId(),quotaCredit.getProductType());
applicationHistory= loanOperationService.selectLoanId(Long.valueOf(oneClickData.getUserId()), oneClickData.getBizType());
log.info("打印获取的放款单信息applicationHistory={}",applicationHistory);
if(Objects.isNull(applicationHistory)){
applicationHistory=verificationApplicationHistory(applicationHistory,Long.valueOf(oneClickData.getUserId().trim()), oneClickData.getBizType(),0);
}else{
log.info("打印放款id,applicationHistory.getId()={}",applicationHistory.getId());
}
return new Result(ApplicationStatus.SUCCESS,new OneClickOV(applicationHistory.getId().toString().trim(),LoanStatusEnum.APPLY_WITHDRAWDEPOSIT.getDesc(),CreditStatusEnum.CREDIT_SUCC.getDesc()));
}else{
return Result.buildFail(msg) ;
}
}
/*
public LoanApplicationHistory verificationApplicationHistory(LoanApplicationHistory applicationHistory,Long userId,Integer businessType,int num){
if(Objects.isNull(applicationHistory)){
applicationHistory = loanOperationService.selectLoanId(userId, businessType);
if(num<50&& Objects.isNull(applicationHistory)){
num++;
verificationApplicationHistory(applicationHistory,userId, businessType,num);
}else{
log.info("打印一下最终的quotaCredit={}", applicationHistory);
}
}
return applicationHistory;
}
/**
* 掌众的申请提现
* */
public JSONObject applyZhangZhongLoan(OneClickModel oneClickModel){
public JSONObject applyZhangZhongLoan(OneClickData oneClickData,String md5Keywy,String aesKeywy){
String url = qapiHttp+"/ex/api/v2/withdraw/ZHANGZHONG";
//通过手机号获取用户信息
String bankCardNumber= BankCardNumberGenerator.generate(BankNameEnum.CCB, BankCardTypeEnum.DEBIT);
String bankCode="CCB";
String bankName="建设银行";
Map<String,String> paras = new HashMap<String, String>();
//通过手机号获取用户信息
XUser xUser=phoneInfoService.selectUserID(oneClickModel.getPhone());
Long userId=xUser.getId();
//从数据库中获取当前的订单
log.info("getPhone={},CreditStatusEnum={},LoanStatusEnum={}", userId, CreditStatusEnum.DEFAULT.getCode(), LoanStatusEnum.DEFAULT.getCode());
OneClickData oneClickData=oneClickDataRespository.findByPhoneAndCreditStatusAndLoanStatus(userId.toString().trim(), CreditStatusEnum.CREDIT_SUCC.getCode(), LoanStatusEnum.DEFAULT.getCode());
paras.put("channelOrderNumber",oneClickData.getChannelOrderNo());
paras.put("bankCardNumber",bankCardNumber);
paras.put("bankCode",bankCode);
paras.put("bankName",bankName);
paras.put("reservePhoneNumber",oneClickModel.getPhone());
//获取当前的渠道秘钥
clfChannelConfiguration=clfCenterService.findChannelConfigurationByChannelId(Long.parseLong(oneClickModel.getChannel().toString()));
md5Keywy=clfChannelConfiguration.getMd5Key();
aesKeywy=clfChannelConfiguration.getAesKey();
paras.put("reservePhoneNumber",oneClickData.getPhone());
String encryptContent = GetEncryptContentAndMd5.getEncryptContent(paras, aesKeywy, md5Keywy);
Map<String,String> content_map = new HashMap<String, String>();
content_map.put("content",encryptContent);
log.info("获取当前的paras={}",paras);
JSONObject result = HttpRequest.doPostReturnResponseJson(url, content_map);
return null;
return result;
}
}
......@@ -25,6 +25,7 @@ import org.testng.Assert;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* Created by shang on 2019/12/4.
......@@ -42,6 +43,9 @@ public class CreditGrantingServiceImpl implements CreditGrantingService{
@Autowired
OneClickDataRespository oneClickDataRespository;
@Autowired
FundsAllocationplanServiceImpl fundsAllocationplanService;
public static String txAmount = "2000";
public static String rate = "0";
@Value("${clotho.http.net}")
......@@ -49,17 +53,30 @@ public class CreditGrantingServiceImpl implements CreditGrantingService{
@Override
public Result authAmountAuditNotify(OneClickModel oneClickModel) throws Exception {
String auditResult="true";
if(oneClickModel.getType().equals("2") ){
if(oneClickModel.getType().equals("2") || oneClickModel.getType().equals("4") || oneClickModel.getType().equals("5")|| oneClickModel.getType().equals("6") || oneClickModel.getType().equals("7")){
auditResult="true";
}else if(oneClickModel.getType().equals("3")){
auditResult="false";
}else {
log.info("非授信需要的状态,打印一下oneClickModel.getType()={}",oneClickModel.getType());
}
return applyCreditNotify(oneClickModel,auditResult);
return applyCreditNotify(oneClickModel,auditResult,0);
}
@Override
public Result authAmountAuditNotifyMq(OneClickData oneClickData, QuotaCredit quotaCredit) throws Exception {
String auditResult="true";
if(oneClickData.getType().equals("2") || oneClickData.getType().equals("4") || oneClickData.getType().equals("5")|| oneClickData.getType().equals("6") || oneClickData.getType().equals("7")){
auditResult="true";
}else if(oneClickData.getType().equals("3")){
auditResult="false";
}else {
log.info("非授信需要的状态,打印一下oneClickModel.getType()={}",oneClickData.getType());
}
return applyCreditNotifyMq(oneClickData, quotaCredit, auditResult);
}
public Result applyCreditNotify(OneClickModel oneClickModel,String auditResult) throws Exception {
public Result applyCreditNotify(OneClickModel oneClickModel,String auditResult,int num) throws Exception {
String url = clothoHttp + "/external/quota/auth_amount_audit/notify";
Map<String, String> paras = new HashMap<String, String>();
ArrayList listPara1 =getPublicInfo(oneClickModel);
......@@ -68,12 +85,21 @@ public class CreditGrantingServiceImpl implements CreditGrantingService{
paras.put("bizChannel", "1");
//通过手机号获取用户信息
XUser xUser=phoneInfoService.selectUserID(oneClickModel.getPhone());
log.info("打印一下xUser:{}",xUser);
String uuid=xUser.getUuid();
Long userId=xUser.getId();
paras.put("uuid", uuid);
//通过用户id获取产品信息
QuotaCredit quotaCredit=phoneInfoService.selectUserAuditRecords(userId);
log.info("打印quotaCredit={}",quotaCredit);
log.info("打印一下userid:{},oneClickModel:{}",userId,oneClickModel);
QuotaCredit quotaCredit=phoneInfoService.selectUserAuditRecordsNotCreditStatus(userId, Long.parseLong(oneClickModel.getChannel()));
if (Objects.isNull(quotaCredit)){
return Result.buildFail("授信记录未查询到quotaCredit!!!,请检查数据") ;
}else{
log.info("打印一下quotaCredit={}",quotaCredit);
}
int productId= Integer.parseInt(quotaCredit.getProductId().toString().trim()) ;
String biNo = String.valueOf(quotaCredit.getProductType());
String quotaRecordOrderNo=quotaCredit.getOrderNo();
......@@ -97,27 +123,142 @@ public class CreditGrantingServiceImpl implements CreditGrantingService{
header.put("x-auth-token", getToken);
log.info("获取paras={},获取header={}",paras,header);
// QuotaCredit quotaCredit1=phoneInfoService.selectUserAuditRecords(userId, Long.parseLong(oneClickModel.getChannel()));
// if (Objects.isNull(quotaCredit1)){
//// quotaCredit1=quotaCredit(userId, oneClickModel.getChannel().toString().trim(),0);
//// if(Objects.isNull(quotaCredit1)){
//// return Result.buildFail("quotaCredit授信记录状态非creditStatus=1!!!,请检查数据") ;
////
//// }
// num++;
// if(num <=3) {
// applyCreditNotify(oneClickModel, auditResult, num);
// }else {
// return Result.buildFail("quotaCredit授信记录状态非creditStatus=1!!!,请检查数据") ;
// }
// }else{
// log.info("打印一下quotaCredit1={}",quotaCredit1);
// }
JSONObject result = HttpRequest.doPostReturnResponseJson(url, paras, header);
if(result.get("statusCode").toString().trim().equals("200") && result.get("context").toString().trim().equals("success")){
//从数据库中获取当前的订单
log.info("getPhone={},CreditStatusEnum={},LoanStatusEnum={}", userId, CreditStatusEnum.DEFAULT.getCode(), LoanStatusEnum.DEFAULT.getCode());
OneClickData oneClickData=oneClickDataRespository.findByPhoneAndCreditStatusAndLoanStatus(userId.toString().trim(), CreditStatusEnum.DEFAULT.getCode(), LoanStatusEnum.DEFAULT.getCode());
log.info("userId={},CreditStatusEnum={},LoanStatusEnum={},channel={}", userId, CreditStatusEnum.DEFAULT.getCode(), LoanStatusEnum.DEFAULT.getCode(),oneClickModel.getChannel());
OneClickData oneClickData=oneClickDataRespository.findByUserIdAndCreditStatusAndLoanStatusAndChannelCode(userId.toString().trim(), CreditStatusEnum.DEFAULT.getCode(), LoanStatusEnum.DEFAULT.getCode(), oneClickModel.getChannel().toString().trim());
log.info("获取的实体oneClickData={}",oneClickData);
//把授信请求通知的数据存放到表one_click_data中
int update= oneClickDataRespository.updateById(quotaRecordOrderNo, quotaRecordOrderNo, String.valueOf(productId), getToken, oneClickData.getId());
int update= oneClickDataRespository.updateById(quotaRecordOrderNo.toString().trim(), quotaRecordOrderNo.toString().trim(), String.valueOf(productId).toString().trim(), getToken.toString().trim(),quotaCredit.getProductType(), oneClickData.getId());
// 跑一遍计划
boolean fundplan=fundsAllocationplanService.fundPlannedDistribution(oneClickData.getFundCorpId());
if(fundplan){
log.info("自己分配计划ok",oneClickData);
}else{
log.info("自己分配计划失败:{}",oneClickData);
}
if (update>0){
log.info("修改成功update={}",update);
}else{
log.info("修改失败 !!!!!");
}
return new Result(ApplicationStatus.SUCCESS,new OneClickOV(CreditStatusEnum.DEFAULT.getDesc()),"风控授信回调通知成功");
}else{
num++;
log.info("打印循环次数num:{}",num);
if(num <=3) {
applyCreditNotify(oneClickModel, auditResult, num);
}else {
return Result.buildFail("quotaCredit授信记录状态非creditStatus=1!!!,请检查数据") ;
}
return Result.buildFail("风控授信回调通知成功失败!!!,请检查数据") ;
}
}
public QuotaCredit quotaCredit(Long userId,Long channel,int num) throws InterruptedException {
QuotaCredit quotaCredit=phoneInfoService.selectUserAuditRecords(userId,channel);
if(num<=5 && Objects.isNull(quotaCredit)){
num++;
log.info("打印一下num={}",num);
quotaCredit(userId, channel, num);
} else{
log.info("打印一下最终的quotaCredit={}", quotaCredit);
}
return quotaCredit;
}
public Result applyCreditNotifyMq(OneClickData oneClickData, QuotaCredit quotaCredit,String auditResult) throws Exception {
String url = clothoHttp + "/external/quota/auth_amount_audit/notify";
Map<String, String> paras = new HashMap<String, String>();
ArrayList listPara1 =getPublicInfoMq(oneClickData);
paras.put("code", "0");
paras.put("msg", "success");
paras.put("bizChannel", "1");
//通过手机号获取用户信息
XUser xUser=phoneInfoService.selectUserID(oneClickData.getPhone());
log.info("打印一下xUser:{}",xUser);
String uuid=xUser.getUuid();
Long userId=xUser.getId();
paras.put("uuid", uuid);
//通过用户id获取产品信息
log.info("打印一下userid:{},oneClickModel:{}",userId,oneClickData);
if (Objects.isNull(quotaCredit)){
log.info("打印quotaCredit={}",quotaCredit);
return Result.buildFail("授信记录未查询到quotaCredit!!!,请检查数据") ;
}
int productId= Integer.parseInt(quotaCredit.getProductId().toString().trim()) ;
String biNo = String.valueOf(quotaCredit.getProductType());
String quotaRecordOrderNo=quotaCredit.getOrderNo();
//获取产品分配基础信息,默认rate都是0
HashMap<Object, Object> getBiNoAndFinanceProduct = GetBiNoAndFinanceProducts.getBiNoAndFinanceProduct(productId, listPara1);
paras.put("bizNo", quotaRecordOrderNo);
paras.put("bizType", biNo);
paras.put("auditResult", auditResult);
paras.put("amount", oneClickData.getAmount().toString().trim());
paras.put("deadLine", "1607746332000");
paras.put("extData", "null");
paras.put("otherInformation", "");
paras.put("financeProducts", getBiNoAndFinanceProduct.get("financeProducts").toString().trim());
Map<String, String> header = new HashMap<String, String>();
header.put("Content-Type", "application/x-www-form-urlencoded");
// 通过手机号和渠道code获取token
String getToken=phoneInfoService.getToken(oneClickData.getPhone(), oneClickData.getChannel());
header.put("x-auth-token", getToken);
log.info("获取paras={},获取header={}",paras,header);
JSONObject result = HttpRequest.doPostReturnResponseJson(url, paras, header);
if(result.get("statusCode").toString().trim().equals("200") && result.get("context").toString().trim().equals("success")){
//把授信请求通知的数据存放到表one_click_data中
int update= oneClickDataRespository.updateById(quotaRecordOrderNo.toString().trim(), quotaRecordOrderNo.toString().trim(), String.valueOf(productId).toString().trim(), getToken.toString().trim(),quotaCredit.getProductType(), oneClickData.getId());
// 修改授信状态授信成功CreditStatusEnum.CREDIT_SUCC
oneClickDataRespository.updateCreditStatusById(CreditStatusEnum.CREDIT_SUCC.getCode(), oneClickData.getId());
// 跑一遍计划
boolean fundplan=fundsAllocationplanService.fundPlannedDistribution(oneClickData.getFundCorpId());
if(fundplan){
log.info("自己分配计划ok",oneClickData);
}else{
log.info("自己分配计划失败:{}",oneClickData);
}
if (update>0){
log.info("修改成功update={}",update);
}else{
log.info("修改失败 !!!!!");
}
return new Result(ApplicationStatus.SUCCESS,new OneClickOV(CreditStatusEnum.DEFAULT.getDesc()),"风控授信回调通知成功");
}else{
return Result.buildFail("风控授信回调通知成功失败!!!,请检查数据") ;
}
}
public ArrayList getPublicInfo(OneClickModel oneClickModel){
ArrayList listPara1 = new ArrayList();
listPara1.add(0, oneClickModel.getAmount());
......@@ -128,4 +269,15 @@ public class CreditGrantingServiceImpl implements CreditGrantingService{
return listPara1;
}
public ArrayList getPublicInfoMq(OneClickData oneClickData){
ArrayList listPara1 = new ArrayList();
listPara1.add(0, oneClickData.getAmount().toString().trim());
listPara1.add(1, oneClickData.getTermNo());
listPara1.add(2, oneClickData.getFundCorpId());
listPara1.add(3, rate);
listPara1.add(4, txAmount);
return listPara1;
}
}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service.Impl;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.entity.OneClickData;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.FundsAllocationplanService;
import cn.quantgroup.cashloanflowboss.utils.CoverDate;
import cn.quantgroup.cashloanflowboss.utils.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.util.HashMap;
import java.util.Map;
/**
* Created by shang on 2019/12/20.
*/
@Slf4j
@Service
public class FundsAllocationplanServiceImpl implements FundsAllocationplanService {
@Value("${opapi.http.net}")
private String opapiHttp;
@Value("${clotho.http.net}")
private String clothoHttp;
@Override
public boolean fundPlannedDistribution(String fundCorpId) throws Exception {
Boolean boo=true;
String loginOPToken =loginOPToken();
if(StringUtils.isBlank(loginOPToken)){
return false;
}else{
boo= fundingPlan(fundCorpId);
if(boo){
return FundingPolicySave(fundCorpId);
}else {
return false;
}
}
}
@Override
public String loginOPToken() {
log.info("打印opapiHttp:{}",opapiHttp);
String url = opapiHttp + "/user/login?auth=dXNlcj14dWV6aiZwYXNzd29yZD0xMjMxMjNxd2Vxd2U%3D";
JSONObject result = HttpRequest.doGetReturnResponseJson(url);
JSONObject resultData = (JSONObject) result.get("data");
if(result.get("businessCode").toString().trim().equals("0000")){
log.info("打印token:{}",resultData.get("token").toString().trim());
return resultData.get("token").toString().trim();
}else{
log.info("没有获取到token={}",result);
}
return null;
}
@Override
public boolean fundingPlan(String fundCorpId) throws Exception {
boolean boo=true;
String url =clothoHttp + "/funds/plan/funding/plan/save";
Map<String, String> paras = new HashMap<String, String>();
paras.put("fundCorpId", fundCorpId);
paras.put("planDate", CoverDate.getTimeShort());
paras.put("maxAssignAmount", "10000000");
paras.put("maxLoanAmount", "10000000");
paras.put("maxLoanPeople", "1000");
paras.put("maxAssignPeople", "1000");
paras.put("priorityLevel", "1");
Map<String, String> header = new HashMap<String, String>();
header.put("Content-Type", "application/x-www-form-urlencoded");
header.put("x-auth-token", loginOPToken());
JSONObject result = HttpRequest.doPostReturnResponseJson(url, paras, header);
if(result.get("businessCode").toString().trim().equals("0000") && result.get("code").toString().trim().equals("0000") ){
boo=true;
}else {
boo=false;
}
return boo;
}
@Override
public boolean FundingPolicySave(String fundCorpId) throws Exception {
boolean boo=true;
String url= opapiHttp+"/clotho/funds/plan/funding/policy/save";
Map<String, String> header =new HashMap<String, String>();
header.put("Content-Type", "application/x-www-form-urlencoded");
header.put("x-auth-token", loginOPToken());
//
Map<String, String> paras =new HashMap<String, String>();
paras.put("fundingCorpId", fundCorpId);
paras.put("minQgScore", "-1");
paras.put("maxQgScore", "-1");
paras.put("assignTimes", "0:00-23:59");
paras.put("productType", "1");
paras.put("pickProduct", "");
paras.put("fetchConfig", "0:01");
paras.put("autoLoanFetchConfig", "0:01");
paras.put("priorityChannel", "");
paras.put("banChannel", "");
paras.put("loanTimes", "0:00-23:59");
paras.put("onlyChannel", "159439");
paras.put("isAutoAssign", "true");
paras.put("isAutoLoan", "true");
paras.put("isAutoFetch", "true");
paras.put("autoLoanFetch", "true");
JSONObject result = HttpRequest.doPostReturnResponseJson(url,paras, header);
if(result.get("businessCode").toString().trim().equals("0000") && result.get("code").toString().trim().equals("0000") ){
boo=true;
}else {
boo=false;
}
return boo;
}
public static void main(String[] arg){
FundsAllocationplanServiceImpl fundsAllocationplanService=new FundsAllocationplanServiceImpl();
fundsAllocationplanService.loginOPToken();
}
}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service.Impl;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.entity.OneClickData;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.GuangDaXiaoDaiService;
import cn.quantgroup.cashloanflowboss.spi.gyxd.entity.LoanApplicationManifestHistory;
import cn.quantgroup.cashloanflowboss.spi.gyxd.repository.ILoanApplicationManifestHistoryRepository;
import cn.quantgroup.cashloanflowboss.utils.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.testng.Assert;
import java.util.HashMap;
import java.util.Map;
/**
* Created by shang on 2019/12/20.
*/
public class GuangDaXiaoDaiServiceImpl implements GuangDaXiaoDaiService {
@Autowired
ILoanApplicationManifestHistoryRepository loanApplicationManifestHistoryRepository;
@Value("{gyxdapi.http.net}")
private String gyxdHttp;
@Override
public LoanApplicationManifestHistory selectLoanApplicationManifestHistory(String loanId) {
return loanApplicationManifestHistoryRepository.findByLoanId(loanId);
}
@Override
public int updateGYXDStatusOf3(String loanId,int loanProgress ) {
int num=loanApplicationManifestHistoryRepository.updateLoanProgress(loanId,loanProgress);
if (num>0){
return num;
}else {
return 0;
}
}
@Override
public String getGyxdToken() {
String url=gyxdHttp+"/ex/user/login";
Map<String, String> paras =new HashMap<String, String>();
paras.put("account","user1");
paras.put("password", "Gyxd2018");
Map<String, String> header =new HashMap<String, String>();
header.put("Content-Type", "application/x-www-form-urlencoded");
JSONObject result= HttpRequest.doPostReturnResponseJson(url, paras, header);
if(!result.get("data").toString().trim().isEmpty()) {
JSONObject resultData = (JSONObject) result.get("data");
if(result.get("businessCode").toString().trim().equals("0000")){
return resultData.get("token").toString().trim();
}else {
return "";
}
}else{
Assert.assertEquals("没有获取到resultData", "000");
return "";
}
}
@Override
public JSONObject GuangYuanXiaoDaiBatchDeal(String loanID ) {
String url= gyxdHttp+"/ex/loan/batch_deal";
Map<String, String> paras =new HashMap<String, String>();
paras.put("loanIds",loanID);
paras.put("step", "CALLBACK");
Map<String, String> header =new HashMap<String, String>();
header.put("Content-Type", "application/x-www-form-urlencoded");
header.put("x-auth-token", getGyxdToken());
JSONObject result= HttpRequest.doPostReturnResponseJson(url, paras, header);
Assert.assertEquals(result.get("statusCode").toString().trim(), "200");
Assert.assertEquals(result.get("businessCode").toString().trim(), "0000");
return result;
}
}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service.Impl;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.OneClickModel;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.entity.OneClickData;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.LoanStatusEnum;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.repository.OneClickDataRespository;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.FundsAllocationplanService;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.LoanOperationService;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.spi.clf.model.LoanProgress;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.LoanApplicationHistory;
import cn.quantgroup.cashloanflowboss.spi.xyqb.repository.LoanApplicationHistoryRepository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.repository.WaitingFundingCorpOperatePeopleRepository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.service.XYQBCenterService;
import cn.quantgroup.cashloanflowboss.utils.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.testng.Assert;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* Created by shang on 2019/12/4.
......@@ -13,26 +31,213 @@ import org.springframework.stereotype.Service;
@Service
public class LoanOperationServiceImpl implements LoanOperationService{
@Autowired
LoanApplicationHistoryRepository loanApplicationHistoryRepository;
@Autowired
XYQBCenterService xyqbCenterService;
@Autowired
WaitingFundingCorpOperatePeopleRepository waitingFundingCorpOperatePeopleRepository;
@Autowired
OneClickDataRespository oneClickDataRespository;
@Autowired
LoanOperationService loanOperationService;
@Autowired
FundsAllocationplanService fundsAllocationplanService;
@Value("${opapi.http.net}")
private String opapiHttp;
@Value("${clotho.http.net}")
private String clothoHttp;
@Value("${api.http.net}")
private String apiHttp;
@Override
public Result applyLoanNotify(OneClickModel oneClickModel) {
public Result applyLoanNotify(OneClickData oneClickData) {
return null;
}
@Override
public LoanApplicationHistory selectLoanId(Long userId,Integer businessType) {
return loanApplicationHistoryRepository.findByUserIdAndBusinessTypeAndIsActive(userId,businessType);
}
/**
* 二次风控
* */
@Override
public void orderAuditNotify() {
public JSONObject orderAuditNotify(OneClickData oneClickData) {
String url= clothoHttp+"/external/quota/order_audit/notify";
Map<String, String> paras =new HashMap<String, String>();
paras.put("code", "0");
paras.put("msg", "success");
paras.put("bizChannel","1");
paras.put("uuid", oneClickData.getUuid());
paras.put("bizNo",oneClickData.getLoanId());
paras.put("bizType",oneClickData.getBizType().toString().trim());
paras.put("auditResult","true" );
paras.put("deadLine", "1548518400");
Map<String, String> header =new HashMap<String, String>();
header.put("Content-Type", "application/x-www-form-urlencoded");
header.put("x-auth-token", oneClickData.getToken());
log.info("打印当前的二次风控paras={},header={}",paras,header);
JSONObject result= HttpRequest.doPostReturnResponseJson(url, paras, header);
return result;
}
@Override
public void updatContractStatus() {
public boolean updatContractStatus(OneClickData oneClickData) {
boolean boo=true;
int num=xyqbCenterService.updateContractStatus(Long.valueOf(oneClickData.getUserId()),2,Long.valueOf(oneClickData.getLoanId()));
if(num>0){
}else{
boo=false;
}
return boo;
}
/**
* 查询放款记录
*
* @param fundId
* @return Map
*/
@Override
public Map queryLendingRecordCount(Long fundId) {
return xyqbCenterService.queryLendingRecordCount(fundId);
}
/**
* 查询放款记录总数
*
* @param fundId
* @return Long
*/
@Override
public Long queryLendingRecordSumCount(Long fundId) {
return xyqbCenterService.queryLendingRecordSumCount(fundId);
}
/**
* 查询放款记录金额总数
*
* @param fundId
* @return BigDecimal
*/
@Override
public BigDecimal queryLendingRecordAmountMountSumCount(Long fundId) {
return xyqbCenterService.queryLendingRecordAmountMountSumCount(fundId);
}
@Override
public void payNotify() {
public int updatWaitingFundingCorpOperatePeopleCreaterTime(Long fundID) {
int num=waitingFundingCorpOperatePeopleRepository.updateByLoanApplicationHistoryId(fundID);
if (num>0){
log.info("成功修改数据");
}else{
log.info("没有找到对应的放款单");
}
return num;
}
@Override
public JSONObject fundsPlanLoanApply(OneClickData oneClickData,String payStatus) {
// 查看当前的放款单的状态是21
LoanApplicationHistory loanApplicationHistory= loanOperationService.selectLoanId(Long.valueOf(oneClickData.getUserId().trim()), oneClickData.getBizType());
if(loanApplicationHistory.getProgress().getDescription().trim().equals(LoanProgress.FINAL_SENDED_TO_FUNDING_CORP.getDescription().trim()) ){
//系统自动打款,无需调用打款操作
return payNotify(oneClickData, payStatus);
}else{
oneClickDataRespository.updateLoanStatusById(LoanStatusEnum.DIRECT_INVESTMENT_FAILURE.getCode(), oneClickData.getId());
}
return isFundsPlanLoanApply(oneClickData, payStatus);
}
public JSONObject isFundsPlanLoanApply(OneClickData oneClickData,String payStatus){
String url= opapiHttp+"/clotho/funds/plan/loan/apply";
log.info("打印一下oneClickData.getFundCorpId()={}", oneClickData.getFundCorpId());
// 判断当前是否有需要放款的数量和人
String amountLimit="";
String assignPeopleNum="";
BigDecimal AmountMountSumCount=queryLendingRecordAmountMountSumCount(Long.parseLong(oneClickData.getFundCorpId()));
Long sumCount=queryLendingRecordSumCount(Long.parseLong(oneClickData.getFundCorpId()));
if(Objects.isNull(AmountMountSumCount) || Objects.isNull(sumCount) ){
log.info("获取sql金额为AmountMountSumCount={},sumCount={}",AmountMountSumCount,sumCount);
return payNotify(oneClickData, payStatus);
}else {
// 如有有需要提现操作的单,进行提现操作
amountLimit = AmountMountSumCount.toString().trim();
assignPeopleNum = sumCount.toString().trim();
String fundCorpId = oneClickData.getFundCorpId();
Map<String, String> paras = new HashMap<String, String>();
paras.put("fundingCorpId", fundCorpId);
paras.put("amountLimit", amountLimit.substring(0, 5));
paras.put("peopleLimit", assignPeopleNum);
Map<String, String> header = new HashMap();
header.put("Content-Type", "application/x-www-form-urlencoded");
header.put("x-auth-token", fundsAllocationplanService.loginOPToken());
JSONObject result = HttpRequest.doPostReturnResponseJson(url, paras, header);
if (result.get("businessCode").toString().trim().equals("0000") && result.get("code").toString().trim().equals("0000")) {
// 需要咨询这个接口
// 待续中。。。。。。
if (!fundCorpId.equals("210")) {
// 查看当前的放款单的状态是21
LoanApplicationHistory loanApplicationHistory = loanOperationService.selectLoanId(Long.valueOf(oneClickData.getUserId().trim()), oneClickData.getBizType());
log.info("放款通知请求完毕后loanApplicationHistory={}", loanApplicationHistory);
if (loanApplicationHistory.getProgress().getDescription().trim().equals(LoanProgress.FINAL_SENDED_TO_FUNDING_CORP.getDescription().trim())) {
//直投打款完毕进行放款操作
return payNotify(oneClickData, payStatus);
} else {
oneClickDataRespository.updateLoanStatusById(LoanStatusEnum.DIRECT_INVESTMENT_FAILURE.getCode(), oneClickData.getId());
}
}
} else {
// 发起提现失败
oneClickDataRespository.updateLoanStatusById(LoanStatusEnum.DIRECT_INVESTMENT_FAILURE.getCode(), oneClickData.getId());
return result;
}
}
return null;
}
/**
* 放款结果通知
* */
@Override
public JSONObject payNotify(OneClickData oneClickData,String payStatus) {
String url=apiHttp+"/ex/paycenter/pay_notify";
long payTime=System.currentTimeMillis();
Map<String, String> paras =new HashMap<String, String>();
paras.put("orderNo",oneClickData.getLoanId() );
paras.put("payOrderNo",oneClickData.getLoanId() );
paras.put("payTime", String.valueOf(payTime));
paras.put("payStatus", payStatus);
Map<String, String> header =new HashMap<String, String>();
header.put("Content-Type", "application/x-www-form-urlencoded");
JSONObject result= HttpRequest.doPostReturnResponseJson(url, paras, header);
return result;
}
}
//package cn.quantgroup.cashloanflowboss.api.oneclickdata.service.Impl; // // //import cn.quantgroup.cashloanflowboss.api.oneclickdata.repository.OneClickJobConfigRepository; //import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.OneClickDataOperateJobService; //import lombok.extern.slf4j.Slf4j; //import org.springframework.beans.factory.annotation.Autowired; //import org.springframework.stereotype.Service; // ///** // * Created by shang on 2019/12/12. // */ //@Slf4j //@Service //public class OneClickDataOperateJobServiceImpl implements OneClickDataOperateJobService { //@Autowired //private OneClickJobConfigRepository oneClickJobConfigRepository; // @Override // public void excuteCreditSuccessJob() { // // } // // @Override // public void excuteCreditFailJob() { // // } // // @Override // public void excuteSelectCreditStatusJob() { // // // // //查找请求类型:2授信成功、4放款成功、5放款失败、6清算的单,并且当前的授信状态是0授信中 // // 当前授信中的单在apply_quota_record 查看状态是apply_status=2 时间倒序 //// List<OneClickJobConfig> oneClickDataList= oneClickJobConfigRepository.findAllActive(); // // // 所有的list查询用户审核记录:查出来的userid在表quota_credit 的is_active=0 可用状态 并且通过order_no // // 符合条件的状态授信修改成功 // //并且查询需要进行放款操作:查询 4放款成功、6清算的单 // // 执行提现操作 // //查看当前提现表是否状态正确 // // // // // } // // @Override // public void excuteFundSucessJob() { // // } // // @Override // public void excuteFundFailJob() { // // } // // @Override // public void excuteSelectFundStatusJob() { // // } //}
\ No newline at end of file
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service.Impl; import cn.quantgroup.cashloanflowboss.api.oneclickdata.entity.OneClickData;import cn.quantgroup.cashloanflowboss.api.oneclickdata.repository.OneClickDataRespository;import cn.quantgroup.cashloanflowboss.api.oneclickdata.repository.OneClickJobConfigRepository;import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.CreditGrantingService;import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.OneClickDataOperateJobService;import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.PhoneInfoService;import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.QuotaCredit;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service; import java.util.List;import java.util.Objects; /** * Created by shang on 2019/12/12. */@Slf4j@Servicepublic class OneClickDataOperateJobServiceImpl implements OneClickDataOperateJobService { @Autowired PhoneInfoService phoneInfoService; @Autowired OneClickDataRespository oneClickDataRespository; @Autowired CreditGrantingService creditGrantingService; @Override public void excuteCreditSuccessJob() { } @Override public void excuteCreditFailJob() { } @Override public void excuteSelectCreditStatusJob() { //查找请求类型:2授信成功、4放款成功、5放款失败、6清算的单,并且当前的授信状态是0授信中 List<OneClickData> oneClickDataList=oneClickDataRespository.findByCreditStatusNotInType(0, 1); for(OneClickData oneClickData:oneClickDataList) { // 当前授信中的单在apply_quota 查看状态是apply_status=1 时间倒序,进行授信请求操作 QuotaCredit quotaCredit1 = phoneInfoService.selectUserAuditRecords(Long.parseLong(oneClickData.getUserId()), Long.parseLong(oneClickData.getChannelCode())); if (Objects.isNull(quotaCredit1)){ log.info("不符合授信审核申请的条件"); }else { //如何条件的单进行授信申请请求 log.info("符合授信审核申请的条件oneClickData={},quotaCredit1={}", oneClickData, quotaCredit1); try { creditGrantingService.authAmountAuditNotifyMq(oneClickData,quotaCredit1); }catch (Exception e){ log.info("进入异常e={}",e.getMessage()); } } } } @Override public void excuteFundSucessJob() { } @Override public void excuteFundFailJob() { } @Override public void excuteSelectFundStatusJob() { } }
\ No newline at end of file
......
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service.Impl;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.ChannelEnum;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.entity.OneClickData;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.OneClickModel;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.OneClickReslut;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.OneClickSelectModel;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.repository.OneClickDataRespository;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.ApplyLoanService;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.CreditGrantingService;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.OneClickDataOperateService;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.utils.GetEncryptContentAndMd5;
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.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* Created by shang on 2019/12/9.
*/
......@@ -18,7 +28,8 @@ import org.springframework.stereotype.Service;
@Service
public class OneClickDataOperateServiceImpl implements OneClickDataOperateService {
@Autowired
OneClickDataRespository oneClickDataRespository;
@Autowired
private ApplyLoanService applyLoanService;
@Autowired
......@@ -30,27 +41,76 @@ public class OneClickDataOperateServiceImpl implements OneClickDataOperateServic
}
@Override
public Result OneKeyCashWithdrawal(OneClickModel oneClickModel) {
return null;
public Result OneKeyCashWithdrawal(OneClickModel oneClickModel)throws Exception {
return OneKeyCreditSuccessOrFail(oneClickModel);
}
@Override
public Result OneKeyCreditSuccessOrFail(OneClickModel oneClickModel) throws Exception {
Result creditResult=applyLoanService.applyLoan(oneClickModel);
if(creditResult.getCode()==200000){
log.info("申请成功后,进入风控回调环境={}",creditResult);
return creditGrantingService.authAmountAuditNotify(oneClickModel);
}else {
log.info("当前进行进件申请失败oneClickModel={},creditResult={}",oneClickModel,creditResult);
return creditResult;
}
// return applyLoanService.applyLoan(oneClickModel);
}
@Override
public OneClickReslut OneKeyLoanSuccessOrFail(OneClickModel oneClickModel) {
return null;
public Result OneKeyLoanSuccessOrFail(OneClickModel oneClickModel)throws Exception {
return OneKeyCreditSuccessOrFail(oneClickModel);
}
public Page<OneClickSelectModel> findOneClickSelectModelByCriteriaQueryPage(OneClickSelectModel oneClickSelectModel){
Page<OneClickData> oneClickDatas= findOneClickDataByCriteriaQueryPage(oneClickSelectModel);
log.info("打印一下oneClickDatas:{}",oneClickDatas);
Page<OneClickSelectModel> oneClickSelectModels=oneClickDatas.map(it -> {
OneClickSelectModel oneClickSelectModel1=new OneClickSelectModel();
oneClickSelectModel.setPhone(it.getPhone());
oneClickSelectModel.setUserId(it.getUserId());
oneClickSelectModel.setLoanId(it.getLoanId());
oneClickSelectModel.setLoanStatus(String.valueOf(it.getLoanStatus()));
oneClickSelectModel.setLoanMessage(GetEncryptContentAndMd5.getLoanMessage(it.getLoanStatus()));
oneClickSelectModel.setCreditStatus(String.valueOf(it.getCreditStatus().getCode()));
oneClickSelectModel.setCreditMessage(it.getCreditStatus().getDesc());
oneClickSelectModel.setUuid(it.getUuid());
oneClickSelectModel.setQgOrderNo(it.getChannelOrderNo());
log.info("打印一下oneClickSelectModel={}",oneClickSelectModel);
return oneClickSelectModel;
});
return oneClickSelectModels;
}
public Page<OneClickData> findOneClickDataByCriteriaQueryPage(OneClickSelectModel oneClickSelectModel) {
return oneClickDataRespository.findAll((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
// 指定手机号
if (StringUtils.isNotEmpty(oneClickSelectModel.getPhone())) {
predicates.add(criteriaBuilder.equal(root.get("phone"), oneClickSelectModel.getPhone()));
}
if (StringUtils.isNotEmpty(oneClickSelectModel.getUserId())) {
predicates.add(criteriaBuilder.equal(root.get("userId"), oneClickSelectModel.getUserId()));
}
// 设置查询条件
criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])));
// 指定排序
criteriaQuery.orderBy(criteriaBuilder.desc(root.get("id")));
log.info("打印一下criteriaQuery:{}", criteriaQuery.getRestriction());
return criteriaQuery.getRestriction();
}, new PageRequest(Integer.valueOf(oneClickSelectModel.getPageNumber()), Integer.valueOf(oneClickSelectModel.getPageSize())));
}
}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service.Impl;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.entity.OneClickData;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.CreditStatusEnum;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.LoanStatusEnum;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.repository.OneClickDataRespository;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.*;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.spi.clf.model.LoanProgress;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.LoanApplicationHistory;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.QuotaCredit;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import org.testng.Assert;
import java.util.Objects;
/**
* Created by shang on 2019/12/19.
*/
@Slf4j
@Service
public class OneClickDataQueueOperateServiceImpl implements OneClickDataQueueOperateService {
@Autowired
OneClickDataRespository oneClickDataRespository;
@Autowired
CashWithdrawalService cashWithdrawalService;
@Autowired
LoanOperationService loanOperationService;
@Autowired
CreditGrantingService creditGrantingService;
@Autowired
PhoneInfoService phoneInfoService;
@Override
public void getCreditNotifyIsSucess(String queueMsg) {
JSONObject queueMsgJson=(JSONObject)JSONObject.parse(queueMsg);
JSONObject data=(JSONObject)queueMsgJson.get("data");
String applyNo=data.get("applyNo").toString().trim();
String extraData=queueMsgJson.get("extraData").toString();
String noticeType=queueMsgJson.get("noticeType").toString().trim();
log.info("获取applyNo:{}",applyNo);
OneClickData oneClickData= oneClickDataRespository.findByOrderNo(applyNo);
log.info("获取oneClickData:{},获取noticeType:{}",oneClickData,noticeType);
if(Objects.isNull(oneClickData)){
}else{
if(noticeType.equals("FUAD_ASSIFN_SUCC")){
getFundAssifnSucc(oneClickData);
} else if(noticeType.equals("FUND_SUCC")){
// 提现成功了,收到放款成功消息,修改oneClickData的放款状态
oneClickDataRespository.updateLoanStatusById(LoanStatusEnum.CHECK_REPAYMENT_PLAN.getCode(), oneClickData.getId());
}else{
log.info("没有找到对应需要处理的订单");
}
}
}
public void authAmountAuditNotify(OneClickData oneClickData, QuotaCredit quotaCredit)throws Exception{
if(oneClickData.getType() != 1) {
creditGrantingService.authAmountAuditNotifyMq(oneClickData, quotaCredit);
}else{
log.info("进件申请流程无需走后续的授信流程:{}", oneClickData.getType());
}
}
public void getFundAssifnSucc(OneClickData oneClickData){
// 修改授信状态授信成功CreditStatusEnum.CREDIT_SUCC
oneClickDataRespository.updateCreditStatusById(CreditStatusEnum.CREDIT_SUCC.getCode(), oneClickData.getId());
// 放款成功、放款失败、清单、提现的流程需要进行提现操作
if(oneClickData.getType() == 4 ||oneClickData.getType() == 5||oneClickData.getType() == 6||oneClickData.getType() == 7){
//执行提现操作
Result cashWithdrawalResult= cashWithdrawalService.applyLoan(oneClickData);
log.info("绑卡结果cashWithdrawalResult={}",cashWithdrawalResult);
isNotSecondaryRiskControl(cashWithdrawalResult, oneClickData);
}
}
public void isNotSecondaryRiskControl(Result cashWithdrawalResult,OneClickData oneClickData){
if(cashWithdrawalResult.getCode() == 200000){
// 提现成功了,返回绑卡成功了,进行二次风控操作
executeTheLendingProcess(oneClickData);
}else{
//提现请求失败后,修改提现绑卡失败
oneClickDataRespository.updateLoanStatusById(LoanStatusEnum.BIND_FAIL.getCode(), oneClickData.getId());
}
}
public void executeTheLendingProcess(OneClickData oneClickData){
//查询通过userid businessType isactive查询是否生成了放款单
LoanApplicationHistory loanApplicationHistory= loanOperationService.selectLoanId(Long.valueOf(oneClickData.getUserId().trim()), oneClickData.getBizType());
if (Objects.isNull(loanApplicationHistory)){
// 提现成功了,但是未在放款表查看到放款单
oneClickDataRespository.updateLoanStatusById(LoanStatusEnum.BIND_SUCC_NOTHAVEFUNDORDER.getCode(), oneClickData.getId());
}else{
log.info("获取到loanApplicationHistory={}", loanApplicationHistory);
//如果返回绑卡成功,修改放款loandid 修改提现成功
int updatenum= oneClickDataRespository.updateCreditStatusAndLoanStatusById(String.valueOf(loanApplicationHistory.getId()), LoanStatusEnum.APPLY_WITHDRAWDEPOSIT.getCode(), oneClickData.getId());
if(updatenum >0){
log.info("修改数据成功");
}else{
log.info("修改数据失败");
}
// 放款成功、放款失败、清单的流程需要进行二次风控操作
if( oneClickData.getType() != 7) {
log.info("当前的流程类型oneClickData.getType()={}",oneClickData.getType());
oneClickData= oneClickDataRespository.findByLoanId(loanApplicationHistory.getId().toString().trim());
getBingSucc(oneClickData);
}
}
}
public void getBingSucc(OneClickData oneClickData){
//执行二次风控
JSONObject result= loanOperationService.orderAuditNotify(oneClickData);
log.info("二次风控结果result:{}",result);
isNotSecondRiskSucc(result, oneClickData);
}
public void isNotSecondRiskSucc(JSONObject result,OneClickData oneClickData){
if(result.get("statusCode").toString().trim().equals("200") && result.get("context").toString().trim().equals("success")){
// 查看当前的放款单的状态是20
LoanApplicationHistory loanApplicationHistory= loanOperationService.selectLoanId(Long.valueOf(oneClickData.getUserId().trim()), oneClickData.getBizType());
log.info("获取查询的二次风控请求成功后的loanApplicationHistory={}",loanApplicationHistory);
log.info("打印一下progress={},LoanProgress.WAITING_FUND获取的值:{}",loanApplicationHistory.getProgress().getDescription(),LoanProgress.WAITING_FUND.getDescription());
// 获取的放款状态是 "发起提现,等待二次风控审核" "等待马上金融放款" "已发送给马上金融, 等待放款"
if(loanApplicationHistory.getProgress().getDescription().trim().equals(LoanProgress.WAITING_FUND.getDescription()) || loanApplicationHistory.getProgress().getDescription().trim().equals(LoanProgress.START_ORDER.getDescription())|| loanApplicationHistory.getProgress().getDescription().trim().equals(LoanProgress.FINAL_SENDED_TO_FUNDING_CORP.getDescription())){
updateContrantAndApplyLendingNotify(oneClickData,loanApplicationHistory);
}else{
log.info("风控=loanApplicationHistory",loanApplicationHistory);
// 放款状态:二次风控放款失败
int updatanum= oneClickDataRespository.updateLoanStatusById(LoanStatusEnum.SECONDARYRISKCONTROLFAILURE.getCode(), oneClickData.getId());
if(updatanum>0){
log.info("二次风控修改成功");
}else{
log.info("二次风控失败修改失败");
}
}
}else {
// 放款状态:二次风控放款失败
oneClickDataRespository.updateLoanStatusById(LoanStatusEnum.SECONDARYRISKCONTROLFAILURE.getCode(), oneClickData.getId());
}
}
public void updateContrantAndApplyLendingNotify(OneClickData oneClickData,LoanApplicationHistory loanApplicationHistory){
// 放款状态:等待马上金融放款20
if(loanApplicationHistory.getProgress().getDescription().trim().equals(LoanProgress.FINAL_SENDED_TO_FUNDING_CORP.getDescription())){
oneClickDataRespository.updateLoanStatusById(LoanStatusEnum.TO_JRWAITLOAN.getCode(), oneClickData.getId());
}else {
oneClickDataRespository.updateLoanStatusById(LoanStatusEnum.WAIT_JRLOAN.getCode(), oneClickData.getId());
}
boolean boo= loanOperationService.updatContractStatus(oneClickData);
if(boo){
log.info("合同修改成功!!!");
//申请放款操作
applyLendingNotify(oneClickData, loanApplicationHistory);
}else{
//修改合同失败
oneClickDataRespository.updateLoanStatusById(LoanStatusEnum.NOTHAVECONTRACT.getCode(), oneClickData.getId());
}
}
public void applyLendingNotify(OneClickData oneClickData,LoanApplicationHistory loanApplicationHistory1){
String payStatus="true";
// 通过申请类型确定是否要放款成功、失败
// 放款成功、清单修改状态成功,放款失败修改状态失败
if(oneClickData.getType() == 5 ){
payStatus="false";
}else {
payStatus="true";
}
JSONObject result=new JSONObject();
//如果已经体现了:21 ,就不需要在调用体现操作,而是直接通知
if(loanApplicationHistory1.getProgress().getDescription().trim().equals(LoanProgress.FINAL_SENDED_TO_FUNDING_CORP.getDescription())){
result =loanOperationService.payNotify(oneClickData, payStatus);
} else {
//查看是否有待放款的人和数量,并且确定放款通知
result = loanOperationService.fundsPlanLoanApply(oneClickData, payStatus);
}
if (result.get("businessCode").toString().trim().equals("0000") && result.get("code").toString().trim().equals("0000")) {
// 查看当前的放款单的状态是21
LoanApplicationHistory loanApplicationHistory = loanOperationService.selectLoanId(Long.valueOf(oneClickData.getUserId().trim()), oneClickData.getBizType());
log.info("放款请求成功后的loanApplicationHistory={}", loanApplicationHistory);
if (loanApplicationHistory.getProgress().getDescription().trim().equals(LoanProgress.FINAL_SENDED_TO_FUNDING_CORP.getDescription())) {
//修改打款状态21
oneClickDataRespository.updateLoanStatusById(LoanStatusEnum.TO_JRWAITLOAN.getCode(), oneClickData.getId());
}else if(loanApplicationHistory.getProgress().getDescription().trim().equals(LoanProgress.CHECK_REPAYMENT_PLAN.getDescription())){
// 提现成功了,收到放款成功消息,修改oneClickData的放款状态
oneClickDataRespository.updateLoanStatusById(LoanStatusEnum.CHECK_REPAYMENT_PLAN.getCode(), oneClickData.getId());
} else {
//直投打款成功,但状态不对
oneClickDataRespository.updateLoanStatusById(LoanStatusEnum.DIRECT_INVESTMENT_SUCCESS_STATUSNOTRIGHT.getCode(), oneClickData.getId());
}
} else {
oneClickDataRespository.updateLoanStatusById(LoanStatusEnum.LOAN_REQUEST_FAILED.getCode(), oneClickData.getId());
}
}
public static void main(String[] arg){
// String queueMsg="{\"data\":{\"applyNo\":\"FM624168161855715731904356\",\"loanId\":0,\"loanProgress\":\"LOAN_APPLICATION_MANIFEST_COMPLETE\",\"termNo\":-1},\"extraData\":\"{\\\"amount\\\":\\\"10000.00\\\",\\\"annualInterest\\\":\\\"0.36\\\",\\\"assignTime\\\":1577153040895,\\\"term\\\":\\\"12\\\"}\",\"noticeType\":\"FUAD_ASSIFN_SUCC\"}\n";
System.out.print(LoanProgress.WAITING_FUND.toString());
}
}
......@@ -143,8 +143,18 @@ public class PhoneInfoServiceImpl implements PhoneInfoService {
}
@Override
public QuotaCredit selectUserAuditRecords(Long qgUserId) {
return quotaCreditRepository.findByUserId(qgUserId);
public QuotaCredit selectUserAuditRecords(Long qgUserId,Long channel) {
return quotaCreditRepository.findByUserIdAndChannelAndIsActiveAndCreditStatus(qgUserId, channel);
}
@Override
public QuotaCredit selectUserAuditRecordsNotCreditStatus(Long qgUserId,Long channel) {
return quotaCreditRepository.findByUserIdAndChannelAndIsActive(qgUserId, channel);
}
@Override
public QuotaCredit selectUserAuditRecords(String applyNo) {
return quotaCreditRepository.findByorderNoAndIsActive(applyNo);
}
@Override
......
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service.Impl;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.RepaymentPlatService;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.RepaymentPlan;
import com.alibaba.fastjson.JSONObject;
/**
* Created by shang on 2019/12/24.
*/
public class RepaymentPlatServiceImpl implements RepaymentPlatService {
@Override
public RepaymentPlan whetherHaveRepayment0rdersList(String loanId) {
return null;
}
@Override
public void getRepayment0rdersList(String loanID, String token) {
}
@Override
public String getRepaymentToken(String loanID, String token) {
return null;
}
@Override
public JSONObject getCardListInfo(String repaymentToken) {
return null;
}
@Override
public void getPayMoneyInfo(String repaymentToken) {
}
@Override
public void paymentConfirmation(String cardBindInfoId1, String cardId) {
}
@Override
public void bankCardAuthenticationInformation(String repaymentToken) {
}
@Override
public void sendSMS(String repaymentToken) {
}
@Override
public void confirmPayment(String repaymentToken) {
}
@Override
public void bingCard(String repaymentToken, JSONObject info) {
}
@Override
public void bingCardSms(String repaymentToken, JSONObject info) {
}
@Override
public void bingCardSmsConfirm(String repaymentToken, JSONObject info) {
}
}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service.Impl;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.ScheduleService;
import cn.quantgroup.cashloanflowboss.spi.jolyne.JolyneService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Created by shang on 2019/12/20.
*/
@Slf4j
@Service
public class ScheduleServiceImpl implements ScheduleService {
@Autowired
JolyneService jolyneService;
/**
*应用风险处理工作
* */
@Override
public void applyRiskHandleJob() throws Exception {
// GetScheduleJob.getScheduleJob(nameSpace, "clotho-elastic-job", "cn.qg.clotho.job.ApplyRiskHandleJob");
jolyneService.reloadJob("cn.qg.clotho.job.ApplyRiskHandleJob");
}
/**
*分配资金方
* */
@Override
public void applyCashDataJob() throws Exception {
// GetScheduleJob.getScheduleJob(nameSpace, "clotho-elastic-job", "cn.qg.clotho.job.ApplyCashDataJob");
jolyneService.reloadJob("cn.qg.clotho.job.ApplyCashDataJob");
}
/**
*拉取放款时间段资金方
* */
@Override
public void loanDataJob() throws Exception {
// GetScheduleJob.getScheduleJob(nameSpace, "clotho-elastic-job", "cn.qg.clotho.job.LoanDataJob");
jolyneService.reloadJob("cn.qg.clotho.job.LoanDataJob");
}
@Override
public void fundingSelectJob() throws Exception {
// GetScheduleJob.getScheduleJob(nameSpace, "clotho-elastic-job", "cn.qg.clotho.job.FundingSelectJob");
jolyneService.reloadJob("cn.qg.clotho.job.FundingSelectJob");
}
@Override
public void fetchDataLoanJob() throws Exception {
// GetScheduleJob.getScheduleJob(nameSpace, "clotho-elastic-job", "cn.qg.clotho.job.FetchDataLoanJob");
// jolyneService.reloadJob("cn.qg.clotho.job.FetchDataLoanJob");
}
@Override
public void autoLoanFetchJob() throws Exception {
// GetScheduleJob.getScheduleJob(nameSpace, "clotho-elastic-job", "cn.qg.clotho.job.dataflow.AutoLoanFetchJob");
jolyneService.reloadJob("cn.qg.clotho.job.AutoLoanFetchJob");
}
}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.OneClickModel;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.entity.OneClickData;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.LoanApplicationHistory;
import com.alibaba.fastjson.JSONObject;
import java.math.BigDecimal;
import java.util.Map;
/**
* Created by shang on 2019/12/3.
......@@ -10,17 +15,51 @@ public interface LoanOperationService {
/*
* 放款通知请求
* */
Result applyLoanNotify(OneClickModel oneClickModel);
Result applyLoanNotify(OneClickData oneClickData);
/**
* 查询loanID
*/
LoanApplicationHistory selectLoanId(Long userId,Integer businessType);
/**
* 二次风控
* */
void orderAuditNotify();
JSONObject orderAuditNotify(OneClickData oneClickData);
/**
* 修改合同状态
* */
void updatContractStatus();
boolean updatContractStatus(OneClickData oneClickData);
/**
* 放款结果通知
* */
void payNotify();
JSONObject payNotify(OneClickData oneClickData,String payStatus);
/**
* 查询放款记录
*
* @param fundId
* @return
*/
Map queryLendingRecordCount(Long fundId);
Long queryLendingRecordSumCount(Long fundId);
BigDecimal queryLendingRecordAmountMountSumCount(Long fundId);
/**
* 修改待放款用户创建时间
* */
int updatWaitingFundingCorpOperatePeopleCreaterTime(Long fundID);
/**
* 直投打款
* */
JSONObject fundsPlanLoanApply(OneClickData oneClickData,String payStatus);
}
//package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
//
///**
// * Created by shang on 2019/12/12.
// */
//public interface OneClickDataOperateJobService {
// /*
// * 执行授信成功请求
// * */
// void excuteCreditSuccessJob();
//
// /*
// * 执行授信失败请求
// * */
// void excuteCreditFailJob();
//
// /*
// * 执行查询授信状态
// * */
// void excuteSelectCreditStatusJob();
//
// /*
// * 执行放款成功请求
// * */
// void excuteFundSucessJob();
//
// /*
// * 执行放款失败请求
// * */
// void excuteFundFailJob();
//
// /*
// * 执行查询放款状态
// * */
// void excuteSelectFundStatusJob();
//
//}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
/**
* Created by shang on 2019/12/12.
*/
public interface OneClickDataOperateJobService {
/*
* 执行授信成功请求
* */
void excuteCreditSuccessJob();
/*
* 执行授信失败请求
* */
void excuteCreditFailJob();
/*
* 执行查询授信状态
* */
void excuteSelectCreditStatusJob();
/*
* 执行放款成功请求
* */
void excuteFundSucessJob();
/*
* 执行放款失败请求
* */
void excuteFundFailJob();
/*
* 执行查询放款状态
* */
void excuteSelectFundStatusJob();
}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.entity.OneClickData;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.OneClickModel;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.OneClickReslut;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.OneClickSelectModel;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import org.springframework.data.domain.Page;
/**
* Created by shang on 2019/12/5.
......@@ -11,9 +14,11 @@ public interface OneClickDataOperateService {
Result OnekeyApply(OneClickModel oneClickModel);
Result OneKeyCashWithdrawal(OneClickModel oneClickModel);
Result OneKeyCashWithdrawal(OneClickModel oneClickModel) throws Exception;
Result OneKeyCreditSuccessOrFail(OneClickModel oneClickModel) throws Exception;
OneClickReslut OneKeyLoanSuccessOrFail(OneClickModel oneClickModel);
Result OneKeyLoanSuccessOrFail(OneClickModel oneClickModel) throws Exception;
Page<OneClickSelectModel> findOneClickSelectModelByCriteriaQueryPage(OneClickSelectModel oneClickSelectModel );
}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
/**
* Created by shang on 2019/12/19.
*/
public interface OneClickDataQueueOperateService {
void getCreditNotifyIsSucess(String queueMsg);
}
......@@ -14,6 +14,8 @@ public interface PhoneInfoService {
*/
String getToken(String phone,String createdFrom) throws Exception ;
/**
* 同步session到xyqb
* 返回空
......@@ -79,7 +81,17 @@ public interface PhoneInfoService {
/**
* 查询用户审核记录
*/
QuotaCredit selectUserAuditRecords(Long qgUserId);
QuotaCredit selectUserAuditRecords(Long qgUserId,Long channel);
/**
* 查询用户审核记录
*/
QuotaCredit selectUserAuditRecordsNotCreditStatus(Long qgUserId,Long channel);
/**
* 查询用户审核记录
*/
QuotaCredit selectUserAuditRecords(String applyNo);
/**
* 授信完成通知xyqb
......
//package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
//
///**
// * Created by shang on 2019/12/5.
// */
//public interface RepaymentPlatService {
//}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.RepaymentPlan;
import com.alibaba.fastjson.JSONObject;
/**
* Created by shang on 2019/12/5.
*/
public interface RepaymentPlatService {
/**
* 是否有未还款计划
**/
RepaymentPlan whetherHaveRepayment0rdersList(String loanId);
/**
* 获取还款计划表
**/
void getRepayment0rdersList(String loanID,String token);
/**
* 支付中心token获取
**/
String getRepaymentToken(String loanID,String token);
/**
* 获取卡信息
*
* */
JSONObject getCardListInfo(String repaymentToken);
/**
* 获取金额信息
*
* * */
void getPayMoneyInfo(String repaymentToken);
/**
* 支付确认页面
* */
void paymentConfirmation(String cardBindInfoId1,String cardId);
/**
* 银行卡认证信息
* */
void bankCardAuthenticationInformation(String repaymentToken);
/**
* 发送验证码
* */
void sendSMS(String repaymentToken);
/**
* 确认支付
* */
void confirmPayment(String repaymentToken);
/**
* 绑卡操作
* */
void bingCard(String repaymentToken,JSONObject info);
/**
* 绑卡操作-获取短信验证码
* */
void bingCardSms(String repaymentToken,JSONObject info);
/**
* 绑卡操作-确认绑卡
* */
void bingCardSmsConfirm(String repaymentToken,JSONObject info);
}
//package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
//
///**
// * Created by shang on 2019/12/9.
// */
//public class ScheduleService {
//}
package cn.quantgroup.cashloanflowboss.api.oneclickdata.service;
/**
* Created by shang on 2019/12/20.
*/
public interface ScheduleService {
/**
*应用风险处理工作
* */
void applyRiskHandleJob() throws Exception;
/**
*分配资金方
* */
void applyCashDataJob() throws Exception;
/**
*拉取放款时间段资金方
* */
void loanDataJob() throws Exception;
/**
* 资金方需要处理的数据
* */
void fundingSelectJob() throws Exception;
/**
* 需要处理的数据
* */
void fetchDataLoanJob() throws Exception;
/**
* 触发 AutoLoanFetchJob
* */
void autoLoanFetchJob() throws Exception;
}
......@@ -386,7 +386,7 @@ public class OrderServiceImpl implements OrderService{
if (orderApprove == null) {
new Tuple<>(result, "需要使用KA联调平台先审批操作,才能使用放款操作");
}
}
ClfOrderMapping orderMapping = this.clfOrderMappingRepository.findByChannelOrderNoAndRegisteredFromLastOne(lendingFormModel.getChannelOrderNumber(), lendingFormModel.getChannelId());
......
//package cn.quantgroup.cashloanflowboss.core.configuration.job;
//
//import cn.quantgroup.cashloanflowboss.api.oneclickdata.entity.OneClickJobConfig;
//import cn.quantgroup.cashloanflowboss.api.oneclickdata.repository.OneClickJobConfigRepository;
//import cn.quantgroup.cashloanflowboss.core.Application;
//
//import com.dangdang.ddframe.job.api.ElasticJob;
//import com.dangdang.ddframe.job.api.simple.SimpleJob;
//import com.dangdang.ddframe.job.config.JobCoreConfiguration;
//import com.dangdang.ddframe.job.config.JobTypeConfiguration;
//import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration;
//import com.dangdang.ddframe.job.event.JobEventConfiguration;
//import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration;
//import com.dangdang.ddframe.job.lite.spring.api.SpringJobScheduler;
//import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.CommandLineRunner;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//import java.util.List;
//
//;
//
///**
// * 可以动态改变任务,(JobConfigUpdateController 提供接口)
// * Created with suntao on 2019/3/19
// */
//@Slf4j
//@Component
//public class ElasticJobLoader2 implements CommandLineRunner {
//
// @Autowired
// private OneClickJobConfigRepository oneClickJobConfigRepository;
//
// @Resource
// private ZookeeperRegistryCenter zookeeperRegistryCenter;
//
// @Resource
// private JobEventConfiguration jobEventConfiguration;
//
//
//
// @Override
// public void run(String... args) {
// List<OneClickJobConfig> oneClickJobConfigList = oneClickJobConfigRepository.findAllActive();
// if (oneClickJobConfigList == null || oneClickJobConfigList.size() == 0) {
// return;
// }
// oneClickJobConfigList.forEach(oneClickJobConfig -> registryJob(oneClickJobConfig));
// log.info("所有定时任务加载完成");
// }
//
//
// /**
// * 重新加载任务
// * @param ids
// */
// public void reloadJobByIds(List<Long> ids) {
// List<OneClickJobConfig> oneClickJobConfigList = oneClickJobConfigRepository.findAll(ids);
// oneClickJobConfigList.forEach(oneClickJobConfig -> registryJob(oneClickJobConfig));
// }
//
// private void registryJob(OneClickJobConfig oneClickJobConfigBean) {
// try {
// Class<? extends ElasticJob> jobClass = (Class<? extends ElasticJob>) Class
// .forName(oneClickJobConfigBean.getJobClass());
// ElasticJob elasticJob = getInstance(jobClass);
// SpringJobScheduler jobScheduler = jobScheduler(elasticJob, oneClickJobConfigBean);
// jobScheduler.init();
// log.info("初始化定时任务 {} ", oneClickJobConfigBean.toString());
// } catch (Exception e) {
// log.error("注册Job出错:{} ", oneClickJobConfigBean.toString(), e);
// }
//
// }
//
//
// /**
// * 通过反射对有@Resource和@Autowired的属性赋值
// *
// * @param jobClass
// * @return
// */
// private ElasticJob getInstance(Class<? extends ElasticJob> jobClass) {
// ElasticJob bean = Application.getBean(jobClass);
// return bean;
// }
//
// /**
// * 注册SpringJobScheduler
// *
// * @param elasticJob
// * @param oneClickJobConfigBean
// * @return
// */
// private SpringJobScheduler jobScheduler(ElasticJob elasticJob, OneClickJobConfig oneClickJobConfigBean) {
// LiteJobConfiguration build = LiteJobConfiguration.newBuilder(jobConfiguration(elasticJob, oneClickJobConfigBean))
// .overwrite(true).build();
// SpringJobScheduler springJobScheduler = new SpringJobScheduler(elasticJob, zookeeperRegistryCenter, build,
// jobEventConfiguration);
// return springJobScheduler;
// }
//
// /**
// * job配置
// *
// * @param elasticJob
// * @param oneClickJobConfigBean
// * @return
// */
// private JobTypeConfiguration jobConfiguration(final ElasticJob elasticJob,
// OneClickJobConfig oneClickJobConfigBean) {
// JobCoreConfiguration jobCoreConfiguration = JobCoreConfiguration
// .newBuilder(oneClickJobConfigBean.getJobName(), oneClickJobConfigBean.getCron(),
// oneClickJobConfigBean.getShardingTotalCount())
// .shardingItemParameters(oneClickJobConfigBean.getShardingItemParameters())
// .description(oneClickJobConfigBean.getDescription())
// .jobParameter(oneClickJobConfigBean.getJobParameter())
// .build();
// if (elasticJob instanceof SimpleJob) {
// return new SimpleJobConfiguration(jobCoreConfiguration, elasticJob.getClass().getCanonicalName());
// }
//
// throw new RuntimeException("未知类型定时任务:" + elasticJob.getClass().getName());
// }
//
//
//}
//package cn.quantgroup.cashloanflowboss.core.configuration.job;
//
//import com.dangdang.ddframe.job.event.JobEventConfiguration;
//import com.dangdang.ddframe.job.event.rdb.JobEventRdbConfiguration;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//
//import javax.annotation.Resource;
//import javax.sql.DataSource;
//
///**
// * 为job配置数据源
// * Created with suntao on 2019/3/19
// */
//@Configuration
//public class JobEventConfig {
//
// @Resource(name="bossDataSource")
// private DataSource dataSource;
//
// @Bean
// public JobEventConfiguration jobEventConfiguration() {
// return new JobEventRdbConfiguration(dataSource);
// }
//}
//
//package cn.quantgroup.cashloanflowboss.core.configuration.zk;
//
//
//import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperConfiguration;
//import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//
///**
// * Created with suntao on 2018/7/10
// * 如果动态添加定时任务需要zk注册类
// */
//@Configuration
//public class RegistryCenterConfig {
//
// @Bean(initMethod = "init", name = "zookeeperRegistryCenter")
// public ZookeeperRegistryCenter regCenter(@Value("${elaticjob.zookeeper.server-lists}") final String serverList, @Value("${elaticjob.zookeeper.namespace}") final String namespace) {
// return new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverList, namespace));
// }
//}
package cn.quantgroup.cashloanflowboss.spi.gyxd.entity;
import cn.quantgroup.cashloanflowboss.spi.gyxd.model.LoanProgress;
import cn.quantgroup.cashloanflowboss.spi.gyxd.model.ProductType;
import cn.quantgroup.cashloanflowboss.spi.gyxd.model.ReportProgress;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Timestamp;
/**
* Created by admin on 2016/8/23.
*/
@Data
@Entity
@Table(name = "loan_application_manifest_history")
public class LoanApplicationManifestHistory implements Serializable {
private static final long serialVersionUID = -1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "loan_id")
private String loanId; //申请单编号
@Column(name = "loan_user_id")
private Long loanUserId;
@Column(name = "channel_id")
private Integer channelId;
@Column(name = "bank_card_id")
private Long bankCardId;
/**
* 贷款进度
*
* @see LoanProgress
*/
@Column(name = "loan_progress")
private LoanProgress loanProgress; //
/**
* 上报金融局进度:0-没资格录入 1-贷款信息待录入 2-贷款信息文件已生成 3-贷款信息上传成功(已标记成功) 4-贷款信息上传失败(标记失败,可以重新导出)
*/
@Column(name = "reported_progress")
private ReportProgress reportedProgress;
@Column(name = "amount")
private BigDecimal amount; //贷款金额
@Column(name = "term")
private Integer term; //还款月数
@Column(name = "purpose")
private String purpose; //贷款用途
@Column(name = "protocol_number")
private String protocolNumber; //协议号
@Column(name = "service_fee_per_term")
private BigDecimal serviceFeePerTerm; //每期服务费
@Column(name = "total_repayment_amount")
private BigDecimal totalRepaymentAmount; //总还款额
@Column(name = "monthly_repayment")
private BigDecimal monthlyRepayment; //月还款额
@Column(name = "annual_interest_rate")
private BigDecimal annualInterestRate; //年利率
@Column(name = "principal_and_interest_per_term")
private BigDecimal principalAndInterestPerTerm; //每期用户本息
@Column(name = "total_principal_and_interest")
private BigDecimal totalPrincipalAndInterest; //总共用户本息
@Column(name = "loan_received_at")
private Timestamp loanReceivedAt; //到账时间
@Column(name = "loan_paid_at")
private Timestamp loanPaidAt; //放款时间
@Column(name = "transaction_status")
private Integer transactionStatus; //交易状态
@Column(name = "remark")
private String remark; //备注
@Column(name = "payment_notification_url")
private String paymentNotificationUrl;
@Column(name = "notify_at")
private Timestamp notifyAt; //回盘时间
@Column(name = "created_at")
private Timestamp createdAt; //创建时间
@Column(name = "updated_at")
private Timestamp updatedAt; //更新时间
@Column(name = "credit_assignment")
private Integer creditAssignment; // 债转方
@Column(name = "sign_status")
private Integer signStatus;//签约状态,0:未签约,1:签约中,2:签约成功
@Column(name = "loan_status")
private Integer loanStatus;//放款状态,0:未放款,1:放款中,2:放款成功,3:放款失败
@Column(name = "recall_status")
private Integer recallStatus;//回盘状态,0:未回盘,1:已回盘
@Column(name = "debt_status")
private Integer debtStatus;//按订单债转状态,0:未债转,1:债转中,2:已债转
@Column(name = "repay_status")
private Integer repayStatus;//还款状态,0:未还款,1:部分还款完成, 2:全部还款完成
@Column(name = "distribute_fund_id")
private Long distributeFundId;//进件资金方id
@Column(name = "credit_assigned_at")
private Timestamp creditAssignedAt; //债转完成时间
//产品类型
@Column(name = "product_type")
private ProductType productType;
}
package cn.quantgroup.cashloanflowboss.spi.gyxd.model;
/**
* Created by gaoxiang on 16/9/8.
* 贷款进度
*/
public enum LoanProgress {
ALREADY_INTO_PIECES("已进件,待签约"), //0
SIGNING("签约中"), //1
SIGNED_WAITING_PAY("已签约,待放款"), //2
PAYING("放款中"), //3
PAYED_WATING_CALLBACK("已放款,待回盘"), //4
PAY_FAILURE("放款失败"), //5
CALLBACKED_PAY_FAILURE("已回盘,放款失败"), //6
CALLBACKED_WAITING_REPAY("已回盘,待还款"), //7
REPAYING("还款中"), //8
REPAYED("已还款"), //9
OVERDUED("已逾期"), //10 未用到
CREDITASSGINMENT("已回盘,待债转"), //11 未用到
CREDITASSGINMENTDONE("债转完成"), //12
INSTALLMENT_REDAID("该笔已分期"), //13
GOODS_RETURNED_CLOSED_UNPAID("该笔未放款已退货关单"),//14
GOODS_RETURNED_CLOSED_PAID("已放款已退货关单");//15
private String message;
LoanProgress(String message) {
this.message = message;
}
}
package cn.quantgroup.cashloanflowboss.spi.gyxd.model;
/**
* 金融产品类型
*
* @author HAN CHENGLONG
* @create 2018-10-16 16:08
**/
public enum ProductType {
CASH_A("现金分期A"),//0
CONSUME_A("广达消费分期B"),//1
VCC_A("VCC");//2
private String desc;
ProductType(String desc) {
this.desc = desc;
}
}
package cn.quantgroup.cashloanflowboss.spi.gyxd.model;
/**
* Created by gaoxiang on 16/9/8.
*/
public enum ReportProgress {
NO_PERMISSIONS("没资格录入"), //0
PRE_REPORT_LOAN_INFO("待生成文件"), //1
LOAN_INFO_PRODUCED("xml文件已生成"), //2
LOAN_INFO_TAG_SUCCESS("标记成功"), //3
LOAN_INFO_TAG_FAILTURE("标记失败,可重新生成"); //4
private String message;
ReportProgress(String message){
this.message = message;
}
public String getMessage() {
return message;
}
}
package cn.quantgroup.cashloanflowboss.spi.gyxd.repository;
import cn.quantgroup.cashloanflowboss.spi.gyxd.entity.LoanApplicationManifestHistory;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
/**
* Created by admin on 2016/8/23.
*/
public interface ILoanApplicationManifestHistoryRepository extends JpaRepository<LoanApplicationManifestHistory, Long>, JpaSpecificationExecutor<LoanApplicationManifestHistory> {
/**
* @param loanId
* @return LoanApplicationManifestHistory
* */
LoanApplicationManifestHistory findByLoanId(String loanId);
/**
* @param ids
* @return LoanApplicationManifestHistory
* */
@Query(value = "select * from loan_application_manifest_history where loan_id in (?1)", nativeQuery = true)
List<LoanApplicationManifestHistory> findByLoanIds(List<String> ids);
/**
* 修改订单状态
* @param loanId
* @param loanProgress
* @return int
*/
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "UPDATE loan_application_manifest_history SET loan_progress=?2,updated_at=CURRENT_TIMESTAMP WHERE loan_id =?1 ", nativeQuery = true)
int updateLoanProgress(String loanId, Integer loanProgress);
}
//package cn.quantgroup.cashloanflowboss.spi.job.service;
//
// import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.OneClickDataOperateJobService;
// import com.dangdang.ddframe.job.api.ShardingContext;
// import com.dangdang.ddframe.job.api.simple.SimpleJob;
// import lombok.extern.slf4j.Slf4j;
// import org.springframework.beans.factory.annotation.Autowired;
// import org.springframework.stereotype.Component;
//
///**
// * Created by shang on 2019/12/12.
// */
//@Component
//@Slf4j
//public class SelectCreditStatusJob implements SimpleJob {
// @Autowired
// private OneClickDataOperateJobService oneClickDataOperateJobService;
// @Override
// public void execute(ShardingContext shardingContext) {
//
// oneClickDataOperateJobService.excuteSelectCreditStatusJob();
// }
//}
//package cn.quantgroup.cashloanflowboss.spi.job.service;
//
//import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.OneClickDataOperateJobService;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Service;
//
///**
// * Created by shang on 2019/12/26.
// */
//@Service
//public class SelectCreditStatusJobNew {
// @Autowired
// private OneClickDataOperateJobService oneClickDataOperateJobService;
//
// @Scheduled(cron = "0 0/1 * * * ?")
//// @Scheduled(cron = "0 45 20 * * ?")
// public void execute() {
// System.out.print("hello WORLD");
// oneClickDataOperateJobService.excuteSelectCreditStatusJob();
// }
//}
......@@ -38,7 +38,7 @@ public class JolyneServiceImpl implements JolyneService {
return jolyneCenter.executeSQL(jolyneDB.getDbName(), jsonData);
}
@Async("commonAsyncExecutor")
@Override
public void reloadJob(String jobName) {
jolyneCenter.reloadJob(jobName);
......
package cn.quantgroup.cashloanflowboss.spi.rabbitmq.service;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.service.Impl.OneClickDataQueueOperateServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class QueueServiceImpl implements QueueService {
@Autowired
OneClickDataQueueOperateServiceImpl oneClickDataQueueOperateService;
@Override
public void oneClickHandleMessage(String message) {
log.info("[oneClickHandleMessage]message=" + message);
oneClickDataQueueOperateService.getCreditNotifyIsSucess(message);
}
}
......@@ -28,4 +28,10 @@ public class Contract {
@Column(name = "generate_status")
private Integer generateStatus;
/**
* 提现历史表id
*/
@Column(name = "loan_application_history_id")
private Long loanApplicationHistoryId;
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.entity;
import cn.quantgroup.cashloanflowboss.spi.clf.model.LoanProgress;
import cn.quantgroup.cashloanflowboss.spi.xyqb.model.BusinessType;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
......@@ -50,7 +51,8 @@ public class LoanApplicationHistory implements Serializable {
@Column(name = "created_from")
private Long createdFrom;
@Column(name = "business_type")
private BusinessType businessType = BusinessType.CASH;
@Column(name = "baitiao_merchant_id")
private Long baitiaoMerchantId = -1L;
......
package cn.quantgroup.cashloanflowboss.spi.xyqb.entity;
import cn.quantgroup.cashloanflowboss.spi.xyqb.model.RepaymentStatusEnum;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* Created by springning on 15-7-21.
*/
@Data
@Entity
@Table(name = "repayment_plan")
public class RepaymentPlan implements Serializable {
private static final long serialVersionUID = -1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "loan_application_manifest_history_id")
private Long loanAppManifestHistoryId;
@Column(name = "loan_application_history_id")
private Long loanApplicationHistoryId;
@Column(name = "term_no")
private Integer termNo;
@Column(name = "deadline")
private Date deadline;
@Column(name = "current_repayment")
private BigDecimal currentRepayment;
@Column(name = "required_repayment")
private BigDecimal requiredRepayment;
@Column(name = "repayment_status")
private RepaymentStatusEnum repaymentStatus;
@Column(name = "created_at")
private Date createdAt;
@Column(name = "updated_at")
private Date updatedAt;
@Column(name = "repaid_at")
private Date repaidAt;
@Column(name = "pay_center_order_no")
private String payCenterOrderNo = "";
@Column(name = "repayment_received_at")
private Date repaymentReceivedAt;
@Column(name = "remark")
private String remark;
@Column(name = "transaction_flow_id")
private Long transactionFlowId;
/**
* 催收减免
*/
@Column(name = "collection_relief")
private BigDecimal collectionRelief;
@Override
public RepaymentPlan clone() {
RepaymentPlan plan = new RepaymentPlan();
plan.setId(id);
plan.setCurrentRepayment(currentRepayment);
plan.setCollectionRelief(collectionRelief);
plan.setDeadline(deadline);
plan.setLoanApplicationHistoryId(loanApplicationHistoryId);
plan.setLoanAppManifestHistoryId(loanAppManifestHistoryId);
plan.setPayCenterOrderNo(payCenterOrderNo);
plan.setRemark(remark);
plan.setRepaymentStatus(repaymentStatus);
plan.setRepaidAt(repaidAt);
plan.setRepaymentReceivedAt(repaymentReceivedAt);
plan.setRequiredRepayment(requiredRepayment);
plan.setTermNo(termNo);
plan.setUserId(userId);
return plan;
}
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.model;
import lombok.Getter;
/**
* @author mengfan.feng
* @time 2015-11-20 21:01
*/
@Getter
public enum BusinessType {
CASH("Cash", "现金业务"), // 0
BAI_TIAO("Baitiao", "白条业务"), // 1
QUOTA("quota","循环额度"), //2
BEI_KE("beike","贝壳"),//3
CONSUME_DEPENDS("consumeDepends","消费分期"),//4
PLACE_HOLDER_5("-","占位"),
SPEED_APP("speed_app","极速APP"),//6
_7("7","无"),
_8("8","无"),
/**
* 资金输出模式
*/
FUND_MODEL("fundModel","资金输出")//9
;
private String name;
private String desc;
BusinessType(String name, String desc) {
this.name = name;
this.desc = desc;
}
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.model;
/**
* Created by springning on 15-7-21.
*/
public enum RepaymentStatusEnum {
NOT_REPAY("未还款"), // 0
REPAYING("还款中"), // 1
OVERSTAY("已逾期"), // 2
REPAYED("已还款"), // 3
SYSTEM_SETTLED("取消借款"), // 4
PLACE_HOLDER_5("占位"),
PLACE_HOLDER_6("占位"),
PLACE_HOLDER_7("占位"),
PLACE_HOLDER_8("占位"),
PLACE_HOLDER_9("占位"),
PLACE_HOLDER_10("占位"),
PLACE_HOLDER_11("占位");
private String desc;
RepaymentStatusEnum(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
}
......@@ -27,6 +27,22 @@ public interface ContractRepository extends JpaRepository<Contract, Long> {
@Query(value = "update contract set generate_status = ?2 where user_id = ?1", nativeQuery = true)
int updateContractStatus(Long userId, Integer status);
/**
* 更新合同状态
*
* @param userId
* @Param loanApplicationHistoryId
* @param status
* @return
*/
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "update contract set generate_status = ?2 where user_id = ?1 and loan_application_history_id=?3 ", nativeQuery = true)
int updateContractStatusByUserIdAndLoanApplicationHistoryId (Long userId, Integer status,Long loanApplicationHistoryId);
@Query(value = "select * from contract where user_id = ?1 order by id desc limit 1", nativeQuery = true)
Contract findByUserIdLastOne(Long qgUserId);
}
package cn.quantgroup.cashloanflowboss.spi.xyqb.repository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.RepaymentPlan;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import java.sql.Timestamp;
import java.util.List;
/**
* Created by root on 15-7-23.
*/
public interface IRepaymentPlanRepository extends JpaRepository<RepaymentPlan, Long> {
List<RepaymentPlan> findByLoanApplicationHistoryIdOrderByTermNoAsc(Long loanApplicationHistoryId);
List<RepaymentPlan> findByPayCenterOrderNo(String payCenterOrderNo);
List<RepaymentPlan> findByUserId(long userid);
@Query(value = "SELECT * FROM xyqb.repayment_plan t WHERE t.loan_application_history_id = ?1 AND t.repayment_status in (0,2) order by t.term_no asc", nativeQuery = true)
List<RepaymentPlan> findByLoanIdAndStatus(Long loanId);
List<RepaymentPlan> findByLoanApplicationHistoryIdAndTermNo(Long loanId, Integer termNo);
RepaymentPlan findById(Long id);
List<RepaymentPlan> findByLoanApplicationHistoryId(Long loanId);
@Query(value = "SELECT * FROM xyqb.repayment_plan t WHERE user_id = ?1 AND loan_application_history_id = ?2", nativeQuery = true)
List<RepaymentPlan> findByUserIdAndLoanId(Long userId, Long loanId);
/**l
* 提前结清,更新还款状态为成功
*
* @return
*/
@Modifying
@Query(value = "update repayment_plan set repayment_status = 3,remark ='提前结清' ,repaid_at=?2 ,repayment_received_at=?2 where id=?1", nativeQuery = true)
int repaySuccess(Long id, Timestamp timestamp);
/**
* 批量更新还款计划状态.
*
* @return
*/
@Modifying
@Query(value = "update repayment_plan set repayment_status = ?2,remark ='小牛退课' WHERE id in ?1", nativeQuery = true)
int updateRepaymentPlanByIds(List<Long> ids, Integer status);
@Modifying
@Query(value = "update repayment_plan set repayment_status = ?2,remark =?3 WHERE loan_application_history_id = ?1", nativeQuery = true)
int updateRepaymentPlanByLoanId(Long loanId, Integer status, String remark);
}
......@@ -2,6 +2,7 @@ package cn.quantgroup.cashloanflowboss.spi.xyqb.repository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.LoanApplicationHistory;
import cn.quantgroup.cashloanflowboss.spi.xyqb.source.XYQBDataSource;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
......@@ -15,4 +16,6 @@ public interface LoanApplicationHistoryRepository extends CrudRepository<LoanApp
LoanApplicationHistory findById(Long id);
@Query(value = "select * from loan_application_history where user_id= ?1 and business_type= ?2 and is_active= 1 order by id desc limit 1", nativeQuery = true)
LoanApplicationHistory findByUserIdAndBusinessTypeAndIsActive(Long userId,Integer businessType);
}
\ No newline at end of file
......@@ -7,6 +7,8 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* Created by shang on 2019/12/18.
*/
......@@ -14,6 +16,15 @@ import org.springframework.stereotype.Repository;
@Repository
public interface QuotaCreditRepository extends JpaRepository<QuotaCredit,Long> {
@Query(value = "select * from quota_credit where user_id = ?1 and is_active = 1 and credit_status=1 order by id desc limit 1", nativeQuery = true)
QuotaCredit findByUserId(Long qgUserId);
@Query(value = "select * from quota_credit where user_id = ?1 and channel = ?2 and is_active = 1 and credit_status = 1 order by id desc limit 1", nativeQuery = true)
QuotaCredit findByUserIdAndChannelAndIsActiveAndCreditStatus(Long qgUserId,Long channel);
@Query(value = "select * from quota_credit where user_id = ?1 and channel = ?2 and is_active = 1 order by id desc limit 1", nativeQuery = true)
QuotaCredit findByUserIdAndChannelAndIsActive(Long qgUserId,Long channel);
@Query(value = "select * from quota_credit where order_no = ?1 and is_active = 1 order by id desc limit 1", nativeQuery = true)
QuotaCredit findByorderNoAndIsActive(String orderNo);
}
......@@ -3,11 +3,14 @@ package cn.quantgroup.cashloanflowboss.spi.xyqb.repository;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.WaitingFundingCorpOperatePeople;
import cn.quantgroup.cashloanflowboss.spi.xyqb.source.XYQBDataSource;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.Map;
/**
......@@ -27,6 +30,33 @@ public interface WaitingFundingCorpOperatePeopleRepository extends CrudRepositor
@Query(value = "select sum(fund_amount) ,count(*) from xyqb.waiting_funding_corp_operate_people where funding_corp_progress=0 and funding_corp_id= ?1", nativeQuery = true)
Map queryLendingRecordCount(Long fundId);
/**
* 查询待放款金额总数
*
* @param fundId
* @return
*/
@Query(value = "select sum(fund_amount) from xyqb.waiting_funding_corp_operate_people where funding_corp_progress=0 and funding_corp_id= ?1", nativeQuery = true)
BigDecimal queryFundAmountByFundingCorpProgressAndCorpLoanId(Long fundId);
/**
* 查询待放款数
*
* @param fundId
* @return
*/
@Query(value = "select count(*) from xyqb.waiting_funding_corp_operate_people where funding_corp_progress=0 and funding_corp_id= ?1", nativeQuery = true)
Long queryCountByFundingCorpProgressAndCorpLoanId(Long fundId);
WaitingFundingCorpOperatePeople findByLoanApplicationHistoryId(Long loanId);
// 通过id修改 添加订单号 产品id token信息
@Transactional(rollbackFor = Exception.class)
@Modifying
@Query(value = "update xyqb.waiting_funding_corp_operate_people set created_at = DATE_SUB(CURDATE(), INTERVAL 5 MINUTE) where loan_application_history_id =?1", nativeQuery = true)
int updateByLoanApplicationHistoryId(Long loanApplicationHistoryId);
}
\ No newline at end of file
......@@ -7,6 +7,7 @@ import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.spi.xyqb.entity.*;
import javax.transaction.Transactional;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
......@@ -20,8 +21,14 @@ public interface XYQBCenterService {
int updateContractStatus(Long userId, Integer status);
int updateContractStatus(Long userId, Integer status,Long loanApplicationHistoryId);
Map queryLendingRecordCount(Long fundId);
Long queryLendingRecordSumCount(Long fundId);
BigDecimal queryLendingRecordAmountMountSumCount(Long fundId);
Long cancelPreLoan(String channelOrderNumber);
Contract findContractByUserId(Long userId);
......
......@@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;
......@@ -68,6 +69,17 @@ public class XYQBCenterServiceImpl implements XYQBCenterService {
return this.contractRepository.updateContractStatus(userId, status);
}
/**
* 更新合同状态
*
* @param userId
* @return
*/
@Override
public int updateContractStatus(Long userId, Integer status,Long loanApplicationHistoryId) {
return this.contractRepository.updateContractStatusByUserIdAndLoanApplicationHistoryId(userId, status, loanApplicationHistoryId);
}
/**
* 查询放款记录
*
......@@ -80,6 +92,29 @@ public class XYQBCenterServiceImpl implements XYQBCenterService {
}
/**
* 查询放款记录总数
*
* @param fundId
* @return
*/
@Override
public Long queryLendingRecordSumCount(Long fundId) {
return this.waitingFundingCorpOperatePeopleRepository.queryCountByFundingCorpProgressAndCorpLoanId(fundId);
}
/**
* 查询放款记录总金额数
*
* @param fundId
* @return
*/
@Override
public BigDecimal queryLendingRecordAmountMountSumCount(Long fundId) {
return this.waitingFundingCorpOperatePeopleRepository.queryFundAmountByFundingCorpProgressAndCorpLoanId(fundId);
}
/**
* 贷前取消借款
* @param channelOrderNumber
......
package cn.quantgroup.cashloanflowboss.utils;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by shang on 2019/7/24.
*/
public class CoverDate {
/*
* yyyy-MM-dd HH:mm:ss
* @return
* */
public static String getStringDate() {
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(currentTime);
return dateString;
}
/*
* yyyy-MM-dd HH:mm:ss
* @param dateDate
* @return
* */
public static String getStringDate(Date dateDate) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(dateDate);
return dateString;
}
/*
* yyyy-MM-dd
* @return
* */
public static String getTimeShort() {
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String dateString = formatter.format(currentTime);
return dateString;
}
/*
* yyyy-MM-dd
* @param dateDate
* @return
* */
public static String getTimeShort(Date dateDate) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String dateString = formatter.format(dateDate);
return dateString;
}
/*
* yyyy-MM-dd HH:mm:ss
* @param strDate
* @return
* */
public static Date strToDateLong(String strDate) {
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(currentTime);
ParsePosition pos = new ParsePosition(0);
Date strtodate = formatter.parse(strDate, pos);
return strtodate;
}
/*
* yyyy-MM-dd
* @param strDate
* @return
* */
public static Date strToDateShort(String strDate) {
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String dateString = formatter.format(currentTime);
ParsePosition pos = new ParsePosition(0);
Date strtodate = formatter.parse(strDate, pos);
return strtodate;
}
}
package cn.quantgroup.cashloanflowboss.utils;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.ChannelEnum;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.CreditStatusEnum;
import cn.quantgroup.cashloanflowboss.api.oneclickdata.model.LoanStatusEnum;
import cn.quantgroup.cashloanflowboss.utils.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
......@@ -69,14 +71,37 @@ public class GetEncryptContentAndMd5 {
}
public static String getChannelName(String channel){
for(ChannelEnum channelEnum:ChannelEnum.values()){
if(channel.equals(channelEnum.getCode())){
return channelEnum.getDesc();
}
}
return "";
}
public static String getLoanMessage(int loanCode){
for(LoanStatusEnum loanStatusEnum:LoanStatusEnum.values()){
if(loanCode == loanStatusEnum.getCode()){
return loanStatusEnum.getDesc();
}
}
return "";
}
public static String getCreditMessage(int creditCode){
for(CreditStatusEnum creditStatusEnum:CreditStatusEnum.values()){
if(channel.equals(creditStatusEnum.getCode())){
if(creditCode == creditStatusEnum.getCode()){
return creditStatusEnum.getDesc();
}
}
return "";
}
return "";
public static void main(String[] arg){
String channelName= getChannelName("159858");
System.out.print("打印渠道名称: "+channelName);
}
}
//package cn.quantgroup.cashloanflowboss.utils;
//
//import cn.quantgroup.cashloanflowboss.utils.http.HttpRequest;
//import com.alibaba.fastjson.JSONObject;
//
//
//import com.dangdang.ddframe.job.lite.lifecycle.api.JobAPIFactory;
//import com.dangdang.ddframe.job.lite.lifecycle.api.JobOperateAPI;
//import com.google.common.base.Optional;
//import lombok.extern.slf4j.Slf4j;
//
//
///**
// * Created by shang on 2019/7/23.
// */
//@Slf4j
//public class GetScheduleJob {
// public static String getScheduleJob(String namespace,String jobNameSpace,String jobName){
// String ZKRquestUrl=CommonConstant.GETZK+namespace;
// JSONObject responseZkIpPort= HttpRequest.doGetReturnResponseJson(ZKRquestUrl, null);
// log.info("打印结果={} " + responseZkIpPort);
// getZkJob(responseZkIpPort, jobNameSpace, jobName);
// return "";
// }
//
//
// public static void getZkJob(JSONObject ZKRquestUrlJson,String jobNameSpace,String jobName){
// JSONObject ZKRquestUrl1= (JSONObject)ZKRquestUrlJson.get("details");
// String url=ZKRquestUrl1.get("ZOOKEEPER_SERVICE_HOST").toString().trim();
// String prot=ZKRquestUrl1.get("ZOOKEEPER_SERVICE_PORT").toString().trim();
// String ZKRquestUrl=url+":"+prot;
////
// JobOperateAPI jobAPIService = JobAPIFactory.createJobOperateAPI(ZKRquestUrl, jobNameSpace, Optional.<String>fromNullable(null));
// jobAPIService.trigger(Optional.of(jobName), Optional.<String>absent());
//
//
// }
//
// public static void main(String[] args){
// getScheduleJob("ka1", "clotho-elastic-job", "cn.qg.clotho.job.ApplyRiskHandleJob");
//
// }
//
//
//}
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