Commit ca6c9738 authored by 王向伟's avatar 王向伟

模板代码

parents
Pipeline #567 failed with stages
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="Spring" name="Spring">
<configuration />
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.3.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.3.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.2.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.2.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.3.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.3.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.13.2" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.13.2" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.2.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.2.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.26" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-freemarker:2.3.0.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.30" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.2.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.8" level="project" />
<orderEntry type="library" name="Maven: cn.hutool:hutool-all:5.0.6" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.12" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.3.0.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.3.0.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.3.0.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.16.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.6.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.6.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.6.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.6.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.6.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.6.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.3.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.10.10" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.10.10" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:3.3.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.2.6.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.7.0" level="project" />
</component>
</module>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.quantgroup</groupId>
<artifactId>codegenerator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ka-code-generator</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.0.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
package cn.quantgroup.codegenerator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class CodegeneratorApplication {
public static void main(String[] args) {
SpringApplication.run(CodegeneratorApplication.class, args);
}
}
package cn.quantgroup.codegenerator.util;
/**
* @author xuxueli 2018-05-02 21:10:28
*/
public class CodeGenerateException extends RuntimeException {
private static final long serialVersionUID = 42L;
public CodeGenerateException() {
super();
}
public CodeGenerateException(String msg) {
super(msg);
}
public CodeGenerateException(String msg, Throwable cause) {
super(msg, cause);
}
public CodeGenerateException(Throwable cause) {
super(cause);
}
public CodeGenerateException(String message, Throwable cause,
boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
package cn.quantgroup.codegenerator.util;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Map;
/**
* freemarker tool
*
* @author xuxueli 2018-05-02 19:56:00
*/
@Component
public class FreemarkerTool {
@Autowired
private Configuration configuration;
/**
* process Template Into String
*
* @param template
* @param model
* @return
* @throws IOException
* @throws TemplateException
*/
public String processTemplateIntoString(Template template, Object model)
throws IOException, TemplateException {
StringWriter result = new StringWriter();
template.process(model, result);
return result.toString();
}
/**
* process String
*
* @param templateName
* @param params
* @return
* @throws IOException
* @throws TemplateException
*/
public String processString(String templateName, Map<String, Object> params)
throws IOException, TemplateException {
Template template = configuration.getTemplate(templateName);
String htmlText = processTemplateIntoString(template, params);
return htmlText;
}
@PostConstruct
public void init(){
processFile();
}
public void processFile(){
String modelPath = System.getProperty("user.dir") + "\\src\\main\\resources\\templates\\code-generator\\model";
String servicePath = System.getProperty("user.dir") + "\\src\\main\\resources\\templates\\code-generator\\service";
String callbackPath = System.getProperty("user.dir") + "\\src\\main\\resources\\templates\\code-generator\\callback";
String eventHandlerPath = System.getProperty("user.dir") + "\\src\\main\\resources\\templates\\code-generator\\eventhandler";
String enumsPath = System.getProperty("user.dir") + "\\src\\main\\resources\\templates\\code-generator\\enums";
String utilPath = System.getProperty("user.dir") + "\\src\\main\\resources\\templates\\code-generator\\util";
try {
Map<String,String> root = XmlParseUtil.parseXml();
createJavaFile(root,modelPath,"model");
createJavaFile(root,servicePath,"service");
createJavaFile(root,callbackPath,"callback");
createJavaFile(root,eventHandlerPath,"eventhandler");
createJavaFile(root,enumsPath,"enums");
createJavaFile(root,utilPath,"util");
} catch (Exception e) {
e.printStackTrace();
}
}
private void createJavaFile(Map<String, String> root, String filePath,String target) throws Exception{
File file = new File(filePath);
if(!file.exists() || !file.isDirectory()){
return;
}
File[] files = file.listFiles();
for (File childFile : files) {
String name = childFile.getName();
Template template = configuration.getTemplate("code-generator/"+target+"/"+name);
String path = root.get(target+"Path");
File directory = new File(path);
if(!directory.exists()){
directory.mkdirs();
}
File javaFile = new File(path, root.get("prefix")+name.replace(".ftl",".java"));
if(!javaFile.exists()) javaFile.createNewFile();
FileWriter fw = new FileWriter(javaFile);
template.process(root, fw);
fw.close();
}
}
}
package cn.quantgroup.codegenerator.util;
/**
* string tool
*
* @author xuxueli 2018-05-02 20:43:25
*/
public class StringUtils {
/**
* 首字母大写
*
* @param str
* @return
*/
public static String upperCaseFirst(String str) {
return str.substring(0, 1).toUpperCase() + str.substring(1);
}
/**
* 首字母小写
*
* @param str
* @return
*/
public static String lowerCaseFirst(String str) {
//2019-2-10 解决StringUtils.lowerCaseFirst潜在的NPE异常@liutf
return (str!=null&&str.length()>1)?str.substring(0, 1).toLowerCase() + str.substring(1):"";
}
/**
* 下划线,转换为驼峰式
*
* @param underscoreName
* @return
*/
public static String underlineToCamelCase(String underscoreName) {
StringBuilder result = new StringBuilder();
if (underscoreName != null && underscoreName.trim().length() > 0) {
boolean flag = false;
for (int i = 0; i < underscoreName.length(); i++) {
char ch = underscoreName.charAt(i);
if ("_".charAt(0) == ch) {
flag = true;
} else {
if (flag) {
result.append(Character.toUpperCase(ch));
flag = false;
} else {
result.append(ch);
}
}
}
}
return result.toString();
}
public static void main(String[] args) {
}
}
package cn.quantgroup.codegenerator.util;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
/**
* @author Wang Xiangwei
* @version 2020/6/1
*/
public class XmlParseUtil {
public static Map<String, String> parseXml() throws Exception {
Map<String,String> node = new HashMap<>();
File xmlFile = new File(System.getProperty("user.dir"), "\\src\\main\\resources\\GenerateConf.xml");
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document doc = builder.parse(xmlFile);
Element rootElement = doc.getDocumentElement(); //获取根元素
Node author = rootElement.getElementsByTagName("author").item(0);
String authorValue = author.getFirstChild().getNodeValue();
node.put("author",authorValue);
Node prefix = rootElement.getElementsByTagName("prefix").item(0);
String prefixValue = prefix.getFirstChild().getNodeValue();
node.put("prefix",prefixValue);
Node model = rootElement.getElementsByTagName("model").item(0);
String modelPath = ((Element) model).getAttribute("path");
String modelPackage = ((Element) model).getElementsByTagName("packageName").item(0).getFirstChild().getNodeValue();
node.put("modelPath",modelPath);
node.put("modelPackage",modelPackage);
Node util = rootElement.getElementsByTagName("util").item(0);
String utilPath = ((Element) util).getAttribute("path");
String utilPackage = ((Element) util).getElementsByTagName("packageName").item(0).getFirstChild().getNodeValue();
node.put("utilPath",utilPath);
node.put("utilPackage",utilPackage);
Node enums = rootElement.getElementsByTagName("enums").item(0);
String enumsPath = ((Element) enums).getAttribute("path");
String enumsPackage = ((Element) enums).getElementsByTagName("packageName").item(0).getFirstChild().getNodeValue();
node.put("enumsPath",enumsPath);
node.put("enumsPackage",enumsPackage);
Node callback = rootElement.getElementsByTagName("callback").item(0);
String callbackPath = ((Element) callback).getAttribute("path");
String callbackPackage = ((Element) callback).getElementsByTagName("packageName").item(0).getFirstChild().getNodeValue();
node.put("callbackPath",callbackPath);
node.put("callbackPackage",callbackPackage);
Node service = rootElement.getElementsByTagName("service").item(0);
String servicePath = ((Element) service).getAttribute("path");
String servicePackage = ((Element) service).getElementsByTagName("packageName").item(0).getFirstChild().getNodeValue();
node.put("servicePath",servicePath);
node.put("servicePackage",servicePackage);
Node eventHandler = rootElement.getElementsByTagName("eventHandler").item(0);
String eventHandlerPath = ((Element) eventHandler).getAttribute("path");
String eventHandlerPackage = ((Element) eventHandler).getElementsByTagName("packageName").item(0).getFirstChild().getNodeValue();
node.put("eventhandlerPath",eventHandlerPath);
node.put("eventhandlerPackage",eventHandlerPackage);
return node;
}
public static void main(String[] args) {
try {
Map<String, String> stringStringMap = XmlParseUtil.parseXml();
System.out.println(stringStringMap);
} catch (Exception e) {
e.printStackTrace();
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<root>
<!-- 类前缀 用渠道拼音 用到service serviceImpl eventHandler 入参 出参中-->
<author>WangXiangwei</author>
<prefix>TestChannel</prefix>
<model path="E:\testchannel\dto\model">
<packageName>cn.quantgroup.clf.api.testchannel.dto.model</packageName>
</model>
<util path="E:\testchannel\dto\util">
<packageName>cn.quantgroup.clf.api.testchannel.dto.util</packageName>
</util>
<enums path="E:\testchannel\dto\enums">
<packageName>cn.quantgroup.clf.api.testchannel.dto.enums</packageName>
</enums>
<callback path="E:\testchannel\dto\callback">
<packageName>cn.quantgroup.clf.api.testchannel.dto.callback</packageName>
</callback>
<service path="E:\testchannel\service">
<packageName>cn.quantgroup.clf.api.testchannel.service</packageName>
</service>
<eventHandler path="E:\testchannel\eventhandler">
<packageName>cn.quantgroup.clf.api.testchannel.eventhandler</packageName>
</eventHandler>
</root>
server:
port: 1234
servlet:
context-path: /generator
spring:
application:
name: spring-boot-code-generator
freemarker:
request-context-attribute: request
suffix: .ftl
content-type: text/html
enabled: true
cache: false
charset: UTF-8
allow-request-override: false
expose-request-attributes: true
expose-session-attributes: true
expose-spring-macro-helpers: true
#template-loader-path: classpath:/templates/
package ${callbackPackage};
import lombok.Data;
import java.util.List;
/**
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}ContractInfoNotice {
private String channelLoanNo;
private String loanNo;
private List<${prefix}InoutPlanNotice> inoutPlanList;
}
\ No newline at end of file
package ${callbackPackage};
import lombok.Data;
import java.math.BigDecimal;
/**
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}InoutPlanNotice {
private Integer leaseTime;
/**
* 本次到账本金
*/
private BigDecimal receivedCorpus;
/**
* 本次到账利息
*/
private BigDecimal receivedInterest;
/**
* 本次到账罚息
*/
private BigDecimal receivedFine;
/**
* 本次到账复利
*/
private BigDecimal receivedInterestRate;
/**
* 本次到账总金额
*/
private BigDecimal receivedTotalAmount;
/**
* 本次到账额外费用
*/
private BigDecimal extraFee;
/**
* 额外费用信息
*/
private String extraInfo;
}
package ${callbackPackage};
import cn.quantgroup.cashloanflow.entity.cashloanflow.LoanOrderMapping;
import cn.quantgroup.cashloanflow.entity.cashloanflow.UserMapping;
import cn.quantgroup.cashloanflow.model.standard.response.credit.QueryCreditStatusResponseModel;
import cn.quantgroup.cashloanflow.util.DateUtil;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import ${enumsPackage}.${prefix}CreditResultEnum;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* 授信结果回调
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}QueryCreditApplyCallback {
private String channelUserId;
private String channelOrderNo;
private String applyNo;
private ${prefix}CreditResultEnum creditResult;
/**
* 授信总金额()
*/
private BigDecimal creditAmount;
/**
* 授信剩余可用额度()
*/
private BigDecimal creditAvailable;
/**
* 分期规则,还款方式分期(REPAYMENT_METHOD)
*/
private String termLabelsRule;
private List<${prefix}RepaymentMethodTermLabel> repaymentMethodTermLabels;
/**
* 授信额度失效日期如:"2020-03-05"
*/
private String limitExpireDate;
/**
* 用户授信情况描述,若”授信拒绝“则显示拒绝原因
*/
private String creditInfo;
/**
* 下次申请时间(如yyyy-MM-dd,如果额度申请结果为拒绝需要提供
*/
private String nextApplyTime;
public static ${prefix}QueryCreditApplyCallback getSuccessResult(LoanOrderMapping orderMapping, UserMapping userMapping, QueryCreditStatusResponseModel info) {
${prefix}QueryCreditApplyCallback result = new ${prefix}QueryCreditApplyCallback();
result.setChannelUserId(userMapping.getChannelUserId());
result.setChannelOrderNo(orderMapping.getChannelOrderNo());
result.setApplyNo(orderMapping.getApplyNo());
result.setCreditResult(${prefix}CreditResultEnum.CREDIT_NORMAL);
result.setCreditAmount(StringUtils.isBlank(info.getApprovalAmount()) ? BigDecimal.ZERO : new BigDecimal(info.getApprovalAmount()));
result.setCreditAvailable(StringUtils.isBlank(info.getApprovalAmount()) ? BigDecimal.ZERO : new BigDecimal(info.getApprovalAmount()));
result.setTermLabelsRule("REPAYMENT_METHOD");
List<${prefix}RepaymentMethodTermLabel> list = new ArrayList<>();
${prefix}RepaymentMethodTermLabel methodTermLabel = new ${prefix}RepaymentMethodTermLabel();
methodTermLabel.setTermLabelsRuleValue("EQUAL_RENT");
String monthlyInterestRate = info.getMonthlyInterestRate();
methodTermLabel.setDailyRate(StringUtils.isBlank(monthlyInterestRate) ? BigDecimal.ZERO : new BigDecimal(monthlyInterestRate).divide(new BigDecimal("30"), 4, BigDecimal.ROUND_HALF_UP));
methodTermLabel.setMonthlyRate(StringUtils.isBlank(monthlyInterestRate) ? BigDecimal.ZERO : new BigDecimal(monthlyInterestRate).setScale(4, BigDecimal.ROUND_HALF_UP));
methodTermLabel.setYearlyRate(StringUtils.isBlank(monthlyInterestRate) ? BigDecimal.ZERO : new BigDecimal(monthlyInterestRate).multiply(new BigDecimal("12")).setScale(4, BigDecimal.ROUND_HALF_UP));
methodTermLabel.setLoanTerm(info.getApprovalTerm());
list.add(methodTermLabel);
result.setRepaymentMethodTermLabels(list);
result.setLimitExpireDate(DateUtil.format(info.getValidDate(), DateUtil.YYYY_MM_DD));
return result;
}
}
\ No newline at end of file
package ${callbackPackage};
import lombok.Data;
import ${enumsPackage}.${prefix}LoanApplyStatusEnum;
/**
* 借款结果回调
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}QueryLoanCallback {
private String channelUserId;
private String loanNo;
private String channelLoanNo;
private ${prefix}LoanApplyStatusEnum loanApplyStatus;
private String applyResult;
}
\ No newline at end of file
package ${callbackPackage};
import cn.quantgroup.cashloanflow.entity.cashloanflow.UserMapping;
import cn.quantgroup.cashloanflow.model.xyqbmq.QuotaNoticeExtraDto;
import cn.quantgroup.loanflow.notified.event.model.RepaySuccessEvent;
import cn.quantgroup.loanflow.repay.model.RepaymentPlanItem;
import lombok.Data;
import ${enumsPackage}.${prefix}RepayStatusEnum;
import ${enumsPackage}.${prefix}RepayTypeEnum;
import cn.quantgroup.cashloanflow.service.callback.loan.state.guomei.RepaymentType;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* 还款回调
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}QueryRepayCallback {
private String channelUserId;
private String businessFlowNo;
private String channelRepayFlowNo;
private BigDecimal repaymentAmount;
private ${prefix}RepayStatusEnum repayStatus;
private String failMsg;
private String failCode;
private ${prefix}RepayTypeEnum repayType;
/**
* 实际还款时间(金额实际到账的时间,精确到时分秒) 格式如:yyyy-MM-dd HH:mm:ss 成功的时候必填
*/
private String actualTime;
private List<${prefix}ContractInfoNotice> contractList;
public static ${prefix}QueryRepayCallback getSuccessResult(String channelUserId, RepaySuccessEvent repaySuccessEvent, String channelLoanNo, String channelRepayFlowNo, List<RepaymentPlanItem> repaymentPlans) {
Long loanId = repaySuccessEvent.getLoanId();
String xyqbRepayFlowNo = repaySuccessEvent.getBusinessFlowNo();
BigDecimal actualRepayment = repaySuccessEvent.getActualRepayment();
String repaymentReceivedAt = repaySuccessEvent.getRepaymentReceivedAt();
${prefix}QueryRepayCallback callback = new ${prefix}QueryRepayCallback();
callback.setChannelUserId(channelUserId);
callback.setChannelRepayFlowNo(channelRepayFlowNo);
callback.setBusinessFlowNo(xyqbRepayFlowNo);
callback.setRepaymentAmount(actualRepayment);
callback.setRepayStatus(${prefix}RepayStatusEnum.SUCCESS);
callback.setActualTime(repaymentReceivedAt);
callback.setRepayType(getRepayType(repaySuccessEvent.getRepayType()));
List<${prefix}ContractInfoNotice> contractInfoNotices = new ArrayList<>();
${prefix}ContractInfoNotice notice = new ${prefix}ContractInfoNotice();
notice.setChannelLoanNo(channelLoanNo);
notice.setLoanNo(String.valueOf(loanId));
List<${prefix}InoutPlanNotice> inoutPlanNotices = new ArrayList<>();
repaymentPlans.forEach(i -> {
${prefix}InoutPlanNotice planNotice = new ${prefix}InoutPlanNotice();
planNotice.setLeaseTime(i.getPeriodNo());
planNotice.setReceivedCorpus(i.getActPrincipal());
planNotice.setReceivedInterest(i.getActInterest());
planNotice.setReceivedFine(i.getActOverdueInterest());
planNotice.setReceivedTotalAmount(i.getRepayAmount());
planNotice.setExtraFee(i.getActServiceFee());
planNotice.setReceivedInterestRate(BigDecimal.ZERO);
inoutPlanNotices.add(planNotice);
});
notice.setInoutPlanList(inoutPlanNotices);
contractInfoNotices.add(notice);
callback.setContractList(contractInfoNotices);
return callback;
}
private static ${prefix}RepayTypeEnum getRepayType(RepaymentType koalaRepay) {
switch (koalaRepay){
case COMMON:
return ${prefix}RepayTypeEnum.ACTIVE;
case OFFLINE_REPAY:
return ${prefix}RepayTypeEnum.OFFLINE;
case SELF_WITHHOLD:
return ${prefix}RepayTypeEnum.BATCH;
default: return ${prefix}RepayTypeEnum.OTHER;
}
}
}
package ${callbackPackage};
import cn.quantgroup.cashloanflow.model.xyqbmq.QuotaNoticeExtraDto;
import lombok.Data;
/**
* 额度失效
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}QuotaExpired {
private QuotaNoticeExtraDto extraDto;
private String channelUserId;
private Long channelId;
private Long limitExpireDate;
}
package ${callbackPackage};
import lombok.Data;
import ${enumsPackage}.${prefix}CreditStatusCallBackEnum;
import java.math.BigDecimal;
/**
* 额度失效通知
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}QuotaExpiredCallback {
private String channelUserId;
private BigDecimal creditAmount;
private ${prefix}CreditStatusCallBackEnum creditStatus;
private String limitExpireDate;
}
package ${callbackPackage};
import lombok.Data;
import java.math.BigDecimal;
/**
* 分期详情
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}RepaymentMethodTermLabel {
/**
* 分期规则, EQUAL_RENT:等额本息;
*/
private String termLabelsRuleValue;
/**
* 日利率(小数)
*/
private BigDecimal dailyRate;
/**
* 年利率(小数)
*/
private BigDecimal yearlyRate;
/**
* 月利率(小数)
*/
private BigDecimal monthlyRate;
/**
* 期数,逗号分隔 6,9
*/
private String loanTerm;
}
package ${enumsPackage};
/**
* 枚举类型,包括:
* CREDIT(授信阶段)
* BANKCARD(绑卡阶段)
* APPLY(进入准备借款阶段之前)、
* LOAN_REDAY(借款准备阶段)、
* LOAN(已借款阶段)
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public enum ${prefix}AgreementTypeEnum {
CREDIT,
BANKCARD,
APPLY,
LOAN_REDAY,
LOAN;
}
\ No newline at end of file
package ${enumsPackage};
/**
* 还款计划状态
* UN_CHARGE_OFF:未还款,
* ALL_CHARGE_OFF:已还款,
* PART_OF_CHARGE_OFF:部分还款
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public enum ${prefix}ChargeOffStatusEnum {
UN_CHARGE_OFF,
ALL_CHARGE_OFF,
PART_OF_CHARGE_OFF;
}
\ No newline at end of file
package ${enumsPackage};
/**
* 合同状态
* LOAN_FALL(借款申请同步失败,放款失败都返回这个值):借款失败,
* EXECUTING:履行中(放款已经成功到借据结清之间) ,
* LOANING:借款中(借款申请成功发起到借款放款成功之间),
* SETTLE:结清(借据结清)
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public enum ${prefix}ContractStatusEnum {
LOAN_FALL,
EXECUTING,
LOANING,
SETTLE;
}
\ No newline at end of file
package ${enumsPackage};
/**
* 用户当前授信状态 枚举类型,
* 包括“CREDIT_APPROVAL:审批中”、
* CREDIT_FROZEN 已冻结”、
* CREDIT_INVALID:已失效、过期”、
* CREDIT_NORMAL 正常使用,
* REFUSE 拒绝)
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public enum ${prefix}CreditResultEnum {
/**
* 审批中
*/
CREDIT_APPROVAL,
/**
* 已冻结
*/
CREDIT_FROZEN,
/**
* 已失效、过期
*/
CREDIT_INVALID,
/**
* 正常使用
*/
CREDIT_NORMAL,
/**
* 拒绝
*/
REFUSE;
}
\ No newline at end of file
package ${enumsPackage};
/**
* 用户额度状态枚举值:冻结(FROZEN)、过期(EXPIRED)、正常(NORMAL)
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public enum ${prefix}CreditStatusCallBackEnum {
/**
* 冻结
*/
FROZEN,
/**
* 过期
*/
EXPIRED,
/**
* 正常
*/
NORMAL;
}
\ No newline at end of file
package ${enumsPackage};
/**
* 借款申请结果
* SUCCESS:成功, FAIL:失败, REFUSE:拒绝,申请中APPLYING
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public enum ${prefix}LoanApplyStatusEnum {
SUCCESS,
FAIL,
REFUSE,
APPLYING;
}
package ${enumsPackage};
import cn.quantgroup.cashloanflow.model.LoanDemandPurposeEnum;
import lombok.Getter;
/**
* 金山用户借款用途列表
* 枚举类型 purpose01"个人日常消费" purpose02"装修"purpose03: "旅游"purpose04: "医疗"purpose05: "教育"purpose100"其他消费".
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public enum ${prefix}LoanPurposesEnum {
/**
* "个人日常消费"
*/
purpose01("个人日常消费"),
/**
* "装修"
*/
purpose02("装修"),
/**
* "旅游"
*/
purpose03("旅游"),
/**
* "医疗"
*/
purpose04("医疗"),
/**
* "教育"
*/
purpose05("教育"),
/**
* "其他消费"
*/
purpose100("其他消费");
@Getter
private String value;
${prefix}LoanPurposesEnum(String value) {
this.value = value;
}
public static LoanDemandPurposeEnum getKoaLaPurpose(${prefix}LoanPurposesEnum loanPurposesEnum) {
switch (loanPurposesEnum) {
case purpose01:
return LoanDemandPurposeEnum.PERSONAL_DAILY_CONSUMPTION;
case purpose02:
return LoanDemandPurposeEnum.FAMILY_DECORATION;
case purpose03:
return LoanDemandPurposeEnum.TOURIST_HOLIDAY;
case purpose04:
return LoanDemandPurposeEnum.HEALTH_CARE;
case purpose05:
return LoanDemandPurposeEnum.EDUCATION_AND_TRAINING;
case purpose100:
return LoanDemandPurposeEnum.PERSONAL_DAILY_CONSUMPTION;
default:
return LoanDemandPurposeEnum.PERSONAL_DAILY_CONSUMPTION;
}
}
}
\ No newline at end of file
package ${enumsPackage};
/**
* 逾期状态:
* NORMAL:正常,
* OVERDUE:逾期
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public enum ${prefix}OverdueStatusEnum {
NORMAL,
OVERDUE;
}
\ No newline at end of file
package ${enumsPackage};
/**
* 还款结果(枚举值:SUCCESS:成功, FAIL:失败,处理中:APPLYING
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public enum ${prefix}RepayStatusEnum {
SUCCESS,
FAIL,
APPLYING;
/**
* 根据核心系统返回的还款状态转为金山还款状态
*
* @param repayStatus
* @return
*/
public static ${prefix}RepayStatusEnum getStatusByRepayStatus(String repayStatus) {
// * repayStatus : 0 未还款, 1 还款中(发起成功),2 失败, 3 还款成功
switch (repayStatus) {
case "0":
case "2":
return FAIL;
case "1":
return APPLYING;
case "3":
return SUCCESS;
default:
return null;
}
}
}
\ No newline at end of file
package ${enumsPackage};
/**
* 还款类型(主动还款:ACTIVE,批量扣款:BATCH,线下还款:OFFLINE,其他:OTHER
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public enum ${prefix}RepayTypeEnum {
ACTIVE,
BATCH,
OFFLINE,
OTHER;
}
\ No newline at end of file
package ${enumsPackage};
import lombok.Getter;
/**
* 0 (未还款)2 (已逾期)3 (已还款)",
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public enum ${prefix}RepaymentStatusEnum {
NO_REPAY(0),
OVERDUE(2),
OK_REPAY(3);
@Getter
private int value;
${prefix}RepaymentStatusEnum(int value) {
this.value = value;
}
}
\ No newline at end of file
package ${enumsPackage};
/**
* 展示类型,枚举型,包括“弹框展示:DIALOG”和“勾选:HOOK_SHOW
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public enum ${prefix}ShowTypeEnum {
DIALOG,
HOOK_SHOW;
}
\ No newline at end of file
package ${enumsPackage};
/**
* 绑卡状态:
* SUCCESS:成功;
* FAIL:失败
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public enum ${prefix}SignStatusEnum {
SUCCESS,
FAIL
}
\ No newline at end of file
package ${enumsPackage};
/**
* 准入接口返回值
* 包括 CONTINUE BREAK 两种返回结果。
* CONTINUE代表该用户可以继续进行后面的注册等操作,
* BREAK代表该用户不予以接受,不能进行后续的注册等操作
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public enum ${prefix}UserAccessResultEnum {
CONTINUE,
BREAK;
}
\ No newline at end of file
package ${eventhandlerPackage};
import ${enumsPackage}.${prefix}CreditResultEnum;
import ${enumsPackage}.${prefix}CreditStatusCallBackEnum;
import ${enumsPackage}.${prefix}RepayStatusEnum;
import ${callbackPackage}.${prefix}QueryCreditApplyCallback;
import ${callbackPackage}.${prefix}QueryRepayCallback;
import ${callbackPackage}.${prefix}QueryLoanCallback;
import ${callbackPackage}.${prefix}QuotaExpired;
import ${callbackPackage}.${prefix}QuotaExpiredCallback;
import ${enumsPackage}.${prefix}LoanApplyStatusEnum;
import cn.quantgroup.cashloanflow.entity.cashloanflow.LoanMapping;
import cn.quantgroup.cashloanflow.entity.cashloanflow.LoanOrderMapping;
import cn.quantgroup.cashloanflow.entity.cashloanflow.RepayFlowNoMapping;
import cn.quantgroup.cashloanflow.entity.cashloanflow.UserMapping;
import cn.quantgroup.cashloanflow.model.callback.KANoticeType;
import cn.quantgroup.cashloanflow.model.standard.response.credit.QueryCreditStatusResponseModel;
import cn.quantgroup.cashloanflow.model.xyqbmq.QuotaNoticeExtraDto;
import cn.quantgroup.cashloanflow.model.xyqbmq.QuotaRefuseNoticeExtraData;
import cn.quantgroup.cashloanflow.repository.cashloanflow.IRepayFlowNoMappingRepository;
import cn.quantgroup.cashloanflow.service.cashloanflow.ILoanOrderMappingService;
import cn.quantgroup.cashloanflow.service.cashloanflow.IUserMappingService;
import cn.quantgroup.cashloanflow.service.cashloanflow.LoanMappingService;
import cn.quantgroup.cashloanflow.util.DateUtil;
import cn.quantgroup.clf.api.jinshan.dto.callback.OrderAndUserMapping;
import cn.quantgroup.clf.util.JSONTools;
import cn.quantgroup.loanflow.application.StandardApplicationService;
import cn.quantgroup.loanflow.asynctask.executor.config.BizAppId;
import cn.quantgroup.loanflow.asynctask.model.AsyncTask;
import cn.quantgroup.loanflow.asynctask.model.HttpTaskBody;
import cn.quantgroup.loanflow.exception.CommonBizException;
import cn.quantgroup.loanflow.infrastructure.result.ServiceResult;
import cn.quantgroup.loanflow.notified.event.model.*;
import cn.quantgroup.loanflow.notified.handler.AbstractEventHandler;
import cn.quantgroup.loanflow.notified.handler.IEventHandler;
import cn.quantgroup.loanflow.notified.model.QueueNotice;
import cn.quantgroup.loanflow.order.model.ChannelOrder;
import cn.quantgroup.loanflow.repay.model.RepaymentPlanItem;
import cn.quantgroup.loanflow.repay.model.representation.OrderRepaymentRepresentation;
import cn.quantgroup.mo.risk.service.MoRiskRepresentationService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
/**
*
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Service
@Slf4j
public class ${prefix}EventHandler extends AbstractEventHandler implements IEventHandler {
@Autowired
private ILoanOrderMappingService orderMappingService;
@Autowired
private IUserMappingService userMappingService;
@Autowired
private MoRiskRepresentationService moRiskRepresentationService;
@Autowired
private LoanMappingService loanMappingService;
@Autowired
private IRepayFlowNoMappingRepository repayFlowNoMappingRepository;
@Resource(name = "standardApplicationMoService")
private StandardApplicationService standardApplicationService;
@Override
public void creditSuccessPublish(CreditSuccessEvent creditSuccEvent) {
String logPrefix = "[notify][handler][creditSuccEvent]";
log.info("{},不处理进件同步成功事件,消息内容:{}", logPrefix, creditSuccEvent);
}
@Override
public void auditRejectPublish(AuditRejectEvent auditRejectEvent) {
String logPrefix = "[${prefix}EventHandler][auditRejectPublish]";
log.info("{},${prefix},审核拒绝事件,消息内容:{}", logPrefix, auditRejectEvent);
QuotaNoticeExtraDto extraDto = auditRejectEvent.getQueueNotice();
Long channelId = auditRejectEvent.getChannelId();
KANoticeType noticeType = auditRejectEvent.getNoticeType();
String applyNo = extraDto.getData().getApplyNo();
String channelOrderNo = auditRejectEvent.getChannelOrderNo();
QuotaRefuseNoticeExtraData extraData = JSONTools.deserialize(extraDto.getExtraData(), QuotaRefuseNoticeExtraData.class);
OrderAndUserMapping orderAndUserMapping = getOrderAndUserMapping(channelOrderNo, channelId);
LoanOrderMapping orderMapping = orderAndUserMapping.getOrderMapping();
UserMapping userMapping = orderAndUserMapping.getUserMapping();
String channelUserId = userMapping.getChannelUserId();
String callbackUrl = getOrderCallbackUrl(channelId, noticeType);
if (StringUtils.isEmpty(callbackUrl)) {
log.error("{},回调地址无配置,channelId:{},applyNo:{},noticeType:{}", logPrefix, channelId, applyNo, noticeType.name());
throw new CommonBizException("回调地址无配置");
}
${prefix}QueryCreditApplyCallback callback = new ${prefix}QueryCreditApplyCallback();
callback.setChannelUserId(channelUserId);
callback.setChannelOrderNo(orderMapping.getChannelOrderNo());
callback.setApplyNo(orderMapping.getApplyNo());
callback.setCreditResult(${prefix}CreditResultEnum.REFUSE);
callback.setNextApplyTime(DateUtil.format(extraData.getNextOperateDate(), DateUtil.YYYY_MM_DD));
callback.setCreditInfo(extraData.getRefuseReason());
Map<String, String> postParam = getPostParam(callback, channelUserId);
QueueNotice queueNotice = new QueueNotice(noticeType, extraDto);
publishTask(postParam, callbackUrl, queueNotice);
}
@Override
public void auditPassPublish(AuditPassEvent auditPassEvent) {
String logPrefix = "[${prefix}EventHandler][auditPassPublish]";
log.info("{},审核通过事件,消息内容:{}", logPrefix, auditPassEvent);
QuotaNoticeExtraDto extraDto = auditPassEvent.getQueueNotice();
Long channelId = auditPassEvent.getChannelId();
KANoticeType noticeType = auditPassEvent.getNoticeType();
String applyNo = extraDto.getData().getApplyNo();
String channelOrderNo = auditPassEvent.getChannelOrderNo();
String callbackUrl = getOrderCallbackUrl(channelId, noticeType);
if (StringUtils.isEmpty(callbackUrl)) {
log.error("{},回调地址无配置,channelId:{},applyNo:{},noticeType:{}", logPrefix, channelId, applyNo, noticeType.name());
throw new CommonBizException("回调地址无配置");
}
OrderAndUserMapping orderAndUserMapping = getOrderAndUserMapping(channelOrderNo, channelId);
LoanOrderMapping orderMapping = orderAndUserMapping.getOrderMapping();
UserMapping userMapping = orderAndUserMapping.getUserMapping();
ChannelOrder channelOrderQueryCreditStatus = ChannelOrder.builder()
.channelOrderNo(channelOrderNo)
.channelId(channelId)
.build();
ServiceResult<QueryCreditStatusResponseModel> creditStatus = standardApplicationService.queryCreditStatus(channelOrderQueryCreditStatus);
log.info("{} 授信结果查询返回信息 creditStatus={},orderNo={}", logPrefix, creditStatus, channelOrderNo);
QueryCreditStatusResponseModel creditInfo;
if (Objects.isNull(creditStatus) || !creditStatus.isSuccess() || Objects.isNull(creditInfo = creditStatus.getData())) {
log.error("{},审批通过推送,查询授信结果失败或无数据,orderNo={},applyNo={}", logPrefix, channelOrderNo, applyNo);
throw new CommonBizException("审批推送,查询授信结果失败或无数据");
}
${prefix}QueryCreditApplyCallback callback = ${prefix}QueryCreditApplyCallback.getSuccessResult(orderMapping, userMapping, creditInfo);
Map<String, String> postParam = getPostParam(callback, userMapping.getChannelUserId());
QueueNotice queueNotice = new QueueNotice(noticeType, extraDto);
publishTask(postParam, callbackUrl, queueNotice);
}
@Override
public void withdrawPublish(WithdrawEvent withdrawEvent) {
String logPrefix = "[${prefix}EventHandler][withdrawPublish]";
log.info("{},不处理申请提现成功事件,消息内容:{}", logPrefix, withdrawEvent);
}
@Override
public void fundSuccessPublish(FundSuccessEvent fundSuccessEvent) {
String logPrefix = "[${prefix}EventHandler][fundSuccessPublish]";
log.info("{},放款成功事件,消息内容:{}", logPrefix, fundSuccessEvent);
QuotaNoticeExtraDto extraDto = fundSuccessEvent.getQueueNotice();
Long channelId = fundSuccessEvent.getChannelId();
Long loanId = fundSuccessEvent.getLoanId();
KANoticeType noticeType = fundSuccessEvent.getNoticeType();
String applyNo = extraDto.getData().getApplyNo();
String channelOrderNo = fundSuccessEvent.getChannelOrderNo();
String callbackUrl = getOrderCallbackUrl(channelId, noticeType);
if (StringUtils.isEmpty(callbackUrl)) {
log.error("{},回调地址无配置,channelId:{},applyNo:{},noticeType:{}", logPrefix, channelId, applyNo, noticeType.name());
throw new CommonBizException("回调地址无配置");
}
OrderAndUserMapping orderAndUserMapping = getOrderAndUserMapping(channelOrderNo, channelId);
UserMapping userMapping = orderAndUserMapping.getUserMapping();
String channelUserId = userMapping.getChannelUserId();
LoanMapping loanMapping = loanMappingService.findByLoanIdAndChannelId(loanId, channelId);
if (Objects.isNull(loanMapping)) {
log.error("{}通过loanId查询LoanMapping为空, loanId={}, channelId={}", logPrefix, loanId, channelId);
throw new CommonBizException("通过loanId查询LoanMapping为空");
}
${prefix}QueryLoanCallback callback = new ${prefix}QueryLoanCallback();
callback.setChannelUserId(channelUserId);
callback.setLoanNo(String.valueOf(loanMapping.getLoanId()));
callback.setChannelLoanNo(loanMapping.getChannelLoanNo());
callback.setLoanApplyStatus(${prefix}LoanApplyStatusEnum.SUCCESS);
Map<String, String> postParam = getPostParam(callback, channelUserId);
QueueNotice queueNotice = new QueueNotice(noticeType, extraDto);
publishTask(postParam, callbackUrl, queueNotice);
}
@Override
public void fundFailPublish(FundFailEvent fundFailEvent) {
String logPrefix = "[${prefix}EventHandler][fundFailPublish]";
log.info("{},放款失败事件,消息内容:{}", logPrefix, fundFailEvent);
QuotaNoticeExtraDto extraDto = fundFailEvent.getQueueNotice();
Long channelId = fundFailEvent.getChannelId();
Long loanId = fundFailEvent.getLoanId();
KANoticeType noticeType = fundFailEvent.getNoticeType();
String applyNo = extraDto.getData().getApplyNo();
String channelOrderNo = fundFailEvent.getChannelOrderNo();
Long changeTime = fundFailEvent.getChangeTime();
String callbackUrl = getOrderCallbackUrl(channelId, noticeType);
if (StringUtils.isEmpty(callbackUrl)) {
log.error("{},回调地址无配置,channelId:{},applyNo:{},noticeType:{}", logPrefix, channelId, applyNo, noticeType.name());
throw new CommonBizException("回调地址无配置");
}
OrderAndUserMapping orderAndUserMapping = getOrderAndUserMapping(channelOrderNo, channelId);
UserMapping userMapping = orderAndUserMapping.getUserMapping();
String channelUserId = userMapping.getChannelUserId();
LoanMapping loanMapping = loanMappingService.findByLoanIdAndChannelId(loanId, channelId);
if (Objects.isNull(loanMapping)) {
log.error("{}通过loanId查询LoanMapping为空, loanId={}, channelId={}", logPrefix, loanId, channelId);
throw new CommonBizException("通过loanId查询LoanMapping为空");
}
${prefix}QueryLoanCallback callback = new ${prefix}QueryLoanCallback();
callback.setChannelUserId(channelUserId);
callback.setLoanNo(String.valueOf(loanMapping.getLoanId()));
callback.setChannelLoanNo(loanMapping.getChannelLoanNo());
callback.setLoanApplyStatus(${prefix}LoanApplyStatusEnum.FAIL);
callback.setApplyResult(fundFailEvent.getReason());
Map<String, String> postParam = getPostParam(callback, channelUserId);
QueueNotice queueNotice = new QueueNotice(noticeType, extraDto);
publishTask(postParam, callbackUrl, queueNotice);
// 通知渠道额度失效
${prefix}QuotaExpired quotaExpired = new ${prefix}QuotaExpired();
quotaExpired.setChannelId(channelId);
quotaExpired.setChannelUserId(channelUserId);
quotaExpired.setExtraDto(extraDto);
quotaExpired.setLimitExpireDate(changeTime);
quotaExpiredPublishTask(quotaExpired);
}
@Override
public void cancelLoanPublish(CancelLoanEvent cancelLoanEvent) {
String logPrefix = "[${prefix}EventHandler][cancelLoanPublish]";
log.info("{},贷前关单事件,消息内容:{}", logPrefix, cancelLoanEvent);
QuotaNoticeExtraDto extraDto = cancelLoanEvent.getQueueNotice();
Long channelId = cancelLoanEvent.getChannelId();
String channelOrderNo = cancelLoanEvent.getChannelOrderNo();
Long closeTime = cancelLoanEvent.getChangeTime();
OrderAndUserMapping orderAndUserMapping = getOrderAndUserMapping(channelOrderNo, channelId);
UserMapping userMapping = orderAndUserMapping.getUserMapping();
String channelUserId = userMapping.getChannelUserId();
// 通知渠道额度失效
${prefix}QuotaExpired quotaExpired = new ${prefix}QuotaExpired();
quotaExpired.setChannelId(channelId);
quotaExpired.setChannelUserId(channelUserId);
quotaExpired.setExtraDto(extraDto);
quotaExpired.setLimitExpireDate(closeTime);
quotaExpiredPublishTask(quotaExpired);
}
@Override
public void settleUpPublish(SettleUpEvent settleUpEvent) {
String logPrefix = "[${prefix}EventHandler][settleUpPublish]";
log.info("{},结清事件,消息内容:{}", logPrefix, settleUpEvent);
QuotaNoticeExtraDto extraDto = settleUpEvent.getQueueNotice();
Long channelId = settleUpEvent.getChannelId();
String channelOrderNo = settleUpEvent.getChannelOrderNo();
Long changeTime = settleUpEvent.getChangeTime();
OrderAndUserMapping orderAndUserMapping = getOrderAndUserMapping(channelOrderNo, channelId);
UserMapping userMapping = orderAndUserMapping.getUserMapping();
String channelUserId = userMapping.getChannelUserId();
// 通知渠道额度失效
${prefix}QuotaExpired quotaExpired = new ${prefix}QuotaExpired();
quotaExpired.setChannelId(channelId);
quotaExpired.setChannelUserId(channelUserId);
quotaExpired.setExtraDto(extraDto);
quotaExpired.setLimitExpireDate(changeTime);
quotaExpiredPublishTask(quotaExpired);
}
@Override
public void repaySuccessPublish(RepaySuccessEvent repaySuccessEvent) {
String logPrefix = "[${prefix}EventHandler][repaySuccessPublish]";
log.info("{},还款成功事件,消息内容:{}", logPrefix, repaySuccessEvent);
QuotaNoticeExtraDto extraDto = repaySuccessEvent.getQueueNotice();
Long channelId = repaySuccessEvent.getChannelId();
Long loanId = repaySuccessEvent.getLoanId();
KANoticeType noticeType = repaySuccessEvent.getNoticeType();
String applyNo = extraDto.getData().getApplyNo();
String channelOrderNo = repaySuccessEvent.getChannelOrderNo();
String businessFlowNo = repaySuccessEvent.getBusinessFlowNo();
String callbackUrl = getOrderCallbackUrl(channelId, noticeType);
if (StringUtils.isEmpty(callbackUrl)) {
log.error("{},回调地址无配置,channelId:{},applyNo:{},noticeType:{}", logPrefix, channelId, applyNo, noticeType.name());
throw new CommonBizException("回调地址无配置");
}
OrderAndUserMapping orderAndUserMapping = getOrderAndUserMapping(channelOrderNo, channelId);
UserMapping userMapping = orderAndUserMapping.getUserMapping();
String channelUserId = userMapping.getChannelUserId();
// 查询借据信息
LoanMapping loanMapping = loanMappingService.findByLoanIdAndChannelId(loanId, channelId);
if (Objects.isNull(loanMapping)) {
log.error("{}通过loanId查询LoanMapping为空, loanId={}, channelId={}", logPrefix, loanId, channelId);
throw new CommonBizException("通过loanId查询LoanMapping为空");
}
String channelLoanNo = loanMapping.getChannelLoanNo();
// 查询渠道的还款流水号
String kingsoftRepaymentNo = null;
RepayFlowNoMapping repayFlowNoMapping = repayFlowNoMappingRepository.findByXyqbRepayFlowNoOne(businessFlowNo);
if (Objects.nonNull(repayFlowNoMapping)) {
kingsoftRepaymentNo = repayFlowNoMapping.getChannelRepayFlowNo();
}
// 查询还款计划
ServiceResult<OrderRepaymentRepresentation> serviceResult = standardApplicationService.repaymentPlanQueryByCycleQuota(loanId);
log.info("{} 查询还款计划结果 serviceResult={},orderNo={}", logPrefix, serviceResult, channelOrderNo);
if (Objects.isNull(serviceResult) || !serviceResult.isSuccess() || Objects.isNull(serviceResult.getData())) {
log.error("{},还款成功推送,查询还款计划返回错误或无数据,orderNo={},applyNo={}", logPrefix, channelOrderNo, applyNo);
throw new CommonBizException("还款成功,查询还款计划返回错误或无数据");
}
List<RepaymentPlanItem> repaymentPlans = serviceResult.getData().getRepaymentPlans();
${prefix}QueryRepayCallback callback = ${prefix}QueryRepayCallback.getSuccessResult(channelUserId, repaySuccessEvent, channelLoanNo, kingsoftRepaymentNo, repaymentPlans);
Map<String, String> postParam = getPostParam(callback, channelUserId);
QueueNotice queueNotice = new QueueNotice(noticeType, extraDto);
publishTask(postParam, callbackUrl, queueNotice);
super.processRepay(repaySuccessEvent.getQueueNotice());
}
@Override
public void repayFailPublish(RepayFailEvent repayFailEvent) {
String logPrefix = "[${prefix}EventHandler][repayFailPublish]";
log.info("{},还款失败事件,消息内容:{}", logPrefix, repayFailEvent);
QuotaNoticeExtraDto extraDto = repayFailEvent.getQueueNotice();
String businessFlowNo = repayFailEvent.getBusinessFlowNo();
String failMsg = repayFailEvent.getFailMsg();
String channelOrderNo = repayFailEvent.getChannelOrderNo();
Long channelId = repayFailEvent.getChannelId();
KANoticeType noticeType = repayFailEvent.getNoticeType();
String applyNo = extraDto.getData().getApplyNo();
String callbackUrl = getOrderCallbackUrl(channelId, noticeType);
if (StringUtils.isEmpty(callbackUrl)) {
log.error("{},回调地址无配置,channelId:{},applyNo:{},noticeType:{}", logPrefix, channelId, applyNo, noticeType.name());
throw new CommonBizException("回调地址无配置");
}
OrderAndUserMapping orderAndUserMapping = getOrderAndUserMapping(channelOrderNo, channelId);
UserMapping userMapping = orderAndUserMapping.getUserMapping();
String channelUserId = userMapping.getChannelUserId();
// 根据核心系统还款流水号查询渠道的还款流水号
String channelRepayFlowNo = null;
BigDecimal repaymentAmount = null;
RepayFlowNoMapping repayFlowNoMapping = repayFlowNoMappingRepository.findByXyqbRepayFlowNoOne(businessFlowNo);
if (Objects.nonNull(repayFlowNoMapping)) {
channelRepayFlowNo = repayFlowNoMapping.getChannelRepayFlowNo();
repaymentAmount = new BigDecimal(repayFlowNoMapping.getRepayAmount());
}
${prefix}QueryRepayCallback callback = new ${prefix}QueryRepayCallback();
callback.setChannelUserId(channelUserId);
callback.setBusinessFlowNo(businessFlowNo);
callback.setChannelRepayFlowNo(channelRepayFlowNo);
callback.setRepaymentAmount(repaymentAmount);
callback.setRepayStatus(${prefix}RepayStatusEnum.FAIL);
callback.setFailMsg(failMsg);
callback.setFailCode("2000000");
Map<String, String> postParam = getPostParam(callback, channelUserId);
QueueNotice queueNotice = new QueueNotice(noticeType, extraDto);
publishTask(postParam, callbackUrl, queueNotice);
super.processRepay(repayFailEvent.getQueueNotice());
}
@Override
public void cancelAfterLoanPublish(CancelAfterLoanEvent cancelAfterLoanEvent) {
String logPrefix = "[${prefix}EventHandler][cancelAfterLoanPublish]";
log.info("{},不处理贷后关单事件,消息内容:{}", logPrefix, cancelAfterLoanEvent);
}
@Override
public void dropCourseSuccessPublish(DropCourseSuccessEvent dropCourseSuccEvent) {
String logPrefix = "[${prefix}EventHandler][dropCourseSuccessPublish]";
log.info("{},不处理退课事件,消息内容:{}", logPrefix, dropCourseSuccEvent);
}
@Override
public void addBankCardPublish(AddBankCardEvent addBankCardEvent) {
String logPrefix = "[${prefix}EventHandler][addBankCardEvent]";
log.info("{},不处理添加卡事件,消息内容:{}", logPrefix, addBankCardEvent);
}
@Override
public void bindCardPublish(BindCardEvent bindCardEvent) {
String logPrefix = "[${prefix}EventHandler][bindCardEvent]";
log.info("{},不处理绑卡事件,消息内容:{}", logPrefix, bindCardEvent);
}
/**
* 根据channelOrderNo+channelId 查询出渠道授信信息和渠道用户信息
*
* @param channelOrderNo
* @param channelId
* @return
*/
private OrderAndUserMapping getOrderAndUserMapping(String channelOrderNo, Long channelId) {
OrderAndUserMapping mappingReturn = new OrderAndUserMapping();
LoanOrderMapping orderMapping = orderMappingService.findByChannelOrderNoAndRegisteredFromLastOne(channelOrderNo, channelId);
if (Objects.isNull(orderMapping)) {
log.error("${prefix}渠道回调通知,查询授信订单为空, channelOrderNo={}, channelId={}", channelOrderNo, channelId);
throw new CommonBizException("查询授信订单为空");
}
Long userId = orderMapping.getQgUserId();
UserMapping userMapping = userMappingService.findByQgUserIdAndRegisteredFrom(userId, channelId);
if (Objects.isNull(userMapping)) {
log.error("${prefix}渠道回调通知,通过qgUserId查询渠道用户id为空, qgUserId={}, channelId={}", userId, channelId);
throw new CommonBizException("通过qgUserId查询渠道用户id为空");
}
mappingReturn.setOrderMapping(orderMapping);
mappingReturn.setUserMapping(userMapping);
return mappingReturn;
}
/**
* 发布任务
*
* @param paraMap
* @param url
* @param queueNotice
*/
private void publishTask(Map<String, String> paraMap, String url, QueueNotice queueNotice) {
log.info("[publishTask],发送消息内容:{},url地址:{},ka消息体:{}", paraMap, url, queueNotice);
HttpTaskBody taskBody = this.buildTaskBody(paraMap, url, queueNotice);
log.info("[publishTask],taskBody:{}", taskBody);
AsyncTask asyncTask = super.buildPublishTask(BizAppId.CHANNEL_NOTIFY, queueNotice);
log.info("[publishTask],asyncTask:{}", asyncTask);
asyncTask.setTaskBody(taskBody);
super.publishAsyncTask(asyncTask, queueNotice);
}
/**
* 构建推送TaskBody
*
* @param paraMap
* @param url
* @param queueNotice
* @return
*/
private HttpTaskBody buildTaskBody(Map<String, String> paraMap, String url, QueueNotice queueNotice) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("success", "Y");
String assetRule = jsonObject.toJSONString();
Map<String, String> header = new HashMap<>(2);
header.put("Content-Type", "application/json");
HttpTaskBody taskBody = new HttpTaskBody();
taskBody.setHeaders(header);
taskBody.setUrl(url);
taskBody.setParams(paraMap);
taskBody.setAssertRule(assetRule);
taskBody.setQueueNotice(queueNotice);
return taskBody;
}
/**
* 额度失效通知
*
* @param quotaExpired
*/
private void quotaExpiredPublishTask(${prefix}QuotaExpired quotaExpired) {
String logPrefix = "[${prefix}EventHandler][quotoExpiredPublishTask]";
QuotaNoticeExtraDto extraDto = quotaExpired.getExtraDto();
String channelUserId = quotaExpired.getChannelUserId();
Long channelId = quotaExpired.getChannelId();
Long limitExpireDate = quotaExpired.getLimitExpireDate();
KANoticeType noticeType = KANoticeType.QUOTA_EXPIRED;
String callbackUrl = getOrderCallbackUrl(channelId, noticeType);
if (StringUtils.isEmpty(callbackUrl)) {
log.error("{},回调地址无配置,channelId:{},applyNo:{},noticeType:{}", logPrefix, channelId, noticeType.name());
throw new CommonBizException("回调地址无配置");
}
${prefix}QuotaExpiredCallback callback = new ${prefix}QuotaExpiredCallback();
callback.setCreditStatus(${prefix}CreditStatusCallBackEnum.EXPIRED);
callback.setChannelUserId(channelUserId);
callback.setCreditAmount(BigDecimal.ZERO);
callback.setLimitExpireDate(DateUtil.format(limitExpireDate, DateUtil.YYYY_MM_DD));
Map<String, String> postParam = getPostParam(callback, channelUserId);
QueueNotice queueNotice = new QueueNotice(noticeType, extraDto);
publishTask(postParam, callbackUrl, queueNotice);
}
private HashMap<String,String> getPostParam(Object param, String channelUserId){
HashMap<String, String> paramMap = new HashMap<>(12);
String paramJsonStr = JSON.toJSONString(param);
paramMap.put("channelUserId", channelUserId);
paramMap.put("requestId", DateUtil.format(new Date(), DateUtil.YYYYMMDDHHMMSS));
paramMap.put("timestamp", DateUtil.get13LongTimeFormLong());
paramMap.put("data", paramJsonStr);
return paramMap;
}
}
package ${modelPackage};
import lombok.Data;
import ${enumsPackage}.${prefix}LoanPurposesEnum;
import java.math.BigDecimal;
/**
* 提现入参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}ApplyLoanRequest {
/**
* 渠道号
*/
private Long channelId;
/**
* 渠道订单号
*/
private String channelOrderNo;
/**
* 绑卡Id
*/
private String bindId;
/**
* 借款用途
*/
private ${prefix}LoanPurposesEnum loanPurpose;
/**
* 借款金额
*/
private BigDecimal loanAmount;
/**
* 借款期数
*/
private Integer loanTerm;
}
\ No newline at end of file
package ${modelPackage};
import lombok.Data;
/**
* 提现出参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}ApplyLoanResult {
private Long loanNo;
}
\ No newline at end of file
package ${modelPackage};
import java.math.BigDecimal;
import lombok.Data;
/**
* 查询还款结果入参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}BankInfo {
private String bankCode;
private String bankName;
private BigDecimal daysLimit;
private BigDecimal singleLimit;
}
\ No newline at end of file
package ${modelPackage};
import lombok.Data;
/**
* 查询支持银行卡入参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}BindBankCardSmsRequest {
/**
* 渠道号
*/
private Long channelId;
/**
* 渠道订单号
*/
private String channelOrderNo;
/**
* 银行编码
*/
private String bankCode;
/**
* 手机号
*/
private String phone;
/**
* 银行卡号
*/
private String bankCardNo;
}
\ No newline at end of file
package ${modelPackage};
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* 查询支持银行卡出参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
@AllArgsConstructor
public class ${prefix}BindBankCardSmsResult {
private String verifyId;
}
\ No newline at end of file
package ${modelPackage};
import cn.quantgroup.cashloanflow.model.LoanDemandPurposeEnum;
import cn.quantgroup.cashloanflow.model.standard.apply.StandardApplyLoanData;
import cn.quantgroup.cashloanflow.model.standard.apply.StandardpicModelTypeEnum;
import cn.quantgroup.cashloanflow.util.RegisterFrom;
import cn.quantgroup.cashloanflow.util.Utils;
import cn.quantgroup.loanflow.risk.model.RiskInfo;
import cn.quantgroup.loanflow.risk.model.StandardOcrData;
import cn.quantgroup.loanflow.user.model.representation.SysUserContact;
import cn.quantgroup.loanflow.user.model.representation.SysUserDetail;
import cn.quantgroup.mo.infrastructure.constants.RiskLiveTypeEnum;
import cn.quantgroup.user.enums.*;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 通用进件入参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}CreditApplyRequest {
/**
* 渠道请求时间 默认当前时间
*/
private Date applyTime = new Date();
/**
* 渠道
*/
private RegisterFrom registerFrom;
/**
* user section
*/
/**
* 姓名
*/
private String userName;
/**
* 手机号
*/
private String phoneNo;
/**
* 身份证
*/
private String idNo;
/**
* 渠道userId
*/
private String channelUserId;
/**
* qq
*/
private String qq;
/**
* email
*/
private String email;
/**
* user ext info section
*/
/**
* 收入方式
*/
private IncomeEnum incomeEnum;
/**
* 收入范围
*/
private IncomeRangeEnum incomeRangeEnum;
/**
* 职业
*/
private OccupationEnum occupationEnum;
/**
* 教育学历
*/
private EducationEnum educationEnum;
/**
* 是否有车
*/
private Boolean hasCar;
/**
* 是否有社保
*/
private Boolean hasSocialSecurity;
/**
* 是否有房
*/
private Boolean hasHouse;
/**
* 是否有信用卡
*/
private Boolean hasCreditCard;
/**
* 婚姻状态
*/
private MaritalStatus marryStatus;
/**
* 联系人
*/
private List<SysUserContact> contacts;
/**
* 地址 省市区
*/
private String addressLocation;
/**
* 省市区之后的详细地址
*/
private String addrDetail;
/**
* 带有省市区+省市区之后的详细地址 全部详情地址
*/
private String singleAllAddress;
/**
* code码,2018
*/
private String districtCode;
/**
* order section
*/
/**
* 渠道申请订单号
*/
private String channelOrderNo;
/**
* 渠道提现单号,多订单产品需要关注
*/
private String channelPaymentNo;
/**
* 渠道申请金额
*/
private String loanAmount;
/**
* 借款期限
*/
private Integer loanTerm;
/**
* 期限类型(1: 按天; 2: 按月; 3: 按年;) 默认按月
*/
private Integer termType = 2;
/**
* 借款意愿
*/
private LoanDemandPurposeEnum purposeEnum;
/**
* 订单扩展信息
**/
private Map<String, Object> orderExtData;
/**
* risk info section
* 这部分数据透传 to spiderCenter
*/
/**
* 风控数据
**/
private RiskInfo riskInfo;
public ${prefix}CreditApplyRequest() {
}
/**
* 标准API 转换
*
* @param registerFrom
* @param data
*/
public static ApplyLoanData getApplyLoanData(${prefix}CreditApplyRequest data) {
ApplyLoanData applyLoanData = new ApplyLoanData();
applyLoanData.setRegisterFrom(RegisterFrom.JINSHAN)
applyLoanData.setUserName(data.getUserName());
applyLoanData.setPhone(data.getPhone());
applyLoanData.setIdNo(data.getIdNo());
applyLoanData.setChannelUserId(data.getChannelUserId());
applyLoanData.setQq(data.getQq());
applyLoanData.setEmail(data.getEmail());
applyLoanData.setIncomeEnum(data.getIncomeEnum());
applyLoanData.setIncomeRangeEnum(data.getIncomeRangeEnum());
applyLoanData.setOccupationEnum(data.getOccupationEnum());
applyLoanData.setEducationEnum(data.getEducationEnum());
applyLoanData.setHasCar(data.getHasCar());
applyLoanData.setHasSocialSecurity(data.getHasSocialSecurity());
applyLoanData.setHasHouse(data.getHasHouse());
applyLoanData.setHasCreditCard(data.getHasCreditCard());
applyLoanData.setMarryStatus(data.getMarryStatus());
applyLoanData.setContacts(data.getContacts());
applyLoanData.setAddressLocation(data.getAddressLocation());
applyLoanData.setAddrDetail(data.getAddrDetail());
applyLoanData.setSingleAllAddress(data.getSingleAllAddress());
applyLoanData.setDistrictCode(data.getDistrictCode());
applyLoanData.setChannelOrderNo(data.getChannelOrderNo());
applyLoanData.setChannelPaymentNo(data.getChannelPaymentNo());
applyLoanData.setLoanAmount(data.getLoanAmount());
applyLoanData.setLoanTerm(data.getLoanTerm());
applyLoanData.setTermType(data.getTermType());
applyLoanData.setPurposeEnum(data.getPurposeEnum());
applyLoanData.setOrderExtData(data.getOrderExtData());
applyLoanData.setRiskInfo(data.getRiskInfo());
}
}
package ${modelPackage};
import lombok.Data;
/**
* 进件出参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}CreditApplyResult {
private String applyNo;
public ${prefix}CreditApplyResult(){}
public ${prefix}CreditApplyResult(String applyNo){
this.applyNo = applyNo;
}
}
package ${modelPackage};
import lombok.Data;
/**
* 查询授信结果入参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}QueryCreditApplyRequest {
/**
* 渠道号
*/
private Long channelId;
/**
* 渠道订单号
*/
private String channelOrderNo;
}
\ No newline at end of file
package ${modelPackage};
import ${enumsPackage}.${prefix}CreditResultEnum;
import ${callbackPackage}.${prefix}RepaymentMethodTermLabel;
import lombok.Data;
import cn.quantgroup.cashloanflow.model.standard.response.credit.CreditStatusEnum;
import cn.quantgroup.cashloanflow.model.standard.response.credit.QueryCreditStatusResponseModel;
import cn.quantgroup.cashloanflow.util.DateUtil;
import cn.quantgroup.clf.api.jinshan.util.JinShanUtil;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* 查询授信结果入参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}QueryCreditApplyResult {
private ${prefix}CreditResultEnum creditResult;
/**
* 授信总金额()
*/
private BigDecimal creditAmount;
/**
* 授信剩余可用额度()
*/
private BigDecimal creditAvailable;
/**
* 分期规则,还款方式分期(REPAYMENT_METHOD)
*/
private String termLabelsRule;
private List<${prefix}RepaymentMethodTermLabel> repaymentMethodTermLabels;
/**
* 授信额度失效日期如:"2020-03-05"
*/
private String creditExpireDate;
/**
* 用户授信情况描述,若”授信拒绝“则显示拒绝原因
*/
private String creditInfo;
/**
* 下次申请时间(如yyyy-MM-dd,如果额度申请结果为拒绝需要提供
*/
private String nextApplyTime;
public static ${prefix}QueryCreditApplyResult getSuccessResult(QueryCreditStatusResponseModel info) {
${prefix}QueryCreditApplyResult result = new ${prefix}QueryCreditApplyResult();
result.setCreditResult(${prefix}CreditResultEnum.CREDIT_NORMAL);
// 当授信单已经提现后,授信剩余可用额度为0
if (CreditStatusEnum.WITHDRAW.getValue().equals(info.getCreditStatus())) {
result.setCreditAmount(BigDecimal.ZERO );
} else {
result.setCreditAmount(StringUtils.isBlank(info.getApprovalAmount()) ? BigDecimal.ZERO : new BigDecimal(info.getApprovalAmount()));
}
result.setCreditAvailable(StringUtils.isBlank(info.getApprovalAmount()) ? BigDecimal.ZERO : new BigDecimal(info.getApprovalAmount()));
result.setTermLabelsRule(JinShanUtil.TERM_LABELS_RULE);
List<${prefix}RepaymentMethodTermLabel> list = new ArrayList<>();
${prefix}RepaymentMethodTermLabel methodTermLabel = new ${prefix}RepaymentMethodTermLabel();
methodTermLabel.setTermLabelsRuleValue("EQUAL_RENT");
String monthlyInterestRate = info.getMonthlyInterestRate();
methodTermLabel.setDailyRate(StringUtils.isBlank(monthlyInterestRate) ? BigDecimal.ZERO : new BigDecimal(monthlyInterestRate).divide(new BigDecimal("30"), 4, BigDecimal.ROUND_HALF_UP));
methodTermLabel.setMonthlyRate(StringUtils.isBlank(monthlyInterestRate) ? BigDecimal.ZERO : new BigDecimal(monthlyInterestRate).setScale(4, BigDecimal.ROUND_HALF_UP));
methodTermLabel.setYearlyRate(StringUtils.isBlank(monthlyInterestRate) ? BigDecimal.ZERO : new BigDecimal(monthlyInterestRate).multiply(new BigDecimal("12")).setScale(4, BigDecimal.ROUND_HALF_UP));
methodTermLabel.setLoanTerm(info.getApprovalTerm());
list.add(methodTermLabel);
result.setRepaymentMethodTermLabels(list);
result.setCreditExpireDate(DateUtil.format(info.getValidDate(), DateUtil.YYYY_MM_DD));
return result;
}
}
\ No newline at end of file
package ${modelPackage};
import lombok.Data;
/**
* 查询还款结果入参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}QueryLoanRequest {
/**
* 渠道号
*/
private Long channelId;
/**
* 渠道借款订单号
*/
private String channelLoanNo;
}
\ No newline at end of file
package ${modelPackage};
import cn.quantgroup.cashloanflow.util.DateUtil;
import cn.quantgroup.cashloanflow.util.RegisterFrom;
import cn.quantgroup.loanflow.order.model.OrderStatus;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
/**
* 查询还款结果入参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
@Slf4j
public class ${prefix}QueryLoanResult {
private String loanApplyStatus;
private String applyResult;
private String loanQueryTransNo;
public ${prefix}QueryLoanResult(OrderStatus orderStatus) {
this.loanQueryTransNo = RegisterFrom.JINSHAN.getValue() + DateUtil.get13LongTimeFormLong();
log.info("借款申请的结果返回的查询交易流水号={}", loanQueryTransNo);
switch (orderStatus.getStatus()) {
case WITHDRAW:
case PAY_ING:
this.loanApplyStatus = "APPLYING";
break;
case FUND_SUCC:
case ALL_REPAID:
this.loanApplyStatus = "SUCCESS";
break;
case FUND_FAIL:
this.loanApplyStatus = "FAIL";
break;
default:
break;
}
}
}
\ No newline at end of file
package ${modelPackage};
import lombok.Data;
/**
* 借款试算入参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}QueryLoanTrialRequest {
/**
* 渠道号
*/
private Long channelId;
/**
* 渠道订单号
*/
private String channelOrderNo;
/**
* 借款金额
*/
private String loanAmount;
/**
* 借款期数
*/
private String loanTerm;
}
\ No newline at end of file
package ${modelPackage};
import cn.quantgroup.cashloanflow.util.DateUtil;
import cn.quantgroup.clf.api.jinshan.util.JinShanUtil;
import cn.quantgroup.loanflow.repay.model.representation.TrialRepaymentRepresentation;
import lombok.Data;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* 借款试算出参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}QueryLoanTrialResult {
/**
* 息费总和
*/
private BigDecimal receivableTotalAmount;
/**
* 利息总和
*/
private BigDecimal receivableInterestAmount;
private List<${prefix}TrialInoutPlan> trialInoutPlanList;
public static ${prefix}QueryLoanTrialResult getCoverResult(TrialRepaymentRepresentation data) {
${prefix}QueryLoanTrialResult result = new ${prefix}QueryLoanTrialResult();
result.setReceivableInterestAmount(data.getTotalInterest());
result.setReceivableTotalAmount(data.getTotalLoanAmount().add(data.getTotalInterest().add(data.getServiceFee())));
result.setTrialInoutPlanList(getTrialInoutPlanList(data.getRepaymentPlans()));
return result;
}
private static List<${prefix}TrialInoutPlan> getTrialInoutPlanList(List<TrialRepaymentRepresentation.TrialRepaymentPlan> repaymentPlans) {
List<${prefix}TrialInoutPlan> list = new ArrayList<>();
repaymentPlans.forEach(i ->{
${prefix}TrialInoutPlan plan = new ${prefix}TrialInoutPlan();
plan.setLeaseTime(i.getPeriodNo());
plan.setRepayDate(DateUtil.format(i.getDueTime(),DateUtil.YYYY_MM_DD));
plan.setTermAmount(i.getRequiredRepayment());
plan.setTermCorpus(i.getPrincipal());
plan.setTermInterest(i.getInterest());
plan.setExtraFee(i.getServiceFee().add(i.getOtherFee()));
if (BigDecimal.ZERO.compareTo(plan.getExtraFee()) != 0) {
plan.setExtraInfo("担保费");
}
list.add(plan);
});
return list;
}
}
\ No newline at end of file
package ${modelPackage};
import lombok.Data;
/**
* 查询还款结果入参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}QueryRepayRequest {
/**
* 渠道号
*/
private Long channelId;
/**
* 渠道订单号
*/
private String channelOrderNo;
/**
* 还款流水号
*/
private String businessFlowNo;
}
\ No newline at end of file
package ${modelPackage};
import cn.quantgroup.loanflow.repay.model.representation.QueryNormalRepayRepresentation;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import cn.quantgroup.loanflow.repay.model.RepaymentPlanItem;
import ${enumsPackage}.${prefix}RepayTypeEnum;
import ${enumsPackage}.${prefix}RepayStatusEnum;
import ${callbackPackage}.${prefix}ContractInfoNotice;
import ${callbackPackage}.${prefix}InoutPlanNotice;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* 查询还款结果出参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}QueryRepayResult {
private ${prefix}RepayStatusEnum repayStatus;
private BigDecimal repayAmount;
/**
* 实际还款时间(金额实际到账的时间,精确到时分秒) 格式如:yyyy-MM-dd HH:mm:ss 成功的时候必填
*/
private String actualTime;
private String failMsg;
private String failCode;
private List<${prefix}ContractInfoNotice> contractList;
private ${prefix}RepayTypeEnum repayType;
public static ${prefix}QueryRepayResult getSuccessResult(String channelLoanNo, QueryNormalRepayRepresentation repayResult, List<RepaymentPlanItem> repaymentPlans) {
String loanId = repayResult.getLoanId();
String repaymentReceivedAt = repayResult.getRepaymentReceivedAt();
${prefix}QueryRepayResult callback = new ${prefix}QueryRepayResult();
callback.setRepayStatus(${prefix}RepayStatusEnum.getStatusByRepayStatus(repayResult.getRepayStatus()));
callback.setRepayType(${prefix}RepayTypeEnum.ACTIVE);
if (StringUtils.isNotBlank(repayResult.getActualRepayment())) {
callback.setRepayAmount(new BigDecimal(repayResult.getActualRepayment()));
}
if (${prefix}RepayStatusEnum.FAIL == callback.getRepayStatus()) {
callback.setFailMsg(repayResult.getFailMsg());
callback.setFailCode("0001");
} else {
callback.setActualTime(repaymentReceivedAt);
}
List<${prefix}ContractInfoNotice> contractInfoNotices = new ArrayList<>();
${prefix}ContractInfoNotice notice = new ${prefix}ContractInfoNotice();
notice.setChannelLoanNo(channelLoanNo);
notice.setLoanNo(loanId);
List<${prefix}InoutPlanNotice> inoutPlanNotices = new ArrayList<>();
repaymentPlans.forEach(i -> {
${prefix}InoutPlanNotice planNotice = new ${prefix}InoutPlanNotice();
planNotice.setLeaseTime(i.getPeriodNo());
planNotice.setReceivedCorpus(i.getActPrincipal());
planNotice.setReceivedInterest(i.getActInterest());
planNotice.setReceivedFine(i.getActOverdueInterest());
planNotice.setReceivedInterestRate(BigDecimal.ZERO);
planNotice.setReceivedTotalAmount(i.getRepayAmount());
planNotice.setExtraFee(i.getActServiceFee());
if (i.getActServiceFee().compareTo(BigDecimal.ZERO) != 0) {
planNotice.setExtraInfo("担保费");
}
inoutPlanNotices.add(planNotice);
});
notice.setInoutPlanList(inoutPlanNotices);
contractInfoNotices.add(notice);
callback.setContractList(contractInfoNotices);
return callback;
}
}
\ No newline at end of file
package ${modelPackage};
import org.apache.commons.lang3.StringUtils;
import lombok.Data;
/**
* 查询支持银行卡入参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}QuerySupportBankcardsRequest {
/**
* 渠道号
*/
private Long channelId;
/**
* 渠道订单号
*/
private String channelOrderNo;
}
\ No newline at end of file
package ${modelPackage};
import org.apache.commons.lang3.StringUtils;
import cn.quantgroup.mo.order.model.output.MoSimpleBank;
import lombok.Data;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* 查询支持银行卡出参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}QuerySupportBankcardsResult {
private List<${prefix}BankInfo> bankInfoList;
public static ${prefix}QuerySupportBankcardsResult getSuccessResult(List<MoSimpleBank> list) {
// -1 表示没有限额
String noLimit = "-1";
${prefix}QuerySupportBankcardsResult result = new ${prefix}QuerySupportBankcardsResult();
List<${prefix}BankInfo> bankInfoList1 = new ArrayList<>();
list.forEach(t -> {
${prefix}BankInfo bankInfo = new ${prefix}BankInfo();
bankInfo.setBankCode(t.getBankCode());
bankInfo.setBankName(t.getBankName());
bankInfo.setDaysLimit(StringUtils.isBlank(t.getDayQuota()) ? new BigDecimal(noLimit) : new BigDecimal(t.getDayQuota()));
bankInfo.setSingleLimit(StringUtils.isBlank(t.getSingleQuota()) ? new BigDecimal(noLimit) : new BigDecimal(t.getSingleQuota()));
bankInfoList1.add(bankInfo);
});
result.setBankInfoList(bankInfoList1);
return result;
}
}
\ No newline at end of file
package ${modelPackage};
import lombok.Data;
/**
* 主动还款入参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}RepayByPlanRequest {
/**
* 渠道号
*/
private Long channelId;
/**
* 渠道订单号
*/
private String channelOrderNo;
/**
* 绑卡Id
*/
private String bindId;
/**
* 渠道借款订单号
*/
private String channelLoanNo;
/**
* 借款流水号
*/
private String businessFlowNo;
/**
* 还款金额
*/
private String repayAmount;
/**
* 还款期数
*/
private Integer termNo;
}
\ No newline at end of file
package ${modelPackage};
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* 主动还款出参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
@AllArgsConstructor
public class ${prefix}RepayByPlanResult {
private String businessFlowNo;
}
\ No newline at end of file
package ${modelPackage};
import java.math.BigDecimal;
import lombok.Data;
/**
*
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}TrialInoutPlan {
/**
* 期次
*/
private Integer leaseTime;
/**
* 应还款日期(yyyy-MM-dd)
*/
private String repayDate;
/**
* 本期应还总金额 单位元
*/
private BigDecimal termAmount;
/**
* 本金 单位元
*/
private BigDecimal termCorpus;
/**
* 利息 单位元
*/
private BigDecimal termInterest;
/**
* 优惠券金额 单位元
*/
private BigDecimal deductionAmount;
/**
* 额外金额 单位元
*/
private BigDecimal extraFee;
/**
* 额外金额描述
*/
private String extraInfo;
}
\ No newline at end of file
package ${modelPackage};
import lombok.Data;
/**
* 准入入参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}UserAccessRequest {
/**
* 渠道号
*/
private Long channelId;
/**
* 手机号MD5
*/
private String phoneMD5;
/**
* 身份证号MD5
*/
private String idNoMD5;
}
\ No newline at end of file
package ${modelPackage};
import lombok.Data;
/**
* 准入出参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}UserAccessResult {
private String accessResult;
}
\ No newline at end of file
package ${modelPackage};
import lombok.Data;
/**
* 验卡入参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}VerifyBindSmsRequest {
/**
* 渠道号
*/
private Long channelId;
/**
* 渠道订单号
*/
private String channelOrderNo;
/**
* 验证id
*/
private String verifyId;
/**
* 验证码
*/
private String smsCode;
}
\ No newline at end of file
package ${modelPackage};
import ${enumsPackage}.${prefix}SignStatusEnum;
import lombok.Data;
/**
* 验卡出参
*
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Data
public class ${prefix}VerifyBindSmsResult {
private ${prefix}SignStatusEnum signStatus;
private String bindId;
}
\ No newline at end of file
package ${servicePackage};
import ${modelPackage}.${prefix}QueryCreditApplyRequest;
import ${modelPackage}.${prefix}UserAccessRequest;
import ${modelPackage}.${prefix}QuerySupportBankcardsRequest;
import ${modelPackage}.${prefix}QueryLoanTrialRequest;
import ${modelPackage}.${prefix}BindBankCardSmsRequest;
import ${modelPackage}.${prefix}VerifyBindSmsRequest;
import ${modelPackage}.${prefix}ApplyLoanRequest;
import ${modelPackage}.${prefix}QueryLoanRequest;
import ${modelPackage}.${prefix}RepayByPlanRequest;
import ${modelPackage}.${prefix}QueryRepayRequest;
import cn.quantgroup.loanflow.application.model.ApplyLoanData;
/**
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public interface ${prefix}Service {
/**
* 预审
*
* @param userAccessRequest
* @return
*/
String userAccess(${prefix}UserAccessRequest userAccessRequest);
/**
* 提交授信
*
* @param request
* @return
*/
String creditApply(ApplyLoanData request);
/**
* 授信申请结果主动查询
*
* @param request
* @return
*/
String queryCreditApply(${prefix}QueryCreditApplyRequest request);
/**
* 查询支持的银行列表
*
* @param request
* @return
*/
String querySupportBankcards(${prefix}QuerySupportBankcardsRequest request);
/**
* 借款试算
*
* @param request
* @return
*/
String queryLoanTrial(${prefix}QueryLoanTrialRequest request);
/**
* 绑卡发验证码
*
* @param request
* @return
*/
String bindBankCardSms(${prefix}BindBankCardSmsRequest request);
/**
* 验卡
*
* @param request
* @return
*/
String verifyBindSms(${prefix}VerifyBindSmsRequest request);
/**
* 申请提现
*
* @param request
* @return
*/
String applyWithdraw(${prefix}ApplyLoanRequest request);
/**
* 借款结果查询
*
* @param request
* @return
*/
String queryLoanResult(${prefix}QueryLoanRequest request);
/**
* 主动还款
*
* @param request
* @return
*/
String repayByPlan(${prefix}RepayByPlanRequest request);
/**
* 查询还款结果
*
* @param request
* @return
*/
String queryRepayResult(${prefix}QueryRepayRequest request);
}
package ${servicePackage};
import ${modelPackage}.${prefix}CreditApplyRequest;
import ${modelPackage}.${prefix}QueryCreditApplyResult;
import ${modelPackage}.${prefix}UserAccessRequest;
import ${modelPackage}.${prefix}QueryCreditApplyRequest;
import ${modelPackage}.${prefix}QuerySupportBankcardsRequest;
import ${modelPackage}.${prefix}QueryLoanTrialRequest;
import ${modelPackage}.${prefix}UserAccessResult;
import ${modelPackage}.${prefix}BindBankCardSmsRequest;
import ${modelPackage}.${prefix}CreditApplyResult;
import ${modelPackage}.${prefix}VerifyBindSmsRequest;
import ${modelPackage}.${prefix}ApplyLoanRequest;
import ${modelPackage}.${prefix}QueryLoanRequest;
import ${modelPackage}.${prefix}RepayByPlanRequest;
import ${modelPackage}.${prefix}QueryRepayRequest;
import ${modelPackage}.${prefix}CreditApplyRequest;
import ${enumsPackage}.${prefix}SignStatusEnum;
import ${enumsPackage}.${prefix}UserAccessResultEnum;
import ${utilPackage}.${prefix}ResultUtils;
import ${utilPackage}.${prefix}CodeEnum;
import cn.quantgroup.cashloanflow.entity.cashloanflow.LoanMapping;
import cn.quantgroup.cashloanflow.entity.cashloanflow.LoanOrderMapping;
import cn.quantgroup.cashloanflow.model.standard.apply.ApplyLoanCheckData;
import cn.quantgroup.cashloanflow.model.standard.response.credit.QueryCreditStatusResponseModel;
import cn.quantgroup.cashloanflow.model.xyqb.BusinessType;
import cn.quantgroup.cashloanflow.model.xyqb.orderstatus.OrderStatusEnums;
import cn.quantgroup.cashloanflow.repository.cashloanflow.ILoanOrderMappingRepository;
import cn.quantgroup.cashloanflow.service.cashloanflow.IChannelApplyInfoStrategyService;
import cn.quantgroup.cashloanflow.service.cashloanflow.ILoanOrderMappingService;
import cn.quantgroup.cashloanflow.service.cashloanflow.LoanMappingService;
import cn.quantgroup.cashloanflow.util.DateUtil;
import cn.quantgroup.cashloanflow.util.IpUtil;
import cn.quantgroup.cashloanflow.util.JsonUtil;
import cn.quantgroup.cashloanflow.util.loan.ProductUtil;
import cn.quantgroup.clf.api.jinshan.util.JinShanUtil;
import cn.quantgroup.clf.applyloancheck.CheckResponse;
import cn.quantgroup.loanflow.application.StandardApplicationService;
import cn.quantgroup.loanflow.application.model.ApplyLoanData;
import cn.quantgroup.loanflow.infrastructure.code.UserCode;
import cn.quantgroup.loanflow.infrastructure.result.ServiceResult;
import cn.quantgroup.loanflow.order.model.BindCardConfirm;
import cn.quantgroup.loanflow.order.model.BindCardVerifyInfo;
import cn.quantgroup.loanflow.order.model.ChannelOrder;
import cn.quantgroup.loanflow.order.model.OrderStatus;
import cn.quantgroup.loanflow.order.model.command.BindCardCommand;
import cn.quantgroup.loanflow.order.model.command.BindCardVerifyCommand;
import cn.quantgroup.loanflow.order.model.command.WithDrawCommand;
import cn.quantgroup.loanflow.order.service.OrderRepresentationService;
import cn.quantgroup.loanflow.repay.model.RepaymentPlanItem;
import cn.quantgroup.loanflow.repay.model.command.NormalRepayCommand;
import cn.quantgroup.loanflow.repay.model.representation.OrderRepaymentRepresentation;
import cn.quantgroup.loanflow.repay.model.representation.QueryNormalRepayRepresentation;
import cn.quantgroup.loanflow.repay.model.representation.RepayResultRepresentation;
import cn.quantgroup.loanflow.repay.model.representation.TrialRepaymentRepresentation;
import cn.quantgroup.loanflow.risk.model.PretrialAuditQuery;
import cn.quantgroup.loanflow.risk.model.representation.PretrialAuditRepresentation;
import cn.quantgroup.loanflow.user.model.command.UserAddrImportCommand;
import cn.quantgroup.loanflow.user.model.command.UserBasicInfoImportCommand;
import cn.quantgroup.loanflow.user.model.command.UserContactImportCommand;
import cn.quantgroup.loanflow.user.model.command.UserExtInfoImportCommand;
import cn.quantgroup.loanflow.user.model.representation.SysUser;
import cn.quantgroup.loanflow.user.model.representation.SysUserDetail;
import cn.quantgroup.loanflow.user.service.UserDomainService;
import cn.quantgroup.mo.infrastructure.constants.RequestSourceEnum;
import cn.quantgroup.mo.order.model.WithdrawResult;
import cn.quantgroup.mo.order.model.output.MoBankCardInfoOutput;
import cn.quantgroup.mo.order.model.output.MoSimpleBank;
import cn.quantgroup.mo.order.service.MoOrderRepresentationService;
import cn.quantgroup.mo.risk.model.MoCreditOrder;
import cn.quantgroup.mo.risk.model.command.MoCreateCreditInfoCommand;
import cn.quantgroup.mo.risk.model.command.MoCreditConfirmInfoCommand;
import cn.quantgroup.mo.risk.model.command.MoImportRiskDataCommand;
import cn.quantgroup.mo.risk.service.MoRiskDomainService;
import cn.quantgroup.loanflow.asynctask.constant.AsyncTaskConstant;
import cn.quantgroup.loanflow.asynctask.executor.config.BizAppId;
import cn.quantgroup.loanflow.asynctask.model.ApplyLoanParam;
import cn.quantgroup.loanflow.asynctask.model.AsyncTask;
import cn.quantgroup.loanflow.asynctask.sender.DelaySender;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import cn.quantgroup.loanflow.application.apply.IAsyncApplyService;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
@Service
@Slf4j
public class ${prefix}ServiceImpl implements ${prefix}Service,IAsyncApplyService{
private static final String LOG_PRE = "[${prefix}ServiceImpl]";
@Resource(name = "standardApplicationMoService")
private StandardApplicationService standardApplicationService;
@Autowired
private MoOrderRepresentationService moOrderRepresentationService;
@Autowired
private HttpServletRequest httpServletRequest;
@Autowired
private LoanMappingService loanMappingService;
@Autowired
private ILoanOrderMappingService loanOrderMappingService;
@Autowired
@Qualifier("rabbitDelaySenderImpl")
private DelaySender delaySender;
@Value("1,30000,60000")
private String scheduleStr;
/**
* 预审
*
* @param userAccessRequest
* @return
*/
public String userAccess(${prefix}UserAccessRequest userAccessRequest){
String logPre = LOG_PRE + "[userAccess][${prefix}预审]";
log.info("{} userAccessRequest={}",logPre,userAccessRequest);
PretrialAuditQuery query = new PretrialAuditQuery();
query.setChannelId(userAccessRequest.getChannelId());
query.setPhoneNo(userAccessRequest.getPhoneMD5());
query.setIdCard(userAccessRequest.getIdNoMD5());
ServiceResult<PretrialAuditRepresentation> serviceResult = standardApplicationService.queryPretrialAudit(query);
if (!serviceResult.isSuccess()) {
log.error("{},错误{}", logPre, serviceResult.getMessage());
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.getUserAccessCode(serviceResult.getCode().getCode())).toString();
}
${prefix}UserAccessResult result = new ${prefix}UserAccessResult();
if (serviceResult.getData().getAuditResult()) {
result.setAccessResult(${prefix}UserAccessResultEnum.CONTINUE.name());
} else {
result.setAccessResult(${prefix}UserAccessResultEnum.BREAK.name());
}
return ${prefix}ResultUtils.success(result).toString();
}
/**
* 提交授信
*
* @param request
* @return
*/
public String creditApply(${prefix}CreditApplyRequest request){
String logPre = LOG_PRE +"[creditApply][授信申请]";
log.info("{} request={}",logPre,request);
ApplyLoanData applyLoanData = ${prefix}CreditApplyRequest.getApplyLoanData(request);
ServiceResult<ApplyLoanRequestData> serviceResult = standardApplicationService.applyLoan(applyLoanData);
if (!serviceResult.isSuccess()) {
log.error("{},进件失败,result={}", logPre, serviceResult);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(), serviceResult.getMessage()).toString();
}
${prefix}CreditApplyResult result = new ${prefix}CreditApplyResult(serviceResult.getData().getApplyNo());
return ${prefix}ResultUtils.success(result).toString();
}
/**
* 授信申请结果主动查询
*
* @param request
* @return
*/
public String queryCreditApply(${prefix}QueryCreditApplyRequest request){
String logPre = LOG_PRE + "[queryCreditApply][${prefix}查询授信结果]";
log.info("{} request={}",logPre,request);
Long channelId = request.getChannelId();
String channelOrderNo = request.getChannelOrderNo();
ServiceResult<LoanOrderMapping> orderMappingServiceResult = moOrderRepresentationService.queryChannelOrderByOrderNoAndChannelId(channelOrderNo, channelId);
if (!orderMappingServiceResult.isSuccess() || Objects.isNull(orderMappingServiceResult.getData())) {
log.error("{}查询授信订单失败, result={}, request={}", logPre, orderMappingServiceResult, request);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(),orderMappingServiceResult.getMessage()).toString();
}
LoanOrderMapping orderMapping = orderMappingServiceResult.getData();
${prefix}QueryCreditApplyResult result = new ${prefix}QueryCreditApplyResult();
ServiceResult<OrderStatus> orderStatusServiceResult = standardApplicationService.queryOrderStatus(orderMapping.getChannelOrderNo(), null, channelId, null);
if (!orderStatusServiceResult.isSuccess()) {
log.error("{},查询订单状态错误., serviceResult={}, channelOrderNo={}", logPre, orderStatusServiceResult, orderMapping.getChannelOrderNo());
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(),orderStatusServiceResult.getMessage()).toString();
}
OrderStatus orderStatus = orderStatusServiceResult.getData();
OrderStatusEnums orderStatusEnums = orderStatusServiceResult.getData().getStatus();
Long updateTime = orderStatus.getUpdateTime();
if (JinShanUtil.finalStatus(orderStatusEnums)) {
// 放款失败、关单、结清的订单返回授信已失效
result.setCreditResult(${prefix}CreditResultEnum.CREDIT_INVALID);
result.setCreditExpireDate(DateUtil.format(updateTime, DateUtil.YYYY_MM_DD));
return ${prefix}ResultUtils.success(result).toString();
}
if (OrderStatusEnums.APPROVE_ING.equals(orderStatusEnums) || OrderStatusEnums.CREDIT_ORDER_SUBMITTING.equals(orderStatusEnums)) {
result.setCreditResult(${prefix}CreditResultEnum.CREDIT_APPROVAL);
return ${prefix}ResultUtils.success(result).toString();
}
if (OrderStatusEnums.REJECT.equals(orderStatusEnums)) {
result.setCreditResult(${prefix}CreditResultEnum.REFUSE);
result.setNextApplyTime(DateUtil.format(updateTime * 1000 + JinShanUtil.LIMIT_EXPIRE_DAY * DateUtil.ONE_DAY_MILLISECONDS, DateUtil.YYYY_MM_DD));
result.setCreditInfo("授信拒绝");
return ${prefix}ResultUtils.success(result).toString();
}
String productId = ProductUtil.getProductId(channelId);
ChannelOrder channelOrderQueryCreditStatus = ChannelOrder.builder()
.channelOrderNo(channelOrderNo)
.channelId(channelId)
.build();
ServiceResult<QueryCreditStatusResponseModel> creditStatus = standardApplicationService.queryCreditStatus(channelOrderQueryCreditStatus);
if (!creditStatus.isSuccess()) {
log.error("{}查询失败,serviceResult={}, userId={}, productId={}", logPre, creditStatus, orderMapping.getQgUserId(), productId);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(),creditStatus.getMessage()).toString();
}
result = ${prefix}QueryCreditApplyResult.getSuccessResult(creditStatus.getData());
return ${prefix}ResultUtils.success(result).toString();
}
/**
* 查询支持的银行列表
*
* @param request
* @return
*/
public String querySupportBankcards(${prefix}QuerySupportBankcardsRequest request){
String logPre = LOG_PRE + "[querySupportBankcards][${prefix}查询支持的银行列表]";
log.info("{} request={}",logPre,request);
Long channelId = request.getChannelId();
ChannelOrder channelOrder = ChannelOrder.builder()
.channelId(channelId)
.channelOrderNo(request.getChannelOrderNo())
.build();
ServiceResult<List<MoSimpleBank>> serviceResult = standardApplicationService.querySupportBank(channelOrder);
if (!serviceResult.isSuccess()) {
log.error("{},查询失败,result={} param={}", logPre, serviceResult,channelOrder);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(),serviceResult.getMessage()).toString();
}
${prefix}QuerySupportBankcardsResult result = ${prefix}QuerySupportBankcardsResult.getSuccessResult(serviceResult.getData());
return ${prefix}ResultUtils.success(result).toString();
}
/**
* 借款试算
*
* @param request
* @return
*/
public String queryLoanTrial(${prefix}QueryLoanTrialRequest request){
String logPre = LOG_PRE + "[queryLoanTrial][${prefix}查询试算数据]";
log.info("{} request={}",logPre,request);
Long channelId = request.getChannelId();
ChannelOrder channelOrder = ChannelOrder.builder()
.channelOrderNo(request.getChannelOrderNo())
.channelId(channelId)
.build();
ServiceResult<TrialRepaymentRepresentation> serviceResult = standardApplicationService.trialRepayment(channelOrder, request.getLoanAmount(), request.getLoanTerm());
if (!serviceResult.isSuccess()) {
log.error("{}失败,serviceResult={},request={}", logPre, serviceResult, request);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(),serviceResult.getMessage()).toString();
}
${prefix}QueryLoanTrialResult result = ${prefix}QueryLoanTrialResult.getCoverResult(serviceResult.getData());
return ${prefix}ResultUtils.success(result).toString();
}
/**
* 绑卡发验证码
*
* @param request
* @return
*/
public String bindBankCardSms(${prefix}BindBankCardSmsRequest request){
String logPre = LOG_PRE + "[bindBankCardSms][${prefix}绑卡发短信]";
log.info("{} request={}",logPre,request);
Long channelId = request.getChannelId();
BindCardCommand command = new BindCardCommand();
command.setBankCode(request.getBankCode());
command.setReservePhoneNumber(request.getPhone());
command.setBankCardNumber(request.getBankCardNo());
ServiceResult<BindCardVerifyInfo> serviceResult = standardApplicationService.bindCard(channelId, request.getChannelOrderNo(), command);
if (!serviceResult.isSuccess()) {
log.error("{}错误,serviceResult={}, request={}", logPre, serviceResult, request);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(), serviceResult.getMessage()).toString();
}
${prefix}BindBankCardSmsResult result = new ${prefix}BindBankCardSmsResult(serviceResult.getData().getVerificationId());
return ${prefix}ResultUtils.success(result).toString();
}
/**
* 验卡
*
* @param request
* @return
*/
public String verifyBindSms(${prefix}VerifyBindSmsRequest request){
String logPre = LOG_PRE + "[verifyBindSms][${prefix}验卡]";
log.info("{} request={}",logPre,request);
Long channelId = request.getChannelId();
BindCardVerifyCommand command = new BindCardVerifyCommand();
command.setVerificationId(request.getVerifyId());
command.setVerificationCode(request.getSmsCode());
ServiceResult<BindCardConfirm> serviceResult = standardApplicationService.bindCardVerify(channelId, request.getChannelOrderNo(), command);
${prefix}VerifyBindSmsResult result = new ${prefix}VerifyBindSmsResult();
if (!serviceResult.isSuccess()) {
log.error("{},错误, serviceResult={}, request={}", logPre, serviceResult, request);
result.setSignStatus(${prefix}SignStatusEnum.FAIL);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(), serviceResult.getMessage(), result).toString();
}
result.setSignStatus(${prefix}SignStatusEnum.SUCCESS);
result.setBindId(serviceResult.getData().getBankCardId());
return ${prefix}ResultUtils.success(result).toString();
}
/**
* 申请提现
*
* @param request
* @return
*/
public String applyWithdraw(${prefix}ApplyLoanRequest request){
String logPre = LOG_PRE + "[applyWithdraw][${prefix}申请提现]";
log.info("{} request={}",logPre,request);
Long channelId = request.getChannelId();
ServiceResult<MoBankCardInfoOutput> bankInfoResult = moOrderRepresentationService.queryBankCardInfoByBindCardId(request.getBindId());
if (!bankInfoResult.isSuccess()) {
log.error("{},错误,bankInfoResult={} bindId={}", logPre, bankInfoResult,request.getBindId());
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(), "根据bindId未查询到银行卡信息").toString();
}
MoBankCardInfoOutput bankCardInfoOutput = bankInfoResult.getData();
WithDrawCommand command = new WithDrawCommand();
command.setLoanPurpose(${prefix}LoanPurposesEnum.getKoaLaPurpose(request.getLoanPurpose()));
command.setBankCardNumber(bankCardInfoOutput.getCardNo());
ChannelOrder order = ChannelOrder.builder()
.channelId(channelId)
.channelOrderNo(request.getChannelOrderNo())
.build();
ServiceResult<WithdrawResult> serviceResult = standardApplicationService.withdraw(order, command);
if (!serviceResult.isSuccess()) {
log.error("{},申请提现失败,serviceResult={}, request={}", logPre, serviceResult, command);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(),serviceResult.getMessage()).toString();
}
${prefix}ApplyLoanResult result = new ${prefix}ApplyLoanResult();
result.setLoanNo(serviceResult.getData().getLoanId());
return ${prefix}ResultUtils.success(result).toString();
}
/**
* 查询还款结果
*
* @param request
* @return
*/
public String queryRepayResult(${prefix}QueryRepayRequest request){
String logPre = LOG_PRE + "[queryRepayResult][${prefix}查询还款结果]";
log.info("{} request={}",logPre,request);
Long channelId = request.getChannelId();
ChannelOrder channelOrder = ChannelOrder.builder()
.channelId(channelId)
.build();
ServiceResult<QueryNormalRepayRepresentation> serviceResult = standardApplicationService.normalRepayResultQuery(channelOrder, request.getBusinessFlowNo());
if (!serviceResult.isSuccess()) {
log.error("{},失败,serviceResult={}, request={}", logPre, serviceResult, request);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(),serviceResult.getMessage()).toString();
}
QueryNormalRepayRepresentation repayResult = serviceResult.getData();
Long loanId = Long.valueOf(repayResult.getLoanId());
// 查询借据信息
LoanMapping loanMapping = loanMappingService.findByLoanIdAndChannelId(loanId, channelId);
if (Objects.isNull(loanMapping)) {
log.error("{}通过loanId查询LoanMapping为空, loanId={}, channelId={}", logPre, loanId, channelId);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(), "通过loanId查询LoanMapping为空").toString();
}
String channelLoanNo = loanMapping.getChannelLoanNo();
// 查询还款计划
ServiceResult<OrderRepaymentRepresentation> repaymentServiceResult = standardApplicationService.repaymentPlanQueryByCycleQuota(loanId);
if (!repaymentServiceResult.isSuccess()) {
log.error("{},查询还款计划返回错误或无数据,loanId={}", logPre, loanId);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(),repaymentServiceResult.getMessage()).toString();
}
List<RepaymentPlanItem> repaymentPlans = repaymentServiceResult.getData().getRepaymentPlans();
${prefix}QueryRepayResult result = ${prefix}QueryRepayResult.getSuccessResult(channelLoanNo, repayResult, repaymentPlans);
return ${prefix}ResultUtils.success(result).toString();
}
/**
* 主动还款
*
* @param request
* @return
*/
public String repayByPlan(${prefix}RepayByPlanRequest request){
String logPre = LOG_PRE + "[repayByPlan][{prefix}发起主动还款]";
log.info("{} request={}",logPre,request);
Long channelId = request.getChannelId();
ServiceResult<MoBankCardInfoOutput> bankInfoResult = moOrderRepresentationService.queryBankCardInfoByBindCardId(request.getBindId());
if (!bankInfoResult.isSuccess()) {
log.error("{},错误,bankInfoResult={}", logPre, bankInfoResult);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(), bankInfoResult.getMessage()).toString();
}
MoBankCardInfoOutput bankCardInfoOutput = bankInfoResult.getData();
ChannelOrder channelOrder = ChannelOrder.builder()
.channelId(channelId)
.channelLoanNo(request.getChannelLoanNo())
.build();
String remoteIP = IpUtil.getRemoteIP(httpServletRequest);
final NormalRepayCommand command = NormalRepayCommand.builder()
.payBusinessFlowNo(request.getBusinessFlowNo())
.termNo(Long.valueOf(request.getTermNo()))
.repayAmount(new BigDecimal(request.getRepayAmount()))
.bankCardNumber(bankCardInfoOutput.getCardNo())
.clientIp(remoteIP)
.build();
ServiceResult<RepayResultRepresentation> serviceResult = standardApplicationService.normalRepayByCycleQuota(channelOrder, command);
if (!serviceResult.isSuccess()) {
log.error("{},失败, serviceResult={}, channelOrder={}, NormalRepayCommand={}", logPre, serviceResult, channelOrder, command);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(), serviceResult.getMessage()).toString();
}
${prefix}RepayByPlanResult result = new ${prefix}RepayByPlanResult(serviceResult.getData().getRepaymentNo());
return ${prefix}ResultUtils.success(result).toString();
}
/**
* 借款结果查询
*
* @param request
* @return
*/
public String queryLoanResult(${prefix}QueryLoanRequest request){
String logPre = LOG_PRE + "[queryLoanResult][${prefix}查询借款结果]";
log.info("{} request={}",logPre,request);
Long channelId =request.getChannelId();
String channelLoanNo = request.getChannelLoanNo();
LoanMapping loanMapping = loanMappingService.findByChannelLoanNoAndChannelId(channelLoanNo, channelId);
if (Objects.isNull(loanMapping)) {
log.error("{},查询借款订单为空,channelLoan={}", logPre, channelLoanNo);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(), "参数错误").toString();
}
LoanOrderMapping orderMapping = loanOrderMappingService.findById(loanMapping.getOrderMappingId());
if (Objects.isNull(orderMapping)) {
log.error("{}查询授信订单失败, result为空, request={}", logPre, request);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(), "参数错误").toString();
}
ServiceResult<OrderStatus> serviceResult = standardApplicationService.queryOrderStatus(orderMapping.getChannelOrderNo(), channelLoanNo, channelId, null);
if (!serviceResult.isSuccess()) {
log.error("{}查询订单状态失败, result={}, request={}", logPre, serviceResult, request);
return ${prefix}ResultUtils.fail(${prefix}CodeEnum.ERROR.getCode(), "参数错误").toString();
}
return ${prefix}ResultUtils.success(serviceResult.getData()).toString();
}
@Override
public ApplyLoanData getApplyLoanData(Object taskBody) {
${prefix}CreditApplyRequest request = (${prefix}CreditApplyRequest) taskBody;
return ${prefix}CreditApplyRequest.getApplyLoanData(request);
}
@Override
public void failCallBack(Object taskBody) {
}
@Override
public StandardApplicationService getStandardApplicationService() {
return standardApplicationService;
}
}
\ No newline at end of file
package ${utilPackage};
import cn.quantgroup.loanflow.infrastructure.code.ApplicationServiceCode;
import lombok.Getter;
import org.apache.commons.lang3.StringUtils;
/**
* @author ${author}
* @date ${.now?string('yyyy-MM-dd HH:mm:ss')}
*/
public enum ${prefix}CodeEnum implements ApplicationServiceCode {
SUCCESS("100000", "成功"),
ERROR("200000", "异常"),
SIGN_ERROR("200001", "加签失败"),
VERIFY_SIGN_ERROR("200002", "验签失败"),
DECRYPT_ERROR("200003", "解密失败"),
ENCRYPTION_ERROR("200004", "加密失败"),
TIME_OUT_ERROR("200005", "系统超时"),
SYSTEM_ERROR("200006", "系统异常"),
PARAM_ERROR("200007", "无效的请求参数"),
AGREEMENT_NULL("200900", "查询没有数据"),
// 准入
USER_ACCESS_NO("200100", "准入失败"),
USER_REPEAT("200101", "重复用户"),
// 联合注册
USER_REGISTER_ERROR("200200", "注册失败(非准入失败导致)"),
USER_REGISTER_ACCESS_ERROR("200201", "注册失败(准入失败导致)"),
//绑卡
BIND_PHONE_ERROR("200300", "预留手机号错误"),
BIND_IDNO_ERROR("200301", "身份证验证失败"),
BIND_BANKCARDNO_ERROR("200302", "银行卡已绑定"),
BIND_OVERDUE_ERROR("200303", "验证码过期"),
BIND_NAME_ERROR("301204", "实名认证不通过"),
BIND_NAME_AND_ID_ERROR("301205", "姓名身份证号码不一致"),
BIND_BANKCARDNO_PHONE_ERROR("301206", "银行卡预留手机不一致"),
BIND_BANKCARDNO_SUPPORT_ERROR("301207", "银行卡不支持"),
BIND_SEND_FREQUENTLY_ERROR("301208", "发送短信过于频繁"),
// 提现
;
@Getter
private String code;
@Getter
private String msg;
${prefix}CodeEnum(String value, String msg) {
this.code = value;
this.msg = msg;
}
/**
* 预审
* REVIEW_USER_ERROR("0100", "复申用户"),
* BLACKLIST_USER_ERROR("0200", "黑名单用户"),
* EXIST_LOAN_USER_ERROR("0300", "在贷用户,不允许进件"),
* OVERDUE_ERROR("0400", "逾期记录"),
* REFUSE_ERROR("0500", "30天内拒绝"),
* EXIST_LOANING_ERROR("0600", "存在申请订单"),
* AGE_ERROR("0701", "年龄不符合要求"),
* NOT_WITHDRAW_ERROR("0702", "审核已通过未提现"),
* BLACKLIST_USERS_ERROR("0703", "黑名单用户"),
*
* @param code
* @return
*/
public static ApplicationServiceCode getUserAccessCode(String code) {
if (StringUtils.isEmpty(code)) {
return USER_ACCESS_NO;
}
switch (code) {
case "0300":
return USER_REPEAT;
case "0100":
case "0200":
case "0400":
case "0500":
case "0600":
case "0701":
case "0702":
case "0703":
return USER_ACCESS_NO;
default:
return USER_ACCESS_NO;
}
}
/**
* 绑卡
*
* @param code
* @return
*/
public static ApplicationServiceCode getBindSmsCode(String code) {
if (StringUtils.isEmpty(code)) {
return ERROR;
}
switch (code) {
case "0010":
return ERROR;
case "0011":
return ERROR;
case "0100":
return ERROR;
case "0101":
return BIND_BANKCARDNO_SUPPORT_ERROR;
case "0102":
return BIND_PHONE_ERROR;
case "0103":
return ERROR;
default:
return ERROR;
}
}
/**
* 验卡
*
* @param code
* @return
*/
public static ApplicationServiceCode getVerifySmsCode(String code) {
if (StringUtils.isEmpty(code)) {
return ERROR;
}
switch (code) {
case "0101":
return ERROR;
case "0010":
return BIND_OVERDUE_ERROR;
default:
return ERROR;
}
}
/**
* 提现
* 200500
* 借款金额超限
* <p>
* 200501
* 当日放款总额超限
* <p>
* 200502
* 贷款期数不支持
* <p>
* 200503
* 额度审批未通过
*
* @param code
* @return
*/
public static ApplicationServiceCode getApplyWithdraw(String code) {
switch (code) {
case "0003":
case "1001":
return ERROR;
case "0004":
return ERROR;
case "0101":
return ERROR;
case "0200":
return ERROR;
default:
return ERROR;
}
}
/**
* 如果 code == ERROR("200000", "异常"), 则取内部系统具体的错误信息
*
* @param code 根据内部系统返回的code转换成金山的code
* @param msg 内部系统详细的msg
* @return 返回给金山的msg
*/
public static String getReturnMsg(ApplicationServiceCode code, String msg) {
if (${prefix}CodeEnum.ERROR.equals(code)) {
return msg;
}
return code.getMsg();
}
}
package ${utilPackage};
import cn.quantgroup.loanflow.infrastructure.code.ApplicationServiceCode;
import lombok.Data;
import java.io.Serializable;
public class ${prefix}ResultUtils {
public static ResultDTO success(String msg, Object data) {
return new ResultDTO(msg, data);
}
public static ResultDTO success(Object data) {
return new ResultDTO(data);
}
public static ResultDTO success() {
return new ResultDTO();
}
public static ResultDTO fail(String code, String msg, Object data) {
return new ResultDTO(code, msg, data);
}
public static ResultDTO fail(String code, String msg) {
return new ResultDTO(code, msg, null);
}
public static ResultDTO fail(ApplicationServiceCode code) {
return new ResultDTO(code.getCode(), code.getMsg(), null);
}
@Data
public static class ResultDTO implements Serializable {
private String code;
private String message;
private Object data;
public ResultDTO() {
this.code = "100000";
this.message = "成功";
}
public ResultDTO(Object data) {
this.data = data;
this.code = "100000";
this.message = "成功";
}
public ResultDTO(String msg) {
this.code = "100000";
this.message = msg;
}
public ResultDTO(String message, Object data) {
this.code = "100000";
this.message = message;
this.data = data;
}
public ResultDTO(String code, String message, Object data) {
this.code = code;
this.message = message;
this.data = data;
}
public boolean checkSuccess() {
return "100000".equals(code);
}
}
}
package cn.quantgroup.codegenerator;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class CodegeneratorApplicationTests {
@Test
void contextLoads() {
}
}
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