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 ${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 ${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